diff --git a/cli/package-lock.json b/cli/package-lock.json
index 8c75dbfaa7f85df7383ffda208514a9c6521428b..c8c1ab253a5e2741329ee1e3f8d433564a5076cf 100644
--- a/cli/package-lock.json
+++ b/cli/package-lock.json
@@ -9,11 +9,13 @@
       "version": "0.0.0",
       "dependencies": {
         "@clack/prompts": "^0.11.0",
+        "@swc/wasm": "^1.12.1",
         "axios": "^1.9.0",
         "chalk": "^5.4.1",
         "commander": "^14.0.0",
         "dotenv": "^16.5.0",
-        "js-yaml": "^4.1.0"
+        "js-yaml": "^4.1.0",
+        "table": "^6.9.0"
       },
       "bin": {
         "xb": "dist/index.js"
@@ -544,9 +546,9 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.20.0",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
-      "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz",
+      "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -559,9 +561,9 @@
       }
     },
     "node_modules/@eslint/config-helpers": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
-      "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz",
+      "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -619,9 +621,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.28.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz",
-      "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==",
+      "version": "9.29.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz",
+      "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -642,19 +644,32 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
-      "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz",
+      "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.14.0",
+        "@eslint/core": "^0.15.0",
         "levn": "^0.4.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+      "version": "0.15.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz",
+      "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@humanfs/core": {
       "version": "0.19.1",
       "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -771,66 +786,6 @@
         }
       }
     },
-    "node_modules/@inquirer/core/node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@inquirer/core/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@inquirer/core/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@inquirer/core/node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@inquirer/core/node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/@inquirer/figures": {
       "version": "1.0.12",
       "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.12.tgz",
@@ -877,6 +832,37 @@
         "node": ">=12"
       }
     },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.8",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -1036,9 +1022,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz",
-      "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz",
+      "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==",
       "cpu": [
         "arm"
       ],
@@ -1050,9 +1036,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz",
-      "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz",
+      "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==",
       "cpu": [
         "arm64"
       ],
@@ -1064,9 +1050,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz",
-      "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz",
+      "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==",
       "cpu": [
         "arm64"
       ],
@@ -1078,9 +1064,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz",
-      "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz",
+      "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==",
       "cpu": [
         "x64"
       ],
@@ -1092,9 +1078,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz",
-      "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz",
+      "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==",
       "cpu": [
         "arm64"
       ],
@@ -1106,9 +1092,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz",
-      "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz",
+      "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==",
       "cpu": [
         "x64"
       ],
@@ -1120,9 +1106,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz",
-      "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz",
+      "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==",
       "cpu": [
         "arm"
       ],
@@ -1134,9 +1120,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz",
-      "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz",
+      "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==",
       "cpu": [
         "arm"
       ],
@@ -1148,9 +1134,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz",
-      "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz",
+      "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==",
       "cpu": [
         "arm64"
       ],
@@ -1162,9 +1148,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz",
-      "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz",
+      "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==",
       "cpu": [
         "arm64"
       ],
@@ -1176,9 +1162,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz",
-      "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz",
+      "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==",
       "cpu": [
         "loong64"
       ],
@@ -1190,9 +1176,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz",
-      "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz",
+      "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==",
       "cpu": [
         "ppc64"
       ],
@@ -1204,9 +1190,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz",
-      "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz",
+      "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==",
       "cpu": [
         "riscv64"
       ],
@@ -1218,9 +1204,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-musl": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz",
-      "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz",
+      "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==",
       "cpu": [
         "riscv64"
       ],
@@ -1232,9 +1218,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz",
-      "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz",
+      "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==",
       "cpu": [
         "s390x"
       ],
@@ -1246,9 +1232,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz",
-      "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz",
+      "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==",
       "cpu": [
         "x64"
       ],
@@ -1260,9 +1246,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz",
-      "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz",
+      "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==",
       "cpu": [
         "x64"
       ],
@@ -1274,9 +1260,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz",
-      "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz",
+      "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==",
       "cpu": [
         "arm64"
       ],
@@ -1288,9 +1274,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz",
-      "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz",
+      "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==",
       "cpu": [
         "ia32"
       ],
@@ -1302,9 +1288,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz",
-      "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz",
+      "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==",
       "cpu": [
         "x64"
       ],
@@ -1315,6 +1301,254 @@
         "win32"
       ]
     },
+    "node_modules/@swc/core": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.1.tgz",
+      "integrity": "sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "@swc/counter": "^0.1.3",
+        "@swc/types": "^0.1.23"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/swc"
+      },
+      "optionalDependencies": {
+        "@swc/core-darwin-arm64": "1.12.1",
+        "@swc/core-darwin-x64": "1.12.1",
+        "@swc/core-linux-arm-gnueabihf": "1.12.1",
+        "@swc/core-linux-arm64-gnu": "1.12.1",
+        "@swc/core-linux-arm64-musl": "1.12.1",
+        "@swc/core-linux-x64-gnu": "1.12.1",
+        "@swc/core-linux-x64-musl": "1.12.1",
+        "@swc/core-win32-arm64-msvc": "1.12.1",
+        "@swc/core-win32-ia32-msvc": "1.12.1",
+        "@swc/core-win32-x64-msvc": "1.12.1"
+      },
+      "peerDependencies": {
+        "@swc/helpers": ">=0.5.17"
+      },
+      "peerDependenciesMeta": {
+        "@swc/helpers": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@swc/core-darwin-arm64": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.1.tgz",
+      "integrity": "sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-darwin-x64": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.1.tgz",
+      "integrity": "sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-linux-arm-gnueabihf": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.1.tgz",
+      "integrity": "sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-linux-arm64-gnu": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.1.tgz",
+      "integrity": "sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-linux-arm64-musl": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.1.tgz",
+      "integrity": "sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-linux-x64-gnu": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.1.tgz",
+      "integrity": "sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-linux-x64-musl": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.1.tgz",
+      "integrity": "sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-win32-arm64-msvc": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.1.tgz",
+      "integrity": "sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-win32-ia32-msvc": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.1.tgz",
+      "integrity": "sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/core-win32-x64-msvc": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.1.tgz",
+      "integrity": "sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "Apache-2.0 AND MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "peer": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@swc/counter": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "peer": true
+    },
+    "node_modules/@swc/types": {
+      "version": "0.1.23",
+      "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz",
+      "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "@swc/counter": "^0.1.3"
+      }
+    },
+    "node_modules/@swc/wasm": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.12.1.tgz",
+      "integrity": "sha512-2QNgxBTylbWCeCt3tpktImqBWkV5jA48uMPIrPJq4tQGQLSBdYEg+I3K1fE9lUOl2qQte0jigmg9D/+JdAP+mA==",
+      "license": "Apache-2.0"
+    },
     "node_modules/@types/chai": {
       "version": "5.2.2",
       "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
@@ -1340,9 +1574,9 @@
       "license": "MIT"
     },
     "node_modules/@types/estree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
-      "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
       "dev": true,
       "license": "MIT"
     },
@@ -1361,9 +1595,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "24.0.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz",
-      "integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==",
+      "version": "24.0.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
+      "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1385,17 +1619,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz",
-      "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz",
+      "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.33.1",
-        "@typescript-eslint/type-utils": "8.33.1",
-        "@typescript-eslint/utils": "8.33.1",
-        "@typescript-eslint/visitor-keys": "8.33.1",
+        "@typescript-eslint/scope-manager": "8.34.1",
+        "@typescript-eslint/type-utils": "8.34.1",
+        "@typescript-eslint/utils": "8.34.1",
+        "@typescript-eslint/visitor-keys": "8.34.1",
         "graphemer": "^1.4.0",
         "ignore": "^7.0.0",
         "natural-compare": "^1.4.0",
@@ -1409,7 +1643,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^8.33.1",
+        "@typescript-eslint/parser": "^8.34.1",
         "eslint": "^8.57.0 || ^9.0.0",
         "typescript": ">=4.8.4 <5.9.0"
       }
@@ -1425,16 +1659,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz",
-      "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz",
+      "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.33.1",
-        "@typescript-eslint/types": "8.33.1",
-        "@typescript-eslint/typescript-estree": "8.33.1",
-        "@typescript-eslint/visitor-keys": "8.33.1",
+        "@typescript-eslint/scope-manager": "8.34.1",
+        "@typescript-eslint/types": "8.34.1",
+        "@typescript-eslint/typescript-estree": "8.34.1",
+        "@typescript-eslint/visitor-keys": "8.34.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1450,14 +1684,14 @@
       }
     },
     "node_modules/@typescript-eslint/project-service": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz",
-      "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz",
+      "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/tsconfig-utils": "^8.33.1",
-        "@typescript-eslint/types": "^8.33.1",
+        "@typescript-eslint/tsconfig-utils": "^8.34.1",
+        "@typescript-eslint/types": "^8.34.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1472,14 +1706,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz",
-      "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz",
+      "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.33.1",
-        "@typescript-eslint/visitor-keys": "8.33.1"
+        "@typescript-eslint/types": "8.34.1",
+        "@typescript-eslint/visitor-keys": "8.34.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1490,9 +1724,9 @@
       }
     },
     "node_modules/@typescript-eslint/tsconfig-utils": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz",
-      "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz",
+      "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1507,14 +1741,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz",
-      "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz",
+      "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.33.1",
-        "@typescript-eslint/utils": "8.33.1",
+        "@typescript-eslint/typescript-estree": "8.34.1",
+        "@typescript-eslint/utils": "8.34.1",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.1.0"
       },
@@ -1531,9 +1765,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz",
-      "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz",
+      "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1545,16 +1779,16 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz",
-      "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz",
+      "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/project-service": "8.33.1",
-        "@typescript-eslint/tsconfig-utils": "8.33.1",
-        "@typescript-eslint/types": "8.33.1",
-        "@typescript-eslint/visitor-keys": "8.33.1",
+        "@typescript-eslint/project-service": "8.34.1",
+        "@typescript-eslint/tsconfig-utils": "8.34.1",
+        "@typescript-eslint/types": "8.34.1",
+        "@typescript-eslint/visitor-keys": "8.34.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -1574,9 +1808,9 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1600,16 +1834,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz",
-      "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz",
+      "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.7.0",
-        "@typescript-eslint/scope-manager": "8.33.1",
-        "@typescript-eslint/types": "8.33.1",
-        "@typescript-eslint/typescript-estree": "8.33.1"
+        "@typescript-eslint/scope-manager": "8.34.1",
+        "@typescript-eslint/types": "8.34.1",
+        "@typescript-eslint/typescript-estree": "8.34.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1624,14 +1858,14 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.33.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz",
-      "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==",
+      "version": "8.34.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz",
+      "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.33.1",
-        "eslint-visitor-keys": "^4.2.0"
+        "@typescript-eslint/types": "8.34.1",
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1642,9 +1876,9 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1770,9 +2004,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.14.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
-      "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -1855,7 +2089,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
@@ -1890,6 +2123,15 @@
         "node": ">=12"
       }
     },
+    "node_modules/astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -1897,9 +2139,9 @@
       "license": "MIT"
     },
     "node_modules/axios": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
-      "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
+      "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
       "license": "MIT",
       "dependencies": {
         "follow-redirects": "^1.15.6",
@@ -1915,9 +2157,9 @@
       "license": "MIT"
     },
     "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+      "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2134,7 +2376,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
@@ -2147,7 +2388,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/combined-stream": {
@@ -2421,19 +2661,19 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.28.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz",
-      "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==",
+      "version": "9.29.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz",
+      "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.20.0",
+        "@eslint/config-array": "^0.20.1",
         "@eslint/config-helpers": "^0.2.1",
         "@eslint/core": "^0.14.0",
         "@eslint/eslintrc": "^3.3.1",
-        "@eslint/js": "9.28.0",
+        "@eslint/js": "9.29.0",
         "@eslint/plugin-kit": "^0.3.1",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
@@ -2445,9 +2685,9 @@
         "cross-spawn": "^7.0.6",
         "debug": "^4.3.2",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^8.3.0",
-        "eslint-visitor-keys": "^4.2.0",
-        "espree": "^10.3.0",
+        "eslint-scope": "^8.4.0",
+        "eslint-visitor-keys": "^4.2.1",
+        "espree": "^10.4.0",
         "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -2505,9 +2745,9 @@
       }
     },
     "node_modules/eslint-plugin-prettier": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz",
-      "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==",
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.0.tgz",
+      "integrity": "sha512-8qsOYwkkGrahrgoUv76NZi23koqXOGiiEzXMrT8Q7VcYaUISR+5MorIUxfWqYXN0fN/31WbSrxCxFkVQ43wwrA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2536,9 +2776,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
-      "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+      "version": "8.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+      "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
@@ -2583,9 +2823,9 @@
       }
     },
     "node_modules/eslint/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2596,15 +2836,15 @@
       }
     },
     "node_modules/espree": {
-      "version": "10.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
-      "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+      "version": "10.4.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+      "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
       "dev": true,
       "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.14.0",
+        "acorn": "^8.15.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^4.2.0"
+        "eslint-visitor-keys": "^4.2.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2614,9 +2854,9 @@
       }
     },
     "node_modules/espree/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+      "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2696,7 +2936,6 @@
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/fast-diff": {
@@ -2750,6 +2989,22 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/fast-uri": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+      "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
     "node_modules/fastq": {
       "version": "1.19.1",
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
@@ -2995,9 +3250,9 @@
       }
     },
     "node_modules/glob/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3169,7 +3424,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -3362,10 +3616,16 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/lodash.truncate": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+      "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+      "license": "MIT"
+    },
     "node_modules/loupe": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
-      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz",
+      "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==",
       "dev": true,
       "license": "MIT"
     },
@@ -3766,9 +4026,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.5",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
-      "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==",
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
       "dev": true,
       "funding": [
         {
@@ -3957,6 +4217,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -3986,9 +4255,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.41.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz",
-      "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==",
+      "version": "4.43.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz",
+      "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4002,29 +4271,36 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.41.1",
-        "@rollup/rollup-android-arm64": "4.41.1",
-        "@rollup/rollup-darwin-arm64": "4.41.1",
-        "@rollup/rollup-darwin-x64": "4.41.1",
-        "@rollup/rollup-freebsd-arm64": "4.41.1",
-        "@rollup/rollup-freebsd-x64": "4.41.1",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.41.1",
-        "@rollup/rollup-linux-arm-musleabihf": "4.41.1",
-        "@rollup/rollup-linux-arm64-gnu": "4.41.1",
-        "@rollup/rollup-linux-arm64-musl": "4.41.1",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.41.1",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1",
-        "@rollup/rollup-linux-riscv64-gnu": "4.41.1",
-        "@rollup/rollup-linux-riscv64-musl": "4.41.1",
-        "@rollup/rollup-linux-s390x-gnu": "4.41.1",
-        "@rollup/rollup-linux-x64-gnu": "4.41.1",
-        "@rollup/rollup-linux-x64-musl": "4.41.1",
-        "@rollup/rollup-win32-arm64-msvc": "4.41.1",
-        "@rollup/rollup-win32-ia32-msvc": "4.41.1",
-        "@rollup/rollup-win32-x64-msvc": "4.41.1",
+        "@rollup/rollup-android-arm-eabi": "4.43.0",
+        "@rollup/rollup-android-arm64": "4.43.0",
+        "@rollup/rollup-darwin-arm64": "4.43.0",
+        "@rollup/rollup-darwin-x64": "4.43.0",
+        "@rollup/rollup-freebsd-arm64": "4.43.0",
+        "@rollup/rollup-freebsd-x64": "4.43.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.43.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.43.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.43.0",
+        "@rollup/rollup-linux-arm64-musl": "4.43.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.43.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.43.0",
+        "@rollup/rollup-linux-riscv64-musl": "4.43.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.43.0",
+        "@rollup/rollup-linux-x64-gnu": "4.43.0",
+        "@rollup/rollup-linux-x64-musl": "4.43.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.43.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.43.0",
+        "@rollup/rollup-win32-x64-msvc": "4.43.0",
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/rollup/node_modules/@types/estree": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
+      "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -4111,6 +4387,23 @@
       "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
       "license": "MIT"
     },
+    "node_modules/slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+      }
+    },
     "node_modules/source-map": {
       "version": "0.8.0-beta.0",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
@@ -4357,6 +4650,85 @@
         "url": "https://opencollective.com/synckit"
       }
     },
+    "node_modules/table": {
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+      "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "ajv": "^8.0.1",
+        "lodash.truncate": "^4.4.2",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/table/node_modules/ajv": {
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/table/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/table/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/table/node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "license": "MIT"
+    },
+    "node_modules/table/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/table/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/thenify": {
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -4412,9 +4784,9 @@
       }
     },
     "node_modules/tinyglobby/node_modules/fdir": {
-      "version": "6.4.5",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz",
-      "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==",
+      "version": "6.4.6",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
+      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
       "dev": true,
       "license": "MIT",
       "peerDependencies": {
@@ -4440,9 +4812,9 @@
       }
     },
     "node_modules/tinypool": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.0.tgz",
-      "integrity": "sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+      "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4961,21 +5333,18 @@
       }
     },
     "node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       },
       "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+        "node": ">=8"
       }
     },
     "node_modules/wrap-ansi-cjs": {
@@ -5042,17 +5411,49 @@
         "node": ">=8"
       }
     },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+    "node_modules/wrap-ansi/node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=12"
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/wrap-ansi/node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
       },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
     "node_modules/y18n": {
diff --git a/cli/package.json b/cli/package.json
index 9e311ba8521d02ad4912d876009773e2beedf291..4303c47619c7cbef33e75735729cb1b1fff323f6 100644
--- a/cli/package.json
+++ b/cli/package.json
@@ -49,10 +49,12 @@
   },
   "dependencies": {
     "@clack/prompts": "^0.11.0",
+    "@swc/wasm": "^1.12.1",
     "axios": "^1.9.0",
     "chalk": "^5.4.1",
     "commander": "^14.0.0",
     "dotenv": "^16.5.0",
-    "js-yaml": "^4.1.0"
+    "js-yaml": "^4.1.0",
+    "table": "^6.9.0"
   }
 }
diff --git a/cli/src/commands/build.ts b/cli/src/commands/build.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3bc341a9b292421506e4d525427b0f0664231fea
--- /dev/null
+++ b/cli/src/commands/build.ts
@@ -0,0 +1,52 @@
+import type { Command } from 'commander';
+import * as p from '@clack/prompts';
+import chalk from 'chalk';
+import { getConfig, setConfig } from '../config.js';
+import { findComponentDirectories } from '../utils/find-component-directories.js';
+import { buildComponent } from '../utils/build.js';
+import { reportResults } from '../utils/report-results';
+import type { Result } from '../types/Result.js';
+
+interface BuildOptions {
+  dir?: string;
+}
+
+/**
+ * Command for building all local components.
+ */
+export function buildCommand(program: Command): void {
+  program
+    .command('build')
+    .description('Build all local components')
+    .option(
+      '-d, --dir <directory>',
+      'Component directory to build the components in',
+    )
+    .action(async (options: BuildOptions) => {
+      p.intro('Experience Builder Component Build');
+
+      if (options.dir) setConfig({ componentDir: options.dir });
+      const config = getConfig();
+
+      const componentDirs = await findComponentDirectories(config.componentDir);
+
+      const componentLabelPluralized =
+        componentDirs.length === 1 ? 'component' : 'components';
+
+      const s = p.spinner();
+      s.start(`Building components`);
+      s.stop(
+        chalk.green(
+          `Processed ${componentDirs.length} ${componentLabelPluralized}`,
+        ),
+      );
+      const results: Result[] = [];
+      for (const componentDir of componentDirs) {
+        results.push(await buildComponent(componentDir));
+      }
+
+      reportResults(results, 'Built components', 'Component');
+
+      p.outro(`📦 Build completed`);
+    });
+}
diff --git a/cli/src/commands/download.ts b/cli/src/commands/download.ts
index f307f3ab6fc1118ca61fd952331294aae30258de..9460283339b7250fbee4c988044b233eab1b8359 100644
--- a/cli/src/commands/download.ts
+++ b/cli/src/commands/download.ts
@@ -7,6 +7,8 @@ import { getConfig, setConfig, ensureConfig } from '../config';
 import { createApiService } from '../services/api';
 import yaml from 'js-yaml';
 import type { Component } from '../types/Component';
+import { reportResults } from '../utils/report-results';
+import type { Result } from '../types/Result';
 
 interface DownloadOptions {
   clientId?: string;
@@ -18,6 +20,7 @@ interface DownloadOptions {
   all?: boolean; // Download all components
 }
 
+// @todo: Support non-interactive download if user passes all necessary args in.
 export function downloadCommand(program: Command): void {
   program
     .command('download')
@@ -100,7 +103,7 @@ export function downloadCommand(program: Command): void {
               },
               ...Object.keys(components).map((key) => ({
                 value: components[key].machineName,
-                label: components[key].name,
+                label: `${components[key].name} (${components[key].machineName})`,
               })),
             ],
             required: true,
@@ -140,7 +143,7 @@ export function downloadCommand(program: Command): void {
         }
 
         // Download components
-        const results = [];
+        const results: Result[] = [];
 
         s.start(`Downloading ${componentPluralized}`);
 
@@ -161,7 +164,7 @@ export function downloadCommand(program: Command): void {
               const files = await fs.readdir(componentDir);
               if (files.length > 0) {
                 const confirmDelete = await p.confirm({
-                  message: `The "${componentDir}" is not empty. Are you sure you want to delete and overwrite this directory?`,
+                  message: `The "${componentDir}" directory is not empty. Are you sure you want to delete and overwrite this directory?`,
                   initialValue: true,
                 });
                 if (p.isCancel(confirmDelete) || !confirmDelete) {
@@ -187,7 +190,7 @@ export function downloadCommand(program: Command): void {
             };
 
             await fs.writeFile(
-              path.join(componentDir, `${component.machineName}.component.yml`),
+              path.join(componentDir, `component.yml`),
               yaml.dump(metadata),
               'utf-8',
             );
@@ -195,7 +198,7 @@ export function downloadCommand(program: Command): void {
             // Create JS file
             if (component.source_code_js) {
               await fs.writeFile(
-                path.join(componentDir, `${component.machineName}.jsx`),
+                path.join(componentDir, `index.jsx`),
                 component.source_code_js,
                 'utf-8',
               );
@@ -204,88 +207,60 @@ export function downloadCommand(program: Command): void {
             // Create CSS file
             if (component.source_code_css) {
               await fs.writeFile(
-                path.join(componentDir, `${component.machineName}.css`),
+                path.join(componentDir, `index.css`),
                 component.source_code_css,
                 'utf-8',
               );
             }
 
             results.push({
-              name: component.name,
+              itemName: component.machineName,
               success: true,
-              path: componentDir,
             });
           } catch (error) {
             results.push({
-              name: component.name,
+              itemName: component.machineName,
               success: false,
-              error: error instanceof Error ? error.message : String(error),
+              details: [
+                {
+                  content:
+                    error instanceof Error ? error.message : String(error),
+                },
+              ],
             });
           }
         }
-        let globalCssResult;
+        s.stop('Download completed');
+
+        reportResults(results, 'Downloaded components', 'Component');
+
         // Create global.css file if it exists.
         if (globalCss) {
+          let globalCssResult: Result;
           try {
             const globalCssPath = path.join(config.componentDir, 'global.css');
             await fs.writeFile(globalCssPath, globalCss, 'utf-8');
             globalCssResult = {
-              name: 'Global CSS',
+              itemName: 'global.css',
               success: true,
-              path: globalCssPath,
             };
           } catch (error) {
+            const errorMessage =
+              error instanceof Error ? error.message : String(error);
             globalCssResult = {
-              name: 'Global CSS',
+              itemName: 'global.css',
               success: false,
-              error: error instanceof Error ? error.message : String(error),
+              details: [
+                {
+                  content: errorMessage,
+                },
+              ],
             };
           }
+          reportResults([globalCssResult], 'Downloaded assets', 'Asset');
         }
 
-        s.stop('Download completed');
-
-        // Report results
-        const successful = results.filter((r) => r.success).length;
-        const failed = results.filter((r) => !r.success).length;
-
-        // Handle singular/plural cases for console messages.
-        const successfulComponentPluralized = `component${successful > 1 ? 's' : ''}`;
-
-        p.note(
-          `${successful} ${successfulComponentPluralized} downloaded successfully, ${failed} failed`,
-        );
-
-        // Output failures with details
-        if (failed > 0) {
-          console.log(chalk.red('Failed downloads:'));
-          results
-            .filter((r) => !r.success)
-            .forEach((r) => {
-              console.log(chalk.red(`  - ${r.name}: ${r.error}`));
-            });
-        }
-        if (globalCssResult && !globalCssResult.success) {
-          console.log(
-            chalk.red(`Global CSS download failed: ${globalCssResult.error}`),
-          );
-        }
-
-        // Output successful downloads
-        if (successful > 0) {
-          console.log(chalk.green('Successfully downloaded:'));
-          results
-            .filter((r) => r.success)
-            .forEach((r) => {
-              console.log(chalk.green(`  - ${r.name}: ${r.path}`));
-            });
-        }
-        if (globalCssResult && globalCssResult.success) {
-          console.log('');
-          console.log(chalk.green(`  - Global CSS: ${globalCssResult.path}`));
-        }
-
-        p.outro(`✅ ${successfulComponentPluralized} download completed`);
+        p.outro(`✅ Download completed`);
       } catch (error) {
         if (error instanceof Error) {
           p.note(chalk.red(`Error: ${error.message}`));
diff --git a/cli/src/commands/scaffold.ts b/cli/src/commands/scaffold.ts
index 9e7976a8742d4a626c65f591714ec4794f75552a..9fbb218ab515b8f84e9531084027873a3fbfed86 100644
--- a/cli/src/commands/scaffold.ts
+++ b/cli/src/commands/scaffold.ts
@@ -10,6 +10,7 @@ interface ScaffoldOptions {
   dir?: string;
 }
 
+// @todo: Support non-interactive scaffold if user passes all necessary args in.
 /**
  * Scaffolding command for creating an example React component.
  */
@@ -104,22 +105,6 @@ export function scaffoldCommand(program: Command): void {
               .replace(/Hello World/g, displayName)
               .replace(/hello_world/g, machineName);
 
-            // Rename the metadata file to follow the format `${componentName}.component.yml`
-            if (file.includes('component.yml')) {
-              destPath = path.join(
-                componentDir,
-                `${componentName}.component.yml`,
-              );
-            }
-            // Rename the JSX source file to follow the format `${componentName}.jsx`
-            if (file.includes('.jsx')) {
-              destPath = path.join(componentDir, `${componentName}.jsx`);
-            }
-            // Rename the CSS source file to follow the format `${componentName}.css`
-            if (file.includes('.css')) {
-              destPath = path.join(componentDir, `${componentName}.css`);
-            }
-
             // Write processed file
             await fs.writeFile(destPath, content, 'utf-8');
           }
@@ -131,9 +116,9 @@ export function scaffoldCommand(program: Command): void {
           // Show summary and next steps
           p.note(`Component "${componentName}" has been created:
 - Directory: ${componentDir}
-- Component metadata: ${path.join(componentDir, `${componentName}.component.yml`)}
-- Source file: ${path.join(componentDir, `${componentName}.jsx`)}
-- CSS file: ${path.join(componentDir, `${componentName}.css`)}
+- Component metadata: ${path.join(componentDir, `component.yml`)}
+- Source file: ${path.join(componentDir, `index.jsx`)}
+- CSS file: ${path.join(componentDir, `index.css`)}
 
 Next steps:
 1. Customize the component files to fit your needs
diff --git a/cli/src/commands/upload.ts b/cli/src/commands/upload.ts
new file mode 100644
index 0000000000000000000000000000000000000000..103bfcca5cbfc029c29d300682c8c93d6e7428ae
--- /dev/null
+++ b/cli/src/commands/upload.ts
@@ -0,0 +1,329 @@
+import type { Command } from 'commander';
+import * as p from '@clack/prompts';
+import path from 'path';
+import chalk from 'chalk';
+import { setConfig, getConfig, ensureConfig } from '../config.js';
+import type { ApiService } from '../services/api.js';
+import { createApiService } from '../services/api.js';
+import {
+  processComponentFiles,
+  createComponentPayload,
+} from '../utils/process-component-files.js';
+import { findComponentDirectories } from '../utils/find-component-directories.js';
+import type { Result } from '../types/Result.js';
+import { buildComponent } from '../utils/build';
+import fs from 'fs/promises';
+import { reportResults } from '../utils/report-results';
+
+interface UploadOptions {
+  clientId?: string;
+  clientSecret?: string;
+  siteUrl?: string;
+  scope?: string;
+  dir?: string;
+  verbose?: boolean;
+  all?: boolean;
+}
+
+/**
+ * Registers the upload command. Scripts that run on CI should use the --all flag.
+ */
+export function uploadCommand(program: Command): void {
+  program
+    .command('upload')
+    .description('Upload components to Experience Builder')
+    .option('--client-id <id>', 'Client ID')
+    .option('--client-secret <secret>', 'Client Secret')
+    .option('--site-url <url>', 'Site URL')
+    .option('--scope <scope>', 'Scope')
+    .option('-d, --dir <directory>', 'Component directory')
+    .option('--all', 'Upload all components')
+    .option('--verbose', 'Verbose output')
+    .action(async (options: UploadOptions) => {
+      const allFlag = options.all || false;
+      try {
+        p.intro('Experience Builder Component Upload');
+
+        // Update config with CLI options
+        if (options.clientId) setConfig({ clientId: options.clientId });
+        if (options.clientSecret)
+          setConfig({ clientSecret: options.clientSecret });
+        if (options.siteUrl) setConfig({ siteUrl: options.siteUrl });
+        if (options.dir) setConfig({ componentDir: options.dir });
+        if (options.scope) setConfig({ scope: options.scope });
+        if (options.all) setConfig({ all: options.all });
+        if (options.verbose) setConfig({ verbose: options.verbose });
+        // Ensure all required config is present
+        await ensureConfig([
+          'siteUrl',
+          'clientId',
+          'clientSecret',
+          'scope',
+          'componentDir',
+        ]);
+        const config = getConfig();
+
+        // Find component directories
+        const componentDirs = await findComponentDirectories(
+          config.componentDir,
+        );
+        if (componentDirs.length === 0) {
+          p.outro('Upload cancelled - no components were found');
+          return;
+        }
+        // Select components to upload
+        const componentsToUpload = await selectComponentsToUpload(
+          componentDirs,
+          allFlag,
+        );
+        if (!componentsToUpload || componentsToUpload.length === 0) {
+          return;
+        }
+
+        // Create API service
+        const apiService = await createApiService();
+
+        // Build and upload components
+        const componentResults = await getBuildAndUploadResults(
+          componentsToUpload as string[],
+          apiService,
+        );
+        const globalCssResult = await uploadGlobalCss(
+          apiService,
+          config.componentDir,
+        );
+        // Display results
+        reportResults(componentResults, 'Uploaded components', 'Component');
+        if (globalCssResult) {
+          reportResults([globalCssResult], 'Uploaded assets', 'Asset');
+        }
+        p.outro('🥳 Upload completed');
+      } catch (error) {
+        if (error instanceof Error) {
+          p.note(chalk.red(`Error: ${error.message}`));
+        } else {
+          p.note(chalk.red(`Unknown error: ${String(error)}`));
+        }
+        process.exit(1);
+      }
+    });
+}
+
+/**
+ * Select components to upload.
+ */
+async function selectComponentsToUpload(
+  componentDirs: string[],
+  allFlag: boolean,
+): Promise<string[] | null> {
+  // Select all components if the --all flag is set.
+  if (allFlag) {
+    console.log(`Selected all ${componentDirs.length} components to upload`);
+    return componentDirs;
+  }
+  const selectedDirs = await p.multiselect({
+    message: 'Select components to upload',
+    options: [
+      {
+        value: '_allComponents',
+        label: 'All components',
+      },
+      ...componentDirs.map((dir) => ({
+        value: dir,
+        label: path.basename(dir),
+      })),
+    ],
+    required: true,
+  });
+
+  if (p.isCancel(selectedDirs)) {
+    p.cancel('Operation cancelled');
+    return null;
+  }
+
+  const count = selectedDirs.includes('_allComponents')
+    ? componentDirs.length
+    : selectedDirs.length;
+
+  // Confirm upload
+  const config = getConfig();
+  const confirmUpload = await p.confirm({
+    message: `Upload ${count} components to ${config.siteUrl}?`,
+    initialValue: true,
+  });
+
+  if (p.isCancel(confirmUpload) || !confirmUpload) {
+    p.cancel('Operation cancelled');
+    return null;
+  }
+
+  // If 'all' is selected, return all component directories.
+  if (selectedDirs.includes('_allComponents')) {
+    return componentDirs;
+  }
+  return selectedDirs;
+}
+
+// Get the build and upload results.
+async function getBuildAndUploadResults(
+  componentsToUpload: string[],
+  apiService: ApiService,
+): Promise<Result[]> {
+  const results: Result[] = [];
+
+  // Build components
+  const buildResults = await buildSelectedComponents(componentsToUpload);
+
+  // Filter successful builds
+  const successfulBuilds = buildResults.filter((build) => build.success);
+  const failedBuilds = buildResults.filter((build) => !build.success);
+
+  // // If no successful builds, return early
+  if (successfulBuilds.length === 0) {
+    const message = 'All component builds failed. Upload process aborted.';
+    p.note(chalk.red(message));
+    process.exit(1);
+  }
+  let spinner: any;
+  spinner = p.spinner();
+  spinner.start('Uploading components');
+
+  // Only upload the successfully built components.
+  for (const buildResult of successfulBuilds) {
+    const dir = buildResult.itemName
+      ? (componentsToUpload.find(
+          (d) => path.basename(d) === buildResult.itemName,
+        ) as string)
+      : undefined;
+
+    if (!dir) continue;
+
+    try {
+      // Process component files
+      const componentName = path.basename(dir);
+
+      // Process all component files
+      const { sourceCodeJs, compiledJs, sourceCodeCss, compiledCss, metadata } =
+        await processComponentFiles(dir);
+
+      const machineName =
+        buildResult.itemName ||
+        metadata.machineName ||
+        componentName.toLowerCase().replace(/[^a-z0-9_-]/g, '_');
+
+      // @todo: Add code from /ui to automatically detect first party imports
+      //   without relying on yml metadata.
+      const importedJsComponents = metadata.importedJsComponents || [];
+
+      const componentPayload = createComponentPayload({
+        metadata,
+        machineName,
+        componentName,
+        sourceCodeJs,
+        compiledJs,
+        sourceCodeCss,
+        compiledCss,
+        importedJsComponents,
+      });
+
+      // Check if component exists already
+      let componentExists = false;
+
+      try {
+        await apiService.getComponent(machineName);
+        componentExists = true;
+      } catch (error) {
+        // Component does not exist, will create new.
+      }
+
+      // Create or update the component
+      if (componentExists) {
+        await apiService.updateComponent(machineName, componentPayload);
+      } else {
+        await apiService.createComponent(componentPayload);
+      }
+      results.push({
+        itemName: componentName,
+        success: true,
+        details: [
+          {
+            content: componentExists ? 'Updated' : 'Created',
+          },
+        ],
+      });
+    } catch (error) {
+      const errorMessage =
+        error instanceof Error ? error.message : String(error);
+      results.push({
+        itemName: buildResult.itemName,
+        success: false,
+        details: [
+          {
+            content: errorMessage,
+          },
+        ],
+      });
+    }
+  }
+  // Add the failed builds to the upload results to get the correct count.
+  results.push(...failedBuilds);
+  spinner.stop('Upload completed');
+  return results;
+}
+
+/**
+ * Build all selected components
+ */
+async function buildSelectedComponents(
+  componentDirs: string[],
+): Promise<Result[]> {
+  const buildResults: Result[] = [];
+  for (const dir of componentDirs) {
+    buildResults.push(await buildComponent(dir));
+  }
+  return buildResults;
+}
+
+/**
+ * Uploads global CSS if it exists
+ */
+async function uploadGlobalCss(
+  apiService: ApiService,
+  componentDir: string,
+): Promise<Result | null> {
+  try {
+    const globalCssPath = path.join(componentDir, 'global.css');
+    const globalCssExists = await fs
+      .access(globalCssPath)
+      .then(() => true)
+      .catch(() => false);
+    if (globalCssExists) {
+      const globalCssContent = await fs.readFile(globalCssPath, 'utf-8');
+
+      // Upload the global CSS
+      await apiService.updateGlobalCss({
+        css: {
+          original: globalCssContent,
+          compiled: '',
+        },
+      });
+      return {
+        success: true,
+        itemName: 'global.css',
+      };
+    } else {
+      return null;
+    }
+  } catch (error) {
+    const errorMessage = error instanceof Error ? error.message : String(error);
+    return {
+      success: false,
+      itemName: 'global.css',
+      details: [
+        {
+          content: errorMessage,
+        },
+      ],
+    };
+  }
+}
diff --git a/cli/src/index.ts b/cli/src/index.ts
index ecdfc604ad5d103372904ff76e4d88aa658ea311..db69fbc1f21075e460975aa7e11bfccc2ab30d23 100644
--- a/cli/src/index.ts
+++ b/cli/src/index.ts
@@ -4,6 +4,8 @@ import { Command } from 'commander';
 import chalk from 'chalk';
 import { downloadCommand } from './commands/download';
 import { scaffoldCommand } from './commands/scaffold';
+import { uploadCommand } from './commands/upload';
+import { buildCommand } from './commands/build';
 
 const program = new Command();
 program
@@ -30,6 +32,8 @@ Environment variables can be set in:
 // Register commands
 downloadCommand(program);
 scaffoldCommand(program);
+uploadCommand(program);
+buildCommand(program);
 
 // Handle errors
 program.showHelpAfterError();
diff --git a/cli/src/lib/compile-js.test.ts b/cli/src/lib/compile-js.test.ts
new file mode 100644
index 0000000000000000000000000000000000000000..024093796f8722e5778ee9af2a162a8a965e35f0
--- /dev/null
+++ b/cli/src/lib/compile-js.test.ts
@@ -0,0 +1,36 @@
+import { expect, describe, it } from 'vitest';
+import { compileJS } from './compile-js';
+
+describe('compile js', () => {
+  it('should compile js', () => {
+    expect(compileJS('console.log("Hello, world!");')).toBe(
+      'console.log("Hello, world!");\n',
+    );
+  });
+
+  it('should compile jsx', () => {
+    expect(compileJS('const x = <div>Hello, world!</div>;'))
+      .toMatchInlineSnapshot(`
+      "import { jsx as _jsx } from "react/jsx-runtime";
+      const x = /*#__PURE__*/ _jsx("div", {
+          children: "Hello, world!"
+      });
+      "
+    `);
+  });
+
+  it('should handle errors', () => {
+    expect(() => compileJS('const x')).toThrowErrorMatchingInlineSnapshot(`
+      "  x 'const' declarations must be initialized
+         ,----
+       1 | const x
+         :       ^
+         \`----
+
+
+      Caused by:
+          0: failed to process js file
+          1: Syntax Error"
+    `);
+  });
+});
diff --git a/cli/src/lib/compile-js.ts b/cli/src/lib/compile-js.ts
new file mode 100644
index 0000000000000000000000000000000000000000..364f535c3652c689d3c3c5957d4a89ebf25e80d9
--- /dev/null
+++ b/cli/src/lib/compile-js.ts
@@ -0,0 +1,29 @@
+import { transformSync } from '@swc/wasm';
+import type { Options as SwcOptions } from '@swc/wasm';
+
+// @see src/features/code-editor/hooks/useCompileJavaScript.ts
+const SWC_OPTIONS: SwcOptions = {
+  jsc: {
+    parser: {
+      syntax: 'ecmascript',
+      jsx: true,
+    },
+    target: 'es2015',
+    transform: {
+      react: {
+        pragmaFrag: 'Fragment',
+        throwIfNamespace: true,
+        development: false,
+        runtime: 'automatic',
+      },
+    },
+  },
+  module: {
+    type: 'es6',
+  },
+} as const;
+
+export function compileJS(source: string): string {
+  const { code } = transformSync(source, SWC_OPTIONS);
+  return code;
+}
diff --git a/cli/src/services/api.ts b/cli/src/services/api.ts
index d1cb8892516c78481b2156c6b80f7536d25db38e..80b3400ea2b49eeb8397a9eabd823f971c0b7bb2 100644
--- a/cli/src/services/api.ts
+++ b/cli/src/services/api.ts
@@ -86,6 +86,56 @@ export class ApiService {
     }
   }
 
+  /**
+   * Create a new component in XB.
+   */
+  async createComponent(component: Component): Promise<Component> {
+    try {
+      const response = await this.client.post(
+        '/xb/api/v0/config/js_component',
+        component,
+      );
+      return response.data;
+    } catch (error) {
+      this.handleApiError(error);
+      throw new Error(`Failed to create component: '${component.machineName}'`);
+    }
+  }
+
+  /**
+   * Get a specific component
+   */
+  async getComponent(machineName: string): Promise<Component> {
+    try {
+      const response = await this.client.get(
+        `/xb/api/v0/config/js_component/${machineName}`,
+      );
+      return response.data;
+    } catch (error) {
+      this.handleApiError(error);
+      throw new Error(`Component '${machineName}' not found`);
+    }
+  }
+
+  /**
+   * Update an existing component
+   */
+  async updateComponent(
+    machineName: string,
+    component: Partial<Component>,
+  ): Promise<Component> {
+    try {
+      const response = await this.client.patch(
+        `/xb/api/v0/config/js_component/${machineName}`,
+        component,
+      );
+      return response.data;
+    } catch (error) {
+      this.handleApiError(error);
+      throw new Error(`Failed to update component '${machineName}'`);
+    }
+  }
+
   /**
    * Get global CSS.
    */
@@ -101,6 +151,24 @@ export class ApiService {
     }
   }
 
+  /**
+   * Update global CSS.
+   */
+  async updateGlobalCss(
+    assetLibrary: Partial<AssetLibrary>,
+  ): Promise<AssetLibrary> {
+    try {
+      const response = await this.client.patch(
+        '/xb/api/v0/config/xb_asset_library/global',
+        assetLibrary,
+      );
+      return response.data;
+    } catch (error) {
+      this.handleApiError(error);
+      throw new Error('Failed to update global CSS');
+    }
+  }
+
   private handleApiError(error: any): void {
     const config = getConfig();
     const verbose = config.verbose;
diff --git a/cli/src/types/Result.ts b/cli/src/types/Result.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4fd9e1dd49565c66c8fb4051879de3cb655b6a87
--- /dev/null
+++ b/cli/src/types/Result.ts
@@ -0,0 +1,5 @@
+export interface Result {
+  itemName: string;
+  success: boolean;
+  details?: { heading?: string; content: string }[];
+}
diff --git a/cli/src/utils/build.ts b/cli/src/utils/build.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2dd5cde889ce1d9d9c3f623a7c4330f2afa8b1d2
--- /dev/null
+++ b/cli/src/utils/build.ts
@@ -0,0 +1,50 @@
+import { promises as fs } from 'fs';
+import path from 'path';
+import { compileJS } from '../lib/compile-js';
+import type { Result } from '../types/Result';
+
+export async function buildComponent(componentDir: string): Promise<Result> {
+  const componentName = path.basename(componentDir);
+  const result: Result = {
+    itemName: componentName,
+    success: true,
+    details: [],
+  };
+
+  // Create `dist` directory
+  const distDir = path.join(componentDir, 'dist');
+  try {
+    await fs.mkdir(distDir, { recursive: true });
+  } catch (error) {
+    result.success = false;
+    result.details?.push({
+      heading: 'Error while creating `dist` directory',
+      content: String(error),
+    });
+    return result;
+  }
+
+  // Read JS source and compile it.
+  try {
+    const jsSource = await fs.readFile(
+      path.join(componentDir, 'index.jsx'),
+      'utf-8',
+    );
+    const jsCompiled = compileJS(jsSource);
+    await fs.writeFile(path.join(distDir, 'index.js'), jsCompiled);
+  } catch (error) {
+    result.success = false;
+    result.details?.push({
+      heading: 'Error while transforming JavaScript',
+      content: String(error),
+    });
+  }
+
+  // @todo Transpile CSS: https://drupal.org/i/3525590
+  await fs.writeFile(
+    path.join(distDir, 'index.css'),
+    `/* @todo Transpile CSS for ${componentName} in https://drupal.org/i/3525590 */`,
+  );
+
+  return result;
+}
diff --git a/cli/src/utils/find-component-directories.ts b/cli/src/utils/find-component-directories.ts
new file mode 100644
index 0000000000000000000000000000000000000000..69e30e33e588548edff3935aa9a65ed4fbdf7ec4
--- /dev/null
+++ b/cli/src/utils/find-component-directories.ts
@@ -0,0 +1,26 @@
+import path from 'path';
+import { glob } from 'glob';
+
+export async function findComponentDirectories(
+  baseDir: string,
+): Promise<string[]> {
+  try {
+    // Find directories containing component.yml files (with variants)
+    const standardYmls = await glob(`${baseDir}/**/component.yml`);
+    const namedYmls = await glob(`${baseDir}/**/*.component.yml`);
+
+    // Combine results and remove duplicates
+    const allComponentPaths = [...standardYmls, ...namedYmls];
+    const uniqueDirs = new Set(
+      allComponentPaths.map((filePath) => path.dirname(filePath)),
+    );
+
+    // Convert to array
+    const componentDirs = Array.from(uniqueDirs).sort();
+
+    return componentDirs;
+  } catch (error) {
+    console.error('Error finding component directories:', error);
+    return [];
+  }
+}
diff --git a/cli/src/utils/process-component-files.ts b/cli/src/utils/process-component-files.ts
new file mode 100644
index 0000000000000000000000000000000000000000..003d890e58471241ed3af2c58f187f74cb215bda
--- /dev/null
+++ b/cli/src/utils/process-component-files.ts
@@ -0,0 +1,154 @@
+import { promises as fs } from 'fs';
+import path from 'path';
+import * as yaml from 'js-yaml';
+import type { Component } from '../types/Component';
+
+/**
+ * Process and read component files
+ * @param componentDir Component directory path
+ * @returns Processed component files and paths
+ */
+export async function processComponentFiles(componentDir: string): Promise<{
+  sourceCodeJs: string;
+  compiledJs: string;
+  sourceCodeCss: string;
+  compiledCss: string;
+  metadata: any;
+}> {
+  const metadataPath = await findMetadataPath(componentDir);
+  const metadata = await readComponentMetadata(metadataPath);
+  const distDir = path.join(componentDir, 'dist');
+  const sourceCodeJs = await fs.readFile(
+    path.join(componentDir, 'index.jsx'),
+    'utf-8',
+  );
+  const compiledJs = await fs.readFile(path.join(distDir, 'index.js'), 'utf-8');
+
+  let sourceCodeCss = '';
+  let compiledCss = '';
+
+  try {
+    sourceCodeCss = await fs.readFile(
+      path.join(componentDir, 'index.css'),
+      'utf-8',
+    );
+    // If source CSS exists, compiled CSS should also exist
+    compiledCss = await fs.readFile(path.join(distDir, 'index.css'), 'utf-8');
+  } catch (e) {
+    // CSS files don't exist, use empty strings
+  }
+
+  return {
+    sourceCodeJs,
+    compiledJs,
+    sourceCodeCss,
+    compiledCss,
+    metadata,
+  };
+}
+
+/**
+ * Find the component metadata file
+ * @param componentDir Component directory path
+ * @returns Path to the found metadata file
+ */
+export async function findMetadataPath(componentDir: string): Promise<string> {
+  const metadataPath = path.join(componentDir, 'component.yml');
+
+  try {
+    await fs.access(metadataPath);
+    return metadataPath;
+  } catch (e) {
+    console.error(`Error finding component metadata at ${metadataPath}:`, e);
+  }
+  return '';
+}
+
+/**
+ * Reads and validates component metadata from a YAML file
+ * @param filePath Path to the YAML file
+ * @returns Properly structured component metadata
+ */
+export async function readComponentMetadata(filePath: string): Promise<any> {
+  try {
+    const content = await fs.readFile(filePath, 'utf-8');
+    // Make sure we return an object even if the file is empty
+    const rawMetadata = yaml.load(content) || {};
+
+    if (typeof rawMetadata !== 'object') {
+      console.error(
+        `Invalid metadata format in ${filePath}. Expected an object, got ${typeof rawMetadata}`,
+      );
+      return { name: path.basename(path.dirname(filePath)) };
+    }
+
+    // Basic validation and normalization
+    const metadata = rawMetadata as any;
+
+    // Ensure other required fields
+    if (!metadata.name) {
+      metadata.name = path.basename(path.dirname(filePath));
+    }
+    if (!metadata.machineName) {
+      metadata.machineName = path.basename(path.dirname(filePath));
+    }
+
+    if (!metadata.slots || typeof metadata.slots !== 'object') {
+      metadata.slots = {};
+    }
+
+    return metadata;
+  } catch (error) {
+    console.error(`Error reading component metadata from ${filePath}:`, error);
+  }
+}
+
+/**
+ * Creates a standardized component payload for API requests
+ * @param params Component payload parameters
+ * @returns Component payload for API
+ */
+export function createComponentPayload(params: {
+  metadata: any;
+  machineName: string;
+  componentName: string;
+  sourceCodeJs: string;
+  compiledJs: string;
+  sourceCodeCss: string;
+  compiledCss: string;
+  importedJsComponents: string[];
+}): Component {
+  const {
+    metadata,
+    machineName,
+    componentName,
+    sourceCodeJs,
+    compiledJs,
+    sourceCodeCss,
+    compiledCss,
+  } = params;
+
+  // Ensure props is correctly structured
+  const propsData = metadata.props.properties;
+
+  // Ensure slots has correct format
+  let slotsData = metadata.slots || {};
+  if (typeof slotsData === 'string' || Array.isArray(slotsData)) {
+    slotsData = {};
+  }
+
+  return {
+    machineName,
+    name: metadata.name || componentName,
+    status: true,
+    required: Array.isArray(metadata.required) ? metadata.required : [],
+    props: propsData,
+    slots: slotsData,
+    source_code_js: sourceCodeJs,
+    compiled_js: compiledJs,
+    source_code_css: sourceCodeCss,
+    compiled_css: compiledCss,
+    block_override: metadata.blockOverride || null,
+    imported_js_components: metadata.importedJsComponents || [],
+  };
+}
diff --git a/cli/src/utils/report-results.ts b/cli/src/utils/report-results.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a571b8c93e467395dc67197daff077445cb46cbb
--- /dev/null
+++ b/cli/src/utils/report-results.ts
@@ -0,0 +1,72 @@
+import chalk from 'chalk';
+import * as p from '@clack/prompts';
+import { table } from 'table';
+import type { Result } from '../types/Result';
+
+/**
+ * Report operation results in a table.
+ */
+export function reportResults(
+  results: Result[],
+  title: string,
+  itemLabel = 'Component',
+): void {
+  // Alphabetize results by component name.
+  results.sort((a, b) => a.itemName.localeCompare(b.itemName));
+
+  const successful = results.filter((r) => r.success).length;
+  const failed = results.filter((r) => !r.success).length;
+  const hasDetails = results.some((r) => (r.details?.length ?? 0) > 0);
+
+  const succeededText =
+    failed === 0
+      ? chalk.green(`${successful} succeeded`)
+      : `${successful} succeeded`;
+  const failedText =
+    failed > 0 ? chalk.red(`${failed} failed`) : chalk.dim(`${failed} failed`);
+  const summary = `${succeededText}, ${failedText}`;
+
+  if (results.length > 0) {
+    const tableData = [
+      hasDetails ? [chalk.bold(title), '', ''] : [chalk.bold(title), ''],
+      hasDetails ? [itemLabel, 'Status', 'Details'] : [itemLabel, 'Status'],
+      ...results.map((r) =>
+        hasDetails
+          ? [
+              r.itemName,
+              r.success ? chalk.green('Success') : chalk.red('Failed'),
+              r.details
+                ?.map((d) =>
+                  d.heading
+                    ? `${chalk.underline(d.heading)}:\n${d.content}`
+                    : d.content,
+                )
+                .join('\n\n'),
+            ]
+          : [
+              r.itemName,
+              r.success ? chalk.green('Success') : chalk.red('Failed'),
+            ],
+      ),
+      hasDetails ? ['📋 Summary', '', summary] : ['📋 Summary', summary],
+    ];
+    p.log.info(
+      table(tableData, {
+        spanningCells: [
+          {
+            row: 0,
+            col: 0,
+            colSpan: hasDetails ? 3 : 2,
+            alignment: 'center',
+          },
+          {
+            row: results.length + 2,
+            col: 0,
+            colSpan: hasDetails ? 2 : 1,
+            alignment: 'right',
+          },
+        ],
+      }),
+    );
+  }
+}
diff --git a/cli/templates/hello-world/hello-world.component.yml b/cli/templates/hello-world/component.yml
similarity index 88%
rename from cli/templates/hello-world/hello-world.component.yml
rename to cli/templates/hello-world/component.yml
index b60c1531f22f2759a3d487ed9d9bc4e1efdf3265..8ad55e4696b88abb104aca2ae0fab001a6f4e397 100644
--- a/cli/templates/hello-world/hello-world.component.yml
+++ b/cli/templates/hello-world/component.yml
@@ -8,7 +8,8 @@ props:
       type: string
       title: Greeting
       description: The greeting to display
-      default: Hello World
+      examples:
+       - Hello World
     cta:
       type: string
       title: CTA display text
@@ -26,4 +27,4 @@ slots:
     title: Content
     description: Content to display below the greeting
     examples:
-      - Example slot content
+      - <div>Example slot content</div>
diff --git a/cli/templates/hello-world/hello-world.css b/cli/templates/hello-world/index.css
similarity index 100%
rename from cli/templates/hello-world/hello-world.css
rename to cli/templates/hello-world/index.css
diff --git a/cli/templates/hello-world/hello-world.jsx b/cli/templates/hello-world/index.jsx
similarity index 100%
rename from cli/templates/hello-world/hello-world.jsx
rename to cli/templates/hello-world/index.jsx
diff --git a/dictionary.txt b/dictionary.txt
index 6df044fc322baf0345957415a5fe7367d5b442bc..d098fad5e2cdb5f589da4f9c73ac3e6a627cec61 100644
--- a/dictionary.txt
+++ b/dictionary.txt
@@ -91,4 +91,5 @@ xbstark
 xbrc
 xbxb
 xmdi
+ymls
 Deepchat
diff --git a/ui/src/features/code-editor/hooks/useCompileJavaScript.ts b/ui/src/features/code-editor/hooks/useCompileJavaScript.ts
index b25e532fd5dbbe620a1cc4d43f183089cf8310a7..4687189cda9678ffeac1709653745be06e553c8f 100644
--- a/ui/src/features/code-editor/hooks/useCompileJavaScript.ts
+++ b/ui/src/features/code-editor/hooks/useCompileJavaScript.ts
@@ -20,7 +20,6 @@ const SWC_OPTIONS: SwcOptions = {
     target: 'es2015',
     transform: {
       react: {
-        pragma: 'h',
         pragmaFrag: 'Fragment',
         throwIfNamespace: true,
         development: false,