From e5c9fcb5d0c57f8736c77e365018d5b98b309f08 Mon Sep 17 00:00:00 2001 From: CptSchnitz <12687466+CptSchnitz@users.noreply.github.com> Date: Sun, 23 Aug 2026 10:18:13 +0300 Subject: [PATCH 1/2] chore: scaffold the monorepo --- .editorconfig | 26 + .gitignore | 51 ++ .husky/commit-msg | 1 + .husky/pre-commit | 1 + .npmrc | 1 + .nvmrc | 1 + .prettierignore | 8 + .prettierrc | 1 + commitlint.config.js | 3 + knip.json | 4 + package.json | 36 + pnpm-lock.yaml | 1522 ++++++++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 4 + redocly.yaml | 34 + turbo.json | 51 ++ 15 files changed, 1744 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100755 .husky/commit-msg create mode 100755 .husky/pre-commit create mode 100644 .npmrc create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 commitlint.config.js create mode 100644 knip.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 redocly.yaml create mode 100644 turbo.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..694d9f8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,26 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# Top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# Set default charset +charset = utf-8 + +# 2 space indentation (default) +indent_style = space +indent_size = 2 + +# 2 space indentation (JS and JSX and TS files) +[*.{js,jsx,ts}] +indent_size = 2 + +# Trim trailing whitespace +trim_trailing_whitespace = true + +# Max line length +max_line_length = 150 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..905cbe2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,51 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage +*.lcov +.nyc_output + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# dotenv environment variables file +.env +.env.test + +# Build output +dist/ + +# Turbo +.turbo + +# This repository accepts only pnpm — lockfiles from other package managers +# should never be committed +package-lock.json +yarn.lock + +# Test reports +reports diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..d7da588 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +pnpm exec commitlint --edit ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..2a1e22c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec pretty-quick --staged diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..54c6511 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v24 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..876e227 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +**/dist +node_modules +coverage +reports +pnpm-lock.yaml +CHANGELOG.md +*.html +.turbo diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..c91e66d --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +"@map-colonies/prettier-config" diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..f307f55 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['@map-colonies/commitlint-config'], +}; diff --git a/knip.json b/knip.json new file mode 100644 index 0000000..3134bd3 --- /dev/null +++ b/knip.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://unpkg.com/knip@6/schema.json", + "ignoreDependencies": ["@commitlint/cli", "prettier", "pretty-quick"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..04c07c0 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "jobnik", + "private": true, + "engines": { + "node": ">=24", + "npm": "please-use-pnpm", + "yarn": "please-use-pnpm", + "pnpm": ">=10" + }, + "packageManager": "pnpm@10.25.0", + "scripts": { + "prepare": "husky", + "build": "turbo run build", + "build:docker": "turbo run build:docker", + "lint": "turbo run lint", + "lint:fix": "turbo run lint:fix", + "lint:openapi": "turbo run lint:openapi", + "format": "turbo run format", + "format:fix": "turbo run format:fix", + "type-check": "turbo run type-check", + "test": "turbo run test", + "e2e": "turbo run e2e", + "check-dist": "turbo run check-dist", + "knip": "knip" + }, + "devDependencies": { + "@commitlint/cli": "^21.2.2", + "@map-colonies/commitlint-config": "^2.0.1", + "@map-colonies/prettier-config": "^1.0.0", + "husky": "^9.1.7", + "knip": "^6.32.2", + "prettier": "^3.9.6", + "pretty-quick": "^4.2.2", + "turbo": "^2.10.11" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..169c056 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1522 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@commitlint/cli': + specifier: ^21.2.2 + version: 21.2.2(@types/node@26.2.0)(conventional-commits-parser@7.1.2)(typescript@7.0.2) + '@map-colonies/commitlint-config': + specifier: ^2.0.1 + version: 2.0.1 + '@map-colonies/prettier-config': + specifier: ^1.0.0 + version: 1.0.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + knip: + specifier: ^6.32.2 + version: 6.32.2 + prettier: + specifier: ^3.9.6 + version: 3.9.6 + pretty-quick: + specifier: ^4.2.2 + version: 4.2.2(prettier@3.9.6) + turbo: + specifier: ^2.10.11 + version: 2.10.11 + +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.2': + resolution: {integrity: sha512-a+6hQxIxnpdvSvS2apvttPNbEliYsVC3PqFYDiiB2kjbwIsQsj1urvQ4Tkf70pKYozPalKAuRQmm/GHwndduqA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@commitlint/config-conventional@21.2.2': + resolution: {integrity: sha512-NxA37SZviusFUEYOQZ5hNnZ1h7O/KiemPkxjOlpzKJNnWxThiwc6/SaZhaPa8fyLvfRBAywhQhJJk8XESHWlpQ==} + engines: {node: '>=22.12.0'} + + '@commitlint/config-validator@21.2.0': + resolution: {integrity: sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==} + engines: {node: '>=22.12.0'} + + '@commitlint/ensure@21.2.0': + resolution: {integrity: sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==} + 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.2': + resolution: {integrity: sha512-v6fvxZSc/AvVMROlr3H34+1766bZSYApRUSCAMjWamStPjKMvZ8GdvVA5YW/VQNgbFTmcMz6OYmSTJEvIjPrfA==} + engines: {node: '>=22.12.0'} + + '@commitlint/is-ignored@21.2.2': + resolution: {integrity: sha512-9UoKNgfFE3LU7FrzierCvk3CdDfMDeVGC86qZiT/n0TIjfq/dmZ9MHuXd45OTNRa26ZanmJRxEtmiXk/lEJihg==} + engines: {node: '>=22.12.0'} + + '@commitlint/lint@21.2.2': + resolution: {integrity: sha512-Fy8JxEBzdmsYWFude/61GxXu5O+wEymwiRK2z9GL9R8mCsXphCoGxAFc5iHn5mjlfcSrhiiONE+ksf4KOjnaPg==} + engines: {node: '>=22.12.0'} + + '@commitlint/load@21.2.2': + resolution: {integrity: sha512-0Tt6wDPX167cjKC5D4zhm0+20wJJG+TN/TKovMOspfSe78rOnKX+MNzlVNiu6HyQPZChPJ8QBH31MVt6Bb8fCg==} + 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.2': + resolution: {integrity: sha512-MEkobPfvRp+z06Wro8HMG1BDGHzZmj82A1LH1nWeG3ipHpg/x4m6v3wEDvMBIKjRFUnfR3nBeFs3MVCr7UdAmg==} + engines: {node: '>=22.12.0'} + + '@commitlint/read@21.2.1': + resolution: {integrity: sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==} + engines: {node: '>=22.12.0'} + + '@commitlint/resolve-extends@21.2.2': + resolution: {integrity: sha512-RPkJ/IFi7sMUUVbZLqwWFtWw/zRDcfFsmrPSiTMrt5wb7AdxOr86EGQFvmGzef5QKV5IPBWWCujqVTw1RWX44A==} + engines: {node: '>=22.12.0'} + + '@commitlint/rules@21.2.2': + resolution: {integrity: sha512-eplQzyYkBjYB1HyyRj8hkcK11Y9DU9nuBz7uOKEd6NpE9NGDytLFCAnlRE+OoiK/5sHEJsaz2RGhuWBvYzIbNA==} + 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.0': + resolution: {integrity: sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==} + 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'} + + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + + '@map-colonies/commitlint-config@2.0.1': + resolution: {integrity: sha512-ai8/+VwcStxsmNCw49/Cy6neBkEqjle5t92A28gHRZXNTQBasqkONb7kIkHMKxpnyl+cDV+gVb6MHYQJBCdZ1g==} + engines: {node: '>=24'} + + '@map-colonies/prettier-config@1.0.0': + resolution: {integrity: sha512-IQnP63LimwfnIX9N/BVC3Th5hVhBw+LwNQUz5s7lZoxOSM2AJWwT/E/rjvnh3lnEgQa0m0nJJJLzyVAjWODDGA==} + engines: {node: '>=24'} + + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + + '@oxc-parser/binding-android-arm-eabi@0.143.0': + resolution: {integrity: sha512-n9uozULWflPqBtdmI8lAabLqGKNgLVNN0ZH8HfgCwpKGNtzRzauB76jTiW/3YLkcA7N1zskpi9GdVnZuu1SAvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.143.0': + resolution: {integrity: sha512-9BbdjHETk6O3zH/DDid9IgBtF0GlpLabNKN231uraXpRDSfY+iiZxTP5bk1Z63GBownVdhdINFIeddmMz4MzpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.143.0': + resolution: {integrity: sha512-gh+6ecoHUy4/sUcolBl/1qPXKBbYNxFY0Pk0ujgQvINTMSftJY7o4yb8gOkDJPeZeB8+a+u7xTe6umoP8N5HFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.143.0': + resolution: {integrity: sha512-qd1hl2d+lXgHv/VQ/M9qm8TrMC5T4RqDBwtOnl+1D0QMjwcz+8AaB4JSg8STgeag0GP6a6L74XEGAsrTSJWNzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.143.0': + resolution: {integrity: sha512-M5XXcNa7aOqLPKTR41msfghKu2yQ4xWvCm11/gwU0JzOzHNk5sgW//rVEjJ+LO48+VDAMzXTSzurUVxIDKwozw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + resolution: {integrity: sha512-T/GXusuOkPNQhCQCSBbcU/N8j0rAypuDBl1IyFK+lyYT594XsVz80clPC/OtbSSpBGyJxj8uYEfctxVuxVYoww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + resolution: {integrity: sha512-oKu4RcBlXSqo3OC62dp6YTnQaZIurNDpCX3BnAM3+bJxt7s8J2TJKMnC0UYer1qhlRaDCg6wkTaTw+2IlsZ12w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + resolution: {integrity: sha512-WJBbD186AZmMGaSIhlktC+rPl8L3peCTXAh88Ih9uEvK0en2mPojGyCGYiL6mHtV1RPV3JyfJW5t6n5hh0lXhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + resolution: {integrity: sha512-t1AcYOwEzgceadT4v5e+vaCCb0AncCA3v5AyzfBAz/tMq11qzVccXKzNHtkWdjBsgvTKwRkaUF3QvT4kot8vcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + resolution: {integrity: sha512-RsnO/NoD8376LMJq8JS8TwI0ieNaFRTuNe2GVJntQg6gwZNMENZsEbknHdVwjpOmxdGLGodcwaGSbAeRr5Bgjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + resolution: {integrity: sha512-48fSVfR9TZi5CASZFyv0VC6z6BCoeihFsX031mAD/oSH7d9PYsPgIqza7d9mjP7Z2KTEpTFyH6SIu0Ui6R1vdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + resolution: {integrity: sha512-T8CpdD+SfE01DnIOD4HpVxu0ZJOfMJ/VhCvikKfaXAxkZ+9veyLM/D2hpi7Y2hFUyPmVQO3FNZHmYzV/WlVR4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + resolution: {integrity: sha512-QLdeMsCcacenPEFsfxnBUDF1y6opyz5+fmOz9bfD5Y7fiGCMupUCuB3KTPQhNwshIG1P9fPqar9MHxuBDd4bwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + resolution: {integrity: sha512-659ujfqLy6k7cuH3sbzhd8b+ztSq+i6E2E9pG78Q0BmHjAExfGIdgc8cGgMdwAozDXeZFHkJ+LXYJdWsaGdgyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + resolution: {integrity: sha512-/Mw/9j4TfZcnKphPrzOE6t4MMknXadcAAuVUlDRTF/ETWB5xOgQvOJV2Mh9We/bWxZdoxaGAdc+hy4GuYwQ2yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + resolution: {integrity: sha512-8rIKWR2BFuifbIK/1XB9wTaSdtuJ25dlE7ZQYDnEwj/2xH2vHsxnvIjHT3ZjSVuLLwGGlSslIG/fbOJ8TV8rTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + resolution: {integrity: sha512-5U9kQYMfRRI6Zq7KDxgbIP0RMnKrfn3gLepRMgJuRkPSUALTiRCk9d/uyhb4lGDjUdzwK7mBkKqhLgzBPCmLpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + resolution: {integrity: sha512-25P7AaHk4R88Yv2XH4gToDVmh0cOu+bEURQU10CRrmvgabfRArSGAP5osmwUKeSUHj0VS50upbpbRWWW/m7mHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + resolution: {integrity: sha512-ORMh3JE1s6V7ySicdRK7vgaDQnn5o+UHg9ct989PlWHbel8O9ARrmWXM6kZjrBMtNucxNayQ8g69G0VfWzhANw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.24.2': + resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.24.2': + resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} + cpu: [x64] + os: [win32] + + '@pkgr/core@0.2.10': + resolution: {integrity: sha512-x6fFWCeak8aCGfqZfe6CXYt5xVjxe9Os1cIPmVRcToInKLjhJkRVXvJ/L3/1KxFkjDQdbZV/YsuLKqa8t/xKpA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@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'} + + '@turbo/darwin-64@2.10.11': + resolution: {integrity: sha512-v3R+1R/Ysozyo+p7Ri8MCIbndOvYt3DgPFrGLhrhQHfvyvbxyH3WyJj+A/2JTNmNleuAlh3JUyCV0iSVHIONTA==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.10.11': + resolution: {integrity: sha512-R0a0CvGAeYYsBgPIgFNB3agGXh6qukjduNhFlwVVX1Ss2IdBJLXmgjytNGmo084bLKS0B6UdLRwKhXMHKKaObQ==} + cpu: [arm64] + os: [darwin] + + '@turbo/linux-64@2.10.11': + resolution: {integrity: sha512-dGlY2vg7jpsLjGS1bf9sD/cw1sGMAYbeHGQKGRFxd5Zaj+Ufbj8cNXl/vIit8ueCU97zhL/znn60ZV5iSfZAxw==} + cpu: [x64] + os: [android, linux] + + '@turbo/linux-arm64@2.10.11': + resolution: {integrity: sha512-eSP9+jjsSCBs2x0QpJZlp49dSD1EIMwXH7PsMIhdWk7w6IThhuKJ+jL95JQ2IW7tRjRmdh8gKcKQtrHLD5R5lA==} + cpu: [arm64] + os: [android, linux] + + '@turbo/windows-64@2.10.11': + resolution: {integrity: sha512-4aD7edogJ8arK8DOyvjTI2KKwmchD5M/WM4BZgidrtFf7aSgn8Ce2rJnDwmriw980c2cKlHnhXtlGy38VtKB8g==} + cpu: [x64] + os: [win32] + + '@turbo/windows-arm64@2.10.11': + resolution: {integrity: sha512-m8tJkIrTrbQ9O1uHxV0GUq623Zg1678xGna8eMsy4KbygUX/wVFgdZDYV/AxyoyaW/U7nyKoBvaDVwm22p9xqA==} + cpu: [arm64] + os: [win32] + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + + '@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.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + 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.1.0: + resolution: {integrity: sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==} + 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.0: + resolution: {integrity: sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==} + engines: {node: '>=22'} + + conventional-commits-parser@7.1.2: + resolution: {integrity: sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==} + 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.51.0: + resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} + + 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.6: + resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-tsconfig@4.14.1: + resolution: {integrity: sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==} + + global-directory@5.0.0: + resolution: {integrity: sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==} + engines: {node: '>=20'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + 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 + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + 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==} + + knip@6.32.2: + resolution: {integrity: sha512-WXTXbmocrw7gqm1A1TQvFN0OgJ7hUSU6E1g6SPRIzzHFogUBhXByc7cYeOFVtJ2uODg7DP4VbESYBYnfbtBYsg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + oxc-parser@0.143.0: + resolution: {integrity: sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-resolver@11.24.2: + resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} + + 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==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + pretty-quick@4.2.2: + resolution: {integrity: sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + prettier: ^3.0.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'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + smol-toml@1.8.0: + resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==} + engines: {node: '>= 18'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + turbo@2.10.11: + resolution: {integrity: sha512-yQfwQVoRXwOuyX1LxiJFBFNg6VfuYh+/RyZLd82+isgyLkBXw3S5XRRzvcck1FAjSCG5sVyLd+O1eDMvYa3J7g==} + hasBin: true + + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} + hasBin: true + + unbash@4.0.10: + resolution: {integrity: sha512-b7zoBQvpWp0vuN5q2vK2RRBR2SvuruQAs50DApdDveBSn3eSYd84IaHodFqQIMlvY9K2VnyBUEXgwOBuGU9GBg==} + engines: {node: '>=14'} + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + 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'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + 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.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +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.2(@types/node@26.2.0)(conventional-commits-parser@7.1.2)(typescript@7.0.2)': + dependencies: + '@commitlint/config-conventional': 21.2.2 + '@commitlint/format': 21.2.2 + '@commitlint/lint': 21.2.2 + '@commitlint/load': 21.2.2(@types/node@26.2.0)(typescript@7.0.2) + '@commitlint/read': 21.2.1(conventional-commits-parser@7.1.2) + '@commitlint/types': 21.2.0 + tinyexec: 1.3.0 + yargs: 18.1.0 + transitivePeerDependencies: + - '@types/node' + - conventional-commits-filter + - conventional-commits-parser + - typescript + + '@commitlint/config-conventional@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-conventionalcommits: 10.4.0 + + '@commitlint/config-validator@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + ajv: 8.20.0 + + '@commitlint/ensure@21.2.0': + dependencies: + '@commitlint/types': 21.2.0 + es-toolkit: 1.51.0 + + '@commitlint/execute-rule@21.0.1': {} + + '@commitlint/format@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + picocolors: 1.1.1 + + '@commitlint/is-ignored@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + semver: 7.8.5 + + '@commitlint/lint@21.2.2': + dependencies: + '@commitlint/is-ignored': 21.2.2 + '@commitlint/parse': 21.2.2 + '@commitlint/rules': 21.2.2 + '@commitlint/types': 21.2.0 + + '@commitlint/load@21.2.2(@types/node@26.2.0)(typescript@7.0.2)': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/execute-rule': 21.0.1 + '@commitlint/resolve-extends': 21.2.2 + '@commitlint/types': 21.2.0 + cosmiconfig: 9.0.2(typescript@7.0.2) + cosmiconfig-typescript-loader: 6.3.0(@types/node@26.2.0)(cosmiconfig@9.0.2(typescript@7.0.2))(typescript@7.0.2) + es-toolkit: 1.51.0 + is-plain-obj: 4.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@21.2.0': {} + + '@commitlint/parse@21.2.2': + dependencies: + '@commitlint/types': 21.2.0 + conventional-changelog-angular: 9.4.0 + conventional-commits-parser: 7.1.2 + + '@commitlint/read@21.2.1(conventional-commits-parser@7.1.2)': + dependencies: + '@commitlint/top-level': 21.2.0 + '@commitlint/types': 21.2.0 + '@conventional-changelog/git-client': 3.1.2(conventional-commits-parser@7.1.2) + tinyexec: 1.3.0 + transitivePeerDependencies: + - conventional-commits-filter + - conventional-commits-parser + + '@commitlint/resolve-extends@21.2.2': + dependencies: + '@commitlint/config-validator': 21.2.0 + '@commitlint/types': 21.2.0 + es-toolkit: 1.51.0 + global-directory: 5.0.0 + resolve-from: 5.0.0 + + '@commitlint/rules@21.2.2': + dependencies: + '@commitlint/ensure': 21.2.0 + '@commitlint/message': 21.2.0 + '@commitlint/to-lines': 21.0.1 + '@commitlint/types': 21.2.0 + + '@commitlint/to-lines@21.0.1': {} + + '@commitlint/top-level@21.2.0': + dependencies: + escalade: 3.2.0 + + '@commitlint/types@21.2.0': + 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': {} + + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@map-colonies/commitlint-config@2.0.1': + dependencies: + '@commitlint/config-conventional': 21.2.2 + + '@map-colonies/prettier-config@1.0.0': {} + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@oxc-parser/binding-android-arm-eabi@0.143.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.143.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + optional: true + + '@oxc-project/types@0.143.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + optional: true + + '@oxc-resolver/binding-android-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + optional: true + + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + optional: true + + '@pkgr/core@0.2.10': {} + + '@simple-libs/child-process-utils@2.0.0': + dependencies: + '@simple-libs/stream-utils': 2.0.0 + + '@simple-libs/stream-utils@2.0.0': {} + + '@turbo/darwin-64@2.10.11': + optional: true + + '@turbo/darwin-arm64@2.10.11': + optional: true + + '@turbo/linux-64@2.10.11': + optional: true + + '@turbo/linux-arm64@2.10.11': + optional: true + + '@turbo/windows-64@2.10.11': + optional: true + + '@turbo/windows-arm64@2.10.11': + optional: true + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/node@26.2.0': + dependencies: + undici-types: 8.3.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.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@6.3.0: {} + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + argue-cli@3.1.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.0: + dependencies: + '@conventional-changelog/template': 1.4.0 + + conventional-commits-parser@7.1.2: + dependencies: + '@simple-libs/stream-utils': 2.0.0 + argue-cli: 3.1.0 + + cosmiconfig-typescript-loader@6.3.0(@types/node@26.2.0)(cosmiconfig@9.0.2(typescript@7.0.2))(typescript@7.0.2): + dependencies: + '@types/node': 26.2.0 + 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 + import-fresh: 3.3.1 + js-yaml: 4.3.1 + parse-json: 5.2.0 + optionalDependencies: + 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.51.0: {} + + escalade@3.2.0: {} + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.6: {} + + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-tsconfig@4.14.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + global-directory@5.0.0: + dependencies: + ini: 6.0.0 + + husky@9.1.7: {} + + ignore@7.0.6: {} + + 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: {} + + jiti@2.7.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.1: + dependencies: + argparse: 2.0.1 + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + knip@6.32.2: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + formatly: 0.3.0 + get-tsconfig: 4.14.1 + jiti: 2.7.0 + oxc-parser: 0.143.0 + oxc-resolver: 11.24.2 + picomatch: 4.0.5 + smol-toml: 1.8.0 + strip-json-comments: 5.0.3 + tinyglobby: 0.2.17 + unbash: 4.0.10 + yaml: 2.9.0 + zod: 4.4.3 + + lines-and-columns@1.2.4: {} + + mri@1.2.0: {} + + oxc-parser@0.143.0: + dependencies: + '@oxc-project/types': 0.143.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.143.0 + '@oxc-parser/binding-android-arm64': 0.143.0 + '@oxc-parser/binding-darwin-arm64': 0.143.0 + '@oxc-parser/binding-darwin-x64': 0.143.0 + '@oxc-parser/binding-freebsd-x64': 0.143.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.143.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.143.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.143.0 + '@oxc-parser/binding-linux-arm64-musl': 0.143.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.143.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-musl': 0.143.0 + '@oxc-parser/binding-openharmony-arm64': 0.143.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.143.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.143.0 + '@oxc-parser/binding-win32-x64-msvc': 0.143.0 + + oxc-resolver@11.24.2: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.24.2 + '@oxc-resolver/binding-android-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-x64': 11.24.2 + '@oxc-resolver/binding-freebsd-x64': 11.24.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.24.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.24.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-musl': 11.24.2 + '@oxc-resolver/binding-openharmony-arm64': 11.24.2 + '@oxc-resolver/binding-wasm32-wasi': 11.24.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 + + 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: {} + + picomatch@4.0.5: {} + + prettier@3.9.6: {} + + pretty-quick@4.2.2(prettier@3.9.6): + dependencies: + '@pkgr/core': 0.2.10 + ignore: 7.0.6 + mri: 1.2.0 + picocolors: 1.1.1 + picomatch: 4.0.5 + prettier: 3.9.6 + tinyexec: 0.3.2 + tslib: 2.8.1 + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + semver@7.8.5: {} + + smol-toml@1.8.0: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + + strip-json-comments@5.0.3: {} + + tinyexec@0.3.2: {} + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tslib@2.8.1: {} + + turbo@2.10.11: + optionalDependencies: + '@turbo/darwin-64': 2.10.11 + '@turbo/darwin-arm64': 2.10.11 + '@turbo/linux-64': 2.10.11 + '@turbo/linux-arm64': 2.10.11 + '@turbo/windows-64': 2.10.11 + '@turbo/windows-arm64': 2.10.11 + + 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 + + unbash@4.0.10: {} + + undici-types@8.3.0: {} + + walk-up-path@4.0.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: {} + + yaml@2.9.0: {} + + yargs-parser@22.0.0: {} + + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..48a128d --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - apps/* + - packages/* + - e2e diff --git a/redocly.yaml b/redocly.yaml new file mode 100644 index 0000000..20e88b3 --- /dev/null +++ b/redocly.yaml @@ -0,0 +1,34 @@ +plugins: [] + # This section is where you can import local plugins. + # We don't support community plugins. + # You don't need to import our built-in plugins and rules. + # Omit this section if you don't have custom plugins. + # - './local-plugin.js' + +extends: + # This section is where you choose the base configurations. + # You may override specific settings in the subsequent sections. + - recommended # This is the default (and built in) configuration. If it is too strict, try `minimal`. + +resolve: {} + # Use this when you have external links in your definition that are not publicly accessible. + # Not required for Redocly API registry links. + # We recommend using environment variables for when possible. + +preprocessors: {} + # Preprocessors are rarely indicated -- avoid if possible. + # This section can be omitted. + +rules: + boolean-parameter-prefixes: + severity: error + prefixes: ['should', 'is', 'has'] + no-unused-components: + severity: error + no-empty-servers: off + no-invalid-media-type-examples: + severity: error + +decorators: {} + # Decorators modify the definition after validation is complete, only in the bundling process. + # This section can be omitted if you don't use decorators. diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..3a2ebcb --- /dev/null +++ b/turbo.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "ui": "stream", + "globalDependencies": ["turbo.json", "pnpm-workspace.yaml"], + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**"], + "outputLogs": "errors-only" + }, + "build:docker": { + "cache": false + }, + "lint": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "lint:fix": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "lint:openapi": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "format": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "format:fix": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "type-check": { + "dependsOn": ["^build"], + "outputLogs": "errors-only" + }, + "test": { + "dependsOn": [], + "outputLogs": "errors-only" + }, + "e2e": { + "dependsOn": [], + "cache": false + }, + "check-dist": { + "dependsOn": ["build"], + "outputs": [] + } + } +} From 51ee1acba435164e9a5d130c3393cafbabb06ac6 Mon Sep 17 00:00:00 2001 From: CptSchnitz <12687466+CptSchnitz@users.noreply.github.com> Date: Sun, 23 Aug 2026 10:39:17 +0300 Subject: [PATCH 2/2] docs: add monorepo migration issue tracker --- .../issues/01-scaffold-monorepo.md | 21 ++++++ .../02-move-projects-into-workspaces.md | 25 +++++++ .../issues/03-pull-request-ci.md | 20 ++++++ .../issues/04-specification-package.md | 27 +++++++ .../05-container-image-pruned-workspace.md | 25 +++++++ .../issues/06-e2e-suite-branch-gate.md | 24 +++++++ .../issues/07-umbrella-chart.md | 26 +++++++ .../issues/08-release-configuration.md | 23 ++++++ .../issues/09-manager-delivery-pipeline.md | 22 ++++++ .../issues/10-sdk-publishing.md | 20 ++++++ .../issues/11-unused-code-detection.md | 17 +++++ .../issues/12-e2e-lint-adoption.md | 18 +++++ .../issues/13-housekeeping.md | 22 ++++++ .scratch/monorepo-migration/stack.md | 71 +++++++++++++++++++ 14 files changed, 361 insertions(+) create mode 100644 .scratch/monorepo-migration/issues/01-scaffold-monorepo.md create mode 100644 .scratch/monorepo-migration/issues/02-move-projects-into-workspaces.md create mode 100644 .scratch/monorepo-migration/issues/03-pull-request-ci.md create mode 100644 .scratch/monorepo-migration/issues/04-specification-package.md create mode 100644 .scratch/monorepo-migration/issues/05-container-image-pruned-workspace.md create mode 100644 .scratch/monorepo-migration/issues/06-e2e-suite-branch-gate.md create mode 100644 .scratch/monorepo-migration/issues/07-umbrella-chart.md create mode 100644 .scratch/monorepo-migration/issues/08-release-configuration.md create mode 100644 .scratch/monorepo-migration/issues/09-manager-delivery-pipeline.md create mode 100644 .scratch/monorepo-migration/issues/10-sdk-publishing.md create mode 100644 .scratch/monorepo-migration/issues/11-unused-code-detection.md create mode 100644 .scratch/monorepo-migration/issues/12-e2e-lint-adoption.md create mode 100644 .scratch/monorepo-migration/issues/13-housekeeping.md create mode 100644 .scratch/monorepo-migration/stack.md diff --git a/.scratch/monorepo-migration/issues/01-scaffold-monorepo.md b/.scratch/monorepo-migration/issues/01-scaffold-monorepo.md new file mode 100644 index 0000000..42e0a3d --- /dev/null +++ b/.scratch/monorepo-migration/issues/01-scaffold-monorepo.md @@ -0,0 +1,21 @@ +# 01: Scaffold the monorepo + +**What to build:** A clone of this repository installs and verifies itself with one command, before any product code exists. Clean clone, one install, then a single entry point that lints, formats, type-checks, builds and tests the whole workspace — all green, because there is nothing in it yet to check. One Node version is declared and nothing in the repository contradicts it. A malformed commit message is rejected locally. + +This is the seam every later ticket hangs off: every check in this stack is a turbo task reached through this one entry point, locally and in continuous integration alike. + +**Blocked by:** None (can start immediately). + +**Branch:** `migration/01-scaffold`, layer 1 of 13, based on `master`, the trunk. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] Install succeeds on a clean clone, and the repository accepts only pnpm as its package manager. +- [ ] The task vocabulary the rest of the stack depends on exists and is a no-op: build, container build, lint, lint fix, format, type-check, test, e2e, specification lint, package validation, unused-code detection. +- [ ] Task names are the ones carried over from the source repositories, plus type-check and e2e, which the reference monorepo lacks. +- [ ] Turbo drives every task, and every task is invoked through the single root entry point rather than beside it. +- [ ] Exactly one Node version is declared for the repository and the engine requirement agrees with it. The reference monorepo contradicts itself here — do not inherit that. +- [ ] Commit tooling rejects a message with no conventional type; formatting and editor configuration apply repository-wide. +- [ ] Specification-linting configuration sits at the root, ready for the specification package to point at. +- [ ] No dependency catalog is introduced. A catalog holds one version per entry and the workspaces currently disagree on several; it arrives with the version-alignment work so that adding an entry and aligning a version are the same change. +- [ ] The work sits on `migration/01-scaffold` as layer 1 of the stack, its pull request is based on `master`, the trunk, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/02-move-projects-into-workspaces.md b/.scratch/monorepo-migration/issues/02-move-projects-into-workspaces.md new file mode 100644 index 0000000..29bd27f --- /dev/null +++ b/.scratch/monorepo-migration/issues/02-move-projects-into-workspaces.md @@ -0,0 +1,25 @@ +# 02: Move the three projects in as workspaces + +**What to build:** All three Jobnik projects live in this repository and are verified from here. The manager is an application; the SDK is a package; the e2e suite is its own top-level workspace and deliberately **not** an application, so that "application" can mean "deployed service" without exception — the container build matrix relies on that. + +Package names are unchanged from the source repositories. This is load-bearing rather than cosmetic: the build matrix later derives the image name from the manager's package name, so keeping the name keeps the image name for free. + +Dependency versions are not touched. The workspaces disagree on several today; aligning them is separate work, and keeping it out is what makes this stack reviewable. + +**Precondition (human):** the three source repositories are frozen before anything is imported, and the imported commit of each is recorded in this ticket. The e2e suite is the fastest-moving of the three, which is why the freeze must precede the move rather than follow it. + +**Blocked by:** 01 (scaffold the monorepo). + +**Branch:** `migration/02-move-workspaces`, layer 2 of 13, based on `migration/01-scaffold`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The three source repositories are frozen, and the commit imported from each is recorded in this ticket. +- [ ] Manager, SDK and e2e suite each install from this repository and run their own lint, type-check and tests through the single entry point. +- [ ] One lockfile for the whole repository; no per-project lockfiles remain. +- [ ] Package names are identical to the source repositories. +- [ ] The e2e suite resolves the SDK through the workspace. Its published-version pin is gone — it was a major behind what the SDK actually ships, so the suite has been testing stale code. +- [ ] The manager's integration tests provision their own database exactly as they do now, unchanged. Their compose file stays inside the manager's workspace and there is **no** compose file at the repository root: the container tool's upward search from the manager's test directory is what makes those tests work, and a file at the root would capture it. +- [ ] No dependency version changed as part of the move. +- [ ] The e2e workspace is not an application. +- [ ] The work sits on `migration/02-move-workspaces` as layer 2 of the stack, its pull request is based on `migration/01-scaffold`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/03-pull-request-ci.md b/.scratch/monorepo-migration/issues/03-pull-request-ci.md new file mode 100644 index 0000000..c8b4af2 --- /dev/null +++ b/.scratch/monorepo-migration/issues/03-pull-request-ci.md @@ -0,0 +1,20 @@ +# 03: Verify every pull request through one workflow + +**What to build:** A developer opening a pull request gets everything they touched linted, formatted, type-checked and tested, and nothing they did not touch. One workflow, reaching every check through the single entry point, with change detection scoping the work to what actually moved so that verification is fast enough to trust. + +The reference monorepo's pull-request workflow is missing type-checking, a formatting check and chart linting that the manager has today. Those are carried over deliberately rather than inherited away. + +**Blocked by:** 02 (move the three projects in as workspaces). + +**Branch:** `migration/03-pull-request-ci`, layer 3 of 13, based on `migration/02-move-workspaces`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] A pull request touching only the SDK does not run the manager's tasks. +- [ ] Lint, formatting check, type-check, unit tests, integration tests, specification lint and chart lint all run. +- [ ] Type-checking, the formatting check and chart linting are present — all three are absent from the reference monorepo's workflow. +- [ ] The manager's coverage reporting is preserved. +- [ ] Change detection compares against the pull request's base branch, and the build cache is shared between runs. +- [ ] A deliberately introduced lint error, type error and failing test each fail the run. +- [ ] Node is set up from the repository's single declared version, not from a version pinned in the workflow. +- [ ] The work sits on `migration/03-pull-request-ci` as layer 3 of the stack, its pull request is based on `migration/02-move-workspaces`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/04-specification-package.md b/.scratch/monorepo-migration/issues/04-specification-package.md new file mode 100644 index 0000000..f20dc84 --- /dev/null +++ b/.scratch/monorepo-migration/issues/04-specification-package.md @@ -0,0 +1,27 @@ +# 04: Make the specification exist exactly once + +**What to build:** The OpenAPI specification exists in one place, and a half-applied change to it cannot reach the default branch. + +A single private, unscoped workspace package owns the specification, its versioned build, its lint task and its generated type declaration, shaped as a real importable module with explicit exports. + +The manager takes it as a runtime dependency, imports its request and response types from it, and resolves the specification file through the module system rather than through a copied asset. The manager's own generated type declaration and generation script are deleted. + +The SDK takes it as a development-time dependency only, because the SDK is published and this package is not. The SDK keeps its own generation script: that script rewrites the job, stage and task identifier schemas into branded types, so its output is SDK-specific and cannot be shared with the manager. Its generated output stays committed. The SDK continues to copy the specification into its build output, because it parses the specification at runtime and therefore ships it. + +A continuous-integration job reruns both generators and fails if anything differs from what is committed. This is the one genuinely new test in the migration. + +**Blocked by:** 03 (verify every pull request through one workflow). + +**Branch:** `migration/04-openapi-package`, layer 4 of 13, based on `migration/03-pull-request-ci`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] Exactly one copy of the specification exists in the repository. Before this ticket there were two, byte-identical at 2732 lines, hand-maintained across two repositories. +- [ ] The manager serves and validates against the specification resolved through the package, not through a copied file, and its own generated declaration and generation script are gone. +- [ ] The SDK's build output still contains the specification file, and the SDK still parses it at runtime. +- [ ] Job, stage and task identifiers are still branded in the SDK's generated types, so they stay impossible to confuse. +- [ ] Editing a schema without regenerating fails continuous integration; regenerating makes it pass. +- [ ] Specification linting runs from the package. +- [ ] The specification, the manager and the SDK can be changed in a single pull request and reviewed as one unit. +- [ ] The manager's and the SDK's existing suites pass unchanged. +- [ ] The work sits on `migration/04-openapi-package` as layer 4 of the stack, its pull request is based on `migration/03-pull-request-ci`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/05-container-image-pruned-workspace.md b/.scratch/monorepo-migration/issues/05-container-image-pruned-workspace.md new file mode 100644 index 0000000..2496481 --- /dev/null +++ b/.scratch/monorepo-migration/issues/05-container-image-pruned-workspace.md @@ -0,0 +1,25 @@ +# 05: Build the manager image from a pruned workspace + +**What to build:** The manager's container image is built from a pruned workspace with a cached dependency store, so builds are faster and the image contains only what the service needs. The deployed image behaves exactly as it does today, including running database migrations. + +Follow the reference monorepo's backend image, minus its policy-engine download: prune the workspace to the manager, install from a cached store, build, then deploy production dependencies only. + +Every database-tooling quirk is preserved verbatim, including the step whose only apparent purpose is to pull the migration command-line tool into the runtime image. That is not cosmetic — the e2e composition runs migrations through it. The existing runtime base image is kept, because the generated database client already targets its libc. + +The image is the artifact, so the test is running it. + +**Blocked by:** 04 (make the specification exist exactly once). + +**Branch:** `migration/05-container-image`, layer 5 of 13, based on `migration/04-openapi-package`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The image builds from a clean checkout of the monorepo, installing only what the manager needs. +- [ ] The migration command runs successfully inside the built image against a throwaway database. +- [ ] The container starts and reports liveness, with the same entrypoint and memory settings as today. +- [ ] Only production dependencies are present in the runtime layer. +- [ ] The runtime base image is unchanged, and the migration command-line tool is present in it. +- [ ] The specification the manager resolves through the module system is present in the image. +- [ ] The manager declares which image definition builds it, so a build matrix can find it without anything hardcoded. +- [ ] Rebuilding with no source change reuses the cached dependency store. +- [ ] The work sits on `migration/05-container-image` as layer 5 of the stack, its pull request is based on `migration/04-openapi-package`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/06-e2e-suite-branch-gate.md b/.scratch/monorepo-migration/issues/06-e2e-suite-branch-gate.md new file mode 100644 index 0000000..0bc1695 --- /dev/null +++ b/.scratch/monorepo-migration/issues/06-e2e-suite-branch-gate.md @@ -0,0 +1,24 @@ +# 06: Make the e2e suite a gate on unreleased code + +**What to build:** A developer learns about a broken interaction before release rather than after. The suite runs against their branch: it builds the manager image from the checkout using the same definition that ships to production, and it exercises the SDK resolved from the workspace, so it can never silently test a stale published version again. + +The cross-repository composite action is replaced by a local one. All the machinery that exists purely because the repositories were separate goes away: no checking out other repositories into subdirectories, no packing the SDK, no resolving versions from outside the checkout. Note that the old action checks out the other two repositories at their default branch (or a passed commit) — there is no release-tag resolution to remove; the staleness came from the suite's published-version dependency pin, which ticket 02 replaced. + +Both composition services that build the manager — the service itself and the migration runner — switch to the pruned build. + +The composition file stays inside the e2e workspace and must never move to the repository root: the manager's integration tests start a database by asking the container tool to resolve a composition file from a directory that has none, relying on the upward search finding the manager's own. A file at the root would capture that search. + +**Blocked by:** 05 (build the manager image from a pruned workspace). + +**Branch:** `migration/06-e2e-gate`, layer 6 of 13, based on `migration/05-container-image`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The suite runs in continuous integration against an image built from the pull request's checkout, by the same definition that ships to production. +- [ ] The SDK under test is the workspace SDK. No published version is installed and nothing is packed. +- [ ] No other repository is checked out. +- [ ] Both manager-building composition services use the pruned build. +- [ ] The suite is triggered by a change to any workspace it depends on, and is not scheduled. +- [ ] The composition file is still inside the e2e workspace, and the manager's integration tests are unaffected. +- [ ] The suite is reachable as a task through the single entry point, locally as well as in continuous integration. +- [ ] The work sits on `migration/06-e2e-gate` as layer 6 of the stack, its pull request is based on `migration/05-container-image`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/07-umbrella-chart.md b/.scratch/monorepo-migration/issues/07-umbrella-chart.md new file mode 100644 index 0000000..820dac5 --- /dev/null +++ b/.scratch/monorepo-migration/issues/07-umbrella-chart.md @@ -0,0 +1,26 @@ +# 07: Publish the chart under the product name + +**What to build:** The published chart becomes the product name, so it has somewhere to grow when a second deployable component arrives, with the manager as a conditioned subchart. No Kubernetes object changes its name, so the first deployment after the migration is an ordinary rolling update. + +The subchart keeps its current name. This is the critical detail: the manager's deployment selector is built from the chart name, and deployment selectors are immutable, so renaming the subchart would delete and recreate the running workload. Renaming only the umbrella leaves every selector untouched. + +The database secret stays in the subchart until a second component needs it. + +The values live in the deployment-configuration repository, so a matching change there lands with this ticket and with ticket 09: the chart reference and its pinned versions, and the manager's values nested under a parent key to match the umbrella, including the name override that keeps object names stable. The image reference is unchanged. + +Verification is a one-time migration check — a recorded comparison against the pre-migration render — not a permanent job. The recurring protection is chart linting, carried over in ticket 03. + +**Blocked by:** 02 (move the three projects in as workspaces). + +**Branch:** `migration/07-umbrella-chart`, layer 7 of 13, based on `migration/06-e2e-gate`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] Chart dependencies build and the chart lints. +- [ ] The rendered umbrella — manager values nested, name override applied — diffed against the pre-migration render shows no difference beyond chart metadata, and the comparison is recorded in this ticket. +- [ ] The manager's deployment selector is byte-identical to the pre-migration one, and no object changes name. +- [ ] The subchart keeps the manager's current name; only the umbrella is named for the product. +- [ ] The database secret still lives in the subchart. +- [ ] The manager is a conditioned subchart, so it can be disabled independently once a second component exists. +- [ ] The corresponding deployment-configuration change is prepared and referenced from this ticket, ready to land alongside ticket 09. +- [ ] The work sits on `migration/07-umbrella-chart` as layer 7 of the stack, its pull request is based on `migration/06-e2e-gate`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/08-release-configuration.md b/.scratch/monorepo-migration/issues/08-release-configuration.md new file mode 100644 index 0000000..50d8a24 --- /dev/null +++ b/.scratch/monorepo-migration/issues/08-release-configuration.md @@ -0,0 +1,23 @@ +# 08: Configure two version lines + +**What to build:** A deployment is described by a single number, and the SDK is not dragged along by it. + +The manager, the specification package and the repository root move together under one version line. The SDK keeps its own, because it is past 1.0 with external consumers: sharing a line would ship it releases containing no SDK changes and force its consumers through a major for a change to a service they do not use. + +Neither source repository used component-scoped tags, so a fresh repository has no tags to read. Every component's version is seeded by hand at its current value, so the new repository does not restart versioning from zero. + +Changelog sections reflect the commit types the team already uses, so release notes stay readable. Commit scopes are validated against the actual workspace names, with the release and dependency scopes allowed explicitly, so changelog entries land under the right component. + +**Blocked by:** 07 (publish the chart under the product name). + +**Branch:** `migration/08-release-config`, layer 8 of 13, based on `migration/07-umbrella-chart`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The manager, the specification package and the repository root share one version; the SDK has its own line and its own tag. +- [ ] Every component's version is seeded at its current value; nothing starts at zero. +- [ ] A release run bumps the chart versions and the specification's declared version along with the code. +- [ ] A commit whose scope is not a workspace name is rejected; workspace scopes plus the release and dependency scopes are accepted. +- [ ] Changelog sections match the commit types the team uses, with the noise-only types hidden. +- [ ] A dry run produces one release pull request for the shared line and a separate one for the SDK. +- [ ] The work sits on `migration/08-release-config` as layer 8 of the stack, its pull request is based on `migration/07-umbrella-chart`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/09-manager-delivery-pipeline.md b/.scratch/monorepo-migration/issues/09-manager-delivery-pipeline.md new file mode 100644 index 0000000..de0ed13 --- /dev/null +++ b/.scratch/monorepo-migration/issues/09-manager-delivery-pipeline.md @@ -0,0 +1,22 @@ +# 09: Keep delivery working, driven by a generated matrix + +**What to build:** Releases stay as automated as they are today, with only the container build step replaced. The existing pipeline's branch and prerelease tracks and the job that opens deployment-configuration pull requests are kept exactly as they stand — the reference monorepo has no equivalent of that automation, so adopting its pipeline wholesale would be a regression. These pull requests are a merge of the two pipelines, not a copy of either. + +The container build becomes a generated matrix over the deployed applications. That is what makes the image name, the chart name and the deployment-configuration target all resolve correctly with nothing hardcoded: the image name comes from the manager's package name, which ticket 02 kept unchanged. Adding a second deployable service then requires no pipeline change. + +The chart pushed is now the umbrella. The deployment-configuration change prepared in ticket 07 lands together with this ticket. + +**Blocked by:** 05 (build the manager image from a pruned workspace), 08 (configure two version lines). + +**Branch:** `migration/09-delivery-pipeline`, layer 9 of 13, based on `migration/08-release-config`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The image is pushed under its current name, with the same tag scheme, for every track: branch push, prerelease release and stable release. +- [ ] The chart is pushed under the product name at the released version. +- [ ] The deployment-configuration pull request is still opened per track with the same labels and target paths, and the stable-release housekeeping that syncs the other environments still runs. +- [ ] The dormant prerelease and branch-based paths are carried over as they are, not finished and not removed. +- [ ] Adding another deployable application to the matrix requires no change to the pipeline. +- [ ] Nothing in the pipeline hardcodes the image name, the chart name or the deployment-configuration target. +- [ ] The deployment-configuration change lands with this ticket, and the first deployment afterwards is an ordinary rolling update rather than a delete and recreate. +- [ ] The work sits on `migration/09-delivery-pipeline` as layer 9 of the stack, its pull request is based on `migration/08-release-config`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/10-sdk-publishing.md b/.scratch/monorepo-migration/issues/10-sdk-publishing.md new file mode 100644 index 0000000..0f49057 --- /dev/null +++ b/.scratch/monorepo-migration/issues/10-sdk-publishing.md @@ -0,0 +1,20 @@ +# 10: Publish the SDK from its own tag, validated + +**What to build:** Publishing is a consequence of releasing rather than a manual step: pushing the SDK's own tag publishes it. A package that would break consumers cannot be published, because packaging and type resolution are validated first — this is the only published package in the repository. + +The installed package stays self-contained: nothing in it points at the specification package, which is private and was never published, and the specification it parses at runtime ships inside it. + +Package metadata points at the repository that now holds the source, so the links on the registry page work. + +**Blocked by:** 08 (configure two version lines). + +**Branch:** `migration/10-sdk-publish`, layer 10 of 13, based on `migration/09-delivery-pipeline`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] Pushing the SDK's tag publishes it; pushing the shared line's tag does not. +- [ ] Packaging and type-resolution validation runs before publish and fails the job on a problem. +- [ ] A dry-run pack contains the build output and the specification file, and declares no dependency on an unpublished package. +- [ ] Repository, homepage and issue links point at this repository. +- [ ] The validation is reachable as a task through the single entry point, so it can be run before tagging. +- [ ] The work sits on `migration/10-sdk-publish` as layer 10 of the stack, its pull request is based on `migration/09-delivery-pipeline`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/11-unused-code-detection.md b/.scratch/monorepo-migration/issues/11-unused-code-detection.md new file mode 100644 index 0000000..0af85f4 --- /dev/null +++ b/.scratch/monorepo-migration/issues/11-unused-code-detection.md @@ -0,0 +1,17 @@ +# 11: Report unused files, exports and dependencies + +**What to build:** Consolidating three repositories does not quietly accumulate dead weight. Unused files, exports and dependencies are reported automatically on every pull request, across all workspaces. + +Known-legitimate exceptions are declared specifically rather than suppressed wholesale: entry points loaded only at runtime, generated output, and binaries invoked from scripts. + +**Blocked by:** 04 (make the specification exist exactly once) — that ticket settles the final export and dependency shape, which is what the configuration has to describe. + +**Branch:** `migration/11-knip`, layer 11 of 13, based on `migration/10-sdk-publish`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The report is clean across every workspace on the migrated tree. +- [ ] An unused dependency or an unreferenced export added deliberately is reported. +- [ ] Runtime-only entry points, generated output and script-invoked binaries are declared as such, not blanket-ignored. +- [ ] It runs on pull requests through the single entry point. +- [ ] The work sits on `migration/11-knip` as layer 11 of the stack, its pull request is based on `migration/10-sdk-publish`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/12-e2e-lint-adoption.md b/.scratch/monorepo-migration/issues/12-e2e-lint-adoption.md new file mode 100644 index 0000000..eefb13e --- /dev/null +++ b/.scratch/monorepo-migration/issues/12-e2e-lint-adoption.md @@ -0,0 +1,18 @@ +# 12: Lint and format the e2e suite for the first time + +**What to build:** One command lints, formats, type-checks and tests everything, with no workspace exempt. The e2e suite has never been linted or formatted and uses a quote style contrary to the shared configuration, so the mechanical reformat is enormous. + +The reformat is separated from the lint fixes so neither buries the other: one commit is formatting only, a second carries the lint fixes. The suite's dependency versions are not aligned here — that is out of scope for this stack. + +**Blocked by:** 06 (make the e2e suite a gate on unreleased code) — the machinery changes touch the same files, so reformatting after them avoids a pointless conflict. + +**Branch:** `migration/12-e2e-lint`, layer 12 of 13, based on `migration/11-knip`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] The e2e workspace is covered by the same lint and format tasks as every other workspace, and both pass. +- [ ] The formatting commit contains no behavioural change, reproducible by rerunning the formatter against its parent commit. +- [ ] The lint fixes are in a commit of their own, separate from the reformat. +- [ ] The e2e suite still passes after both commits. +- [ ] No dependency version changed. +- [ ] The work sits on `migration/12-e2e-lint` as layer 12 of the stack, its pull request is based on `migration/11-knip`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/issues/13-housekeeping.md b/.scratch/monorepo-migration/issues/13-housekeeping.md new file mode 100644 index 0000000..735df3f --- /dev/null +++ b/.scratch/monorepo-migration/issues/13-housekeeping.md @@ -0,0 +1,22 @@ +# 13: Leave one repository a newcomer can pick up + +**What to build:** A developer new to Jobnik clones one repository, runs one install command, and can build and test the whole product on their first day. Dependency updates arrive as one stream instead of three. Generated documentation covers the SDK only — the manager's public interface is its specification, not its source. + +Leftovers from three separate repositories are gone, including the service-catalog descriptors, which are not carried over. + +Once the stack has landed, the three source repositories are archived, each pointing here. + +**Blocked by:** 01 through 12 (the whole stack). + +**Branch:** `migration/13-housekeeping`, layer 13 of 13, based on `migration/12-e2e-lint`. Stack conventions: `../stack.md`. + +**Status:** ready-for-agent + +- [ ] From a fresh clone, one install and one command lint, format, type-check, build and test everything. +- [ ] The README describes the workspace layout and that single command. +- [ ] One dependency-update configuration covers the repository. +- [ ] Documentation generation covers the SDK only. +- [ ] Service-catalog descriptors and other per-repository leftovers are removed. +- [ ] The three source repositories are archived, each pointing at this one. (Human step.) +- [ ] The deliberately excluded follow-up work is filed rather than forgotten: dependency version alignment with the catalog it introduces, the Grafana dashboards, the prerelease and branch-based release flow, moving the database secret to the umbrella, unifying how the manager's integration tests and the e2e suite provision databases. +- [ ] The work sits on `migration/13-housekeeping` as layer 13 of the stack, its pull request is based on `migration/12-e2e-lint`, and that pull request's own diff contains nothing from the layers below it. diff --git a/.scratch/monorepo-migration/stack.md b/.scratch/monorepo-migration/stack.md new file mode 100644 index 0000000..fa50849 --- /dev/null +++ b/.scratch/monorepo-migration/stack.md @@ -0,0 +1,71 @@ +# Delivery: one stacked pull request per ticket + +The spec calls for "a stack of small pull requests that land together, so each is reviewable on its own". That is a `gh stack` stack: an ordered list of branches rooted on `master`, each branch based on the one below it, each with one pull request whose base is the branch below — so a reviewer sees only that layer's diff. Use the `gh-stack` skill for the mechanics; this file records the layout and the conventions specific to this migration. + +## Layout + +Trunk is `master`. Layers bottom to top, matching the ticket numbers: + +| Layer | Branch | Ticket | +| ----- | -------------------------------- | ------------------------------------------------------ | +| 1 | `migration/01-scaffold` | 01 Scaffold the monorepo | +| 2 | `migration/02-move-workspaces` | 02 Move the three projects in as workspaces | +| 3 | `migration/03-pull-request-ci` | 03 Verify every pull request through one workflow | +| 4 | `migration/04-openapi-package` | 04 Make the specification exist exactly once | +| 5 | `migration/05-container-image` | 05 Build the manager image from a pruned workspace | +| 6 | `migration/06-e2e-gate` | 06 Make the e2e suite a gate on unreleased code | +| 7 | `migration/07-umbrella-chart` | 07 Publish the chart under the product name | +| 8 | `migration/08-release-config` | 08 Configure two version lines | +| 9 | `migration/09-delivery-pipeline` | 09 Keep delivery working, driven by a generated matrix | +| 10 | `migration/10-sdk-publish` | 10 Publish the SDK from its own tag, validated | +| 11 | `migration/11-knip` | 11 Report unused files, exports and dependencies | +| 12 | `migration/12-e2e-lint` | 12 Lint and format the e2e suite for the first time | +| 13 | `migration/13-housekeeping` | 13 Leave one repository a newcomer can pick up | + +## Stack order is not the same as the blocking graph + +A stack is linear; the tickets' blocking edges are not. Two lines are genuinely independent — continuous integration, the specification package, the container image and the e2e gate on one side; the chart, release configuration and delivery on the other — and they rejoin at layer 9, which needs both. The stack order is a linearisation of that graph, so it is a superset of the real dependencies: layer 7 sits above layer 6 because a stack has to put it somewhere, not because the chart needs the e2e gate. + +The consequence to remember: **the `Blocked by` line in each ticket, not the layer number, tells you what actually has to be correct before the work makes sense.** If a layer turns out to depend on nothing below it, that is expected — do not go looking for a dependency to justify the position. + +## Working a ticket + +Each ticket ends with its branch pushed and its pull request submitted at its layer. + +Bottom layer, once: + +```bash +gh stack init migration/01-scaffold # trunk is the default branch +``` + +Every later layer — from the branch below it: + +```bash +gh stack checkout migration/02-move-workspaces # or: gh stack top +gh stack add migration/03-pull-request-ci # creates and switches +# ... do the work, commit ... +gh stack submit --auto # pushes and opens the PRs +``` + +Fixing a lower layer instead of working around it at the current one: + +```bash +gh stack down # or: gh stack checkout +# ... fix, commit ... +gh stack rebase --upstack # replay every layer above +gh stack push +``` + +When `master` moves under the stack: `gh stack sync --prune`. + +## Landing + +The stack lands as a unit: `gh stack merge --yes` merges bottom to top atomically — if any pull request cannot merge, none do. `gh pr merge` does not work on a stacked pull request. Scope a partial landing by pull request number (`gh stack merge --yes` merges everything up to and including it), which is how to land the lower layers early if review of the upper ones drags. + +## Conventions + +- Commit scopes must be workspace names once layer 8 lands (with the release and dependency scopes allowed). Before that, keep scopes consistent with what layer 8 will accept, so history does not need rewriting. +- `gh stack view --json` — never bare `gh stack view`, which opens a TUI. `gh stack submit --auto` — never bare `submit`, which prompts per pull request. Always pass branch names positionally to `init`, `add` and `checkout`. +- `--auto` opens drafts; add `--open` to submit ready for review. Each layer is meant to be reviewable on its own, so open for review once its own acceptance criteria pass. +- If `gh stack checkout ` hits an unbypassable conflict prompt because different local tracking state exists, run `gh stack unstack --local` first — that clears local state and leaves the stack on GitHub intact. +- One stack, one story: nothing outside this migration goes into these layers. Dependency version alignment in particular is separate work and a separate stack.