Repository: adobe/genstudio-uix-examples
Pull request #28: GS-11347 Automate deployment 
Author: login: Ewocker
Created: 2025-03-25T19:49:50Z | Merged: 2025-03-26T23:39:28Z

<!--- Provide a general summary of your changes in the Title above -->

## Description
[GS-11347](https://jira.corp.adobe.com/browse/GS-11347)

Original PR closed for testing purpose. See https://github.com/adobe/genstudio-uix-examples/pull/26 for more.

This PR introduces an AIO App Template workflow to streamline deployment for GenStudio extension applications. It includes workflows for 
- GenStudio Create Validation
- GenStudio MLR Claims App

In future, on PR creation, developer change will be deployed to `stage` workspace in `Genstudio Engineering - 01` and `GenStudio GA PAT04`, and use that for testing purpose (ext=URL).
Once merge, developer changes will be deployed to `production` workspace in `Genstudio Engineering - 01` and `GenStudio GA PAT04`, and the change will automatically shown on the Genstudio UI extension.

### Github Environments:
Added scripts to automate creation of Github Environments due to the lack of functionality in UI, and the complication of copy pasting 10+ secrets from AIO project to Github UI...

Added 4 environments (See Settings > Environments)
- Genstudio Engineering 01 - genstudio-create-validation - workspace Stage
- Genstudio Engineering 01 - genstudio-create-validation - workspace Production
- Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage
- Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Production
- GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage
- GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Production
- GenStudio GA PAT04 - genstudio-create-validation - workspace Stage
- GenStudio GA PAT04 - genstudio-create-validation - workspace Production


### Current Behavior:

#### PR
- if changes in `genstudio-create-validation/**`
  - deploy `Genstudio Engineering 01 - genstudio-create-validation - workspace Stage`
  - deploy `GenStudio GA PAT04 - genstudio-create-validation - workspace Stage`
- if changes in `genstudio-mlr-claims-app/**`
  - deploy `Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage`
  - deploy `GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage`
 
A comment will be generated with details
![image](https://github.com/user-attachments/assets/83e23f66-a8ca-4088-a11d-6688edc62a87)


#### Merge
> Tested (See) https://github.com/adobe/genstudio-uix-examples/actions/runs/14067470061 and https://github.com/adobe/genstudio-uix-examples/actions/runs/14067470073
- if changes in `genstudio-create-validation/**`
  - deploy `Genstudio Engineering 01 - genstudio-create-validation - workspace Production`
  - deploy `GenStudio GA PAT04 - genstudio-create-validation - workspace Production`
- if changes in `genstudio-mlr-claims-app/**`
  - deploy `Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Production`
  - deploy `GenStudio GA PAT04  - genstudio-mlr-claims-app - workspace Production`


#### Changes Introduced
New AIO App Template (.github/workflows/aio-app-template.yml)

Step `Deploy` and `Build` not using aio-app action due to limitation of the action on mono repo structure.




<!--- Describe your changes in detail -->

## Related Issue

<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->

## Motivation and Context

<!--- Why is this change required? What problem does it solve? -->

## How Has This Been Tested?

<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->

## Screenshots (if appropriate):

## Types of changes

<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)

## Checklist:

<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->

- [x] I have signed the [Adobe Open Source CLA](https://opensource.adobe.com/cla.html).
- [x] My code follows the code style of this project.
- [x] My change requires a change to the documentation.
- [x] I have updated the documentation accordingly.
- [x] I have read the **CONTRIBUTING** document.
- [ ] I have added tests to cover my changes.
- [x] All new and existing tests passed.


Diff:
diff --git a/.github/workflows/aio-app-template.yml b/.github/workflows/aio-app-template.yml
new file mode 100644
index 00000000..a13e7c77
--- /dev/null
+++ b/.github/workflows/aio-app-template.yml
@@ -0,0 +1,139 @@
+name: AIO App Template
+
+on:
+  workflow_call:
+    inputs:
+      app:
+        required: true
+        type: string
+      environment:
+        required: true
+        type: string
+    # This should come from environment
+    secrets:
+      # I/O Management
+      CLIENTID:
+        required: true
+      CLIENTSECRET:
+        required: true
+      TECHNICALACCOUNTID:
+        required: true
+      TECHNICALACCOUNTEMAIL:
+        required: true
+      IMSORGID:
+        required: true
+      SCOPES:
+        required: true
+      # AIO Runtime
+      AIO_RUNTIME_NAMESPACE:
+        required: true
+      AIO_RUNTIME_AUTH:
+        required: true
+      AIO_PROJECT_ID:
+        required: true
+      AIO_PROJECT_NAME:
+        required: true
+      AIO_PROJECT_ORG_ID:
+        required: true
+      AIO_PROJECT_WORKSPACE_ID:
+        required: true
+      AIO_PROJECT_WORKSPACE_NAME:
+        required: true
+      AIO_PROJECT_WORKSPACE_DETAILS_SERVICES:
+        required: true
+
+jobs:
+  deploy:
+    name: Deploy
+    strategy:
+      matrix:
+        environment: ${{ fromJson(inputs.environment) }}
+    runs-on: ubuntu-latest
+    environment: ${{ matrix.environment }}
+    defaults:
+      run:
+        working-directory: ${{ inputs.app }}
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+      - name: Use Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: 20
+          cache: "npm"
+          cache-dependency-path: ${{ inputs.app }}/package-lock.json
+      - name: Install dependencies
+        run: npm ci
+      - name: Setup CLI
+        uses: adobe/aio-cli-setup-action@1.3.0
+        with:
+          version: 10.x.x
+      - name: Auth
+        uses: adobe/aio-apps-action@3.4.0
+        env:
+          AIO_CLI_ENV: ${{ vars.AIO_CLI_ENV }}
+        with:
+          command: oauth_sts
+          CLIENTID: ${{ secrets.CLIENTID }}
+          CLIENTSECRET: ${{ secrets.CLIENTSECRET }}
+          TECHNICALACCOUNTID: ${{ secrets.TECHNICALACCOUNTID }}
+          TECHNICALACCOUNTEMAIL: ${{ secrets.TECHNICALACCOUNTEMAIL }}
+          IMSORGID: ${{ secrets.IMSORGID }}
+          SCOPES: ${{ secrets.SCOPES }}
+      - name: Build Run
+        env:
+          AIO_CLI_ENV: ${{ vars.AIO_CLI_ENV }}
+          AIO_RUNTIME_NAMESPACE: ${{ secrets.AIO_RUNTIME_NAMESPACE }}
+        run: aio app build --force-build
+
+      - name: Deploy
+        env:
+          AIO_CLI_ENV: ${{ vars.AIO_CLI_ENV }}
+          AIO_RUNTIME_NAMESPACE: ${{ secrets.AIO_RUNTIME_NAMESPACE }}
+          AIO_RUNTIME_AUTH: ${{ secrets.AIO_RUNTIME_AUTH }}
+          AIO_PROJECT_ID: ${{ secrets.AIO_PROJECT_ID }}
+          AIO_PROJECT_NAME: ${{ secrets.AIO_PROJECT_NAME }}
+          AIO_PROJECT_ORG_ID: ${{ secrets.AIO_PROJECT_ORG_ID }}
+          AIO_PROJECT_WORKSPACE_ID: ${{ secrets.AIO_PROJECT_WORKSPACE_ID }}
+          AIO_PROJECT_WORKSPACE_NAME: ${{ secrets.AIO_PROJECT_WORKSPACE_NAME }}
+          AIO_PROJECT_WORKSPACE_DETAILS_SERVICES: ${{ secrets.AIO_PROJECT_WORKSPACE_DETAILS_SERVICES }}
+        id: deploy
+        run: |
+          output=$(aio app deploy --no-build --force-deploy)
+          echo "deploy_output<<EOF" >> $GITHUB_OUTPUT
+          echo "$output" >> $GITHUB_OUTPUT
+          echo "EOF" >> $GITHUB_OUTPUT
+      - name: Comment PR
+        if: github.event_name == 'pull_request'
+        uses: actions/github-script@v6
+        env:
+          AIO_CLI_ENV: ${{ vars.AIO_CLI_ENV }}
+        with:
+          script: |
+            const deployOutput = `${{ steps.deploy.outputs.deploy_output }}`;
+
+            // Determine if deployment was successful
+            const isSuccessful = deployOutput.includes('Successful deployment');
+
+            // Extract the runtime URL using regex
+            const urlMatch = deployOutput.match(/https:\/\/[^\/]+\.(?:runtime\.adobe\.io|adobeio-static\.net)/);
+            const runtimeUrl = urlMatch ? urlMatch[0] : 'URL not found';
+            // Create the comment with status and URL
+            const status = isSuccessful ? '✅' : '❌';
+            const testUrl = `https://experience${process.env.AIO_CLI_ENV === 'stage' ? '-stage' : ''}.adobe.com/?devMode=true&ext=${runtimeUrl}`;
+
+            const output = `### Deployment
+            **Status:** ${status}
+            **App:** ${{ inputs.app }}
+            **Environment:** ${{ matrix.environment }}
+            **Runtime URL:** ${runtimeUrl}
+            **Test URL:** ${testUrl}
+            **Action:** [View Action Run](${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID})
+            `;
+
+            github.rest.issues.createComment({
+              issue_number: context.issue.number,
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              body: output
+            })
diff --git a/.github/workflows/main-genstudio-create-validation.yaml b/.github/workflows/main-genstudio-create-validation.yaml
new file mode 100644
index 00000000..ab46a3ee
--- /dev/null
+++ b/.github/workflows/main-genstudio-create-validation.yaml
@@ -0,0 +1,17 @@
+name: Create Validation Main
+
+on:
+  push:
+    branches:
+      - main
+    paths:
+      - "genstudio-create-validation/**"
+  workflow_dispatch:
+
+jobs:
+  deploy:
+    uses: ./.github/workflows/aio-app-template.yml
+    with:
+      app: genstudio-create-validation
+      environment: '["Genstudio Engineering 01 - genstudio-create-validation - workspace Production", "GenStudio GA PAT04 - genstudio-create-validation - workspace Production"]'
+    secrets: inherit
diff --git a/.github/workflows/main-genstudio-mlr-claims-app.yaml b/.github/workflows/main-genstudio-mlr-claims-app.yaml
new file mode 100644
index 00000000..c9465696
--- /dev/null
+++ b/.github/workflows/main-genstudio-mlr-claims-app.yaml
@@ -0,0 +1,17 @@
+name: MLR Claims Main
+
+on:
+  push:
+    branches:
+      - main
+    paths:
+      - "genstudio-mlr-claims-app/**"
+  workflow_dispatch:
+
+jobs:
+  deploy:
+    uses: ./.github/workflows/aio-app-template.yml
+    with:
+      app: genstudio-mlr-claims-app
+      environment: '["Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Production", "GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Production"]'
+    secrets: inherit
diff --git a/.github/workflows/pr-genstudio-create-validation.yaml b/.github/workflows/pr-genstudio-create-validation.yaml
new file mode 100644
index 00000000..2667898f
--- /dev/null
+++ b/.github/workflows/pr-genstudio-create-validation.yaml
@@ -0,0 +1,15 @@
+name: Create Validation
+
+on:
+  pull_request:
+    paths:
+      - "genstudio-create-validation/**"
+  workflow_dispatch:
+
+jobs:
+  pr:
+    uses: ./.github/workflows/aio-app-template.yml
+    with:
+      app: genstudio-create-validation
+      environment: '["Genstudio Engineering 01 - genstudio-create-validation - workspace Stage", "GenStudio GA PAT04 - genstudio-create-validation - workspace Stage"]'
+    secrets: inherit
diff --git a/.github/workflows/pr-genstudio-mlr-claims-app.yaml b/.github/workflows/pr-genstudio-mlr-claims-app.yaml
new file mode 100644
index 00000000..d1585ee0
--- /dev/null
+++ b/.github/workflows/pr-genstudio-mlr-claims-app.yaml
@@ -0,0 +1,15 @@
+name: MLR Claims
+
+on:
+  pull_request:
+    paths:
+      - "genstudio-mlr-claims-app/**"
+  workflow_dispatch:
+
+jobs:
+  pr:
+    uses: ./.github/workflows/aio-app-template.yml
+    with:
+      app: genstudio-mlr-claims-app
+      environment: '["Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage", "GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage"]'
+    secrets: inherit
diff --git a/README.md b/README.md
index 1d50df30..52c65e31 100644
--- a/README.md
+++ b/README.md
@@ -12,28 +12,30 @@ Each folder contains a reference app working UI Extension integrated with GenStu
 
 In addition to git clone and/or forking this repo, you can generate an app from the [@adobe/aio-cli](https://github.com/adobe/aio-cli)
 
-
 ## Examples
+
 - We recommend starting with an example app and attaching your Adobe App Builder Project to it.
 - If you plan to develop both dialogs (Prompt Drawer and Right Panel) in the same App Builder Project, you can use the [GenStudio MLR Claims App](./genstudio-mlr-claims-app/) as a starting point.
 
 Here is the list of examples:
+
 - [GenStudio MLR Claims App](./genstudio-mlr-claims-app/)
-    - This is an example of a MLR Claims App that loads claims from a claims library and provides both dialogs:
-        - A dialog that opens in Prompt Drawer to add claims to the Generation Context
-        - A dialog that opens in the right panel of a GS Experience draft to validate claims in the experience
-    - This example was used in the 2025 Adobe Summit Session: A Developer’s Guide: Extending Adobe GenStudio for Performance Marketing
+  - This is an example of a MLR Claims App that loads claims from a claims library and provides both dialogs:
+    - A dialog that opens in Prompt Drawer to add claims to the Generation Context
+    - A dialog that opens in the right panel of a GS Experience draft to validate claims in the experience
+  - This example was used in the 2025 Adobe Summit Session: A Developer's Guide: Extending Adobe GenStudio for Performance Marketing
 - [GenStudio Create Validation App](./genstudio-create-validation/)
-    - This is an example of an App for validating claims in a GS Experience draft
-    - It includes 1 dialog that opens in the right panel of a GS Experience draft to validate claims in the experience
+  - This is an example of an App for validating claims in a GS Experience draft
+  - It includes 1 dialog that opens in the right panel of a GS Experience draft to validate claims in the experience
 - [GenStudio Create Context Add On](./genstudio-create-context-addon/)
-    - This is an example of a Context Add On that adds a new context to the Generation Context
-    - It includes 1 dialog that opens in Prompt Drawer to add claims to the Generation Context
+  - This is an example of a Context Add On that adds a new context to the Generation Context
+  - It includes 1 dialog that opens in Prompt Drawer to add claims to the Generation Context
 - [GenStudio IO Runtime App](./genstudio-io-runtime-app/)
-    - This is an example of an App for using the IO Runtime Action
-    - It includes the same code in MLR Claims App but uses the IO Runtime API to fetch claims from an external source
+  - This is an example of an App for using the IO Runtime Action
+  - It includes the same code in MLR Claims App but uses the IO Runtime API to fetch claims from an external source
 
 ## Usage
+
 1. Clone the repository
 2. Install dependencies
 3. Connect to your App Builder Project using the AIO CLI: `aio app use <path-to-downloaded-project-details>`
@@ -41,11 +43,34 @@ Here is the list of examples:
 5. Deploy the app: `aio app deploy`
 6. Go to the GenStudio workspace and see the extension point
 
-
 ## Deployment
-Each example has its own GitHub Actions deployment file that should be used as a starting point for individual extensions.
 
-The root-level GitHub deployment file `deploy_prod.yml` is intended as a custom, all-in-one approach for deploying examples with stored secrets. Each example that needs to be deployed at a workspace must have an associated secret. For example, `genstudio-create-validation` must have a secret named `genstudio_create_validation_sample` (with hyphens replaced by underscores) and the contents of the `.env` file as its value. Deployment will be triggered on merging PRs and push events on the main branch. Deployment will be skipped if this secret is unavailable.
+### Repository Workflow vs Individual App Workflows
+
+This repository contains two types of GitHub workflow files:
+
+1. **Individual App Workflows**:
+
+   - Located within each example app directory
+   - These are provided as templates that can be used by developers who fork/clone a single example for their own projects
+   - They are **not actually used** for deployments in this repository
+   - If you're building a single extension based on one of our examples, these workflows provide a good starting point for your CI/CD pipeline
+
+2. **Repository-level Custom Workflows**:
+   - Located in the `.github/workflows` directory at the repository root
+   - These include our reusable template workflow (`aio-app-template.yml`) and app-specific workflows that use it
+   - We use this custom approach because we need to deploy multiple apps to multiple environments simultaneously
+
+### GitHub Environment Secrets Management
+
+We provide a utility script in the `scripts` directory that helps manage GitHub environment secrets:
+
+- `scripts/create-env.js` - A script to create and update GitHub environment secrets from Adobe I/O configuration files
+- This is particularly useful for setting up CI/CD with individual app workflows
+- The script can extract secrets from Adobe I/O console.json files and securely create them in GitHub environments
+- For more information, see the [script documentation](./scripts/README.md)
+
+If you're implementing individual workflows for your own extension, this script can help you securely manage deployment secrets without manually entering them in the GitHub UI.
 
 ## Contributing
 
diff --git a/console-mlr-pat04.json b/console-mlr-pat04.json
new file mode 100644
index 00000000..13601e57
--- /dev/null
+++ b/console-mlr-pat04.json
@@ -0,0 +1,73 @@
+{
+  "project": {
+    "id": "4566206088345331861",
+    "name": "215PurpleMole",
+    "title": "GenStudioCreateUIXReferenceAppTypeScript",
+    "org": {
+      "id": "3399078",
+      "name": "GenStudio GA PAT04",
+      "ims_org_id": "431F1E0866F5EDAD0A495FFC@AdobeOrg"
+    },
+    "workspace": {
+      "id": "4566206088345351438",
+      "name": "Production",
+      "title": "Production",
+      "action_url": "https://3399078-215purplemole.adobeioruntime.net",
+      "app_url": "https://3399078-215purplemole.adobeio-static.net",
+      "details": {
+        "credentials": [
+          {
+            "id": "755125",
+            "name": "Credential in GenStudioCreateUIX - Production",
+            "integration_type": "oauth_server_to_server",
+            "oauth_server_to_server": {
+              "client_id": "2fe217d6b2ba4b0b9b5cb3b9c0623405",
+              "client_secrets": [
+                "p8e-cpfHn1XW14qLeck_lCI_jwwTNL63IGX2"
+              ],
+              "technical_account_email": "a0c2614a-db3b-4faa-a31e-c8a9de88d7f4@techacct.adobe.com",
+              "technical_account_id": "24E51E8367DDA9B50A495C6A@techacct.adobe.com",
+              "scopes": [
+                "AdobeID",
+                "openid",
+                "read_organizations",
+                "additional_info.projectedProductContext",
+                "additional_info.roles",
+                "adobeio_api",
+                "read_client_secret",
+                "manage_client_secrets"
+              ]
+            }
+          }
+        ],
+        "services": [
+          {
+            "code": "AdobeIOManagementAPISDK",
+            "name": "I/O Management API"
+          }
+        ],
+        "runtime": {
+          "namespaces": [
+            {
+              "name": "3399078-215purplemole",
+              "auth": "90c2cc02-fe23-46b0-a922-deb1985b6657:yISp8Kk3kRF7tbr5wHoe7f0ib2b2oQ40IPHtw4ByU0G7M1XqALt85L603Kq7eGAI"
+            }
+          ]
+        },
+        "events": {
+          "registrations": []
+        },
+        "mesh": {}
+      },
+      "endpoints": {
+        "dx_genstudio/genstudiopem/1": {
+          "view": [
+            {
+              "href": "https://3399078-215purplemole.adobeio-static.net/index.html"
+            }
+          ]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/genstudio-create-validation/src/genstudiopem/web-src/src/Constants.ts b/genstudio-create-validation/src/genstudiopem/web-src/src/Constants.ts
index e2db8513..b5055d17 100755
--- a/genstudio-create-validation/src/genstudiopem/web-src/src/Constants.ts
+++ b/genstudio-create-validation/src/genstudiopem/web-src/src/Constants.ts
@@ -9,6 +9,7 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
 OF ANY KIND, either express or implied. See the License for the specific language
 governing permissions and limitations under the License.
 */
-export const extensionId: string = 'genstudio-create-validation-app';
-export const extensionLabel: string = 'GenStudio UIX Create Validation App';
-export const ICON_DATA_URI: string = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTExIiBoZWlnaHQ9IjExMSIgdmlld0JveD0iMCAwIDExMSAxMTEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF85MV8zNDQ3NCkiPgo8cGF0aCBkPSJNOC44NDEgMEgxMDIuMTZDMTA0LjUwNSAwLjAwMDI2NTE5NyAxMDYuNzUzIDAuOTMxODQyIDEwOC40MTEgMi41ODk4MkMxMTAuMDY5IDQuMjQ3OCAxMTEgNi40OTYzOSAxMTEgOC44NDFWMTAyLjE2QzExMSAxMDQuNTA1IDExMC4wNjggMTA2Ljc1MyAxMDguNDEgMTA4LjQxMUMxMDYuNzUyIDExMC4wNjkgMTA0LjUwNCAxMTEgMTAyLjE1OSAxMTFIOC44NDFDNi40OTYyMiAxMTEgNC4yNDc0OCAxMTAuMDY5IDIuNTg5NDcgMTA4LjQxMUMwLjkzMTQ2IDEwNi43NTMgMCAxMDQuNTA0IDAgMTAyLjE1OUwwIDguODQxQzAgNi40OTYyMiAwLjkzMTQ2IDQuMjQ3NDggMi41ODk0NyAyLjU4OTQ3QzQuMjQ3NDggMC45MzE0NiA2LjQ5NjIyIDAgOC44NDEgMFoiIGZpbGw9IiNGRkVBMDAiLz4KPHBhdGggZD0iTTQ0LjU2MTIgNzguNDIzMUg1NC4xMjQyTDU5LjIzMTIgMzIuNTc4MUg1Mi45NDQyTDQ5LjIxMTIgNjguOTkyMUw0NS42MDkyIDMyLjU3ODFIMzguNjY3MkwzNS4xOTYyIDY4LjczMDFMMzEuMzMyMiAzMi41NzgxSDI0LjMyNDJMMjkuNDMyMiA3OC40MjMxSDM5LjMyNDJMNDEuOTQ0MiA1My45OTQxTDQ0LjU2MTIgNzguNDIzMVpNNzkuMjcyMiA3OC40MjMxSDg2LjY3MjJMNzYuNjUyMiA1My4wMTIxTDg2LjY3MzIgMzIuNTc4MUg3OS40NzMyTDcwLjAzODIgNTIuNTUzMVYzMi41NzgxSDYyLjgzODJWNzguNDIzMUg3MC4wMzgyVjY0LjM0MjFMNzIuMjY1MiA2MC4xNTAxTDc5LjI3MjIgNzguNDIzMVoiIGZpbGw9IiMyMDIwMjAiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF85MV8zNDQ3NCI+CjxyZWN0IHdpZHRoPSIxMTEiIGhlaWdodD0iMTExIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
\ No newline at end of file
+export const extensionId: string = "genstudio-create-validation-app";
+export const extensionLabel: string = "GenStudio UIX Create Validation App";
+export const ICON_DATA_URI: string =
+  "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTExIiBoZWlnaHQ9IjExMSIgdmlld0JveD0iMCAwIDExMSAxMTEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF85MV8zNDQ3NCkiPgo8cGF0aCBkPSJNOC44NDEgMEgxMDIuMTZDMTA0LjUwNSAwLjAwMDI2NTE5NyAxMDYuNzUzIDAuOTMxODQyIDEwOC40MTEgMi41ODk4MkMxMTAuMDY5IDQuMjQ3OCAxMTEgNi40OTYzOSAxMTEgOC44NDFWMTAyLjE2QzExMSAxMDQuNTA1IDExMC4wNjggMTA2Ljc1MyAxMDguNDEgMTA4LjQxMUMxMDYuNzUyIDExMC4wNjkgMTA0LjUwNCAxMTEgMTAyLjE1OSAxMTFIOC44NDFDNi40OTYyMiAxMTEgNC4yNDc0OCAxMTAuMDY5IDIuNTg5NDcgMTA4LjQxMUMwLjkzMTQ2IDEwNi43NTMgMCAxMDQuNTA0IDAgMTAyLjE1OUwwIDguODQxQzAgNi40OTYyMiAwLjkzMTQ2IDQuMjQ3NDggMi41ODk0NyAyLjU4OTQ3QzQuMjQ3NDggMC45MzE0NiA2LjQ5NjIyIDAgOC44NDEgMFoiIGZpbGw9IiNGRkVBMDAiLz4KPHBhdGggZD0iTTQ0LjU2MTIgNzguNDIzMUg1NC4xMjQyTDU5LjIzMTIgMzIuNTc4MUg1Mi45NDQyTDQ5LjIxMTIgNjguOTkyMUw0NS42MDkyIDMyLjU3ODFIMzguNjY3MkwzNS4xOTYyIDY4LjczMDFMMzEuMzMyMiAzMi41NzgxSDI0LjMyNDJMMjkuNDMyMiA3OC40MjMxSDM5LjMyNDJMNDEuOTQ0MiA1My45OTQxTDQ0LjU2MTIgNzguNDIzMVpNNzkuMjcyMiA3OC40MjMxSDg2LjY3MjJMNzYuNjUyMiA1My4wMTIxTDg2LjY3MzIgMzIuNTc4MUg3OS40NzMyTDcwLjAzODIgNTIuNTUzMVYzMi41NzgxSDYyLjgzODJWNzguNDIzMUg3MC4wMzgyVjY0LjM0MjFMNzIuMjY1MiA2MC4xNTAxTDc5LjI3MjIgNzguNDIzMVoiIGZpbGw9IiMyMDIwMjAiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF85MV8zNDQ3NCI+CjxyZWN0IHdpZHRoPSIxMTEiIGhlaWdodD0iMTExIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=";
diff --git a/genstudio-mlr-claims-app/src/genstudiopem/web-src/src/Constants.ts b/genstudio-mlr-claims-app/src/genstudiopem/web-src/src/Constants.ts
index 2e7b61b7..1405b4de 100644
--- a/genstudio-mlr-claims-app/src/genstudiopem/web-src/src/Constants.ts
+++ b/genstudio-mlr-claims-app/src/genstudiopem/web-src/src/Constants.ts
@@ -9,97 +9,106 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
 OF ANY KIND, either express or implied. See the License for the specific language
 governing permissions and limitations under the License.
 */
-import { Claim } from '@adobe/genstudio-uix-sdk'
-export const extensionId: string = 'genstudio-summit-mlr-app';
-export const extensionLabel: string = 'MLR for Celestix';
-export const ICON_DATA_URI: string = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTQiIGhlaWdodD0iNDciIHZpZXdCb3g9IjAgMCA1NCA0NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MS42MjA5IDYuOTk5NzZDMzcuMDAxMiA4LjA3Mzk2IDMxLjA2NzIgMTAuOTQ2NyAyNC45ODEgMTUuNDQ2M0MxOC44OTQ4IDE5Ljk0NTkgMTMuOTg1IDI1LjA5MDIgMTAuOTQ4NiAyOS42NzYyQzkuNDIzNTIgMzEuOTc5NiA4LjM0MjAzIDMzLjY4MDcgNy44ODU1OSAzNS4zMDk3QzcuNDk1MTMgMzYuNzAzMSA3LjEwNDY2IDM2LjgwOTcgNy4wMjAwOSAzOS43NDA0QzcuODAxMDIgNDMuNzQwNCAxMS42NDEyIDQ0LjQ1NiAxMi45ODQzIDQ0Ljc2NzRDMTQuMzE0MiA0NS4wNzU3IDE2LjE3MjggNDUuMDIwOSAxOC40OTMyIDQ0LjQ4MTNDMjMuMTEyOSA0My40MDcxIDI5LjA0NjkgNDAuNTM0NCAzNS4xMzMxIDM2LjAzNDhDNDEuMjE5MiAzMS41MzUyIDQ2LjEyOTEgMjYuMzkwOSA0OS4xNjU0IDIxLjgwNDlDNTAuNjkwNiAxOS41MDE0IDUxLjY1NjkgMTcuNDY3NyA1Mi4xMTMzIDE1LjgzODhDNTIuNzA0NCAxMy43NDA0IDUzLjA5NDkgMTAuMjQwNCA1MC43NTIxIDguMjQwMzlDNTAuNTgyMiA3Ljg2MzY1IDQ4LjU4MSA3LjA1MTc2IDQ3LjIzNzkgNi43NDAzOUM0NS45MDggNi40MzIxIDQzLjk0MTMgNi40NjAyIDQxLjYyMDkgNi45OTk3NlpNNDcuOTY0NCAwLjgwOTY2M0M1MC4wMzUzIDEuMjg5NzQgNTIuMDU2MiAyLjQ5NzUyIDUzLjE4MDMgNC45OTA1NEM1NC4zMDQzIDcuNDgzNTUgNTQuMTEwNyAxMC4zMjg2IDUzLjM5OTkgMTIuODY1MkM1Mi42ODQ1IDE1LjQxODEgNTEuMzQyNiAxOC4wNzY3IDQ5LjYxNTcgMjAuNjg1QzQ2LjE0OCAyNS45MjI2IDQwLjc3ODYgMzEuNDc5NyAzNC4zNTIxIDM2LjIzMDlDMjcuOTI1NyA0MC45ODIxIDIxLjQ4MjcgNDQuMTU3OSAxNi4yMDY2IDQ1LjM4NDhDMTMuNTc5MiA0NS45OTU3IDExLjExMDIgNDYuMTU0NiA5LjAyNTk0IDQ1LjY3MTRDNi45NTUwMiA0NS4xOTEzIDQuOTM0MTMgNDMuOTgzNiAzLjgxMDEgNDEuNDkwNUMyLjY4NjA4IDM4Ljk5NzUgMi44Nzk3IDM2LjE1MjUgMy41OTA0OCAzMy42MTU5QzQuMzA1ODMgMzEuMDYzIDUuNjQ3NzUgMjguNDA0NCA3LjM3NDY4IDI1Ljc5NjFDMTAuODQyNCAyMC41NTg1IDE2LjIxMTcgMTUuMDAxMyAyMi42MzgyIDEwLjI1MDJDMjkuMDY0NyA1LjQ5ODk3IDM1LjUwNzcgMi4zMjMxMyA0MC43ODM3IDEuMDk2M0M0My40MTEyIDAuNDg1MzQgNDUuODgwMiAwLjMyNjUwNiA0Ny45NjQ0IDAuODA5NjYzWiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDMuMjE3NSAzMC4xNzYyQzQwLjE4MTIgMjUuNTkwMiAzNS4yNzEzIDIwLjQ0NTkgMjkuMTg1MSAxNS45NDYzQzIzLjA5OSAxMS40NDY3IDE3LjE2NSA4LjU3Mzk2IDEyLjU0NTMgNy40OTk3NkMxMC4yMjQ4IDYuOTYwMiA4LjUzMzY0IDYuNjExNCA3LjIwMzc3IDYuOTE5NjlDNi4wNjYxMyA3LjE4MzQxIDUuNzk4ODUgNi44MDM2NiAzLjc3NDUxIDguMTc1MjRDMS40NTk3NiAxMS4wNDEzIDIuODk1ODcgMTUuNjU3NyAzLjM1Njg3IDE3LjMwMjlDMy44MTMzMSAxOC45MzE4IDQuNzc5NjQgMjAuOTY1NSA2LjMwNDc1IDIzLjI2OUM5LjM0MTA5IDI3Ljg1NSAxNC4yNTA5IDMyLjk5OTMgMjAuMzM3MSAzNy40OTg5QzI2LjQyMzMgNDEuOTk4NSAzMi4zNTczIDQ0Ljg3MTIgMzYuOTc3IDQ1Ljk0NTRDMzkuMjk3NCA0Ni40ODUgNDEuMTU2IDQ2LjUzOTggNDIuNDg1OSA0Ni4yMzE1QzQ0LjIwMDUgNDUuODM3NyA0Ni43NjI4IDQ0LjUyMDcgNDYuOTQ0MSA0MC45MjI3QzQ3LjExMzkgNDAuNTQ1OSA0Ni42NjI0IDM3LjkyMDggNDYuMjAxNCAzNi4yNzU2QzQ1Ljc0NSAzNC42NDY2IDQ0Ljc0MjYgMzIuNDc5NiA0My4yMTc1IDMwLjE3NjJaTTUwLjU3NTcgMzQuMTE1OUM1MS4yODY0IDM2LjY1MjUgNTEuNDgwMSAzOS40OTc1IDUwLjM1NiA0MS45OTA1QzQ5LjIzMiA0NC40ODM2IDQ3LjIxMTEgNDUuNjkxMyA0NS4xNDAyIDQ2LjE3MTRDNDMuMDU2IDQ2LjY1NDYgNDAuNTg3IDQ2LjQ5NTcgMzcuOTU5NSA0NS44ODQ4QzMyLjY4MzUgNDQuNjU3OSAyNi4yNDA1IDQxLjQ4MjEgMTkuODE0IDM2LjczMDlDMTMuMzg3NSAzMS45Nzk3IDguMDE4MiAyNi40MjI2IDQuNTUwNDYgMjEuMTg1QzIuODIzNTMgMTguNTc2NyAxLjQ4MTYxIDE1LjkxODEgMC43NjYyNjUgMTMuMzY1MkMwLjA1NTQ4MzMgMTAuODI4NiAtMC4xMzgxMzkgNy45ODM1NSAwLjk4NTg4NSA1LjQ5MDUzQzIuMTA5OTEgMi45OTc1MiA0LjEzMDggMS43ODk3NCA2LjIwMTczIDEuMzA5NjZDOC4yODU5NCAwLjgyNjUwNiAxMC43NTQ5IDAuOTg1MzQxIDEzLjM4MjQgMS41OTYzQzE4LjY1ODUgMi44MjMxMyAyNS4xMDE0IDUuOTk4OTcgMzEuNTI3OSAxMC43NTAyQzM3Ljk1NDQgMTUuNTAxMyA0My4zMjM3IDIxLjA1ODUgNDYuNzkxNSAyNi4yOTYxQzQ4LjUxODQgMjguOTA0NCA0OS44NjAzIDMxLjU2MyA1MC41NzU3IDM0LjExNTlaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMjQ5MV8xMTQ2OSkiLz4KPHBhdGggZD0iTTM0IDI4QzM0IDMxLjg2NiAzMC44NjYgMzUgMjcgMzVDMjMuMTM0IDM1IDIwIDMxLjg2NiAyMCAyOEMyMCAyNC4xMzQgMjMuMTM0IDIxIDI3IDIxQzMwLjg2NiAyMSAzNCAyNC4xMzQgMzQgMjhaIiBmaWxsPSJ1cmwoI3BhaW50Ml9yYWRpYWxfMjQ5MV8xMTQ2OSkiLz4KPHBhdGggZD0iTTE0IDEzLjVDMTQgMTUuOTg1MyAxMS45ODUzIDE4IDkuNSAxOEM3LjAxNDcyIDE4IDUgMTUuOTg1MyA1IDEzLjVDNSAxMS4wMTQ3IDcuMDE0NzIgOSA5LjUgOUMxMS45ODUzIDkgMTQgMTEuMDE0NyAxNCAxMy41WiIgZmlsbD0idXJsKCNwYWludDNfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik00OSAxMy41QzQ5IDE1Ljk4NTMgNDYuOTg1MyAxOCA0NC41IDE4QzQyLjAxNDcgMTggNDAgMTUuOTg1MyA0MCAxMy41QzQwIDExLjAxNDcgNDIuMDE0NyA5IDQ0LjUgOUM0Ni45ODUzIDkgNDkgMTEuMDE0NyA0OSAxMy41WiIgZmlsbD0idXJsKCNwYWludDRfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik00MyAzOS41QzQzIDQwLjg4MDcgNDEuODgwNyA0MiA0MC41IDQyQzM5LjExOTMgNDIgMzggNDAuODgwNyAzOCAzOS41QzM4IDM4LjExOTMgMzkuMTE5MyAzNyA0MC41IDM3QzQxLjg4MDcgMzcgNDMgMzguMTE5MyA0MyAzOS41WiIgZmlsbD0idXJsKCNwYWludDVfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik0xNSAzOS41QzE1IDQwLjg4MDcgMTMuODgwNyA0MiAxMi41IDQyQzExLjExOTMgNDIgMTAgNDAuODgwNyAxMCAzOS41QzEwIDM4LjExOTMgMTEuMTE5MyAzNyAxMi41IDM3QzEzLjg4MDcgMzcgMTUgMzguMTE5MyAxNSAzOS41WiIgZmlsbD0idXJsKCNwYWludDZfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjQ5MV8xMTQ2OSIgeDE9IjUxLjIzNjMiIHkxPSI2LjU1OTU0IiB4Mj0iMS4wMjY1OSIgeTI9IjI5LjE5NzUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8c3RvcCBvZmZzZXQ9IjAuNSIgc3RvcC1jb2xvcj0iIzAwQ0NGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDczRkYiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzI0OTFfMTE0NjkiIHgxPSI0OC4zMjI2IiB5MT0iNDAuNjE5MiIgeDI9Ii0xLjg4NzA3IiB5Mj0iMTcuOTgxMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjxzdG9wIG9mZnNldD0iMC41IiBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwNzNGRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50Ml9yYWRpYWxfMjQ5MV8xMTQ2OSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyNyAyOCkgcm90YXRlKDkwKSBzY2FsZSg3KSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMENDRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8yNDkxXzExNDY5IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDkuNSAxMy41KSByb3RhdGUoOTApIHNjYWxlKDQuNSkiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50NF9yYWRpYWxfMjQ5MV8xMTQ2OSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0NC41IDEzLjUpIHJvdGF0ZSg5MCkgc2NhbGUoNC41KSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMENDRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ1X3JhZGlhbF8yNDkxXzExNDY5IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDQwLjUgMzkuNSkgcm90YXRlKDkwKSBzY2FsZSgyLjUpIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzAwQ0NGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDFBRkYiLz4KPC9yYWRpYWxHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDZfcmFkaWFsXzI0OTFfMTE0NjkiIGN4PSIwIiBjeT0iMCIgcj0iMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNSAzOS41KSByb3RhdGUoOTApIHNjYWxlKDIuNSkiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=";
+import { Claim } from "@adobe/genstudio-uix-sdk";
+export const extensionId: string = "genstudio-summit-mlr-app";
+export const extensionLabel: string = "MLR for Celestix";
+export const ICON_DATA_URI: string =
+  "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTQiIGhlaWdodD0iNDciIHZpZXdCb3g9IjAgMCA1NCA0NyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MS42MjA5IDYuOTk5NzZDMzcuMDAxMiA4LjA3Mzk2IDMxLjA2NzIgMTAuOTQ2NyAyNC45ODEgMTUuNDQ2M0MxOC44OTQ4IDE5Ljk0NTkgMTMuOTg1IDI1LjA5MDIgMTAuOTQ4NiAyOS42NzYyQzkuNDIzNTIgMzEuOTc5NiA4LjM0MjAzIDMzLjY4MDcgNy44ODU1OSAzNS4zMDk3QzcuNDk1MTMgMzYuNzAzMSA3LjEwNDY2IDM2LjgwOTcgNy4wMjAwOSAzOS43NDA0QzcuODAxMDIgNDMuNzQwNCAxMS42NDEyIDQ0LjQ1NiAxMi45ODQzIDQ0Ljc2NzRDMTQuMzE0MiA0NS4wNzU3IDE2LjE3MjggNDUuMDIwOSAxOC40OTMyIDQ0LjQ4MTNDMjMuMTEyOSA0My40MDcxIDI5LjA0NjkgNDAuNTM0NCAzNS4xMzMxIDM2LjAzNDhDNDEuMjE5MiAzMS41MzUyIDQ2LjEyOTEgMjYuMzkwOSA0OS4xNjU0IDIxLjgwNDlDNTAuNjkwNiAxOS41MDE0IDUxLjY1NjkgMTcuNDY3NyA1Mi4xMTMzIDE1LjgzODhDNTIuNzA0NCAxMy43NDA0IDUzLjA5NDkgMTAuMjQwNCA1MC43NTIxIDguMjQwMzlDNTAuNTgyMiA3Ljg2MzY1IDQ4LjU4MSA3LjA1MTc2IDQ3LjIzNzkgNi43NDAzOUM0NS45MDggNi40MzIxIDQzLjk0MTMgNi40NjAyIDQxLjYyMDkgNi45OTk3NlpNNDcuOTY0NCAwLjgwOTY2M0M1MC4wMzUzIDEuMjg5NzQgNTIuMDU2MiAyLjQ5NzUyIDUzLjE4MDMgNC45OTA1NEM1NC4zMDQzIDcuNDgzNTUgNTQuMTEwNyAxMC4zMjg2IDUzLjM5OTkgMTIuODY1MkM1Mi42ODQ1IDE1LjQxODEgNTEuMzQyNiAxOC4wNzY3IDQ5LjYxNTcgMjAuNjg1QzQ2LjE0OCAyNS45MjI2IDQwLjc3ODYgMzEuNDc5NyAzNC4zNTIxIDM2LjIzMDlDMjcuOTI1NyA0MC45ODIxIDIxLjQ4MjcgNDQuMTU3OSAxNi4yMDY2IDQ1LjM4NDhDMTMuNTc5MiA0NS45OTU3IDExLjExMDIgNDYuMTU0NiA5LjAyNTk0IDQ1LjY3MTRDNi45NTUwMiA0NS4xOTEzIDQuOTM0MTMgNDMuOTgzNiAzLjgxMDEgNDEuNDkwNUMyLjY4NjA4IDM4Ljk5NzUgMi44Nzk3IDM2LjE1MjUgMy41OTA0OCAzMy42MTU5QzQuMzA1ODMgMzEuMDYzIDUuNjQ3NzUgMjguNDA0NCA3LjM3NDY4IDI1Ljc5NjFDMTAuODQyNCAyMC41NTg1IDE2LjIxMTcgMTUuMDAxMyAyMi42MzgyIDEwLjI1MDJDMjkuMDY0NyA1LjQ5ODk3IDM1LjUwNzcgMi4zMjMxMyA0MC43ODM3IDEuMDk2M0M0My40MTEyIDAuNDg1MzQgNDUuODgwMiAwLjMyNjUwNiA0Ny45NjQ0IDAuODA5NjYzWiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDMuMjE3NSAzMC4xNzYyQzQwLjE4MTIgMjUuNTkwMiAzNS4yNzEzIDIwLjQ0NTkgMjkuMTg1MSAxNS45NDYzQzIzLjA5OSAxMS40NDY3IDE3LjE2NSA4LjU3Mzk2IDEyLjU0NTMgNy40OTk3NkMxMC4yMjQ4IDYuOTYwMiA4LjUzMzY0IDYuNjExNCA3LjIwMzc3IDYuOTE5NjlDNi4wNjYxMyA3LjE4MzQxIDUuNzk4ODUgNi44MDM2NiAzLjc3NDUxIDguMTc1MjRDMS40NTk3NiAxMS4wNDEzIDIuODk1ODcgMTUuNjU3NyAzLjM1Njg3IDE3LjMwMjlDMy44MTMzMSAxOC45MzE4IDQuNzc5NjQgMjAuOTY1NSA2LjMwNDc1IDIzLjI2OUM5LjM0MTA5IDI3Ljg1NSAxNC4yNTA5IDMyLjk5OTMgMjAuMzM3MSAzNy40OTg5QzI2LjQyMzMgNDEuOTk4NSAzMi4zNTczIDQ0Ljg3MTIgMzYuOTc3IDQ1Ljk0NTRDMzkuMjk3NCA0Ni40ODUgNDEuMTU2IDQ2LjUzOTggNDIuNDg1OSA0Ni4yMzE1QzQ0LjIwMDUgNDUuODM3NyA0Ni43NjI4IDQ0LjUyMDcgNDYuOTQ0MSA0MC45MjI3QzQ3LjExMzkgNDAuNTQ1OSA0Ni42NjI0IDM3LjkyMDggNDYuMjAxNCAzNi4yNzU2QzQ1Ljc0NSAzNC42NDY2IDQ0Ljc0MjYgMzIuNDc5NiA0My4yMTc1IDMwLjE3NjJaTTUwLjU3NTcgMzQuMTE1OUM1MS4yODY0IDM2LjY1MjUgNTEuNDgwMSAzOS40OTc1IDUwLjM1NiA0MS45OTA1QzQ5LjIzMiA0NC40ODM2IDQ3LjIxMTEgNDUuNjkxMyA0NS4xNDAyIDQ2LjE3MTRDNDMuMDU2IDQ2LjY1NDYgNDAuNTg3IDQ2LjQ5NTcgMzcuOTU5NSA0NS44ODQ4QzMyLjY4MzUgNDQuNjU3OSAyNi4yNDA1IDQxLjQ4MjEgMTkuODE0IDM2LjczMDlDMTMuMzg3NSAzMS45Nzk3IDguMDE4MiAyNi40MjI2IDQuNTUwNDYgMjEuMTg1QzIuODIzNTMgMTguNTc2NyAxLjQ4MTYxIDE1LjkxODEgMC43NjYyNjUgMTMuMzY1MkMwLjA1NTQ4MzMgMTAuODI4NiAtMC4xMzgxMzkgNy45ODM1NSAwLjk4NTg4NSA1LjQ5MDUzQzIuMTA5OTEgMi45OTc1MiA0LjEzMDggMS43ODk3NCA2LjIwMTczIDEuMzA5NjZDOC4yODU5NCAwLjgyNjUwNiAxMC43NTQ5IDAuOTg1MzQxIDEzLjM4MjQgMS41OTYzQzE4LjY1ODUgMi44MjMxMyAyNS4xMDE0IDUuOTk4OTcgMzEuNTI3OSAxMC43NTAyQzM3Ljk1NDQgMTUuNTAxMyA0My4zMjM3IDIxLjA1ODUgNDYuNzkxNSAyNi4yOTYxQzQ4LjUxODQgMjguOTA0NCA0OS44NjAzIDMxLjU2MyA1MC41NzU3IDM0LjExNTlaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMjQ5MV8xMTQ2OSkiLz4KPHBhdGggZD0iTTM0IDI4QzM0IDMxLjg2NiAzMC44NjYgMzUgMjcgMzVDMjMuMTM0IDM1IDIwIDMxLjg2NiAyMCAyOEMyMCAyNC4xMzQgMjMuMTM0IDIxIDI3IDIxQzMwLjg2NiAyMSAzNCAyNC4xMzQgMzQgMjhaIiBmaWxsPSJ1cmwoI3BhaW50Ml9yYWRpYWxfMjQ5MV8xMTQ2OSkiLz4KPHBhdGggZD0iTTE0IDEzLjVDMTQgMTUuOTg1MyAxMS45ODUzIDE4IDkuNSAxOEM3LjAxNDcyIDE4IDUgMTUuOTg1MyA1IDEzLjVDNSAxMS4wMTQ3IDcuMDE0NzIgOSA5LjUgOUMxMS45ODUzIDkgMTQgMTEuMDE0NyAxNCAxMy41WiIgZmlsbD0idXJsKCNwYWludDNfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik00OSAxMy41QzQ5IDE1Ljk4NTMgNDYuOTg1MyAxOCA0NC41IDE4QzQyLjAxNDcgMTggNDAgMTUuOTg1MyA0MCAxMy41QzQwIDExLjAxNDcgNDIuMDE0NyA5IDQ0LjUgOUM0Ni45ODUzIDkgNDkgMTEuMDE0NyA0OSAxMy41WiIgZmlsbD0idXJsKCNwYWludDRfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik00MyAzOS41QzQzIDQwLjg4MDcgNDEuODgwNyA0MiA0MC41IDQyQzM5LjExOTMgNDIgMzggNDAuODgwNyAzOCAzOS41QzM4IDM4LjExOTMgMzkuMTE5MyAzNyA0MC41IDM3QzQxLjg4MDcgMzcgNDMgMzguMTE5MyA0MyAzOS41WiIgZmlsbD0idXJsKCNwYWludDVfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxwYXRoIGQ9Ik0xNSAzOS41QzE1IDQwLjg4MDcgMTMuODgwNyA0MiAxMi41IDQyQzExLjExOTMgNDIgMTAgNDAuODgwNyAxMCAzOS41QzEwIDM4LjExOTMgMTEuMTE5MyAzNyAxMi41IDM3QzEzLjg4MDcgMzcgMTUgMzguMTE5MyAxNSAzOS41WiIgZmlsbD0idXJsKCNwYWludDZfcmFkaWFsXzI0OTFfMTE0NjkpIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjQ5MV8xMTQ2OSIgeDE9IjUxLjIzNjMiIHkxPSI2LjU1OTU0IiB4Mj0iMS4wMjY1OSIgeTI9IjI5LjE5NzUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8c3RvcCBvZmZzZXQ9IjAuNSIgc3RvcC1jb2xvcj0iIzAwQ0NGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDczRkYiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzI0OTFfMTE0NjkiIHgxPSI0OC4zMjI2IiB5MT0iNDAuNjE5MiIgeDI9Ii0xLjg4NzA3IiB5Mj0iMTcuOTgxMiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjxzdG9wIG9mZnNldD0iMC41IiBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwNzNGRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50Ml9yYWRpYWxfMjQ5MV8xMTQ2OSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyNyAyOCkgcm90YXRlKDkwKSBzY2FsZSg3KSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMENDRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8yNDkxXzExNDY5IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDkuNSAxMy41KSByb3RhdGUoOTApIHNjYWxlKDQuNSkiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8cmFkaWFsR3JhZGllbnQgaWQ9InBhaW50NF9yYWRpYWxfMjQ5MV8xMTQ2OSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSg0NC41IDEzLjUpIHJvdGF0ZSg5MCkgc2NhbGUoNC41KSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMENDRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxQUZGIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ1X3JhZGlhbF8yNDkxXzExNDY5IiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDQwLjUgMzkuNSkgcm90YXRlKDkwKSBzY2FsZSgyLjUpIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzAwQ0NGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDFBRkYiLz4KPC9yYWRpYWxHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDZfcmFkaWFsXzI0OTFfMTE0NjkiIGN4PSIwIiBjeT0iMCIgcj0iMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNSAzOS41KSByb3RhdGUoOTApIHNjYWxlKDIuNSkiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMDBDQ0ZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzAwMUFGRiIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=";
 interface ClaimsLibrary {
   id: string;
   name: string;
   claims: Claim[];
 }
-  
+
 export const TEST_CLAIMS: ClaimsLibrary[] = [
-    {
-      id: "efficacy-claims",
-      name: "Efficacy Claims",
-      claims: [
-        {
-          id: "claim1",
-          description: "Clinically proven to reduce joint inflammation by up to 50%."
-        },
-        {
-          id: "claim2",
-          description: "Alleviates chronic pain associated with Chronexa within 2 weeks."
-        },
-        {
-          id: "claim3",
-          description: "Demonstrates a 60% improvement in joint mobility over 6 months."
-        }
-      ]
-    },
-    {
-      id: "safety-claims",
-      name: "Safety and Tolerability Claims",
-      claims: [
-        {
-          id: "claim4",
-          description: "Demonstrated a favorable safety profile with over 95% adherence in trials."
-        },
-        {
-          id: "claim5",
-          description: "No significant interactions with common NSAIDs and corticosteroids."
-        },
-        {
-          id: "claim6",
-          description: "Approved for patients aged 16 to 80 years."
-        }
-      ]
-    },
-    {
-      id: "dosage-claims",
-      name: "Dosage and Administration Claims",
-      claims: [
-        {
-          id: "claim7",
-          description: "Taken once daily for consistent symptom control."
-        },
-        {
-          id: "claim8",
-          description: "Available in 100 mg and 200 mg tablet forms."
-        },
-        {
-          id: "claim9",
-          description: "Can be taken with or without food for patient convenience."
-        }
-      ]
-    },
-    {
-      id: "side-effects-claims",
-      name: "Side Effects Claims",
-      claims: [
-        {
-          id: "claim10",
-          description: "Most common side effect is mild fatigue, reported in fewer than 8% of patients."
-        },
-        {
-          id: "claim11",
-          description: "No significant impact on cardiovascular health."
-        },
-        {
-          id: "claim12",
-          description: "Mild headaches reported in less than 3% of patients, typically resolving within a week."
-        }
-      ]
-    }
-  ];
+  {
+    id: "efficacy-claims",
+    name: "Efficacy Claims",
+    claims: [
+      {
+        id: "claim1",
+        description:
+          "Clinically proven to reduce joint inflammation by up to 50%.",
+      },
+      {
+        id: "claim2",
+        description:
+          "Alleviates chronic pain associated with Chronexa within 2 weeks.",
+      },
+      {
+        id: "claim3",
+        description:
+          "Demonstrates a 60% improvement in joint mobility over 6 months.",
+      },
+    ],
+  },
+  {
+    id: "safety-claims",
+    name: "Safety and Tolerability Claims",
+    claims: [
+      {
+        id: "claim4",
+        description:
+          "Demonstrated a favorable safety profile with over 95% adherence in trials.",
+      },
+      {
+        id: "claim5",
+        description:
+          "No significant interactions with common NSAIDs and corticosteroids.",
+      },
+      {
+        id: "claim6",
+        description: "Approved for patients aged 16 to 80 years.",
+      },
+    ],
+  },
+  {
+    id: "dosage-claims",
+    name: "Dosage and Administration Claims",
+    claims: [
+      {
+        id: "claim7",
+        description: "Taken once daily for consistent symptom control.",
+      },
+      {
+        id: "claim8",
+        description: "Available in 100 mg and 200 mg tablet forms.",
+      },
+      {
+        id: "claim9",
+        description:
+          "Can be taken with or without food for patient convenience.",
+      },
+    ],
+  },
+  {
+    id: "side-effects-claims",
+    name: "Side Effects Claims",
+    claims: [
+      {
+        id: "claim10",
+        description:
+          "Most common side effect is mild fatigue, reported in fewer than 8% of patients.",
+      },
+      {
+        id: "claim11",
+        description: "No significant impact on cardiovascular health.",
+      },
+      {
+        id: "claim12",
+        description:
+          "Mild headaches reported in less than 3% of patients, typically resolving within a week.",
+      },
+    ],
+  },
+];
 
 export const VIOLATION_STATUS = {
-  Valid: 'valid',
-  Violated: 'violated',
-  N_A: 'n/a'
+  Valid: "valid",
+  Violated: "violated",
+  N_A: "n/a",
 } as const;
 
-export const VIOLATION_PREFIX = 'Violated: ';
-export const CLAIM_VIOLATION_PREFIX = 'Violated claim: ';
-export const POD_PREFIX = 'pod';
\ No newline at end of file
+export const VIOLATION_PREFIX = "Violated: ";
+export const CLAIM_VIOLATION_PREFIX = "Violated claim: ";
+export const POD_PREFIX = "pod";
diff --git a/scripts/create-gh-env/README.md b/scripts/create-gh-env/README.md
new file mode 100644
index 00000000..36677312
--- /dev/null
+++ b/scripts/create-gh-env/README.md
@@ -0,0 +1,80 @@
+# Create Github Environment
+
+> This script is specifically designed to work with GitHub Actions in the adobe/genstudio-uix-examples repository
+
+A Node.js script to create and manage GitHub Environment Secrets from Adobe I/O console configuration files.
+
+## Overview
+
+This script automates the process of creating GitHub Environment Secrets from an Adobe I/O configuration file. It extracts key-value pairs from the console.json file and creates corresponding secrets in a GitHub environment.
+
+## Usage
+
+### Basic Usage
+
+Run the script with default settings:
+
+```bash
+export GITHUB_TOKEN=your_github_token
+node scripts/create-gh-env --env "Env Name" --file "/path to console.json"
+```
+
+To get the console.json file: (or manually download from developer console)
+
+```
+aio login --force
+aio console ws download --orgId xxx@AdobeOrg --projectId xxx --workspaceId xxx
+```
+
+To switch between workspace:
+
+```
+aio app use -w <Production|Stage>
+```
+
+# Stage AIO
+
+When working with an AIO stage instance, ensure you add the environment variable `AIO_CLI_ENV=stage` to your GitHub environment configuration
+
+### Command Line Arguments
+
+The script supports the following command line arguments:
+
+| Argument          | Description                   | Default                     |
+| ----------------- | ----------------------------- | --------------------------- |
+| `--env <name>`    | GitHub environment name       | "Test Environment"          |
+| `--file <path>`   | Path to the secrets JSON file | "./console.json"            |
+| `--token <token>` | GitHub token                  | `GITHUB_TOKEN` env variable |
+| `--owner <owner>` | Repository owner              | "adobe"                     |
+| `--repo <repo>`   | Repository name               | "genstudio-uix-examples"    |
+| `--help`          | Show help message             | -                           |
+
+## Secret Mapping
+
+The script maps the following Adobe I/O console properties to GitHub secrets:
+
+| GitHub Secret                          | Adobe I/O Console Property                                                              |
+| -------------------------------------- | --------------------------------------------------------------------------------------- |
+| AIO_PROJECT_ID                         | project.id                                                                              |
+| AIO_PROJECT_NAME                       | project.name                                                                            |
+| AIO_PROJECT_ORG_ID                     | project.org.id                                                                          |
+| AIO_PROJECT_WORKSPACE_DETAILS_SERVICES | project.workspace.details.services                                                      |
+| AIO_PROJECT_WORKSPACE_ID               | project.workspace.id                                                                    |
+| AIO_PROJECT_WORKSPACE_NAME             | project.workspace.name                                                                  |
+| AIO_RUNTIME_AUTH                       | project.workspace.details.runtime.namespaces[0].auth                                    |
+| AIO_RUNTIME_NAMESPACE                  | project.workspace.details.runtime.namespaces[0].name                                    |
+| CLIENTID                               | project.workspace.details.credentials[0].oauth_server_to_server.client_id               |
+| CLIENTSECRET                           | project.workspace.details.credentials[0].oauth_server_to_server.client_secrets[0]       |
+| IMSORGID                               | project.org.ims_org_id                                                                  |
+| SCOPES                                 | project.workspace.details.credentials[0].oauth_server_to_server.scopes                  |
+| TECHNICALACCOUNTEMAIL                  | project.workspace.details.credentials[0].oauth_server_to_server.technical_account_email |
+| TECHNICALACCOUNTID                     | project.workspace.details.credentials[0].oauth_server_to_server.technical_account_id    |
+
+## How It Works
+
+1. The script reads and parses the Adobe I/O configuration file
+2. It extracts secrets according to the mapping defined above
+3. It creates or updates a GitHub environment
+4. It retrieves the GitHub environment's public key
+5. It encrypts each secret value using sodium for security
+6. It creates or updates each secret in the GitHub environment
diff --git a/scripts/create-gh-env/index.js b/scripts/create-gh-env/index.js
new file mode 100644
index 00000000..251cfd35
--- /dev/null
+++ b/scripts/create-gh-env/index.js
@@ -0,0 +1,360 @@
+#!/usr/bin/env node
+
+/**
+ * GitHub Environment Secrets Manager
+ *
+ * This script creates or updates GitHub environment secrets from a configuration file.
+ * It reads secret values from a JSON file and creates them in a GitHub environment.
+ */
+
+import { Octokit } from "@octokit/core";
+import sodium from "libsodium-wrappers";
+import fs from "fs";
+import path from "path";
+import process from "process";
+
+// Default configuration
+const DEFAULT_CONFIG = {
+  owner: "adobe",
+  repo: "genstudio-uix-examples",
+  environment_name: "Test Environment",
+  secret_file: "./console.json",
+  github_token: process.env.GITHUB_TOKEN,
+};
+
+// Parse command line arguments
+function parseArgs() {
+  const args = process.argv.slice(2);
+  const config = { ...DEFAULT_CONFIG };
+
+  for (let i = 0; i < args.length; i++) {
+    if (args[i] === "--env" && i + 1 < args.length) {
+      config.environment_name = args[++i];
+    } else if (args[i] === "--file" && i + 1 < args.length) {
+      config.secret_file = args[++i];
+    } else if (args[i] === "--token" && i + 1 < args.length) {
+      config.github_token = args[++i];
+    } else if (args[i] === "--owner" && i + 1 < args.length) {
+      config.owner = args[++i];
+    } else if (args[i] === "--repo" && i + 1 < args.length) {
+      config.repo = args[++i];
+    } else if (args[i] === "--help") {
+      printHelp();
+      process.exit(0);
+    }
+  }
+
+  // Resolve relative file path
+  if (!path.isAbsolute(config.secret_file)) {
+    config.secret_file = path.resolve(process.cwd(), config.secret_file);
+  }
+
+  return config;
+}
+
+// Print help information
+function printHelp() {
+  console.log(`
+GitHub Environment Secrets Manager
+
+Usage: node create-env.js [options]
+
+Options:
+  --env <name>       Name of the GitHub environment (default: "Test Environment")
+  --file <path>      Path to the secrets JSON file (default: "./console.json")
+  --token <token>    GitHub token (default: uses GITHUB_TOKEN env variable)
+  --owner <owner>    Repository owner (default: "adobe")
+  --repo <repo>      Repository name (default: "genstudio-uix-examples")
+  --help             Show this help message
+  `);
+}
+
+// Secret mapping functions to extract values from JSON
+const secretMapping = {
+  AIO_PROJECT_ID: (f) => f.project.id,
+  AIO_PROJECT_NAME: (f) => f.project.name,
+  AIO_PROJECT_ORG_ID: (f) => f.project.org.id,
+  AIO_PROJECT_WORKSPACE_DETAILS_SERVICES: (f) =>
+    JSON.stringify(f.project.workspace.details.services),
+  AIO_PROJECT_WORKSPACE_ID: (f) => f.project.workspace.id,
+  AIO_PROJECT_WORKSPACE_NAME: (f) => f.project.workspace.name,
+  AIO_RUNTIME_AUTH: (f) =>
+    f.project.workspace.details.runtime.namespaces[0].auth,
+  AIO_RUNTIME_NAMESPACE: (f) =>
+    f.project.workspace.details.runtime.namespaces[0].name,
+  CLIENTID: (f) =>
+    f.project.workspace.details.credentials[0].oauth_server_to_server.client_id,
+  CLIENTSECRET: (f) =>
+    f.project.workspace.details.credentials[0].oauth_server_to_server
+      .client_secrets[0],
+  IMSORGID: (f) => f.project.org.ims_org_id,
+  SCOPES: (f) =>
+    f.project.workspace.details.credentials[0].oauth_server_to_server.scopes.join(
+      ","
+    ),
+  TECHNICALACCOUNTEMAIL: (f) =>
+    f.project.workspace.details.credentials[0].oauth_server_to_server
+      .technical_account_email,
+  TECHNICALACCOUNTID: (f) =>
+    f.project.workspace.details.credentials[0].oauth_server_to_server
+      .technical_account_id,
+};
+
+/**
+ * Load and validate secret file
+ * @param {string} filePath - Path to the secret file
+ * @returns {Object} - Parsed JSON object
+ */
+function loadSecretFile(filePath) {
+  try {
+    if (!fs.existsSync(filePath)) {
+      throw new Error(`Secret file not found: ${filePath}`);
+    }
+
+    const fileContent = fs.readFileSync(filePath, "utf8");
+    return JSON.parse(fileContent);
+  } catch (error) {
+    console.error(`Error loading secret file: ${error.message}`);
+    process.exit(1);
+  }
+}
+
+/**
+ * Extract secrets from JSON using mappings
+ * @param {Object} json - Parsed JSON object
+ * @returns {Array} - Array of {key, value} pairs
+ */
+function extractSecrets(json) {
+  const secretKeys = Object.keys(secretMapping);
+
+  return secretKeys
+    .map((key) => {
+      try {
+        const value = secretMapping[key](json);
+        return { key, value };
+      } catch (error) {
+        console.warn(
+          `Warning: Could not extract secret ${key}: ${error.message}`
+        );
+        return { key, value: null };
+      }
+    })
+    .filter((item) => item.value !== null);
+}
+
+/**
+ * Display secrets in a formatted table
+ * @param {Array} secrets - Array of {key, value} pairs
+ */
+function displaySecrets(secrets) {
+  console.log("\n=== Environment Secrets ===\n");
+
+  const maxKeyLength = Math.max(...secrets.map(({ key }) => key.length));
+
+  secrets.forEach(({ key, value }) => {
+    const paddedKey = key.padEnd(maxKeyLength, " ");
+    const displayValue =
+      typeof value === "string" && value.length > 100
+        ? value.substring(0, 97) + "..."
+        : value;
+    console.log(`${paddedKey}  |  ${displayValue}`);
+  });
+
+  console.log("\n===========================\n");
+}
+
+/**
+ * Create or update a GitHub environment
+ * @param {Object} octokit - Octokit instance
+ * @param {Object} config - Configuration object
+ * @returns {Promise<void>}
+ */
+async function createEnvironment(octokit, { owner, repo, environment_name }) {
+  console.log(
+    `Creating/updating environment "${environment_name}" for ${owner}/${repo}...`
+  );
+
+  try {
+    await octokit.request(
+      "PUT /repos/{owner}/{repo}/environments/{environment_name}",
+      {
+        owner,
+        repo,
+        environment_name,
+        headers: { "X-GitHub-Api-Version": "2022-11-28" },
+      }
+    );
+
+    console.log(
+      `Environment "${environment_name}" created/updated successfully.`
+    );
+  } catch (error) {
+    throw new Error(`Failed to create environment: ${error.message}`);
+  }
+}
+
+/**
+ * Get GitHub environment public key
+ * @param {Object} octokit - Octokit instance
+ * @param {Object} config - Configuration object
+ * @returns {Promise<Object>} - Public key data
+ */
+async function getPublicKey(octokit, { owner, repo, environment_name }) {
+  console.log("Retrieving public key for secret encryption...");
+
+  try {
+    const response = await octokit.request(
+      "GET /repos/{owner}/{repo}/environments/{environment_name}/secrets/public-key",
+      {
+        owner,
+        repo,
+        environment_name,
+        headers: { "X-GitHub-Api-Version": "2022-11-28" },
+      }
+    );
+
+    console.log("Public key retrieved successfully.");
+    return {
+      key: response.data.key,
+      keyId: response.data.key_id,
+    };
+  } catch (error) {
+    throw new Error(`Failed to get public key: ${error.message}`);
+  }
+}
+
+/**
+ * Encrypt a secret using libsodium with the GitHub public key
+ * @param {string} secretValue - The secret value to encrypt
+ * @param {string} publicKey - The GitHub-provided public key
+ * @returns {Promise<string>} - The encrypted secret value as base64
+ */
+async function encryptSecret(secretValue, publicKey) {
+  // Wait for sodium to initialize
+  await sodium.ready;
+
+  // Convert the secret and public key to Uint8Array
+  const binKey = sodium.from_base64(publicKey, sodium.base64_variants.ORIGINAL);
+  const binSecret = sodium.from_string(secretValue);
+
+  // Encrypt the secret using the public key
+  const encryptedBin = sodium.crypto_box_seal(binSecret, binKey);
+
+  // Convert the encrypted Uint8Array to base64
+  return sodium.to_base64(encryptedBin, sodium.base64_variants.ORIGINAL);
+}
+
+/**
+ * Create or update a secret in the GitHub environment
+ * @param {Object} octokit - Octokit instance
+ * @param {Object} params - Parameters for creating the secret
+ * @returns {Promise<void>}
+ */
+async function createSecret(octokit, params) {
+  const { owner, repo, environment_name, secretName, encryptedValue, keyId } =
+    params;
+
+  try {
+    await octokit.request(
+      "PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}",
+      {
+        owner,
+        repo,
+        environment_name,
+        secret_name: secretName,
+        encrypted_value: encryptedValue,
+        key_id: keyId,
+        headers: { "X-GitHub-Api-Version": "2022-11-28" },
+      }
+    );
+
+    console.log(`Secret "${secretName}" set successfully.`);
+  } catch (error) {
+    throw new Error(
+      `Failed to create secret "${secretName}": ${error.message}`
+    );
+  }
+}
+
+/**
+ * Main function that orchestrates the entire process
+ */
+async function main() {
+  try {
+    // Parse command line arguments
+    const config = parseArgs();
+
+    // Check if GitHub token is provided
+    if (!config.github_token) {
+      console.error(
+        "Error: GitHub token is required. Use --token or set GITHUB_TOKEN environment variable."
+      );
+      process.exit(1);
+    }
+
+    // Initialize Octokit with GitHub token
+    const octokit = new Octokit({
+      auth: config.github_token,
+    });
+
+    // Load secrets from file
+    const secretJson = loadSecretFile(config.secret_file);
+
+    // Extract secrets using mappings
+    const secrets = extractSecrets(secretJson);
+
+    // Display extracted secrets
+    displaySecrets(secrets);
+
+    // Create or update the GitHub environment
+    await createEnvironment(octokit, config);
+
+    // Get the public key for secret encryption
+    const { key, keyId } = await getPublicKey(octokit, config);
+
+    // Create all secrets
+    console.log(
+      `Creating/updating ${secrets.length} secrets in environment "${config.environment_name}"...`
+    );
+
+    let successCount = 0;
+
+    // Create each secret
+    for (const { key: secretName, value: secretValue } of secrets) {
+      try {
+        // Encrypt the secret value
+        const encryptedValue = await encryptSecret(secretValue, key);
+
+        // Create or update the secret
+        await createSecret(octokit, {
+          owner: config.owner,
+          repo: config.repo,
+          environment_name: config.environment_name,
+          secretName,
+          encryptedValue,
+          keyId,
+        });
+
+        successCount++;
+      } catch (error) {
+        console.error(
+          `Error creating secret "${secretName}": ${error.message}`
+        );
+      }
+    }
+
+    console.log(
+      `\nCompleted: ${successCount} of ${secrets.length} secrets created/updated successfully.`
+    );
+  } catch (error) {
+    console.error("Error:", error.message);
+    if (error.response) {
+      console.error("Response status:", error.response.status);
+      console.error("Response data:", error.response.data);
+    }
+    process.exit(1);
+  }
+}
+
+// Execute the main function
+main();
diff --git a/scripts/create-gh-env/package-lock.json b/scripts/create-gh-env/package-lock.json
new file mode 100644
index 00000000..56917bed
--- /dev/null
+++ b/scripts/create-gh-env/package-lock.json
@@ -0,0 +1,156 @@
+{
+  "name": "scripts",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "scripts",
+      "version": "1.0.0",
+      "license": "ISC",
+      "dependencies": {
+        "@octokit/core": "^6.1.4",
+        "dotenv": "^16.4.7",
+        "libsodium-wrappers": "^0.7.15"
+      }
+    },
+    "node_modules/@octokit/auth-token": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
+      "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/core": {
+      "version": "6.1.4",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz",
+      "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==",
+      "dependencies": {
+        "@octokit/auth-token": "^5.0.0",
+        "@octokit/graphql": "^8.1.2",
+        "@octokit/request": "^9.2.1",
+        "@octokit/request-error": "^6.1.7",
+        "@octokit/types": "^13.6.2",
+        "before-after-hook": "^3.0.2",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/endpoint": {
+      "version": "10.1.3",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz",
+      "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==",
+      "dependencies": {
+        "@octokit/types": "^13.6.2",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/graphql": {
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz",
+      "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==",
+      "dependencies": {
+        "@octokit/request": "^9.2.2",
+        "@octokit/types": "^13.8.0",
+        "universal-user-agent": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/openapi-types": {
+      "version": "24.2.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
+      "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="
+    },
+    "node_modules/@octokit/request": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz",
+      "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==",
+      "dependencies": {
+        "@octokit/endpoint": "^10.1.3",
+        "@octokit/request-error": "^6.1.7",
+        "@octokit/types": "^13.6.2",
+        "fast-content-type-parse": "^2.0.0",
+        "universal-user-agent": "^7.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/request-error": {
+      "version": "6.1.7",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz",
+      "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==",
+      "dependencies": {
+        "@octokit/types": "^13.6.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@octokit/types": {
+      "version": "13.10.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
+      "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
+      "dependencies": {
+        "@octokit/openapi-types": "^24.2.0"
+      }
+    },
+    "node_modules/before-after-hook": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+      "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
+    },
+    "node_modules/dotenv": {
+      "version": "16.4.7",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
+      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://dotenvx.com"
+      }
+    },
+    "node_modules/fast-content-type-parse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
+      "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ]
+    },
+    "node_modules/libsodium": {
+      "version": "0.7.15",
+      "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.15.tgz",
+      "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw=="
+    },
+    "node_modules/libsodium-wrappers": {
+      "version": "0.7.15",
+      "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz",
+      "integrity": "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==",
+      "dependencies": {
+        "libsodium": "^0.7.15"
+      }
+    },
+    "node_modules/universal-user-agent": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+      "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+    }
+  }
+}
diff --git a/scripts/create-gh-env/package.json b/scripts/create-gh-env/package.json
new file mode 100644
index 00000000..88da6416
--- /dev/null
+++ b/scripts/create-gh-env/package.json
@@ -0,0 +1,16 @@
+{
+  "name": "scripts",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "type": "module",
+  "dependencies": {
+    "@octokit/core": "^6.1.4",
+    "dotenv": "^16.4.7",
+    "libsodium-wrappers": "^0.7.15"
+  }
+}


Reviews:
user: login: jdelbick
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T21:46:31Z
user: login: jdelbick
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T21:47:05Z
user: login: jdelbick
body: one small change then LGTM
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-26T21:47:37Z

Review comments:
diff_hunk: @@ -0,0 +1,17 @@
+{
+  "name": "scripts",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
path: scripts/create-gh-env/package.json
user: login: jdelbick
body: this repo has an MIT license, can we use that here
created_at: 2025-03-26T21:46:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,17 @@
+{
+  "name": "scripts",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
path: scripts/create-gh-env/package.json
user: login: jdelbick
body: or just remove the license
created_at: 2025-03-26T21:47:05Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-25T19:52:58Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** Genstudio Engineering 01 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068804508)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:52:59Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** GenStudio GA PAT04 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://3399078-gsmlrclaimssummit.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-gsmlrclaimssummit.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068804508)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:53:05Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068804517)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:53:29Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068817138)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:53:48Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068817138)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:53:55Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** GenStudio GA PAT04 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://3399078-gsmlrclaimssummit.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-gsmlrclaimssummit.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068817103)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T19:53:58Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** Genstudio Engineering 01 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068817103)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T20:29:14Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068804517)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T20:30:34Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14068804517)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T23:17:52Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** GenStudio GA PAT04 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-gsmlrclaimssummit-stage.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14095287922)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T23:18:01Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-mlr-claims-app
**Environment:** Genstudio Engineering 01 - genstudio-mlr-claims-app - workspace Stage
**Runtime URL:** https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-gscomplianceappjd-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14095287922)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T23:20:06Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** Genstudio Engineering 01 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14095287910)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T23:37:52Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** GenStudio GA PAT04 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://3399078-215purplemole-stage.adobeio-static.net
**Test URL:** https://experience.adobe.com/?devMode=true&ext=https://3399078-215purplemole-stage.adobeio-static.net
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14095287910)

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-26T23:37:53Z
body: ### Deployment
**Status:** ✅
**App:** genstudio-create-validation
**Environment:** Genstudio Engineering 01 - genstudio-create-validation - workspace Stage
**Runtime URL:** https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Test URL:** https://experience-stage.adobe.com/?devMode=true&ext=https://development-257324-386harlequinskunk-stage.dev.runtime.adobe.io
**Action:** [View Action Run](https://github.com/adobe/genstudio-uix-examples/actions/runs/14095287910)

author_association: NONE