From 132937e374193ae2aabe982a6ac48122db034e30 Mon Sep 17 00:00:00 2001
From: Christopher Burns
Date: Thu, 19 Feb 2026 21:06:36 +0000
Subject: [PATCH 01/12] Add configuration files for oxfmt and oxlint, update
package.json and bun.lock
- Introduced .oxfmtrc.jsonc for oxfmt configuration to standardize code formatting.
- Added .oxlintrc.json for oxlint configuration, extending core linting rules.
- Updated package.json to include new scripts for formatting and linting, and added dependencies for oxfmt and oxlint.
- Modified bun.lock to reflect the addition of oxfmt and oxlint packages and their bindings for various platforms.
- Configured lefthook for pre-commit checks to run formatting automatically on specified file types.
---
.cursor/hooks.json | 10 ++++
.oxfmtrc.jsonc | 23 ++++++++
.oxlintrc.json | 6 ++
bun.lock | 144 ++++++++++++++++++++++++++++++++++++++++++++-
lefthook.yml | 12 ++++
package.json | 21 ++++---
6 files changed, 206 insertions(+), 10 deletions(-)
create mode 100644 .cursor/hooks.json
create mode 100644 .oxfmtrc.jsonc
create mode 100644 .oxlintrc.json
create mode 100644 lefthook.yml
diff --git a/.cursor/hooks.json b/.cursor/hooks.json
new file mode 100644
index 0000000..486fd75
--- /dev/null
+++ b/.cursor/hooks.json
@@ -0,0 +1,10 @@
+{
+ "version": 1,
+ "hooks": {
+ "afterFileEdit": [
+ {
+ "command": "bun x ultracite fix"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.oxfmtrc.jsonc b/.oxfmtrc.jsonc
new file mode 100644
index 0000000..f52b3c1
--- /dev/null
+++ b/.oxfmtrc.jsonc
@@ -0,0 +1,23 @@
+// Ultracite oxfmt Configuration
+// https://oxc.rs/docs/guide/usage/formatter/config-file-reference.html
+{
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
+ "printWidth": 80,
+ "tabWidth": 2,
+ "useTabs": false,
+ "semi": true,
+ "singleQuote": false,
+ "quoteProps": "as-needed",
+ "jsxSingleQuote": false,
+ "trailingComma": "es5",
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "always",
+ "endOfLine": "lf",
+ "experimentalSortPackageJson": true,
+ "experimentalSortImports": {
+ "ignoreCase": true,
+ "newlinesBetween": true,
+ "order": "asc"
+ }
+}
diff --git a/.oxlintrc.json b/.oxlintrc.json
new file mode 100644
index 0000000..c435a02
--- /dev/null
+++ b/.oxlintrc.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
+ "extends": [
+ "./node_modules/ultracite/config/oxlint/core/.oxlintrc.json"
+ ]
+}
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
index 0ef64ee..1c22ca2 100644
--- a/bun.lock
+++ b/bun.lock
@@ -17,7 +17,11 @@
"@changesets/cli": "^2.29.7",
"@types/node": "^24.3.0",
"changeset-conventional-commits": "^0.2.5",
+ "lefthook": "^2.1.1",
+ "oxfmt": "^0.34.0",
+ "oxlint": "^1.49.0",
"typescript": "^5.9.2",
+ "ultracite": "7.2.3",
"vitest": "^3.2.4",
},
},
@@ -63,6 +67,10 @@
"@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="],
+ "@clack/core": ["@clack/core@1.0.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-WKeyK3NOBwDOzagPR5H08rFk9D/WuN705yEbuZvKqlkmoLM2woKtXb10OO2k1NoSU4SFG947i2/SCYh+2u5e4g=="],
+
+ "@clack/prompts": ["@clack/prompts@1.0.1", "", { "dependencies": { "@clack/core": "1.0.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-/42G73JkuYdyWZ6m8d/CJtBrGl1Hegyc7Fy78m5Ob+jF85TOUmLR5XLce/U3LxYAw0kJ8CT5aI99RIvPHcGp/Q=="],
+
"@effect/cli": ["@effect/cli@0.73.2", "", { "dependencies": { "ini": "^4.1.3", "toml": "^3.0.0", "yaml": "^2.5.0" }, "peerDependencies": { "@effect/platform": "^0.94.3", "@effect/printer": "^0.47.0", "@effect/printer-ansi": "^0.47.0", "effect": "^3.19.16" } }, "sha512-K8IJo81+qa1LU8dhxcDU4QO/bIjL/dPd3zUOSCpLiuUNz8Y3/T+WNs3GqIXEhMfCFMSlRZERN0YgmtRlEZUREA=="],
"@effect/cluster": ["@effect/cluster@0.48.16", "", { "peerDependencies": { "@effect/platform": "^0.90.10", "@effect/rpc": "^0.69.4", "@effect/sql": "^0.44.2", "@effect/workflow": "^0.9.6", "effect": "^3.17.14" } }, "sha512-ZZkrSMVetOvlRDD8mPCX3IcVJtvUZBp6++lUKNGIT6LRIObRP4lVwtei85Z+4g49WpeLvJnSdH0zjPtGieFDHQ=="],
@@ -167,6 +175,82 @@
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+ "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.34.0", "", { "os": "android", "cpu": "arm" }, "sha512-sqkqjh/Z38l+duOb1HtVqJTAj1grt2ttkobCopC/72+a4Xxz4xUgZPFyQ4HxrYMvyqO/YA0tvM1QbfOu70Gk1Q=="],
+
+ "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.34.0", "", { "os": "android", "cpu": "arm64" }, "sha512-1KRCtasHcVcGOMwfOP9d5Bus2NFsN8yAYM5cBwi8LBg5UtXC3C49WHKrlEa8iF1BjOS6CR2qIqiFbGoA0DJQNQ=="],
+
+ "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.34.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b+Rmw9Bva6e/7PBES2wLO8sEU7Mi0+/Kv+pXSe/Y8i4fWNftZZlGwp8P01eECaUqpXATfSgNxdEKy7+ssVNz7g=="],
+
+ "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.34.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-QGjpevWzf1T9COEokZEWt80kPOtthW1zhRbo7x4Qoz646eTTfi6XsHG2uHeDWJmTbgBoJZPMgj2TAEV/ppEZaA=="],
+
+ "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.34.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-VMSaC02cG75qL59M9M/szEaqq/RsLfgpzQ4nqUu8BUnX1zkiZIW2gTpUv3ZJ6qpWnHxIlAXiRZjQwmcwpvtbcg=="],
+
+ "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.34.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Klm367PFJhH6vYK3vdIOxFepSJZHPaBfIuqwxdkOcfSQ4qqc/M8sgK0UTFnJWWTA/IkhMIh1kW6uEqiZ/xtQqg=="],
+
+ "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.34.0", "", { "os": "linux", "cpu": "arm" }, "sha512-nqn0QueVXRfbN9m58/E9Zij0Ap8lzayx591eWBYn0sZrGzY1IRv9RYS7J/1YUXbb0Ugedo0a8qIWzUHU9bWQuA=="],
+
+ "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.34.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-DDn+dcqW+sMTCEjvLoQvC/VWJjG7h8wcdN/J+g7ZTdf/3/Dx730pQElxPPGsCXPhprb11OsPyMp5FwXjMY3qvA=="],
+
+ "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.34.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-H+F8+71gHQoGTFPPJ6z4dD0Fzfzi0UP8Zx94h5kUmIFThLvMq5K1Y/bUUubiXwwHfwb5C3MPjUpYijiy0rj51Q=="],
+
+ "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.34.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dIGnzTNhCXqQD5pzBwduLg8pClm+t8R53qaE9i5h8iua1iaFAJyLffh4847CNZSlASb7gn1Ofuv7KoG/EpoGZg=="],
+
+ "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.34.0", "", { "os": "linux", "cpu": "none" }, "sha512-FGQ2GTTooilDte/ogwWwkHuuL3lGtcE3uKM2EcC7kOXNWdUfMY6Jx3JCodNVVbFoybv4A+HuCj8WJji2uu1Ceg=="],
+
+ "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.34.0", "", { "os": "linux", "cpu": "none" }, "sha512-2dGbGneJ7ptOIVKMwEIHdCkdZEomh74X3ggo4hCzEXL/rl9HwfsZDR15MkqfQqAs6nVXMvtGIOMxjDYa5lwKaA=="],
+
+ "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.34.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-cCtGgmrTrxq3OeSG0UAO+w6yLZTMeOF4XM9SAkNrRUxYhRQELSDQ/iNPCLyHhYNi38uHJQbS5RQweLUDpI4ajA=="],
+
+ "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.34.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7AvMzmeX+k7GdgitXp99GQoIV/QZIpAS7rwxQvC/T541yWC45nwvk4mpnU8N+V6dE5SPEObnqfhCjO80s7qIsg=="],
+
+ "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.34.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uNiglhcmivJo1oDMh3hoN/Z0WsbEXOpRXZdQ3W/IkOpyV8WF308jFjSC1ZxajdcNRXWej0zgge9QXba58Owt+g=="],
+
+ "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.34.0", "", { "os": "none", "cpu": "arm64" }, "sha512-5eFsTjCyji25j6zznzlMc+wQAZJoL9oWy576xhqd2efv+N4g1swIzuSDcb1dz4gpcVC6veWe9pAwD7HnrGjLwg=="],
+
+ "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.34.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-6id8kK0t5hKfbV6LHDzRO21wRTA6ctTlKGTZIsG/mcoir0rssvaYsedUymF4HDj7tbCUlnxCX/qOajKlEuqbIw=="],
+
+ "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.34.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHaz+w673mlYqn9v/+fuiKZpjkmagleXQ+NygShDv8tdHpRYX2oYhTJwwt9j1ZfVhRgza1EIUW3JmzCXmtPdhQ=="],
+
+ "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.34.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CXKQM/VaF+yuvGru8ktleHLJoBdjBtTFmAsLGePiESiTN0NjCI/PiaiOCfHMJ1HdP1LykvARUwMvgaN3tDhcrg=="],
+
+ "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.49.0", "", { "os": "android", "cpu": "arm" }, "sha512-2WPoh/2oK9r/i2R4o4J18AOrm3HVlWiHZ8TnuCaS4dX8m5ZzRmHW0I3eLxEurQLHWVruhQN7fHgZnah+ag5iQg=="],
+
+ "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.49.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YqJAGvNB11EzoKm1euVhZntb79alhMvWW/j12bYqdvVxn6xzEQWrEDCJg9BPo3A3tBCSUBKH7bVkAiCBqK/L1w=="],
+
+ "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.49.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-WFocCRlvVkMhChCJ2qpJfp1Gj/IjvyjuifH9Pex8m8yHonxxQa3d8DZYreuDQU3T4jvSY8rqhoRqnpc61Nlbxw=="],
+
+ "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.49.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-BN0KniwvehbUfYztOMwEDkYoojGm/narf5oJf+/ap+6PnzMeWLezMaVARNIS0j3OdMkjHTEP8s3+GdPJ7WDywQ=="],
+
+ "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.49.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SnkAc/DPIY6joMCiP/+53Q+N2UOGMU6ULvbztpmvPJNF/jYPGhNbKtN982uj2Gs6fpbxYkmyj08QnpkD4fbHJA=="],
+
+ "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.49.0", "", { "os": "linux", "cpu": "arm" }, "sha512-6Z3EzRvpQVIpO7uFhdiGhdE8Mh3S2VWKLL9xuxVqD6fzPhyI3ugthpYXlCChXzO8FzcYIZ3t1+Kau+h2NY1hqA=="],
+
+ "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.49.0", "", { "os": "linux", "cpu": "arm" }, "sha512-wdjXaQYAL/L25732mLlngfst4Jdmi/HLPVHb3yfCoP5mE3lO/pFFrmOJpqWodgv29suWY74Ij+RmJ/YIG5VuzQ=="],
+
+ "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.49.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-oSHpm8zmSvAG1BWUumbDRSg7moJbnwoEXKAkwDf/xTQJOzvbUknq95NVQdw/AduZr5dePftalB8rzJNGBogUMg=="],
+
+ "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.49.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-xeqkMOARgGBlEg9BQuPDf6ZW711X6BT5qjDyeM5XNowCJeTSdmMhpePJjTEiVbbr3t21sIlK8RE6X5bc04nWyQ=="],
+
+ "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.49.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-uvcqRO6PnlJGbL7TeePhTK5+7/JXbxGbN+C6FVmfICDeeRomgQqrfVjf0lUrVpUU8ii8TSkIbNdft3M+oNlOsQ=="],
+
+ "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.49.0", "", { "os": "linux", "cpu": "none" }, "sha512-Dw1HkdXAwHNH+ZDserHP2RzXQmhHtpsYYI0hf8fuGAVCIVwvS6w1+InLxpPMY25P8ASRNiFN3hADtoh6lI+4lg=="],
+
+ "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.49.0", "", { "os": "linux", "cpu": "none" }, "sha512-EPlMYaA05tJ9km/0dI9K57iuMq3Tw+nHst7TNIegAJZrBPtsOtYaMFZEaWj02HA8FI5QvSnRHMt+CI+RIhXJBQ=="],
+
+ "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.49.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-yZiQL9qEwse34aMbnMb5VqiAWfDY+fLFuoJbHOuzB1OaJZbN1MRF9Nk+W89PIpGr5DNPDipwjZb8+Q7wOywoUQ=="],
+
+ "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.49.0", "", { "os": "linux", "cpu": "x64" }, "sha512-CcCDwMMXSchNkhdgvhVn3DLZ4EnBXAD8o8+gRzahg+IdSt/72y19xBgShJgadIRF0TsRcV/MhDUMwL5N/W54aQ=="],
+
+ "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.49.0", "", { "os": "linux", "cpu": "x64" }, "sha512-u3HfKV8BV6t6UCCbN0RRiyqcymhrnpunVmLFI8sEa5S/EBu+p/0bJ3D7LZ2KT6PsBbrB71SWq4DeFrskOVgIZg=="],
+
+ "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.49.0", "", { "os": "none", "cpu": "arm64" }, "sha512-dRDpH9fw+oeUMpM4br0taYCFpW6jQtOuEIec89rOgDA1YhqwmeRcx0XYeCv7U48p57qJ1XZHeMGM9LdItIjfzA=="],
+
+ "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.49.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-6rrKe/wL9tn0qnOy76i1/0f4Dc3dtQnibGlU4HqR/brVHlVjzLSoaH0gAFnLnznh9yQ6gcFTBFOPrcN/eKPDGA=="],
+
+ "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.49.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-CXHLWAtLs2xG/aVy1OZiYJzrULlq0QkYpI6cd7VKMrab+qur4fXVE/B1Bp1m0h1qKTj5/FTGg6oU4qaXMjS/ug=="],
+
+ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.49.0", "", { "os": "win32", "cpu": "x64" }, "sha512-VteIelt78kwzSglOozaQcs6BCS4Lk0j+QA+hGV0W8UeyaqQ3XpbZRhDU55NW1PPvCy1tg4VXsTlEaPovqto7nQ=="],
+
"@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="],
"@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="],
@@ -281,8 +365,12 @@
"assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
+ "balanced-match": ["balanced-match@4.0.3", "", {}, "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g=="],
+
"better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="],
+ "brace-expansion": ["brace-expansion@5.0.2", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw=="],
+
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
"cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
@@ -299,6 +387,8 @@
"ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
+ "citty": ["citty@0.2.1", "", {}, "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg=="],
+
"color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
"color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
@@ -313,6 +403,8 @@
"deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
+ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
"detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="],
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
@@ -361,6 +453,8 @@
"get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="],
+ "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
+
"glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
@@ -395,15 +489,39 @@
"js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+ "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
+
"jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
+ "lefthook": ["lefthook@2.1.1", "", { "optionalDependencies": { "lefthook-darwin-arm64": "2.1.1", "lefthook-darwin-x64": "2.1.1", "lefthook-freebsd-arm64": "2.1.1", "lefthook-freebsd-x64": "2.1.1", "lefthook-linux-arm64": "2.1.1", "lefthook-linux-x64": "2.1.1", "lefthook-openbsd-arm64": "2.1.1", "lefthook-openbsd-x64": "2.1.1", "lefthook-windows-arm64": "2.1.1", "lefthook-windows-x64": "2.1.1" }, "bin": { "lefthook": "bin/index.js" } }, "sha512-Tl9h9c+sG3ShzTHKuR3LAIblnnh+Mgxnm2Ul7yu9cu260Z27LEbO3V6Zw4YZFP59/2rlD42pt/llYsQCkkCFzw=="],
+
+ "lefthook-darwin-arm64": ["lefthook-darwin-arm64@2.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-O/RS1j03/Fnq5zCzEb2r7UOBsqPeBuf1C5pMkIJcO4TSE6hf3rhLUkcorKc2M5ni/n5zLGtzQUXHV08/fSAT3Q=="],
+
+ "lefthook-darwin-x64": ["lefthook-darwin-x64@2.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-mm/kdKl81ROPoYnj9XYk5JDqj+/6Al8w/SSPDfhItkLJyl4pqS+hWUOP6gDGrnuRk8S0DvJ2+hzhnDsQnZohWQ=="],
+
+ "lefthook-freebsd-arm64": ["lefthook-freebsd-arm64@2.1.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-F7JXlKmjxGqGbCWPLND0bVB4DMQezIe48pEwTlUQZbxh450c2gP5Q8FdttMZKOT163kBGGTqJAJSEC6zW+QSxA=="],
+
+ "lefthook-freebsd-x64": ["lefthook-freebsd-x64@2.1.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Po8/lJMqNzKSZPuEI46dLuWoBoXtAxCuRpeOh6DAV/M4RhBynaCu8rLMZ9BqF7cVbZEWoplOmYo6HdOuiYpCkQ=="],
+
+ "lefthook-linux-arm64": ["lefthook-linux-arm64@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mI2ljFgPEqHxI8vrN9nKgnVu63Rz1KisDbPwlvs7BTYNwq3sncdK5ukpGR4zzWdh6saNJ5tCtHEtep5GQI11nw=="],
+
+ "lefthook-linux-x64": ["lefthook-linux-x64@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-m3G/FaxC+crxeg9XeaUuHfEoL+i9gbkg2Hp2KD2IcVVIxprqlyqf0Hb8zbLV2NMXuo5RSGokJu44oAoTO3Ou2g=="],
+
+ "lefthook-openbsd-arm64": ["lefthook-openbsd-arm64@2.1.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-gz/8FJPvhjOdOFt1GmFvuvDOe+W+BBRjoeAT1/mTgkN7HCXMXgqNjjvakQKQeGz1I1v08wXG1ZNf5y+T9XBCDQ=="],
+
+ "lefthook-openbsd-x64": ["lefthook-openbsd-x64@2.1.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-ch3lyMUtbmtWUufaQVn4IoEs/2hjK51XqaCdY1mh5ca//VctR1peknIwQ5feHu+vATCDviWQ7HsdNDewm3HMPg=="],
+
+ "lefthook-windows-arm64": ["lefthook-windows-arm64@2.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mm3PZhKDs9FE/jQDimkfWxtoj9xQ2k8uw2MdhtC825bhvIh+MEi0WFj/MOW+ug0RBg0I55tGYzZ5aVuozAWpTQ=="],
+
+ "lefthook-windows-x64": ["lefthook-windows-x64@2.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-1L2oGIzmhfOTxfwbe5mpSQ+m3ilpvGNymwIhn4UHq6hwHsUL6HEhODqx02GfBn6OXpVIr56bvdBAusjL/SVYGQ=="],
+
"locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
"lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
"loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="],
- "lru-cache": ["lru-cache@4.1.5", "", { "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="],
+ "lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
@@ -413,6 +531,10 @@
"mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="],
+ "minimatch": ["minimatch@10.2.2", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw=="],
+
+ "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="],
+
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
@@ -431,8 +553,14 @@
"node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
+ "nypm": ["nypm@0.6.5", "", { "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", "tinyexec": "^1.0.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ=="],
+
"outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
+ "oxfmt": ["oxfmt@0.34.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.34.0", "@oxfmt/binding-android-arm64": "0.34.0", "@oxfmt/binding-darwin-arm64": "0.34.0", "@oxfmt/binding-darwin-x64": "0.34.0", "@oxfmt/binding-freebsd-x64": "0.34.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.34.0", "@oxfmt/binding-linux-arm-musleabihf": "0.34.0", "@oxfmt/binding-linux-arm64-gnu": "0.34.0", "@oxfmt/binding-linux-arm64-musl": "0.34.0", "@oxfmt/binding-linux-ppc64-gnu": "0.34.0", "@oxfmt/binding-linux-riscv64-gnu": "0.34.0", "@oxfmt/binding-linux-riscv64-musl": "0.34.0", "@oxfmt/binding-linux-s390x-gnu": "0.34.0", "@oxfmt/binding-linux-x64-gnu": "0.34.0", "@oxfmt/binding-linux-x64-musl": "0.34.0", "@oxfmt/binding-openharmony-arm64": "0.34.0", "@oxfmt/binding-win32-arm64-msvc": "0.34.0", "@oxfmt/binding-win32-ia32-msvc": "0.34.0", "@oxfmt/binding-win32-x64-msvc": "0.34.0" }, "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-t+zTE4XGpzPTK+Zk9gSwcJcFi4pqjl6PwO/ZxPBJiJQ2XCKMucwjPlHxvPHyVKJtkMSyrDGfQ7Ntg/hUr4OgHQ=="],
+
+ "oxlint": ["oxlint@1.49.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.49.0", "@oxlint/binding-android-arm64": "1.49.0", "@oxlint/binding-darwin-arm64": "1.49.0", "@oxlint/binding-darwin-x64": "1.49.0", "@oxlint/binding-freebsd-x64": "1.49.0", "@oxlint/binding-linux-arm-gnueabihf": "1.49.0", "@oxlint/binding-linux-arm-musleabihf": "1.49.0", "@oxlint/binding-linux-arm64-gnu": "1.49.0", "@oxlint/binding-linux-arm64-musl": "1.49.0", "@oxlint/binding-linux-ppc64-gnu": "1.49.0", "@oxlint/binding-linux-riscv64-gnu": "1.49.0", "@oxlint/binding-linux-riscv64-musl": "1.49.0", "@oxlint/binding-linux-s390x-gnu": "1.49.0", "@oxlint/binding-linux-x64-gnu": "1.49.0", "@oxlint/binding-linux-x64-musl": "1.49.0", "@oxlint/binding-openharmony-arm64": "1.49.0", "@oxlint/binding-win32-arm64-msvc": "1.49.0", "@oxlint/binding-win32-ia32-msvc": "1.49.0", "@oxlint/binding-win32-x64-msvc": "1.49.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.14.1" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-YZffp0gM+63CJoRhHjtjRnwKtAgUnXM6j63YQ++aigji2NVvLGsUlrXo9gJUXZOdcbfShLYtA6RuTu8GZ4lzOQ=="],
+
"p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="],
"p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
@@ -449,6 +577,8 @@
"path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+ "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="],
+
"path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
"pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
@@ -497,6 +627,8 @@
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
"slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
@@ -525,7 +657,7 @@
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
- "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="],
+ "tinypool": ["tinypool@2.1.0", "", {}, "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw=="],
"tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="],
@@ -541,6 +673,8 @@
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+ "ultracite": ["ultracite@7.2.3", "", { "dependencies": { "@clack/prompts": "^1.0.1", "commander": "^14.0.3", "deepmerge": "^4.3.1", "glob": "^13.0.3", "jsonc-parser": "^3.3.1", "nypm": "^0.6.5" }, "peerDependencies": { "oxlint": "^1.0.0" }, "optionalPeers": ["oxlint"], "bin": { "ultracite": "dist/index.js" } }, "sha512-WKNS2sKAZe4BHu+JGbZebXvy/A1QagDaBnndrK/zwOJAze/mQ8jeHfdG2bPlv3qcJ5fdS3w2Kd7c/eIcH78HvA=="],
+
"undici": ["undici@7.22.0", "", {}, "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg=="],
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
@@ -587,8 +721,12 @@
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+ "nypm/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+
"read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+ "vitest/tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="],
+
"changeset-conventional-commits/@changesets/read/@changesets/git": ["@changesets/git@2.0.0", "", { "dependencies": { "@babel/runtime": "^7.20.1", "@changesets/errors": "^0.1.4", "@changesets/types": "^5.2.1", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.2", "spawndamnit": "^2.0.0" } }, "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A=="],
"changeset-conventional-commits/@changesets/read/@changesets/logger": ["@changesets/logger@0.0.5", "", { "dependencies": { "chalk": "^2.1.0" } }, "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw=="],
@@ -621,6 +759,8 @@
"changeset-conventional-commits/@changesets/read/@changesets/parse/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+ "changeset-conventional-commits/@changesets/read/@changesets/git/spawndamnit/cross-spawn/lru-cache": ["lru-cache@4.1.5", "", { "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="],
+
"changeset-conventional-commits/@changesets/read/@changesets/git/spawndamnit/cross-spawn/shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="],
"changeset-conventional-commits/@changesets/read/@changesets/git/spawndamnit/cross-spawn/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
diff --git a/lefthook.yml b/lefthook.yml
new file mode 100644
index 0000000..0e19112
--- /dev/null
+++ b/lefthook.yml
@@ -0,0 +1,12 @@
+pre-commit:
+ jobs:
+ - run: bun x ultracite fix
+ glob:
+ - "**/*.js"
+ - "**/*.jsx"
+ - "**/*.ts"
+ - "**/*.tsx"
+ - "**/*.json"
+ - "**/*.jsonc"
+ - "**/*.css"
+ stage_fixed: true
diff --git a/package.json b/package.json
index bba6683..49d4029 100644
--- a/package.json
+++ b/package.json
@@ -24,8 +24,10 @@
"test": "bunx vitest run",
"test:watch": "bunx vitest",
"typecheck": "bunx tsc -p tsconfig.json --noEmit",
- "prepare": "bun run build",
- "changeset": "changeset"
+ "prepare": "lefthook install",
+ "changeset": "changeset",
+ "check": "ultracite check",
+ "fix": "ultracite fix"
},
"keywords": [
"readme",
@@ -51,14 +53,17 @@
"@effect/printer": "^0.47.0",
"@effect/printer-ansi": "^0.47.0",
"effect": "^3.19.16"
-
},
"devDependencies": {
+ "@changesets/changelog-github": "^0.5.1",
+ "@changesets/cli": "^2.29.7",
"@types/node": "^24.3.0",
+ "changeset-conventional-commits": "^0.2.5",
+ "lefthook": "^2.1.1",
+ "oxfmt": "^0.34.0",
+ "oxlint": "^1.49.0",
"typescript": "^5.9.2",
- "vitest": "^3.2.4",
- "@changesets/changelog-github": "^0.5.1",
- "@changesets/cli": "^2.29.7",
- "changeset-conventional-commits": "^0.2.5"
+ "ultracite": "7.2.3",
+ "vitest": "^3.2.4"
}
-}
+}
\ No newline at end of file
From d9731339b93fb508673591a0ec3f5567cfe75bd7 Mon Sep 17 00:00:00 2001
From: Christopher Burns
Date: Thu, 19 Feb 2026 21:11:35 +0000
Subject: [PATCH 02/12] Refactor configuration files and update package.json
- Modified .oxfmtrc.jsonc to include a trailing comma for consistency.
- Simplified .oxlintrc.json by removing unnecessary array brackets.
- Enhanced package.json with additional metadata including keywords, homepage, bugs, license, author, and repository details.
- Ensured proper formatting and structure in various JSON files for improved readability and maintainability.
---
.../skills/tsdoc-jsdoc-authoring/AGENTS.md | 228 +++++++++++++
.agents/skills/tsdoc-jsdoc-authoring/SKILL.md | 123 +++++++
.../indexes/jsdoc-authoring-index.md | 30 ++
.../indexes/jsdoc-consistency-index.md | 37 +++
.../indexes/tsdoc-index.md | 39 +++
.../skills/tsdoc-jsdoc-authoring/reference.md | 194 +++++++++++
.../rules/jsdoc/advanced/jsdoc-async.md | 34 ++
.../jsdoc/advanced/jsdoc-class-constructor.md | 34 ++
.../advanced/jsdoc-implements-on-classes.md | 43 +++
.../rules/jsdoc/advanced/jsdoc-module.md | 32 ++
.../jsdoc/advanced/jsdoc-typedef-property.md | 37 +++
.../rules/jsdoc/advanced/jsdoc-yields.md | 32 ++
.../rules/jsdoc/core/jsdoc-check-access.md | 53 ++++
.../rules/jsdoc/core/jsdoc-example.md | 34 ++
.../rules/jsdoc/core/jsdoc-no-defaults.md | 46 +++
.../jsdoc/core/jsdoc-optional-default.md | 34 ++
.../rules/jsdoc/core/jsdoc-param.md | 33 ++
.../jsdoc/core/jsdoc-property-namepaths.md | 34 ++
.../jsdoc/core/jsdoc-require-param-type.md | 29 ++
.../rules/jsdoc/core/jsdoc-require-param.md | 40 +++
.../jsdoc-require-property-description.md | 33 ++
.../jsdoc/core/jsdoc-require-property-name.md | 33 ++
.../jsdoc/core/jsdoc-require-property-type.md | 33 ++
.../jsdoc/core/jsdoc-require-property.md | 45 +++
.../core/jsdoc-require-returns-description.md | 36 +++
.../jsdoc/core/jsdoc-require-returns-type.md | 29 ++
.../rules/jsdoc/core/jsdoc-require-returns.md | 53 ++++
.../rules/jsdoc/core/jsdoc-require-yields.md | 50 +++
.../rules/jsdoc/core/jsdoc-returns.md | 31 ++
.../rules/jsdoc/core/jsdoc-summary.md | 31 ++
.../rules/jsdoc/core/jsdoc-throws.md | 32 ++
.../rules/tsdoc/core/tsdoc-deprecated.md | 31 ++
.../rules/tsdoc/core/tsdoc-example.md | 35 ++
.../rules/tsdoc/core/tsdoc-param.md | 71 +++++
.../rules/tsdoc/core/tsdoc-remarks.md | 36 +++
.../rules/tsdoc/core/tsdoc-returns.md | 31 ++
.../rules/tsdoc/core/tsdoc-summary.md | 31 ++
.../rules/tsdoc/core/tsdoc-throws.md | 32 ++
.../rules/tsdoc/core/tsdoc-typeparam.md | 32 ++
.../rules/tsdoc/crossref/tsdoc-inheritdoc.md | 39 +++
.../rules/tsdoc/crossref/tsdoc-label.md | 33 ++
.../rules/tsdoc/crossref/tsdoc-link.md | 31 ++
.../rules/tsdoc/crossref/tsdoc-see.md | 33 ++
.../rules/tsdoc/policy/tsdoc-default-value.md | 32 ++
.../rules/tsdoc/policy/tsdoc-modifier-tags.md | 35 ++
.../tsdoc/policy/tsdoc-no-jsdoc-braces.md | 33 ++
.../policy/tsdoc-package-documentation.md | 32 ++
.../tsdoc/policy/tsdoc-private-remarks.md | 34 ++
.../rules/tsdoc/policy/tsdoc-release-tags.md | 36 +++
.agents/skills/vitest/GENERATION.md | 5 +
.agents/skills/vitest/SKILL.md | 53 ++++
.../references/advanced-environments.md | 264 +++++++++++++++
.../vitest/references/advanced-projects.md | 300 ++++++++++++++++++
.../references/advanced-type-testing.md | 242 ++++++++++++++
.../skills/vitest/references/advanced-vi.md | 251 +++++++++++++++
.agents/skills/vitest/references/core-cli.md | 167 ++++++++++
.../skills/vitest/references/core-config.md | 177 +++++++++++
.../skills/vitest/references/core-describe.md | 193 +++++++++++
.../skills/vitest/references/core-expect.md | 211 ++++++++++++
.../skills/vitest/references/core-hooks.md | 245 ++++++++++++++
.../skills/vitest/references/core-test-api.md | 237 ++++++++++++++
.../vitest/references/features-concurrency.md | 250 +++++++++++++++
.../vitest/references/features-context.md | 240 ++++++++++++++
.../vitest/references/features-coverage.md | 202 ++++++++++++
.../vitest/references/features-filtering.md | 208 ++++++++++++
.../vitest/references/features-mocking.md | 272 ++++++++++++++++
.../vitest/references/features-snapshots.md | 207 ++++++++++++
.changeset/config.json | 18 +-
.claude/skills/tsdoc-jsdoc-authoring | 1 +
.claude/skills/vitest | 1 +
.cursor/hooks.json | 2 +-
.cursor/skills/tsdoc-jsdoc-authoring | 1 +
.cursor/skills/vitest | 1 +
.github/workflows/release.yml | 2 +-
.oxfmtrc.jsonc | 4 +-
.oxlintrc.json | 21 +-
examples/basic/README.md | 4 +-
examples/basic/readie.json | 14 +-
examples/c15t/README.md | 4 +-
examples/c15t/old.md | 4 +-
examples/c15t/readie.global.json | 130 ++++----
examples/c15t/readie.json | 70 ++--
package.json | 40 +--
schemas/readie.schema.json | 4 +-
src/cli/commands/generate-workspace.ts | 82 +++--
src/cli/commands/generate.ts | 55 ++--
src/cli/commands/init.ts | 50 +--
src/cli/resolve-invocation.ts | 32 +-
src/config/load-config.ts | 251 +++++++++------
src/config/starter-config.ts | 19 +-
src/config/types.ts | 4 +-
src/index.ts | 46 +--
src/readme-generator/generator.ts | 59 ++--
src/readme-generator/template.ts | 157 +++++----
test/generator-global-interpolation.test.ts | 48 +--
test/merge-config.test.ts | 57 ++--
test/resolve-invocation.test.ts | 31 +-
test/template.test.ts | 31 +-
test/validate-config.test.ts | 38 +--
99 files changed, 6657 insertions(+), 557 deletions(-)
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/AGENTS.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/SKILL.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-authoring-index.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-consistency-index.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/indexes/tsdoc-index.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/reference.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-async.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-class-constructor.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-implements-on-classes.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-module.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-typedef-property.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-yields.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-check-access.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-example.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-no-defaults.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-optional-default.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-param.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-property-namepaths.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param-type.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-description.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-name.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-type.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-description.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-type.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-yields.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-returns.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-summary.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-throws.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-deprecated.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-example.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-param.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-remarks.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-returns.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-summary.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-throws.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-typeparam.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-inheritdoc.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-label.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-link.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-see.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-default-value.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-modifier-tags.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-package-documentation.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-private-remarks.md
create mode 100644 .agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-release-tags.md
create mode 100644 .agents/skills/vitest/GENERATION.md
create mode 100644 .agents/skills/vitest/SKILL.md
create mode 100644 .agents/skills/vitest/references/advanced-environments.md
create mode 100644 .agents/skills/vitest/references/advanced-projects.md
create mode 100644 .agents/skills/vitest/references/advanced-type-testing.md
create mode 100644 .agents/skills/vitest/references/advanced-vi.md
create mode 100644 .agents/skills/vitest/references/core-cli.md
create mode 100644 .agents/skills/vitest/references/core-config.md
create mode 100644 .agents/skills/vitest/references/core-describe.md
create mode 100644 .agents/skills/vitest/references/core-expect.md
create mode 100644 .agents/skills/vitest/references/core-hooks.md
create mode 100644 .agents/skills/vitest/references/core-test-api.md
create mode 100644 .agents/skills/vitest/references/features-concurrency.md
create mode 100644 .agents/skills/vitest/references/features-context.md
create mode 100644 .agents/skills/vitest/references/features-coverage.md
create mode 100644 .agents/skills/vitest/references/features-filtering.md
create mode 100644 .agents/skills/vitest/references/features-mocking.md
create mode 100644 .agents/skills/vitest/references/features-snapshots.md
create mode 120000 .claude/skills/tsdoc-jsdoc-authoring
create mode 120000 .claude/skills/vitest
create mode 120000 .cursor/skills/tsdoc-jsdoc-authoring
create mode 120000 .cursor/skills/vitest
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/AGENTS.md b/.agents/skills/tsdoc-jsdoc-authoring/AGENTS.md
new file mode 100644
index 0000000..117d153
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/AGENTS.md
@@ -0,0 +1,228 @@
+# TSDoc and JSDoc Best Practices
+
+**Version 1.0.0**
+Custom Authoring Guide
+February 2026
+
+> **Note:**
+> This document is designed for agents and LLMs writing or reviewing TypeScript
+> and JavaScript documentation comments using TSDoc and JSDoc. It mirrors a
+> rule-driven format where each rule has clear "use" and "avoid" guidance with
+> incorrect and correct examples.
+
+---
+
+## Abstract
+
+Comprehensive TSDoc and JSDoc authoring guide for automated documentation generation and review. Contains focused rules across core contract tags, linking/reuse tags, package/internal docs, policy tags, and JavaScript-focused docstring patterns. Each rule explains when to use the tag, when not to use it, and includes concrete incorrect/correct examples.
+
+## Read Order (Context-Safe)
+
+Before using this catalog, route through one focused index:
+
+- `indexes/tsdoc-index.md`
+- `indexes/jsdoc-authoring-index.md`
+- `indexes/jsdoc-consistency-index.md`
+
+This file is a reference catalog. Load only the relevant subsection after choosing an index.
+
+---
+
+## Rule Index
+
+### 1. Core API Contract Rules
+
+1.1 [Write Clear Summary Sentences](#11-write-clear-summary-sentences)
+1.2 [Use `@remarks` for Long-Form Context](#12-use-remarks-for-long-form-context)
+1.3 [Document Parameters with `@param`](#13-document-parameters-with-param)
+1.4 [Document Generics with `@typeParam`](#14-document-generics-with-typeparam)
+1.5 [Document Return Semantics with `@returns`](#15-document-return-semantics-with-returns)
+1.6 [Document Expected Failures with `@throws`](#16-document-expected-failures-with-throws)
+1.7 [Use `@example` for Non-Obvious Usage](#17-use-example-for-non-obvious-usage)
+1.8 [Use `@deprecated` with Migration Guidance](#18-use-deprecated-with-migration-guidance)
+
+### 2. Cross-Reference and Reuse Rules
+
+2.1 [Prefer `{@link ...}` for Symbol References](#21-prefer-link--for-symbol-references)
+2.2 [Use `@see` for Related APIs](#22-use-see-for-related-apis)
+2.3 [Use `@inheritDoc` Only for Equivalent Contracts](#23-use-inheritdoc-only-for-equivalent-contracts)
+2.4 [Use `{@label ...}` Only for Structured References](#24-use-label--only-for-structured-references)
+
+### 3. Package and Internal Notes
+
+3.1 [Use `@packageDocumentation` for Entrypoint Docs](#31-use-packagedocumentation-for-entrypoint-docs)
+3.2 [Use `@privateRemarks` for Maintainer-Only Notes](#32-use-privateremarks-for-maintainer-only-notes)
+3.3 [Document Defaults with `@defaultValue`](#33-document-defaults-with-defaultvalue)
+
+### 4. Stability and Modifier Policy
+
+4.1 [Apply Release Tags Consistently](#41-apply-release-tags-consistently)
+4.2 [Use Modifier Tags Only When Semantically True](#42-use-modifier-tags-only-when-semantically-true)
+4.3 [Do Not Mix JSDoc Type Syntax into TSDoc](#43-do-not-mix-jsdoc-type-syntax-into-tsdoc)
+
+### 5. JSDoc Rules (JavaScript)
+
+5.1 [Write JSDoc Summaries with Intent](#51-write-jsdoc-summaries-with-intent)
+5.2 [Document Parameters with JSDoc Type Expressions](#52-document-parameters-with-jsdoc-type-expressions)
+5.3 [Use Optional and Default Parameter Strings Correctly](#53-use-optional-and-default-parameter-strings-correctly)
+5.4 [Use Nested Property Namepaths for Object Inputs](#54-use-nested-property-namepaths-for-object-inputs)
+5.5 [Document Return Value Semantics with `@returns`](#55-document-return-value-semantics-with-returns)
+5.6 [Document Error Contracts with `@throws`](#56-document-error-contracts-with-throws)
+5.7 [Add Practical `@example` Snippets](#57-add-practical-example-snippets)
+5.8 [Define Reusable Shapes with `@typedef` and `@property`](#58-define-reusable-shapes-with-typedef-and-property)
+5.9 [Document Async Behavior with `@async`](#59-document-async-behavior-with-async)
+5.10 [Document Generator Output with `@yields`](#510-document-generator-output-with-yields)
+5.11 [Document Constructors and Classes Clearly](#511-document-constructors-and-classes-clearly)
+5.12 [Use `@module` for Module-Level Docs](#512-use-module-for-module-level-docs)
+5.13 [Validate Access Tags with `check-access`](#513-validate-access-tags-with-check-access)
+5.14 [Restrict `@implements` to Classes or Constructors](#514-restrict-implements-to-classes-or-constructors)
+
+---
+
+## 1. Core API Contract Rules
+
+### 1.1 Write Clear Summary Sentences
+
+See: `rules/tsdoc/core/tsdoc-summary.md`
+
+### 1.2 Use `@remarks` for Long-Form Context
+
+See: `rules/tsdoc/core/tsdoc-remarks.md`
+
+### 1.3 Document Parameters with `@param`
+
+See: `rules/tsdoc/core/tsdoc-param.md`
+
+### 1.4 Document Generics with `@typeParam`
+
+See: `rules/tsdoc/core/tsdoc-typeparam.md`
+
+### 1.5 Document Return Semantics with `@returns`
+
+See: `rules/tsdoc/core/tsdoc-returns.md`
+
+### 1.6 Document Expected Failures with `@throws`
+
+See: `rules/tsdoc/core/tsdoc-throws.md`
+
+### 1.7 Use `@example` for Non-Obvious Usage
+
+See: `rules/tsdoc/core/tsdoc-example.md`
+
+### 1.8 Use `@deprecated` with Migration Guidance
+
+See: `rules/tsdoc/core/tsdoc-deprecated.md`
+
+## 2. Cross-Reference and Reuse Rules
+
+### 2.1 Prefer `{@link ...}` for Symbol References
+
+See: `rules/tsdoc/crossref/tsdoc-link.md`
+
+### 2.2 Use `@see` for Related APIs
+
+See: `rules/tsdoc/crossref/tsdoc-see.md`
+
+### 2.3 Use `@inheritDoc` Only for Equivalent Contracts
+
+See: `rules/tsdoc/crossref/tsdoc-inheritdoc.md`
+
+### 2.4 Use `{@label ...}` Only for Structured References
+
+See: `rules/tsdoc/crossref/tsdoc-label.md`
+
+## 3. Package and Internal Notes
+
+### 3.1 Use `@packageDocumentation` for Entrypoint Docs
+
+See: `rules/tsdoc/policy/tsdoc-package-documentation.md`
+
+### 3.2 Use `@privateRemarks` for Maintainer-Only Notes
+
+See: `rules/tsdoc/policy/tsdoc-private-remarks.md`
+
+### 3.3 Document Defaults with `@defaultValue`
+
+See: `rules/tsdoc/policy/tsdoc-default-value.md`
+
+## 4. Stability and Modifier Policy
+
+### 4.1 Apply Release Tags Consistently
+
+See: `rules/tsdoc/policy/tsdoc-release-tags.md`
+
+### 4.2 Use Modifier Tags Only When Semantically True
+
+See: `rules/tsdoc/policy/tsdoc-modifier-tags.md`
+
+### 4.3 Do Not Mix JSDoc Type Syntax into TSDoc
+
+See: `rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md`
+
+## 5. JSDoc Rules (JavaScript)
+
+These rules are part of the default documentation standard and should be followed even without an active linter.
+
+### 5.1 Write JSDoc Summaries with Intent
+
+See: `rules/jsdoc/core/jsdoc-summary.md`
+
+### 5.2 Document Parameters with JSDoc Type Expressions
+
+See: `rules/jsdoc/core/jsdoc-param.md`
+
+### 5.3 Use Optional and Default Parameter Strings Correctly
+
+See: `rules/jsdoc/core/jsdoc-optional-default.md`
+
+### 5.4 Use Nested Property Namepaths for Object Inputs
+
+See: `rules/jsdoc/core/jsdoc-property-namepaths.md`
+
+### 5.5 Document Return Value Semantics with `@returns`
+
+See: `rules/jsdoc/core/jsdoc-returns.md`
+
+### 5.6 Document Error Contracts with `@throws`
+
+See: `rules/jsdoc/core/jsdoc-throws.md`
+
+### 5.7 Add Practical `@example` Snippets
+
+See: `rules/jsdoc/core/jsdoc-example.md`
+
+### 5.8 Define Reusable Shapes with `@typedef` and `@property`
+
+See: `rules/jsdoc/advanced/jsdoc-typedef-property.md`
+
+### 5.9 Document Async Behavior with `@async`
+
+See: `rules/jsdoc/advanced/jsdoc-async.md`
+
+### 5.10 Document Generator Output with `@yields`
+
+See: `rules/jsdoc/advanced/jsdoc-yields.md`
+
+### 5.11 Document Constructors and Classes Clearly
+
+See: `rules/jsdoc/advanced/jsdoc-class-constructor.md`
+
+### 5.12 Use `@module` for Module-Level Docs
+
+See: `rules/jsdoc/advanced/jsdoc-module.md`
+
+### 5.13 Validate Access Tags with `check-access`
+
+See: `rules/jsdoc/core/jsdoc-check-access.md`
+
+### 5.14 Restrict `@implements` to Classes or Constructors
+
+See: `rules/jsdoc/advanced/jsdoc-implements-on-classes.md`
+
+---
+
+## References
+
+1. [https://tsdoc.org](https://tsdoc.org)
+2. [https://github.com/microsoft/tsdoc](https://github.com/microsoft/tsdoc)
+3. [https://jsdoc.app](https://jsdoc.app)
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/SKILL.md b/.agents/skills/tsdoc-jsdoc-authoring/SKILL.md
new file mode 100644
index 0000000..c4e6ec1
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/SKILL.md
@@ -0,0 +1,123 @@
+---
+name: tsdoc-jsdoc-authoring
+description: Write and review API documentation comments using TSDoc and JSDoc best practices. Use when the user asks for docs, doc comments, TSDoc, JSDoc, @param/@returns help, or documentation quality improvements in JavaScript or TypeScript code.
+metadata:
+ author: custom
+ version: "1.0.0"
+ argument-hint:
+---
+
+# TSDoc and JSDoc Authoring
+
+Create high-quality documentation comments for functions, classes, interfaces, types, modules, and exported APIs.
+
+## When to Apply
+
+Use this skill when the user asks to:
+
+- add or improve code comments/docs
+- write TSDoc or JSDoc
+- document params, return values, thrown errors, or examples
+- standardize documentation style across files
+
+## Routing (Read This First)
+
+Choose one focused index before loading rule files:
+
+- TypeScript APIs and typed exports: `indexes/tsdoc-index.md`
+- JavaScript authoring and shape docs: `indexes/jsdoc-authoring-index.md`
+- Strict consistency/lint-safe output standards: `indexes/jsdoc-consistency-index.md`
+
+## Rule 1: Choose the Correct Standard
+
+- Use **TSDoc** for TypeScript code and typed public APIs.
+- Use **JSDoc** for JavaScript code or projects using JSDoc tooling.
+- Do not mix tag syntaxes from both standards in one comment block.
+
+## Workflow
+
+1. Read the target file and identify the symbol's purpose and side effects.
+2. Prefer documenting exported/public APIs first.
+3. Write a one-line summary in plain language.
+4. Add only meaningful tags (no empty or redundant tags).
+5. Validate tag names and formatting against the relevant standard.
+6. Ensure comments match actual behavior (inputs, outputs, errors, async behavior).
+
+## Authoring Rules (Both Standards)
+
+- Describe intent and behavior, not obvious implementation details.
+- Keep summaries concise and action-oriented ("Returns...", "Creates...", "Parses...").
+- Document every parameter and explain what each parameter does.
+- If a parameter is an object, document each object property and what it does.
+- Use imperative, consistent phrasing for `@param` descriptions.
+- Document thrown errors with `@throws` when behavior depends on error handling.
+- Add `@example` only when it clarifies non-obvious usage.
+- Do not restate TypeScript types in prose unless it adds semantic meaning.
+
+## TSDoc Rules
+
+Use these tags by default when relevant:
+
+- `@param` for each function argument
+- `@typeParam` for generic parameters
+- `@returns` for return semantics
+- `@remarks` for longer contextual details
+- `@throws` for exceptional behavior
+- `@example` for practical usage
+- `@deprecated` for migration guidance
+
+TSDoc formatting reminders:
+
+- Use `@param name - Description` with a hyphen separator.
+- Prefer inline links with `{@link SymbolName}`.
+- Keep release tags (`@alpha`, `@beta`, `@public`, `@internal`) aligned with project policy.
+- For object parameters in TypeScript, prefer a named `type` or `interface` and add `/** ... */` comments on each property so VS Code hovers/autocomplete show per-property docs.
+
+## JSDoc Rules
+
+Use these tags by default when relevant:
+
+- `@param {Type} name` (with optional/default forms when needed)
+- `@returns {Type}` (or `@return`)
+- `@throws {Type}` when known
+- `@typedef` and `@property` for reusable object shapes
+- `@example` for usage snippets
+- `@async` and `@yields` for async/generator behavior when needed
+
+JSDoc formatting reminders:
+
+- Optional params: `@param {string} [name]`
+- Optional with default: `@param {string} [name=John Doe]`
+- Nested object props: `@param {Object} options` and `@param {string} options.mode`
+
+## JSDoc Consistency Standard
+
+Apply these rules by default in all JavaScript documentation, regardless of lint setup.
+
+- Keep `@access` usage consistent per block (`@access ` or one shorthand access tag).
+- Use `@implements` only on classes/constructors.
+- Prefer rule-specific guidance from the `rules/jsdoc/**` files when there is a conflict.
+
+## Output Expectations
+
+When updating comments:
+
+- keep existing project conventions unless user requests a migration
+- preserve behavior accuracy over verbosity
+- avoid adding comments to private/internal symbols unless requested
+
+## Additional Reference
+
+For templates and tag cheat sheets, see [reference.md](reference.md).
+
+## Rule Files
+
+Use focused indexes to avoid loading unrelated rules:
+
+- TSDoc index: `indexes/tsdoc-index.md`
+- JSDoc authoring index: `indexes/jsdoc-authoring-index.md`
+- JSDoc consistency index: `indexes/jsdoc-consistency-index.md`
+
+## Full Compiled Document
+
+For the full rule index and category guide: `AGENTS.md`
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-authoring-index.md b/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-authoring-index.md
new file mode 100644
index 0000000..10cba59
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-authoring-index.md
@@ -0,0 +1,30 @@
+---
+title: JSDoc Authoring Index
+scope: JavaScript documentation patterns
+---
+
+# JSDoc Authoring Index
+
+Use this index for normal JavaScript doc authoring tasks. For strict consistency rules, use `indexes/jsdoc-consistency-index.md`.
+
+## Core Authoring
+
+- `rules/jsdoc/core/jsdoc-summary.md`
+- `rules/jsdoc/core/jsdoc-param.md`
+- `rules/jsdoc/core/jsdoc-optional-default.md`
+- `rules/jsdoc/core/jsdoc-property-namepaths.md`
+- `rules/jsdoc/core/jsdoc-returns.md`
+- `rules/jsdoc/core/jsdoc-throws.md`
+- `rules/jsdoc/core/jsdoc-example.md`
+
+## Advanced Authoring
+
+- `rules/jsdoc/advanced/jsdoc-typedef-property.md`
+- `rules/jsdoc/advanced/jsdoc-async.md`
+- `rules/jsdoc/advanced/jsdoc-yields.md`
+- `rules/jsdoc/advanced/jsdoc-class-constructor.md`
+- `rules/jsdoc/advanced/jsdoc-module.md`
+
+## Deep Reference
+
+- `reference.md` (templates and syntax cheatsheets)
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-consistency-index.md b/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-consistency-index.md
new file mode 100644
index 0000000..0064048
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/indexes/jsdoc-consistency-index.md
@@ -0,0 +1,37 @@
+---
+title: JSDoc Consistency Index
+scope: Lint-safe and standard-safe JSDoc output
+---
+
+# JSDoc Consistency Index
+
+Use this index when requests need strict, consistent, lint-safe JSDoc output. These rules are part of the default standard.
+
+## Access and Class Semantics
+
+- `rules/jsdoc/core/jsdoc-check-access.md`
+- `rules/jsdoc/advanced/jsdoc-implements-on-classes.md`
+
+## Parameter Requirements
+
+- `rules/jsdoc/core/jsdoc-no-defaults.md`
+- `rules/jsdoc/core/jsdoc-require-param.md`
+- `rules/jsdoc/core/jsdoc-require-param-type.md`
+
+## Property Requirements
+
+- `rules/jsdoc/core/jsdoc-require-property.md`
+- `rules/jsdoc/core/jsdoc-require-property-name.md`
+- `rules/jsdoc/core/jsdoc-require-property-type.md`
+- `rules/jsdoc/core/jsdoc-require-property-description.md`
+
+## Return and Yield Requirements
+
+- `rules/jsdoc/core/jsdoc-require-returns.md`
+- `rules/jsdoc/core/jsdoc-require-returns-type.md`
+- `rules/jsdoc/core/jsdoc-require-returns-description.md`
+- `rules/jsdoc/core/jsdoc-require-yields.md`
+
+## Deep Reference
+
+- `reference.md` (consistency checklist and templates)
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/indexes/tsdoc-index.md b/.agents/skills/tsdoc-jsdoc-authoring/indexes/tsdoc-index.md
new file mode 100644
index 0000000..044e6cc
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/indexes/tsdoc-index.md
@@ -0,0 +1,39 @@
+---
+title: TSDoc Index
+scope: TypeScript API docs
+---
+
+# TSDoc Index
+
+Use this index for TypeScript symbols and typed public APIs. Load only the sections you need.
+
+## Core Contract
+
+- `rules/tsdoc/core/tsdoc-summary.md`
+- `rules/tsdoc/core/tsdoc-remarks.md`
+- `rules/tsdoc/core/tsdoc-param.md`
+- `rules/tsdoc/core/tsdoc-typeparam.md`
+- `rules/tsdoc/core/tsdoc-returns.md`
+- `rules/tsdoc/core/tsdoc-throws.md`
+- `rules/tsdoc/core/tsdoc-example.md`
+- `rules/tsdoc/core/tsdoc-deprecated.md`
+
+## Cross-Reference and Reuse
+
+- `rules/tsdoc/crossref/tsdoc-link.md`
+- `rules/tsdoc/crossref/tsdoc-see.md`
+- `rules/tsdoc/crossref/tsdoc-inheritdoc.md`
+- `rules/tsdoc/crossref/tsdoc-label.md`
+
+## Package and Policy
+
+- `rules/tsdoc/policy/tsdoc-package-documentation.md`
+- `rules/tsdoc/policy/tsdoc-private-remarks.md`
+- `rules/tsdoc/policy/tsdoc-default-value.md`
+- `rules/tsdoc/policy/tsdoc-release-tags.md`
+- `rules/tsdoc/policy/tsdoc-modifier-tags.md`
+- `rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md`
+
+## Deep Reference
+
+- `reference.md` (templates and review checklist)
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/reference.md b/.agents/skills/tsdoc-jsdoc-authoring/reference.md
new file mode 100644
index 0000000..a27f54d
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/reference.md
@@ -0,0 +1,194 @@
+# TSDoc Deep Reference
+
+This file is the detailed TSDoc authoring spec for this skill. Use it when generating or reviewing TypeScript API documentation comments.
+
+## 1) TSDoc Comment Structure
+
+Standard order for a high-quality TSDoc block:
+
+1. Summary sentence(s)
+2. Optional `@remarks` (long-form details)
+3. Parameter docs (`@typeParam`, then `@param`)
+4. Return docs (`@returns`) when applicable
+5. Error docs (`@throws`) when behavior depends on error handling
+6. Optional `@example`
+7. Optional policy tags (`@deprecated`, release tags, modifiers)
+8. Optional `@see`
+
+Template:
+
+````ts
+/**
+ * One-sentence summary in plain language.
+ *
+ * @remarks
+ * Long-form context, constraints, caveats, and behavior notes.
+ *
+ * @typeParam T - Meaning of generic type.
+ * @param input - What this value represents and constraints.
+ * @returns What is returned and key semantics.
+ * @throws ErrorType when and why this fails.
+ * @example
+ * ```ts
+ * const value = fn(input)
+ * ```
+ * @deprecated Use `newFn()` instead.
+ */
+````
+
+## 2) TSDoc Tag Kinds (Syntax Types)
+
+TSDoc tags are grouped into three syntax kinds:
+
+- `InlineTag`: used inside prose (example: `{@link Foo}`)
+- `BlockTag`: starts a new section block (example: `@remarks`)
+- `ModifierTag`: marker-style tags with no body (example: `@public`)
+
+Use the right syntax kind for the right purpose. Do not write modifier tags as prose blocks.
+
+## 3) Routing to Focused Rule Sets
+
+Use focused indexes instead of loading full rule catalogs into context:
+
+- TSDoc work: `indexes/tsdoc-index.md`
+- JSDoc authoring work: `indexes/jsdoc-authoring-index.md`
+- JSDoc consistency and lint-safe output: `indexes/jsdoc-consistency-index.md`
+
+Load only the minimum rule files needed for the current edit/review task.
+
+## 4) High-Quality TSDoc Patterns
+
+### Document async behavior precisely
+
+```ts
+/**
+ * Fetches the current profile.
+ * @returns The active user profile.
+ * @throws Error when the auth token is invalid.
+ */
+export async function getProfile(): Promise {}
+```
+
+### Document generics meaningfully
+
+```ts
+/**
+ * Creates a dictionary from items.
+ * @typeParam T - Source item type.
+ * @param items - Source collection.
+ * @param getKey - Derives a stable key from each item.
+ * @returns A map from key to item.
+ */
+export function toMap(
+ items: T[],
+ getKey: (item: T) => string
+): Map {}
+```
+
+### Document thrown contract only
+
+```ts
+/**
+ * Parses a signed payload.
+ * @param token - Signed token string.
+ * @returns Decoded payload.
+ * @throws Error when signature validation fails.
+ */
+export function parseSignedToken(token: string): Payload {}
+```
+
+## 5) TSDoc Mistakes To Avoid
+
+- Using JSDoc type braces in TSDoc `@param` lines.
+- Missing `@typeParam` for public generic APIs.
+- Writing verbose summaries that hide key behavior.
+- Adding `@example` blocks that are stale or too long.
+- Documenting implementation trivia instead of API contract.
+- Tagging release level (`@alpha`, `@beta`, etc.) inconsistently across related APIs.
+
+## 6) TSDoc Review Checklist
+
+Use this checklist when reviewing generated comments:
+
+- Summary accurately states what the API does.
+- Every parameter has a meaningful `@param`.
+- All generics have `@typeParam` when public.
+- `@returns` describes semantics, not just type.
+- `@throws` documents expected caller-relevant failures.
+- `@remarks` is used only when needed.
+- Links use `{@link ...}` where appropriate.
+- Release/visibility/modifier tags match project policy.
+- Comment behavior matches implementation exactly.
+
+## 7) JSDoc Quick Appendix (Cross-Standard Projects)
+
+Use this only for JavaScript files or JSDoc-based tooling.
+
+### JSDoc function template
+
+```js
+/**
+ * Normalizes a user profile for rendering.
+ * @param {Object} input - Raw user profile.
+ * @param {string} input.id - Stable identifier.
+ * @param {string} [input.displayName] - Optional display name.
+ * @returns {Object} Normalized profile object.
+ * @throws {Error} If required fields are missing.
+ */
+```
+
+### JSDoc typedef template
+
+```js
+/**
+ * @typedef {Object} UserProfile
+ * @property {string} id - Stable user identifier.
+ * @property {string} [displayName] - Optional display name.
+ * @property {boolean} active - Whether the user is active.
+ */
+```
+
+### JSDoc String Syntax Cheatsheet
+
+Use these exact JSDoc "strings" for common cases:
+
+- Required param: `@param {string} name - Description`
+- Optional param: `@param {string} [name] - Description`
+- Optional with default: `@param {string} [name=John Doe] - Description`
+- Object param: `@param {Object} options - Description`
+- Nested object field: `@param {string} options.mode - Description`
+- Array object field: `@param {string} items[].id - Description`
+- Return type: `@returns {Promise} Description`
+- Throws type: `@throws {Error} Description`
+- Access style (pick one): `@access private` or `@private` (do not mix on one doc block)
+- `@implements` placement: use only on classes/constructors (not regular functions)
+
+### TypeScript Object Param Hover Pattern (Recommended)
+
+For best VS Code hover and autocomplete docs on object properties, use a named type/interface and `/** ... */` on each property:
+
+```ts
+type SearchOptions = {
+ /** Query string used to match results. */
+ query: string;
+ /** Maximum number of results to return. */
+ limit?: number;
+};
+
+/**
+ * @param options - Search configuration.
+ */
+export function search(options: SearchOptions) {}
+```
+
+## 8) JSDoc Consistency Checklist
+
+Use this quick pass before finalizing JSDoc blocks in any project:
+
+- Access tags: use one access style per block; valid `@access` values are `package|private|protected|public`.
+- `@implements` placement: use it only on class constructors or constructor-style functions.
+
+## 9) Sources Used For This Skill
+
+- TSDoc: `/microsoft/tsdoc` (Context7)
+- JSDoc: `/jsdoc/jsdoc.github.io` (Context7)
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-async.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-async.md
new file mode 100644
index 0000000..f4679c7
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-async.md
@@ -0,0 +1,34 @@
+---
+title: Document Async Behavior with @async
+impact: MEDIUM
+impactDescription: clarifies asynchronous control flow in generated docs
+tags: jsdoc, async, promises, functions
+---
+
+## Document Async Behavior with `@async`
+
+Use `@async` where tooling or virtual comments need explicit async annotation.
+
+**Use this when:** async behavior is not obvious from implementation context.
+**Avoid this when:** async is already clear and the project style avoids redundant tags.
+
+**Incorrect (no async contract in virtual docs):**
+
+```js
+/**
+ * Downloads data from a URL.
+ * @param {string} url - Source URL.
+ * @returns {Promise} Downloaded content.
+ */
+```
+
+**Correct (explicit async behavior):**
+
+```js
+/**
+ * Downloads data from a URL.
+ * @async
+ * @param {string} url - Source URL.
+ * @returns {Promise} Downloaded content.
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-class-constructor.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-class-constructor.md
new file mode 100644
index 0000000..4f3a1c4
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-class-constructor.md
@@ -0,0 +1,34 @@
+---
+title: Document Constructors and Classes Clearly
+impact: HIGH
+impactDescription: improves class API onboarding and usage clarity
+tags: jsdoc, class, constructor, oop
+---
+
+## Document Constructors and Classes Clearly
+
+Document constructor arguments and class purpose clearly.
+
+**Use this when:** documenting class-based JavaScript APIs.
+**Avoid this when:** constructor parameters are undocumented.
+
+**Incorrect (class intent unclear):**
+
+```js
+/**
+ * @constructor
+ */
+function Book(title, author) {}
+```
+
+**Correct (constructor contract documented):**
+
+```js
+/**
+ * Represents a book in the catalog.
+ * @constructor
+ * @param {string} title - Book title.
+ * @param {string} author - Book author.
+ */
+function Book(title, author) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-implements-on-classes.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-implements-on-classes.md
new file mode 100644
index 0000000..59b91a3
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-implements-on-classes.md
@@ -0,0 +1,43 @@
+---
+title: Restrict @implements to Classes or Constructors
+impact: HIGH
+impactDescription: prevents invalid interface implementation annotations on non-constructors
+tags: jsdoc, implements, classes, constructors, lint
+---
+
+## Restrict `@implements` to Classes or Constructors
+
+Use `@implements` only on class constructors or constructor-style functions.
+
+**Use this when:** documenting classes, constructors, or constructor functions.
+**Avoid this when:** annotating regular functions, callbacks, or `@function` docs.
+
+**Incorrect (non-constructor function):**
+
+```js
+/**
+ * @implements {SomeClass}
+ */
+function quux() {}
+```
+
+**Correct (class constructor):**
+
+```js
+class Foo {
+ /**
+ * @implements {SomeClass}
+ */
+ constructor() {}
+}
+```
+
+**Correct (constructor-style function):**
+
+```js
+/**
+ * @implements {SomeClass}
+ * @class
+ */
+function quux() {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-module.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-module.md
new file mode 100644
index 0000000..504275f
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-module.md
@@ -0,0 +1,32 @@
+---
+title: Use @module for Module-Level Docs
+impact: MEDIUM
+impactDescription: clarifies module boundaries and exported responsibilities
+tags: jsdoc, module, entrypoint, organization
+---
+
+## Use `@module` for Module-Level Docs
+
+Use `@module` at file/module scope for package organization and generated docs.
+
+**Use this when:** documenting JavaScript module entrypoints or grouped exports.
+**Avoid this when:** annotating individual functions with module-level semantics.
+
+**Incorrect (module tag on member doc):**
+
+```js
+/**
+ * @module auth
+ * Issues access tokens.
+ */
+function issueToken(userId) {}
+```
+
+**Correct (module-level declaration):**
+
+```js
+/**
+ * Authentication helpers.
+ * @module auth
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-typedef-property.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-typedef-property.md
new file mode 100644
index 0000000..22699e1
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-typedef-property.md
@@ -0,0 +1,37 @@
+---
+title: Define Reusable Shapes with @typedef and @property
+impact: HIGH
+impactDescription: centralizes object contracts and improves consistency
+tags: jsdoc, typedef, property, object-shapes
+---
+
+## Define Reusable Shapes with `@typedef` and `@property`
+
+Use `@typedef` and `@property` for repeated object shapes.
+
+**Use this when:** multiple APIs share the same object structure.
+**Avoid this when:** duplicating long inline object type expressions everywhere.
+
+**Incorrect (duplicated inline shape):**
+
+```js
+/**
+ * @param {{ id: string, active: boolean }} user - User object.
+ */
+function saveUser(user) {}
+```
+
+**Correct (reusable typedef):**
+
+```js
+/**
+ * @typedef {Object} UserRecord
+ * @property {string} id - Stable user identifier.
+ * @property {boolean} active - Whether the user is active.
+ */
+
+/**
+ * @param {UserRecord} user - User object.
+ */
+function saveUser(user) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-yields.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-yields.md
new file mode 100644
index 0000000..fd3ab87
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/advanced/jsdoc-yields.md
@@ -0,0 +1,32 @@
+---
+title: Document Generator Output with @yields
+impact: MEDIUM
+impactDescription: clarifies yielded value contracts for iterators
+tags: jsdoc, yields, generators, iterators
+---
+
+## Document Generator Output with `@yields`
+
+Use `@yields {Type}` to describe generator output values.
+
+**Use this when:** documenting generator functions.
+**Avoid this when:** function is not a generator.
+
+**Incorrect (missing yielded type):**
+
+```js
+/**
+ * Generates Fibonacci numbers.
+ */
+function* fibonacci() {}
+```
+
+**Correct (explicit yielded contract):**
+
+```js
+/**
+ * Generates Fibonacci numbers.
+ * @yields {number} The next number in the sequence.
+ */
+function* fibonacci() {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-check-access.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-check-access.md
new file mode 100644
index 0000000..5f2d6fe
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-check-access.md
@@ -0,0 +1,53 @@
+---
+title: Validate Access Tags with check-access
+impact: HIGH
+impactDescription: prevents ambiguous visibility semantics in JSDoc comments
+tags: jsdoc, access, lint, visibility
+---
+
+## Validate Access Tags with `check-access`
+
+When documenting visibility in JSDoc, use exactly one access style per doc block:
+
+- `@access package|private|protected|public`, or
+- one shorthand tag: `@package`, `@private`, `@protected`, or `@public`
+
+**Use this when:** documenting API/member visibility in JavaScript files.
+**Avoid this when:** mixing access styles or using unsupported access values.
+
+**Incorrect (mixed access styles):**
+
+```js
+/**
+ * @access private
+ * @public
+ */
+function normalizeUser(input) {}
+```
+
+**Incorrect (invalid access value):**
+
+```js
+/**
+ * @access internal-only
+ */
+function normalizeUser(input) {}
+```
+
+**Correct (single valid access tag):**
+
+```js
+/**
+ * @access private
+ */
+function normalizeUser(input) {}
+```
+
+**Correct (single shorthand access tag):**
+
+```js
+/**
+ * @private
+ */
+function normalizeUser(input) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-example.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-example.md
new file mode 100644
index 0000000..10297b9
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-example.md
@@ -0,0 +1,34 @@
+---
+title: Add Practical @example Snippets
+impact: MEDIUM
+impactDescription: reduces misuse by showing expected call patterns
+tags: jsdoc, example, usage, snippets
+---
+
+## Add Practical `@example` Snippets
+
+Use `@example` for behavior that is not obvious from signature alone.
+
+**Use this when:** API behavior or output format may be misunderstood.
+**Avoid this when:** examples are trivial, stale, or verbose.
+
+**Incorrect (no concrete usage):**
+
+```js
+/**
+ * Formats a currency value.
+ */
+function formatCurrency(amount, currency) {}
+```
+
+**Correct (practical usage):**
+
+```js
+/**
+ * Formats a currency value.
+ * @example
+ * // "$12.50"
+ * formatCurrency(12.5, "USD")
+ */
+function formatCurrency(amount, currency) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-no-defaults.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-no-defaults.md
new file mode 100644
index 0000000..8821a23
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-no-defaults.md
@@ -0,0 +1,46 @@
+---
+title: Avoid Defaults in JSDoc Param Tags
+impact: MEDIUM
+impactDescription: keeps parameter documentation aligned with modern JavaScript defaults
+tags: jsdoc, param, defaults, lint
+---
+
+## Avoid Defaults in JSDoc Param Tags
+
+Do not include default values inside `@param` or `@default` tag syntax when documenting function parameters.
+
+**Use this when:** documenting JavaScript function parameters where defaults/optionality are represented in code.
+**Avoid this when:** writing bracketed defaults like `[name="value"]` in JSDoc.
+
+This prevents redundant default notation in docs where ES2015+ default parameters already express runtime behavior.
+
+**Incorrect (default value in `@param`):**
+
+```js
+/**
+ * @param {number} [foo="7"]
+ */
+function quux(foo) {}
+```
+
+**Correct (required param notation):**
+
+```js
+/**
+ * @param {number} foo
+ */
+function quux(foo) {}
+```
+
+**Correct (untyped required param notation):**
+
+```js
+/**
+ * @param foo
+ */
+function quux(foo) {}
+```
+
+Configuration option:
+
+- `noOptionalParamNames` (`boolean`, default `false`): when `true`, also report square-bracket optional names on `@param` tags.
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-optional-default.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-optional-default.md
new file mode 100644
index 0000000..9c8eaea
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-optional-default.md
@@ -0,0 +1,34 @@
+---
+title: Use Optional and Default Parameter Strings Correctly
+impact: CRITICAL
+impactDescription: prevents caller confusion around optional inputs
+tags: jsdoc, param, optional, defaults, syntax
+---
+
+## Use Optional and Default Parameter Strings Correctly
+
+Use JSDoc optional/default syntax strings consistently:
+
+- Optional: `@param {string} [name]`
+- Optional with default: `@param {string} [name=John Doe]`
+
+**Use this when:** documenting optional JavaScript parameters.
+**Avoid this when:** optionality is described only in prose and not in tag syntax.
+
+**Incorrect (optionality hidden):**
+
+```js
+/**
+ * @param {string} name - Optional display name.
+ */
+function greet(name) {}
+```
+
+**Correct (explicit optional/default string syntax):**
+
+```js
+/**
+ * @param {string} [name=John Doe] - Optional display name.
+ */
+function greet(name) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-param.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-param.md
new file mode 100644
index 0000000..d1cf937
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-param.md
@@ -0,0 +1,33 @@
+---
+title: Document Parameters with JSDoc Type Expressions
+impact: CRITICAL
+impactDescription: defines input contract for JavaScript APIs
+tags: jsdoc, param, types, contracts
+---
+
+## Document Parameters with JSDoc Type Expressions
+
+Use `@param {Type} name - Description` for each parameter.
+
+**Use this when:** documenting JavaScript API parameters.
+**Avoid this when:** type expressions are missing or inconsistent.
+
+Each parameter comment must explain what that specific parameter does.
+
+**Incorrect (missing type expression):**
+
+```js
+/**
+ * @param timeoutMs - Wait time.
+ */
+function waitForReady(timeoutMs) {}
+```
+
+**Correct (typed parameter contract):**
+
+```js
+/**
+ * @param {number} timeoutMs - Maximum wait time in milliseconds.
+ */
+function waitForReady(timeoutMs) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-property-namepaths.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-property-namepaths.md
new file mode 100644
index 0000000..d880947
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-property-namepaths.md
@@ -0,0 +1,34 @@
+---
+title: Use Nested Property Namepaths for Object Inputs
+impact: HIGH
+impactDescription: makes object parameter contracts explicit
+tags: jsdoc, param, property, namepath, objects
+---
+
+## Use Nested Property Namepaths for Object Inputs
+
+When a parameter is an object, document its fields using namepaths.
+Each object property needs its own comment that explains what it does.
+
+**Use this when:** function expects structured objects or arrays of objects.
+**Avoid this when:** only top-level object parameter is documented.
+
+**Incorrect (missing nested fields):**
+
+```js
+/**
+ * @param {Object} options - Query options.
+ */
+function search(options) {}
+```
+
+**Correct (nested property paths):**
+
+```js
+/**
+ * @param {Object} options - Query options.
+ * @param {string} options.query - Search query string.
+ * @param {number} [options.limit=20] - Maximum number of results.
+ */
+function search(options) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param-type.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param-type.md
new file mode 100644
index 0000000..d1c3db2
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param-type.md
@@ -0,0 +1,29 @@
+---
+title: Require Types in @param Tags
+impact: HIGH
+impactDescription: ensures parameter contracts include explicit JSDoc type information
+tags: jsdoc, param, types, lint
+---
+
+## Require Types in `@param` Tags
+
+Ensure each JSDoc `@param` tag includes a type expression in curly braces.
+
+**Use this when:** documenting JavaScript function parameters with JSDoc.
+**Avoid this when:** writing untyped `@param` tags like `@param foo`.
+
+The parameter type should be documented so callers and tooling can understand expected input shapes.
+
+**Incorrect (missing type in `@param`):**
+
+```js
+/** @param foo */
+function quux(foo) {}
+```
+
+**Correct (typed `@param`):**
+
+```js
+/** @param {SomeType} foo */
+function quux(foo) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param.md
new file mode 100644
index 0000000..9c77524
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-param.md
@@ -0,0 +1,40 @@
+---
+title: Require @param for Function Parameters
+impact: HIGH
+impactDescription: ensures complete input contracts for documented functions
+tags: jsdoc, param, completeness, lint
+---
+
+## Require `@param` for Function Parameters
+
+Document all function parameters with JSDoc `@param` tags.
+
+**Use this when:** writing JSDoc for functions, methods, and callable APIs.
+**Avoid this when:** some parameters are undocumented in the JSDoc block.
+
+This improves code quality and maintainability by making function inputs explicit.
+
+**Incorrect (missing a parameter tag):**
+
+```js
+/** @param foo */
+function quux(foo, bar) {}
+```
+
+**Correct (all parameters documented):**
+
+```js
+/** @param foo */
+function quux(foo) {}
+```
+
+Configuration options:
+
+- `checkConstructors` (`boolean`, default `false`): whether to check constructor methods.
+- `checkDestructured` (`boolean`, default `true`): whether to check destructured parameters.
+- `checkDestructuredRoots` (`boolean`, default `true`): whether to require a root `@param` tag for root destructured parameters like `function f({a, b}) {}`.
+- `checkGetters` (`boolean`, default `true`): whether to check getter methods.
+- `checkRestProperty` (`boolean`, default `false`): whether to check rest properties.
+- `checkSetters` (`boolean`, default `true`): whether to check setter methods.
+- `checkTypesPattern` (`string`, default `"^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$"`): regex pattern for types exempted from checking.
+- `exemptedBy` (`string[]`, default `["inheritdoc"]`): JSDoc tags that exempt functions from `@param` checking.
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-description.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-description.md
new file mode 100644
index 0000000..aa6d664
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-description.md
@@ -0,0 +1,33 @@
+---
+title: Require Descriptions for @property Tags
+impact: HIGH
+impactDescription: improves object-shape clarity by documenting property intent
+tags: jsdoc, property, descriptions, lint
+---
+
+## Require Descriptions for `@property` Tags
+
+Ensure all `@property` tags include a description.
+
+**Use this when:** documenting typedef or namespace properties.
+**Avoid this when:** leaving property tags without explanatory text.
+
+Property descriptions should be documented so consumers understand each field's purpose.
+
+**Incorrect (missing property description):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property {number} foo
+ */
+```
+
+**Correct (property description present):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property {number} foo Foo.
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-name.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-name.md
new file mode 100644
index 0000000..22be0bd
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-name.md
@@ -0,0 +1,33 @@
+---
+title: Require Names in @property Tags
+impact: HIGH
+impactDescription: ensures each documented property is identifiable by name
+tags: jsdoc, property, names, lint
+---
+
+## Require Names in `@property` Tags
+
+Ensure all `@property` tags include a property name.
+
+**Use this when:** documenting typedef or namespace object properties.
+**Avoid this when:** writing `@property` tags without an identifier.
+
+Property names should be documented so object fields can be referenced unambiguously.
+
+**Incorrect (missing property name):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property {number}
+ */
+```
+
+**Correct (property name present):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property {number} foo
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-type.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-type.md
new file mode 100644
index 0000000..1a70bd0
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property-type.md
@@ -0,0 +1,33 @@
+---
+title: Require Types in @property Tags
+impact: HIGH
+impactDescription: ensures property contracts include explicit type information
+tags: jsdoc, property, types, lint
+---
+
+## Require Types in `@property` Tags
+
+Ensure each `@property` tag includes a type expression in curly braces.
+
+**Use this when:** documenting typedef, namespace, or class properties with JSDoc.
+**Avoid this when:** writing untyped `@property` tags like `@property foo`.
+
+Property types should be documented so consumers and tooling can infer expected data shapes.
+
+**Incorrect (missing property type):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property foo
+ */
+```
+
+**Correct (typed property):**
+
+```js
+/**
+ * @typedef {SomeType} SomeTypedef
+ * @property {number} foo
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property.md
new file mode 100644
index 0000000..40e5d72
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-property.md
@@ -0,0 +1,45 @@
+---
+title: Require @property for Object Typedefs and Namespaces
+impact: HIGH
+impactDescription: prevents incomplete object-shape documentation for typedefs and namespaces
+tags: jsdoc, typedef, namespace, property, lint
+---
+
+## Require `@property` for Object Typedefs and Namespaces
+
+When using `@typedef` or `@namespace` with plain object types, include one or more `@property` tags.
+
+**Use this when:** documenting object-based typedefs or namespaces.
+**Avoid this when:** leaving object typedefs/namespaces without property definitions.
+
+Object shapes should have properties defined so consumers can understand the contract.
+
+**Incorrect (missing `@property`):**
+
+```js
+/**
+ * @typedef {Object} SomeTypedef
+ */
+
+/**
+ * @namespace {Object} SomeNamespace
+ */
+```
+
+**Correct (object typedef with properties):**
+
+```js
+/**
+ * @typedef {Object} SomeTypedef
+ * @property {SomeType} propName Prop description
+ */
+```
+
+**Correct (object typedef with shorthand property):**
+
+```js
+/**
+ * @typedef {object} Foo
+ * @property someProp
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-description.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-description.md
new file mode 100644
index 0000000..02b23cb
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-description.md
@@ -0,0 +1,36 @@
+---
+title: Require Descriptions in @returns Tags
+impact: HIGH
+impactDescription: clarifies return-value semantics beyond raw type information
+tags: jsdoc, returns, descriptions, lint
+---
+
+## Require Descriptions in `@returns` Tags
+
+Ensure `@returns` tags include a description value.
+
+**Use this when:** documenting return behavior for functions and methods.
+**Avoid this when:** leaving `@returns` empty or type-only without meaning.
+
+A `@returns` tag should explain what is returned, not just indicate that a return exists.
+
+The error is not reported when the return type is:
+
+- `void`
+- `undefined`
+- `Promise`
+- `Promise`
+
+**Incorrect (missing return description):**
+
+```js
+/** @returns */
+function quux(foo) {}
+```
+
+**Correct (return description present):**
+
+```js
+/** @returns Foo. */
+function quux(foo) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-type.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-type.md
new file mode 100644
index 0000000..5e9bcd2
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns-type.md
@@ -0,0 +1,29 @@
+---
+title: Require Types in @returns Tags
+impact: HIGH
+impactDescription: ensures return contracts include explicit type information
+tags: jsdoc, returns, types, lint
+---
+
+## Require Types in `@returns` Tags
+
+Ensure each `@returns` tag includes a type expression in curly braces.
+
+**Use this when:** documenting return values in JavaScript JSDoc blocks.
+**Avoid this when:** writing untyped `@returns` tags like `@returns`.
+
+A `@returns` tag should include a type value to clearly define return shape expectations.
+
+**Incorrect (missing return type):**
+
+```js
+/** @returns */
+function quux(foo) {}
+```
+
+**Correct (typed return):**
+
+```js
+/** @returns {string} */
+function quux(foo) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns.md
new file mode 100644
index 0000000..142b397
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-returns.md
@@ -0,0 +1,53 @@
+---
+title: Require @returns for Return Statements
+impact: HIGH
+impactDescription: prevents missing or ambiguous return-value documentation
+tags: jsdoc, returns, completeness, lint
+---
+
+## Require `@returns` for Return Statements
+
+Document return statements with `@returns` and avoid multiple `@returns` tags in a single doc block.
+
+**Use this when:** documenting functions or methods that return values.
+**Avoid this when:** omitting `@returns` for returning functions or adding duplicate `@returns` tags.
+
+This prevents missing return contracts and inconsistent return documentation.
+
+**Incorrect (missing `@returns`):**
+
+```js
+/** Foo. */
+function quux() {
+ return foo;
+}
+```
+
+**Incorrect (duplicate `@returns` tags):**
+
+```js
+/**
+ * @returns Foo!
+ * @returns Foo?
+ */
+function quux() {
+ return foo;
+}
+```
+
+**Correct (single `@returns`):**
+
+```js
+/** @returns Foo. */
+function quux() {
+ return foo;
+}
+```
+
+Configuration options:
+
+- `checkConstructors` (`boolean`, default `false`): whether to check constructor methods.
+- `checkGetters` (`boolean`, default `true`): whether to check getter methods.
+- `exemptedBy` (`string[]`, default `["inheritdoc"]`): tags that exempt functions from requiring `@returns`.
+- `forceRequireReturn` (`boolean`, default `false`): whether to require `@returns` even if no value is returned.
+- `forceReturnsWithAsync` (`boolean`, default `false`): whether to require `@returns` on async functions.
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-yields.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-yields.md
new file mode 100644
index 0000000..effc597
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-require-yields.md
@@ -0,0 +1,50 @@
+---
+title: Require @yields for Generator Output
+impact: HIGH
+impactDescription: ensures generator output contracts are documented and unambiguous
+tags: jsdoc, yields, generators, lint
+---
+
+## Require `@yields` for Generator Output
+
+Document generator yields with `@yields` and avoid multiple `@yields` tags in a single doc block.
+
+**Use this when:** documenting generator functions that yield values.
+**Avoid this when:** omitting `@yields` on yielding generators or adding duplicate `@yields` tags.
+
+This prevents missing yield contracts and inconsistent generator documentation.
+
+**Incorrect (missing `@yields`):**
+
+```js
+function* quux(foo) {
+ yield foo;
+}
+```
+
+**Incorrect (duplicate `@yields` tags):**
+
+```js
+/**
+ * @yields {undefined}
+ * @yields {void}
+ */
+function* quux(foo) {}
+```
+
+**Correct (single `@yields`):**
+
+```js
+/**
+ * @yields Foo
+ */
+function* quux(foo) {
+ yield foo;
+}
+```
+
+Configuration options:
+
+- `exemptedBy` (`string[]`, default `["inheritdoc"]`): functions with these tags are exempt.
+- `forceRequireYields` (`boolean`, default `false`): require `@yields` on all generators, even empty/non-yielding ones.
+- `withGeneratorTag` (`boolean`, default `false`): require `@yields` when a `@generator` tag is present.
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-returns.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-returns.md
new file mode 100644
index 0000000..44f55aa
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-returns.md
@@ -0,0 +1,31 @@
+---
+title: Document Return Value Semantics with @returns
+impact: HIGH
+impactDescription: clarifies output behavior and expected shape
+tags: jsdoc, returns, output, contracts
+---
+
+## Document Return Value Semantics with @returns
+
+Use `@returns {Type}` with semantic description.
+
+**Use this when:** functions return a value or Promise payload.
+**Avoid this when:** only stating raw type without meaning.
+
+**Incorrect (type-only):**
+
+```js
+/**
+ * @returns {Object}
+ */
+function parseConfig() {}
+```
+
+**Correct (semantics included):**
+
+```js
+/**
+ * @returns {{ retries: number, timeoutMs: number }} Normalized runtime configuration.
+ */
+function parseConfig() {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-summary.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-summary.md
new file mode 100644
index 0000000..740866d
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-summary.md
@@ -0,0 +1,31 @@
+---
+title: Write JSDoc Summaries with Intent
+impact: HIGH
+impactDescription: improves API readability for JavaScript consumers
+tags: jsdoc, summary, readability
+---
+
+## Write JSDoc Summaries with Intent
+
+Write concise summaries that explain behavior and purpose.
+
+**Use this when:** documenting JavaScript functions, classes, and modules.
+**Avoid this when:** repeating symbol names without useful meaning.
+
+**Incorrect (name restatement):**
+
+```js
+/**
+ * Gets data.
+ */
+function getData() {}
+```
+
+**Correct (behavior-focused):**
+
+```js
+/**
+ * Fetches and parses JSON data from the configured endpoint.
+ */
+function getData() {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-throws.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-throws.md
new file mode 100644
index 0000000..fa932dd
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/jsdoc/core/jsdoc-throws.md
@@ -0,0 +1,32 @@
+---
+title: Document Error Contracts with @throws
+impact: HIGH
+impactDescription: enables predictable caller error handling
+tags: jsdoc, throws, errors, reliability
+---
+
+## Document Error Contracts with @throws
+
+Use `@throws {Type} ...` for expected, caller-relevant failures.
+
+**Use this when:** function may throw known errors callers should handle.
+**Avoid this when:** listing incidental internal errors with no contract value.
+
+**Incorrect (no throws contract):**
+
+```js
+/**
+ * Parses a signed token.
+ */
+function parseSignedToken(token) {}
+```
+
+**Correct (typed throws contract):**
+
+```js
+/**
+ * Parses a signed token.
+ * @throws {Error} If the token signature is invalid.
+ */
+function parseSignedToken(token) {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-deprecated.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-deprecated.md
new file mode 100644
index 0000000..9bd7587
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-deprecated.md
@@ -0,0 +1,31 @@
+---
+title: Use @deprecated with Migration Guidance
+impact: HIGH
+impactDescription: prevents dead-end API usage and migration confusion
+tags: tsdoc, deprecated, migration, lifecycle
+---
+
+## Use @deprecated with Migration Guidance
+
+Use `@deprecated` only with explicit replacement guidance.
+
+**Use this when:** a symbol should no longer be used.
+**Avoid this when:** deprecation is unclear or no replacement exists.
+
+**Incorrect (no migration path):**
+
+```ts
+/**
+ * @deprecated
+ */
+export function oldHash(input: string): string {}
+```
+
+**Correct (clear migration path):**
+
+```ts
+/**
+ * @deprecated Use `hashSha256()` for stable cross-platform output.
+ */
+export function oldHash(input: string): string {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-example.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-example.md
new file mode 100644
index 0000000..2639e8a
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-example.md
@@ -0,0 +1,35 @@
+---
+title: Use @example for Non-Obvious Usage
+impact: MEDIUM
+impactDescription: reduces misuse and clarifies edge cases
+tags: tsdoc, example, usage, snippets
+---
+
+## Use @example for Non-Obvious Usage
+
+Use `@example` for tricky, non-obvious, or high-value usage patterns.
+
+**Use this when:** behavior is subtle or edge-case driven.
+**Avoid this when:** examples are trivial, stale, or excessively long.
+
+**Incorrect (no usage guidance for tricky API):**
+
+```ts
+/**
+ * Retries an operation with backoff.
+ */
+export async function retry(fn: () => Promise): Promise {}
+```
+
+**Correct (clear example):**
+
+````ts
+/**
+ * Retries an operation with backoff.
+ * @example
+ * ```ts
+ * const result = await retry(() => fetchJson("/api/data"))
+ * ```
+ */
+export async function retry(fn: () => Promise): Promise {}
+````
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-param.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-param.md
new file mode 100644
index 0000000..ffc754c
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-param.md
@@ -0,0 +1,71 @@
+---
+title: Document Parameters with @param
+impact: CRITICAL
+impactDescription: clarifies caller obligations and input semantics
+tags: tsdoc, param, function-contract, api-docs
+---
+
+## Document Parameters with @param
+
+Use one `@param` line per parameter: `@param name - Description`.
+
+**Use this when:** documenting any function or method parameters.
+**Avoid this when:** repeating type annotations already in the signature.
+
+Each parameter comment must explain what that specific parameter does.
+If a parameter is an object, document each relevant property and what each property does.
+For TypeScript object params, prefer a named object type/interface with `/** ... */` comments on each property.
+
+**Incorrect (missing semantics):**
+
+```ts
+/**
+ * @param timeoutMs - number
+ */
+export function waitForReady(timeoutMs: number): Promise {}
+```
+
+**Correct (caller-relevant semantics):**
+
+```ts
+/**
+ * @param timeoutMs - Maximum wait time in milliseconds before timing out.
+ */
+export function waitForReady(timeoutMs: number): Promise {}
+```
+
+**Incorrect (object parameter properties undocumented):**
+
+```ts
+/**
+ * @param options - Search configuration.
+ */
+export function search(options: { query: string; limit?: number }): Result[] {}
+```
+
+**Correct (object parameter properties documented):**
+
+```ts
+/**
+ * @param options - Search configuration.
+ * @param options.query - Query string used to match results.
+ * @param options.limit - Maximum number of results to return.
+ */
+export function search(options: { query: string; limit?: number }): Result[] {}
+```
+
+**Preferred (VS Code hover/autocomplete friendly pattern):**
+
+```ts
+type SearchOptions = {
+ /** Query string used to match results. */
+ query: string;
+ /** Maximum number of results to return. */
+ limit?: number;
+};
+
+/**
+ * @param options - Search configuration.
+ */
+export function search(options: SearchOptions): Result[] {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-remarks.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-remarks.md
new file mode 100644
index 0000000..7be061f
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-remarks.md
@@ -0,0 +1,36 @@
+---
+title: Use @remarks for Long-Form Context
+impact: HIGH
+impactDescription: prevents overloaded summaries and preserves detail
+tags: tsdoc, remarks, context, contracts
+---
+
+## Use @remarks for Long-Form Context
+
+Use `@remarks` for deeper context, caveats, and non-trivial behavior.
+
+**Use this when:** summary alone cannot express constraints or trade-offs.
+**Avoid this when:** a one-line summary is sufficient.
+
+**Incorrect (long narrative in summary):**
+
+```ts
+/**
+ * Generates cache keys and also normalizes locale and strips unsupported
+ * fields and retries once if key generation collides.
+ */
+export function buildCacheKey(input: Input): string {}
+```
+
+**Correct (summary + remarks):**
+
+```ts
+/**
+ * Builds a deterministic cache key for request inputs.
+ *
+ * @remarks
+ * Normalizes locale casing, removes unsupported fields, and retries once on
+ * hash collisions to preserve key uniqueness guarantees.
+ */
+export function buildCacheKey(input: Input): string {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-returns.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-returns.md
new file mode 100644
index 0000000..a9d2660
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-returns.md
@@ -0,0 +1,31 @@
+---
+title: Document Return Semantics with @returns
+impact: HIGH
+impactDescription: clarifies output guarantees and expectations
+tags: tsdoc, returns, output, contracts
+---
+
+## Document Return Semantics with @returns
+
+Use `@returns` to describe return meaning, guarantees, and ordering.
+
+**Use this when:** function returns non-void values (including Promise payloads).
+**Avoid this when:** output is `void` and no return contract exists.
+
+**Incorrect (type-only restatement):**
+
+```ts
+/**
+ * @returns A string.
+ */
+export function getCacheKey(): string {}
+```
+
+**Correct (semantic output contract):**
+
+```ts
+/**
+ * @returns A deterministic cache key that is stable for equivalent inputs.
+ */
+export function getCacheKey(): string {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-summary.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-summary.md
new file mode 100644
index 0000000..2f3b66b
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-summary.md
@@ -0,0 +1,31 @@
+---
+title: Write Clear Summary Sentences
+impact: HIGH
+impactDescription: improves API discoverability and comprehension
+tags: tsdoc, summary, readability, api-docs
+---
+
+## Write Clear Summary Sentences
+
+Write a short summary that explains behavior and intent in plain language.
+
+**Use this when:** every documented symbol.
+**Avoid this when:** copying symbol names or implementation trivia.
+
+**Incorrect (name restatement, no meaning):**
+
+```ts
+/**
+ * Gets user.
+ */
+export function getUser(id: string): Promise {}
+```
+
+**Correct (behavior and outcome):**
+
+```ts
+/**
+ * Fetches a user by ID from the primary data source.
+ */
+export function getUser(id: string): Promise {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-throws.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-throws.md
new file mode 100644
index 0000000..4b1f360
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-throws.md
@@ -0,0 +1,32 @@
+---
+title: Document Expected Failures with @throws
+impact: HIGH
+impactDescription: defines caller-facing error-handling contracts
+tags: tsdoc, throws, errors, reliability
+---
+
+## Document Expected Failures with @throws
+
+Use `@throws` for expected, contract-relevant failures.
+
+**Use this when:** callers should handle known failure modes.
+**Avoid this when:** documenting incidental low-level errors with no API contract value.
+
+**Incorrect (no throw contract):**
+
+```ts
+/**
+ * Parses a signed token.
+ */
+export function parseToken(token: string): Payload {}
+```
+
+**Correct (caller-relevant error path):**
+
+```ts
+/**
+ * Parses a signed token.
+ * @throws Error if token signature verification fails.
+ */
+export function parseToken(token: string): Payload {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-typeparam.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-typeparam.md
new file mode 100644
index 0000000..88fdb3b
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/core/tsdoc-typeparam.md
@@ -0,0 +1,32 @@
+---
+title: Document Generics with @typeParam
+impact: CRITICAL
+impactDescription: preserves generic API intent for consumers
+tags: tsdoc, typeparam, generics, api-contract
+---
+
+## Document Generics with @typeParam
+
+Use `@typeParam` for each public generic parameter.
+
+**Use this when:** function/class/interface/type alias has generic type params.
+**Avoid this when:** symbol has no generic parameters.
+
+**Incorrect (undocumented generic intent):**
+
+```ts
+/**
+ * Builds an index from items.
+ */
+export function toIndex(items: T[]): Map {}
+```
+
+**Correct (clear generic role):**
+
+```ts
+/**
+ * Builds an index from items.
+ * @typeParam T - Source item type stored in the resulting map.
+ */
+export function toIndex(items: T[]): Map {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-inheritdoc.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-inheritdoc.md
new file mode 100644
index 0000000..f3c4d59
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-inheritdoc.md
@@ -0,0 +1,39 @@
+---
+title: Use @inheritDoc Only for Equivalent Contracts
+impact: HIGH
+impactDescription: prevents inherited docs from drifting from real behavior
+tags: tsdoc, inheritdoc, inheritance, contracts
+---
+
+## Use @inheritDoc Only for Equivalent Contracts
+
+Use `@inheritDoc` only when behavior is truly equivalent to the referenced declaration.
+
+**Use this when:** override/wrapper keeps the same contract.
+**Avoid this when:** behavior, defaults, errors, or side effects differ.
+
+**Incorrect (inherits despite changed behavior):**
+
+```ts
+/**
+ * @inheritDoc BaseClient.fetch
+ */
+export class CachedClient extends BaseClient {
+ public override fetch(id: string): Promise {}
+}
+```
+
+**Correct (document differences explicitly):**
+
+```ts
+/**
+ * Fetches an item by ID, serving stale-while-revalidate responses from cache.
+ *
+ * @remarks
+ * Unlike `BaseClient.fetch`, this method may return cached data immediately
+ * and refresh the cache asynchronously.
+ */
+export class CachedClient extends BaseClient {
+ public override fetch(id: string): Promise {}
+}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-label.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-label.md
new file mode 100644
index 0000000..dd6c85d
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-label.md
@@ -0,0 +1,33 @@
+---
+title: Use {@label ...} Only for Structured References
+impact: LOW
+impactDescription: avoids unnecessary complexity in standard docs
+tags: tsdoc, label, inline-tags, references
+---
+
+## Use `{@label ...}` Only for Structured References
+
+Use `{@label ...}` sparingly for advanced reference labeling scenarios.
+
+**Use this when:** your doc tooling relies on explicit labels for cross-reference flows.
+**Avoid this when:** ordinary symbol linking via `{@link ...}` is sufficient.
+
+**Incorrect (using labels as normal links):**
+
+```ts
+/**
+ * {@label parseToken}
+ * Parses a signed token.
+ */
+export function parseToken(token: string): Payload {}
+```
+
+**Correct (use link for normal references):**
+
+```ts
+/**
+ * Parses a signed token.
+ * See {@link verifyToken} for signature checks.
+ */
+export function parseToken(token: string): Payload {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-link.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-link.md
new file mode 100644
index 0000000..96a10b6
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-link.md
@@ -0,0 +1,31 @@
+---
+title: Prefer {@link ...} for Symbol References
+impact: MEDIUM
+impactDescription: improves navigation and reference accuracy
+tags: tsdoc, link, cross-reference, discoverability
+---
+
+## Prefer `{@link ...}` for Symbol References
+
+Use inline `{@link ...}` when referring to symbols or canonical URLs.
+
+**Use this when:** references should be navigable and unambiguous.
+**Avoid this when:** plain text names could be confused or drift over time.
+
+**Incorrect (non-linking text reference):**
+
+```ts
+/**
+ * Works with TokenVerifier.verify for signature validation.
+ */
+export function parseSignedToken(token: string): Payload {}
+```
+
+**Correct (navigable reference):**
+
+```ts
+/**
+ * Works with {@link TokenVerifier.verify} for signature validation.
+ */
+export function parseSignedToken(token: string): Payload {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-see.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-see.md
new file mode 100644
index 0000000..739971b
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/crossref/tsdoc-see.md
@@ -0,0 +1,33 @@
+---
+title: Use @see for Related APIs
+impact: MEDIUM
+impactDescription: connects related APIs and reduces duplicated docs
+tags: tsdoc, see, references, api-navigation
+---
+
+## Use @see for Related APIs
+
+Use `@see` to point readers to related entry points, alternatives, or companion APIs.
+
+**Use this when:** relationship is important for correct API selection.
+**Avoid this when:** references are irrelevant or redundant.
+
+**Incorrect (no relationship guidance):**
+
+```ts
+/**
+ * Verifies token signatures.
+ */
+export function verifyToken(token: string): boolean {}
+```
+
+**Correct (points to related APIs):**
+
+```ts
+/**
+ * Verifies token signatures.
+ * @see {@link decodeToken}
+ * @see {@link parseSignedToken}
+ */
+export function verifyToken(token: string): boolean {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-default-value.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-default-value.md
new file mode 100644
index 0000000..0a4cd32
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-default-value.md
@@ -0,0 +1,32 @@
+---
+title: Document Defaults with @defaultValue
+impact: MEDIUM
+impactDescription: prevents ambiguity in option and property behavior
+tags: tsdoc, defaultValue, options, configuration
+---
+
+## Document Defaults with `@defaultValue`
+
+Use `@defaultValue` to document meaningful default behavior.
+
+**Use this when:** options/properties have user-visible defaults.
+**Avoid this when:** defaults are unstable, implicit, or undocumented in implementation.
+
+**Incorrect (default hidden from docs):**
+
+```ts
+/**
+ * Maximum retry attempts.
+ */
+export const DEFAULT_RETRY_ATTEMPTS = 3;
+```
+
+**Correct (explicit default):**
+
+```ts
+/**
+ * Maximum retry attempts.
+ * @defaultValue 3
+ */
+export const DEFAULT_RETRY_ATTEMPTS = 3;
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-modifier-tags.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-modifier-tags.md
new file mode 100644
index 0000000..b628b71
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-modifier-tags.md
@@ -0,0 +1,35 @@
+---
+title: Use Modifier Tags Only When Semantically True
+impact: HIGH
+impactDescription: prevents misleading API semantics in generated docs
+tags: tsdoc, modifier-tags, readonly, override, virtual, sealed, decorator, eventProperty
+---
+
+## Use Modifier Tags Only When Semantically True
+
+Use modifier tags only when they match real API semantics.
+
+Common modifier tags: `@readonly`, `@override`, `@virtual`, `@sealed`, `@decorator`, `@eventProperty`.
+
+**Use this when:** code behavior and design contract actually match the tag.
+**Avoid this when:** tags are decorative or used for emphasis.
+
+**Incorrect (tag conflicts with implementation):**
+
+```ts
+/**
+ * Tracks current request count.
+ * @readonly
+ */
+export let requestCount = 0;
+```
+
+**Correct (tag matches behavior):**
+
+```ts
+/**
+ * Current build version.
+ * @readonly
+ */
+export const BUILD_VERSION = "1.0.0";
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md
new file mode 100644
index 0000000..82cc164
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-no-jsdoc-braces.md
@@ -0,0 +1,33 @@
+---
+title: Do Not Mix JSDoc Type Syntax into TSDoc
+impact: CRITICAL
+impactDescription: avoids parser/tooling incompatibilities and inconsistent style
+tags: tsdoc, jsdoc, syntax, consistency
+---
+
+## Do Not Mix JSDoc Type Syntax into TSDoc
+
+In TSDoc, avoid JSDoc-style type braces in tag lines.
+
+**Use this when:** writing TSDoc in TypeScript codebases.
+**Avoid this when:** authoring JavaScript files that intentionally use JSDoc tooling.
+
+**Incorrect (JSDoc-style braces in TSDoc):**
+
+```ts
+/**
+ * @param {string} id - User identifier.
+ * @returns {Promise} User record.
+ */
+export async function getUser(id: string): Promise {}
+```
+
+**Correct (TSDoc syntax):**
+
+```ts
+/**
+ * @param id - User identifier.
+ * @returns User record.
+ */
+export async function getUser(id: string): Promise {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-package-documentation.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-package-documentation.md
new file mode 100644
index 0000000..d56c2f6
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-package-documentation.md
@@ -0,0 +1,32 @@
+---
+title: Use @packageDocumentation for Entrypoint Docs
+impact: MEDIUM
+impactDescription: improves package-level discoverability and onboarding
+tags: tsdoc, packageDocumentation, modules, entrypoints
+---
+
+## Use `@packageDocumentation` for Entrypoint Docs
+
+Use `@packageDocumentation` on module/entrypoint docs, not regular members.
+
+**Use this when:** documenting package/module purpose and usage at top level.
+**Avoid this when:** documenting individual functions, classes, or fields.
+
+**Incorrect (tag on a normal function):**
+
+```ts
+/**
+ * @packageDocumentation
+ * Creates a token.
+ */
+export function createToken(userId: string): string {}
+```
+
+**Correct (tag on entrypoint-level docs):**
+
+```ts
+/**
+ * @packageDocumentation
+ * Authentication helpers for issuing, parsing, and validating signed tokens.
+ */
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-private-remarks.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-private-remarks.md
new file mode 100644
index 0000000..ab914a4
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-private-remarks.md
@@ -0,0 +1,34 @@
+---
+title: Use @privateRemarks for Maintainer-Only Notes
+impact: MEDIUM
+impactDescription: separates internal guidance from public API docs
+tags: tsdoc, privateRemarks, maintainers, internals
+---
+
+## Use `@privateRemarks` for Maintainer-Only Notes
+
+Use `@privateRemarks` for internal notes that should not appear in public docs.
+
+**Use this when:** maintainers need migration or implementation caveats.
+**Avoid this when:** information is essential for API consumers.
+
+**Incorrect (internal rollout note in public remarks):**
+
+```ts
+/**
+ * @remarks
+ * Keep legacy payload shape until mobile v4 rollout finishes.
+ */
+export function serializeUser(user: User): Payload {}
+```
+
+**Correct (internal detail isolated):**
+
+```ts
+/**
+ * Serializes user data for API responses.
+ * @privateRemarks
+ * Keep legacy payload shape until mobile v4 rollout finishes.
+ */
+export function serializeUser(user: User): Payload {}
+```
diff --git a/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-release-tags.md b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-release-tags.md
new file mode 100644
index 0000000..6b3bfaf
--- /dev/null
+++ b/.agents/skills/tsdoc-jsdoc-authoring/rules/tsdoc/policy/tsdoc-release-tags.md
@@ -0,0 +1,36 @@
+---
+title: Apply Release Tags Consistently
+impact: CRITICAL
+impactDescription: ensures stable public API lifecycle communication
+tags: tsdoc, release-tags, public, internal, alpha, beta, experimental
+---
+
+## Apply Release Tags Consistently
+
+Apply one clear release/visibility policy and keep it consistent across related APIs.
+
+Supported policy tags include `@public`, `@internal`, `@alpha`, `@beta`, and `@experimental`.
+
+**Use this when:** API lifecycle and visibility matter to consumers.
+**Avoid this when:** tags are mixed arbitrarily or conflict with actual support policy.
+
+**Incorrect (conflicting policy):**
+
+```ts
+/**
+ * Creates session tokens.
+ * @public
+ * @internal
+ */
+export function createSessionToken(userId: string): string {}
+```
+
+**Correct (single clear policy):**
+
+```ts
+/**
+ * Creates session tokens.
+ * @beta
+ */
+export function createSessionToken(userId: string): string {}
+```
diff --git a/.agents/skills/vitest/GENERATION.md b/.agents/skills/vitest/GENERATION.md
new file mode 100644
index 0000000..9bc7664
--- /dev/null
+++ b/.agents/skills/vitest/GENERATION.md
@@ -0,0 +1,5 @@
+# Generation Info
+
+- **Source:** `sources/vitest`
+- **Git SHA:** `4a7321e10672f00f0bb698823a381c2cc245b8f7`
+- **Generated:** 2026-01-28
diff --git a/.agents/skills/vitest/SKILL.md b/.agents/skills/vitest/SKILL.md
new file mode 100644
index 0000000..d813e2c
--- /dev/null
+++ b/.agents/skills/vitest/SKILL.md
@@ -0,0 +1,53 @@
+---
+name: vitest
+description: Vitest fast unit testing framework powered by Vite with Jest-compatible API. Use when writing tests, mocking, configuring coverage, or working with test filtering and fixtures.
+metadata:
+ author: Anthony Fu
+ version: "2026.1.28"
+ source: Generated from https://github.com/vitest-dev/vitest, scripts located at https://github.com/antfu/skills
+---
+
+Vitest is a next-generation testing framework powered by Vite. It provides a Jest-compatible API with native ESM, TypeScript, and JSX support out of the box. Vitest shares the same config, transformers, resolvers, and plugins with your Vite app.
+
+**Key Features:**
+
+- Vite-native: Uses Vite's transformation pipeline for fast HMR-like test updates
+- Jest-compatible: Drop-in replacement for most Jest test suites
+- Smart watch mode: Only reruns affected tests based on module graph
+- Native ESM, TypeScript, JSX support without configuration
+- Multi-threaded workers for parallel test execution
+- Built-in coverage via V8 or Istanbul
+- Snapshot testing, mocking, and spy utilities
+
+> The skill is based on Vitest 3.x, generated at 2026-01-28.
+
+## Core
+
+| Topic | Description | Reference |
+| ------------- | --------------------------------------------------------------- | -------------------------------------------- |
+| Configuration | Vitest and Vite config integration, defineConfig usage | [core-config](references/core-config.md) |
+| CLI | Command line interface, commands and options | [core-cli](references/core-cli.md) |
+| Test API | test/it function, modifiers like skip, only, concurrent | [core-test-api](references/core-test-api.md) |
+| Describe API | describe/suite for grouping tests and nested suites | [core-describe](references/core-describe.md) |
+| Expect API | Assertions with toBe, toEqual, matchers and asymmetric matchers | [core-expect](references/core-expect.md) |
+| Hooks | beforeEach, afterEach, beforeAll, afterAll, aroundEach | [core-hooks](references/core-hooks.md) |
+
+## Features
+
+| Topic | Description | Reference |
+| ------------ | -------------------------------------------------------------- | ---------------------------------------------------------- |
+| Mocking | Mock functions, modules, timers, dates with vi utilities | [features-mocking](references/features-mocking.md) |
+| Snapshots | Snapshot testing with toMatchSnapshot and inline snapshots | [features-snapshots](references/features-snapshots.md) |
+| Coverage | Code coverage with V8 or Istanbul providers | [features-coverage](references/features-coverage.md) |
+| Test Context | Test fixtures, context.expect, test.extend for custom fixtures | [features-context](references/features-context.md) |
+| Concurrency | Concurrent tests, parallel execution, sharding | [features-concurrency](references/features-concurrency.md) |
+| Filtering | Filter tests by name, file patterns, tags | [features-filtering](references/features-filtering.md) |
+
+## Advanced
+
+| Topic | Description | Reference |
+| ------------ | ------------------------------------------------------- | ------------------------------------------------------------ |
+| Vi Utilities | vi helper: mock, spyOn, fake timers, hoisted, waitFor | [advanced-vi](references/advanced-vi.md) |
+| Environments | Test environments: node, jsdom, happy-dom, custom | [advanced-environments](references/advanced-environments.md) |
+| Type Testing | Type-level testing with expectTypeOf and assertType | [advanced-type-testing](references/advanced-type-testing.md) |
+| Projects | Multi-project workspaces, different configs per project | [advanced-projects](references/advanced-projects.md) |
diff --git a/.agents/skills/vitest/references/advanced-environments.md b/.agents/skills/vitest/references/advanced-environments.md
new file mode 100644
index 0000000..69c60ca
--- /dev/null
+++ b/.agents/skills/vitest/references/advanced-environments.md
@@ -0,0 +1,264 @@
+---
+name: test-environments
+description: Configure environments like jsdom, happy-dom for browser APIs
+---
+
+# Test Environments
+
+## Available Environments
+
+- `node` (default) - Node.js environment
+- `jsdom` - Browser-like with DOM APIs
+- `happy-dom` - Faster alternative to jsdom
+- `edge-runtime` - Vercel Edge Runtime
+
+## Configuration
+
+```ts
+// vitest.config.ts
+defineConfig({
+ test: {
+ environment: "jsdom",
+
+ // Environment-specific options
+ environmentOptions: {
+ jsdom: {
+ url: "http://localhost",
+ },
+ },
+ },
+});
+```
+
+## Installing Environment Packages
+
+```bash
+# jsdom
+npm i -D jsdom
+
+# happy-dom (faster, fewer APIs)
+npm i -D happy-dom
+```
+
+## Per-File Environment
+
+Use magic comment at top of file:
+
+```ts
+// @vitest-environment jsdom
+
+import { expect, test } from "vitest";
+
+test("DOM test", () => {
+ const div = document.createElement("div");
+ expect(div).toBeInstanceOf(HTMLDivElement);
+});
+```
+
+## jsdom Environment
+
+Full browser environment simulation:
+
+```ts
+// @vitest-environment jsdom
+
+test("DOM manipulation", () => {
+ document.body.innerHTML = '';
+
+ const app = document.getElementById("app");
+ app.textContent = "Hello";
+
+ expect(app.textContent).toBe("Hello");
+});
+
+test("window APIs", () => {
+ expect(window.location.href).toBeDefined();
+ expect(localStorage).toBeDefined();
+});
+```
+
+### jsdom Options
+
+```ts
+defineConfig({
+ test: {
+ environmentOptions: {
+ jsdom: {
+ url: "http://localhost:3000",
+ html: "",
+ userAgent: "custom-agent",
+ resources: "usable",
+ },
+ },
+ },
+});
+```
+
+## happy-dom Environment
+
+Faster but fewer APIs:
+
+```ts
+// @vitest-environment happy-dom
+
+test("basic DOM", () => {
+ const el = document.createElement("div");
+ el.className = "test";
+ expect(el.className).toBe("test");
+});
+```
+
+## Multiple Environments per Project
+
+Use projects for different environments:
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "unit",
+ include: ["tests/unit/**/*.test.ts"],
+ environment: "node",
+ },
+ },
+ {
+ test: {
+ name: "dom",
+ include: ["tests/dom/**/*.test.ts"],
+ environment: "jsdom",
+ },
+ },
+ ],
+ },
+});
+```
+
+## Custom Environment
+
+Create custom environment package:
+
+```ts
+// vitest-environment-custom/index.ts
+import type { Environment } from "vitest/runtime";
+
+export default {
+ name: "custom",
+ viteEnvironment: "ssr", // or 'client'
+
+ setup() {
+ // Setup global state
+ globalThis.myGlobal = "value";
+
+ return {
+ teardown() {
+ delete globalThis.myGlobal;
+ },
+ };
+ },
+};
+```
+
+Use with:
+
+```ts
+defineConfig({
+ test: {
+ environment: "custom",
+ },
+});
+```
+
+## Environment with VM
+
+For full isolation:
+
+```ts
+export default {
+ name: "isolated",
+ viteEnvironment: "ssr",
+
+ async setupVM() {
+ const vm = await import("node:vm");
+ const context = vm.createContext();
+
+ return {
+ getVmContext() {
+ return context;
+ },
+ teardown() {},
+ };
+ },
+
+ setup() {
+ return { teardown() {} };
+ },
+};
+```
+
+## Browser Mode (Separate from Environments)
+
+For real browser testing, use Vitest Browser Mode:
+
+```ts
+defineConfig({
+ test: {
+ browser: {
+ enabled: true,
+ name: "chromium", // or 'firefox', 'webkit'
+ provider: "playwright",
+ },
+ },
+});
+```
+
+## CSS and Assets
+
+In jsdom/happy-dom, configure CSS handling:
+
+```ts
+defineConfig({
+ test: {
+ css: true, // Process CSS
+
+ // Or with options
+ css: {
+ include: /\.module\.css$/,
+ modules: {
+ classNameStrategy: "non-scoped",
+ },
+ },
+ },
+});
+```
+
+## Fixing External Dependencies
+
+If external deps fail with CSS/asset errors:
+
+```ts
+defineConfig({
+ test: {
+ server: {
+ deps: {
+ inline: ["problematic-package"],
+ },
+ },
+ },
+});
+```
+
+## Key Points
+
+- Default is `node` - no browser APIs
+- Use `jsdom` for full browser simulation
+- Use `happy-dom` for faster tests with basic DOM
+- Per-file environment via `// @vitest-environment` comment
+- Use projects for multiple environment configurations
+- Browser Mode is for real browser testing, not environment
+
+
diff --git a/.agents/skills/vitest/references/advanced-projects.md b/.agents/skills/vitest/references/advanced-projects.md
new file mode 100644
index 0000000..2b4d37f
--- /dev/null
+++ b/.agents/skills/vitest/references/advanced-projects.md
@@ -0,0 +1,300 @@
+---
+name: projects-workspaces
+description: Multi-project configuration for monorepos and different test types
+---
+
+# Projects
+
+Run different test configurations in the same Vitest process.
+
+## Basic Projects Setup
+
+```ts
+// vitest.config.ts
+defineConfig({
+ test: {
+ projects: [
+ // Glob patterns for config files
+ "packages/*",
+
+ // Inline config
+ {
+ test: {
+ name: "unit",
+ include: ["tests/unit/**/*.test.ts"],
+ environment: "node",
+ },
+ },
+ {
+ test: {
+ name: "integration",
+ include: ["tests/integration/**/*.test.ts"],
+ environment: "jsdom",
+ },
+ },
+ ],
+ },
+});
+```
+
+## Monorepo Pattern
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ // Each package has its own vitest.config.ts
+ "packages/core",
+ "packages/cli",
+ "packages/utils",
+ ],
+ },
+});
+```
+
+Package config:
+
+```ts
+// packages/core/vitest.config.ts
+import { defineConfig } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ name: "core",
+ include: ["src/**/*.test.ts"],
+ environment: "node",
+ },
+});
+```
+
+## Different Environments
+
+Run same tests in different environments:
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "happy-dom",
+ root: "./shared-tests",
+ environment: "happy-dom",
+ setupFiles: ["./setup.happy-dom.ts"],
+ },
+ },
+ {
+ test: {
+ name: "node",
+ root: "./shared-tests",
+ environment: "node",
+ setupFiles: ["./setup.node.ts"],
+ },
+ },
+ ],
+ },
+});
+```
+
+## Browser + Node Projects
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "unit",
+ include: ["tests/unit/**/*.test.ts"],
+ environment: "node",
+ },
+ },
+ {
+ test: {
+ name: "browser",
+ include: ["tests/browser/**/*.test.ts"],
+ browser: {
+ enabled: true,
+ name: "chromium",
+ provider: "playwright",
+ },
+ },
+ },
+ ],
+ },
+});
+```
+
+## Shared Configuration
+
+```ts
+// vitest.shared.ts
+export const sharedConfig = {
+ testTimeout: 10000,
+ setupFiles: ["./tests/setup.ts"],
+};
+
+// vitest.config.ts
+import { sharedConfig } from "./vitest.shared";
+
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ ...sharedConfig,
+ name: "unit",
+ include: ["tests/unit/**/*.test.ts"],
+ },
+ },
+ {
+ test: {
+ ...sharedConfig,
+ name: "e2e",
+ include: ["tests/e2e/**/*.test.ts"],
+ },
+ },
+ ],
+ },
+});
+```
+
+## Project-Specific Dependencies
+
+Each project can have different dependencies inlined:
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "project-a",
+ server: {
+ deps: {
+ inline: ["package-a"],
+ },
+ },
+ },
+ },
+ ],
+ },
+});
+```
+
+## Running Specific Projects
+
+```bash
+# Run specific project
+vitest --project unit
+vitest --project integration
+
+# Multiple projects
+vitest --project unit --project e2e
+
+# Exclude project
+vitest --project.ignore browser
+```
+
+## Providing Values to Projects
+
+Share values from config to tests:
+
+```ts
+// vitest.config.ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "staging",
+ provide: {
+ apiUrl: "https://staging.api.com",
+ debug: true,
+ },
+ },
+ },
+ {
+ test: {
+ name: "production",
+ provide: {
+ apiUrl: "https://api.com",
+ debug: false,
+ },
+ },
+ },
+ ],
+ },
+});
+
+// In tests, use inject
+import { inject } from "vitest";
+
+test("uses correct api", () => {
+ const url = inject("apiUrl");
+ expect(url).toContain("api.com");
+});
+```
+
+## With Fixtures
+
+```ts
+const test = base.extend({
+ apiUrl: ["/default", { injected: true }],
+});
+
+test("uses injected url", ({ apiUrl }) => {
+ // apiUrl comes from project's provide config
+});
+```
+
+## Project Isolation
+
+Each project runs in its own thread pool by default:
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "isolated",
+ isolate: true, // Full isolation
+ pool: "forks",
+ },
+ },
+ ],
+ },
+});
+```
+
+## Global Setup per Project
+
+```ts
+defineConfig({
+ test: {
+ projects: [
+ {
+ test: {
+ name: "with-db",
+ globalSetup: ["./tests/db-setup.ts"],
+ },
+ },
+ ],
+ },
+});
+```
+
+## Key Points
+
+- Projects run in same Vitest process
+- Each project can have different environment, config
+- Use glob patterns for monorepo packages
+- Run specific projects with `--project` flag
+- Use `provide` to inject config values into tests
+- Projects inherit from root config unless overridden
+
+
diff --git a/.agents/skills/vitest/references/advanced-type-testing.md b/.agents/skills/vitest/references/advanced-type-testing.md
new file mode 100644
index 0000000..52dbd67
--- /dev/null
+++ b/.agents/skills/vitest/references/advanced-type-testing.md
@@ -0,0 +1,242 @@
+---
+name: type-testing
+description: Test TypeScript types with expectTypeOf and assertType
+---
+
+# Type Testing
+
+Test TypeScript types without runtime execution.
+
+## Setup
+
+Type tests use `.test-d.ts` extension:
+
+```ts
+// math.test-d.ts
+import { expectTypeOf } from "vitest";
+import { add } from "./math";
+
+test("add returns number", () => {
+ expectTypeOf(add).returns.toBeNumber();
+});
+```
+
+## Configuration
+
+```ts
+defineConfig({
+ test: {
+ typecheck: {
+ enabled: true,
+
+ // Only type check
+ only: false,
+
+ // Checker: 'tsc' or 'vue-tsc'
+ checker: "tsc",
+
+ // Include patterns
+ include: ["**/*.test-d.ts"],
+
+ // tsconfig to use
+ tsconfig: "./tsconfig.json",
+ },
+ },
+});
+```
+
+## expectTypeOf API
+
+```ts
+import { expectTypeOf } from "vitest";
+
+// Basic type checks
+expectTypeOf().toBeString();
+expectTypeOf().toBeNumber();
+expectTypeOf().toBeBoolean();
+expectTypeOf().toBeNull();
+expectTypeOf().toBeUndefined();
+expectTypeOf().toBeVoid();
+expectTypeOf().toBeNever();
+expectTypeOf().toBeAny();
+expectTypeOf().toBeUnknown();
+expectTypeOf
",
- "badges": [
- {
- "label": "GitHub stars",
- "image": "https://img.shields.io/github/stars/c15t/c15t?style=flat-square",
- "link": "https://github.com/c15t/c15t"
- },
- {
- "label": "CI",
- "image": "https://img.shields.io/github/actions/workflow/status/c15t/c15t/ci.yml?style=flat-square",
- "link": "https://github.com/c15t/c15t/actions/workflows/ci.yml"
- },
- {
- "label": "License",
- "image": "https://img.shields.io/badge/license-GPL--3.0-blue.svg?style=flat-square",
- "link": "https://github.com/c15t/c15t/blob/main/LICENSE.md"
- },
- {
- "label": "Discord",
- "image": "https://img.shields.io/discord/1312171102268690493?style=flat-square",
- "link": "https://c15t.link/discord"
- },
- {
- "label": "npm version",
- "image": "https://img.shields.io/npm/v/%40c15t%2Freact?style=flat-square",
- "link": "https://www.npmjs.com/package/@c15t/react"
- },
- {
- "label": "Top Language",
- "image": "https://img.shields.io/github/languages/top/c15t/c15t?style=flat-square",
- "link": "https://github.com/c15t/c15t"
- },
- {
- "label": "Last Commit",
- "image": "https://img.shields.io/github/last-commit/c15t/c15t?style=flat-square",
- "link": "https://github.com/c15t/c15t/commits/main"
- },
- {
- "label": "Open Issues",
- "image": "https://img.shields.io/github/issues/c15t/c15t?style=flat-square",
- "link": "https://github.com/c15t/c15t/issues"
- }
- ],
- "support": [
- "Join our [Discord community](https://c15t.link/discord)",
- "Open an issue on our [GitHub repository](https://github.com/c15t/c15t/issues)",
- "Visit [consent.io](https://consent.io) and use the chat widget",
- "Contact our support team via email [support@consent.io](mailto:support@consent.io)"
- ],
- "contributing": [
- "We're open to all community contributions!",
- "Read our [Contribution Guidelines](https://c15t.com/docs/oss/contributing)",
- "Review our [Code of Conduct](https://c15t.com/docs/oss/code-of-conduct)",
- "Fork the repository",
- "Create a new branch for your feature",
- "Submit a pull request",
- "**All contributions, big or small, are welcome and appreciated!**"
- ],
- "security": "If you believe you have found a security vulnerability in c15t, we encourage you to **_responsibly disclose this and NOT open a public issue_**. We will investigate all legitimate reports.\n\nOur preference is that you make use of GitHub's private vulnerability reporting feature to disclose potential security vulnerabilities in our Open Source Software. To do this, please visit [https://github.com/c15t/c15t/security](https://github.com/c15t/c15t/security) and click the \"Report a vulnerability\" button.\n\n### Security Policy\n\n- Please do not share security vulnerabilities in public forums, issues, or pull requests\n- Provide detailed information about the potential vulnerability\n- Allow reasonable time for us to address the issue before any public disclosure\n- We are committed to addressing security concerns promptly and transparently",
- "license": {
- "name": "GNU General Public License v3.0",
- "url": "https://github.com/c15t/c15t/blob/main/LICENSE.md"
- },
- "footer": "---\n\n**Built with ❤️ by the [consent.io](https://www.consent.io?utm_source=github&utm_medium=repopage_{{packageNameEncoded}}) team**"
+ "$schema": "../../schemas/readie.global.schema.json",
+ "banner": "