From b8c919d22ceb2fed662bb94577072106bc27fc2d Mon Sep 17 00:00:00 2001
From: rabi-siddique <rabisiddique27@gmail.com>
Date: Wed, 18 Dec 2024 09:41:58 +0500
Subject: [PATCH] refactor: use zx for creating vaults

---
 .github/actions/createVault/action.yml     |  19 +--
 .github/actions/createVault/createVault.js |  76 +++++++++
 .github/workflows/liquidation.yml          | 170 +++++++++----------
 package.json                               |   4 +-
 yarn.lock                                  | 182 +++++++++++++++++++++
 5 files changed, 348 insertions(+), 103 deletions(-)
 create mode 100644 .github/actions/createVault/createVault.js

diff --git a/.github/actions/createVault/action.yml b/.github/actions/createVault/action.yml
index 3460914a..1ad3c0ac 100644
--- a/.github/actions/createVault/action.yml
+++ b/.github/actions/createVault/action.yml
@@ -21,20 +21,5 @@ inputs:
     required: true
 
 runs:
-  using: 'composite'
-  steps:
-    - name: Create Vault
-      shell: bash
-      run: |
-        createVaultCommand="/usr/src/agoric-sdk/packages/agoric-cli/bin/agops vaults open --wantMinted \"${{ inputs.wantMinted }}\" --giveCollateral \"${{ inputs.giveCollateral }}\" > /tmp/want-ist.json"
-        echo "Executing create vault command in the container..."
-
-        docker exec ${{ inputs.containerName }} /bin/bash -c "env AGORIC_NET=${{ inputs.agoricNet }} timeout ${{ inputs.commandTimeout }} $createVaultCommand"
-
-    - name: Broadcast Offer
-      shell: bash
-      run: |
-        broadcastCommand="/usr/src/agoric-sdk/packages/agoric-cli/bin/agops perf satisfaction --executeOffer /tmp/want-ist.json --from \"${{ inputs.userKey }}\" --keyring-backend=test"
-        echo "Executing broadcast command in the container..."
-
-        docker exec ${{ inputs.containerName }} /bin/bash -c "env AGORIC_NET=${{ inputs.agoricNet }} timeout ${{ inputs.commandTimeout }} $broadcastCommand"
+  using: 'node20'
+  main: 'createVault.mjs'
diff --git a/.github/actions/createVault/createVault.js b/.github/actions/createVault/createVault.js
new file mode 100644
index 00000000..302c7e86
--- /dev/null
+++ b/.github/actions/createVault/createVault.js
@@ -0,0 +1,76 @@
+
+
+const execa = require('execa');
+
+async function setAtomPrice() {
+    try {
+        const { stdout } = await execa('docker', [
+            'exec',
+            'agd',
+            '/usr/src/agoric-sdk/packages/agoric-cli/bin/agops',
+            'oracle',
+            'setPrice',
+            '--keys', 'gov1,gov2',
+            '--pair', 'ATOM.USD',
+            '--price', '12.34',
+            '--keyring-backend', 'test'
+        ]);
+        console.log('Output:', stdout);
+    } catch (error) {
+        console.error('Error:', error);
+    }
+}
+
+setAtomPrice();
+
+
+
+const createVault = async (containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral) => {
+  console.log('Starting the vault creation process...');
+  const agops = '/usr/src/agoric-sdk/packages/agoric-cli/bin/agops';
+
+  let res = await $`docker ps`;
+  console.log('test.........', res);
+
+  res = await $`ls /usr/`;
+  console.log('usr.........', res);
+
+  res = await $`ls /usr/src`;
+  console.log('src.........', res);
+
+  // res = await $`find / -type d -name "agoric-sdk" 2>/dev/null`;
+  // console.log('sdk dir.........', res);
+
+  const createVaultCommand = `${agops} vaults open --wantMinted \"${wantMinted}\" --giveCollateral \"${giveCollateral}\" > /tmp/want-ist.json`;
+  const executeCreateVaultCommand = `docker exec ${containerName} /bin/bash -c "env AGORIC_NET=${agoricNet} timeout ${commandTimeout} ${createVaultCommand}"`;
+  try {
+    if (!containerName || !agoricNet || !commandTimeout || !userKey || !wantMinted || !giveCollateral) {
+      console.error('Missing required parameters.');
+      process.exit(1);
+    }
+
+    // Improved logging for debugging
+    console.log(`Command to execute: ${executeCreateVaultCommand}`);
+
+    await $`${executeCreateVaultCommand}`;
+    console.log('Executing broadcast command...');
+    const broadcastCommand = `timeout ${commandTimeout} ${agops} perf satisfaction --executeOffer /tmp/want-ist.json --from ${userKey} --keyring-backend=test`;
+    const executeBroadcastCommand = `docker exec ${containerName} AGORIC_NET=${agoricNet} ${broadcastCommand}`;
+
+    await $`${executeBroadcastCommand}`;
+    console.log('Offer broadcast successfully.');
+  } catch (error) {
+    console.error('Error during vault creation:', error);
+    process.exit(1);
+  }
+};
+
+const containerName = process.env.INPUT_CONTAINERNAME;
+const agoricNet = process.env.INPUT_AGORICNET;
+const commandTimeout = process.env.INPUT_COMMANDTIMEOUT;
+const userKey = process.env.INPUT_USERKEY;
+const wantMinted = process.env.INPUT_WANTMINTED;
+const giveCollateral = process.env.INPUT_GIVECOLLATERAL;
+
+console.log('ARGS:', { containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral });
+createVault(containerName, agoricNet, commandTimeout, userKey, wantMinted, giveCollateral);
diff --git a/.github/workflows/liquidation.yml b/.github/workflows/liquidation.yml
index 8ca224be..1b297d7a 100644
--- a/.github/workflows/liquidation.yml
+++ b/.github/workflows/liquidation.yml
@@ -23,29 +23,29 @@ jobs:
       - name: Install dependencies
         run: yarn install
 
-      - name: Start subql indexer
-        env:
-          AGORIC_NET: ci
-        run: yarn dev
-
-      - name: Print initial logs of all containers
-        run: |
-          echo "Fetching initial logs for all containers..."
-          containers=$(docker ps --format '{{.ID}}')
-          for container in $containers; do
-            echo "Fetching initial logs for container $container..."
-            docker logs $container
-          done
-
-      - name: Set ATOM Price to 12.34
-        run: |
-          docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 12.34 --keyring-backend=test
-
-      - name: Get active vaults
-        uses: ./.github/actions/getActiveVaults
-        with:
-          apiUrl: 'http://localhost:3000/'
-          expectedVaults: 7
+      # - name: Start subql indexer
+      #   env:
+      #     AGORIC_NET: ci
+      #   run: yarn dev
+
+      # - name: Print initial logs of all containers
+      #   run: |
+      #     echo "Fetching initial logs for all containers..."
+      #     containers=$(docker ps --format '{{.ID}}')
+      #     for container in $containers; do
+      #       echo "Fetching initial logs for container $container..."
+      #       docker logs $container
+      #     done
+
+      # - name: Set ATOM Price to 12.34
+      #   run: |
+      #     docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 12.34 --keyring-backend=test
+
+      # - name: Get active vaults
+      #   uses: ./.github/actions/getActiveVaults
+      #   with:
+      #     apiUrl: 'http://localhost:3000/'
+      #     expectedVaults: 7
 
       - name: Create Vault with 100 Minted and 15 Collateral
         uses: ./.github/actions/createVault
@@ -57,65 +57,65 @@ jobs:
           commandTimeout: '120'
           containerName: 'agd'
 
-      - name: Create Vault with 103 Minted and 15 Collateral
-        uses: ./.github/actions/createVault
-        with:
-          wantMinted: '103'
-          giveCollateral: '15'
-          userKey: 'gov3'
-          agoricNet: 'local'
-          commandTimeout: '120'
-          containerName: 'agd'
-
-      - name: Create Vault with 105 Minted and 15 Collateral
-        uses: ./.github/actions/createVault
-        with:
-          wantMinted: '105'
-          giveCollateral: '15'
-          userKey: 'gov3'
-          agoricNet: 'local'
-          commandTimeout: '120'
-          containerName: 'agd'
-
-      - name: Get active vaults
-        uses: ./.github/actions/getActiveVaults
-        with:
-          apiUrl: 'http://localhost:3000/'
-          expectedVaults: 10
-
-      - name: Place bid for 90IST
-        uses: ./.github/actions/placeBid
-        with:
-          fromAddress: 'gov1'
-          giveAmount: '90IST'
-          priceOrDiscount: '9'
-          commandType: 'by-price'
-          agoricNet: 'local'
-          commandTimeout: '120'
-          containerName: 'agd'
-
-      - name: Place bid for 80IST
-        uses: ./.github/actions/placeBid
-        with:
-          fromAddress: 'gov1'
-          giveAmount: '80IST'
-          priceOrDiscount: '10'
-          commandType: 'by-discount'
-          agoricNet: 'local'
-          commandTimeout: '120'
-          containerName: 'agd'
-
-      - name: Place bid for 150IST
-        uses: ./.github/actions/placeBid
-        with:
-          fromAddress: 'gov1'
-          giveAmount: '150IST'
-          priceOrDiscount: '15'
-          commandType: 'by-discount'
-          agoricNet: 'local'
-          commandTimeout: '120'
-          containerName: 'agd'
-
-      - name: Set ATOM Price to 9.99
-        run: |
-          docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 9.99 --keyring-backend=test
+      # - name: Create Vault with 103 Minted and 15 Collateral
+      #   uses: ./.github/actions/createVault
+      #   with:
+      #     wantMinted: '103'
+      #     giveCollateral: '15'
+      #     userKey: 'gov3'
+      #     agoricNet: 'local'
+      #     commandTimeout: '120'
+      #     containerName: 'agd'
+
+      # - name: Create Vault with 105 Minted and 15 Collateral
+      #   uses: ./.github/actions/createVault
+      #   with:
+      #     wantMinted: '105'
+      #     giveCollateral: '15'
+      #     userKey: 'gov3'
+      #     agoricNet: 'local'
+      #     commandTimeout: '120'
+      #     containerName: 'agd'
+
+      # - name: Get active vaults
+      #   uses: ./.github/actions/getActiveVaults
+      #   with:
+      #     apiUrl: 'http://localhost:3000/'
+      #     expectedVaults: 10
+
+      # - name: Place bid for 90IST
+      #   uses: ./.github/actions/placeBid
+      #   with:
+      #     fromAddress: 'gov1'
+      #     giveAmount: '90IST'
+      #     priceOrDiscount: '9'
+      #     commandType: 'by-price'
+      #     agoricNet: 'local'
+      #     commandTimeout: '120'
+      #     containerName: 'agd'
+
+      # - name: Place bid for 80IST
+      #   uses: ./.github/actions/placeBid
+      #   with:
+      #     fromAddress: 'gov1'
+      #     giveAmount: '80IST'
+      #     priceOrDiscount: '10'
+      #     commandType: 'by-discount'
+      #     agoricNet: 'local'
+      #     commandTimeout: '120'
+      #     containerName: 'agd'
+
+      # - name: Place bid for 150IST
+      #   uses: ./.github/actions/placeBid
+      #   with:
+      #     fromAddress: 'gov1'
+      #     giveAmount: '150IST'
+      #     priceOrDiscount: '15'
+      #     commandType: 'by-discount'
+      #     agoricNet: 'local'
+      #     commandTimeout: '120'
+      #     containerName: 'agd'
+
+      # - name: Set ATOM Price to 9.99
+      #   run: |
+      #     docker exec agd /usr/src/agoric-sdk/packages/agoric-cli/bin/agops oracle setPrice --keys gov1,gov2 --pair ATOM.USD --price 9.99 --keyring-backend=test
diff --git a/package.json b/package.json
index fc659b91..d735cec7 100644
--- a/package.json
+++ b/package.json
@@ -27,9 +27,11 @@
     "@subql/cli": "^5.4.0",
     "@subql/node-cosmos": "4.2.1",
     "@subql/testing": "latest",
+    "execa": "^9.5.2",
     "prettier": "^3.4.2",
     "starknet": "6.11.0",
-    "typescript": "^5.7.2"
+    "typescript": "^5.7.2",
+    "zx": "^8.2.4"
   },
   "dependencies": {
     "@subql/types-cosmos": "^4.0.0",
diff --git a/yarn.lock b/yarn.lock
index 4c0e2d2d..9dfadb54 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3156,6 +3156,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@sec-ant/readable-stream@npm:^0.4.1":
+  version: 0.4.1
+  resolution: "@sec-ant/readable-stream@npm:0.4.1"
+  checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af
+  languageName: node
+  linkType: hard
+
 "@sinclair/typebox@npm:^0.24.1":
   version: 0.24.51
   resolution: "@sinclair/typebox@npm:0.24.51"
@@ -3170,6 +3177,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@sindresorhus/merge-streams@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "@sindresorhus/merge-streams@npm:4.0.0"
+  checksum: 10c0/482ee543629aa1933b332f811a1ae805a213681ecdd98c042b1c1b89387df63e7812248bb4df3910b02b3cc5589d3d73e4393f30e197c9dde18046ccd471fc6b
+  languageName: node
+  linkType: hard
+
 "@starknet-io/types-js@npm:^0.7.7, starknet-types-07@npm:@starknet-io/types-js@^0.7.7":
   version: 0.7.10
   resolution: "@starknet-io/types-js@npm:0.7.10"
@@ -3617,6 +3631,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/fs-extra@npm:>=11":
+  version: 11.0.4
+  resolution: "@types/fs-extra@npm:11.0.4"
+  dependencies:
+    "@types/jsonfile": "npm:*"
+    "@types/node": "npm:*"
+  checksum: 10c0/9e34f9b24ea464f3c0b18c3f8a82aefc36dc524cc720fc2b886e5465abc66486ff4e439ea3fb2c0acebf91f6d3f74e514f9983b1f02d4243706bdbb7511796ad
+  languageName: node
+  linkType: hard
+
 "@types/glob@npm:*":
   version: 8.1.0
   resolution: "@types/glob@npm:8.1.0"
@@ -3678,6 +3702,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/jsonfile@npm:*":
+  version: 6.1.4
+  resolution: "@types/jsonfile@npm:6.1.4"
+  dependencies:
+    "@types/node": "npm:*"
+  checksum: 10c0/b12d068b021e4078f6ac4441353965769be87acf15326173e2aea9f3bf8ead41bd0ad29421df5bbeb0123ec3fc02eb0a734481d52903704a1454a1845896b9eb
+  languageName: node
+  linkType: hard
+
 "@types/keyv@npm:^3.1.1":
   version: 3.1.4
   resolution: "@types/keyv@npm:3.1.4"
@@ -3747,6 +3780,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"@types/node@npm:>=20":
+  version: 22.10.2
+  resolution: "@types/node@npm:22.10.2"
+  dependencies:
+    undici-types: "npm:~6.20.0"
+  checksum: 10c0/2c7b71a040f1ef5320938eca8ebc946e6905caa9bbf3d5665d9b3774a8d15ea9fab1582b849a6d28c7fc80756a62c5666bc66b69f42f4d5dafd1ccb193cdb4ac
+  languageName: node
+  linkType: hard
+
 "@types/node@npm:^17.0.21":
   version: 17.0.45
   resolution: "@types/node@npm:17.0.45"
@@ -4113,11 +4155,13 @@ __metadata:
     "@subql/utils": "npm:^2.17.0"
     "@types/node": "npm:^17.0.21"
     bech32: "npm:^2.0.0"
+    execa: "npm:^9.5.2"
     js-sha256: "npm:^0.11.0"
     pino: "npm:^7.8.0"
     prettier: "npm:^3.4.2"
     starknet: "npm:6.11.0"
     typescript: "npm:^5.7.2"
+    zx: "npm:^8.2.4"
   languageName: unknown
   linkType: soft
 
@@ -5892,6 +5936,26 @@ __metadata:
   languageName: node
   linkType: hard
 
+"execa@npm:^9.5.2":
+  version: 9.5.2
+  resolution: "execa@npm:9.5.2"
+  dependencies:
+    "@sindresorhus/merge-streams": "npm:^4.0.0"
+    cross-spawn: "npm:^7.0.3"
+    figures: "npm:^6.1.0"
+    get-stream: "npm:^9.0.0"
+    human-signals: "npm:^8.0.0"
+    is-plain-obj: "npm:^4.1.0"
+    is-stream: "npm:^4.0.1"
+    npm-run-path: "npm:^6.0.0"
+    pretty-ms: "npm:^9.0.0"
+    signal-exit: "npm:^4.1.0"
+    strip-final-newline: "npm:^4.0.0"
+    yoctocolors: "npm:^2.0.0"
+  checksum: 10c0/94782a6282e03253224406c29068d18f9095cc251a45d1f19ac3d8f2a9db2cbe32fb8ceb039db1451d8fce3531135a6c0c559f76d634f85416268fc4a6995365
+  languageName: node
+  linkType: hard
+
 "exponential-backoff@npm:^3.1.1":
   version: 3.1.1
   resolution: "exponential-backoff@npm:3.1.1"
@@ -6047,6 +6111,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"figures@npm:^6.1.0":
+  version: 6.1.0
+  resolution: "figures@npm:6.1.0"
+  dependencies:
+    is-unicode-supported: "npm:^2.0.0"
+  checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4
+  languageName: node
+  linkType: hard
+
 "file-uri-to-path@npm:1.0.0":
   version: 1.0.0
   resolution: "file-uri-to-path@npm:1.0.0"
@@ -6307,6 +6380,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"get-stream@npm:^9.0.0":
+  version: 9.0.1
+  resolution: "get-stream@npm:9.0.1"
+  dependencies:
+    "@sec-ant/readable-stream": "npm:^0.4.1"
+    is-stream: "npm:^4.0.1"
+  checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948
+  languageName: node
+  linkType: hard
+
 "glob-parent@npm:^5.1.2":
   version: 5.1.2
   resolution: "glob-parent@npm:5.1.2"
@@ -6604,6 +6687,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"human-signals@npm:^8.0.0":
+  version: 8.0.0
+  resolution: "human-signals@npm:8.0.0"
+  checksum: 10c0/e4dac4f7d3eb791ed04129fc6a85bd454a9102d3e3b76c911d0db7057ebd60b2956b435b5b5712aec18960488ede3c21ef7c56e42cdd70760c0d84d3c05cd92e
+  languageName: node
+  linkType: hard
+
 "humanize-number@npm:0.0.2":
   version: 0.0.2
   resolution: "humanize-number@npm:0.0.2"
@@ -6913,6 +7003,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-plain-obj@npm:^4.1.0":
+  version: 4.1.0
+  resolution: "is-plain-obj@npm:4.1.0"
+  checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e
+  languageName: node
+  linkType: hard
+
 "is-plain-object@npm:^2.0.4":
   version: 2.0.4
   resolution: "is-plain-object@npm:2.0.4"
@@ -6929,6 +7026,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-stream@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "is-stream@npm:4.0.1"
+  checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f
+  languageName: node
+  linkType: hard
+
 "is-typedarray@npm:^1.0.0":
   version: 1.0.0
   resolution: "is-typedarray@npm:1.0.0"
@@ -6943,6 +7047,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"is-unicode-supported@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "is-unicode-supported@npm:2.1.0"
+  checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5
+  languageName: node
+  linkType: hard
+
 "is-wsl@npm:^2.2.0":
   version: 2.2.0
   resolution: "is-wsl@npm:2.2.0"
@@ -8007,6 +8118,16 @@ __metadata:
   languageName: node
   linkType: hard
 
+"npm-run-path@npm:^6.0.0":
+  version: 6.0.0
+  resolution: "npm-run-path@npm:6.0.0"
+  dependencies:
+    path-key: "npm:^4.0.0"
+    unicorn-magic: "npm:^0.3.0"
+  checksum: 10c0/b223c8a0dcd608abf95363ea5c3c0ccc3cd877daf0102eaf1b0f2390d6858d8337fbb7c443af2403b067a7d2c116d10691ecd22ab3c5273c44da1ff8d07753bd
+  languageName: node
+  linkType: hard
+
 "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
   version: 4.1.1
   resolution: "object-assign@npm:4.1.1"
@@ -8179,6 +8300,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"parse-ms@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "parse-ms@npm:4.0.0"
+  checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16
+  languageName: node
+  linkType: hard
+
 "parse-package-name@npm:1.0.0":
   version: 1.0.0
   resolution: "parse-package-name@npm:1.0.0"
@@ -8224,6 +8352,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"path-key@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "path-key@npm:4.0.0"
+  checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3
+  languageName: node
+  linkType: hard
+
 "path-parse@npm:^1.0.7":
   version: 1.0.7
   resolution: "path-parse@npm:1.0.7"
@@ -8481,6 +8616,15 @@ __metadata:
   languageName: node
   linkType: hard
 
+"pretty-ms@npm:^9.0.0":
+  version: 9.2.0
+  resolution: "pretty-ms@npm:9.2.0"
+  dependencies:
+    parse-ms: "npm:^4.0.0"
+  checksum: 10c0/ab6d066f90e9f77020426986e1b018369f41575674544c539aabec2e63a20fec01166d8cf6571d0e165ad11cfe5a8134a2a48a36d42ab291c59c6deca5264cbb
+  languageName: node
+  linkType: hard
+
 "proc-log@npm:^5.0.0":
   version: 5.0.0
   resolution: "proc-log@npm:5.0.0"
@@ -9552,6 +9696,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"strip-final-newline@npm:^4.0.0":
+  version: 4.0.0
+  resolution: "strip-final-newline@npm:4.0.0"
+  checksum: 10c0/b0cf2b62d597a1b0e3ebc42b88767f0a0d45601f89fd379a928a1812c8779440c81abba708082c946445af1d6b62d5f16e2a7cf4f30d9d6587b89425fae801ff
+  languageName: node
+  linkType: hard
+
 "strip-json-comments@npm:~2.0.1":
   version: 2.0.1
   resolution: "strip-json-comments@npm:2.0.1"
@@ -10043,6 +10194,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"unicorn-magic@npm:^0.3.0":
+  version: 0.3.0
+  resolution: "unicorn-magic@npm:0.3.0"
+  checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271
+  languageName: node
+  linkType: hard
+
 "unique-filename@npm:^4.0.0":
   version: 4.0.0
   resolution: "unique-filename@npm:4.0.0"
@@ -10664,6 +10822,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"yoctocolors@npm:^2.0.0":
+  version: 2.1.1
+  resolution: "yoctocolors@npm:2.1.1"
+  checksum: 10c0/85903f7fa96f1c70badee94789fade709f9d83dab2ec92753d612d84fcea6d34c772337a9f8914c6bed2f5fc03a428ac5d893e76fab636da5f1236ab725486d0
+  languageName: node
+  linkType: hard
+
 "zen-observable-ts@npm:^1.2.5":
   version: 1.2.5
   resolution: "zen-observable-ts@npm:1.2.5"
@@ -10679,3 +10844,20 @@ __metadata:
   checksum: 10c0/71cc2f2bbb537300c3f569e25693d37b3bc91f225cefce251a71c30bc6bb3e7f8e9420ca0eb57f2ac9e492b085b8dfa075fd1e8195c40b83c951dd59c6e4fbf8
   languageName: node
   linkType: hard
+
+"zx@npm:^8.2.4":
+  version: 8.2.4
+  resolution: "zx@npm:8.2.4"
+  dependencies:
+    "@types/fs-extra": "npm:>=11"
+    "@types/node": "npm:>=20"
+  dependenciesMeta:
+    "@types/fs-extra":
+      optional: true
+    "@types/node":
+      optional: true
+  bin:
+    zx: build/cli.js
+  checksum: 10c0/ae60ceef4eaf62695de0a24edab302efc770da10f2f4e79b7b8d50c2e7bee8c4b100e8722c6963a6f4badafe3f00d8d0fd50080c90745bf7bca90203c4aee59b
+  languageName: node
+  linkType: hard