diff --git a/.gitignore b/.gitignore index 3a194100d..e87db64c6 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ __screenshots__ vite.*.ts.timestamp* .11ty-vite .gitlab/scripts/ +port # Vale config/vale/bin diff --git a/config/vale/styles/config/vocabularies/Elements/accept.txt b/config/vale/styles/config/vocabularies/Elements/accept.txt index 30cd54b46..9685582ed 100644 --- a/config/vale/styles/config/vocabularies/Elements/accept.txt +++ b/config/vale/styles/config/vocabularies/Elements/accept.txt @@ -39,6 +39,7 @@ CSS css HTML html +jsDelivr DOM dom Artifactory diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 451398025..d8139cac7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,8 +106,8 @@ catalogs: specifier: 4.0.1 version: 4.0.1 playwright: - specifier: 1.59.1 - version: 1.59.1 + specifier: 1.60.0 + version: 1.60.0 postcss: specifier: 8.5.15 version: 8.5.15 @@ -200,7 +200,7 @@ importers: devDependencies: '@commitlint/cli': specifier: 19.5.0 - version: 19.5.0(@types/node@25.7.0)(typescript@6.0.3) + version: 19.5.0(@types/node@25.9.3)(typescript@6.0.3) '@commitlint/config-conventional': specifier: 19.5.0 version: 19.5.0 @@ -242,7 +242,7 @@ importers: version: 0.0.6(eslint@10.4.0(jiti@2.6.1)) commitlint: specifier: 19.5.0 - version: 19.5.0(@types/node@25.7.0)(typescript@6.0.3) + version: 19.5.0(@types/node@25.9.3)(typescript@6.0.3) glob: specifier: 'catalog:' version: 13.0.6 @@ -257,7 +257,7 @@ importers: version: 15.3.0 playwright: specifier: 'catalog:' - version: 1.59.1 + version: 1.60.0 prettier: specifier: 3.4.2 version: 3.4.2 @@ -354,13 +354,13 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vite-plugin-singlefile: specifier: 2.3.0 - version: 2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/code: dependencies: @@ -400,7 +400,7 @@ importers: version: link:../styles '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -424,10 +424,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) projects/core: dependencies: @@ -470,7 +470,7 @@ importers: version: '@types/web@0.0.312' '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -503,10 +503,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) optionalDependencies: '@lit-labs/scoped-registry-mixin': specifier: catalog:publish @@ -546,7 +546,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/forms: devDependencies: @@ -573,7 +573,7 @@ importers: version: '@types/web@0.0.312' '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -594,10 +594,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/internals/eslint: dependencies: @@ -679,10 +679,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/internals/patterns: dependencies: @@ -725,7 +725,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/internals/testing: dependencies: @@ -750,7 +750,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) optionalDependencies: axe-core: specifier: 'catalog:' @@ -830,10 +830,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/internals/vite: dependencies: @@ -842,16 +842,16 @@ importers: version: 0.11.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@lit-labs/ssr': specifier: 'catalog:' - version: 4.1.0(@types/node@25.7.0) + version: 4.1.0(@types/node@25.9.3) '@typescript/native-preview': specifier: 'catalog:' version: 7.0.0-dev.20260527.2 '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -905,16 +905,16 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vite-plugin-dts: specifier: 'catalog:' - version: 5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) + version: 5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) vite-plugin-virtual-html: specifier: 1.2.7 - version: 1.2.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 1.2.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) devDependencies: esbuild: specifier: 'catalog:' @@ -970,10 +970,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/markdown: dependencies: @@ -1010,7 +1010,7 @@ importers: version: link:../styles '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -1034,10 +1034,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/media: dependencies: @@ -1071,7 +1071,7 @@ importers: version: link:../styles '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -1095,10 +1095,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/monaco: dependencies: @@ -1141,7 +1141,7 @@ importers: version: 25.6.2 '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -1180,16 +1180,16 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/pages: dependencies: vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/site: dependencies: @@ -1208,7 +1208,7 @@ importers: version: 3.1.5 '@11ty/eleventy-plugin-vite': specifier: 'catalog:' - version: 8.0.0(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.0(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) '@eslint/js': specifier: 'catalog:' version: 10.0.1(eslint@10.4.0(jiti@2.6.1)) @@ -1229,7 +1229,7 @@ importers: version: link:../internals/vite '@lit-labs/eleventy-plugin-lit': specifier: 'catalog:' - version: 1.0.6(@types/node@25.7.0) + version: 1.0.6(@types/node@25.9.3) '@lit-labs/ssr-client': specifier: 'catalog:' version: 1.1.8 @@ -1289,7 +1289,7 @@ importers: version: 1.3.0 playwright: specifier: 'catalog:' - version: 1.59.1 + version: 1.60.0 stylelint: specifier: 'catalog:' version: 17.12.0(typescript@6.0.3) @@ -1301,10 +1301,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/starters: dependencies: @@ -1350,10 +1350,10 @@ importers: devDependencies: '@angular/build': specifier: 21.2.7 - version: 21.2.7(@angular/compiler-cli@21.2.8(@angular/compiler@21.2.8)(typescript@5.9.3))(@angular/compiler@21.2.8)(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(@angular/platform-browser@21.2.8(@angular/common@21.2.8(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.14)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.7)(yaml@2.8.3) + version: 21.2.7(@angular/compiler-cli@21.2.8(@angular/compiler@21.2.8)(typescript@5.9.3))(@angular/compiler@21.2.8)(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(@angular/platform-browser@21.2.8(@angular/common@21.2.8(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(chokidar@5.0.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.14)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.7)(yaml@2.8.3) '@angular/cli': specifier: 21.2.7 - version: 21.2.7(@types/node@25.7.0)(chokidar@5.0.0) + version: 21.2.7(@types/node@25.9.3)(chokidar@5.0.0) '@angular/compiler-cli': specifier: 21.2.8 version: 21.2.8(@angular/compiler@21.2.8)(typescript@5.9.3) @@ -1371,7 +1371,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) projects/starters/bundles: dependencies: @@ -1393,7 +1393,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/eleventy: dependencies: @@ -1415,10 +1415,10 @@ importers: version: 5.0.2 '@11ty/eleventy-plugin-vite': specifier: 'catalog:' - version: 8.0.0(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.0(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) '@lit-labs/eleventy-plugin-lit': specifier: 'catalog:' - version: 1.0.6(@types/node@25.7.0) + version: 1.0.6(@types/node@25.9.3) '@lit-labs/ssr-client': specifier: 'catalog:' version: 1.1.8 @@ -1436,7 +1436,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/eleventy-ssr: dependencies: @@ -1461,13 +1461,13 @@ importers: version: 3.1.5 '@11ty/eleventy-plugin-vite': specifier: 'catalog:' - version: 8.0.0(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.0(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) '@internals/metadata': specifier: workspace:* version: link:../../internals/metadata '@lit-labs/eleventy-plugin-lit': specifier: 'catalog:' - version: 1.0.6(@types/node@25.7.0) + version: 1.0.6(@types/node@25.9.3) '@lit-labs/ssr-client': specifier: 'catalog:' version: 1.1.8 @@ -1476,7 +1476,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/go: {} @@ -1547,10 +1547,10 @@ importers: version: link:../../themes '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/browser-playwright': specifier: 'catalog:' - version: 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) eslint: specifier: 10.4.0 version: 10.4.0(jiti@2.6.1) @@ -1565,13 +1565,13 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vite-plugin-dts: specifier: 'catalog:' - version: 5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) + version: 5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/starters/mcp-app: dependencies: @@ -1608,10 +1608,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vite-plugin-singlefile: specifier: 2.3.0 - version: 2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/starters/mpa: dependencies: @@ -1636,16 +1636,16 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/nextjs: dependencies: '@lit-labs/nextjs': specifier: 0.2.4 - version: 0.2.4(@types/node@25.7.0)(@types/react@19.2.14)(next@16.2.6(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.97.3))(react@19.2.5)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) + version: 0.2.4(@types/node@25.9.3)(@types/react@19.2.14)(next@16.2.6(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.97.3))(react@19.2.5)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) '@lit-labs/ssr-react': specifier: 'catalog:' - version: 0.3.4(@types/node@25.7.0)(@types/react@19.2.14)(react@19.2.5) + version: 0.3.4(@types/node@25.9.3)(@types/react@19.2.14)(react@19.2.5) '@nvidia-elements/core': specifier: workspace:* version: link:../../core @@ -1682,7 +1682,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/nuxt: dependencies: @@ -1697,7 +1697,7 @@ importers: version: link:../../themes nuxt: specifier: 4.4.4 - version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) + version: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) vue: specifier: 3.5.34 version: 3.5.34(typescript@6.0.3) @@ -1747,13 +1747,13 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 6.0.1 - version: 6.0.1(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) eslint: specifier: 10.4.0 version: 10.4.0(jiti@2.6.1) vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/solidjs: dependencies: @@ -1778,16 +1778,16 @@ importers: version: 10.4.0(jiti@2.6.1) solid-devtools: specifier: 0.34.5 - version: 0.34.5(solid-js@1.9.12)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 0.34.5(solid-js@1.9.12)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vite-plugin-solid: specifier: 2.11.12 - version: 2.11.12(solid-js@1.9.12)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 2.11.12(solid-js@1.9.12)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/starters/svelte: dependencies: @@ -1806,7 +1806,7 @@ importers: version: link:../../lint '@sveltejs/vite-plugin-svelte': specifier: 7.1.2 - version: 7.1.2(svelte@5.55.7(@typescript-eslint/types@8.60.0))(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 7.1.2(svelte@5.55.7(@typescript-eslint/types@8.60.0))(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@tsconfig/svelte': specifier: 5.0.8 version: 5.0.8 @@ -1824,7 +1824,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/typescript: dependencies: @@ -1849,7 +1849,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) projects/starters/vue: dependencies: @@ -1877,7 +1877,7 @@ importers: version: 25.6.2 '@vitejs/plugin-vue': specifier: 6.0.6 - version: 6.0.6(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3)) + version: 6.0.6(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3)) '@vue/tsconfig': specifier: 0.9.1 version: 0.9.1(typescript@6.0.3)(vue@3.5.32(typescript@6.0.3)) @@ -1889,7 +1889,7 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vue-tsc: specifier: 3.2.7 version: 3.2.7(typescript@6.0.3) @@ -1913,7 +1913,7 @@ importers: version: link:../themes '@vitest/browser': specifier: 'catalog:' - version: 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + version: 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': specifier: 'catalog:' version: 4.1.7(vitest@4.1.7) @@ -1952,10 +1952,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) projects/themes: devDependencies: @@ -1994,10 +1994,10 @@ importers: version: 6.0.3 vite: specifier: 'catalog:' - version: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + version: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + version: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) packages: @@ -4098,6 +4098,12 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@next/env@16.2.6': resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} @@ -6341,6 +6347,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -6401,6 +6410,9 @@ packages: '@types/node@25.7.0': resolution: {integrity: sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==} + '@types/node@25.9.3': + resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -7044,6 +7056,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + adm-zip@0.5.16: resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} engines: {node: '>=12.0'} @@ -7137,8 +7154,8 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} - ansis@4.3.0: - resolution: {integrity: sha512-44mvgtPvohuU/70DdY5Oz2AIrLJ9k6/5x4KmoSvPwO+5Moijo0+N9D0fKbbYZQWP1hNm5CpOf+E01jhxG/r8xg==} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} any-promise@1.3.0: @@ -8398,6 +8415,10 @@ packages: resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.24.0: + resolution: {integrity: sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -11330,13 +11351,13 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} - playwright-core@1.59.1: - resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + playwright-core@1.60.0: + resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} engines: {node: '>=18'} hasBin: true - playwright@1.59.1: - resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + playwright@1.60.0: + resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} engines: {node: '>=18'} hasBin: true @@ -12812,8 +12833,8 @@ packages: resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} engines: {node: '>=14.16'} - terser-webpack-plugin@5.6.0: - resolution: {integrity: sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==} + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} engines: {node: '>= 10.13.0'} peerDependencies: '@minify-html/node': '*' @@ -12860,8 +12881,8 @@ packages: engines: {node: '>=10'} hasBin: true - terser@5.47.1: - resolution: {integrity: sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==} + terser@5.48.0: + resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} engines: {node: '>=10'} hasBin: true @@ -12948,6 +12969,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -13162,6 +13187,9 @@ packages: undici-types@7.21.0: resolution: {integrity: sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@6.25.0: resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} engines: {node: '>=18.17'} @@ -13533,8 +13561,8 @@ packages: yaml: optional: true - vite@7.3.3: - resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -13796,6 +13824,10 @@ packages: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} + engines: {node: '>=10.13.0'} + weak-lru-cache@1.2.2: resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} @@ -13820,8 +13852,8 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} - webpack-sources@3.4.1: - resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} + webpack-sources@3.5.0: + resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} engines: {node: '>=10.13.0'} webpack-virtual-modules@0.6.2: @@ -14157,10 +14189,10 @@ snapshots: dependencies: prismjs: 1.30.0 - '@11ty/eleventy-plugin-vite@8.0.0(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)': + '@11ty/eleventy-plugin-vite@8.0.0(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)': dependencies: '@11ty/eleventy-utils': 2.0.7 - vite: 8.0.13(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.13(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - '@vitejs/devtools' @@ -14368,7 +14400,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/build@21.2.7(@angular/compiler-cli@21.2.8(@angular/compiler@21.2.8)(typescript@5.9.3))(@angular/compiler@21.2.8)(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(@angular/platform-browser@21.2.8(@angular/common@21.2.8(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(chokidar@5.0.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.14)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.7)(yaml@2.8.3)': + '@angular/build@21.2.7(@angular/compiler-cli@21.2.8(@angular/compiler@21.2.8)(typescript@5.9.3))(@angular/compiler@21.2.8)(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(@angular/platform-browser@21.2.8(@angular/common@21.2.8(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(chokidar@5.0.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.14)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(tslib@2.8.1)(typescript@5.9.3)(vitest@4.1.7)(yaml@2.8.3)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.7(chokidar@5.0.0) @@ -14377,8 +14409,8 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@25.7.0) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + '@inquirer/confirm': 5.1.21(@types/node@25.9.3) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -14399,14 +14431,14 @@ snapshots: tslib: 2.8.1 typescript: 5.9.3 undici: 7.24.4 - vite: 7.3.2(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2) '@angular/platform-browser': 21.2.8(@angular/common@21.2.8(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.8(@angular/compiler@21.2.8)(rxjs@7.8.2)) lmdb: 3.5.1 postcss: 8.5.14 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -14422,13 +14454,13 @@ snapshots: - tsx - yaml - '@angular/cli@21.2.7(@types/node@25.7.0)(chokidar@5.0.0)': + '@angular/cli@21.2.7(@types/node@25.9.3)(chokidar@5.0.0)': dependencies: '@angular-devkit/architect': 0.2102.7(chokidar@5.0.0) '@angular-devkit/core': 21.2.7(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.7(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@25.7.0) - '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.7.0))(@types/node@25.7.0)(listr2@9.0.5) + '@inquirer/prompts': 7.10.1(@types/node@25.9.3) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@25.9.3))(@types/node@25.9.3)(listr2@9.0.5) '@modelcontextprotocol/sdk': 1.26.0(zod@4.3.6) '@schematics/angular': 21.2.7(chokidar@5.0.0) '@yarnpkg/lockfile': 1.1.0 @@ -14770,11 +14802,11 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@19.5.0(@types/node@25.7.0)(typescript@6.0.3)': + '@commitlint/cli@19.5.0(@types/node@25.9.3)(typescript@6.0.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@25.7.0)(typescript@6.0.3) + '@commitlint/load': 19.8.1(@types/node@25.9.3)(typescript@6.0.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 0.3.2 @@ -14821,7 +14853,7 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@25.7.0)(typescript@6.0.3)': + '@commitlint/load@19.8.1(@types/node@25.9.3)(typescript@6.0.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -14829,7 +14861,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.6.2 cosmiconfig: 9.0.1(typescript@6.0.3) - cosmiconfig-typescript-loader: 6.3.0(@types/node@25.7.0)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3) + cosmiconfig-typescript-loader: 6.3.0(@types/node@25.9.3)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -15478,15 +15510,15 @@ snapshots: '@inquirer/ansi@2.0.7': {} - '@inquirer/checkbox@4.3.2(@types/node@25.7.0)': + '@inquirer/checkbox@4.3.2(@types/node@25.9.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/type': 3.0.10(@types/node@25.9.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/checkbox@5.2.1(@types/node@25.6.2)': dependencies: @@ -15497,12 +15529,12 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/confirm@5.1.21(@types/node@25.7.0)': + '@inquirer/confirm@5.1.21(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/confirm@6.1.1(@types/node@25.6.2)': dependencies: @@ -15511,18 +15543,18 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/core@10.3.2(@types/node@25.7.0)': + '@inquirer/core@10.3.2(@types/node@25.9.3)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/type': 3.0.10(@types/node@25.9.3) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/core@11.2.1(@types/node@25.6.2)': dependencies: @@ -15536,13 +15568,13 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/editor@4.2.23(@types/node@25.7.0)': + '@inquirer/editor@4.2.23(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/external-editor': 1.0.3(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/external-editor': 1.0.3(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/editor@5.2.2(@types/node@25.6.2)': dependencies: @@ -15552,13 +15584,13 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/expand@4.0.23(@types/node@25.7.0)': + '@inquirer/expand@4.0.23(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/expand@5.1.1(@types/node@25.6.2)': dependencies: @@ -15567,12 +15599,12 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/external-editor@1.0.3(@types/node@25.7.0)': + '@inquirer/external-editor@1.0.3(@types/node@25.9.3)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/external-editor@3.0.3(@types/node@25.6.2)': dependencies: @@ -15585,12 +15617,12 @@ snapshots: '@inquirer/figures@2.0.7': {} - '@inquirer/input@4.3.1(@types/node@25.7.0)': + '@inquirer/input@4.3.1(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/input@5.1.2(@types/node@25.6.2)': dependencies: @@ -15599,12 +15631,12 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/number@3.0.23(@types/node@25.7.0)': + '@inquirer/number@3.0.23(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/number@4.1.1(@types/node@25.6.2)': dependencies: @@ -15613,13 +15645,13 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/password@4.0.23(@types/node@25.7.0)': + '@inquirer/password@4.0.23(@types/node@25.9.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/password@5.1.1(@types/node@25.6.2)': dependencies: @@ -15629,20 +15661,20 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/prompts@7.10.1(@types/node@25.7.0)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.7.0) - '@inquirer/confirm': 5.1.21(@types/node@25.7.0) - '@inquirer/editor': 4.2.23(@types/node@25.7.0) - '@inquirer/expand': 4.0.23(@types/node@25.7.0) - '@inquirer/input': 4.3.1(@types/node@25.7.0) - '@inquirer/number': 3.0.23(@types/node@25.7.0) - '@inquirer/password': 4.0.23(@types/node@25.7.0) - '@inquirer/rawlist': 4.1.11(@types/node@25.7.0) - '@inquirer/search': 3.2.2(@types/node@25.7.0) - '@inquirer/select': 4.4.2(@types/node@25.7.0) + '@inquirer/prompts@7.10.1(@types/node@25.9.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.9.3) + '@inquirer/confirm': 5.1.21(@types/node@25.9.3) + '@inquirer/editor': 4.2.23(@types/node@25.9.3) + '@inquirer/expand': 4.0.23(@types/node@25.9.3) + '@inquirer/input': 4.3.1(@types/node@25.9.3) + '@inquirer/number': 3.0.23(@types/node@25.9.3) + '@inquirer/password': 4.0.23(@types/node@25.9.3) + '@inquirer/rawlist': 4.1.11(@types/node@25.9.3) + '@inquirer/search': 3.2.2(@types/node@25.9.3) + '@inquirer/select': 4.4.2(@types/node@25.9.3) optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/prompts@8.5.0(@types/node@25.6.2)': dependencies: @@ -15659,13 +15691,13 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/rawlist@4.1.11(@types/node@25.7.0)': + '@inquirer/rawlist@4.1.11(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/rawlist@5.3.1(@types/node@25.6.2)': dependencies: @@ -15674,14 +15706,14 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/search@3.2.2(@types/node@25.7.0)': + '@inquirer/search@3.2.2(@types/node@25.9.3)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/type': 3.0.10(@types/node@25.9.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/search@4.2.1(@types/node@25.6.2)': dependencies: @@ -15691,15 +15723,15 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/select@4.4.2(@types/node@25.7.0)': + '@inquirer/select@4.4.2(@types/node@25.9.3)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.7.0) + '@inquirer/core': 10.3.2(@types/node@25.9.3) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/type': 3.0.10(@types/node@25.9.3) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/select@5.2.1(@types/node@25.6.2)': dependencies: @@ -15710,9 +15742,9 @@ snapshots: optionalDependencies: '@types/node': 25.6.2 - '@inquirer/type@3.0.10(@types/node@25.7.0)': + '@inquirer/type@3.0.10(@types/node@25.9.3)': optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@inquirer/type@4.0.7(@types/node@25.6.2)': optionalDependencies: @@ -15908,24 +15940,24 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.7.0))(@types/node@25.7.0)(listr2@9.0.5)': + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@25.9.3))(@types/node@25.9.3)(listr2@9.0.5)': dependencies: - '@inquirer/prompts': 7.10.1(@types/node@25.7.0) - '@inquirer/type': 3.0.10(@types/node@25.7.0) + '@inquirer/prompts': 7.10.1(@types/node@25.9.3) + '@inquirer/type': 3.0.10(@types/node@25.9.3) listr2: 9.0.5 transitivePeerDependencies: - '@types/node' - '@lit-labs/eleventy-plugin-lit@1.0.6(@types/node@25.7.0)': + '@lit-labs/eleventy-plugin-lit@1.0.6(@types/node@25.9.3)': dependencies: - '@lit-labs/ssr': 4.0.0(@types/node@25.7.0) + '@lit-labs/ssr': 4.0.0(@types/node@25.9.3) lit: 3.3.2 transitivePeerDependencies: - '@types/node' - '@lit-labs/nextjs@0.2.4(@types/node@25.7.0)(@types/react@19.2.14)(next@16.2.6(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.97.3))(react@19.2.5)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15))': + '@lit-labs/nextjs@0.2.4(@types/node@25.9.3)(@types/react@19.2.14)(next@16.2.6(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.97.3))(react@19.2.5)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15))': dependencies: - '@lit-labs/ssr-react': 0.3.4(@types/node@25.7.0)(@types/react@19.2.14)(react@19.2.5) + '@lit-labs/ssr-react': 0.3.4(@types/node@25.9.3)(@types/react@19.2.14)(react@19.2.5) '@webcomponents/template-shadowroot': 0.2.1 imports-loader: 4.0.1(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) next: 16.2.6(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.97.3) @@ -15949,16 +15981,16 @@ snapshots: '@lit-labs/ssr-dom-shim@1.6.0': {} - '@lit-labs/ssr-react@0.3.4(@types/node@25.7.0)(@types/react@19.2.14)(react@19.2.5)': + '@lit-labs/ssr-react@0.3.4(@types/node@25.9.3)(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@lit-labs/ssr': 4.0.0(@types/node@25.7.0) + '@lit-labs/ssr': 4.0.0(@types/node@25.9.3) '@lit-labs/ssr-client': 1.1.8 '@types/react': 19.2.14 react: 19.2.5 transitivePeerDependencies: - '@types/node' - '@lit-labs/ssr@4.0.0(@types/node@25.7.0)': + '@lit-labs/ssr@4.0.0(@types/node@25.9.3)': dependencies: '@lit-labs/ssr-client': 1.1.8 '@lit-labs/ssr-dom-shim': 1.6.0 @@ -15971,9 +16003,9 @@ snapshots: node-fetch: 3.3.2 parse5: 7.1.2 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 - '@lit-labs/ssr@4.1.0(@types/node@25.7.0)': + '@lit-labs/ssr@4.1.0(@types/node@25.9.3)': dependencies: '@lit-labs/ssr-client': 1.1.8 '@lit-labs/ssr-dom-shim': 1.6.0 @@ -15986,7 +16018,7 @@ snapshots: node-fetch: 3.3.2 parse5: 7.1.2 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 '@lit-labs/virtualizer@2.1.1': dependencies: @@ -16181,6 +16213,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@next/env@16.2.6': {} '@next/swc-darwin-arm64@16.2.6': @@ -16317,11 +16356,11 @@ snapshots: '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))': + '@nuxt/devtools-kit@3.2.4(magicast@0.5.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.3) execa: 8.0.1 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - magicast @@ -16336,9 +16375,9 @@ snapshots: pkg-types: 2.3.0 semver: 7.8.0 - '@nuxt/devtools@3.2.4(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': + '@nuxt/devtools@3.2.4(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': dependencies: - '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.2(magicast@0.5.3) '@vue/devtools-core': 8.1.1(vue@3.5.34(typescript@6.0.3)) @@ -16366,9 +16405,9 @@ snapshots: sirv: 3.0.2 structured-clone-es: 2.0.0 tinyglobby: 0.2.16 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) - vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.3))(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) - vite-plugin-vue-tracer: 1.3.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.3))(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) + vite-plugin-vue-tracer: 1.3.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) which: 6.0.1 ws: 8.20.1 transitivePeerDependencies: @@ -16427,7 +16466,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.4(@babel/core@7.29.0)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.3)(nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3))(oxc-parser@0.128.0)(rolldown@1.0.2)(srvx@0.11.15)(typescript@6.0.3)': + '@nuxt/nitro-server@4.4.4(@babel/core@7.29.0)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.3)(nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3))(oxc-parser@0.128.0)(rolldown@1.0.2)(srvx@0.11.15)(typescript@6.0.3)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 @@ -16446,7 +16485,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.4(oxc-parser@0.128.0)(rolldown@1.0.2)(srvx@0.11.15) - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) nypm: 0.6.6 ohash: 2.0.11 pathe: 2.0.3 @@ -16514,12 +16553,12 @@ snapshots: rc9: 3.0.1 std-env: 4.1.0 - '@nuxt/vite-builder@4.4.4(5d07570abe57b12452417a56fb0f439a)': + '@nuxt/vite-builder@4.4.4(9c58566a0d1b945b6f71e33758e81555)': dependencies: '@nuxt/kit': 4.4.4(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) - '@vitejs/plugin-vue': 6.0.6(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) + '@vitejs/plugin-vue': 6.0.6(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) autoprefixer: 10.5.0(postcss@8.5.14) consola: 3.4.2 cssnano: 7.1.7(postcss@8.5.14) @@ -16532,7 +16571,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) + nuxt: 4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3) nypm: 0.6.6 pathe: 2.0.3 pkg-types: 2.3.1 @@ -16541,9 +16580,9 @@ snapshots: std-env: 4.1.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) - vite-node: 5.3.0(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) - vite-plugin-checker: 0.13.0(eslint@10.4.0(jiti@2.6.1))(meow@14.1.0)(optionator@0.9.4)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3)) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) + vite-node: 5.3.0(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) + vite-plugin-checker: 0.13.0(eslint@10.4.0(jiti@2.6.1))(meow@14.1.0)(optionator@0.9.4)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3)) vue: 3.5.34(typescript@6.0.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -17544,7 +17583,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-beta.40(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -18178,14 +18217,14 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.7(@typescript-eslint/types@8.60.0))(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))': + '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.55.7(@typescript-eslint/types@8.60.0))(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': dependencies: deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.55.7(@typescript-eslint/types@8.60.0) - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) - vitefu: 1.1.3(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) + vitefu: 1.1.3(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@swc/helpers@0.5.15': dependencies: @@ -18235,6 +18274,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.3 @@ -18307,6 +18351,10 @@ snapshots: dependencies: undici-types: 7.21.0 + '@types/node@25.9.3': + dependencies: + undici-types: 7.24.6 + '@types/normalize-package-data@2.4.4': {} '@types/parse5@2.2.34': @@ -18555,46 +18603,46 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))': + '@vitejs/plugin-basic-ssl@2.1.4(vite@7.3.2(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))': dependencies: - vite: 7.3.2(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) - '@vitejs/plugin-react@6.0.1(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) - vite: 7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) vue: 3.5.34(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.6(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.6(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 - vite: 7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) vue: 3.5.34(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.6(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.6(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.32(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) vue: 3.5.32(typescript@6.0.3) - '@vitest/browser-playwright@4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser-playwright@4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: - '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) - playwright: 1.59.1 + '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw @@ -18602,13 +18650,13 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser-playwright@4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: - '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) - playwright: 1.59.1 + '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw @@ -18616,13 +18664,26 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser-playwright@4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': + dependencies: + '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + playwright: 1.60.0 + tinyrainbow: 3.1.0 + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser-playwright@4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: - '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) - playwright: 1.59.1 + '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) + playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw @@ -18630,29 +18691,29 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser-playwright@4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: - '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) - playwright: 1.59.1 + '@vitest/browser': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + playwright: 1.60.0 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/utils': 4.1.7 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) ws: 8.20.1 transitivePeerDependencies: - bufferutil @@ -18660,16 +18721,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/utils': 4.1.7 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) ws: 8.20.1 transitivePeerDependencies: - bufferutil @@ -18678,16 +18739,33 @@ snapshots: - vite optional: true - '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': + dependencies: + '@blazediff/core': 1.9.1 + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + '@vitest/utils': 4.1.7 + magic-string: 0.30.21 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.1.0 + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + ws: 8.20.1 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) '@vitest/utils': 4.1.7 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) ws: 8.20.1 transitivePeerDependencies: - bufferutil @@ -18695,16 +18773,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7)': + '@vitest/browser@4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/utils': 4.1.7 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) ws: 8.20.1 transitivePeerDependencies: - bufferutil @@ -18724,7 +18802,7 @@ snapshots: magicast: 0.5.3 obug: 2.1.1 tinyrainbow: 3.1.0 - vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color @@ -18737,37 +18815,45 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': + dependencies: + '@vitest/spy': 4.1.7 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) + + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) - '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))': + '@vitest/mocker@4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) '@vitest/pretty-format@4.1.7': dependencies: @@ -19283,9 +19369,9 @@ snapshots: dependencies: acorn: 8.16.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-import-phases@1.0.4(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 acorn-jsx@5.3.2(acorn@8.16.0): dependencies: @@ -19297,6 +19383,8 @@ snapshots: acorn@8.16.0: {} + acorn@8.17.0: {} + adm-zip@0.5.16: {} adm-zip@0.5.17: {} @@ -19394,7 +19482,7 @@ snapshots: ansis@4.2.0: {} - ansis@4.3.0: {} + ansis@4.3.1: {} any-promise@1.3.0: {} @@ -20074,9 +20162,9 @@ snapshots: comment-parser@1.4.5: {} - commitlint@19.5.0(@types/node@25.7.0)(typescript@6.0.3): + commitlint@19.5.0(@types/node@25.9.3)(typescript@6.0.3): dependencies: - '@commitlint/cli': 19.5.0(@types/node@25.7.0)(typescript@6.0.3) + '@commitlint/cli': 19.5.0(@types/node@25.9.3)(typescript@6.0.3) '@commitlint/types': 19.8.1 transitivePeerDependencies: - '@types/node' @@ -20203,9 +20291,9 @@ snapshots: corser@2.0.1: {} - cosmiconfig-typescript-loader@6.3.0(@types/node@25.7.0)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3): + cosmiconfig-typescript-loader@6.3.0(@types/node@25.9.3)(cosmiconfig@9.0.1(typescript@6.0.3))(typescript@6.0.3): dependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 cosmiconfig: 9.0.1(typescript@6.0.3) jiti: 2.6.1 typescript: 6.0.3 @@ -20758,6 +20846,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.3 + enhanced-resolve@5.24.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -22381,7 +22474,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23454,7 +23547,7 @@ snapshots: proc-log: 6.1.0 semver: 7.8.0 tar: 7.5.11 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 undici: 6.25.0 which: 6.0.1 @@ -23565,16 +23658,16 @@ snapshots: optionalDependencies: chokidar: 3.6.0 - nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3): + nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) '@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) + '@nuxt/devtools': 3.2.4(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)) '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.4(@babel/core@7.29.0)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.3)(nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.7.0)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3))(oxc-parser@0.128.0)(rolldown@1.0.2)(srvx@0.11.15)(typescript@6.0.3) + '@nuxt/nitro-server': 4.4.4(@babel/core@7.29.0)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.3)(nuxt@4.4.4(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.34)(cac@6.7.14)(db0@0.3.4)(eslint@10.4.0(jiti@2.6.1))(ioredis@5.10.1)(lightningcss@1.32.0)(magicast@0.5.3)(meow@14.1.0)(optionator@0.9.4)(rolldown@1.0.2)(rollup-plugin-visualizer@7.0.1(rolldown@1.0.2)(rollup@4.60.2))(rollup@4.60.2)(sass@1.97.3)(srvx@0.11.15)(stylelint@17.12.0(typescript@6.0.3))(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3))(yaml@2.8.3))(oxc-parser@0.128.0)(rolldown@1.0.2)(srvx@0.11.15)(typescript@6.0.3) '@nuxt/schema': 4.4.4 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.4(5d07570abe57b12452417a56fb0f439a) + '@nuxt/vite-builder': 4.4.4(9c58566a0d1b945b6f71e33758e81555) '@unhead/vue': 2.1.13(vue@3.5.34(typescript@6.0.3)) '@vue/shared': 3.5.33 chokidar: 5.0.0 @@ -23624,7 +23717,7 @@ snapshots: vue-router: 5.0.6(@vue/compiler-sfc@3.5.34)(vue@3.5.34(typescript@6.0.3)) optionalDependencies: '@parcel/watcher': 2.5.6 - '@types/node': 25.7.0 + '@types/node': 25.9.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -24261,11 +24354,11 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 - playwright-core@1.59.1: {} + playwright-core@1.60.0: {} - playwright@1.59.1: + playwright@1.60.0: dependencies: - playwright-core: 1.59.1 + playwright-core: 1.60.0 optionalDependencies: fsevents: 2.3.2 @@ -25139,23 +25232,23 @@ snapshots: robots-parser@3.0.1: {} - rolldown-vite@7.1.13(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + rolldown-vite@7.1.13(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: '@oxc-project/runtime': 0.92.0 fdir: 6.5.0(picomatch@4.0.4) - lightningcss: 1.30.2 + lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.15 rolldown: 1.0.0-beta.40(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.15) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 transitivePeerDependencies: - '@emnapi/core' @@ -25165,7 +25258,7 @@ snapshots: dependencies: '@oxc-project/types': 0.92.0 '@rolldown/pluginutils': 1.0.0-beta.40 - ansis: 4.3.0 + ansis: 4.3.1 optionalDependencies: '@rolldown/binding-android-arm64': 1.0.0-beta.40 '@rolldown/binding-darwin-arm64': 1.0.0-beta.40 @@ -25725,7 +25818,7 @@ snapshots: ip-address: 10.1.0 smart-buffer: 4.2.0 - solid-devtools@0.34.5(solid-js@1.9.12)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + solid-devtools@0.34.5(solid-js@1.9.12)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -25734,7 +25827,7 @@ snapshots: '@solid-devtools/shared': 0.20.0(solid-js@1.9.12) solid-js: 1.9.12 optionalDependencies: - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color @@ -26202,12 +26295,12 @@ snapshots: type-fest: 2.19.0 unique-string: 3.0.0 - terser-webpack-plugin@5.6.0(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): + terser-webpack-plugin@5.6.1(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.47.1 + terser: 5.48.0 webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.15) optionalDependencies: esbuild: 0.28.0 @@ -26220,10 +26313,10 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - terser@5.47.1: + terser@5.48.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -26311,6 +26404,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinyrainbow@3.1.0: {} tldts-core@7.0.28: {} @@ -26515,6 +26613,8 @@ snapshots: undici-types@7.21.0: {} + undici-types@7.24.6: {} + undici@6.25.0: {} undici@7.24.4: {} @@ -26570,7 +26670,7 @@ snapshots: unpipe@1.0.0: {} - unplugin-dts@1.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): + unplugin-dts@1.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.4) '@volar/typescript': 2.4.28 @@ -26585,7 +26685,7 @@ snapshots: esbuild: 0.28.0 rolldown: 1.0.2 rollup: 4.60.4 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) webpack: 5.106.2(esbuild@0.28.0)(postcss@8.5.15) transitivePeerDependencies: - supports-color @@ -26704,23 +26804,23 @@ snapshots: vary@1.1.2: {} - vite-dev-rpc@1.1.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)): + vite-dev-rpc@1.1.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)): dependencies: birpc: 2.9.0 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) - vite-hot-client: 2.1.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) + vite-hot-client: 2.1.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) - vite-hot-client@2.1.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)): + vite-hot-client@2.1.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)): dependencies: - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) - vite-node@5.3.0(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3): + vite-node@5.3.0(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3): dependencies: cac: 6.7.14 es-module-lexer: 2.1.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -26734,7 +26834,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.13.0(eslint@10.4.0(jiti@2.6.1))(meow@14.1.0)(optionator@0.9.4)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3)): + vite-plugin-checker@0.13.0(eslint@10.4.0(jiti@2.6.1))(meow@14.1.0)(optionator@0.9.4)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue-tsc@3.2.8(typescript@6.0.3)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -26744,7 +26844,7 @@ snapshots: proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 tinyglobby: 0.2.16 - vite: 7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) vscode-uri: 3.1.0 optionalDependencies: eslint: 10.4.0(jiti@2.6.1) @@ -26754,12 +26854,12 @@ snapshots: typescript: 6.0.3 vue-tsc: 3.2.8(typescript@6.0.3) - vite-plugin-dts@5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): + vite-plugin-dts@5.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)): dependencies: - unplugin-dts: 1.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) + unplugin-dts: 1.0.1(esbuild@0.28.0)(rolldown@1.0.2)(rollup@4.60.4)(typescript@6.0.3)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) optionalDependencies: rollup: 4.60.4 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - '@rspack/core' - '@vue/language-core' @@ -26769,7 +26869,7 @@ snapshots: - typescript - webpack - vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.3))(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)): + vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.3))(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)): dependencies: ansis: 4.2.0 debug: 4.4.3 @@ -26779,20 +26879,20 @@ snapshots: perfect-debounce: 2.1.0 sirv: 3.0.2 unplugin-utils: 0.3.1 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) - vite-dev-rpc: 1.1.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) + vite-dev-rpc: 1.1.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) optionalDependencies: '@nuxt/kit': 4.4.2(magicast@0.5.3) transitivePeerDependencies: - supports-color - vite-plugin-singlefile@2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vite-plugin-singlefile@2.3.0(rollup@4.60.4)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: micromatch: 4.0.8 rollup: 4.60.4 - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) - vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vite-plugin-solid@2.11.12(solid-js@1.9.12)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 @@ -26800,19 +26900,19 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.12 solid-refresh: 0.6.3(solid-js@1.9.12) - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) - vitefu: 1.1.3(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) + vitefu: 1.1.3(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color - vite-plugin-virtual-html@1.2.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + vite-plugin-virtual-html@1.2.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: connect-history-api-fallback: 2.0.0 debug: 4.4.3 ejs: 3.1.10 fast-glob: 3.3.3 magic-string: 0.30.21 - vite: rolldown-vite@7.1.13(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: rolldown-vite@7.1.13(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -26829,17 +26929,17 @@ snapshots: - tsx - yaml - vite-plugin-vue-tracer@1.3.0(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)): + vite-plugin-vue-tracer@1.3.0(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vue@3.5.34(typescript@6.0.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.8 magic-string: 0.30.21 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) vue: 3.5.34(typescript@6.0.3) - vite@7.3.2(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3): + vite@7.3.2(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) @@ -26848,34 +26948,34 @@ snapshots: rollup: 4.60.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.14) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@7.3.3(@types/node@25.7.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3): + vite@7.3.5(@types/node@25.9.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.15 + postcss: 8.5.14 rollup: 4.60.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.32.0 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.14) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@8.0.13(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + vite@8.0.13(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -26883,16 +26983,16 @@ snapshots: rolldown: 1.0.1 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.15) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -26906,10 +27006,10 @@ snapshots: jiti: 2.6.1 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.15) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -26923,10 +27023,10 @@ snapshots: jiti: 2.6.1 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.15) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3): + vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -26939,11 +27039,28 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 + sugarss: 5.0.1(postcss@8.5.15) + terser: 5.48.0 + yaml: 2.8.3 + + vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.2 + tinyglobby: 0.2.16 + optionalDependencies: + '@types/node': 25.9.3 + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.14) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3): + vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -26951,23 +27068,23 @@ snapshots: rolldown: 1.0.2 tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.7.0 + '@types/node': 25.9.3 esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.6.1 sass: 1.97.3 sugarss: 5.0.1(postcss@8.5.15) - terser: 5.47.1 + terser: 5.48.0 yaml: 2.8.3 - vitefu@1.1.3(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vitefu@1.1.3(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): optionalDependencies: - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -26984,21 +27101,21 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.6.2 - '@vitest/browser-playwright': 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/browser-playwright': 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) jsdom: 27.1.0 transitivePeerDependencies: - msw - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.6.2)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -27015,21 +27132,21 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.6.2 - '@vitest/browser-playwright': 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/browser-playwright': 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.6.2)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) jsdom: 27.1.0 transitivePeerDependencies: - msw - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -27046,21 +27163,21 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 25.7.0 - '@vitest/browser-playwright': 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/browser-playwright': 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) jsdom: 27.1.0 transitivePeerDependencies: - msw - vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.7.0)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)): + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.7 - '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3)) + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.7 '@vitest/runner': 4.1.7 '@vitest/snapshot': 4.1.7 @@ -27077,12 +27194,43 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3) + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 - '@types/node': 25.7.0 - '@vitest/browser-playwright': 4.1.7(playwright@1.59.1)(vite@8.0.14(@types/node@25.7.0)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.47.1)(yaml@2.8.3))(vitest@4.1.7) + '@types/node': 25.9.3 + '@vitest/browser-playwright': 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.14))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) + '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) + jsdom: 27.1.0 + transitivePeerDependencies: + - msw + + vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.3)(@vitest/browser-playwright@4.1.7)(@vitest/coverage-istanbul@4.1.7)(jsdom@27.1.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)): + dependencies: + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 + vite: 8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3) + why-is-node-running: 2.3.0 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@types/node': 25.9.3 + '@vitest/browser-playwright': 4.1.7(playwright@1.60.0)(vite@8.0.14(@types/node@25.9.3)(esbuild@0.28.0)(jiti@2.6.1)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.48.0)(yaml@2.8.3))(vitest@4.1.7) '@vitest/coverage-istanbul': 4.1.7(vitest@4.1.7) jsdom: 27.1.0 transitivePeerDependencies: @@ -27193,6 +27341,10 @@ snapshots: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + watchpack@2.5.2: + dependencies: + graceful-fs: 4.2.11 + weak-lru-cache@1.2.2: optional: true @@ -27213,7 +27365,7 @@ snapshots: webidl-conversions@8.0.1: {} - webpack-sources@3.4.1: {} + webpack-sources@3.5.0: {} webpack-virtual-modules@0.6.2: {} @@ -27225,11 +27377,11 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) + acorn: 8.17.0 + acorn-import-phases: 1.0.4(acorn@8.17.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.21.3 + enhanced-resolve: 5.24.0 es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -27240,9 +27392,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.0(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) - watchpack: 2.5.1 - webpack-sources: 3.4.1 + terser-webpack-plugin: 5.6.1(esbuild@0.28.0)(postcss@8.5.15)(webpack@5.106.2(esbuild@0.28.0)(postcss@8.5.15)) + watchpack: 2.5.2 + webpack-sources: 3.5.0 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 05832d6a8..4b7f185e7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -100,7 +100,7 @@ catalog: markdown-it: 14.2.0 markdown-it-link-attributes: 4.0.1 minisearch: 7.2.0 - playwright: 1.59.1 + playwright: 1.60.0 postcss: 8.5.15 publint: 0.3.21 react: 19.2.5 diff --git a/projects/cli/README.md b/projects/cli/README.md index f590e89db..6e9f1642e 100644 --- a/projects/cli/README.md +++ b/projects/cli/README.md @@ -30,6 +30,14 @@ The best way to get started is to run the install script. curl -fsSL https://nvidia.github.io/elements/install.sh | bash ``` +On Windows, run the PowerShell installer. + +```powershell +irm https://nvidia.github.io/elements/install.ps1 | iex +``` + +For agents and CI, invoke the canonical path directly: `$HOME/.nve/bin/nve` on macOS and Linux, or `$env:LOCALAPPDATA\nve\bin\nve.exe` on Windows. + Alternatively you can install with [Node.js](https://nodejs.org/) and npm. ```shell @@ -142,9 +150,16 @@ Skills provide persistent context to AI agents for building UI with Elements. | Skill | Description | | ----- | ----------- | -| `elements` | Build UI with NVIDIA Elements (NVE). Provides authoring guidelines, workflow steps, and API best practices for creating, editing, or reviewing HTML templates that use nve-* components. | -| `authoring` | Authoring workflow guidance for creating, editing, or reviewing HTML templates that use nve-* components. | -| `migration` | Migration guidance for moving projects from deprecated Elements APIs to current packages and tools. | +| `about` | Instructions for providing a brief introduction for using the Elements Design System. | +| `authoring` | Best practices and workflow guidance for authoring UI with NVIDIA Elements. | +| `doctor` | Instructions for ensuring the Elements Design System is setup correctly. | +| `artifact` | Use when creating throwaway UI artifacts, prototypes, demos, Claude Artifacts, Codex, or GPT Sites pages, or other standalone HTML interfaces that should use the NVIDIA Elements CDN template. | +| `integration` | Best practices and workflow guidance for creating or setting up NVIDIA Elements projects. | +| `migration` | Instructions for migrating a project from deprecated Elements APIs using lint tooling and CLI health checks. | +| `search` | Best practices for providing Elements API Documentation. | +| `elements` | Default skill for UI-related work or NVIDIA Elements (`nve-*`), including HTML, CSS, layout, theming, components, applications, prototypes, Claude Artifacts, Codex Sites pages, and standalone UI artifacts. | + +Run `nve skills.list` or call MCP `skills_list` for the authoritative list. Deployments with the playground service enabled can also expose a `playground` skill for creating Elements Playground prototypes. ### Tools diff --git a/projects/cli/install.cmd b/projects/cli/install.cmd deleted file mode 100644 index bde8078e7..000000000 --- a/projects/cli/install.cmd +++ /dev/null @@ -1,39 +0,0 @@ -@echo off -setlocal - -rem Elements CLI Installer — Windows -rem Usage: curl -fsSL https://NVIDIA.github.io/elements/install.cmd -o install.cmd && install.cmd && del install.cmd - -set "BASE_URL=https://NVIDIA.github.io/elements/cli" -set "BINARY=nve-windows-x64" -set "INSTALL_DIR=%LOCALAPPDATA%\Programs\nve" -set "BIN_NAME=nve.exe" - -echo Installing Elements CLI... - -if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%" - -echo Downloading %BASE_URL%/%BINARY% -curl -fsSL "%BASE_URL%/%BINARY%" -o "%INSTALL_DIR%\%BIN_NAME%" -if %errorlevel% neq 0 ( - echo error: Failed to download binary. Check your internet connection and try again. - exit /b 1 -) - -rem Add to user PATH if not already present -echo %PATH% | findstr /I /C:"%INSTALL_DIR%" >nul 2>&1 -if %errorlevel% neq 0 ( - setx PATH "%INSTALL_DIR%;%PATH%" >nul 2>&1 - set "PATH=%INSTALL_DIR%;%PATH%" - echo Added %INSTALL_DIR% to user PATH. -) - -echo. -echo Elements CLI installed successfully! - -echo. -echo Run "nve --help" to get started. -echo Restart your terminal to update PATH. -echo. - -endlocal diff --git a/projects/cli/install.ps1 b/projects/cli/install.ps1 new file mode 100644 index 000000000..ada551f86 --- /dev/null +++ b/projects/cli/install.ps1 @@ -0,0 +1,39 @@ +# Elements CLI Installer - Windows PowerShell +# Usage: irm https://NVIDIA.github.io/elements/install.ps1 | iex + +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' + +$baseUrl = if ($env:NVE_BASE_URL) { $env:NVE_BASE_URL } else { 'https://NVIDIA.github.io/elements/cli' } +$platformKey = 'windows-x64' +$tempBinary = Join-Path ([System.IO.Path]::GetTempPath()) ("nve-" + [System.IO.Path]::GetRandomFileName() + ".exe") + +try { + $manifest = Invoke-RestMethod -Uri "$baseUrl/manifest.json" + $entry = $manifest.platforms.$platformKey + + if (-not $entry) { + throw "Platform $platformKey not found in CLI manifest." + } + + $runningOnWindows = ($env:OS -eq 'Windows_NT') -or ($IsWindows -eq $true) -or ($PSVersionTable.OS -like '*Windows*') + $downloadName = if ($runningOnWindows -and $entry.filename -notlike '*.exe') { "$($entry.filename).exe" } else { $entry.filename } + + Invoke-WebRequest -UseBasicParsing -Uri "$baseUrl/$downloadName" -OutFile $tempBinary + $actualChecksum = (Get-FileHash -Algorithm SHA256 -Path $tempBinary).Hash.ToLowerInvariant() + if ($actualChecksum -ne $entry.checksum) { + throw "Checksum verification failed for $($entry.filename)." + } + + & $tempBinary install $tempBinary + if ($LASTEXITCODE -ne 0) { + exit $LASTEXITCODE + } + + Write-Host '' + Write-Host 'Elements CLI installed successfully.' +} finally { + if (Test-Path $tempBinary) { + Remove-Item $tempBinary -Force + } +} diff --git a/projects/cli/install.sh b/projects/cli/install.sh index 2632b59cc..c4bbb7a0c 100755 --- a/projects/cli/install.sh +++ b/projects/cli/install.sh @@ -1,142 +1,133 @@ #!/bin/sh -# Elements CLI Installer — macOS & Linux +# Elements CLI Installer - macOS and Linux # Usage: curl -fsSL https://NVIDIA.github.io/elements/install.sh | bash set -eu -BASE_URL="https://NVIDIA.github.io/elements/cli" -INSTALL_DIR="$HOME/.local/bin" -BIN_NAME="nve" - -# --- Colors --- -if [ -t 1 ]; then - RED='\033[0;31m' - GREEN='\033[0;32m' - YELLOW='\033[0;33m' - CYAN='\033[0;36m' - BOLD='\033[1m' - RESET='\033[0m' -else - RED='' GREEN='' YELLOW='' CYAN='' BOLD='' RESET='' -fi +BASE_URL="${NVE_BASE_URL:-https://NVIDIA.github.io/elements/cli}" +TMP_FILE="" -info() { printf "${CYAN}%s${RESET}\n" "$*"; } -warn() { printf "${YELLOW}%s${RESET}\n" "$*"; } -error() { printf "${RED}error: %s${RESET}\n" "$*" >&2; exit 1; } -ok() { printf "${GREEN}%s${RESET}\n" "$*"; } - -# --- OS / Arch detection --- -OS="$(uname -s)" -ARCH="$(uname -m)" - -case "$OS" in - Darwin) - case "$ARCH" in - arm64) BINARY="nve-macos-arm64" ;; - x86_64) BINARY="nve-macos-x64" ;; - *) error "Unsupported macOS architecture: $ARCH. Supported: arm64, x86_64." ;; - esac - ;; - Linux) - case "$ARCH" in - x86_64) BINARY="nve-linux-x64" ;; - aarch64) BINARY="nve-linux-arm64" ;; - *) error "Unsupported Linux architecture: $ARCH. Supported: x86_64, aarch64." ;; - esac - ;; - *) - error "Unsupported operating system: $OS. Use install.cmd for Windows." - ;; -esac +printf '\033[36mNVIDIA Elements CLI Installer\033[0m\n' + +cleanup() { + if [ -n "${TMP_FILE:-}" ]; then + rm -f "$TMP_FILE" + fi +} +trap cleanup EXIT + +error() { + printf "error: %s\n" "$*" >&2 + exit 1 +} -DOWNLOAD_URL="$BASE_URL/$BINARY" +download_file() { + url="$1" + output="${2:-}" -# --- Download helper --- -download() { if command -v curl >/dev/null 2>&1; then - curl -fsSL "$1" + if [ -n "$output" ]; then + curl -fsSL -o "$output" "$url" + else + curl -fsSL "$url" + fi elif command -v wget >/dev/null 2>&1; then - wget -qO- "$1" + if [ -n "$output" ]; then + wget -qO "$output" "$url" + else + wget -qO- "$url" + fi else - error "Neither curl nor wget found. Please install one and try again." + error "Neither curl nor wget found. Install one and try again." fi } -# --- Install --- -info "Installing Elements CLI ($BINARY)..." +run_with_spinner() { + message="$1" + success_message="$2" + shift 2 -mkdir -p "$INSTALL_DIR" + if [ ! -t 2 ] || [ -n "${CI:-}" ]; then + printf "%s\n" "$message" + "$@" + return $? + fi -info "Downloading..." -download "$DOWNLOAD_URL" > "$INSTALL_DIR/$BIN_NAME" -chmod +x "$INSTALL_DIR/$BIN_NAME" + "$@" & + pid="$!" + frame_index=0 -# macOS requires ad-hoc code signature for binaries to execute -if [ "$OS" = "Darwin" ] && command -v codesign >/dev/null 2>&1; then - codesign --sign - --force "$INSTALL_DIR/$BIN_NAME" 2>/dev/null || warn "Ad-hoc code signing failed — binary may not run." -fi + while kill -0 "$pid" 2>/dev/null; do + case "$frame_index" in + 0) frame="|" ;; + 1) frame="/" ;; + 2) frame="-" ;; + *) frame="\\" ;; + esac + printf "\r%s %s" "$frame" "$message" >&2 + frame_index=$(((frame_index + 1) % 4)) + sleep 0.1 + done + + set +e + wait "$pid" + status="$?" + set -e + + if [ "$status" -eq 0 ]; then + printf "\r\033[K%s\n" "$success_message" >&2 + else + printf "\r\033[KFailed. %s\n" "$message" >&2 + fi -info "Binary installed to $INSTALL_DIR/$BIN_NAME" + return "$status" +} -# --- PATH setup --- -add_to_path() { - EXPORT_LINE="export PATH=\"$INSTALL_DIR:\$PATH\"" +get_manifest_field() { + field="$1" + compact_manifest="$(printf '%s' "$MANIFEST_JSON" | tr -d '\n\r\t ')" + printf '%s' "$compact_manifest" | sed -n "s/.*\"$PLATFORM_KEY\"[^{]*{[^}]*\"$field\":\"\([^\"]*\)\".*/\1/p" +} - case "$1" in - */fish/config.fish) - EXPORT_LINE="fish_add_path $INSTALL_DIR" - ;; - esac +get_sha256() { + file="$1" - if [ -f "$1" ] && grep -qF "$INSTALL_DIR" "$1" 2>/dev/null; then - return 0 + if command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$file" | sed 's/ .*//' + elif command -v sha256sum >/dev/null 2>&1; then + sha256sum "$file" | sed 's/ .*//' + else + error "Neither shasum nor sha256sum found. Install one and try again." fi - - printf '\n# Elements CLI\n%s\n' "$EXPORT_LINE" >> "$1" - info "Added $INSTALL_DIR to PATH in $1" } -IN_PATH=0 -case ":${PATH}:" in - *":$INSTALL_DIR:"*) IN_PATH=1 ;; +case "$(uname -s)" in + Darwin) OS="macos" ;; + Linux) OS="linux" ;; + *) error "Unsupported operating system: $(uname -s). Use install.ps1 for Windows." ;; esac -if [ "$IN_PATH" -eq 0 ]; then - SHELL_NAME="$(basename "$SHELL" 2>/dev/null || echo "sh")" - case "$SHELL_NAME" in - bash) - if [ -f "$HOME/.bashrc" ]; then - add_to_path "$HOME/.bashrc" - elif [ -f "$HOME/.bash_profile" ]; then - add_to_path "$HOME/.bash_profile" - else - add_to_path "$HOME/.bashrc" - fi - ;; - zsh) - add_to_path "$HOME/.zshrc" - ;; - fish) - mkdir -p "$HOME/.config/fish" - add_to_path "$HOME/.config/fish/config.fish" - ;; - *) - warn "Could not detect shell. Add $INSTALL_DIR to your PATH manually." - ;; - esac - export PATH="$INSTALL_DIR:$PATH" -fi +case "$(uname -m)" in + arm64 | aarch64) ARCH="arm64" ;; + x86_64 | amd64) ARCH="x64" ;; + *) error "Unsupported architecture: $(uname -m)." ;; +esac -# --- Verify --- -printf "${GREEN}${BOLD}Elements CLI installed successfully!${RESET}\n" +PLATFORM_KEY="$OS-$ARCH" +MANIFEST_JSON="$(download_file "$BASE_URL/manifest.json")" +BINARY="$(get_manifest_field "filename")" +CHECKSUM="$(get_manifest_field "checksum")" -printf "\n Run ${CYAN}nve${RESET} to get started.\n" +if [ -z "$BINARY" ] || [ -z "$CHECKSUM" ]; then + error "Platform $PLATFORM_KEY not found in CLI manifest." +fi -if [ "$IN_PATH" -eq 0 ]; then - SHELL_RC=".bashrc" - case "$(basename "$SHELL" 2>/dev/null)" in - zsh) SHELL_RC=".zshrc" ;; - fish) SHELL_RC=".config/fish/config.fish" ;; - esac - printf " Restart your shell or run ${CYAN}source ~/%s${RESET} to update PATH.\n" "$SHELL_RC" +TMP_FILE="$(mktemp "${TMPDIR:-/tmp}/nve.XXXXXX")" +run_with_spinner "Downloading Elements CLI..." "Downloaded Elements CLI." download_file "$BASE_URL/$BINARY" "$TMP_FILE" + +ACTUAL_CHECKSUM="$(get_sha256 "$TMP_FILE")" +if [ "$ACTUAL_CHECKSUM" != "$CHECKSUM" ]; then + error "Checksum verification failed for $BINARY." fi -printf "\n" + +chmod +x "$TMP_FILE" +"$TMP_FILE" install "$TMP_FILE" diff --git a/projects/cli/package.json b/projects/cli/package.json index aefd9a09d..edd2999f1 100644 --- a/projects/cli/package.json +++ b/projects/cli/package.json @@ -42,10 +42,8 @@ "test": "wireit", "test:watch": "wireit", "test:coverage": "wireit", - "nve:install": "pnpm run build && mkdir -p $HOME/.local/bin && cp dist/nve-macos-arm64 $HOME/.local/bin/nve && codesign --sign - --force $HOME/.local/bin/nve", - "nve:uninstall": "rm -f $HOME/.local/bin/nve", - "nve:install:node": "test -n \"$CI\" || pnpm link --global", - "nve:uninstall:node": "pnpm uninstall --global @nvidia-elements/cli" + "cli:install": "pnpm run build && NVE_BASE_URL=\"file://$PWD/dist\" ./install.sh", + "cli:uninstall": "root=\"${NVE_HOME:-$HOME/.nve}\" && rm -f \"$root/bin/nve\" \"$root/manifest.json\" \"$HOME/.local/bin/nve\" && (rmdir \"$root/bin\" \"$root\" 2>/dev/null || true)" }, "dependencies": { "@inquirer/prompts": "8.5.0", @@ -97,9 +95,12 @@ "output": [] }, "build": { - "command": "bun build --compile --minify dist/index.js --target=bun-darwin-arm64 --outfile dist/nve-macos-arm64 && (command -v codesign >/dev/null && codesign --sign - --force dist/nve-macos-arm64 || true) && bun build --compile --minify dist/index.js --target=bun-darwin-x64 --outfile dist/nve-macos-x64 && (command -v codesign >/dev/null && codesign --sign - --force dist/nve-macos-x64 || true) && bun build --compile --minify --target=bun-linux-x64 dist/index.js --outfile dist/nve-linux-x64 && bun build --compile --minify --target=bun-linux-arm64 dist/index.js --outfile dist/nve-linux-arm64 && bun build --compile --minify --target=bun-windows-x64-modern dist/index.js --outfile dist/nve-windows-x64", + "command": "bun build --compile --minify dist/index.js --target=bun-darwin-arm64 --outfile dist/nve-macos-arm64 && (command -v codesign >/dev/null && codesign --sign - --force dist/nve-macos-arm64 || true) && bun build --compile --minify dist/index.js --target=bun-darwin-x64 --outfile dist/nve-macos-x64 && (command -v codesign >/dev/null && codesign --sign - --force dist/nve-macos-x64 || true) && bun build --compile --minify --target=bun-linux-x64 dist/index.js --outfile dist/nve-linux-x64 && bun build --compile --minify --target=bun-linux-arm64 dist/index.js --outfile dist/nve-linux-arm64 && bun build --compile --minify --target=bun-windows-x64-modern dist/index.js --outfile dist/nve-windows-x64 && node scripts/write-install-manifest.mjs", "files": [ "../internals/tools/dist/**/*.js", + "install.ps1", + "install.sh", + "scripts/**", "src/**", "!src/**/*.test.ts", "package.json", @@ -107,6 +108,7 @@ "tsconfig.lib.json" ], "output": [ + "dist/manifest.json", "dist/nve-macos-arm64", "dist/nve-linux-arm64", "dist/nve-macos-x64", @@ -137,8 +139,7 @@ ], "output": [ "dist/**/*.js", - "dist/**/*.d.ts", - "dist/manifest.json" + "dist/**/*.d.ts" ], "env": { "CI": { @@ -200,6 +201,8 @@ "files": [ "dist/**/*.js", "dist/**/*.html", + "install.ps1", + "install.sh", "src/**/*.test.ts", "tsconfig.json", "vitest.config.ts" @@ -223,6 +226,8 @@ "files": [ "dist/**/*.js", "dist/**/*.html", + "install.ps1", + "install.sh", "src/**/*.test.ts", "tsconfig.json", "vitest.config.ts" diff --git a/projects/cli/scripts/write-install-manifest.mjs b/projects/cli/scripts/write-install-manifest.mjs new file mode 100644 index 000000000..4f5a4274e --- /dev/null +++ b/projects/cli/scripts/write-install-manifest.mjs @@ -0,0 +1,27 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { createHash } from 'node:crypto'; +import { existsSync, readFileSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +const platformBinaries = [ + { key: 'macos-arm64', filename: 'nve-macos-arm64', source: 'nve-macos-arm64' }, + { key: 'macos-x64', filename: 'nve-macos-x64', source: 'nve-macos-x64' }, + { key: 'linux-x64', filename: 'nve-linux-x64', source: 'nve-linux-x64' }, + { key: 'linux-arm64', filename: 'nve-linux-arm64', source: 'nve-linux-arm64' }, + { key: 'windows-x64', filename: 'nve-windows-x64.exe', source: 'nve-windows-x64.exe' } +]; + +const manifestPath = resolve('dist/manifest.json'); +const existingManifest = existsSync(manifestPath) ? JSON.parse(readFileSync(manifestPath, 'utf-8')) : {}; +const indexContent = readFileSync(resolve('dist/index.js')); +const sha = existingManifest.sha || createHash('sha256').update(indexContent).digest('hex').slice(0, 12); +const platforms = Object.fromEntries( + platformBinaries.map(({ key, filename, source }) => { + const content = readFileSync(resolve('dist', source)); + return [key, { filename, checksum: createHash('sha256').update(content).digest('hex') }]; + }) +); + +writeFileSync(manifestPath, `${JSON.stringify({ sha, platforms }, null, 2)}\n`); diff --git a/projects/cli/src/index.test.ts b/projects/cli/src/index.test.ts index 90f84335a..5dec73b25 100644 --- a/projects/cli/src/index.test.ts +++ b/projects/cli/src/index.test.ts @@ -1,15 +1,15 @@ // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -import { execSync, spawnSync } from 'node:child_process'; +import { execFileSync, spawnSync } from 'node:child_process'; import { describe, it, expect } from 'vitest'; import { VERSION } from './index.js'; describe('index', () => { - const output = execSync('node dist/index.js').toString(); + const output = execFileSync(process.execPath, ['dist/index.js']).toString(); function runWithoutRequiredArgs(command: string) { - const result = spawnSync('node', ['dist/index.js', command], { + const result = spawnSync(process.execPath, ['dist/index.js', command], { timeout: 3000, encoding: 'utf-8', input: '' // close stdin so prompts don't hang @@ -71,6 +71,10 @@ describe('index', () => { expect(output).toContain('nve api.tokens.list [format]'); }); + it('should not show hidden install command', () => { + expect(output).not.toContain('nve install'); + }); + describe('interactive fallback for missing required args', () => { it('should not exit with validation error for project.create without ', () => { const result = runWithoutRequiredArgs('project.create'); @@ -93,7 +97,7 @@ describe('index', () => { describe('fail handler', () => { it('should exit with code 1 for invalid positional choice values', () => { - const result = spawnSync('node', ['dist/index.js', 'project.create', 'not-a-valid-type'], { + const result = spawnSync(process.execPath, ['dist/index.js', 'project.create', 'not-a-valid-type'], { timeout: 5000, encoding: 'utf-8', input: '' @@ -106,7 +110,7 @@ describe('index', () => { describe('comma-separated array argument parsing', () => { it('should split a comma-separated string into individual values for array-type args', () => { - const result = spawnSync('node', ['dist/index.js', 'api.get', 'nve-foo,nve-bar'], { + const result = spawnSync(process.execPath, ['dist/index.js', 'api.get', 'nve-foo,nve-bar'], { timeout: 10000, encoding: 'utf-8', input: '' @@ -120,7 +124,7 @@ describe('index', () => { describe('tool errors', () => { it('should exit with error when exact api lookup has no matches', () => { - const result = spawnSync('node', ['dist/index.js', 'api.get', 'nve-badges'], { + const result = spawnSync(process.execPath, ['dist/index.js', 'api.get', 'nve-badges'], { timeout: 10000, encoding: 'utf-8', input: '' @@ -134,7 +138,7 @@ describe('index', () => { it('should print structured error results when they are available', () => { const result = spawnSync( - 'node', + process.execPath, ['dist/index.js', 'playground.create', 'hello'], { timeout: 10000, diff --git a/projects/cli/src/index.ts b/projects/cli/src/index.ts index 8ce5510e1..39e6c7d50 100755 --- a/projects/cli/src/index.ts +++ b/projects/cli/src/index.ts @@ -10,6 +10,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import { performance } from 'perf_hooks'; import { type ManagedToolMethod, tools, ToolSupport, type Schema, isDebug, MAX_CONTEXT_TOKENS } from '@internals/tools'; +import { installNve } from './install.js'; import { banner, colors, getArgValue, progressBar, renderResult, runAsyncTool } from './utils.js'; import { notifyIfUpdateAvailable } from './update.js'; @@ -50,6 +51,21 @@ async function exitWithToolError(result: unknown, message: string | undefined): process.exit(1); } +yargsInstance.command( + 'install [source]', + false, + builder => builder.positional('source', { type: 'string' }), + async argv => { + try { + await installNve({ source: typeof argv.source === 'string' ? argv.source : process.execPath }); + process.exit(0); + } catch (e) { + console.error(colors.error(e instanceof Error ? e.message : String(e))); + process.exit(1); + } + } +); + yargsInstance.command( '$0', 'About and help', diff --git a/projects/cli/src/install.test.ts b/projects/cli/src/install.test.ts new file mode 100644 index 000000000..d98e6a829 --- /dev/null +++ b/projects/cli/src/install.test.ts @@ -0,0 +1,959 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { createHash } from 'node:crypto'; +import { spawnSync } from 'node:child_process'; +import { chmod, lstat, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; +import { existsSync, readFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { dirname, join, resolve } from 'node:path'; +import { PassThrough } from 'node:stream'; +import { afterEach, describe, expect, it } from 'vitest'; +import { formatSkillMarkdown, skills } from '@internals/tools/skills'; +import { getInstallPaths, installInternals, installNve } from './install.js'; + +interface InstallerContext { + fakeBin: string; + home: string; + root: string; +} + +interface InstallManifest { + canonicalBinaryPath: string; + cliName: string; + pathResolutionWorkedDuringInstall: boolean; + platform: string; + shimPaths: string[]; + version: string; +} + +const installSh = resolve(import.meta.dirname, '../install.sh'); +const installPs1 = resolve(import.meta.dirname, '../install.ps1'); +const installTs = resolve(import.meta.dirname, 'install.ts'); +const writeInstallManifest = resolve(import.meta.dirname, '../scripts/write-install-manifest.mjs'); +const tempRoots: string[] = []; + +afterEach(async () => { + await Promise.all(tempRoots.splice(0).map(root => rm(root, { recursive: true, force: true }))); +}); + +describe('installNve', () => { + it('should install nve to the default canonical path', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const logs: string[] = []; + const logCalls: unknown[][] = []; + const env = createUnixEnv(context); + + await installNve({ + env, + log: (...args) => { + logCalls.push(args); + logs.push(args[0]); + }, + prompt: skipPrompt, + source + }); + + const canonicalPath = join(context.home, '.nve/bin/nve'); + const manifest = JSON.parse(await readFile(join(context.home, '.nve/manifest.json'), 'utf-8')) as InstallManifest; + const directResult = spawnSync(canonicalPath, ['--version'], { + encoding: 'utf-8', + env: { PATH: '/usr/bin:/bin:/usr/sbin:/sbin' } + }); + + expect(directResult.status).toBe(0); + expect(directResult.stdout.trim()).toBe('9.8.7-test'); + expect(manifest.cliName).toBe('nve'); + expect(manifest.version).toBe('9.8.7-test'); + expect(manifest.canonicalBinaryPath).toBe(canonicalPath); + expect(manifest.pathResolutionWorkedDuringInstall).toBe(true); + expect(logCalls.every(args => args.length === 1)).toBe(true); + expect(logs.join('\n')).not.toContain('Diagnostics:'); + expect(logs.join('\n')).toContain(`Installed CLI at ${canonicalPath}`); + }); + + it('should print detailed diagnostics when install debug output is enabled', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const logs: string[] = []; + + await installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: message => logs.push(message), + prompt: skipPrompt, + source + }); + + const output = logs.join('\n'); + expect(output).toContain('Diagnostics:'); + expect(output).toContain('direct canonical execution: ok'); + expect(output).toContain('restricted PATH direct execution: ok'); + }); + + it('should install nve to a custom NVE_HOME without HOME', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const nveHome = join(context.root, 'custom-nve'); + const env = { NVE_HOME: nveHome, PATH: context.fakeBin, SHELL: '/bin/zsh' }; + + const warnings: string[] = []; + const result = await installNve({ + env, + log: () => {}, + prompt: async () => 'y', + source, + warn: message => warnings.push(message) + }); + + expect(result.canonicalBinaryPath).toBe(join(nveHome, 'bin/nve')); + expect(existsSync(join(nveHome, 'bin/nve'))).toBe(true); + expect(result.shimPaths).toEqual([]); + expect(warnings.join('\n')).toContain('HOME is not set'); + }); + + it('should fail when Unix install paths cannot resolve a home directory', () => { + expect(() => getInstallPaths({}, 'linux')).toThrow('HOME is not set. Set NVE_HOME and retry.'); + }); + + it('should fail when Windows install paths cannot resolve a local app data directory', () => { + expect(() => getInstallPaths({}, 'win32')).toThrow('LOCALAPPDATA is not set. Set NVE_HOME and retry.'); + }); + + it('should not duplicate shell profile entries on reinstall', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const env = createUnixEnv(context); + await writeFile(join(context.home, '.zshrc'), '# existing profile\n'); + + await installNve({ env, log: () => {}, prompt: skipPrompt, source }); + await installNve({ env, log: () => {}, prompt: skipPrompt, source }); + + const profile = await readFile(join(context.home, '.zshrc'), 'utf-8'); + expect(countOccurrences(profile, join(context.home, '.nve/bin'))).toBe(1); + }); + + it('should update a fish shell profile', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const env = { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1', SHELL: '/usr/bin/fish' }; + + await installNve({ env, log: () => {}, prompt: skipPrompt, source }); + + const profile = await readFile(join(context.home, '.config/fish/config.fish'), 'utf-8'); + expect(profile).toContain(`fish_add_path ${join(context.home, '.nve/bin')}`); + }); + + it('should update an existing bash profile without a trailing newline', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const env = { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1', SHELL: '/bin/bash' }; + await writeFile(join(context.home, '.bashrc'), '# existing profile'); + + await installNve({ env, log: () => {}, prompt: skipPrompt, source }); + + const profile = await readFile(join(context.home, '.bashrc'), 'utf-8'); + expect(profile).toContain('# existing profile\n\n# Elements CLI'); + expect(profile).toContain(`export PATH="${join(context.home, '.nve/bin')}:$PATH"`); + }); + + it('should use a bash profile when shell is unset', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const env = { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1', SHELL: undefined }; + + await installNve({ env, log: () => {}, prompt: skipPrompt, source }); + + const profile = await readFile(join(context.home, '.bash_profile'), 'utf-8'); + expect(profile).toContain(`export PATH="${join(context.home, '.nve/bin')}:$PATH"`); + }); + + it('should warn when shell profile updates fail', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const warnings: string[] = []; + await mkdir(join(context.home, '.zshrc'), { recursive: true }); + + await installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source, + warn: message => warnings.push(message) + }); + + expect(warnings.join('\n')).toContain(`Could not update ${join(context.home, '.zshrc')}`); + }); + + it('should create a convenience shim', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + + await installNve({ env: createUnixEnv(context), log: () => {}, prompt: skipPrompt, source }); + + const shimPath = join(context.home, '.local/bin/nve'); + const shimStats = await lstat(shimPath); + expect(shimStats.isSymbolicLink() || shimStats.isFile()).toBe(true); + }); + + it('should skip copying when the source already is the canonical binary', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.home, '.nve/bin/nve')); + + const result = await installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source + }); + + expect(result.canonicalBinaryPath).toBe(source); + expect(spawnSync(source, ['--version'], { encoding: 'utf-8' }).stdout.trim()).toBe('9.8.7-test'); + }); + + it('should use stderr when the version command does not write stdout', async () => { + const context = await createInstallerContext(); + const source = await writeStderrVersionFakeNve(join(context.root, 'source-nve')); + + const result = await installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source + }); + + expect(result.version).toBe('9.8.7-stderr-test'); + }); + + it('should install with default options from process environment', async () => { + const context = await createInstallerContext(); + const originalCi = process.env.CI; + const originalHome = process.env.HOME; + const originalNveHome = process.env.NVE_HOME; + const originalPath = process.env.PATH; + const originalShell = process.env.SHELL; + const originalDebug = process.env.NVE_INSTALL_DEBUG; + + try { + process.env.CI = 'true'; + process.env.HOME = context.home; + process.env.NVE_HOME = join(context.root, 'default-options-nve'); + process.env.NVE_INSTALL_DEBUG = '1'; + process.env.PATH = context.fakeBin; + process.env.SHELL = '/bin/zsh'; + + const result = await installNve(); + + expect(result.canonicalBinaryPath).toBe(join(context.root, 'default-options-nve/bin/nve')); + expect(result.version).toBe(process.version); + } finally { + restoreCi(originalCi); + restoreHome(originalHome); + restoreNveHome(originalNveHome); + restorePath(originalPath); + restoreShell(originalShell); + restoreDebug(originalDebug); + } + }); + + it('should reject a source binary that cannot report its version', async () => { + const context = await createInstallerContext(); + const source = await writeFailingNve(join(context.root, 'source-nve')); + + await expect( + installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source + }) + ).rejects.toThrow('Direct canonical execution failed'); + }); + + it('should include stdout from failed version checks', async () => { + const context = await createInstallerContext(); + const source = await writeStdoutFailingNve(join(context.root, 'source-nve')); + + await expect( + installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source + }) + ).rejects.toThrow('stdout failure'); + }); + + it('should include the exit code from silent failed version checks', async () => { + const context = await createInstallerContext(); + const source = await writeSilentFailingNve(join(context.root, 'source-nve')); + + await expect( + installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: skipPrompt, + source + }) + ).rejects.toThrow('exit code 7'); + }); + + it('should install the global Elements skill when accepted', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + let promptQuestion = ''; + + await installNve({ + env: createUnixEnv(context), + log: () => {}, + prompt: async question => { + promptQuestion = question; + return 'yes'; + }, + source + }); + + const skillPath = join(context.home, '.agents/skills/elements/SKILL.md'); + expect(promptQuestion).toBe('Install Elements agent skill globally? (Y/n) '); + expect(await readFile(skillPath, 'utf-8')).toBe(getExpectedElementsSkillMarkdown()); + }); + + it('should install the global Elements skill when the prompt uses the default answer', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + + await installNve({ env: createUnixEnv(context), log: () => {}, prompt: async () => '', source }); + + const skillPath = join(context.home, '.agents/skills/elements/SKILL.md'); + expect(await readFile(skillPath, 'utf-8')).toBe(getExpectedElementsSkillMarkdown()); + }); + + it('should overwrite the global Elements skill when accepted', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const skillPath = join(context.home, '.agents/skills/elements/SKILL.md'); + await mkdir(dirname(skillPath), { recursive: true }); + await writeFile(skillPath, 'stale skill'); + + await installNve({ env: createUnixEnv(context), log: () => {}, prompt: async () => 'y', source }); + + expect(await readFile(skillPath, 'utf-8')).toBe(getExpectedElementsSkillMarkdown()); + }); + + it('should skip global skill installation when declined', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + + await installNve({ env: createUnixEnv(context), log: () => {}, prompt: async () => 'N', source }); + + expect(existsSync(join(context.home, '.agents/skills/elements/SKILL.md'))).toBe(false); + }); + + it('should install the global Elements skill when prompt input is unavailable', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + + await installNve({ env: createUnixEnv(context), log: () => {}, prompt: skipPrompt, source }); + + const skillPath = join(context.home, '.agents/skills/elements/SKILL.md'); + expect(await readFile(skillPath, 'utf-8')).toBe(getExpectedElementsSkillMarkdown()); + }); + + it('should install the global Elements skill when the prompt rejects', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + + await installNve({ + env: { ...createUnixEnv(context), NVE_INSTALL_DEBUG: '1' }, + log: () => {}, + prompt: async () => Promise.reject(new Error('input unavailable')), + source + }); + + const skillPath = join(context.home, '.agents/skills/elements/SKILL.md'); + expect(await readFile(skillPath, 'utf-8')).toBe(getExpectedElementsSkillMarkdown()); + }); + + it('should skip the global skill prompt in CI', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + let prompted = false; + + await installNve({ + env: { ...createUnixEnv(context), CI: 'true' }, + log: () => {}, + prompt: async () => { + prompted = true; + return 'yes'; + }, + source + }); + + expect(prompted).toBe(false); + expect(existsSync(join(context.home, '.agents/skills/elements/SKILL.md'))).toBe(false); + }); + + it('should keep the CLI install when global skill installation fails', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.root, 'source-nve')); + const warnings: string[] = []; + await writeFile(join(context.home, '.agents'), 'not a directory'); + + const result = await installNve({ + env: createUnixEnv(context), + log: () => {}, + prompt: async () => 'yes', + source, + warn: message => warnings.push(message) + }); + + expect(existsSync(result.canonicalBinaryPath)).toBe(true); + expect(warnings.join('\n')).toContain('Could not install Elements agent skill'); + }); + + it('should resolve Windows canonical paths', () => { + const paths = getInstallPaths({ LOCALAPPDATA: 'C:\\Users\\Ada\\AppData\\Local' }, 'win32'); + + expect(paths.canonicalBinaryPath).toBe('C:\\Users\\Ada\\AppData\\Local\\nve\\bin\\nve.exe'); + expect(paths.windowsCommandShimPath).toBe('C:\\Users\\Ada\\AppData\\Local\\nve\\bin\\nve.cmd'); + }); + + it('should resolve Windows canonical paths from NVE_HOME', () => { + const paths = getInstallPaths({ NVE_HOME: 'C:\\Tools\\nve' }, 'win32'); + + expect(paths.root).toBe('C:\\Tools\\nve'); + expect(paths.binDir).toBe('C:\\Tools\\nve\\bin'); + expect(paths.manifestPath).toBe('C:\\Tools\\nve\\manifest.json'); + }); + + it('should quote Windows PowerShell path literals', () => { + expect(installInternals.powershellSingleQuote("C:\\Users\\Ada's Tools\\nve")).toBe( + "'C:\\Users\\Ada''s Tools\\nve'" + ); + }); + + it('should create a Windows command shim', async () => { + const context = await createInstallerContext(); + const shimPath = join(context.root, 'nve.cmd'); + + await installInternals.createWindowsCommandShim(shimPath); + + expect(await readFile(shimPath, 'utf-8')).toBe('@echo off\r\n"%~dp0nve.exe" %*\r\n'); + }); + + it('should prepend Windows PATH entries without duplicating existing entries', () => { + const env: NodeJS.ProcessEnv = { Path: 'C:\\Tools\\nve\\bin\\;C:\\Windows' }; + + installInternals.prependPathEntry('C:\\Tools\\nve\\bin', env, 'win32'); + expect(env.PATH).toBeUndefined(); + + installInternals.prependPathEntry('C:\\Users\\Ada\\bin', env, 'win32'); + expect(env.PATH).toBe('C:\\Users\\Ada\\bin;C:\\Tools\\nve\\bin\\;C:\\Windows'); + expect(env.Path).toBe(env.PATH); + }); + + it('should prepend Windows PATH entries to an empty path', () => { + const env: NodeJS.ProcessEnv = {}; + + installInternals.prependPathEntry('C:\\Tools\\nve\\bin', env, 'win32'); + + expect(env.PATH).toBe('C:\\Tools\\nve\\bin'); + expect(env.Path).toBe('C:\\Tools\\nve\\bin'); + }); + + it('should compare normalized Windows PATH entries case-insensitively', () => { + expect(installInternals.hasPathEntry('C:\\Tools\\NVE\\bin\\', 'c:\\tools\\nve\\bin', 'win32')).toBe(true); + expect(installInternals.normalizePathEntry('C:\\Tools\\NVE\\bin\\', 'win32')).toBe('c:\\tools\\nve\\bin'); + }); + + it('should resolve manifest platform names', () => { + expect(installInternals.getManifestPlatform('win32')).toBe('Windows'); + expect(installInternals.getManifestPlatform('linux')).toBe(`linux/${process.arch}`); + }); + + it('should read PATH entries from Windows Path fallback and empty environments', () => { + expect(installInternals.getPathEntries({ Path: 'C:\\One;C:\\Two' }, 'win32')).toEqual(['C:\\One', 'C:\\Two']); + expect(installInternals.getPathEntries({}, 'linux')).toEqual([]); + }); + + it('should return undefined when executable lookup has no matches', () => { + expect(installInternals.findExecutableOnPath('nve', { Path: 'C:\\Missing' }, 'win32')).toBeUndefined(); + expect(installInternals.findExecutableOnPath('nve', {}, 'linux')).toBeUndefined(); + }); + + it('should spawn Windows command shims through a shell', async () => { + const context = await createInstallerContext(); + const commandShim = await writeFakeNve(join(context.root, 'nve.cmd')); + + const result = installInternals.spawnVersion(commandShim, {}, 'win32'); + + expect(result.status).toBe(0); + expect(result.stdout.trim()).toBe('9.8.7-test'); + }); + + it('should update Windows user PATH with PowerShell', async () => { + const context = await createInstallerContext(); + const originalPath = process.env.PATH; + await writeCommand(join(context.fakeBin, 'powershell'), '#!/bin/sh\nexit 0\n'); + + try { + process.env.PATH = `${context.fakeBin}:${originalPath ?? ''}`; + const env: NodeJS.ProcessEnv = { Path: 'C:\\Windows' }; + const warnings: string[] = []; + + installInternals.setupWindowsPath('C:\\Tools\\nve\\bin', env, message => warnings.push(message)); + + expect(warnings).toEqual([]); + expect(env.PATH).toBe('C:\\Tools\\nve\\bin;C:\\Windows'); + expect(env.Path).toBe(env.PATH); + } finally { + restorePath(originalPath); + } + }); + + it('should warn when Windows user PATH updates fail', async () => { + const context = await createInstallerContext(); + const originalPath = process.env.PATH; + await writeCommand(join(context.fakeBin, 'powershell'), '#!/bin/sh\nexit 1\n'); + + try { + process.env.PATH = `${context.fakeBin}:${originalPath ?? ''}`; + const warnings: string[] = []; + + installInternals.setupWindowsPath('C:\\Tools\\nve\\bin', {}, message => warnings.push(message)); + + expect(warnings.join('\n')).toContain('Could not update the user PATH. Add C:\\Tools\\nve\\bin manually.'); + } finally { + restorePath(originalPath); + } + }); + + it('should print Windows diagnostics', async () => { + const context = await createInstallerContext(); + await writeCommand( + join(context.fakeBin, 'powershell'), + "#!/bin/sh\nprintf '%s\\n' 'C:\\Tools\\nve\\bin\\nve.cmd'\n" + ); + await writeCommand( + join(context.fakeBin, 'where.exe'), + "#!/bin/sh\nprintf '%s\\n%s\\n' 'C:\\Tools\\nve\\bin\\nve.exe' 'C:\\Tools\\nve\\bin\\nve.cmd'\n" + ); + + const diagnostics = installInternals.getDiagnostics( + { + env: { PATH: context.fakeBin }, + log: () => {}, + now: () => new Date(0), + paths: { + binDir: 'C:\\Tools\\nve\\bin', + canonicalBinaryPath: 'C:\\Tools\\nve\\bin\\nve.exe', + manifestPath: 'C:\\Tools\\nve\\manifest.json', + root: 'C:\\Tools\\nve', + windowsCommandShimPath: 'C:\\Tools\\nve\\bin\\nve.cmd' + }, + platform: 'win32', + prompt: skipPrompt, + source: '', + warn: () => {} + }, + '', + true + ); + + expect(diagnostics).toContain(' PATH nve: not found'); + expect(diagnostics).toContain(' PATH Get-Command nve: C:\\Tools\\nve\\bin\\nve.cmd'); + expect(diagnostics).toContain(' PATH where.exe nve: C:\\Tools\\nve\\bin\\nve.exe, C:\\Tools\\nve\\bin\\nve.cmd'); + expect(diagnostics).toContain( + ' Windows note: restart open terminals before expecting PATH changes to appear there.' + ); + }); + + it('should print failed restricted PATH diagnostics', () => { + const diagnostics = installInternals.getDiagnostics( + { + env: { PATH: '' }, + log: () => {}, + now: () => new Date(0), + paths: { + binDir: '/tmp/nve/bin', + canonicalBinaryPath: '/tmp/nve/bin/nve', + manifestPath: '/tmp/nve/manifest.json', + root: '/tmp/nve' + }, + platform: 'linux', + prompt: skipPrompt, + source: '', + warn: () => {} + }, + '', + false + ); + + expect(diagnostics).toContain(' restricted PATH direct execution: failed (/usr/bin:/bin:/usr/sbin:/sbin)'); + expect(diagnostics).toContain(' PATH command -v nve: not found'); + expect(diagnostics).toContain(' PATH nve: not found'); + }); + + it('should print missing Windows command diagnostics', () => { + const diagnostics = installInternals.getDiagnostics( + { + env: { PATH: '' }, + log: () => {}, + now: () => new Date(0), + paths: { + binDir: 'C:\\Tools\\nve\\bin', + canonicalBinaryPath: 'C:\\Tools\\nve\\bin\\nve.exe', + manifestPath: 'C:\\Tools\\nve\\manifest.json', + root: 'C:\\Tools\\nve', + windowsCommandShimPath: 'C:\\Tools\\nve\\bin\\nve.cmd' + }, + platform: 'win32', + prompt: skipPrompt, + source: '', + warn: () => {} + }, + '', + true + ); + + expect(diagnostics).toContain(' PATH Get-Command nve: not found'); + expect(diagnostics).toContain(' PATH where.exe nve: not found'); + }); + + it('should print successful Unix command diagnostics', async () => { + const context = await createInstallerContext(); + const source = await writeFakeNve(join(context.fakeBin, 'nve')); + + expect(installInternals.getCommandPath({ PATH: `${context.fakeBin}:/usr/bin:/bin` })).toBe(source); + }); + + it('should return an empty prompt answer in CI terminal prompting', async () => { + const originalCi = process.env.CI; + + try { + process.env.CI = 'true'; + await expect(installInternals.promptFromTerminal('question', 'linux')).resolves.toBeUndefined(); + } finally { + restoreCi(originalCi); + } + }); + + it('should read prompt answers from streams', async () => { + const input = new PassThrough(); + const output = new PassThrough(); + const answer = installInternals.readPrompt('Name? ', input, output); + + input.end('Ada\n'); + + await expect(answer).resolves.toBe('Ada'); + }); +}); + +describe('install.sh', () => { + it('should show a TTY-only spinner for the binary download', async () => { + const source = await readFile(installSh, 'utf-8'); + + expect(source).toContain('MANIFEST_JSON="$(download_file "$BASE_URL/manifest.json")"'); + expect(source).toContain( + 'run_with_spinner "Downloading Elements CLI..." "Downloaded Elements CLI." download_file "$BASE_URL/$BINARY" "$TMP_FILE"' + ); + expect(source).toContain('printf "\\r%s %s" "$frame" "$message" >&2'); + }); + + it('should verify checksum and execute downloaded nve install', async () => { + if (process.platform === 'win32') { + const source = await readFile(installSh, 'utf-8'); + expect(source).toContain('manifest.json'); + return; + } + + const context = await createInstallerContext(); + await writeDownloadFixture(context); + + const result = runInstaller(context); + expect(result.status, `${result.stdout}\n${result.stderr}`).toBe(0); + + const canonicalPath = join(context.home, '.nve/bin/nve'); + const directResult = spawnSync(canonicalPath, ['--version'], { encoding: 'utf-8' }); + expect(directResult.status).toBe(0); + expect(directResult.stdout.trim()).toBe('9.8.7-test'); + }); + + it('should fail before executing the binary when checksum verification fails', async () => { + if (process.platform === 'win32') { + const source = await readFile(installSh, 'utf-8'); + expect(source).toContain('Checksum verification failed'); + return; + } + + const context = await createInstallerContext(); + await writeDownloadFixture(context, { badChecksum: true }); + + const result = runInstaller(context); + expect(result.status).toBe(1); + expect(`${result.stdout}${result.stderr}`).toContain('Checksum verification failed'); + expect(existsSync(join(context.home, '.nve/bin/nve'))).toBe(false); + }); +}); + +describe('install.ts prompt behavior', () => { + it('should prompt through /dev/tty on Unix when standard streams are piped', async () => { + const source = await readFile(installTs, 'utf-8'); + + expect(source).toContain("if (platform !== 'win32' && existsSync('/dev/tty'))"); + expect(source).not.toContain("platform !== 'win32' && process.stdout.isTTY && existsSync('/dev/tty')"); + }); +}); + +describe('install.ps1', () => { + it('should verify checksum and execute downloaded nve install', async () => { + const source = await readFile(installPs1, 'utf-8'); + + expect(source).toContain('manifest.json'); + expect(source).toContain('$downloadName = if ($runningOnWindows -and $entry.filename -notlike'); + expect(source).toContain('Invoke-WebRequest -UseBasicParsing -Uri "$baseUrl/$downloadName"'); + expect(source).toContain('Get-FileHash'); + expect(source).toContain('Checksum verification failed for $($entry.filename).'); + expect(source).toContain('& $tempBinary install $tempBinary'); + }); +}); + +describe('write-install-manifest', () => { + it('should emit the hosted Windows artifact filename', async () => { + const source = await readFile(writeInstallManifest, 'utf-8'); + + expect(source).toContain("{ key: 'windows-x64', filename: 'nve-windows-x64.exe', source: 'nve-windows-x64.exe' }"); + }); +}); + +async function createInstallerContext(): Promise { + const root = await mkdtemp(join(tmpdir(), 'nve-install-')); + tempRoots.push(root); + + const home = join(root, 'home'); + const fakeBin = join(root, 'fake-bin'); + await mkdir(home, { recursive: true }); + await mkdir(fakeBin, { recursive: true }); + + return { fakeBin, home, root }; +} + +function createUnixEnv({ fakeBin, home }: InstallerContext): NodeJS.ProcessEnv { + const env = { ...process.env, HOME: home, PATH: fakeBin, SHELL: '/bin/zsh' }; + delete env.CI; + return env; +} + +async function skipPrompt(): Promise { + return undefined; +} + +function getExpectedElementsSkillMarkdown(): string { + const skill = skills.find(s => s.name === 'elements'); + if (!skill) { + throw new Error('Elements skill not found'); + } + return formatSkillMarkdown(skill); +} + +async function writeFakeNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile( + path, + ['#!/bin/sh', 'if [ "$1" = "--version" ]; then', ' echo "9.8.7-test"', ' exit 0', 'fi', 'exit 0', ''].join('\n') + ); + await chmod(path, 0o755); + return path; +} + +async function writeStderrVersionFakeNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile( + path, + [ + '#!/bin/sh', + 'if [ "$1" = "--version" ]; then', + ' echo "9.8.7-stderr-test" >&2', + ' exit 0', + 'fi', + 'exit 0', + '' + ].join('\n') + ); + await chmod(path, 0o755); + return path; +} + +async function writeFailingNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile(path, '#!/bin/sh\necho "bad version" >&2\nexit 2\n'); + await chmod(path, 0o755); + return path; +} + +async function writeStdoutFailingNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile(path, '#!/bin/sh\necho "stdout failure"\nexit 3\n'); + await chmod(path, 0o755); + return path; +} + +async function writeSilentFailingNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile(path, '#!/bin/sh\nexit 7\n'); + await chmod(path, 0o755); + return path; +} + +async function writeDownloadFixture(context: InstallerContext, options: { badChecksum?: boolean } = {}): Promise { + const serverDir = join(context.root, 'server'); + const platformKey = getCurrentPlatformKey(); + const binaryName = `nve-${platformKey}`; + const binaryPath = await writeBootstrapFakeNve(join(serverDir, binaryName)); + const checksum = options.badChecksum ? '0'.repeat(64) : getFileChecksum(binaryPath); + const manifest = { platforms: { [platformKey]: { filename: binaryName, checksum } } }; + + await writeFile(join(serverDir, 'manifest.json'), JSON.stringify(manifest)); + await writeFakeCurl(context.fakeBin, serverDir); +} + +async function writeBootstrapFakeNve(path: string): Promise { + await mkdir(dirname(path), { recursive: true }); + await writeFile( + path, + [ + '#!/bin/sh', + 'if [ "$1" = "--version" ]; then', + ' echo "9.8.7-test"', + ' exit 0', + 'fi', + 'if [ "$1" = "install" ]; then', + ' root="${NVE_HOME:-$HOME/.nve}"', + ' mkdir -p "$root/bin"', + ' cp "$2" "$root/bin/nve"', + ' chmod +x "$root/bin/nve"', + ' printf \'{"cliName":"nve"}\\n\' > "$root/manifest.json"', + ' exit 0', + 'fi', + 'exit 2', + '' + ].join('\n') + ); + await chmod(path, 0o755); + return path; +} + +async function writeFakeCurl(fakeBin: string, serverDir: string): Promise { + const fakeCurl = join(fakeBin, 'curl'); + await writeCommand( + fakeCurl, + [ + '#!/bin/sh', + 'output=""', + 'url=""', + 'while [ "$#" -gt 0 ]; do', + ' case "$1" in', + ' -o) output="$2"; shift 2 ;;', + ' -*) shift ;;', + ' *) url="$1"; shift ;;', + ' esac', + 'done', + 'name="${url##*/}"', + `src="${serverDir}/$name"`, + '[ -f "$src" ] || exit 1', + 'if [ -n "$output" ]; then', + ' cp "$src" "$output"', + 'else', + ' cat "$src"', + 'fi', + '' + ].join('\n') + ); +} + +async function writeCommand(path: string, content: string): Promise { + await writeFile(path, content); + await chmod(path, 0o755); +} + +function restorePath(value: string | undefined): void { + if (value === undefined) { + delete process.env.PATH; + return; + } + + process.env.PATH = value; +} + +function restoreCi(value: string | undefined): void { + if (value === undefined) { + delete process.env.CI; + return; + } + + process.env.CI = value; +} + +function restoreHome(value: string | undefined): void { + if (value === undefined) { + delete process.env.HOME; + return; + } + + process.env.HOME = value; +} + +function restoreNveHome(value: string | undefined): void { + if (value === undefined) { + delete process.env.NVE_HOME; + return; + } + + process.env.NVE_HOME = value; +} + +function restoreShell(value: string | undefined): void { + if (value === undefined) { + delete process.env.SHELL; + return; + } + + process.env.SHELL = value; +} + +function restoreDebug(value: string | undefined): void { + if (value === undefined) { + delete process.env.NVE_INSTALL_DEBUG; + return; + } + + process.env.NVE_INSTALL_DEBUG = value; +} + +function runInstaller({ fakeBin, home }: InstallerContext): ReturnType { + return spawnSync('sh', [installSh], { + encoding: 'utf-8', + env: { + ...process.env, + HOME: home, + NVE_BASE_URL: 'https://example.invalid/cli', + PATH: `${fakeBin}:/usr/bin:/bin:/usr/sbin:/sbin`, + SHELL: '/bin/zsh' + }, + timeout: 10000 + }); +} + +function getCurrentPlatformKey(): string { + const os = process.platform === 'darwin' ? 'macos' : process.platform; + const arch = process.arch === 'x64' ? 'x64' : 'arm64'; + return `${os}-${arch}`; +} + +function getFileChecksum(path: string): string { + return createHash('sha256').update(readFileSync(path)).digest('hex'); +} + +function countOccurrences(value: string, search: string): number { + return value.split(search).length - 1; +} diff --git a/projects/cli/src/install.ts b/projects/cli/src/install.ts new file mode 100644 index 000000000..b75244aa7 --- /dev/null +++ b/projects/cli/src/install.ts @@ -0,0 +1,588 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { spawnSync, type SpawnSyncReturns } from 'node:child_process'; +import { chmod, copyFile, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises'; +import { accessSync, constants, createReadStream, createWriteStream, existsSync, realpathSync } from 'node:fs'; +import { basename, dirname, join, resolve, win32 } from 'node:path'; +import { createInterface } from 'node:readline/promises'; +import type { Readable, Writable } from 'node:stream'; +import { formatSkillMarkdown, skills } from '@internals/tools/skills'; +import { colors } from './utils.js'; + +interface InstallPaths { + binDir: string; + canonicalBinaryPath: string; + convenienceShimPath?: string; + manifestPath: string; + root: string; + windowsCommandShimPath?: string; +} + +interface InstallManifest { + canonicalBinaryPath: string; + cliName: 'nve'; + installedAt: string; + pathResolutionWorkedDuringInstall: boolean; + platform: string; + shimPaths: string[]; + version: string; +} + +interface InstallContext { + env: NodeJS.ProcessEnv; + log: (message: string) => void; + now: () => Date; + paths: InstallPaths; + platform: NodeJS.Platform; + prompt: (question: string) => Promise; + source: string; + warn: (message: string) => void; +} + +interface InstallState { + pathExecutable: string; + restrictedPathExecutionWorked: boolean; + shimPaths: string[]; + version: string; +} + +interface InstallOptions { + env?: NodeJS.ProcessEnv; + log?: (message: string) => void; + now?: () => Date; + platform?: NodeJS.Platform; + prompt?: (question: string) => Promise; + source?: string; + warn?: (message: string) => void; +} + +interface InstallResult extends InstallManifest { + directCanonicalExecutionWorked: boolean; + manifestPath: string; + pathExecutable: string; + restrictedPathExecutionWorked: boolean; +} + +const UNIX_RESTRICTED_PATH = '/usr/bin:/bin:/usr/sbin:/sbin'; + +export async function installNve(options: InstallOptions = {}): Promise { + const context = createInstallContext(options); + const state = await installExecutable(context); + const manifest = createManifest(context, state); + + await installGlobalElementsSkill(context); + await writeFile(context.paths.manifestPath, `${JSON.stringify(manifest, null, 2)}\n`); + printInstallSummary(context, state.pathExecutable, state.restrictedPathExecutionWorked); + + return createInstallResult(context, manifest, state); +} + +function createInstallContext(options: InstallOptions): InstallContext { + const platform = options.platform ?? process.platform; + const env = options.env ?? process.env; + return { + env, + log: options.log ?? console.log, + now: options.now ?? (() => new Date()), + paths: getInstallPaths(env, platform), + platform, + prompt: options.prompt ?? (question => promptFromTerminal(question, platform)), + source: resolve(options.source ?? process.execPath), + warn: options.warn ?? console.warn + }; +} + +async function installExecutable(context: InstallContext): Promise { + await mkdir(context.paths.binDir, { recursive: true }); + await copyExecutable(context.source, context.paths.canonicalBinaryPath, context.platform); + + const version = verifyVersion(context.paths.canonicalBinaryPath, context.env, context.platform); + const restrictedPathExecutionWorked = verifyRestrictedPath(context); + const shimPaths = await setupPathIntegration(context); + const pathExecutable = findExecutableOnPath('nve', context.env, context.platform) ?? ''; + + return { pathExecutable, restrictedPathExecutionWorked, shimPaths, version }; +} + +function verifyRestrictedPath({ env, paths, platform }: InstallContext): boolean { + if (platform === 'win32') { + return true; + } + + verifyVersion(paths.canonicalBinaryPath, { ...env, PATH: UNIX_RESTRICTED_PATH }, platform); + return true; +} + +async function setupPathIntegration(context: InstallContext): Promise { + const shimPaths = await setupPlatformShims(context); + prependPathEntry(context.paths.binDir, context.env, context.platform); + return shimPaths; +} + +async function setupPlatformShims({ env, paths, platform, warn }: InstallContext): Promise { + if (platform === 'win32') { + setupWindowsPath(paths.binDir, env, warn); + return paths.windowsCommandShimPath ? [await createWindowsCommandShim(paths.windowsCommandShimPath)] : []; + } + + const shimPath = await createUnixConvenienceShim(paths, env, warn); + await setupUnixShellProfile(paths.binDir, env, warn); + return shimPath ? [shimPath] : []; +} + +function createManifest({ now, paths, platform }: InstallContext, state: InstallState): InstallManifest { + return { + cliName: 'nve', + version: state.version, + platform: getManifestPlatform(platform), + canonicalBinaryPath: paths.canonicalBinaryPath, + shimPaths: state.shimPaths, + pathResolutionWorkedDuringInstall: state.pathExecutable !== '', + installedAt: now().toISOString() + }; +} + +function createInstallResult(context: InstallContext, manifest: InstallManifest, state: InstallState): InstallResult { + return { + ...manifest, + directCanonicalExecutionWorked: true, + manifestPath: context.paths.manifestPath, + pathExecutable: state.pathExecutable, + restrictedPathExecutionWorked: state.restrictedPathExecutionWorked + }; +} + +export function getInstallPaths( + env: NodeJS.ProcessEnv = process.env, + platform: NodeJS.Platform = process.platform +): InstallPaths { + const path = platform === 'win32' ? win32 : { join }; + const root = getInstallRoot(env, platform); + const binDir = path.join(root, 'bin'); + + if (platform === 'win32') { + return { + root, + binDir, + canonicalBinaryPath: path.join(binDir, 'nve.exe'), + manifestPath: path.join(root, 'manifest.json'), + windowsCommandShimPath: path.join(binDir, 'nve.cmd') + }; + } + + return { + root, + binDir, + canonicalBinaryPath: path.join(binDir, 'nve'), + convenienceShimPath: env.HOME ? path.join(env.HOME, '.local', 'bin', 'nve') : undefined, + manifestPath: path.join(root, 'manifest.json') + }; +} + +function getInstallRoot(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string { + if (env.NVE_HOME) { + return env.NVE_HOME; + } + + if (platform === 'win32') { + if (!env.LOCALAPPDATA) { + throw new Error('LOCALAPPDATA is not set. Set NVE_HOME and retry.'); + } + return win32.join(env.LOCALAPPDATA, 'nve'); + } + + if (!env.HOME) { + throw new Error('HOME is not set. Set NVE_HOME and retry.'); + } + return join(env.HOME, '.nve'); +} + +async function copyExecutable(source: string, destination: string, platform: NodeJS.Platform): Promise { + if (!isSamePath(source, destination)) { + await copyFile(source, destination); + } + + if (platform !== 'win32') { + await chmod(destination, 0o755); + } +} + +function isSamePath(left: string, right: string): boolean { + try { + return realpathSync(left) === realpathSync(right); + } catch { + return false; + } +} + +async function createWindowsCommandShim(shimPath: string): Promise { + await writeFile(shimPath, '@echo off\r\n"%~dp0nve.exe" %*\r\n'); + return shimPath; +} + +async function createUnixConvenienceShim( + paths: InstallPaths, + env: NodeJS.ProcessEnv, + warn: (message: string) => void +): Promise { + if (!env.HOME || !paths.convenienceShimPath || paths.convenienceShimPath === paths.canonicalBinaryPath) { + return undefined; + } + + try { + await mkdir(dirname(paths.convenienceShimPath), { recursive: true }); + await rm(paths.convenienceShimPath, { force: true }); + await symlink(paths.canonicalBinaryPath, paths.convenienceShimPath); + return paths.convenienceShimPath; + } catch { + try { + await writeFile(paths.convenienceShimPath, `#!/bin/sh\nexec "${paths.canonicalBinaryPath}" "$@"\n`); + await chmod(paths.convenienceShimPath, 0o755); + return paths.convenienceShimPath; + } catch { + warn(`Could not create convenience shim at ${paths.convenienceShimPath}.`); + return undefined; + } + } +} + +async function setupUnixShellProfile( + binDir: string, + env: NodeJS.ProcessEnv, + warn: (message: string) => void +): Promise { + if (!env.HOME) { + warn(`HOME is not set. Add ${binDir} to PATH manually.`); + return; + } + + const shellName = basename(env.SHELL ?? 'sh'); + const profile = + shellName === 'fish' + ? join(env.HOME, '.config', 'fish', 'config.fish') + : shellName === 'zsh' + ? join(env.HOME, '.zshrc') + : getBashProfile(env.HOME); + const line = shellName === 'fish' ? `fish_add_path ${binDir}` : `export PATH="${binDir}:$PATH"`; + + try { + await appendProfileEntry(profile, binDir, line); + } catch { + warn(`Could not update ${profile}. Add ${binDir} to PATH manually.`); + } +} + +function getBashProfile(home: string): string { + const bashrc = join(home, '.bashrc'); + return existsSync(bashrc) ? bashrc : join(home, '.bash_profile'); +} + +async function appendProfileEntry(profile: string, binDir: string, line: string): Promise { + let content = ''; + try { + content = await readFile(profile, 'utf-8'); + } catch { + await mkdir(dirname(profile), { recursive: true }); + } + + if (content.includes(binDir)) { + return; + } + + await writeFile( + profile, + `${content}${content.endsWith('\n') || content === '' ? '' : '\n'}\n# Elements CLI\n${line}\n` + ); +} + +function setupWindowsPath(binDir: string, env: NodeJS.ProcessEnv, warn: (message: string) => void): void { + const escapedBinDir = powershellSingleQuote(binDir); + const script = [ + `$entry = ${escapedBinDir}`, + "$current = [Environment]::GetEnvironmentVariable('Path', 'User')", + "$entries = @($current -split ';' | Where-Object { $_ })", + "if (-not ($entries | Where-Object { $_.TrimEnd('\\') -ieq $entry.TrimEnd('\\') })) {", + " [Environment]::SetEnvironmentVariable('Path', (@($entry) + $entries) -join ';', 'User')", + '}' + ].join('; '); + const result = spawnSync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', script], { + encoding: 'utf-8' + }); + + if (result.status !== 0) { + warn(`Could not update the user PATH. Add ${binDir} manually.`); + } + + prependPathEntry(binDir, env, 'win32'); +} + +function powershellSingleQuote(value: string): string { + return `'${value.replaceAll("'", "''")}'`; +} + +function prependPathEntry(entry: string, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): void { + const pathValue = env.PATH ?? env.Path ?? ''; + if (hasPathEntry(pathValue, entry, platform)) { + return; + } + + const separator = platform === 'win32' ? ';' : ':'; + env.PATH = pathValue ? `${entry}${separator}${pathValue}` : entry; + if (platform === 'win32') { + env.Path = env.PATH; + } +} + +function hasPathEntry(pathValue: string, entry: string, platform: NodeJS.Platform): boolean { + return pathValue + .split(platform === 'win32' ? ';' : ':') + .filter(Boolean) + .some(pathEntry => normalizePathEntry(pathEntry, platform) === normalizePathEntry(entry, platform)); +} + +function normalizePathEntry(pathEntry: string, platform: NodeJS.Platform): string { + const trimmed = pathEntry.replace(/[\\/]+$/, ''); + return platform === 'win32' ? trimmed.toLowerCase() : trimmed; +} + +function verifyVersion(binaryPath: string, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string { + const result = spawnVersion(binaryPath, env, platform); + if (result.error || result.status !== 0) { + const message = + result.error?.message ?? (result.stderr.trim() || result.stdout.trim() || `exit code ${result.status}`); + throw new Error(`Direct canonical execution failed: ${binaryPath} --version\n${message}`); + } + + return result.stdout.trim() || result.stderr.trim(); +} + +function spawnVersion(binaryPath: string, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): SpawnSyncReturns { + return spawnSync(binaryPath, ['--version'], { + encoding: 'utf-8', + env, + shell: platform === 'win32' && binaryPath.toLowerCase().endsWith('.cmd') + }); +} + +function findExecutableOnPath(command: string, env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string | undefined { + const pathValue = env.PATH ?? env.Path ?? ''; + const names = platform === 'win32' ? [`${command}.exe`, `${command}.cmd`, command] : [command]; + const separator = platform === 'win32' ? ';' : ':'; + const path = platform === 'win32' ? win32 : { join }; + + for (const pathEntry of pathValue.split(separator).filter(Boolean)) { + for (const name of names) { + const candidate = path.join(pathEntry, name); + try { + accessSync(candidate, constants.X_OK); + return candidate; + } catch {} + } + } + + return undefined; +} + +function getManifestPlatform(platform: NodeJS.Platform): string { + return platform === 'win32' ? 'Windows' : `${platform}/${process.arch}`; +} + +async function installGlobalElementsSkill(context: InstallContext): Promise { + if (!(await shouldInstallGlobalElementsSkill(context))) { + return; + } + + const skillPath = getGlobalElementsSkillPath(context.env, context.platform); + if (!skillPath) { + context.warn('Could not install Elements agent skill. HOME is not set.'); + return; + } + + try { + await writeGlobalElementsSkill(skillPath); + context.log(`Installed agent skill at ${skillPath}`); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + context.warn(`Could not install Elements agent skill at ${skillPath}. ${message}`); + } +} + +async function shouldInstallGlobalElementsSkill({ env, prompt }: InstallContext): Promise { + if (env.CI) { + return false; + } + + try { + const answer = await prompt('Install Elements agent skill globally? (Y/n) '); + if (answer === undefined) { + return true; + } + + return !['n', 'no'].includes(answer.trim().toLowerCase()); + } catch { + return true; + } +} + +function getGlobalElementsSkillPath(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string | undefined { + const home = platform === 'win32' ? env.USERPROFILE : env.HOME; + if (!home) { + return undefined; + } + + const path = platform === 'win32' ? win32 : { join }; + return path.join(home, '.agents', 'skills', 'elements', 'SKILL.md'); +} + +async function writeGlobalElementsSkill(skillPath: string): Promise { + const skill = skills.find(s => s.name === 'elements'); + if (!skill) { + throw new Error('Elements skill not found'); + } + + await mkdir(dirname(skillPath), { recursive: true }); + await writeFile(skillPath, formatSkillMarkdown(skill)); +} + +async function promptFromTerminal(question: string, platform: NodeJS.Platform): Promise { + if (process.env.CI) { + return undefined; + } + + if (process.stdin.isTTY && process.stdout.isTTY) { + return readPrompt(question, process.stdin, process.stdout); + } + + if (platform !== 'win32' && existsSync('/dev/tty')) { + return readPromptFromUnixTty(question); + } + + return undefined; +} + +async function readPromptFromUnixTty(question: string): Promise { + const input = createReadStream('/dev/tty'); + const output = createWriteStream('/dev/tty'); + try { + return await readPrompt(question, input, output); + } catch { + return undefined; + } finally { + input.destroy(); + output.end(); + } +} + +async function readPrompt(question: string, input: Readable, output: Writable): Promise { + const readline = createInterface({ input, output }); + try { + return await readline.question(question); + } finally { + readline.close(); + } +} + +function printInstallSummary( + context: InstallContext, + pathExecutable: string, + restrictedPathExecutionWorked: boolean +): void { + if (context.env.NVE_INSTALL_DEBUG === '1') { + printDiagnostics(context, pathExecutable, restrictedPathExecutionWorked); + return; + } + context.log(`Installed CLI at ${context.paths.canonicalBinaryPath}`); + console.log(`\n${colors.complete('Elements CLI installed successfully!')}`); + console.log(`\n Run ${colors.info('nve')} to get started.\n`); +} + +function printDiagnostics( + context: InstallContext, + pathExecutable: string, + restrictedPathExecutionWorked: boolean +): void { + getDiagnostics(context, pathExecutable, restrictedPathExecutionWorked).forEach(line => context.log(line)); +} + +function getDiagnostics( + { env, paths, platform }: InstallContext, + pathExecutable: string, + restrictedPathExecutionWorked: boolean +): string[] { + return [ + '', + 'Diagnostics:', + ` canonical path: ${paths.canonicalBinaryPath}`, + ' direct canonical execution: ok', + ...getPlatformDiagnostics(env, platform, restrictedPathExecutionWorked), + ` PATH nve: ${pathExecutable || 'not found'}`, + ' current PATH entries:', + ...getPathEntries(env, platform).map(pathEntry => ` ${pathEntry}`), + ` manifest path: ${paths.manifestPath}`, + ' recommendation: For agents and CI, use the canonical path.', + ...(platform === 'win32' + ? [' Windows note: restart open terminals before expecting PATH changes to appear there.'] + : []) + ]; +} + +function getPlatformDiagnostics( + env: NodeJS.ProcessEnv, + platform: NodeJS.Platform, + restrictedPathExecutionWorked: boolean +): string[] { + if (platform === 'win32') { + return [ + ` PATH Get-Command nve: ${getPowerShellCommandPath(env) || 'not found'}`, + ` PATH where.exe nve: ${getWhereCommandPath(env) || 'not found'}` + ]; + } + + return [ + ` restricted PATH direct execution: ${restrictedPathExecutionWorked ? 'ok' : 'failed'} (${UNIX_RESTRICTED_PATH})`, + ` PATH command -v nve: ${getCommandPath(env) || 'not found'}` + ]; +} + +function getPathEntries(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): string[] { + return (env.PATH ?? env.Path ?? '').split(platform === 'win32' ? ';' : ':').filter(Boolean); +} + +function getCommandPath(env: NodeJS.ProcessEnv): string { + const result = spawnSync('sh', ['-c', 'command -v nve'], { encoding: 'utf-8', env }); + return result.status === 0 ? result.stdout.trim() : ''; +} + +function getPowerShellCommandPath(env: NodeJS.ProcessEnv): string { + const result = spawnSync( + 'powershell', + ['-NoProfile', '-Command', '(Get-Command nve -ErrorAction SilentlyContinue).Source'], + { encoding: 'utf-8', env } + ); + return result.status === 0 ? result.stdout.trim() : ''; +} + +function getWhereCommandPath(env: NodeJS.ProcessEnv): string { + const result = spawnSync('where.exe', ['nve'], { encoding: 'utf-8', env }); + return result.status === 0 ? result.stdout.trim().replaceAll(/\r?\n/g, ', ') : ''; +} + +export const installInternals = { + createWindowsCommandShim, + findExecutableOnPath, + getCommandPath, + getDiagnostics, + getManifestPlatform, + getPathEntries, + getPowerShellCommandPath, + getWhereCommandPath, + hasPathEntry, + normalizePathEntry, + powershellSingleQuote, + prependPathEntry, + promptFromTerminal, + readPrompt, + spawnVersion, + setupWindowsPath +}; diff --git a/projects/cli/src/utils.test.ts b/projects/cli/src/utils.test.ts index 5e1479c6c..c04a2cf2b 100644 --- a/projects/cli/src/utils.test.ts +++ b/projects/cli/src/utils.test.ts @@ -540,6 +540,23 @@ describe('utils', () => { expect(result).toBe('parsed markdown'); }); + it('should preserve leading frontmatter when rendering markdown', async () => { + const markdown = `--- +name: "authoring" +description: "Authoring guidance" +--- + +# Authoring`; + const result = await renderResult(markdown); + expect(marked.parse).toHaveBeenCalledWith('# Authoring'); + expect(result).toBe(`--- +name: "authoring" +description: "Authoring guidance" +--- + +parsed markdown`); + }); + it('should render other values directly', async () => { const result = await renderResult(42); expect(result).toBe(42); diff --git a/projects/cli/src/utils.ts b/projects/cli/src/utils.ts index a0099cba5..64e9b9801 100644 --- a/projects/cli/src/utils.ts +++ b/projects/cli/src/utils.ts @@ -190,6 +190,7 @@ export function isObjectLiteral(item: unknown) { } let markedConfigured = false; +const frontmatterPattern = /^(---\n[\s\S]*?\n---)(?:\n+|$)/; function configureMarkedTerminal() { if (markedConfigured) return; @@ -212,6 +213,20 @@ function configureMarkedTerminal() { ); } +async function renderMarkdownResult(result: string): Promise { + configureMarkedTerminal(); + const frontmatterMatch = frontmatterPattern.exec(result); + + if (!frontmatterMatch) { + return await marked.parse(result); + } + + const frontmatter = frontmatterMatch[1]!; + const markdown = result.slice(frontmatterMatch[0].length); + + return markdown ? `${frontmatter}\n\n${await marked.parse(markdown)}` : `${frontmatter}\n`; +} + export async function renderResult(result: unknown) { let formattedResult = ''; if (isReport(result)) { @@ -222,8 +237,7 @@ export async function renderResult(result: unknown) { } else if (typeof result === 'string' && result.trim().startsWith('http') && !result.includes('\n')) { formattedResult = colors.complete(wrapUrl(result)); } else if (typeof result === 'string') { - configureMarkedTerminal(); - formattedResult = await marked.parse(result); + formattedResult = await renderMarkdownResult(result); } else { formattedResult = result as string; } diff --git a/projects/cli/vite.config.ts b/projects/cli/vite.config.ts index c548d4f2c..478a2bbb0 100644 --- a/projects/cli/vite.config.ts +++ b/projects/cli/vite.config.ts @@ -98,7 +98,6 @@ function buildBinaryVersionPlugin(): Plugin { } writeFileSync('dist/index.js', content); - writeFileSync('dist/manifest.json', JSON.stringify({ sha: hash })); } }; } diff --git a/projects/internals/tools/src/api/service.ts b/projects/internals/tools/src/api/service.ts index 0f35dcb19..4ae7699b7 100644 --- a/projects/internals/tools/src/api/service.ts +++ b/projects/internals/tools/src/api/service.ts @@ -145,9 +145,16 @@ export class ApiService { type: 'string', description: 'HTML template string containing Elements components (e.g., nve-*, nve-button, nve-input). Can be a full document or fragment.' + }, + type: { + type: 'string', + description: 'The type of template to validate. Use "artifact" for standalone HTML files.', + enum: ['html', 'artifact'], + default: 'html' } }, - required: ['template'] + required: ['template'], + additionalProperties: false }, outputSchema: { oneOf: [ @@ -161,9 +168,15 @@ export class ApiService { ] } }) - static async templateValidate({ template }: { template: string }): Promise { + static async templateValidate({ + template, + type + }: { + template: string; + type: 'html' | 'artifact'; + }): Promise { const { lintTemplate } = await import('@nvidia-elements/lint/eslint/internals'); - return await lintTemplate(template, { strict: false }); + return await lintTemplate(template, { strict: type === 'artifact' }); } @tool({ diff --git a/projects/internals/tools/src/cli/service.ts b/projects/internals/tools/src/cli/service.ts index 5bdf3fe80..b08d93fba 100644 --- a/projects/internals/tools/src/cli/service.ts +++ b/projects/internals/tools/src/cli/service.ts @@ -11,7 +11,7 @@ export class CliService { @tool({ summary: 'Upgrade the Elements CLI (nve) to the latest version.', description: - 'Downloads and installs the latest version of the nve CLI. On macOS/Linux this runs the install script, on Windows it runs the install command.', + 'Downloads and installs the latest version of the nve CLI. On macOS/Linux this runs the shell bootstrapper, on Windows it runs the PowerShell bootstrapper.', support: ToolSupport.MCP, annotations: { destructiveHint: true, diff --git a/projects/internals/tools/src/cli/utils.test.ts b/projects/internals/tools/src/cli/utils.test.ts index a680091d0..871869265 100644 --- a/projects/internals/tools/src/cli/utils.test.ts +++ b/projects/internals/tools/src/cli/utils.test.ts @@ -84,7 +84,7 @@ describe('cli/utils', () => { Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true }); }); - it('should use windows command on win32', async () => { + it('should use windows powershell command on win32', async () => { const { execSync } = await import('node:child_process'); vi.mocked(execSync).mockReturnValue(''); const originalPlatform = process.platform; @@ -92,7 +92,7 @@ describe('cli/utils', () => { await performUpgrade(); - expect(execSync).toHaveBeenCalledWith(upgradeCommands['windows-cmd'], { stdio: 'inherit' }); + expect(execSync).toHaveBeenCalledWith(upgradeCommands['windows-powershell'], { stdio: 'inherit' }); Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true }); }); }); @@ -177,7 +177,7 @@ describe('cli/utils', () => { Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true }); }); - it('should use cmd with /c on win32', async () => { + it('should use cmd with powershell installer command on win32', async () => { const { spawn } = await import('node:child_process'); vi.mocked(spawn).mockReturnValue(createMockChild('') as ReturnType); const originalPlatform = process.platform; @@ -185,7 +185,7 @@ describe('cli/utils', () => { await performUpgrade(vi.fn()); - expect(spawn).toHaveBeenCalledWith('cmd', ['/c', upgradeCommands['windows-cmd']], { stdio: 'pipe' }); + expect(spawn).toHaveBeenCalledWith('cmd', ['/c', upgradeCommands['windows-powershell']], { stdio: 'pipe' }); Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true }); }); }); diff --git a/projects/internals/tools/src/cli/utils.ts b/projects/internals/tools/src/cli/utils.ts index 5b28ab698..b6fcfb72c 100644 --- a/projects/internals/tools/src/cli/utils.ts +++ b/projects/internals/tools/src/cli/utils.ts @@ -10,7 +10,7 @@ export type ProgressCallback = (message: string) => void; export const upgradeCommands = { 'macos/linux': `curl -fsSL ${__ELEMENTS_PAGES_BASE_URL__}/install.sh | bash`, - 'windows-cmd': `curl -fsSL ${__ELEMENTS_PAGES_BASE_URL__}/install.cmd -o install.cmd && install.cmd && del install.cmd`, + 'windows-powershell': `powershell -NoProfile -ExecutionPolicy Bypass -Command "$script = Join-Path $env:TEMP 'nve-install.ps1'; Invoke-WebRequest -UseBasicParsing '${__ELEMENTS_PAGES_BASE_URL__}/install.ps1' -OutFile $script; & $script; Remove-Item $script -ErrorAction SilentlyContinue"`, nodejs: 'npm install -g @nvidia-elements/cli' }; @@ -21,7 +21,7 @@ export const upgradeCommands = { * script sees a real TTY and preserves colors (used by CLI). */ export async function performUpgrade(onProgress?: ProgressCallback): Promise { - const command = process.platform === 'win32' ? upgradeCommands['windows-cmd'] : upgradeCommands['macos/linux']; + const command = process.platform === 'win32' ? upgradeCommands['windows-powershell'] : upgradeCommands['macos/linux']; if (onProgress) { return runAsync(command, onProgress); diff --git a/projects/internals/tools/src/project/setup-agent.test.ts b/projects/internals/tools/src/project/setup-agent.test.ts index 71c51b538..091540f14 100644 --- a/projects/internals/tools/src/project/setup-agent.test.ts +++ b/projects/internals/tools/src/project/setup-agent.test.ts @@ -39,6 +39,16 @@ vi.mock('./starters.js', () => ({ })); vi.mock('../skills/index.js', () => ({ + formatSkillMarkdown: vi.fn( + (skill: { name: string; title: string; description: string; context: string }) => `--- +name: "${skill.name}" +title: "${skill.title}" +description: "${skill.description}" +--- + +${skill.context} +` + ), skills: [ { name: 'elements', @@ -382,9 +392,9 @@ describe('setup-mcp', () => { expect(skillPath).toContain('SKILL.md'); const content = vi.mocked(writeFileSync).mock.calls[0][1] as string; - expect(content).toContain('name: elements'); - expect(content).toContain('title: Elements Design System (nve)'); - expect(content).toContain('description: Build UI with NVIDIA Elements'); + expect(content).toContain('name: "elements"'); + expect(content).toContain('title: "Elements Design System (nve)"'); + expect(content).toContain('description: "Build UI with NVIDIA Elements"'); expect(content).toContain('## Elements Context'); }); diff --git a/projects/internals/tools/src/project/setup-agent.ts b/projects/internals/tools/src/project/setup-agent.ts index 92ac9f6a6..d4e570c1c 100644 --- a/projects/internals/tools/src/project/setup-agent.ts +++ b/projects/internals/tools/src/project/setup-agent.ts @@ -6,7 +6,7 @@ import { join, resolve } from 'node:path'; import { getNPMClient } from '../internal/node.js'; import type { Report } from '../internal/types.js'; import { claudeProjectSettings } from './starters.js'; -import { skills } from '../skills/index.js'; +import { formatSkillMarkdown, skills } from '../skills/index.js'; type IDE = 'cursor' | 'claude-code' | 'codex' | 'all'; @@ -119,14 +119,7 @@ export function writeElementsSkill(skillDir: string): string { mkdirSync(skillDir, { recursive: true }); const skillPath = join(skillDir, 'SKILL.md'); - const content = `--- -name: ${skill.name} -title: ${skill.title} -description: ${skill.description} ---- -${skill.context}`; - - writeFileSync(skillPath, content); + writeFileSync(skillPath, formatSkillMarkdown(skill)); return skillPath; } diff --git a/projects/internals/tools/src/skills/about.md b/projects/internals/tools/src/skills/about.md index 78a7debc3..13763d92a 100644 --- a/projects/internals/tools/src/skills/about.md +++ b/projects/internals/tools/src/skills/about.md @@ -1,6 +1,6 @@ -## Elements Design System +## NVIDIA Elements Design System -Give a high level overview of the Elements Design System. +Give a high level overview of the NVIDIA Elements Design System. **Structure the content as:** diff --git a/projects/internals/tools/src/skills/artifact.md b/projects/internals/tools/src/skills/artifact.md new file mode 100644 index 000000000..186f58309 --- /dev/null +++ b/projects/internals/tools/src/skills/artifact.md @@ -0,0 +1,77 @@ +## Creating an Artifact + +Use this template when creating a standalone UI artifact that is likely throwaway, exploratory, or intended for direct display in an agent client. + +Examples include: + +- Claude Artifacts +- Codex or GPT Sites pages +- single-file HTML prototypes +- interface drafts +- quick dashboards +- demos +- visual design explorations +- temporary review artifacts + +### Rule + +Start from this exact standalone HTML shell for UI artifacts that use NVIDIA Elements: + +```html + + + + NVIDIA Elements Artifact + + + + + + + + +``` + +- Do not rush through the artifact. Review APIs available to you before implementing. +- Do not write CSS selectors that target `nve-*` elements. +- Do not override `nve-*` CSS custom properties unless the user explicitly requests visual theming. +- Do not replace built Elements components with native HTML equivalents for supported use cases. + +### Workflow + +1. Produce a complete HTML document unless the target artifact system requires only the body. +2. Keep the template imports intact. +3. Put the artifact UI inside ``. +4. Prefer NVIDIA Elements components and `nve-layout` / `nve-text` utilities over custom CSS. +5. Use custom CSS only for artifact-specific composition, sizing, or visual polish. +6. Do not add a build step, framework, package install, or external UI library. +7. Do not write explanatory UI chrome unless the user asks for it. +8. Make the first screen the actual usable artifact, not a landing page. + +### Body Pattern + +When the artifact needs no stronger structure, start the body with: + +```html +
+ +
+``` + +Use native semantic HTML with Elements attributes for layout and typography. Use `nve-*` components when you know their APIs or can check them. + +### Validation + +Before finalizing: + +- Verify the HTML is complete and valid. +- Check that every opened tag has a closing tag. +- Ensure visible text fits the intended layout. +- Ensure the artifact works without local dependencies. +- If using `nve-*` components, verify API names rather than guessing. diff --git a/projects/internals/tools/src/skills/authoring.md b/projects/internals/tools/src/skills/authoring.md index 253a5246b..8fb751e97 100644 --- a/projects/internals/tools/src/skills/authoring.md +++ b/projects/internals/tools/src/skills/authoring.md @@ -1,7 +1,14 @@ -## Authoring Guidelines +## Authoring Guidelines & Frontend Tasks **NEVER write nve-\* HTML from assumption—look up every API first.** +Elements owns the visual system. The agent owns only composition. + +For UI artifacts using Elements: + +- Use Elements defaults for color, borders, surfaces, elevation, typography, and states. +- Do not add gradients, custom palettes, custom card borders, shadows, background imagery, or decorative treatments unless the user explicitly requests custom art direction. + ### Authoring UI Workflow Best practices and guidelines for creating UI with NVIDIA Elements. diff --git a/projects/internals/tools/src/skills/index.test.ts b/projects/internals/tools/src/skills/index.test.ts index 8da35acf2..f5feac198 100644 --- a/projects/internals/tools/src/skills/index.test.ts +++ b/projects/internals/tools/src/skills/index.test.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { describe, expect, it } from 'vitest'; -import { prompts, skills, type Prompt, type Skill } from './index.js'; +import { formatSkillMarkdown, prompts, skills, type Prompt, type Skill } from './index.js'; describe('prompts', () => { it('should export an array of prompts', () => { @@ -74,6 +74,16 @@ describe('prompts', () => { expect(result?.messages[0].content.text).toContain('MCP'); }); + it('should have "artifact" prompt with the standalone HTML template', () => { + const artifactPrompt = prompts.find(p => p.name === 'artifact'); + expect(artifactPrompt).toBeDefined(); + expect(artifactPrompt?.title).toBe('NVIDIA Artifact Template'); + + const result = artifactPrompt?.handler({}); + expect(result?.messages[0].content.text).toContain('NVIDIA Elements Artifact'); + expect(result?.messages[0].content.text).toContain('@nvidia-elements/core/dist/bundles/index.min.js'); + }); + it('should have "search" prompt for API documentation', () => { const searchPrompt = prompts.find(p => p.name === 'search'); expect(searchPrompt).toBeDefined(); @@ -137,8 +147,32 @@ describe('skillEntries', () => { expect(uniqueNames.size).toBe(names.length); }); - it('should include authoring and elements entries', () => { + it('should include authoring, artifact, and elements entries', () => { expect(skills.some(skill => skill.name === 'authoring')).toBe(true); + expect(skills.some(skill => skill.name === 'artifact')).toBe(true); expect(skills.some(skill => skill.name === 'elements')).toBe(true); }); + + it('should default elements skill guidance to UI and artifact work', () => { + const elementsSkill = skills.find(skill => skill.name === 'elements'); + expect(elementsSkill?.description).toContain('any UI-related work'); + expect(elementsSkill?.description).toContain('standalone UI artifacts'); + expect(elementsSkill?.context).toContain('prefer the canonical absolute executable path'); + expect(elementsSkill?.context).toContain('$HOME/.nve/bin/nve'); + expect(elementsSkill?.context).toContain('## Creating an Artifact'); + expect(elementsSkill?.context).toContain('@nvidia-elements/core/dist/bundles/index.min.js'); + }); + + it('should format skills as installable markdown files', () => { + const elementsSkill = skills.find(skill => skill.name === 'elements'); + expect(elementsSkill).toBeDefined(); + if (!elementsSkill) return; + + const markdown = formatSkillMarkdown(elementsSkill); + + expect(markdown).toMatch(/^---\nname: "elements"\ntitle: "Elements Design System \(nve\)"/); + expect(markdown).toContain('description: "Use this skill by default'); + expect(markdown).toContain('# Building UI with NVIDIA Elements'); + expect(markdown.endsWith('\n')).toBe(true); + }); }); diff --git a/projects/internals/tools/src/skills/index.ts b/projects/internals/tools/src/skills/index.ts index bdaafa146..64c0ecb6e 100644 --- a/projects/internals/tools/src/skills/index.ts +++ b/projects/internals/tools/src/skills/index.ts @@ -2,4 +2,5 @@ // SPDX-License-Identifier: Apache-2.0 export * from './registry.js'; +export * from './markdown.js'; export * from './service.js'; diff --git a/projects/internals/tools/src/skills/integration.md b/projects/internals/tools/src/skills/integration.md index 7a8ef4f6d..e3bd017c6 100644 --- a/projects/internals/tools/src/skills/integration.md +++ b/projects/internals/tools/src/skills/integration.md @@ -1,4 +1,4 @@ -## Creating Elements Starter Project +## Creating Starter Project Best practices and guidelines for creating an Elements Starter Project. diff --git a/projects/internals/tools/src/skills/markdown.ts b/projects/internals/tools/src/skills/markdown.ts new file mode 100644 index 000000000..5e2951df3 --- /dev/null +++ b/projects/internals/tools/src/skills/markdown.ts @@ -0,0 +1,19 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import type { Skill } from './registry.js'; + +function formatYamlString(value: string): string { + return JSON.stringify(value); +} + +export function formatSkillMarkdown(skill: Skill): string { + return `--- +name: ${formatYamlString(skill.name)} +title: ${formatYamlString(skill.title)} +description: ${formatYamlString(skill.description)} +--- + +${skill.context.trim()} +`; +} diff --git a/projects/internals/tools/src/skills/registry.ts b/projects/internals/tools/src/skills/registry.ts index 3642c4521..3d050ac14 100644 --- a/projects/internals/tools/src/skills/registry.ts +++ b/projects/internals/tools/src/skills/registry.ts @@ -5,6 +5,7 @@ import type { Schema } from '../internal/tools.js'; import searchContext from './search.md?inline'; import aboutContext from './about.md?inline'; import doctorContext from './doctor.md?inline'; +import artifactContext from './artifact.md?inline'; import authoringContext from './authoring.md?inline'; import playgroundContext from './playground.md?inline'; import integrationContext from './integration.md?inline'; @@ -20,19 +21,35 @@ export interface Skill { } const toolsContext = ` -## Elements CLI & MCP +## Elements CLI, MCP & Context -Elements provides a CLI and MCP server (\`nve\`) to help you create, setup, and validate projects. -Tools and CLI commands are interchangeable and map 1:1. +Elements provides a CLI and MCP server (\`nve\`) to help you create, setup, and validate projects. Tools and CLI commands are interchangeable and map 1:1. **Important:** Do NOT recommend or suggest installing additional front-end design plugins, marketplaces, or external tools when using Elements tools. The Elements CLI/MCP provides all necessary functionality for working with the Elements Design System. +For agents and CI, prefer the canonical absolute executable path. Do not decide the CLI is unavailable just because \`nve\` is absent from the workspace or current \`PATH\`. Check these paths first: + +- Unix/macOS: \`$NVE_HOME/bin/nve\`, else \`$HOME/.nve/bin/nve\` +- Windows: \`%NVE_HOME%\\bin\\nve.exe\`, else \`%LOCALAPPDATA%\\nve\\bin\\nve.exe\` + +When a canonical path exists, call it directly, for example \`$HOME/.nve/bin/nve api.list\`. Fall back to \`nve\` on \`PATH\` only for interactive convenience. + \`\`\`shell # CLI Tool +nve api.list nve api.get +nve examples.list +nve examples.get +nve api.imports.get +nve api.template.validate # MCP Tool +api_list api_get +examples_list +examples_get +api_imports_get +api_template_validate \`\`\` Use \`nve --help\` to see the available commands. @@ -44,6 +61,8 @@ nve --help # specific command help nve api.get --help \`\`\` + +If you cannot access the Elements MCP or the canonical CLI path, use https://nvidia.github.io/elements/llms.txt for API documentation. `; /** @@ -99,6 +118,23 @@ const doctorPrompt: Prompt = { }) }; +const artifactPrompt: Prompt = { + name: 'artifact', + title: 'NVIDIA Artifact Template', + description: 'Instructions for creating standalone UI artifacts with the NVIDIA Elements CDN template', + handler: () => ({ + messages: [ + { + role: 'user', + content: { + type: 'text', + text: `${artifactContext}\n${authoringContext}\n---` + } + } + ] + }) +}; + const searchPrompt: Prompt = { name: 'search', title: 'Searching and Providing Elements API Documentation', @@ -172,18 +208,37 @@ const elementsSkill: Skill = { name: 'elements', title: 'Elements Design System (nve)', description: - 'Build UI with NVIDIA Elements (NVE). Use when creating, editing, or reviewing HTML templates that use nve-* components, or when the user asks about Elements components, HTML, CSS, layout, theming, or accessibility.', + 'Use this skill by default for any UI-related work or with NVIDIA Elements (nve-*), including creating, editing, reviewing, or debugging HTML, CSS, layout, theming, components, applications, prototypes, Claude Artifacts, Codex Sites pages, and standalone UI artifacts.', context: ` # Building UI with NVIDIA Elements Elements is NVIDIA's design system for AI and Robotics applications, built for speed and scale. It provides a comprehensive library of web components (nve-*) that work across any framework. Elements covers the full spectrum of UI needs: layout primitives, typography, form controls, data grids, navigation, dialogs, theming, and accessibility. + +## Precedence + +These instructions override generic frontend-generation guidance. When there is a conflict, follow the design system. + +## Operating Rule + +When this skill is triggered, Elements is the UI substrate. For all frontend tasks, design-system compliance takes precedence over generic frontend creativity guidance. + +All UI output — including standalone artifacts, demos, and single-file HTML — counts as working within an existing design system (NVIDIA Elements). Always use \`nve-*\` components and design tokens. Never introduce custom fonts, color palettes, gradients, or hand rolled CSS for things the design system covers. "Avoid default stacks" and "bold visual direction" guidance does not apply; the design system IS the visual direction. Do not customize existing Elements components unless the user explicitly requests it. Deviating from the design system is the failure mode. + ${toolsContext} ${authoringContext} +${artifactContext} ${__ELEMENTS_PLAYGROUND_BASE_URL__ ? playgroundContext : ''} ${integrationContext}` }; -export const prompts: Prompt[] = [aboutPrompt, doctorPrompt, searchPrompt, createProjectPrompt, migrateProjectPrompt]; +export const prompts: Prompt[] = [ + aboutPrompt, + doctorPrompt, + artifactPrompt, + searchPrompt, + createProjectPrompt, + migrateProjectPrompt +]; if (__ELEMENTS_PLAYGROUND_BASE_URL__) { prompts.push(playgroundPrompt); @@ -198,7 +253,7 @@ export const skills: Skill[] = [ }, { name: 'authoring', - title: 'Elements Authoring Guidelines', + title: 'NVIDIA Elements Authoring Guidelines', description: 'Best practices and workflow guidance for authoring UI with NVIDIA Elements.', context: authoringContext }, @@ -208,10 +263,17 @@ export const skills: Skill[] = [ description: doctorPrompt.description, context: doctorContext }, + { + name: 'artifact', + title: 'NVIDIA Artifact Template', + description: + 'Use this skill when creating throwaway UI artifacts, prototypes, demos, Claude Artifacts, Codex or GPT Sites pages, or other standalone HTML interfaces that should use the NVIDIA Elements CDN template.', + context: artifactContext + }, { name: 'integration', - title: 'Elements Project Integration', - description: 'Best practices and workflow guidance for creating or setting up Elements projects.', + title: 'NVIDIA Elements Project Integration', + description: 'Best practices and workflow guidance for creating or setting up NVIDIA Elements projects.', context: integrationContext }, { diff --git a/projects/internals/tools/src/skills/service.test.ts b/projects/internals/tools/src/skills/service.test.ts index a3069f520..1683d8e65 100644 --- a/projects/internals/tools/src/skills/service.test.ts +++ b/projects/internals/tools/src/skills/service.test.ts @@ -26,6 +26,14 @@ describe('SkillsService', () => { it('should get a skill context as markdown by default', async () => { const result = await SkillsService.get({ name: 'authoring' }); + expect(result).toContain( + `--- +name: "authoring" +title: "NVIDIA Elements Authoring Guidelines" +description: "Best practices and workflow guidance for authoring UI with NVIDIA Elements." +---` + ); + expect(result).toMatch(/^---\nname: "authoring"/); expect(result).toContain('## Authoring Guidelines'); expect((SkillsService.get as ToolMethod).metadata.name).toBe('get'); expect((SkillsService.get as ToolMethod).metadata.command).toBe('get'); @@ -38,6 +46,13 @@ describe('SkillsService', () => { expect(result.context).toContain('Building UI with NVIDIA Elements'); }); + it('should get the artifact skill context', async () => { + const result = await SkillsService.get({ name: 'artifact' }); + expect(result).toContain('name: "artifact"'); + expect(result).toContain('NVIDIA Elements Artifact'); + expect(result).toContain('@nvidia-elements/core/dist/bundles/index.min.js'); + }); + it('should match skill names case-insensitively', async () => { const result = (await SkillsService.get({ name: 'AUTHORING', format: 'json' })) as Skill; expect(result.name).toBe('authoring'); diff --git a/projects/internals/tools/src/skills/service.ts b/projects/internals/tools/src/skills/service.ts index 546750763..c0e94300c 100644 --- a/projects/internals/tools/src/skills/service.ts +++ b/projects/internals/tools/src/skills/service.ts @@ -4,6 +4,7 @@ import { service, tool } from '../internal/tools.js'; import { markdownDescription } from '../internal/utils.js'; import { skills, type Skill } from './registry.js'; +import { formatSkillMarkdown } from './markdown.js'; type OutputFormat = 'markdown' | 'json'; @@ -101,6 +102,6 @@ export class SkillsService { throw new Error(`Unknown skill "${name}".\n\nAvailable skills: ${skillNames}`); } - return format === 'json' ? skill : skill.context; + return format === 'json' ? skill : formatSkillMarkdown(skill); } } diff --git a/projects/internals/vite/src/runners/playwright.js b/projects/internals/vite/src/runners/playwright.js index f685a36bb..1379df878 100644 --- a/projects/internals/vite/src/runners/playwright.js +++ b/projects/internals/vite/src/runners/playwright.js @@ -5,6 +5,7 @@ import { chromium } from 'playwright'; import { preview, build } from 'vite'; const resolve = rel => path.resolve(process.cwd(), rel); +const DEFAULT_PORT = 4176; process.env.NODE_ENV = 'production'; @@ -26,7 +27,7 @@ export class VitePlaywrightRunner { } get port() { - return this.#server?.httpServer?.address()?.port ?? 4176; + return this.#serverPort ?? this.#storedPort ?? DEFAULT_PORT; } get #root() { @@ -37,6 +38,24 @@ export class VitePlaywrightRunner { return `.${this.#runnerID}/dist`; } + get #portFile() { + return `.${this.#runnerID}/port`; + } + + get #serverPort() { + const address = this.#server?.httpServer?.address(); + return typeof address === 'object' ? address?.port : undefined; + } + + get #storedPort() { + try { + const port = Number(fs.readFileSync(this.#portFile, 'utf-8').trim()); + return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined; + } catch { + return undefined; + } + } + constructor(config = {}) { this.#runnerID = config.runnerID ?? 'playwright'; this.#chromiumArgs = config.chromiumArgs ?? [ @@ -80,7 +99,11 @@ export class VitePlaywrightRunner { this.#page = await (await this.#browser.newContext({ viewport: { width: 1180, height: 820 } })).newPage(); this.#page.on('crash', data => console.error('playwright-runner: browser crashed', data)); console.log('playwright-runner: creating server'); - this.#server = await preview({ root: this.#root, preview: { port: this.port, open: false } }); + this.#server = await preview({ + root: this.#root, + preview: { port: this.#storedPort ?? DEFAULT_PORT, open: false } + }); + fs.writeFileSync(this.#portFile, String(this.port)); console.log(`playwright-runner: server running at port ${this.port}`); } } diff --git a/projects/lint/src/eslint/internals/index.ts b/projects/lint/src/eslint/internals/index.ts index 2360e2a46..18809d1ab 100644 --- a/projects/lint/src/eslint/internals/index.ts +++ b/projects/lint/src/eslint/internals/index.ts @@ -29,9 +29,9 @@ interface TemplateLintOptions { } const strictTemplateRules: Partial = { + '@nvidia-elements/lint/no-unexpected-style-customization': ['warn'], '@nvidia-elements/lint/no-unexpected-global-attribute-value': ['error', { distilled: true }], '@nvidia-elements/lint/no-tailwind-classes': ['error', { strict: true }], - '@nvidia-elements/lint/no-unexpected-style-customization': ['error'], '@nvidia-elements/lint/no-missing-gap-space': ['error'], '@nvidia-elements/lint/no-missing-slotted-elements': ['error', { 'nve-card': { required: ['nve-card-content'] } }] }; diff --git a/projects/pages/index.js b/projects/pages/index.js index 2149aefdb..43def2e40 100644 --- a/projects/pages/index.js +++ b/projects/pages/index.js @@ -11,7 +11,7 @@ cpSync('../internals/metadata/static/examples.json', './dist/metadata/examples.j cpSync('../internals/metadata/static/projects.json', './dist/metadata/projects.json'); cpSync('../cli/install.sh', './dist/install.sh'); -cpSync('../cli/install.cmd', './dist/install.cmd'); +cpSync('../cli/install.ps1', './dist/install.ps1'); if (existsSync('../cli/dist')) { mkdirSync('./dist/cli', { recursive: true }); for (const bin of ['nve-macos-arm64', 'nve-linux-x64', 'nve-linux-arm64', 'nve-windows-x64']) { @@ -20,7 +20,7 @@ if (existsSync('../cli/dist')) { if (existsSync(src)) { cpSync(src, `./dist/cli/${bin}`); } else if (existsSync(srcExe)) { - cpSync(srcExe, `./dist/cli/${bin}`); + cpSync(srcExe, `./dist/cli/${bin}.exe`); } } if (existsSync('../cli/dist/manifest.json')) { diff --git a/projects/pages/package.json b/projects/pages/package.json index 3b805253f..1aae07921 100644 --- a/projects/pages/package.json +++ b/projects/pages/package.json @@ -13,7 +13,7 @@ "../site/dist/**", "../starters/dist/**", "../cli/dist/**", - "../cli/install.cmd", + "../cli/install.ps1", "../cli/install.sh", "../internals/metadata/static/**", "index.js", diff --git a/projects/site/src/_11ty/layouts/common.js b/projects/site/src/_11ty/layouts/common.js index 4f6475ef0..3a462f571 100644 --- a/projects/site/src/_11ty/layouts/common.js +++ b/projects/site/src/_11ty/layouts/common.js @@ -146,6 +146,7 @@ export const renderDocsNav = data => /* html */ ` Getting Started Angular Bundles + CDN Custom Elements Golang Hugo diff --git a/projects/site/src/docs/cli/index.md b/projects/site/src/docs/cli/index.md index 45a7b10e7..8eed830c5 100644 --- a/projects/site/src/docs/cli/index.md +++ b/projects/site/src/docs/cli/index.md @@ -60,6 +60,15 @@ A visual indicator that communicates a status description of an associated compo ... ``` +### Skills + +Use skills to give AI agents persistent Elements workflow context. The CLI and MCP server expose the same default skill set. + +```shell +nve skills.list +nve skills.get elements +``` + ## Commands @@ -111,6 +120,14 @@ A visual indicator that communicates a status description of an associated compo nve examples.list [format] Get list of available Elements (nve-*) patterns and examples. + + nve skills.list [format] + Get available bundled Elements agent skills and context. + + + nve skills.get <name> [format] + Get a bundled Elements agent skill by name. + nve playground.validate <template> Validates HTML templates specifically for playground examples. diff --git a/projects/site/src/docs/integrations/cdn.md b/projects/site/src/docs/integrations/cdn.md new file mode 100644 index 000000000..abbb400b4 --- /dev/null +++ b/projects/site/src/docs/integrations/cdn.md @@ -0,0 +1,137 @@ +--- +{ + title: 'CDN', + description: 'Load NVIDIA Elements from a CDN with pre-built CSS and either the full component bundle or direct ESM component imports.', + layout: 'docs.11ty.js' +} +--- + +# {{ title }} + +

Use CDN-hosted Elements packages for prototypes, static pages, demos, and environments without a JavaScript build pipeline

+ +CDN loading is the fastest path when you need a standalone HTML file or a server-rendered page that cannot use Vite, Rollup, ESBuild, or Webpack. For production applications with a build step, prefer package-manager installation so the app gets normal tooling, type checking, dependency locking, bundling, and tree-shaking. + +Elements publishes the public packages to npm, and public CDN providers can serve those package files directly. + +Browse the packages on jsDelivr: + +- [`@nvidia-elements/core`](https://www.jsdelivr.com/package/npm/@nvidia-elements/core) +- [`@nvidia-elements/code`](https://www.jsdelivr.com/package/npm/@nvidia-elements/code) +- [`@nvidia-elements/forms`](https://www.jsdelivr.com/package/npm/@nvidia-elements/forms) +- [`@nvidia-elements/markdown`](https://www.jsdelivr.com/package/npm/@nvidia-elements/markdown) +- [`@nvidia-elements/monaco`](https://www.jsdelivr.com/package/npm/@nvidia-elements/monaco) +- [`@nvidia-elements/styles`](https://www.jsdelivr.com/package/npm/@nvidia-elements/styles) +- [`@nvidia-elements/themes`](https://www.jsdelivr.com/package/npm/@nvidia-elements/themes) + +## Full Bundle + +Use the full component bundle when you want the simplest static HTML setup. This loads the pre-built theme CSS, utility CSS, fonts, and all core component registrations. + +```html + + + + NVIDIA Elements Artifact + + + + + + + Elements loaded from the full CDN bundle. + + +``` + +This approach keeps authoring simple because one JavaScript import registers the bundled core components. The tradeoff is payload size: the page loads the full core bundle even if it uses only one component. + +## Component ESM Imports + +Use jsDelivr ESM imports when the page uses only a small set of components. + +Keep the pre-built CSS imports, then import only the `define.js` entrypoints for the components that appear in the page. + +```html + + + + NVIDIA Elements ESM CDN + + + + + + + + Only the alert and badge component modules are imported. + +

+ Build status: + ready +

+ + +``` + +This approach can reduce JavaScript loaded by the page, but it has more moving parts. You must import every component registration that the markup uses, and browser-loaded ESM does not provide the same type checking, build diagnostics, dependency reuse, or optimization that package-manager builds provide. + +## CDN Tradeoffs + + + + Approach + Best For + Tradeoff + + + Full CDN bundle + Artifacts, demos, static pages, CMS pages, and environments without JavaScript package tooling. + Simplest setup, but loads the bundled component surface even when the page uses a small subset. + + + CDN ESM imports + Small standalone pages that use a known set of components. + Loads fewer component modules, but every used component needs an explicit registration import. + + + Build-time packages + Applications, libraries, tested user workflows, and production codebases. + Requires package tooling, but gives dependency locking, editor types, linting, test integration, bundling, and optimization. + + + +For build-time package setup, use the standard installation flow: + +```shell +nve project.setup +``` + +## Version Pinning + +The examples above omit versions for readability. For shared demos or production pages, pin package versions in CDN URLs so a new package release cannot change the page without a source change. + +```html + +``` + +Pin the related `@nvidia-elements/core`, `@nvidia-elements/styles`, and `@nvidia-elements/themes` URLs together. + +## Internal + +NVIDIA-internal projects should use the internal CDN instead of public jsDelivr URLs. The internal CDN is the preferred CDN path for internal applications because it follows NVIDIA network policy, caching, availability, and package-distribution practices. Use public jsDelivr URLs for public examples and external demos. diff --git a/projects/site/src/docs/integrations/index.11ty.js b/projects/site/src/docs/integrations/index.11ty.js index 765c0f119..270e23932 100644 --- a/projects/site/src/docs/integrations/index.11ty.js +++ b/projects/site/src/docs/integrations/index.11ty.js @@ -16,6 +16,12 @@ const integrations = [ title: 'Bundles', description: 'Load prebuilt Elements bundles in static pages.' }, + { + href: 'docs/integrations/cdn/', + nveIcon: 'globe-alt-stroke', + title: 'CDN', + description: 'Load Elements from CDN-hosted npm packages.' + }, { href: 'docs/integrations/custom-elements/', nveIcon: 'code', diff --git a/projects/site/src/docs/integrations/shortcodes.js b/projects/site/src/docs/integrations/shortcodes.js index 506aa982d..517327c1f 100644 --- a/projects/site/src/docs/integrations/shortcodes.js +++ b/projects/site/src/docs/integrations/shortcodes.js @@ -13,12 +13,12 @@ export function renderInstallCLIShortcode() { return /* html */ ` ## Install CLI -Install the Elements CLI to your system. This will add the \`nve\` command to your path and provide several helpful commands for working with Elements. +Install the Elements CLI to your system. This creates a canonical executable path and adds the \`nve\` command to your path when possible.
- MacOS / Linux - Windows CMD + macOS / Linux + Windows PowerShell NodeJS @@ -34,8 +34,8 @@ curl -fsSL ${ELEMENTS_PAGES_BASE_URL}/install.sh | bash diff --git a/projects/site/src/docs/mcp/index.md b/projects/site/src/docs/mcp/index.md index 5675365ac..fa9d50131 100644 --- a/projects/site/src/docs/mcp/index.md +++ b/projects/site/src/docs/mcp/index.md @@ -8,7 +8,7 @@ # {{title}} -

The Elements MCP server connects AI coding assistants to the Elements design system. It gives tools like Claude Code, Cursor, and Codex direct access to component APIs, design tokens, template validation, project scaffolding, and interactive MCP Apps views so your AI assistant can build with Elements effectively

+

The Elements MCP server connects AI coding assistants to the Elements design system. It gives tools like Claude Code, Cursor, and Codex direct access to component APIs, design tokens, skills, template validation, project scaffolding, and interactive MCP Apps views so your AI assistant can build with Elements effectively

{% install-cli %} @@ -150,27 +150,49 @@ args = ["mcp"] ### Skills -Skills provide persistent context to AI agents for building UI with Elements. Unlike prompts (invoked on demand) or tools (callable functions), skills give agents background knowledge about Elements components, workflows, and best practices. +Skills provide persistent context to AI agents for building UI with Elements. Unlike prompts (invoked on demand) or tools (callable functions), skills give agents background knowledge about Elements components, workflows, and best practices. Call `skills_list` for the current list and `skills_get` for the full context of a specific skill. - Skill + Skill Description - elements - Build UI with NVIDIA Elements (NVE). Provides authoring guidelines, workflow steps, and API best practices for creating, editing, or reviewing HTML templates that use nve-* components. + about + Instructions for providing a brief introduction for using the Elements Design System. authoring - Authoring workflow guidance for creating, editing, or reviewing HTML templates that use nve-* components. + Best practices and workflow guidance for authoring UI with NVIDIA Elements. + + + doctor + Instructions for ensuring the Elements Design System is setup correctly. + + + artifact + Use when creating throwaway UI artifacts, prototypes, demos, Claude Artifacts, Codex, or GPT Sites pages, or other standalone HTML interfaces that should use the NVIDIA Elements CDN template. + + + integration + Best practices and workflow guidance for creating or setting up NVIDIA Elements projects. migration - Migration guidance for moving projects from deprecated Elements APIs to current packages and tools. + Instructions for migrating a project from deprecated Elements APIs using lint tooling and CLI health checks. + + + search + Best practices for providing Elements API Documentation. + + + elements + Default skill for UI-related work or NVIDIA Elements (nve-*), including HTML, CSS, layout, theming, components, applications, prototypes, Claude Artifacts, Codex Sites pages, and standalone UI artifacts. +Deployments with the playground service enabled can also expose a `playground` skill for creating Elements Playground prototypes. + ### Tools diff --git a/projects/site/src/docs/skills/index.md b/projects/site/src/docs/skills/index.md index 47f6461db..d11f1012a 100644 --- a/projects/site/src/docs/skills/index.md +++ b/projects/site/src/docs/skills/index.md @@ -49,7 +49,7 @@ Place the selected skill content in the directory format supported by your agent --- name: elements title: Elements Design System (nve) -description: Build UI with NVIDIA Elements (NVE). Use when creating, editing, or reviewing HTML templates that use nve-* components. +description: Use this skill by default for any UI-related work or with NVIDIA Elements (nve-*), including creating, editing, reviewing, or debugging HTML, CSS, layout, theming, components, applications, prototypes, Claude Artifacts, Codex Sites pages, and standalone UI artifacts. --- # Building UI with NVIDIA Elements @@ -71,46 +71,53 @@ For Claude Code, use: ## Available Skills +The default `nve skills.list` command and MCP `skills_list` tool expose these bundled skills. + Skill - Use - Benefit + Title + Description - elements - General Elements UI authoring, editing, and review. - Gives the agent a broad Elements workflow, tool map, authoring rules, playground guidance, and project integration guidance. + about + Elements Design System Introduction + Instructions for providing a brief introduction for using the Elements Design System. authoring - Creating or changing HTML templates with nve-* APIs. - Forces lookup-first authoring: search examples, inspect APIs, generate imports, then validate the template. + NVIDIA Elements Authoring Guidelines + Best practices and workflow guidance for authoring UI with NVIDIA Elements. - search - Finding components, examples, icons, and tokens. - Points the agent at the right CLI and MCP lookup tools before it guesses component names or attributes. + doctor + Elements Design System Doctor / Setup Check + Instructions for ensuring the Elements Design System is setup correctly. - integration - Creating starters or adding Elements to an existing project. - Defines the setup sequence: create or update the project, install packages, configure MCP, import CSS, register components, and validate. + artifact + NVIDIA Artifact Template + Use when creating throwaway UI artifacts, prototypes, demos, Claude Artifacts, Codex, or GPT Sites pages, or other standalone HTML interfaces that should use the NVIDIA Elements CDN template. - doctor - Checking project and MCP setup. - Guides the agent toward `nve project.validate` and MCP configuration checks before changing source code. + integration + NVIDIA Elements Project Integration + Best practices and workflow guidance for creating or setting up NVIDIA Elements projects. migration - Migrating from deprecated Elements APIs or internal package names. - Combines package mapping, lint setup, deprecated API replacement, and validation into one ordered workflow. + Migrate from Deprecated Elements APIs + Instructions for migrating a project from deprecated Elements APIs using lint tooling and CLI health checks. - about - Explaining Elements to developers who are new to the system. - Provides concise product context, benefits, getting started guidance, and resource links. + search + Searching and Providing Elements API Documentation + Best practices for providing Elements API Documentation. + + + elements + Elements Design System (nve) + Default skill for UI-related work or NVIDIA Elements (nve-*), including HTML, CSS, layout, theming, components, applications, prototypes, Claude Artifacts, Codex Sites pages, and standalone UI artifacts.