From 1434bfe62c342ea2ed424644b16749f90126d300 Mon Sep 17 00:00:00 2001 From: david morales <118213696+davidmoralesz@users.noreply.github.com> Date: Fri, 9 Oct 2026 11:56:32 -0600 Subject: [PATCH 1/2] feat(devtools): move this repo to mise and lefthook's shared rules mise.toml and mise.lock replace install-hooks.sh, Homebrew and the devDependencies, so the hooks no longer skip a linter that is not installed. self-lint calls ci-lint, which runs the same lefthook.yml. commitlint.config.mjs becomes .commitlintrc.yaml, which ci-pr can read, so this repo's scopes are now enforced on the pull request too. pnpm is left with semantic-release only. ci-pre-commit and the pre-commit hooks are deprecated and stay until consumers move. --- .commitlintrc.yaml | 22 + .devtools/install-hooks.sh | 41 - .github/workflows/self-lint.yml | 47 +- .../npm-commitlint-cli/21.2.3/aube-lock.yaml | 823 ++++++++++++++++++ .../npm-commitlint-cli/21.2.3/package.json | 7 + .mise/locks/npm-prettier/3.9.9/aube-lock.yaml | 24 + .mise/locks/npm-prettier/3.9.9/package.json | 7 + .prettierignore | 4 + AGENTS.md | 24 +- README.md | 73 +- commitlint.config.mjs | 14 - lefthook.yml | 104 +-- mise.lock | 310 +++++++ mise.toml | 21 + package.json | 13 - pnpm-lock.yaml | 478 +--------- pnpm-workspace.yaml | 18 +- 17 files changed, 1347 insertions(+), 683 deletions(-) create mode 100644 .commitlintrc.yaml delete mode 100755 .devtools/install-hooks.sh create mode 100644 .mise/locks/npm-commitlint-cli/21.2.3/aube-lock.yaml create mode 100644 .mise/locks/npm-commitlint-cli/21.2.3/package.json create mode 100644 .mise/locks/npm-prettier/3.9.9/aube-lock.yaml create mode 100644 .mise/locks/npm-prettier/3.9.9/package.json delete mode 100644 commitlint.config.mjs create mode 100644 mise.lock create mode 100644 mise.toml diff --git a/.commitlintrc.yaml b/.commitlintrc.yaml new file mode 100644 index 0000000..c7aaf32 --- /dev/null +++ b/.commitlintrc.yaml @@ -0,0 +1,22 @@ +# Conventional Commits for this repo. The local commit-msg hook reads the whole file; +# ci-pr reads only `rules`, on top of .github/actions/pr-checks/commitlint.default.yaml. + +# commitlint's built-in pattern does not accept the `!` that marks a breaking change. +parserPreset: + parserOpts: + headerPattern: '^(\w*)(?:\(([^)]*)\))?!?: (.*)$' + headerCorrespondence: [type, scope, subject] + +rules: + type-enum: + - 2 + - always + - [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] + type-case: [2, always, lower-case] + type-empty: [2, never] + scope-case: [2, always, lower-case] + subject-empty: [2, never] + subject-full-stop: [2, never, '.'] + # The scopes AGENTS.md documents, made binding. A scope stays optional, but an + # invented one is rejected, so the two lists cannot drift apart. + scope-enum: [2, always, [actions, workflows, devtools, templates, docs, deps]] diff --git a/.devtools/install-hooks.sh b/.devtools/install-hooks.sh deleted file mode 100755 index 24dcc62..0000000 --- a/.devtools/install-hooks.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash -# -# Set up local development for this repo. Installs the Node toolchain (commitlint, -# prettier, lefthook, semantic-release) with pnpm and wires the git hooks, then the -# system linters the pre-commit hook uses. -# -# The linters are optional by design: the hooks warn and skip when one is missing, so a -# fresh clone is never blocked from committing. CI runs them unconditionally. -# -# Usage: sh .devtools/install-hooks.sh -set -euo pipefail - -repo_root="$(cd "$(dirname "$0")/.." && pwd)" -cd "$repo_root" - -if ! command -v pnpm >/dev/null 2>&1; then - if command -v corepack >/dev/null 2>&1; then - echo "Enabling pnpm via corepack..." - corepack enable - else - echo "error: pnpm not found and corepack is unavailable. Install Node 24+ first." >&2 - exit 1 - fi -fi - -echo "Installing Node dependencies (also runs 'lefthook install' via the prepare script)..." -pnpm install - -if command -v brew >/dev/null 2>&1; then - for tool in actionlint shellcheck zizmor gitleaks; do - if ! command -v "$tool" >/dev/null 2>&1; then - echo "Installing $tool via Homebrew..." - brew install "$tool" - fi - done -else - echo "note: Homebrew not found. Install actionlint, shellcheck, zizmor and gitleaks" - echo " manually for the pre-commit lint hooks; they are skipped without them." -fi - -echo "Done. Git hooks are installed." diff --git a/.github/workflows/self-lint.yml b/.github/workflows/self-lint.yml index 2eed83b..8ee150e 100644 --- a/.github/workflows/self-lint.yml +++ b/.github/workflows/self-lint.yml @@ -1,9 +1,10 @@ name: self-lint -# Dogfooding caller: runs the ci-workflows library workflow (actionlint, zizmor, -# shellcheck) against this repo's own source, which is the strongest proof it works -# before a consumer pins @v1. Adds the checks that are specific to this repo and are -# not part of the exported library. +# Dogfooding caller: runs the ci-lint library workflow against this repo's own source, +# which is the strongest proof it works before a consumer pins @v1. ci-lint runs this +# repo's lefthook pre-commit hook over every file: Prettier, actionlint, zizmor, +# shellcheck and the first-party pin check. Adds the tests that are specific to this +# repo and are not part of the exported library. on: pull_request: @@ -16,24 +17,33 @@ concurrency: cancel-in-progress: true jobs: - # Dependabot only ever bumps a pinned SHA or a devDependency, and it vets what it + # Dependabot only ever bumps a pinned SHA or a dependency, and it vets what it # opens; running the full lint suite on those adds latency without adding signal. - workflows: + lint: if: ${{ !startsWith(github.head_ref, 'dependabot/') }} permissions: contents: read # zizmor prefers `$/` over `./`, because a workspace-relative ref can load # something a previous step cloned at runtime. That risk is real for a step-level - # action ref -- it is why the actions above moved to `$/` -- but not for a - # job-level reusable-workflow call, which GitHub resolves when the run is queued, - # never from the workspace. `./` buys something concrete in exchange: actionlint - # validates a local call against the callee's declarations (it catches an input - # name that does not exist, and lists the ones that do), while `$/` it cannot - # parse at all, so the call would go unchecked. Keeping the validation. + # action ref -- it is why the actions moved to `$/` -- but not for a job-level + # reusable-workflow call, which GitHub resolves when the run is queued, never from + # the workspace. `./` buys something concrete in exchange: actionlint validates a + # local call against the callee's declarations (it catches an input name that does + # not exist, and lists the ones that do), while `$/` it cannot parse at all, so the + # call would go unchecked. Keeping the validation. + uses: ./.github/workflows/ci-lint.yml # zizmor: ignore[self-repository] + + # ci-workflows is the library for repos with no lefthook config. Nothing else here + # calls it, so this is its only test. + workflows: + if: ${{ !startsWith(github.head_ref, 'dependabot/') }} + permissions: + contents: read uses: ./.github/workflows/ci-workflows.yml # zizmor: ignore[self-repository] repo-checks: if: ${{ !startsWith(github.head_ref, 'dependabot/') }} + # The name is a required check in rulesets/checks-dotgithub.json; change both together. name: Pins and formatting runs-on: ubuntu-latest timeout-minutes: 10 @@ -51,20 +61,11 @@ jobs: - name: Check first-party action pins run: sh .devtools/check-action-pins.sh - # ci-pr only exercises these scripts with a pull request's arguments. The - # pre-commit hooks call them with none, and that path is tested here. # The same install ci-pr does, so the test below runs the commitlint consumers get. - name: Install commitlint for pr-checks run: npm ci --prefix .github/actions/pr-checks --ignore-scripts --no-audit --no-fund + # ci-pr only exercises these scripts with a pull request's arguments. The git + # hooks call them with none, and that path is tested here. - name: Test the check scripts run: bash .devtools/test-hooks.sh - - - name: Enable pnpm via corepack - run: corepack enable - - - name: Install the toolchain - run: pnpm install --frozen-lockfile - - - name: Check formatting - run: pnpm run format:check diff --git a/.mise/locks/npm-commitlint-cli/21.2.3/aube-lock.yaml b/.mise/locks/npm-commitlint-cli/21.2.3/aube-lock.yaml new file mode 100644 index 0000000..714c725 --- /dev/null +++ b/.mise/locks/npm-commitlint-cli/21.2.3/aube-lock.yaml @@ -0,0 +1,823 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@commitlint/cli': + specifier: 21.2.3 + version: 21.2.3(@types/node@26.6.4)(typescript@7.0.2) + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@commitlint/cli@21.2.3': + resolution: {integrity: sha512-5yOX6IRjcrIReCxpyAd04hgI/yhUMpVBJ/ouwFV0wk9yx5+fYRDWZWJ5h55Tbedgfol+5m2mU5nqzbB8g3v0vQ==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@commitlint/config-conventional@21.2.3': + resolution: {integrity: sha512-EP2n5DN2GwRWNVrLX0Jx3mpQlW5PfFi9HnD9OJ8hN/H0xFqpCFyHeGDhg+0P8/21iMMcdkcQgbNqmVklebqYsQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/config-validator@21.2.3': + resolution: {integrity: sha512-JQ13v0GafSM4fBYX8UowSy++07Was20auq0NcTdnzSEq6/05Cq5GBUMIfKkqjzyBwC9sJFmPpKWgLLhH7cygkw==} + engines: {node: '>=22.12.0'} + + '@commitlint/ensure@21.2.3': + resolution: {integrity: sha512-gEjNKgRocbODI5/sMx2Qc9XOf2/zFTNV2aEK1QZ4gKDKxDC/VR7us3QtIX1C5d5xxHxx0I/tEbYbdSP1Am2LwA==} + engines: {node: '>=22.12.0'} + + '@commitlint/execute-rule@21.0.1': + resolution: {integrity: sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==} + engines: {node: '>=22.12.0'} + + '@commitlint/format@21.2.3': + resolution: {integrity: sha512-KKwCjXYqA8r295uhLnulDXL9yekdXmj2yp2Q0XsBPhxQ2iPuvRE8F43j7g7yexo69wTdmUQmFz15jpderluzUQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/is-ignored@21.2.3': + resolution: {integrity: sha512-Ng4nRj/LBAOvc+GQu7bsFW4/fL89LvZ14OOC/ERLbUpnG6QBwWRzY/1oXGwPs3C8YHWjJObin4kLYo2YeEn70w==} + engines: {node: '>=22.12.0'} + + '@commitlint/lint@21.2.3': + resolution: {integrity: sha512-lUZcSuVLLEDkhge9ERk8Rp+FXQtrUhCK+h328BFnzKXrTuXGdqiYMEpTlNWdZaOrjyMhMJaz354ZaWEGJxcLeg==} + engines: {node: '>=22.12.0'} + + '@commitlint/load@21.2.3': + resolution: {integrity: sha512-cDrL8lOo23Lk7knGzQdjbFcq7z2JgvjwV6PhbESVvEc+Fe21MeLjPKBJi8nKjg7j+jh79CVbVSUbZc104thXRw==} + engines: {node: '>=22.12.0'} + + '@commitlint/message@21.2.0': + resolution: {integrity: sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==} + engines: {node: '>=22.12.0'} + + '@commitlint/parse@21.2.3': + resolution: {integrity: sha512-Jt61QpF1xA88damCELe8I0FlDZPSpXNc8IhN7z5kZ0EcDYPjdZ+ZHPvsSXl69r2MIlLnNKeHhOn2cmVpziFE9w==} + engines: {node: '>=22.12.0'} + + '@commitlint/read@21.2.3': + resolution: {integrity: sha512-szAepuLA1vTTr7fuudEg7jYyVHudf+FH+vptU91bhxE1WnE8TKrfTAi44HVllz8XpI8Pvp4GjR/iP5Nshgh+og==} + engines: {node: '>=22.12.0'} + + '@commitlint/resolve-extends@21.2.3': + resolution: {integrity: sha512-bqJdmAtXgAQel+l02uIsF7rHgKgx1AGZdGBjam7uK4XW54ZAQtB6XAIUXezYprQiCcRMpBh4fHs5JodXK4mVZA==} + engines: {node: '>=22.12.0'} + + '@commitlint/rules@21.2.3': + resolution: {integrity: sha512-5+YnI/LuTx3JDl9GjqfP2z9x96M8KKDrd+4jOel/T0L1BB3oAmBlSN8xppf63QsudiVEgR8C0gRoAMrPVrms6g==} + engines: {node: '>=22.12.0'} + + '@commitlint/to-lines@21.0.1': + resolution: {integrity: sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==} + engines: {node: '>=22.12.0'} + + '@commitlint/top-level@21.2.0': + resolution: {integrity: sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/types@21.2.3': + resolution: {integrity: sha512-sGEA473TlCvhCGNoTBY9OXZVWdscIXdGt0dm8EpB+2MRfmt8LNh/X56P/T3nCtEB+eH5qGEa3odphSAoUxSfSQ==} + engines: {node: '>=22.12.0'} + + '@conventional-changelog/git-client@3.2.0': + resolution: {integrity: sha512-sD/E0vzpkoDz/dqM1Hhv0ihC4KBw6RXjefeO8SG1XrX+wGkMxe1pKeedkKDPCtr2JjuhbuS9aJNgOvnT8hbeBw==} + engines: {node: '>=22'} + peerDependencies: + conventional-commits-filter: ^6.0.1 + conventional-commits-parser: ^7.1.3 + peerDependenciesMeta: + conventional-commits-filter: + optional: true + conventional-commits-parser: + optional: true + + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} + engines: {node: '>=22'} + + '@simple-libs/child-process-utils@2.0.0': + resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} + engines: {node: '>=22'} + + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} + + '@types/node@26.6.4': + resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==} + + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@6.4.0: + resolution: {integrity: sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + argue-cli@3.2.0: + resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} + engines: {node: '>=22'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + conventional-changelog-angular@9.4.0: + resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} + engines: {node: '>=22'} + + conventional-changelog-conventionalcommits@10.4.1: + resolution: {integrity: sha512-jS1LRFSbRoAr6JbhhRy1JYfNNUj5LM3+v49hRE03CgccsiYqgdVj/RTmrw4J1rylrqijHwdOlJWiJa61JHOgHg==} + engines: {node: '>=22'} + + conventional-commits-parser@7.1.3: + resolution: {integrity: sha512-Q9oWm1o9uy/oEsZQIraoFMZ4RuPD+79KgwWj6mJVP356tazolCB0piRLZ5Kz9te9p027uSEcUW+Gu44Eh+X79g==} + engines: {node: '>=22'} + hasBin: true + + cosmiconfig-typescript-loader@6.3.0: + resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} + engines: {node: '>=18'} + + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} + + verkit@0.5.0: + resolution: {integrity: sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==} + engines: {node: '>=18.12.0'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@commitlint/cli@21.2.3(@types/node@26.6.4)(typescript@7.0.2)': + dependencies: + '@commitlint/config-conventional': 21.2.3 + '@commitlint/format': 21.2.3 + '@commitlint/lint': 21.2.3 + '@commitlint/load': 21.2.3(@types/node@26.6.4)(typescript@7.0.2) + '@commitlint/read': 21.2.3 + '@commitlint/types': 21.2.3 + tinyexec: 1.3.1 + yargs: 18.2.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + - typescript + + '@commitlint/config-conventional@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + conventional-changelog-conventionalcommits: 10.4.1 + + '@commitlint/config-validator@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + ajv: 8.20.0 + + '@commitlint/ensure@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + es-toolkit: 1.52.0 + + '@commitlint/execute-rule@21.0.1': {} + + '@commitlint/format@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + picocolors: 1.1.1 + + '@commitlint/is-ignored@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + semver: 7.8.5 + + '@commitlint/lint@21.2.3': + dependencies: + '@commitlint/is-ignored': 21.2.3 + '@commitlint/parse': 21.2.3 + '@commitlint/rules': 21.2.3 + '@commitlint/types': 21.2.3 + + '@commitlint/load@21.2.3(@types/node@26.6.4)(typescript@7.0.2)': + dependencies: + '@commitlint/config-validator': 21.2.3 + '@commitlint/execute-rule': 21.0.1 + '@commitlint/resolve-extends': 21.2.3 + '@commitlint/types': 21.2.3 + cosmiconfig: 9.0.2 + cosmiconfig-typescript-loader: 6.3.0(@types/node@26.6.4)(cosmiconfig@9.0.2)(typescript@7.0.2) + es-toolkit: 1.52.0 + is-plain-obj: 4.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - typescript + + '@commitlint/message@21.2.0': {} + + '@commitlint/parse@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + conventional-changelog-angular: 9.4.0 + conventional-commits-parser: 7.1.3 + + '@commitlint/read@21.2.3': + dependencies: + '@commitlint/top-level': 21.2.0 + '@commitlint/types': 21.2.3 + '@conventional-changelog/git-client': 3.2.0 + tinyexec: 1.3.1 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + '@commitlint/resolve-extends@21.2.3': + dependencies: + '@commitlint/config-validator': 21.2.3 + '@commitlint/types': 21.2.3 + es-toolkit: 1.52.0 + global-directory: 5.0.0 + resolve-from: 5.0.0 + + '@commitlint/rules@21.2.3': + dependencies: + '@commitlint/ensure': 21.2.3 + '@commitlint/message': 21.2.0 + '@commitlint/to-lines': 21.0.1 + '@commitlint/types': 21.2.3 + + '@commitlint/to-lines@21.0.1': {} + + '@commitlint/top-level@21.2.0': + dependencies: + escalade: 3.2.0 + + '@commitlint/types@21.2.3': + dependencies: + conventional-commits-parser: 7.1.3 + picocolors: 1.1.1 + + '@conventional-changelog/git-client@3.2.0': + dependencies: + '@simple-libs/child-process-utils': 2.0.0 + '@simple-libs/stream-utils': 2.0.0 + verkit: 0.5.0 + + '@conventional-changelog/template@1.4.0': {} + + '@simple-libs/child-process-utils@2.0.0': + dependencies: + '@simple-libs/stream-utils': 2.0.0 + + '@simple-libs/stream-utils@2.0.0': {} + + '@types/node@26.6.4': + dependencies: + undici-types: 8.9.0 + + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@6.4.0: {} + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + argue-cli@3.2.0: {} + + callsites@3.1.0: {} + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + conventional-changelog-angular@9.4.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-changelog-conventionalcommits@10.4.1: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-commits-parser@7.1.3: + dependencies: + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.2.0 + + cosmiconfig-typescript-loader@6.3.0(@types/node@26.6.4)(cosmiconfig@9.0.2)(typescript@7.0.2): + dependencies: + '@types/node': 26.6.4 + cosmiconfig: 9.0.2(typescript@7.0.2) + jiti: 2.6.1 + typescript: 7.0.2 + + cosmiconfig@9.0.2: + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.2 + parse-json: 5.2.0 + + cosmiconfig@9.0.2(typescript@7.0.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.2 + parse-json: 5.2.0 + typescript: 7.0.2 + + emoji-regex@10.6.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-toolkit@1.52.0: {} + + escalade@3.2.0: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.8: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.7.0: {} + + global-directory@5.0.0: + dependencies: + ini: 6.0.0 + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + ini@6.0.0: {} + + is-arrayish@0.2.1: {} + + is-plain-obj@4.1.0: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + lines-and-columns@1.2.4: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + picocolors@1.1.1: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + semver@7.8.5: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + string-width@8.3.0: + dependencies: + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.4.0 + + tinyexec@1.3.1: {} + + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 + + undici-types@8.9.0: {} + + verkit@0.5.0: {} + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + y18n@5.0.8: {} + + yargs-parser@22.0.0: {} + + yargs@18.2.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.3.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 diff --git a/.mise/locks/npm-commitlint-cli/21.2.3/package.json b/.mise/locks/npm-commitlint-cli/21.2.3/package.json new file mode 100644 index 0000000..5842856 --- /dev/null +++ b/.mise/locks/npm-commitlint-cli/21.2.3/package.json @@ -0,0 +1,7 @@ +{ + "name": "mise-npm-install", + "private": true, + "dependencies": { + "@commitlint/cli": "21.2.3" + } +} diff --git a/.mise/locks/npm-prettier/3.9.9/aube-lock.yaml b/.mise/locks/npm-prettier/3.9.9/aube-lock.yaml new file mode 100644 index 0000000..3d6a99e --- /dev/null +++ b/.mise/locks/npm-prettier/3.9.9/aube-lock.yaml @@ -0,0 +1,24 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + prettier: + specifier: 3.9.9 + version: 3.9.9 + +packages: + + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} + engines: {node: '>=14'} + hasBin: true + +snapshots: + + prettier@3.9.9: {} diff --git a/.mise/locks/npm-prettier/3.9.9/package.json b/.mise/locks/npm-prettier/3.9.9/package.json new file mode 100644 index 0000000..354a9ed --- /dev/null +++ b/.mise/locks/npm-prettier/3.9.9/package.json @@ -0,0 +1,7 @@ +{ + "name": "mise-npm-install", + "private": true, + "dependencies": { + "prettier": "3.9.9" + } +} diff --git a/.prettierignore b/.prettierignore index cafd7b9..fdc0df0 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,5 +2,9 @@ node_modules/ pnpm-lock.yaml package-lock.json +# Written by `mise lock`. +mise.lock +.mise/ + # Written by semantic-release from the commit history, not by hand. CHANGELOG.md diff --git a/AGENTS.md b/AGENTS.md index 3730130..44679e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,13 +6,19 @@ Instructions for AI coding agents working in this repo. Org-wide CI for [studiobimo](https://github.com/studiobimo): reusable workflows under `.github/workflows/`, composite actions under `.github/actions//`, shared check scripts -under `.devtools/`, and the pre-commit hooks in `.pre-commit-hooks.yaml` that expose those scripts -to consumers' git hooks. `rulesets/` and `settings/` hold the branch rules and repository -settings every repo shares; `.devtools/repo-settings.sh` checks and applies them. Nothing here is -application code; everything here runs in other repositories' CI or on their contributors' -machines. +under `.devtools/`, and `lefthook/org.yml`, which exposes those scripts to consumers' git hooks. +`rulesets/` and `settings/` hold the branch rules and repository settings every repo shares; +`.devtools/repo-settings.sh` checks and applies them. Nothing here is application code; +everything here runs in other repositories' CI or on their contributors' machines. -Consumers: `studiobimo/tallyhopper` (Minecraft mod, Java/Gradle) is the first. +Consumers: every studiobimo project, through `studiobimo/project-template`. + +Tooling: mise pins every tool (`mise.toml`, `mise.lock`), lefthook runs the hooks +(`lefthook.yml`), commitlint checks commits (`.commitlintrc.yaml`). pnpm and `package.json` exist +only for semantic-release. This repo releases with semantic-release, not release-please like +the projects: it has no version file or changelog to maintain, and `release.yml` has to move the +floating `v1` tag. `.pre-commit-hooks.yaml` and `ci-pre-commit.yml` are deprecated and stay +until no consumer uses them. ## Non-negotiables @@ -64,9 +70,9 @@ SHA and open a draft PR there. The check scripts have their own test, `bash .devtools/test-hooks.sh`, which `self-lint` runs. It also covers `pr-checks/lint.mjs`, so run `npm ci --prefix .github/actions/pr-checks --ignore-scripts` first. -They are called two ways — by `ci-pr` with explicit arguments and by pre-commit with none — so a -change to one has to keep both working. Try a hook end to end from a consumer checkout with -`pre-commit try-repo --hook-stage manual`. +They are called two ways — by `ci-pr` with explicit arguments and by the git hooks with none — so +a change to one has to keep both working. Try the shared hooks end to end from a consumer checkout +by pointing its `remotes` entry at your branch: `ref: ` with `refetch: true`. Say in the PR which one you did. "It should work" is not a test result. diff --git a/README.md b/README.md index ecdbf69..d64b4ed 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,8 @@ everywhere at once. | `.github/workflows/ci-java-gradle.yml` | Java toolchain, Gradle build, test reports and artifacts | | `.github/workflows/ci-go.yml` | Go modules, formatting, golangci-lint, race tests, coverage, govulncheck and build | | `.github/workflows/ci-workflows.yml` | actionlint, zizmor and shellcheck over a repo's own workflows | -| `.github/workflows/ci-pre-commit.yml` | A repo's own pre-commit hooks, over the whole tree | +| `.github/workflows/ci-lint.yml` | A repo's own lefthook hooks, over the whole tree, with the tools mise pins | +| `.github/workflows/ci-pre-commit.yml` | Deprecated, use `ci-lint.yml`. A repo's own pre-commit hooks | | `.github/workflows/ci-gitleaks.yml` | Secret scan of what a pull request adds | | `.github/workflows/ci-template-drift.yml` | Compares a repo with the project template and tracks the difference in one issue | | `.github/workflows/release-please.yml` | Grooms a release pull request from Conventional Commits, then tags and releases | @@ -44,10 +45,45 @@ cross-repo; see [AGENTS.md](AGENTS.md). | `.github/actions/pr-checks` | The PR title, branch, size and commit checks, for direct use | | `.github/actions/build-summary` | JUnit + JaCoCo numbers into the job summary | -## Pre-commit hooks +## Git hooks -This repo is also a [pre-commit](https://pre-commit.com/) hook repo. The hooks are the same -scripts `ci-pr.yml` runs, so what passes locally passes on the pull request. +studiobimo repositories run their git hooks with [lefthook](https://lefthook.dev/) and pin every +tool with [mise](https://mise.jdx.dev/). A repository's own `lefthook.yml` holds its linters, and +[`ci-lint.yml`](.github/workflows/ci-lint.yml) runs that same file in CI. + +The org's own rules come from here. [`lefthook/org.yml`](lefthook/org.yml) checks the branch name +and the pull request size on push, with the scripts `ci-pr.yml` runs, so what passes locally +passes on the pull request. A repository pulls it in by tag: + +```yaml +# lefthook.yml +remotes: + - git_url: https://github.com/studiobimo/.github + ref: v1.9.0 + configs: + - lefthook/org.yml +``` + +lefthook fetches a remote once per `ref`, so pin a release tag there, never the floating `v1`. + +Two environment variables make the checks usable from a script, such as an agent guard that has +to judge a command before it runs: + +```sh +BRANCH_NAME=feat/new-thing lefthook run pre-push --job branch-name +PR_BASE=main lefthook run pre-push --job pr-size +``` + +`PR_MAX_FILES` changes the limit. Without `PR_BASE` the base is the branch below this one in a +`gh stack`, else the remote's default branch. + +Commit messages are not part of `org.yml`: each repository runs commitlint against its own +`.commitlintrc.yaml` in a `commit-msg` job, and `ci-pr.yml` reads the same file. + +## Pre-commit hooks (deprecated) + +This repo is still a [pre-commit](https://pre-commit.com/) hook repo for the repositories that +have not moved to lefthook yet. It goes away when the last one has. | Hook id | Stage | What it checks | | --------------------- | -------------------- | -------------------------------------------------------------- | @@ -71,17 +107,6 @@ Pin `rev:` to a release SHA with the version in a `frozen:` comment; Dependabot' ecosystem bumps both. The floating `v1` tag is for workflows only: pre-commit caches a hook repo by `rev`, so a moving tag would never be re-fetched. -Two environment variables make the hooks usable from a script, such as an agent guard that has to -judge a command before it runs: - -```sh -BRANCH_NAME=feat/new-thing pre-commit run conventional-branch --hook-stage manual -PR_BASE=main pre-commit run pr-size --hook-stage manual -``` - -`PR_MAX_FILES` changes the limit. Without `PR_BASE` the base is the branch below this one in a -`gh stack`, else the remote's default branch. - ## Calling them Call a workflow at `@v1`. The tag floats: a release moves it, so a fix lands everywhere at once. @@ -229,17 +254,21 @@ One caveat. Templates are not audited by zizmor — it only collects files under ## Working on this repo ```sh -sh .devtools/install-hooks.sh +mise install # every tool, at the versions in mise.toml and mise.lock +mise exec -- lefthook install # wire the git hooks npm ci --prefix .github/actions/pr-checks --ignore-scripts # the commitlint ci-pr installs -bash .devtools/test-hooks.sh # the check scripts behind ci-pr and the pre-commit hooks +bash .devtools/test-hooks.sh # the check scripts behind ci-pr and the git hooks ``` -pnpm installs the Node toolchain (commitlint, Prettier, lefthook, semantic-release) and wires the -git hooks; Homebrew adds actionlint, zizmor, shellcheck and gitleaks. The hooks warn and skip when -a linter is missing, so a fresh clone can always commit — CI has no such escape hatch. +[mise](https://mise.jdx.dev/getting-started.html) is the one thing to install by hand. It pins +lefthook, Prettier, commitlint, actionlint, zizmor, shellcheck and gitleaks, and the hooks run +each through `mise exec`, so they work whether or not your shell has mise activated. Nothing is +skipped when a tool is missing: `mise install` is what makes it present. + +To change a tool's version, edit `mise.toml`, run `mise lock`, and commit both along with +`.mise/locks/`. Dependabot does not read `mise.toml`, so these bumps are made by hand. -On push, the hooks also check the branch name and the 20-file limit, with the same scripts `ci-pr` -runs on the pull request. +pnpm is only here for semantic-release, which `release.yml` runs. ## Contributing diff --git a/commitlint.config.mjs b/commitlint.config.mjs deleted file mode 100644 index 4be03cb..0000000 --- a/commitlint.config.mjs +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Conventional Commits, enforced locally by the lefthook `commit-msg` hook and in CI on - * every commit in a branch (see .github/workflows/ci-pr.yml). Inherit - * @commitlint/config-conventional and add only org-specific rules here. - */ -export default { - extends: ["@commitlint/config-conventional"], - rules: { - // The scopes AGENTS.md documents, made binding. A scope stays optional -- - // `docs: ...` is fine -- but an invented one is not, so the list in AGENTS.md - // and the list commits actually use cannot drift apart. - "scope-enum": [2, "always", ["actions", "workflows", "devtools", "templates", "docs", "deps"]], - }, -}; diff --git a/lefthook.yml b/lefthook.yml index ec2396b..b65a157 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,94 +1,56 @@ -# Local git hooks, managed by lefthook (installed by the package.json `prepare` -# script, so `pnpm install` is all it takes). +# Local git hooks. They run the same commands CI does, at the same versions: +# commit-msg -> Conventional Commits, with this repo's scopes (commitlint) +# pre-commit -> Prettier and the linters; ci-lint runs this hook over every file +# pre-push -> Conventional Branch name and the PR size limit (lefthook/org.yml) # -# These mirror the CI gates so a problem surfaces before a push rather than in -# review: -# commit-msg -> Conventional Commits (commitlint) -# pre-commit -> Prettier, then the four linters ci-workflows runs -# pre-push -> Conventional Branch name and the PR size limit (ci-pr) +# Every tool is pinned in mise.toml and run through `mise exec`, so a hook works +# whether or not the shell has mise activated, and never falls back to some other +# version that happens to be installed. # -# Prettier and commitlint are devDependencies, so they are always present. The -# linters are system tools: the guards below warn and skip when one is missing -# rather than blocking a commit on a machine that has not run -# `sh .devtools/install-hooks.sh` yet. CI has no such escape hatch, which is -# where the real gate lives. -# -# Each guard is an explicit `if`, not `command -v tool && tool ... || echo ...`. -# The latter reads as "run it if present" but means "if anything fails, print -# this and succeed" -- so a real finding exits 0 and prints "not installed", -# which is both a silent pass and a lie about why. +# mise install && mise exec -- lefthook install + +# The rules this repo shares with every other one, dogfooded from the same file. +extends: + - lefthook/org.yml commit-msg: - commands: - commitlint: - run: pnpm exec commitlint --edit {1} + jobs: + - name: commitlint + run: mise exec -- commitlint --edit {1} pre-commit: parallel: true - commands: - prettier: - glob: '*.{yml,yaml,json,md}' - run: pnpm exec prettier --check {staged_files} + jobs: + - name: prettier + glob: '*.{yml,yaml,json,md,mjs}' + run: mise exec -- prettier --check {staged_files} - actionlint: + - name: actionlint glob: '.github/workflows/*.{yml,yaml}' - run: | - if ! command -v actionlint >/dev/null 2>&1; then - echo "actionlint not installed; skipping (see .devtools/install-hooks.sh)" - exit 0 - fi - actionlint {staged_files} + run: mise exec -- actionlint {staged_files} # Workflows and composite actions both: zizmor audits action.yml too, and this # repo's whole output is those two file kinds. The glob is `.github/**` rather # than `.github/{workflows,actions}/**` because the latter silently misses files # sitting directly in .github/workflows/ -- i.e. every workflow in the repo. - zizmor: + # + # Exit 3 is "no inputs collected": none of the files were a workflow or an + # action, which is the normal case for a commit that only touches an issue + # template or dependabot.yml. Findings exit 14. + - name: zizmor glob: '.github/**/*.{yml,yaml}' - run: | - if ! command -v zizmor >/dev/null 2>&1; then - echo "zizmor not installed; skipping (see .devtools/install-hooks.sh)" - exit 0 - fi - # Exit 3 is "no inputs collected": none of the staged files were a - # workflow or an action, which is the normal case for a commit that only - # touches an issue template or dependabot.yml. Findings exit 14. - zizmor --no-progress {staged_files} || [ "$?" -eq 3 ] + exclude: '**/node_modules/**' + run: mise exec -- zizmor --no-progress {staged_files} || [ "$?" -eq 3 ] - shellcheck: + - name: shellcheck glob: '*.sh' - run: | - if ! command -v shellcheck >/dev/null 2>&1; then - echo "shellcheck not installed; skipping (see .devtools/install-hooks.sh)" - exit 0 - fi - shellcheck {staged_files} + run: mise exec -- shellcheck {staged_files} - gitleaks: - run: | - if ! command -v gitleaks >/dev/null 2>&1; then - echo "gitleaks not installed; skipping (see .devtools/install-hooks.sh)" - exit 0 - fi - gitleaks git . --redact --staged + - name: gitleaks + run: mise exec -- gitleaks git . --redact --staged # Same-repo CI cannot catch a first-party action ref pinned the wrong way -- # GitHub's same-repo exemption hides it here and it breaks only consumers. - action-pins: + - name: action-pins glob: '{.github/workflows,workflow-templates}/*.{yml,yaml}' run: sh .devtools/check-action-pins.sh - -# The same two scripts ci-pr runs, and the ones `.pre-commit-hooks.yaml` offers to -# consumers. Without them here this repo was the one place a bad branch name was -# first reported by CI, after the pull request was already open. -# -# Both check the branch that is checked out, not the ref being pushed, which is -# the same thing in every push but `git push origin `. -pre-push: - parallel: true - commands: - branch-name: - run: bash .devtools/check-branch-name.sh - - pr-size: - run: bash .devtools/check-pr-size.sh diff --git a/mise.lock b/mise.lock new file mode 100644 index 0000000..4c6294d --- /dev/null +++ b/mise.lock @@ -0,0 +1,310 @@ +# @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html + +lockfile_version = 3 + +[[tools.actionlint]] +version = "1.7.12" +backend = "aqua:rhysd/actionlint" +specifiers = ["1.7.12"] + +[tools.actionlint."platforms.linux-arm64"] +checksum = "sha256:325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924897" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-arm64-musl"] +checksum = "sha256:325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924897" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-x64"] +checksum = "sha256:8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924896" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-x64-musl"] +checksum = "sha256:8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924896" +provenance = "github-attestations" + +[tools.actionlint."platforms.macos-arm64"] +checksum = "sha256:aba9ced2dee8d27fecca3dc7feb1a7f9a52caefa1eb46f3271ea66b6e0e6953f" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_darwin_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924893" +provenance = "github-attestations" + +[tools.actionlint."platforms.macos-x64"] +checksum = "sha256:5b44c3bc2255115c9b69e30efc0fecdf498fdb63c5d58e17084fd5f16324c644" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_darwin_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924880" +provenance = "github-attestations" + +[tools.actionlint."platforms.windows-x64"] +checksum = "sha256:6e7241b51e6817ea6a047693d8e6fed13b31819c9a0dd6c5a726e1592d22f6e9" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_windows_amd64.zip" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924919" +provenance = "github-attestations" + +[[tools.gitleaks]] +version = "8.30.1" +backend = "aqua:gitleaks/gitleaks" +specifiers = ["8.30.1"] + +[tools.gitleaks."platforms.linux-arm64"] +checksum = "sha256:e4a487ee7ccd7d3a7f7ec08657610aa3606637dab924210b3aee62570fb4b080" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332057" + +[tools.gitleaks."platforms.linux-arm64-musl"] +checksum = "sha256:e4a487ee7ccd7d3a7f7ec08657610aa3606637dab924210b3aee62570fb4b080" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332057" + +[tools.gitleaks."platforms.linux-x64"] +checksum = "sha256:551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332058" + +[tools.gitleaks."platforms.linux-x64-musl"] +checksum = "sha256:551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332058" + +[tools.gitleaks."platforms.macos-arm64"] +checksum = "sha256:b40ab0ae55c505963e365f271a8d3846efbc170aa17f2607f13df610a9aeb6a5" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_darwin_arm64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332059" + +[tools.gitleaks."platforms.macos-x64"] +checksum = "sha256:dfe101a4db2255fc85120ac7f3d25e4342c3c20cf749f2c20a18081af1952709" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_darwin_x64.tar.gz" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378332053" + +[tools.gitleaks."platforms.windows-x64"] +checksum = "sha256:d29144deff3a68aa93ced33dddf84b7fdc26070add4aa0f4513094c8332afc4e" +url = "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_windows_x64.zip" +url_api = "https://api.github.com/repos/gitleaks/gitleaks/releases/assets/378333178" + +[[tools.lefthook]] +version = "2.1.16" +backend = "aqua:evilmartians/lefthook" +specifiers = ["2.1.16"] + +[tools.lefthook."platforms.linux-arm64"] +checksum = "sha256:2f8b694c37632df1b805163ebdbdf85c8ecf6cba47f0bff4a3e565a1b66ef3cd" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_Linux_aarch64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767234" +provenance = "github-attestations" + +[tools.lefthook."platforms.linux-arm64-musl"] +checksum = "sha256:2f8b694c37632df1b805163ebdbdf85c8ecf6cba47f0bff4a3e565a1b66ef3cd" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_Linux_aarch64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767234" +provenance = "github-attestations" + +[tools.lefthook."platforms.linux-x64"] +checksum = "sha256:bcf67d241ebb062a4fe9053ef0d7fde6692f846e504843ed33ab39b08334f299" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_Linux_x86_64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767179" +provenance = "github-attestations" + +[tools.lefthook."platforms.linux-x64-musl"] +checksum = "sha256:bcf67d241ebb062a4fe9053ef0d7fde6692f846e504843ed33ab39b08334f299" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_Linux_x86_64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767179" +provenance = "github-attestations" + +[tools.lefthook."platforms.macos-arm64"] +checksum = "sha256:3deee257054b3cd3d3288bef65436e17239d49ebb738af939e4a92f573865151" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_MacOS_arm64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767184" +provenance = "github-attestations" + +[tools.lefthook."platforms.macos-x64"] +checksum = "sha256:1a129fb921ca7413b17561838cbff387d8c1a7b22a54a9fdee1249952fe5204f" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_MacOS_x86_64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767199" +provenance = "github-attestations" + +[tools.lefthook."platforms.windows-x64"] +checksum = "sha256:8fc291f266423bdf6eee1eebce8a83b01122715637b2a0cea07b4c2a2733a67f" +url = "https://github.com/evilmartians/lefthook/releases/download/v2.1.16/lefthook_2.1.16_Windows_x86_64.gz" +url_api = "https://api.github.com/repos/evilmartians/lefthook/releases/assets/603767233" +provenance = "github-attestations" + +[[tools.node]] +version = "24.21.0" +backend = "core:node" +specifiers = ["24.21.0"] + +[tools.node."platforms.linux-arm64"] +checksum = "sha256:724282c3b43aec998aa9527380465b45d229e021b58035f5f4f63095eabfe5d5" +url = "https://nodejs.org/dist/v24.21.0/node-v24.21.0-linux-arm64.tar.gz" + +[tools.node."platforms.linux-arm64-musl"] +checksum = "sha256:3048b0811e158ca0d8672b59c839861763e144492980d8d29b369dfee45747e4" +url = "https://unofficial-builds.nodejs.org/download/release/v24.21.0/node-v24.21.0-linux-arm64-musl.tar.gz" + +[tools.node."platforms.linux-x64"] +checksum = "sha256:6e1db87ef58b8819e5d5402eff1536491b18edd8eb7bee5ef7897876e88dc5ff" +url = "https://nodejs.org/dist/v24.21.0/node-v24.21.0-linux-x64.tar.gz" + +[tools.node."platforms.linux-x64-musl"] +checksum = "sha256:01a713e34da98e7b4d2a3191ee7ca3f93dd0384d1a2ef23c379b2161ee6e133a" +url = "https://unofficial-builds.nodejs.org/download/release/v24.21.0/node-v24.21.0-linux-x64-musl.tar.gz" + +[tools.node."platforms.macos-arm64"] +checksum = "sha256:bed7eea5325e1108f32ce5228ddd6a5f0f08a499ee42aa7442aea583702f6057" +url = "https://nodejs.org/dist/v24.21.0/node-v24.21.0-darwin-arm64.tar.gz" + +[tools.node."platforms.macos-x64"] +checksum = "sha256:1462cb3b3046b815cf8ea436d3da450ec1a9f11dac7e5a46b0ada5305d7e8097" +url = "https://nodejs.org/dist/v24.21.0/node-v24.21.0-darwin-x64.tar.gz" + +[tools.node."platforms.windows-x64"] +checksum = "sha256:158f7685b44de51f6c0df1d153526cbcd3e1bc739a8dfc607721cef75de9e541" +url = "https://nodejs.org/dist/v24.21.0/node-v24.21.0-win-x64.zip" + +[[tools."npm:@commitlint/cli"]] +version = "21.2.3" +aube = { path = ".mise/locks/npm-commitlint-cli/21.2.3", digest = "sha256:28100db168f88f24417c919cd7f54eebb68fe2e61c05fb8cc1182423769d10f1" } +backend = "npm:@commitlint/cli" +specifiers = ["21.2.3"] + +[[tools."npm:prettier"]] +version = "3.9.9" +aube = { path = ".mise/locks/npm-prettier/3.9.9", digest = "sha256:815f6667505e41ac2d03ecbac86b79f1beb78d45783879428193c9adc80760a3" } +backend = "npm:prettier" +specifiers = ["3.9.9"] + +[[tools.pnpm]] +version = "11.21.0" +backend = "aqua:pnpm/pnpm" +specifiers = ["11.21.0"] + +[tools.pnpm."platforms.linux-arm64"] +checksum = "sha256:64eb219b008f7a4c176d81fbce919c20b0b7e093e815cbb669d46e681451f43b" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585528" +provenance = "github-attestations" + +[tools.pnpm."platforms.linux-arm64-musl"] +checksum = "sha256:43587a1f3d26ee009c640378ef377cac3531990579acf0f35646531b7832831d" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-linux-arm64-musl.tar.gz" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585511" +provenance = "github-attestations" + +[tools.pnpm."platforms.linux-x64"] +checksum = "sha256:aadc489ce4473c2af0fec06a5c19e113b5793d404eac49853c8153bf4b0d8263" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-linux-x64.tar.gz" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585503" +provenance = "github-attestations" + +[tools.pnpm."platforms.linux-x64-musl"] +checksum = "sha256:8cad0a4d20318c0445d992630ace51edc0853fd259573f50ee5d0216dce9b420" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-linux-x64-musl.tar.gz" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585524" +provenance = "github-attestations" + +[tools.pnpm."platforms.macos-arm64"] +checksum = "sha256:860a96978a79ca5132bdc247375f94150a3c98edbecbee36e9f8e0c9e2f7f056" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-darwin-arm64.tar.gz" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585526" +provenance = "github-attestations" + +[tools.pnpm."platforms.windows-x64"] +checksum = "sha256:6643043caa3b01c65c431039926a2af954326d5cefbdb4da7baceceb17f5051f" +url = "https://github.com/pnpm/pnpm/releases/download/v11.21.0/pnpm-win32-x64.zip" +url_api = "https://api.github.com/repos/pnpm/pnpm/releases/assets/507585516" +provenance = "github-attestations" + +[[tools.shellcheck]] +version = "0.11.0" +backend = "aqua:koalaman/shellcheck" +specifiers = ["0.11.0"] + +[tools.shellcheck."platforms.linux-arm64"] +checksum = "sha256:12b331c1d2db6b9eb13cfca64306b1b157a86eb69db83023e261eaa7e7c14588" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.aarch64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056934" + +[tools.shellcheck."platforms.linux-arm64-musl"] +checksum = "sha256:12b331c1d2db6b9eb13cfca64306b1b157a86eb69db83023e261eaa7e7c14588" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.aarch64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056934" + +[tools.shellcheck."platforms.linux-x64"] +checksum = "sha256:8c3be12b05d5c177a04c29e3c78ce89ac86f1595681cab149b65b97c4e227198" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.x86_64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056942" + +[tools.shellcheck."platforms.linux-x64-musl"] +checksum = "sha256:8c3be12b05d5c177a04c29e3c78ce89ac86f1595681cab149b65b97c4e227198" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.linux.x86_64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056942" + +[tools.shellcheck."platforms.macos-arm64"] +checksum = "sha256:56affdd8de5527894dca6dc3d7e0a99a873b0f004d7aabc30ae407d3f48b0a79" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.darwin.aarch64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056932" + +[tools.shellcheck."platforms.macos-x64"] +checksum = "sha256:3c89db4edcab7cf1c27bff178882e0f6f27f7afdf54e859fa041fca10febe4c6" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.darwin.x86_64.tar.xz" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056930" + +[tools.shellcheck."platforms.windows-x64"] +checksum = "sha256:8a4e35ab0b331c85d73567b12f2a444df187f483e5079ceffa6bda1faa2e740e" +url = "https://github.com/koalaman/shellcheck/releases/download/v0.11.0/shellcheck-v0.11.0.zip" +url_api = "https://api.github.com/repos/koalaman/shellcheck/releases/assets/279056944" + +[[tools.zizmor]] +version = "1.30.1" +backend = "aqua:zizmorcore/zizmor" +specifiers = ["1.30.1"] + +[tools.zizmor."platforms.linux-arm64"] +checksum = "sha256:7ff1dce33bdd18fd2a4affe63bdd47efcccca97b2cec1c1863ec26e9e2647540" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-aarch64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067643" +provenance = "github-attestations" + +[tools.zizmor."platforms.linux-arm64-musl"] +checksum = "sha256:7ff1dce33bdd18fd2a4affe63bdd47efcccca97b2cec1c1863ec26e9e2647540" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-aarch64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067643" +provenance = "github-attestations" + +[tools.zizmor."platforms.linux-x64"] +checksum = "sha256:e65324f4430c2717591937edcec90ccbefaf14c174f8ec9415e03ca875b46e1a" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067642" +provenance = "github-attestations" + +[tools.zizmor."platforms.linux-x64-musl"] +checksum = "sha256:e65324f4430c2717591937edcec90ccbefaf14c174f8ec9415e03ca875b46e1a" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067642" +provenance = "github-attestations" + +[tools.zizmor."platforms.macos-arm64"] +checksum = "sha256:e28d22b087f9ebb8d99da6e740d348c930f559961c7c3f12badda54f882195a2" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067640" +provenance = "github-attestations" + +[tools.zizmor."platforms.macos-x64"] +checksum = "sha256:10e6b18b11ea07e515a16f0f0518c7b07527bc9977c1fd5698181ce7f3554202" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067641" +provenance = "github-attestations" + +[tools.zizmor."platforms.windows-x64"] +checksum = "sha256:b183b1e996eddfab9659f1e9b46e059f1ef1cf984a1f14e5da09f7876a4b3a1c" +url = "https://github.com/zizmorcore/zizmor/releases/download/v1.30.1/zizmor-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/zizmorcore/zizmor/releases/assets/552067645" +provenance = "github-attestations" diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..8336383 --- /dev/null +++ b/mise.toml @@ -0,0 +1,21 @@ +# Every tool this repo's hooks and CI run, at one version each. mise.lock records the +# checksums, and `mise install` refuses anything that does not match it. +# +# mise install # once, and after this file changes +# mise exec -- lefthook install # wire the git hooks +# +# After changing a version here: mise lock, and commit both files. + +[settings] +lockfile = true + +[tools] +node = "24.21.0" +pnpm = "11.21.0" +lefthook = "2.1.16" +actionlint = "1.7.12" +shellcheck = "0.11.0" +gitleaks = "8.30.1" +zizmor = "1.30.1" +"npm:prettier" = "3.9.9" +"npm:@commitlint/cli" = "21.2.3" diff --git a/package.json b/package.json index 7721183..28d325d 100644 --- a/package.json +++ b/package.json @@ -9,23 +9,10 @@ "type": "git", "url": "https://github.com/studiobimo/.github.git" }, - "scripts": { - "format": "prettier --write .", - "format:check": "prettier --check .", - "check:action-pins": "sh .devtools/check-action-pins.sh", - "test:hooks": "bash .devtools/test-hooks.sh", - "settings:check": "bash .devtools/repo-settings.sh --check", - "commitlint": "commitlint", - "prepare": "lefthook install" - }, "devDependencies": { - "@commitlint/cli": "^21.2.3", - "@commitlint/config-conventional": "^21.2.3", "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/github": "^12.0.10", "@semantic-release/release-notes-generator": "^14.1.0", - "lefthook": "^2.1.16", - "prettier": "^3.9.9", "semantic-release": "^25.0.9" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d09828..f42df71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,6 @@ importers: .: devDependencies: - '@commitlint/cli': - specifier: ^21.2.3 - version: 21.2.3(@types/node@26.6.2)(conventional-commits-parser@7.1.2)(typescript@7.0.2) - '@commitlint/config-conventional': - specifier: ^21.2.3 - version: 21.2.3 '@semantic-release/commit-analyzer': specifier: ^13.0.1 version: 13.0.1(semantic-release@25.0.9(supports-color@7.2.0)(typescript@7.0.2))(supports-color@7.2.0) @@ -23,12 +17,6 @@ importers: '@semantic-release/release-notes-generator': specifier: ^14.1.0 version: 14.1.1(semantic-release@25.0.9(supports-color@7.2.0)(typescript@7.0.2))(supports-color@7.2.0) - lefthook: - specifier: ^2.1.16 - version: 2.1.16 - prettier: - specifier: ^3.9.9 - version: 3.9.9 semantic-release: specifier: ^25.0.9 version: 25.0.9(supports-color@7.2.0)(typescript@7.0.2) @@ -59,91 +47,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@commitlint/cli@21.2.3': - resolution: {integrity: sha512-5yOX6IRjcrIReCxpyAd04hgI/yhUMpVBJ/ouwFV0wk9yx5+fYRDWZWJ5h55Tbedgfol+5m2mU5nqzbB8g3v0vQ==} - engines: {node: '>=22.12.0'} - hasBin: true - - '@commitlint/config-conventional@21.2.3': - resolution: {integrity: sha512-EP2n5DN2GwRWNVrLX0Jx3mpQlW5PfFi9HnD9OJ8hN/H0xFqpCFyHeGDhg+0P8/21iMMcdkcQgbNqmVklebqYsQ==} - engines: {node: '>=22.12.0'} - - '@commitlint/config-validator@21.2.3': - resolution: {integrity: sha512-JQ13v0GafSM4fBYX8UowSy++07Was20auq0NcTdnzSEq6/05Cq5GBUMIfKkqjzyBwC9sJFmPpKWgLLhH7cygkw==} - engines: {node: '>=22.12.0'} - - '@commitlint/ensure@21.2.3': - resolution: {integrity: sha512-gEjNKgRocbODI5/sMx2Qc9XOf2/zFTNV2aEK1QZ4gKDKxDC/VR7us3QtIX1C5d5xxHxx0I/tEbYbdSP1Am2LwA==} - engines: {node: '>=22.12.0'} - - '@commitlint/execute-rule@21.0.1': - resolution: {integrity: sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==} - engines: {node: '>=22.12.0'} - - '@commitlint/format@21.2.3': - resolution: {integrity: sha512-KKwCjXYqA8r295uhLnulDXL9yekdXmj2yp2Q0XsBPhxQ2iPuvRE8F43j7g7yexo69wTdmUQmFz15jpderluzUQ==} - engines: {node: '>=22.12.0'} - - '@commitlint/is-ignored@21.2.3': - resolution: {integrity: sha512-Ng4nRj/LBAOvc+GQu7bsFW4/fL89LvZ14OOC/ERLbUpnG6QBwWRzY/1oXGwPs3C8YHWjJObin4kLYo2YeEn70w==} - engines: {node: '>=22.12.0'} - - '@commitlint/lint@21.2.3': - resolution: {integrity: sha512-lUZcSuVLLEDkhge9ERk8Rp+FXQtrUhCK+h328BFnzKXrTuXGdqiYMEpTlNWdZaOrjyMhMJaz354ZaWEGJxcLeg==} - engines: {node: '>=22.12.0'} - - '@commitlint/load@21.2.3': - resolution: {integrity: sha512-cDrL8lOo23Lk7knGzQdjbFcq7z2JgvjwV6PhbESVvEc+Fe21MeLjPKBJi8nKjg7j+jh79CVbVSUbZc104thXRw==} - engines: {node: '>=22.12.0'} - - '@commitlint/message@21.2.0': - resolution: {integrity: sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==} - engines: {node: '>=22.12.0'} - - '@commitlint/parse@21.2.3': - resolution: {integrity: sha512-Jt61QpF1xA88damCELe8I0FlDZPSpXNc8IhN7z5kZ0EcDYPjdZ+ZHPvsSXl69r2MIlLnNKeHhOn2cmVpziFE9w==} - engines: {node: '>=22.12.0'} - - '@commitlint/read@21.2.3': - resolution: {integrity: sha512-szAepuLA1vTTr7fuudEg7jYyVHudf+FH+vptU91bhxE1WnE8TKrfTAi44HVllz8XpI8Pvp4GjR/iP5Nshgh+og==} - engines: {node: '>=22.12.0'} - - '@commitlint/resolve-extends@21.2.3': - resolution: {integrity: sha512-bqJdmAtXgAQel+l02uIsF7rHgKgx1AGZdGBjam7uK4XW54ZAQtB6XAIUXezYprQiCcRMpBh4fHs5JodXK4mVZA==} - engines: {node: '>=22.12.0'} - - '@commitlint/rules@21.2.3': - resolution: {integrity: sha512-5+YnI/LuTx3JDl9GjqfP2z9x96M8KKDrd+4jOel/T0L1BB3oAmBlSN8xppf63QsudiVEgR8C0gRoAMrPVrms6g==} - engines: {node: '>=22.12.0'} - - '@commitlint/to-lines@21.0.1': - resolution: {integrity: sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==} - engines: {node: '>=22.12.0'} - - '@commitlint/top-level@21.2.0': - resolution: {integrity: sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==} - engines: {node: '>=22.12.0'} - - '@commitlint/types@21.2.3': - resolution: {integrity: sha512-sGEA473TlCvhCGNoTBY9OXZVWdscIXdGt0dm8EpB+2MRfmt8LNh/X56P/T3nCtEB+eH5qGEa3odphSAoUxSfSQ==} - engines: {node: '>=22.12.0'} - - '@conventional-changelog/git-client@3.1.2': - resolution: {integrity: sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==} - engines: {node: '>=22'} - peerDependencies: - conventional-commits-filter: ^6.0.1 - conventional-commits-parser: ^7.1.2 - peerDependenciesMeta: - conventional-commits-filter: - optional: true - conventional-commits-parser: - optional: true - - '@conventional-changelog/template@1.4.0': - resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} - engines: {node: '>=22'} - '@octokit/auth-token@6.0.0': resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} @@ -241,18 +144,10 @@ packages: peerDependencies: semantic-release: '>=20.1.0' - '@simple-libs/child-process-utils@2.0.0': - resolution: {integrity: sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==} - engines: {node: '>=22'} - '@simple-libs/stream-utils@1.2.0': resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} - '@simple-libs/stream-utils@2.0.0': - resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} - engines: {node: '>=22'} - '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -261,9 +156,6 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@types/node@26.6.2': - resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -395,9 +287,6 @@ packages: resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} engines: {node: '>=18'} - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} @@ -432,10 +321,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - argue-cli@3.2.0: - resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} - engines: {node: '>=22'} - argv-formatter@1.0.0: resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} @@ -519,14 +404,6 @@ packages: resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} engines: {node: '>=18'} - conventional-changelog-angular@9.4.0: - resolution: {integrity: sha512-HdxRxuS8bBXVIuo4V82gvSwAXT0vYQUizrjs/izmPg5JdDstr8v8I5hduGL3iQbG+o310dUDxC4+LetuS5hu9w==} - engines: {node: '>=22'} - - conventional-changelog-conventionalcommits@10.4.0: - resolution: {integrity: sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==} - engines: {node: '>=22'} - conventional-changelog-writer@8.4.0: resolution: {integrity: sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==} engines: {node: '>=18'} @@ -541,11 +418,6 @@ packages: engines: {node: '>=18'} hasBin: true - conventional-commits-parser@7.1.2: - resolution: {integrity: sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==} - engines: {node: '>=22'} - hasBin: true - convert-hrtime@5.0.0: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} @@ -553,14 +425,6 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig-typescript-loader@6.3.0: - resolution: {integrity: sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==} - engines: {node: '>=v18'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' - cosmiconfig@9.0.2: resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} engines: {node: '>=14'} @@ -626,9 +490,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-toolkit@1.52.0: - resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -649,12 +510,6 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-uri@3.1.8: - resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -723,10 +578,6 @@ packages: git-log-parser@1.2.1: resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} - global-directory@5.0.0: - resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} - engines: {node: '>=20'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} @@ -802,10 +653,6 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -851,10 +698,6 @@ packages: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -868,69 +711,12 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-with-bigint@3.5.12: resolution: {integrity: sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==} jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - lefthook-darwin-arm64@2.1.16: - resolution: {integrity: sha512-oOjS1mn3UGNfo72UtR9VJMyulgbjvLkv5KEmJVgfWiO8wZ4Z469o2ZllvH5FrHluzv4Hlkc9OG+vnCP+5/ztMA==} - cpu: [arm64] - os: [darwin] - - lefthook-darwin-x64@2.1.16: - resolution: {integrity: sha512-/thON8TbzsqXBjF0hkVPsisBJOKGfss0+lVqcJ0jNwaRDIQSn6Frsn7c9eqs7uyMNEQKUVLTeIkpwPrNldT8JA==} - cpu: [x64] - os: [darwin] - - lefthook-freebsd-arm64@2.1.16: - resolution: {integrity: sha512-Eg7s0gcGwZnQqYyWTfOqb+2qupXtmHt/XHftXJvLhTaTMXR6uQbAyl7ceYTl2wH43AOCLrJ5BMMdqlWJaj/EbA==} - cpu: [arm64] - os: [freebsd] - - lefthook-freebsd-x64@2.1.16: - resolution: {integrity: sha512-vCmyKLO8mtAf+hm8rpfAlt4wQ23S7AGnlT6JlrLPBSt5V8J2kXuI/N1W2XQbWx6OqckqchhBdLQP3Xh4IiYBXA==} - cpu: [x64] - os: [freebsd] - - lefthook-linux-arm64@2.1.16: - resolution: {integrity: sha512-zMEZ8x+PzXqjouEFsf2lWt2o0p5yvvT0YP0CpJC41y4FIRusx0sy3l+cjvKRIysLGOzKMr4V3/fE6w7f2KgwUw==} - cpu: [arm64] - os: [linux] - - lefthook-linux-x64@2.1.16: - resolution: {integrity: sha512-HdfNz3z5hzrEXyP5KC51os+2M6BThL4qMfu8rB777tbXzf7WMoxf/FV6mnzoqM1RN0K+KJAQYbnJatfPQhqusQ==} - cpu: [x64] - os: [linux] - - lefthook-openbsd-arm64@2.1.16: - resolution: {integrity: sha512-zKkyN/ocUXOzFaLPn3ciucJ6CYcnUmqFsIwp7ge96sQ8l83omxL9rK0/KvSsMcus+TfHTNN+DFWVJxeMepPVtQ==} - cpu: [arm64] - os: [openbsd] - - lefthook-openbsd-x64@2.1.16: - resolution: {integrity: sha512-Ptu0D2JK1COlDK1lcr7F6WDGkCzQ80ozeTrqNzPEyBjUdZAFLwR5K5gWgaRtR06RSoYDC72RFxKM1QYnsfF0rQ==} - cpu: [x64] - os: [openbsd] - - lefthook-windows-arm64@2.1.16: - resolution: {integrity: sha512-YTzFJwlF3qbHx+CCuiyDmDPASh6mYBp1I8zfTeGKI3L24Eoct6FUaGUlfAoz8SI3DECPmBhfNgAK4dZlX9Hd5g==} - cpu: [arm64] - os: [win32] - - lefthook-windows-x64@2.1.16: - resolution: {integrity: sha512-mQVpfaagdIZPJCGDeedRnslyd9JTc13vjmp02uu4X7cr/VZK94obwk96dhgsRp9+LL1XMhX5zTcb0zNLo1hC+A==} - cpu: [x64] - os: [win32] - - lefthook@2.1.16: - resolution: {integrity: sha512-U69YGDNsZ7R+umeSzdLzORNCHQFz/w4LKyNTjJQcGrQRQCr8hlCJfJwwm9sqq9Uc5N6dImS58ywURA0FkqoHlg==} - hasBin: true - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1220,11 +1006,6 @@ packages: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} - prettier@3.9.9: - resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} - engines: {node: '>=14'} - hasBin: true - pretty-ms@9.3.1: resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} engines: {node: '>=18'} @@ -1275,10 +1056,6 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1361,10 +1138,6 @@ packages: resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} engines: {node: '>=20'} - string-width@8.3.0: - resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} - engines: {node: '>=20'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -1434,10 +1207,6 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} - tinyexec@1.3.1: - resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} - engines: {node: '>=18'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -1480,9 +1249,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - undici-types@8.9.0: - resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@6.28.1: resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==} engines: {node: '>=18.17'} @@ -1571,10 +1337,6 @@ packages: resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@18.2.0: - resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yoctocolors@2.2.0: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} @@ -1608,125 +1370,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@21.2.3(@types/node@26.6.2)(conventional-commits-parser@7.1.2)(typescript@7.0.2)': - dependencies: - '@commitlint/config-conventional': 21.2.3 - '@commitlint/format': 21.2.3 - '@commitlint/lint': 21.2.3 - '@commitlint/load': 21.2.3(@types/node@26.6.2)(typescript@7.0.2) - '@commitlint/read': 21.2.3(conventional-commits-parser@7.1.2) - '@commitlint/types': 21.2.3 - tinyexec: 1.3.1 - yargs: 18.2.0 - transitivePeerDependencies: - - '@types/node' - - conventional-commits-filter - - conventional-commits-parser - - typescript - - '@commitlint/config-conventional@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - conventional-changelog-conventionalcommits: 10.4.0 - - '@commitlint/config-validator@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - ajv: 8.20.0 - - '@commitlint/ensure@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - es-toolkit: 1.52.0 - - '@commitlint/execute-rule@21.0.1': {} - - '@commitlint/format@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - picocolors: 1.1.1 - - '@commitlint/is-ignored@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - semver: 7.8.5 - - '@commitlint/lint@21.2.3': - dependencies: - '@commitlint/is-ignored': 21.2.3 - '@commitlint/parse': 21.2.3 - '@commitlint/rules': 21.2.3 - '@commitlint/types': 21.2.3 - - '@commitlint/load@21.2.3(@types/node@26.6.2)(typescript@7.0.2)': - dependencies: - '@commitlint/config-validator': 21.2.3 - '@commitlint/execute-rule': 21.0.1 - '@commitlint/resolve-extends': 21.2.3 - '@commitlint/types': 21.2.3 - cosmiconfig: 9.0.2(typescript@7.0.2) - cosmiconfig-typescript-loader: 6.3.0(@types/node@26.6.2)(cosmiconfig@9.0.2(typescript@7.0.2))(typescript@7.0.2) - es-toolkit: 1.52.0 - is-plain-obj: 4.1.0 - picocolors: 1.1.1 - transitivePeerDependencies: - - '@types/node' - - typescript - - '@commitlint/message@21.2.0': {} - - '@commitlint/parse@21.2.3': - dependencies: - '@commitlint/types': 21.2.3 - conventional-changelog-angular: 9.4.0 - conventional-commits-parser: 7.1.2 - - '@commitlint/read@21.2.3(conventional-commits-parser@7.1.2)': - dependencies: - '@commitlint/top-level': 21.2.0 - '@commitlint/types': 21.2.3 - '@conventional-changelog/git-client': 3.1.2(conventional-commits-parser@7.1.2) - tinyexec: 1.3.1 - transitivePeerDependencies: - - conventional-commits-filter - - conventional-commits-parser - - '@commitlint/resolve-extends@21.2.3': - dependencies: - '@commitlint/config-validator': 21.2.3 - '@commitlint/types': 21.2.3 - es-toolkit: 1.52.0 - global-directory: 5.0.0 - resolve-from: 5.0.0 - - '@commitlint/rules@21.2.3': - dependencies: - '@commitlint/ensure': 21.2.3 - '@commitlint/message': 21.2.0 - '@commitlint/to-lines': 21.0.1 - '@commitlint/types': 21.2.3 - - '@commitlint/to-lines@21.0.1': {} - - '@commitlint/top-level@21.2.0': - dependencies: - escalade: 3.2.0 - - '@commitlint/types@21.2.3': - dependencies: - conventional-commits-parser: 7.1.2 - picocolors: 1.1.1 - - '@conventional-changelog/git-client@3.1.2(conventional-commits-parser@7.1.2)': - dependencies: - '@simple-libs/child-process-utils': 2.0.0 - '@simple-libs/stream-utils': 2.0.0 - semver: 7.8.5 - optionalDependencies: - conventional-commits-parser: 7.1.2 - - '@conventional-changelog/template@1.4.0': {} - '@octokit/auth-token@6.0.0': {} '@octokit/core@7.0.8': @@ -1880,22 +1523,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@simple-libs/child-process-utils@2.0.0': - dependencies: - '@simple-libs/stream-utils': 2.0.0 - '@simple-libs/stream-utils@1.2.0': {} - '@simple-libs/stream-utils@2.0.0': {} - '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} - '@types/node@26.6.2': - dependencies: - undici-types: 8.9.0 - '@types/normalize-package-data@2.4.4': {} '@typescript/typescript-aix-ppc64@7.0.2': @@ -1965,13 +1598,6 @@ snapshots: clean-stack: 5.3.0 indent-string: 5.0.0 - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.8 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - ansi-escapes@7.3.0: dependencies: environment: 1.1.0 @@ -1996,8 +1622,6 @@ snapshots: argparse@2.0.1: {} - argue-cli@3.2.0: {} - argv-formatter@1.0.0: {} array-ify@1.0.0: {} @@ -2086,14 +1710,6 @@ snapshots: dependencies: compare-func: 2.0.0 - conventional-changelog-angular@9.4.0: - dependencies: - '@conventional-changelog/template': 1.4.0 - - conventional-changelog-conventionalcommits@10.4.0: - dependencies: - '@conventional-changelog/template': 1.4.0 - conventional-changelog-writer@8.4.0: dependencies: '@simple-libs/stream-utils': 1.2.0 @@ -2109,22 +1725,10 @@ snapshots: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 - conventional-commits-parser@7.1.2: - dependencies: - '@simple-libs/stream-utils': 2.0.0 - argue-cli: 3.2.0 - convert-hrtime@5.0.0: {} core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.3.0(@types/node@26.6.2)(cosmiconfig@9.0.2(typescript@7.0.2))(typescript@7.0.2): - dependencies: - '@types/node': 26.6.2 - cosmiconfig: 9.0.2(typescript@7.0.2) - jiti: 2.6.1 - typescript: 7.0.2 - cosmiconfig@9.0.2(typescript@7.0.2): dependencies: env-paths: 2.2.1 @@ -2183,8 +1787,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-toolkit@1.52.0: {} - escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -2218,10 +1820,6 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.2.0 - fast-deep-equal@3.1.3: {} - - fast-uri@3.1.8: {} - fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 @@ -2281,10 +1879,6 @@ snapshots: through2: 2.0.5 traverse: 0.6.8 - global-directory@5.0.0: - dependencies: - ini: 6.0.0 - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} @@ -2358,8 +1952,6 @@ snapshots: ini@1.3.8: {} - ini@6.0.0: {} - is-arrayish@0.2.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2390,8 +1982,6 @@ snapshots: java-properties@1.0.2: {} - jiti@2.6.1: {} - js-tokens@4.0.0: {} js-yaml@4.3.2: @@ -2402,8 +1992,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@1.0.0: {} - json-with-bigint@3.5.12: {} jsonfile@6.2.1: @@ -2412,49 +2000,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - lefthook-darwin-arm64@2.1.16: - optional: true - - lefthook-darwin-x64@2.1.16: - optional: true - - lefthook-freebsd-arm64@2.1.16: - optional: true - - lefthook-freebsd-x64@2.1.16: - optional: true - - lefthook-linux-arm64@2.1.16: - optional: true - - lefthook-linux-x64@2.1.16: - optional: true - - lefthook-openbsd-arm64@2.1.16: - optional: true - - lefthook-openbsd-x64@2.1.16: - optional: true - - lefthook-windows-arm64@2.1.16: - optional: true - - lefthook-windows-x64@2.1.16: - optional: true - - lefthook@2.1.16: - optionalDependencies: - lefthook-darwin-arm64: 2.1.16 - lefthook-darwin-x64: 2.1.16 - lefthook-freebsd-arm64: 2.1.16 - lefthook-freebsd-x64: 2.1.16 - lefthook-linux-arm64: 2.1.16 - lefthook-linux-x64: 2.1.16 - lefthook-openbsd-arm64: 2.1.16 - lefthook-openbsd-x64: 2.1.16 - lefthook-windows-arm64: 2.1.16 - lefthook-windows-x64: 2.1.16 - lines-and-columns@1.2.4: {} load-json-file@4.0.0: @@ -2648,8 +2193,6 @@ snapshots: find-up: 2.1.0 load-json-file: 4.0.0 - prettier@3.9.9: {} - pretty-ms@9.3.1: dependencies: parse-ms: 4.0.0 @@ -2711,8 +2254,6 @@ snapshots: require-directory@2.1.1: {} - require-from-string@2.0.2: {} - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -2820,11 +2361,6 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 - string-width@8.3.0: - dependencies: - get-east-asian-width: 1.7.0 - strip-ansi: 7.2.0 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -2892,8 +2428,6 @@ snapshots: dependencies: convert-hrtime: 5.0.0 - tinyexec@1.3.1: {} - tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) @@ -2939,12 +2473,11 @@ snapshots: '@typescript/typescript-sunos-x64': 7.0.2 '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 + optional: true uglify-js@3.19.3: optional: true - undici-types@8.9.0: {} - undici@6.28.1: {} undici@7.30.0: {} @@ -3021,13 +2554,4 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 - yargs@18.2.0: - dependencies: - cliui: 9.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - string-width: 8.3.0 - y18n: 5.0.8 - yargs-parser: 22.0.0 - yoctocolors@2.2.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ab18cd7..09c3173 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,17 +1,9 @@ # Not a monorepo -- this file only carries pnpm settings (pnpm 11+ reads them here # instead of the package.json "pnpm" field). # -# Supply-chain policy: dependency build and install scripts are DENIED by default and -# must be approved here, one at a time, with a reason. This is the governance this repo -# exists to spread, applied to itself -- when a new devDependency needs a build script, -# add it with a line saying why rather than turning the check off. +# pnpm installs one thing here: semantic-release, for release.yml. Everything else is +# pinned in mise.toml. # -# lefthook's postinstall fetches its binary and wires the local git hooks, so it is the -# one dependency allowed to run. -# - onlyBuiltDependencies is the stock-pnpm approval, used by CI's corepack pnpm. -# - allowBuilds is the same decision in the key a Vite+ (`vp`)-provided pnpm reads, so -# it holds for contributors whose local toolchain is vp. Harmless to stock pnpm. -onlyBuiltDependencies: - - lefthook -allowBuilds: - lefthook: true +# Supply-chain policy: dependency build and install scripts are DENIED by default and +# must be approved here, one at a time, with a reason. Nothing needs one today. +onlyBuiltDependencies: [] From 7bc27f099823e4991d0ce2b06eff957c0d79fc0e Mon Sep 17 00:00:00 2001 From: david morales <118213696+davidmoralesz@users.noreply.github.com> Date: Fri, 9 Oct 2026 12:05:40 -0600 Subject: [PATCH 2/2] fix(devtools): lint commits against config-conventional Replaces the hand-written rules in .commitlintrc.yaml with @commitlint/config-conventional plus this repo's scopes, pinned through mise next to the CLI. Also requires the lint / lefthook check in the ruleset, and documents how the tools in mise.toml are bumped by hand. --- .commitlintrc.yaml | 27 ++----- .../21.2.3/aube-lock.yaml | 76 +++++++++++++++++++ .../21.2.3/package.json | 7 ++ AGENTS.md | 6 +- README.md | 18 ++++- mise.lock | 6 ++ mise.toml | 4 +- rulesets/checks-dotgithub.json | 4 + 8 files changed, 125 insertions(+), 23 deletions(-) create mode 100644 .mise/locks/npm-commitlint-config-conventional/21.2.3/aube-lock.yaml create mode 100644 .mise/locks/npm-commitlint-config-conventional/21.2.3/package.json diff --git a/.commitlintrc.yaml b/.commitlintrc.yaml index c7aaf32..7d5d7bf 100644 --- a/.commitlintrc.yaml +++ b/.commitlintrc.yaml @@ -1,22 +1,11 @@ -# Conventional Commits for this repo. The local commit-msg hook reads the whole file; -# ci-pr reads only `rules`, on top of .github/actions/pr-checks/commitlint.default.yaml. - -# commitlint's built-in pattern does not accept the `!` that marks a breaking change. -parserPreset: - parserOpts: - headerPattern: '^(\w*)(?:\(([^)]*)\))?!?: (.*)$' - headerCorrespondence: [type, scope, subject] +# Conventional Commits for this repo: commitlint's conventional config, plus the scopes +# AGENTS.md documents. A scope stays optional, but an invented one is rejected, so the +# two lists cannot drift apart. +# +# The commit-msg hook reads this file. So does ci-pr, on the pull request title and on +# every commit. +extends: + - '@commitlint/config-conventional' rules: - type-enum: - - 2 - - always - - [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] - type-case: [2, always, lower-case] - type-empty: [2, never] - scope-case: [2, always, lower-case] - subject-empty: [2, never] - subject-full-stop: [2, never, '.'] - # The scopes AGENTS.md documents, made binding. A scope stays optional, but an - # invented one is rejected, so the two lists cannot drift apart. scope-enum: [2, always, [actions, workflows, devtools, templates, docs, deps]] diff --git a/.mise/locks/npm-commitlint-config-conventional/21.2.3/aube-lock.yaml b/.mise/locks/npm-commitlint-config-conventional/21.2.3/aube-lock.yaml new file mode 100644 index 0000000..1d5bce6 --- /dev/null +++ b/.mise/locks/npm-commitlint-config-conventional/21.2.3/aube-lock.yaml @@ -0,0 +1,76 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@commitlint/config-conventional': + specifier: 21.2.3 + version: 21.2.3 + +packages: + + '@commitlint/config-conventional@21.2.3': + resolution: {integrity: sha512-EP2n5DN2GwRWNVrLX0Jx3mpQlW5PfFi9HnD9OJ8hN/H0xFqpCFyHeGDhg+0P8/21iMMcdkcQgbNqmVklebqYsQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/types@21.2.3': + resolution: {integrity: sha512-sGEA473TlCvhCGNoTBY9OXZVWdscIXdGt0dm8EpB+2MRfmt8LNh/X56P/T3nCtEB+eH5qGEa3odphSAoUxSfSQ==} + engines: {node: '>=22.12.0'} + + '@conventional-changelog/template@1.4.0': + resolution: {integrity: sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==} + engines: {node: '>=22'} + + '@simple-libs/stream-utils@2.0.0': + resolution: {integrity: sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==} + engines: {node: '>=22'} + + argue-cli@3.2.0: + resolution: {integrity: sha512-VipTB0gXgGIFO2Rg9yEVN5wLt2AurJcZqDbgmYSwPwsykhLrQhs240/bfceev4w68lI8JshoOJIk9uW7tFzROw==} + engines: {node: '>=22'} + + conventional-changelog-conventionalcommits@10.4.1: + resolution: {integrity: sha512-jS1LRFSbRoAr6JbhhRy1JYfNNUj5LM3+v49hRE03CgccsiYqgdVj/RTmrw4J1rylrqijHwdOlJWiJa61JHOgHg==} + engines: {node: '>=22'} + + conventional-commits-parser@7.1.3: + resolution: {integrity: sha512-Q9oWm1o9uy/oEsZQIraoFMZ4RuPD+79KgwWj6mJVP356tazolCB0piRLZ5Kz9te9p027uSEcUW+Gu44Eh+X79g==} + engines: {node: '>=22'} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + +snapshots: + + '@commitlint/config-conventional@21.2.3': + dependencies: + '@commitlint/types': 21.2.3 + conventional-changelog-conventionalcommits: 10.4.1 + + '@commitlint/types@21.2.3': + dependencies: + conventional-commits-parser: 7.1.3 + picocolors: 1.1.1 + + '@conventional-changelog/template@1.4.0': {} + + '@simple-libs/stream-utils@2.0.0': {} + + argue-cli@3.2.0: {} + + conventional-changelog-conventionalcommits@10.4.1: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-commits-parser@7.1.3: + dependencies: + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.2.0 + + picocolors@1.1.1: {} diff --git a/.mise/locks/npm-commitlint-config-conventional/21.2.3/package.json b/.mise/locks/npm-commitlint-config-conventional/21.2.3/package.json new file mode 100644 index 0000000..4c94fe6 --- /dev/null +++ b/.mise/locks/npm-commitlint-config-conventional/21.2.3/package.json @@ -0,0 +1,7 @@ +{ + "name": "mise-npm-install", + "private": true, + "dependencies": { + "@commitlint/config-conventional": "21.2.3" + } +} diff --git a/AGENTS.md b/AGENTS.md index 44679e7..e4d5d92 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,7 +14,8 @@ everything here runs in other repositories' CI or on their contributors' machine Consumers: every studiobimo project, through `studiobimo/project-template`. Tooling: mise pins every tool (`mise.toml`, `mise.lock`), lefthook runs the hooks -(`lefthook.yml`), commitlint checks commits (`.commitlintrc.yaml`). pnpm and `package.json` exist +(`lefthook.yml`), commitlint checks commits against +`@commitlint/config-conventional` plus this repo's scopes (`.commitlintrc.yaml`). pnpm and `package.json` exist only for semantic-release. This repo releases with semantic-release, not release-please like the projects: it has no version file or changelog to maintain, and `release.yml` has to move the floating `v1` tag. `.pre-commit-hooks.yaml` and `ci-pre-commit.yml` are deprecated and stay @@ -51,6 +52,9 @@ until no consumer uses them. - **Templates.** `workflow-templates/` is copied into consumers, not called by them, so it is the one place the SHA rule bites: `$/` there would resolve to _their_ repo. zizmor does not audit these files at all, so `check-action-pins` and review are the only net. +- **Tools.** Pinned in `mise.toml`, with checksums in `mise.lock`. Dependabot does not read + either, so a bump is made by hand: change the version, run `mise lock`, commit `mise.toml`, + `mise.lock` and `.mise/locks/` together. The README has the steps. - **PR size:** at most 20 changed files. Split bigger work with `gh stack`. - **Naming.** `ci-*` is library code (`on: workflow_call`), called by consumers at `@v1`. `self-*` is this repo's own caller of one, invoked by local path diff --git a/README.md b/README.md index d64b4ed..372a26e 100644 --- a/README.md +++ b/README.md @@ -265,8 +265,22 @@ lefthook, Prettier, commitlint, actionlint, zizmor, shellcheck and gitleaks, and each through `mise exec`, so they work whether or not your shell has mise activated. Nothing is skipped when a tool is missing: `mise install` is what makes it present. -To change a tool's version, edit `mise.toml`, run `mise lock`, and commit both along with -`.mise/locks/`. Dependabot does not read `mise.toml`, so these bumps are made by hand. +### Bumping a tool + +Dependabot does not read `mise.toml`, so the tools pinned there are bumped by hand. Nothing +reminds you; check them when you touch the file, and at least when a linter reports something +its newer release has fixed. + +```sh +mise outdated --bump # what has a newer release +$EDITOR mise.toml # change the version +mise lock # record the new checksums +mise install && mise exec -- lefthook run pre-commit --all-files +git add mise.toml mise.lock .mise/locks +``` + +`.mise/locks/` holds the dependency graph of each npm tool, so it is committed with the other +two. Leave a release a week before taking it, as Dependabot's cooldown does for everything else. pnpm is only here for semantic-release, which `release.yml` runs. diff --git a/mise.lock b/mise.lock index 4c6294d..6d209f7 100644 --- a/mise.lock +++ b/mise.lock @@ -175,6 +175,12 @@ aube = { path = ".mise/locks/npm-commitlint-cli/21.2.3", digest = "sha256:28100d backend = "npm:@commitlint/cli" specifiers = ["21.2.3"] +[[tools."npm:@commitlint/config-conventional"]] +version = "21.2.3" +aube = { path = ".mise/locks/npm-commitlint-config-conventional/21.2.3", digest = "sha256:4e561623f49495adaafcabb36791769143e8157eb823983609aa3c75f8ea79d1" } +backend = "npm:@commitlint/config-conventional" +specifiers = ["21.2.3"] + [[tools."npm:prettier"]] version = "3.9.9" aube = { path = ".mise/locks/npm-prettier/3.9.9", digest = "sha256:815f6667505e41ac2d03ecbac86b79f1beb78d45783879428193c9adc80760a3" } diff --git a/mise.toml b/mise.toml index 8336383..855aaf4 100644 --- a/mise.toml +++ b/mise.toml @@ -4,7 +4,8 @@ # mise install # once, and after this file changes # mise exec -- lefthook install # wire the git hooks # -# After changing a version here: mise lock, and commit both files. +# Dependabot does not read this file, so versions are bumped by hand: change one here, +# run `mise lock`, and commit this file, mise.lock and .mise/locks/ together. [settings] lockfile = true @@ -19,3 +20,4 @@ gitleaks = "8.30.1" zizmor = "1.30.1" "npm:prettier" = "3.9.9" "npm:@commitlint/cli" = "21.2.3" +"npm:@commitlint/config-conventional" = "21.2.3" diff --git a/rulesets/checks-dotgithub.json b/rulesets/checks-dotgithub.json index 4aa7488..5ecd3f7 100644 --- a/rulesets/checks-dotgithub.json +++ b/rulesets/checks-dotgithub.json @@ -34,6 +34,10 @@ "context": "workflows / zizmor", "integration_id": 15368 }, + { + "context": "lint / lefthook", + "integration_id": 15368 + }, { "context": "Pins and formatting", "integration_id": 15368