diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index ebb8eb4..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 -updates: - - package-ecosystem: cargo - directory: / - schedule: - interval: weekly - - package-ecosystem: npm - directory: / - schedule: - interval: weekly - - package-ecosystem: github-actions - directory: / - schedule: - interval: weekly diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..f12ec72 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended"], + "schedule": ["before 6am on Monday"], + "automerge": false, + "dependencyDashboard": true, + "labels": ["dependencies"], + "prConcurrentLimit": 5, + "vulnerabilityAlerts": { + "enabled": true, + "automerge": false + }, + "packageRules": [ + { + "description": "Los saltos major no se fusionan solos.", + "matchUpdateTypes": ["major"], + "automerge": false, + "labels": ["dependencies", "major"] + } + ] +} diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json deleted file mode 100644 index a285ff1..0000000 --- a/apps/web/package-lock.json +++ /dev/null @@ -1,1289 +0,0 @@ -{ - "name": "@archmaker/web", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@archmaker/web", - "version": "0.1.0", - "license": "Apache-2.0", - "dependencies": { - "@tauri-apps/api": "^2" - }, - "devDependencies": { - "@axe-core/playwright": "^4.13.0", - "@playwright/test": "^1.63.0", - "pixelmatch": "^8.0.0", - "playwright": "^1.63.0", - "pngjs": "^7.0.0", - "typescript": "^5.6.0", - "vite": "^6.0.0" - } - }, - "node_modules/@axe-core/playwright": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.13.0.tgz", - "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "axe-core": "~4.13.0" - }, - "peerDependencies": { - "playwright-core": ">= 1.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@playwright/test": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", - "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright": "1.63.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.0.tgz", - "integrity": "sha512-FLLpX941CD/7aBvX3GqLGBM9OvY5PGXTryPJkG5r5/OuBpZpV5k45Uo3RxAvqd35tsyc3hH1bhtz921IKzoIzg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.0.tgz", - "integrity": "sha512-iI32XM/jnDYJsvx5ai/za/7gWO9XoSeFFtU06/ZCaRgyilfJOjaopD3nOpk2WrTCGOyeDt4hleUiGOAnd5tHNg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.0.tgz", - "integrity": "sha512-dRBZlbt2sEtF8Mn4MODThze9fIPdDoOhVSlXMAKy5dQbOYK9pOOoPY4Fat3OTtr0+8zbJo5TTZwlsfxY/kDNJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.0.tgz", - "integrity": "sha512-Y3whrJOMucfkhgNkvcM93M6j8C53iEAMmPMYD99C6G1kUy4ELigLWk9ar2/4aCBSRgsql0zdlOemLgW2m5GZgQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.0.tgz", - "integrity": "sha512-S6S1GEzPjFF6IONYJX3AKt/799+8RgBgCcwRnUo+Ep1IvBxUbw5M51iU0TDdK2NWWVnSvCQ8yi6Em0fGASMOng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.0.tgz", - "integrity": "sha512-Ed1DPoFENkXj4IGzSB12SesV40iP6LxCCrbTIkSGIQBpOOxpBM+0kj62lmaeIHfMWTDoddqTOtqc7s8LYfn+Pw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.0.tgz", - "integrity": "sha512-J/6xhutJPtFyIkmHdf4olOdHHKH5kOJNumojdWn+Elv5ICEYTVOa362Vw27TxsK0BLzb1le3EDlO3UbvFK1lnQ==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.0.tgz", - "integrity": "sha512-G4L/Nnx59d2LvDoV/P4S5lZ7oVLT6hodOHMacqjiq2LL2gts86KbkEBTYL53+fBt0odhf7XPIbIATGoYiJctxg==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.0.tgz", - "integrity": "sha512-zF16pvJDEUksGYRbfnXne7pdklAyj2XDmJeYKgP93oq0cUyX9Y8O7lUo1R+IY1GagP/YBvCEDCe7eEcAKpw//g==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.0.tgz", - "integrity": "sha512-nIggWn8n+w12+R5lsV+PYYoUY8vuObxPAQqJI7WES+9v0qspYuAHoZMfYM0yLxlipasT5BY9ht5W8t5c/rSCkg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.0.tgz", - "integrity": "sha512-WLOTiHPzszP0dxIMsHpFeDSOSB5I49Mj8K4+yKE3H1X/D0JRG5XZ5jrctJLMjnUc/LUzaKiwq6EHWNJ8pup8PA==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.0.tgz", - "integrity": "sha512-35RK9aRhh7g7Pmeu5gQ01aCvrhXzj9LoBE6xtUcEH1ns+nyTaSzxSpADmBQINu4QiTDGvmQYwo1j5hlg1rRXFw==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.0.tgz", - "integrity": "sha512-RqTfnpoTjuWfPAmqK5p2edt2AMCDJWm6oTn7sKfmyx+6tRga0ip05SJ977o6udTcIiDeF/CJMUfkaN4gtWt6Aw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.0.tgz", - "integrity": "sha512-RQjZPigjxFvFZDijG6rjlSXxhRaTf9zLYVpGK+lVcga64oMqP1GbgVqCb46eHTTceSIgp89Ja0y5aPe3GFBYHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.0.tgz", - "integrity": "sha512-tjL58mgQcTRnDRpeky+Sth1MKQeYi2Ct6r3Luq9E5aTSjnM/i/JbozqZkKqp9thM5+oDSZxo+05f9kdQedfTGA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.0.tgz", - "integrity": "sha512-ictoRyVaoZ8C67myHef+8hhCa6IplXJJ/xUCkVCxziV4zxMZh+jvhkhGsPBLqj1S72fnqD0QH5zL4lcaa4X7DQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.0.tgz", - "integrity": "sha512-8aVvZ2hfr9RLFzBQkQNmYeHLDja8fLeQAmLt757zdKN/B+8L809KlLJKctQjS22wZotptV8G6o7fVPuAs8S1tQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.0.tgz", - "integrity": "sha512-2dEF8GAcDKwshUfydD+GhosppNyBzhVUHkdFF3CXd3FpOkzj/RZzF5aoEtzklujklT5qFVRU2GK/cFeLaTNKVg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.0.tgz", - "integrity": "sha512-3XHTvoo2hKkh0MiOfS7SkhHjMaaWF7P4F3drocZZaho/Z8w7h/jpnuBHm91BOQLfvrKHs1yR+zir4E8RI3XzTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.0.tgz", - "integrity": "sha512-HKtkzodL4a3KFWDXDoO61cRynAWTR3LnAE0oGtfG9lcNFpNuVYUFOByxDgNqEvic9rvaQbAj+SFwTEWDptRaIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.0.tgz", - "integrity": "sha512-JBsxqiY16uyyCujtoC3s7zL+SrYyNElptD7K4V+KUoJ2V8/XG3hPWpheK+SuPwNh1cikJvIZmIdsrYXvD6PLJw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.0.tgz", - "integrity": "sha512-S5Qrijh37qhnUYQ0ay8WN3LuWeKjow7wTUyCOPMZtnXiBXYXdsZETI6ZLfYnQAKovltckPLBFdNeD61P2rJc7g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.0.tgz", - "integrity": "sha512-zbZ6iMmLFEsCtTdc2/y1F/cDFVNNCPF7Ae8PCT/wdPE//hGwYp6r+MyCLMFX+kOeIe09Pz6ASfnnfpSTN1FJQQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.0.tgz", - "integrity": "sha512-L6Hw69oNpuYaOr1zCG30v0/DqKYCSRwodPGwIcVZ/6f8SOzq9rxtL/xNVI5MO4wjli+Ko0ErK9uHJL3mNPt8wQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.0.tgz", - "integrity": "sha512-nl+CTWIgOGszQmUz/kanfgrfFZ4qiwxKIfT/ryl3N3Ewk5tqizmYtNXiqb7Bu/fDtNgu1kyxdFiAUJNur3iysg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tauri-apps/api": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.12.1.tgz", - "integrity": "sha512-DeyFHa3wynpyoqTDikDEDGTJIq4LQ5USfolQGRmGIWT6JMADyxZBTDa5cAdT3tDg73rUXufPaCwN7aXBos4OnQ==", - "license": "Apache-2.0 OR MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/axe-core": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", - "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", - "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pixelmatch": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-8.0.0.tgz", - "integrity": "sha512-cIqOLfh5k52us715qf3B3+kTOxZv+WDv77HN7xokLScYQGYQHi4m/ynoDIPpvF2LvCyUJGyvzY64i0QCXtzu1g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pngjs": "^7.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/playwright": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", - "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.63.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/pngjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", - "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.19.0" - } - }, - "node_modules/postcss": { - "version": "8.5.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.29.tgz", - "integrity": "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.19", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/rollup": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.0.tgz", - "integrity": "sha512-gjA/kFeDfffII8COoPsvLPvE16hWDTEc1+0QKQNKUkuV8iJjqsC4xXs8/FzuL0v9EV39kuxTbAgcFoTRyy2TGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.0", - "@rollup/rollup-android-arm64": "4.64.0", - "@rollup/rollup-darwin-arm64": "4.64.0", - "@rollup/rollup-darwin-x64": "4.64.0", - "@rollup/rollup-freebsd-arm64": "4.64.0", - "@rollup/rollup-freebsd-x64": "4.64.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.0", - "@rollup/rollup-linux-arm-musleabihf": "4.64.0", - "@rollup/rollup-linux-arm64-gnu": "4.64.0", - "@rollup/rollup-linux-arm64-musl": "4.64.0", - "@rollup/rollup-linux-loong64-gnu": "4.64.0", - "@rollup/rollup-linux-loong64-musl": "4.64.0", - "@rollup/rollup-linux-ppc64-gnu": "4.64.0", - "@rollup/rollup-linux-ppc64-musl": "4.64.0", - "@rollup/rollup-linux-riscv64-gnu": "4.64.0", - "@rollup/rollup-linux-riscv64-musl": "4.64.0", - "@rollup/rollup-linux-s390x-gnu": "4.64.0", - "@rollup/rollup-linux-x64-gnu": "4.64.0", - "@rollup/rollup-linux-x64-musl": "4.64.0", - "@rollup/rollup-openbsd-x64": "4.64.0", - "@rollup/rollup-openharmony-arm64": "4.64.0", - "@rollup/rollup-win32-arm64-msvc": "4.64.0", - "@rollup/rollup-win32-ia32-msvc": "4.64.0", - "@rollup/rollup-win32-x64-gnu": "4.64.0", - "@rollup/rollup-win32-x64-msvc": "4.64.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/source-map-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", - "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/vite": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.4.tgz", - "integrity": "sha512-xGjU/SyjeNyb0E4KxXBvYz/1C+3JXuujvf2hXNOtnlcE+58o5ajd9N2/n2VhkiJvpCP2qQasnUpx5PXNeI+p1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - } - } -} diff --git a/crates/archmaker-core/tests/negative_capabilities.rs b/crates/archmaker-core/tests/negative_capabilities.rs index 8dcae31..894a2ea 100644 --- a/crates/archmaker-core/tests/negative_capabilities.rs +++ b/crates/archmaker-core/tests/negative_capabilities.rs @@ -133,7 +133,8 @@ fn neg_capability_deny_by_default() { "solo los 8 comandos CorePort v0+MVP-1" ); - // Check main capability has empty permissions (auto-discovered from TOML) + // Lista vacía = denegación definitiva del slice. Los TOML definen + // identificadores core:* y no los conceden en el JSON. let raw = read_repo("src-tauri/capabilities/main.json"); let v: serde_json::Value = serde_json::from_str(&raw).expect("capability JSON invalido"); let windows = v["windows"].as_array().expect("windows debe ser lista"); @@ -145,7 +146,7 @@ fn neg_capability_deny_by_default() { assert_eq!( perms.len(), 0, - "permissions se definen en TOML, no en capability JSON" + "permissions vacia: denegacion definitiva; los TOML no conceden" ); // Check dialog and picker capabilities have empty permissions (reserved for v1) diff --git a/docs/00-governance/audit-baseline.md b/docs/00-governance/audit-baseline.md index ab791f1..40ed222 100644 --- a/docs/00-governance/audit-baseline.md +++ b/docs/00-governance/audit-baseline.md @@ -37,7 +37,9 @@ Registrar de forma inmutable el estado de partida de la remediación `planning-v ## Declaración de parada (semáforo rojo) -`init-work.sh` marcó **P0: posible secreto** en `reference/v5.1/App.tsx:180` e `reference/v5.1/index.html:203`. Inspección directa: ambas líneas contienen el token de diseño CSS `{ token: "--rh-red", hex: "#ee0000", oklch: "oklch(0.62 0.24 29)", usage: "primary action" }`. **Clasificación: falso positivo** — el escáner interpreta `token:` como asignación de credencial. No hay secreto y no se requiere rotación. Acción derivada: allowlist del patrón `token:` de tokens de diseño en el gate de escaneo (AUD-022). +`init-work.sh` marcó **P0: posible secreto** en `reference/v5.1/App.tsx:180` e `reference/v5.1/index.html:203`. Inspección directa: ambas líneas contienen el token de diseño CSS `{ token: "--rh-red", hex: "#ee0000", oklch: "oklch(0.62 0.24 29)", usage: "primary action" }`. **Clasificación: falso positivo** — el escáner interpreta `token:` como asignación de credencial. No hay secreto y no se requiere rotación. Acción derivada: allowlist estrecha del patrón `token:` de tokens de diseño en el gate de escaneo. El id AUD-022 del plan de remediación sigue siendo «Prove clean CI» y no es esta allowlist. + +Actualización 2026-10-14: el escáner global `plan-continue` ignora solo `token` cuyo valor es una custom property CSS (`--…`) o el handle de fixture `opaque-handle.json`. El mismo patrón sigue marcando contraseñas, `api_key` y el resto de asignaciones `token`. ## Hallazgos diff --git a/docs/04-interfaces/parity-review-evidence.md b/docs/04-interfaces/parity-review-evidence.md index b0736ab..331dee5 100644 --- a/docs/04-interfaces/parity-review-evidence.md +++ b/docs/04-interfaces/parity-review-evidence.md @@ -55,14 +55,14 @@ Alcance: walking skeleton MVP-0 (7 operaciones CorePort v0) ## 3. Tests negativos de protocolo y capacidades (AM-PROTO-001/002) -| Escenario | Ventana/Comando | Código esperado | Test | -| ------------------------------------------- | --------------------------------------------- | ------------------ | ------------------------------------------- | -| Comando permitido en ventana denegada | `dialog` → `export_artifact` | AM-PROTO-001 | `denied_invoke_returns_typed_proto_001` | -| Comando desconocido en ventana permitida | `main` → `import_draft` | AM-PROTO-002 | `unknown_command_returns_typed_proto_002` | -| Ventana desconocida | `attacker` → `create_draft` | AM-PROTO-002 | `unknown_window_returns_typed_proto_002` | -| JSON malformado | `main` → `create_draft` | AM-SCHEMA-001 | `malformed_json_returns_typed_schema_error` | -| Capacidad `main` solo 7 permisos | `src-tauri/capabilities/main.json` | 7 permisos exactos | `neg_capability_deny_by_default` | -| Capacidad `dialog`/`picker` deny-by-default | `src-tauri/capabilities/{dialog,picker}.json` | 0 permisos | `neg_capabilities` (5 tests) | +| Escenario | Ventana/Comando | Código esperado | Test | +| ------------------------------------------- | --------------------------------------------- | --------------------------------------------- | ------------------------------------------- | +| Comando permitido en ventana denegada | `dialog` → `export_artifact` | AM-PROTO-001 | `denied_invoke_returns_typed_proto_001` | +| Comando desconocido en ventana permitida | `main` → `import_draft` | AM-PROTO-002 | `unknown_command_returns_typed_proto_002` | +| Ventana desconocida | `attacker` → `create_draft` | AM-PROTO-002 | `unknown_window_returns_typed_proto_002` | +| JSON malformado | `main` → `create_draft` | AM-SCHEMA-001 | `malformed_json_returns_typed_schema_error` | +| Capacidad `main` con lista vacía | `src-tauri/capabilities/main.json` | 0 permisos JSON; 8 TOML `core:*` sin conceder | `neg_capability_deny_by_default` | +| Capacidad `dialog`/`picker` deny-by-default | `src-tauri/capabilities/{dialog,picker}.json` | 0 permisos | `neg_capabilities` (5 tests) | ## 4. Resultados de ejecución CI local (2026-10-06) diff --git a/docs/04-interfaces/tauri-commands.md b/docs/04-interfaces/tauri-commands.md index 0d66c3c..8b13511 100644 --- a/docs/04-interfaces/tauri-commands.md +++ b/docs/04-interfaces/tauri-commands.md @@ -54,9 +54,8 @@ fases posteriores. ## Capabilities por ventana -- MVP: una sola ventana `main` con los ocho comandos de la tabla (v0 + MVP-1). -- **Deny-by-default**: ninguna ventana recibe permisos implícitos; `main` declara solo los comandos - que invoca (ADR-0002). +- MVP: una sola ventana `main`. Los ocho comandos de la tabla (v0 + MVP-1) tienen identificador `core:*` en TOML. +- **Deny-by-default**: la lista `permissions` de `main.json` está vacía a propósito. Esa lista vacía es la denegación definitiva del slice; los TOML no se conceden solos (ADR-0002). - Ventanas futuras (no MVP) tendrán su propia capability separada; la ventana de plan/runner (v1) **no** incluirá `export_artifact` ni escritura fuera de su scope. - Sin `shell:*`, sidecars, root ni discos en el MVP. diff --git a/docs/08-security/negative-tests-evidence.md b/docs/08-security/negative-tests-evidence.md index 35376fc..f574a12 100644 --- a/docs/08-security/negative-tests-evidence.md +++ b/docs/08-security/negative-tests-evidence.md @@ -30,18 +30,18 @@ implementación de este corte consta abajo; el estado gobernable máximo alcanza ### Rust — `cargo test -p archmaker-core --test negative_capabilities`: 5/5 PASS -| Test | TST-NEG | Resultado | -| --------------------------------------------------------------------------------------------------------------- | ------------------ | --------- | -| `neg_fs_outside_scope_never_written` (handle `/etc/passwd` opaco, sin escritura, error `AM-*`, sin parcial) | 002, 003, 008 | PASS | -| `neg_errors_are_typed_catalog_codes` (`createDraft` denegado → `AM-SCHEMA-001` tipado) | 001 | PASS | -| `neg_capability_deny_by_default` (ventana `main`, 7 permisos `core:*`, `shell:*`+`updater` denegados) | 001, 004 | PASS | -| `neg_shell_blocked_in_tauri_conf` (CSP `default-src 'self'`, sin `unsafe-*`, devtools off) | 004, 005 | PASS | -| `neg_web_has_no_remote_or_shell_surface` (CSP self, sin CDN, allowlist 7 invokes, sin shell, 10 alias `--rh-*`) | 001, 004, 005, 007 | PASS | -| `neg_json_depth_limit_aborts` (nesting > 128 abortado con `AM-DOC-001`) | 006 | PASS | +| Test | TST-NEG | Resultado | +| ------------------------------------------------------------------------------------------------------------------------- | ------------------ | --------- | +| `neg_fs_outside_scope_never_written` (handle `/etc/passwd` opaco, sin escritura, error `AM-*`, sin parcial) | 002, 003, 008 | PASS | +| `neg_errors_are_typed_catalog_codes` (`createDraft` denegado → `AM-SCHEMA-001` tipado) | 001 | PASS | +| `neg_capability_deny_by_default` (ventana `main`, 8 TOML `core:*`, permissions JSON vacío, `shell:*`+`updater` denegados) | 001, 004 | PASS | +| `neg_shell_blocked_in_tauri_conf` (CSP `default-src 'self'`, sin `unsafe-*`, devtools off) | 004, 005 | PASS | +| `neg_web_has_no_remote_or_shell_surface` (CSP self, sin CDN, allowlist 7 invokes, sin shell, 10 alias `--rh-*`) | 001, 004, 005, 007 | PASS | +| `neg_json_depth_limit_aborts` (nesting > 128 abortado con `AM-DOC-001`) | 006 | PASS | ### Estático — `python3 tools/check_negative_capabilities.py`: 14/14 PASS, exit 0 -Deny-by-default por ventana, 7 comandos, `shell:*` denegado, CSP self (conf + HTML), +Deny-by-default por ventana, 8 definiciones TOML y permissions JSON vacío, `shell:*` denegado, CSP self (conf + HTML), devtools off, sin CDN/red en WebView, invoke solo allowlist, sin shell en TS, `destinationHandle` opaco, 10 alias `--rh-*`, corrección `.dark text-subtle`, `prefers-reduced-motion`. diff --git a/docs/08-security/supply-chain-policy.md b/docs/08-security/supply-chain-policy.md index 920244c..c2170aa 100644 --- a/docs/08-security/supply-chain-policy.md +++ b/docs/08-security/supply-chain-policy.md @@ -38,16 +38,20 @@ artefactos de release. Amenazas asociadas: `THR-SUP-001` (dependencia comprometi ## Controles por capa -| Capa | Control | Evidencia | -| ----------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | -| Dependencias Rust | `Cargo.lock` versionado; `cargo audit` y `cargo deny`; sin features innecesarias. | Lockfile en repo; run de CI. | -| Dependencias JS | Lockfile (`package-lock.json`/`pnpm-lock.yaml`); auditoría de dependencias; sin CDN en runtime. | Lockfile; `DEC-009`; CSP `self`. | -| CI | Actions fijadas por SHA; permisos mínimos; sin secretos de larga duración donde OIDC basta. | Workflows en `.github/workflows/`; `docs/09-quality/ci-cd.md`. | -| Build | Build reproducible y determinista; artefactos con digest. | Job de CI; `packaging-release.md`. | -| Release | Firma Sigstore keyless ligada a identidad OIDC del workflow; SBOM y provenance. | `DEC-006`; `docs/10-delivery/packaging-release.md`. | -| Verificación | `cosign verify` con raíces de Fulcio/Rekor fijadas (`trusted_root.json`); verificación offline. | `DEC-006`; `updater-threat-model.md`. | -| Catálogo | Digest y procedencia verificable como requisito de carga. | `ADR-0008`; `docs/03-data/lifecycles.md`. | -| Actualización | Canal firmado, endpoint en allowlist, versión mínima. | `ADR-0009`; `updater-threat-model.md`. | +| Capa | Control | Evidencia | +| ----------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | +| Dependencias Rust | `Cargo.lock` versionado; `cargo audit` y `cargo deny`; sin features innecesarias. | Lockfile en repo; run de CI. | +| Dependencias JS | Lockfile único `pnpm-lock.yaml` en la raíz; pnpm es el único instalador. Sin `package-lock.json`. Sin CDN en runtime. | `pnpm-lock.yaml`; `DEC-009`; CSP `self`. | +| CI | Actions fijadas por SHA; permisos mínimos; sin secretos de larga duración donde OIDC basta. | Workflows en `.github/workflows/`; `docs/09-quality/ci-cd.md`. | +| Build | Build reproducible y determinista; artefactos con digest. | Job de CI; `packaging-release.md`. | +| Release | Firma Sigstore keyless ligada a identidad OIDC del workflow; SBOM y provenance. | `DEC-006`; `docs/10-delivery/packaging-release.md`. | +| Verificación | `cosign verify` con raíces de Fulcio/Rekor fijadas (`trusted_root.json`); verificación offline. | `DEC-006`; `updater-threat-model.md`. | +| Catálogo | Digest y procedencia verificable como requisito de carga. | `ADR-0008`; `docs/03-data/lifecycles.md`. | +| Actualización | Canal firmado, endpoint en allowlist, versión mínima. | `ADR-0009`; `updater-threat-model.md`. | + +## Excepción conocida: glib + +`glib` 0.18.5 entra por `gtk` 0.18.2 y `tauri` 2.12 (pila gtk-rs 0.18: atk, cairo-rs, gdk, gdk-pixbuf, gdkx11, gio, pango). La alerta Dependabot #1 pide `glib` 0.20.0. Esa versión no satisface el requisito `^0.18` de esa pila. No se fuerza el bump en `Cargo.lock`. Se reabre cuando Tauri publique una pila sobre glib 0.20. La alerta de seguridad permanece abierta. ## Reglas diff --git a/docs/08-security/tauri-policy.md b/docs/08-security/tauri-policy.md index 091d7f8..8a250d8 100644 --- a/docs/08-security/tauri-policy.md +++ b/docs/08-security/tauri-policy.md @@ -16,6 +16,7 @@ reviewers: # Política Tauri - Deny-by-default. +- La allow-list JSON de `main`, `dialog` y `picker` permanece vacía: es la denegación definitiva del slice. Los ocho ficheros `src-tauri/permissions/*.toml` definen identificadores `core:*` y no los conceden. `dialog` y `picker` siguen reservadas, sin permisos. - Capabilities separadas por ventana y plataforma. - Permisos custom con allow/deny explícitos. - Scopes de filesystem mínimos; negar rutas sensibles. diff --git a/docs/10-delivery/next-issues.md b/docs/10-delivery/next-issues.md index d57462c..b65537e 100644 --- a/docs/10-delivery/next-issues.md +++ b/docs/10-delivery/next-issues.md @@ -34,7 +34,7 @@ reviewers: | ISSUE-005 | Cerrar modelo de dominio: identidad de IDs (DEC-002), SelectionValue, invariantes, `lifecycles.md` | 001 | G4 | Arquitectura de datos | Modelo `accepted`; CON-001/003/004 resueltas; INV-* sin contradicción | Evidencia de slice: G4 `complete`; dominio en `crates/archmaker-domain/` | | ISSUE-006 | Crear JSON Schema Draft 2020-12 (`draft`, `catalog`, `rule`, `diagnostic`, `manifest`, `artifact`, `installation-plan`, `runner-envelope`) con `additionalProperties:false` y corpus válido/inválido + fixture de migración | 004,005 | G4,G5 | Datos/Interfaces | Meta-validación y fixtures en verde en CI (`json-schema.yml`) | Evidencia de slice: G4/G5 `complete`; schemas en `contracts/json-schema/` | | ISSUE-007 | Formalizar AST de operadores y reglas: `operator-spec.md` + `operator-corpus.md` + fichas `RULE-*` (fijar severidad AM-*) | 005 | G7 | Validación | Operador no soportado → diagnóstico bloqueante probado; `count_gt` resuelto (CON-002) | Evidencia de slice: G7 `complete`; reglas en `crates/archmaker-rules/` y `docs/07-validation/` | -| ISSUE-008 | Validar contratos de interfaz: CorePort + `dto.md` + `errors-events.md` + `tauri-commands.md`/capabilities (7 comandos CorePort v0, denegación por defecto) | 006 | G5,G8 | Interfaces/Seguridad | DTO con paridad TS/Rust/WASM; cada comando con test negativo | Evidencia de slice: G5/G8 `complete`; `src-tauri/capabilities/main.json`; paridad en `crates/archmaker-wasm/tests/parity.rs` | +| ISSUE-008 | Validar contratos de interfaz: CorePort + `dto.md` + `errors-events.md` + `tauri-commands.md`/capabilities (lista permissions vacía; 8 identificadores `core:*` en TOML, denegación por defecto) | 006 | G5,G8 | Interfaces/Seguridad | DTO con paridad TS/Rust/WASM; cada comando con test negativo | Evidencia de slice: G5/G8 `complete`; `src-tauri/capabilities/main.json`; paridad en `crates/archmaker-wasm/tests/parity.rs` | | ISSUE-009 | Validación de UX y accesibilidad sin rediseño: `interaction-matrix.md`, `component-contracts.md`, tokens `@layer` y corrección de deuda heredada | 003 | G6 | UX/Diseño | Contraste/focus/reduced-motion verificados; deuda heredada documentada y trazada | Evidencia de slice: G6 `complete`; `tools/wcag_validate.py` y jobs a11y en CI | | ISSUE-010 | Seguridad y release: cerrar `threat-model.md`/`privilege-model.md`, `test-matrix.md`, CI, SBOM/firmas/provenance y owners del backlog | 004,006,008 | G8,G9,G10 | Seguridad/Calidad/Delivery | RSK-001/002/007/008 con tratamiento; CI en verde; SBOM y política de firma definidos | Parcial: G8/G9/G10 `complete` y CI verde; DEC-006 pipeline real de SBOM/firmas **no aplicada** (`decision-register.md`) | diff --git a/docs/index.md b/docs/index.md index 22fea2f..d966512 100644 --- a/docs/index.md +++ b/docs/index.md @@ -67,14 +67,14 @@ reviewers: ## 04 — Interfaces -| Documento | ID | Estado | -| ------------------------------------------------ | ---------------- | --------- | -| `core-port.md` (CorePort v0, 7 operaciones) | DOC-IF-CORE-001 | accepted | -| `dto.md` | DOC-IF-DTO-001 | accepted | -| `errors-events.md` (CoreError, Diagnostic, AM-*) | DOC-IF-ERR-001 | accepted | -| `tauri-commands.md` (7 comandos + capabilities) | DOC-IF-TAURI-001 | in-review | -| `tauri-wasm.md` (adaptadores Tauri/WASM) | DOC-IF-WASM-001 | in-review | -| `runner-protocol.md` (protocolo v1 draft) | DOC-IF-PROTO-001 | draft | +| Documento | ID | Estado | +| --------------------------------------------------- | ---------------- | --------- | +| `core-port.md` (CorePort v0, 7 operaciones) | DOC-IF-CORE-001 | accepted | +| `dto.md` | DOC-IF-DTO-001 | accepted | +| `errors-events.md` (CoreError, Diagnostic, AM-*) | DOC-IF-ERR-001 | accepted | +| `tauri-commands.md` (8 comandos, permissions vacía) | DOC-IF-TAURI-001 | in-review | +| `tauri-wasm.md` (adaptadores Tauri/WASM) | DOC-IF-WASM-001 | in-review | +| `runner-protocol.md` (protocolo v1 draft) | DOC-IF-PROTO-001 | draft | ## 05–06 — UX y diseño diff --git a/src-tauri/capabilities/main.json b/src-tauri/capabilities/main.json index 8641ab0..8e4c3e9 100644 --- a/src-tauri/capabilities/main.json +++ b/src-tauri/capabilities/main.json @@ -1,7 +1,7 @@ { "$schema": "../gen/schemas/desktop-schema.json", "identifier": "main-capability", - "description": "Deny-by-default: ventana main, 8 comandos CorePort v0+MVP-1 (incluye import_draft). Sin shell, sin FS global.", + "description": "Deny-by-default: permissions vacia es la denegacion definitiva del slice. Los 8 identificadores core:* viven en TOML y no se conceden aqui. Sin shell, sin FS global.", "windows": ["main"], "permissions": [] } diff --git a/src-tauri/gen/schemas/capabilities.json b/src-tauri/gen/schemas/capabilities.json index d15715c..fd51484 100644 --- a/src-tauri/gen/schemas/capabilities.json +++ b/src-tauri/gen/schemas/capabilities.json @@ -1 +1,23 @@ -{"dialog-capability":{"identifier":"dialog-capability","description":"Deny-by-default: ventana dialog reservada (v1). Sin comandos CorePort en MVP; solo denegaciones explicitas.","local":true,"windows":["dialog"],"permissions":[]},"main-capability":{"identifier":"main-capability","description":"Deny-by-default: ventana main, solo los 7 comandos CorePort v0. Sin shell, sin FS global.","local":true,"windows":["main"],"permissions":[]},"picker-capability":{"identifier":"picker-capability","description":"Deny-by-default: ventana picker reservada (v1). Sin comandos CorePort en MVP; solo denegaciones explicitas.","local":true,"windows":["picker"],"permissions":[]}} \ No newline at end of file +{ + "dialog-capability": { + "identifier": "dialog-capability", + "description": "Deny-by-default: ventana dialog reservada (v1). Sin comandos CorePort en MVP; solo denegaciones explicitas.", + "local": true, + "windows": ["dialog"], + "permissions": [] + }, + "main-capability": { + "identifier": "main-capability", + "description": "Deny-by-default: permissions vacia es la denegacion definitiva del slice. Los 8 identificadores core:* viven en TOML y no se conceden aqui. Sin shell, sin FS global.", + "local": true, + "windows": ["main"], + "permissions": [] + }, + "picker-capability": { + "identifier": "picker-capability", + "description": "Deny-by-default: ventana picker reservada (v1). Sin comandos CorePort en MVP; solo denegaciones explicitas.", + "local": true, + "windows": ["picker"], + "permissions": [] + } +} diff --git a/tools/check_negative_capabilities.py b/tools/check_negative_capabilities.py index 0666446..5aabefb 100644 --- a/tools/check_negative_capabilities.py +++ b/tools/check_negative_capabilities.py @@ -30,8 +30,9 @@ def check(name: str, ok: bool, detail: str = "") -> None: cap = json.loads((ROOT / "src-tauri/capabilities/main.json").read_text()) check("NEG-001 deny-by-default por ventana", cap.get("windows") == ["main"]) -# Los 8 permisos viven en permissions/*.toml (identifier core:); el JSON de -# capability queda vacio (auto-descubrimiento). Espejo de neg_capability_deny_by_default. +# Los 8 identificadores core:* viven en permissions/*.toml. La lista JSON +# vacía es la denegación definitiva del slice: no se auto-conceden. +# Espejo de neg_capability_deny_by_default. check( "NEG-001 capability JSON sin permisos inline", cap.get("permissions") == [],