diff --git a/.github/actions/create-pull-request/action.yml b/.github/actions/create-pull-request/action.yml
index 6a6b6dbf03..fbbc910bc5 100644
--- a/.github/actions/create-pull-request/action.yml
+++ b/.github/actions/create-pull-request/action.yml
@@ -39,18 +39,22 @@ runs:
if: "inputs.dry-run != 'true'"
env:
GH_TOKEN: '${{ inputs.github-token }}'
+ INPUTS_BRANCH_NAME: ${{ inputs.branch-name }}
+ INPUTS_PR_TITLE: ${{ inputs.pr-title }}
+ INPUTS_PR_BODY: ${{ inputs.pr-body }}
+ INPUTS_BASE_BRANCH: ${{ inputs.base-branch }}
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |
set -e
- if ! git ls-remote --exit-code --heads origin "${{ inputs.branch-name }}"; then
- echo "::error::Branch '${{ inputs.branch-name }}' does not exist on the remote repository."
+ if ! git ls-remote --exit-code --heads origin "${INPUTS_BRANCH_NAME}"; then
+ echo "::error::Branch '${INPUTS_BRANCH_NAME}' does not exist on the remote repository."
exit 1
fi
PR_URL=$(gh pr create \
- --title "${{ inputs.pr-title }}" \
- --body "${{ inputs.pr-body }}" \
- --base "${{ inputs.base-branch }}" \
- --head "${{ inputs.branch-name }}" \
+ --title "${INPUTS_PR_TITLE}" \
+ --body "${INPUTS_PR_BODY}" \
+ --base "${INPUTS_BASE_BRANCH}" \
+ --head "${INPUTS_BRANCH_NAME}" \
--fill)
gh pr merge "$PR_URL" --auto
diff --git a/.github/actions/npm-auth-token/action.yml b/.github/actions/npm-auth-token/action.yml
index 94249d6c51..1c19da5971 100644
--- a/.github/actions/npm-auth-token/action.yml
+++ b/.github/actions/npm-auth-token/action.yml
@@ -30,16 +30,22 @@ runs:
id: 'npm_auth_token'
shell: 'bash'
run: |
- AUTH_TOKEN="${{ inputs.github-token }}"
- PACKAGE_NAME="${{ inputs.package-name }}"
+ AUTH_TOKEN="${INPUTS_GITHUB_TOKEN}"
+ PACKAGE_NAME="${INPUTS_PACKAGE_NAME}"
PRIVATE_REPO="@google-gemini/"
if [[ "$PACKAGE_NAME" == "$PRIVATE_REPO"* ]]; then
- AUTH_TOKEN="${{ inputs.github-token }}"
+ AUTH_TOKEN="${INPUTS_GITHUB_TOKEN}"
elif [[ "$PACKAGE_NAME" == "@google/gemini-cli" ]]; then
- AUTH_TOKEN="${{ inputs.wombat-token-cli }}"
+ AUTH_TOKEN="${INPUTS_WOMBAT_TOKEN_CLI}"
elif [[ "$PACKAGE_NAME" == "@google/gemini-cli-core" ]]; then
- AUTH_TOKEN="${{ inputs.wombat-token-core }}"
+ AUTH_TOKEN="${INPUTS_WOMBAT_TOKEN_CORE}"
elif [[ "$PACKAGE_NAME" == "@google/gemini-cli-a2a-server" ]]; then
- AUTH_TOKEN="${{ inputs.wombat-token-a2a-server }}"
+ AUTH_TOKEN="${INPUTS_WOMBAT_TOKEN_A2A_SERVER}"
fi
echo "auth-token=$AUTH_TOKEN" >> $GITHUB_OUTPUT
+ env:
+ INPUTS_GITHUB_TOKEN: ${{ inputs.github-token }}
+ INPUTS_PACKAGE_NAME: ${{ inputs.package-name }}
+ INPUTS_WOMBAT_TOKEN_CLI: ${{ inputs.wombat-token-cli }}
+ INPUTS_WOMBAT_TOKEN_CORE: ${{ inputs.wombat-token-core }}
+ INPUTS_WOMBAT_TOKEN_A2A_SERVER: ${{ inputs.wombat-token-a2a-server }}
diff --git a/.github/actions/publish-release/action.yml b/.github/actions/publish-release/action.yml
index 5c74524ddb..35e65493c9 100644
--- a/.github/actions/publish-release/action.yml
+++ b/.github/actions/publish-release/action.yml
@@ -93,15 +93,19 @@ runs:
id: 'release_branch'
shell: 'bash'
run: |
- BRANCH_NAME="release/${{ inputs.release-tag }}"
+ BRANCH_NAME="release/${INPUTS_RELEASE_TAG}"
git switch -c "${BRANCH_NAME}"
echo "BRANCH_NAME=${BRANCH_NAME}" >> "${GITHUB_OUTPUT}"
+ env:
+ INPUTS_RELEASE_TAG: ${{ inputs.release-tag }}
- name: 'β¬οΈ Update package versions'
working-directory: '${{ inputs.working-directory }}'
shell: 'bash'
run: |
- npm run release:version "${{ inputs.release-version }}"
+ npm run release:version "${INPUTS_RELEASE_VERSION}"
+ env:
+ INPUTS_RELEASE_VERSION: ${{ inputs.release-version }}
- name: 'πΎ Commit and Conditionally Push package versions'
working-directory: '${{ inputs.working-directory }}'
@@ -163,23 +167,30 @@ runs:
working-directory: '${{ inputs.working-directory }}'
env:
NODE_AUTH_TOKEN: '${{ steps.core-token.outputs.auth-token }}'
+ INPUTS_DRY_RUN: ${{ inputs.dry-run }}
+ INPUTS_CORE_PACKAGE_NAME: ${{ inputs.core-package-name }}
shell: 'bash'
run: |
npm publish \
- --dry-run="${{ inputs.dry-run }}" \
- --workspace="${{ inputs.core-package-name }}" \
+ --dry-run="${INPUTS_DRY_RUN}" \
+ --workspace="${INPUTS_CORE_PACKAGE_NAME}" \
--no-tag
- npm dist-tag rm ${{ inputs.core-package-name }} false --silent
+ npm dist-tag rm ${INPUTS_CORE_PACKAGE_NAME} false --silent
- name: 'π Install latest core package'
working-directory: '${{ inputs.working-directory }}'
if: "${{ inputs.dry-run != 'true' }}"
shell: 'bash'
run: |
- npm install "${{ inputs.core-package-name }}@${{ inputs.release-version }}" \
- --workspace="${{ inputs.cli-package-name }}" \
- --workspace="${{ inputs.a2a-package-name }}" \
+ npm install "${INPUTS_CORE_PACKAGE_NAME}@${INPUTS_RELEASE_VERSION}" \
+ --workspace="${INPUTS_CLI_PACKAGE_NAME}" \
+ --workspace="${INPUTS_A2A_PACKAGE_NAME}" \
--save-exact
+ env:
+ INPUTS_CORE_PACKAGE_NAME: ${{ inputs.core-package-name }}
+ INPUTS_RELEASE_VERSION: ${{ inputs.release-version }}
+ INPUTS_CLI_PACKAGE_NAME: ${{ inputs.cli-package-name }}
+ INPUTS_A2A_PACKAGE_NAME: ${{ inputs.a2a-package-name }}
- name: 'Get CLI Token'
uses: './.github/actions/npm-auth-token'
@@ -195,13 +206,15 @@ runs:
working-directory: '${{ inputs.working-directory }}'
env:
NODE_AUTH_TOKEN: '${{ steps.cli-token.outputs.auth-token }}'
+ INPUTS_DRY_RUN: ${{ inputs.dry-run }}
+ INPUTS_CLI_PACKAGE_NAME: ${{ inputs.cli-package-name }}
shell: 'bash'
run: |
npm publish \
- --dry-run="${{ inputs.dry-run }}" \
- --workspace="${{ inputs.cli-package-name }}" \
+ --dry-run="${INPUTS_DRY_RUN}" \
+ --workspace="${INPUTS_CLI_PACKAGE_NAME}" \
--no-tag
- npm dist-tag rm ${{ inputs.cli-package-name }} false --silent
+ npm dist-tag rm ${INPUTS_CLI_PACKAGE_NAME} false --silent
- name: 'Get a2a-server Token'
uses: './.github/actions/npm-auth-token'
@@ -217,14 +230,16 @@ runs:
working-directory: '${{ inputs.working-directory }}'
env:
NODE_AUTH_TOKEN: '${{ steps.a2a-token.outputs.auth-token }}'
+ INPUTS_DRY_RUN: ${{ inputs.dry-run }}
+ INPUTS_A2A_PACKAGE_NAME: ${{ inputs.a2a-package-name }}
shell: 'bash'
# Tag staging for initial release
run: |
npm publish \
- --dry-run="${{ inputs.dry-run }}" \
- --workspace="${{ inputs.a2a-package-name }}" \
+ --dry-run="${INPUTS_DRY_RUN}" \
+ --workspace="${INPUTS_A2A_PACKAGE_NAME}" \
--no-tag
- npm dist-tag rm ${{ inputs.a2a-package-name }} false --silent
+ npm dist-tag rm ${INPUTS_A2A_PACKAGE_NAME} false --silent
- name: 'π¬ Verify NPM release by version'
uses: './.github/actions/verify-release'
@@ -258,13 +273,16 @@ runs:
if: "${{ inputs.dry-run != 'true' && inputs.skip-github-release != 'true' && inputs.npm-tag != 'dev' && inputs.npm-registry-url != 'https://npm.pkg.github.com/' }}"
env:
GITHUB_TOKEN: '${{ inputs.github-release-token || inputs.github-token }}'
+ INPUTS_RELEASE_TAG: ${{ inputs.release-tag }}
+ STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME: ${{ steps.release_branch.outputs.BRANCH_NAME }}
+ INPUTS_PREVIOUS_TAG: ${{ inputs.previous-tag }}
shell: 'bash'
run: |
- gh release create "${{ inputs.release-tag }}" \
+ gh release create "${INPUTS_RELEASE_TAG}" \
bundle/gemini.js \
- --target "${{ steps.release_branch.outputs.BRANCH_NAME }}" \
- --title "Release ${{ inputs.release-tag }}" \
- --notes-start-tag "${{ inputs.previous-tag }}" \
+ --target "${STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME}" \
+ --title "Release ${INPUTS_RELEASE_TAG}" \
+ --notes-start-tag "${INPUTS_PREVIOUS_TAG}" \
--generate-notes \
${{ inputs.npm-tag != 'latest' && '--prerelease' || '' }}
@@ -274,5 +292,8 @@ runs:
continue-on-error: true
shell: 'bash'
run: |
- echo "Cleaning up release branch ${{ steps.release_branch.outputs.BRANCH_NAME }}..."
- git push origin --delete "${{ steps.release_branch.outputs.BRANCH_NAME }}"
+ echo "Cleaning up release branch ${STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME}..."
+ git push origin --delete "${STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME}"
+
+ env:
+ STEPS_RELEASE_BRANCH_OUTPUTS_BRANCH_NAME: ${{ steps.release_branch.outputs.BRANCH_NAME }}
diff --git a/.github/actions/push-docker/action.yml b/.github/actions/push-docker/action.yml
index 5016d76821..67f03b3cca 100644
--- a/.github/actions/push-docker/action.yml
+++ b/.github/actions/push-docker/action.yml
@@ -52,8 +52,10 @@ runs:
id: 'branch_name'
shell: 'bash'
run: |
- REF_NAME="${{ inputs.ref-name }}"
+ REF_NAME="${INPUTS_REF_NAME}"
echo "name=${REF_NAME%/merge}" >> $GITHUB_OUTPUT
+ env:
+ INPUTS_REF_NAME: ${{ inputs.ref-name }}
- name: 'Build and Push the Docker Image'
uses: 'docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83' # ratchet:docker/build-push-action@v6
with:
diff --git a/.github/actions/push-sandbox/action.yml b/.github/actions/push-sandbox/action.yml
index db75ce10cd..22edf5d838 100644
--- a/.github/actions/push-sandbox/action.yml
+++ b/.github/actions/push-sandbox/action.yml
@@ -56,8 +56,8 @@ runs:
id: 'image_tag'
shell: 'bash'
run: |-
- SHELL_TAG_NAME="${{ inputs.github-ref-name }}"
- FINAL_TAG="${{ inputs.github-sha }}"
+ SHELL_TAG_NAME="${INPUTS_GITHUB_REF_NAME}"
+ FINAL_TAG="${INPUTS_GITHUB_SHA}"
if [[ "$SHELL_TAG_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then
echo "Release detected."
FINAL_TAG="${SHELL_TAG_NAME#v}"
@@ -66,15 +66,19 @@ runs:
fi
echo "Determined image tag: $FINAL_TAG"
echo "FINAL_TAG=$FINAL_TAG" >> $GITHUB_OUTPUT
+ env:
+ INPUTS_GITHUB_REF_NAME: ${{ inputs.github-ref-name }}
+ INPUTS_GITHUB_SHA: ${{ inputs.github-sha }}
- name: 'build'
id: 'docker_build'
shell: 'bash'
env:
GEMINI_SANDBOX_IMAGE_TAG: '${{ steps.image_tag.outputs.FINAL_TAG }}'
GEMINI_SANDBOX: 'docker'
+ STEPS_IMAGE_TAG_OUTPUTS_FINAL_TAG: ${{ steps.image_tag.outputs.FINAL_TAG }}
run: |-
npm run build:sandbox -- \
- --image google/gemini-cli-sandbox:${{ steps.image_tag.outputs.FINAL_TAG }} \
+ --image google/gemini-cli-sandbox:${STEPS_IMAGE_TAG_OUTPUTS_FINAL_TAG} \
--output-file final_image_uri.txt
echo "uri=$(cat final_image_uri.txt)" >> $GITHUB_OUTPUT
- name: 'verify'
@@ -89,7 +93,9 @@ runs:
shell: 'bash'
if: "${{ inputs.dry-run != 'true' }}"
run: |-
- docker push "${{ steps.docker_build.outputs.uri }}"
+ docker push "${STEPS_DOCKER_BUILD_OUTPUTS_URI}"
+ env:
+ STEPS_DOCKER_BUILD_OUTPUTS_URI: ${{ steps.docker_build.outputs.uri }}
- name: 'Create issue on failure'
if: |-
${{ failure() }}
diff --git a/.github/actions/setup-npmrc/action.yml b/.github/actions/setup-npmrc/action.yml
index fba0c14712..5dddfe48f3 100644
--- a/.github/actions/setup-npmrc/action.yml
+++ b/.github/actions/setup-npmrc/action.yml
@@ -18,5 +18,7 @@ runs:
shell: 'bash'
run: |-
echo ""@google-gemini:registry=https://npm.pkg.github.com"" > ~/.npmrc
- echo ""//npm.pkg.github.com/:_authToken=${{ inputs.github-token }}"" >> ~/.npmrc
+ echo ""//npm.pkg.github.com/:_authToken=${INPUTS_GITHUB_TOKEN}"" >> ~/.npmrc
echo ""@google:registry=https://wombat-dressing-room.appspot.com"" >> ~/.npmrc
+ env:
+ INPUTS_GITHUB_TOKEN: ${{ inputs.github-token }}
diff --git a/.github/actions/tag-npm-release/action.yml b/.github/actions/tag-npm-release/action.yml
index 7bcafcb6b2..8088035598 100644
--- a/.github/actions/tag-npm-release/action.yml
+++ b/.github/actions/tag-npm-release/action.yml
@@ -71,10 +71,13 @@ runs:
${{ inputs.dry-run != 'true' }}
env:
NODE_AUTH_TOKEN: '${{ steps.core-token.outputs.auth-token }}'
+ INPUTS_CORE_PACKAGE_NAME: ${{ inputs.core-package-name }}
+ INPUTS_VERSION: ${{ inputs.version }}
+ INPUTS_CHANNEL: ${{ inputs.channel }}
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |
- npm dist-tag add ${{ inputs.core-package-name }}@${{ inputs.version }} ${{ inputs.channel }}
+ npm dist-tag add ${INPUTS_CORE_PACKAGE_NAME}@${INPUTS_VERSION} ${INPUTS_CHANNEL}
- name: 'Get cli Token'
uses: './.github/actions/npm-auth-token'
@@ -91,10 +94,13 @@ runs:
${{ inputs.dry-run != 'true' }}
env:
NODE_AUTH_TOKEN: '${{ steps.cli-token.outputs.auth-token }}'
+ INPUTS_CLI_PACKAGE_NAME: ${{ inputs.cli-package-name }}
+ INPUTS_VERSION: ${{ inputs.version }}
+ INPUTS_CHANNEL: ${{ inputs.channel }}
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |
- npm dist-tag add ${{ inputs.cli-package-name }}@${{ inputs.version }} ${{ inputs.channel }}
+ npm dist-tag add ${INPUTS_CLI_PACKAGE_NAME}@${INPUTS_VERSION} ${INPUTS_CHANNEL}
- name: 'Get a2a Token'
uses: './.github/actions/npm-auth-token'
@@ -111,10 +117,13 @@ runs:
${{ inputs.dry-run == 'false' }}
env:
NODE_AUTH_TOKEN: '${{ steps.a2a-token.outputs.auth-token }}'
+ INPUTS_A2A_PACKAGE_NAME: ${{ inputs.a2a-package-name }}
+ INPUTS_VERSION: ${{ inputs.version }}
+ INPUTS_CHANNEL: ${{ inputs.channel }}
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |
- npm dist-tag add ${{ inputs.a2a-package-name }}@${{ inputs.version }} ${{ inputs.channel }}
+ npm dist-tag add ${INPUTS_A2A_PACKAGE_NAME}@${INPUTS_VERSION} ${INPUTS_CHANNEL}
- name: 'Log dry run'
if: |-
@@ -122,4 +131,15 @@ runs:
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |
- echo "Dry run: Would have added tag '${{ inputs.channel }}' to version '${{ inputs.version }}' for ${{ inputs.cli-package-name }}, ${{ inputs.core-package-name }}, and ${{ inputs.a2a-package-name }}."
+ echo "Dry run: Would have added tag '${INPUTS_CHANNEL}' to version '${INPUTS_VERSION}' for ${INPUTS_CLI_PACKAGE_NAME}, ${INPUTS_CORE_PACKAGE_NAME}, and ${INPUTS_A2A_PACKAGE_NAME}."
+
+ env:
+ INPUTS_CHANNEL: ${{ inputs.channel }}
+
+ INPUTS_VERSION: ${{ inputs.version }}
+
+ INPUTS_CLI_PACKAGE_NAME: ${{ inputs.cli-package-name }}
+
+ INPUTS_CORE_PACKAGE_NAME: ${{ inputs.core-package-name }}
+
+ INPUTS_A2A_PACKAGE_NAME: ${{ inputs.a2a-package-name }}
diff --git a/.github/actions/verify-release/action.yml b/.github/actions/verify-release/action.yml
index 14b595cb10..349e6a19d5 100644
--- a/.github/actions/verify-release/action.yml
+++ b/.github/actions/verify-release/action.yml
@@ -64,10 +64,13 @@ runs:
working-directory: '${{ inputs.working-directory }}'
run: |-
gemini_version=$(gemini --version)
- if [ "$gemini_version" != "${{ inputs.expected-version }}" ]; then
- echo "β NPM Version mismatch: Got $gemini_version from ${{ inputs.npm-package }}, expected ${{ inputs.expected-version }}"
+ if [ "$gemini_version" != "${INPUTS_EXPECTED_VERSION}" ]; then
+ echo "β NPM Version mismatch: Got $gemini_version from ${INPUTS_NPM_PACKAGE}, expected ${INPUTS_EXPECTED_VERSION}"
exit 1
fi
+ env:
+ INPUTS_EXPECTED_VERSION: ${{ inputs.expected-version }}
+ INPUTS_NPM_PACKAGE: ${{ inputs.npm-package }}
- name: 'Clear npm cache'
shell: 'bash'
@@ -77,11 +80,14 @@ runs:
shell: 'bash'
working-directory: '${{ inputs.working-directory }}'
run: |-
- gemini_version=$(npx --prefer-online "${{ inputs.npm-package}}" --version)
- if [ "$gemini_version" != "${{ inputs.expected-version }}" ]; then
- echo "β NPX Run Version mismatch: Got $gemini_version from ${{ inputs.npm-package }}, expected ${{ inputs.expected-version }}"
+ gemini_version=$(npx --prefer-online "${INPUTS_NPM_PACKAGE}" --version)
+ if [ "$gemini_version" != "${INPUTS_EXPECTED_VERSION}" ]; then
+ echo "β NPX Run Version mismatch: Got $gemini_version from ${INPUTS_NPM_PACKAGE}, expected ${INPUTS_EXPECTED_VERSION}"
exit 1
fi
+ env:
+ INPUTS_NPM_PACKAGE: ${{ inputs.npm-package }}
+ INPUTS_EXPECTED_VERSION: ${{ inputs.expected-version }}
- name: 'Install dependencies for integration tests'
shell: 'bash'
diff --git a/.github/workflows/chained_e2e.yml b/.github/workflows/chained_e2e.yml
index 4b37d0e109..d4d8780cb3 100644
--- a/.github/workflows/chained_e2e.yml
+++ b/.github/workflows/chained_e2e.yml
@@ -53,7 +53,7 @@ jobs:
REPO_NAME: '${{ github.event.inputs.repo_name }}'
run: |
mkdir -p ./pr
- echo '${{ env.REPO_NAME }}' > ./pr/repo_name
+ echo '${REPO_NAME}' > ./pr/repo_name
- uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # ratchet:actions/upload-artifact@v4
with:
name: 'repo_name'
@@ -320,14 +320,19 @@ jobs:
steps:
- name: 'Check E2E test results'
run: |
- if [[ ${{ needs.e2e_linux.result }} != 'success' || \
- ${{ needs.e2e_mac.result }} != 'success' || \
- ${{ needs.e2e_windows.result }} != 'success' || \
- ${{ needs.evals.result }} != 'success' ]]; then
+ if [[ ${NEEDS_E2E_LINUX_RESULT} != 'success' || \
+ ${NEEDS_E2E_MAC_RESULT} != 'success' || \
+ ${NEEDS_E2E_WINDOWS_RESULT} != 'success' || \
+ ${NEEDS_EVALS_RESULT} != 'success' ]]; then
echo "One or more E2E jobs failed."
exit 1
fi
echo "All required E2E jobs passed!"
+ env:
+ NEEDS_E2E_LINUX_RESULT: ${{ needs.e2e_linux.result }}
+ NEEDS_E2E_MAC_RESULT: ${{ needs.e2e_mac.result }}
+ NEEDS_E2E_WINDOWS_RESULT: ${{ needs.e2e_windows.result }}
+ NEEDS_EVALS_RESULT: ${{ needs.evals.result }}
set_workflow_status:
runs-on: 'gemini-cli-ubuntu-16-core'
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index dd7288cde5..ab79110574 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -464,14 +464,22 @@ jobs:
steps:
- name: 'Check all job results'
run: |
- if [[ (${{ needs.lint.result }} != 'success' && ${{ needs.lint.result }} != 'skipped') || \
- (${{ needs.link_checker.result }} != 'success' && ${{ needs.link_checker.result }} != 'skipped') || \
- (${{ needs.test_linux.result }} != 'success' && ${{ needs.test_linux.result }} != 'skipped') || \
- (${{ needs.test_mac.result }} != 'success' && ${{ needs.test_mac.result }} != 'skipped') || \
- (${{ needs.test_windows.result }} != 'success' && ${{ needs.test_windows.result }} != 'skipped') || \
- (${{ needs.codeql.result }} != 'success' && ${{ needs.codeql.result }} != 'skipped') || \
- (${{ needs.bundle_size.result }} != 'success' && ${{ needs.bundle_size.result }} != 'skipped') ]]; then
+ if [[ (${NEEDS_LINT_RESULT} != 'success' && ${NEEDS_LINT_RESULT} != 'skipped') || \
+ (${NEEDS_LINK_CHECKER_RESULT} != 'success' && ${NEEDS_LINK_CHECKER_RESULT} != 'skipped') || \
+ (${NEEDS_TEST_LINUX_RESULT} != 'success' && ${NEEDS_TEST_LINUX_RESULT} != 'skipped') || \
+ (${NEEDS_TEST_MAC_RESULT} != 'success' && ${NEEDS_TEST_MAC_RESULT} != 'skipped') || \
+ (${NEEDS_TEST_WINDOWS_RESULT} != 'success' && ${NEEDS_TEST_WINDOWS_RESULT} != 'skipped') || \
+ (${NEEDS_CODEQL_RESULT} != 'success' && ${NEEDS_CODEQL_RESULT} != 'skipped') || \
+ (${NEEDS_BUNDLE_SIZE_RESULT} != 'success' && ${NEEDS_BUNDLE_SIZE_RESULT} != 'skipped') ]]; then
echo "One or more CI jobs failed."
exit 1
fi
echo "All CI jobs passed!"
+ env:
+ NEEDS_LINT_RESULT: ${{ needs.lint.result }}
+ NEEDS_LINK_CHECKER_RESULT: ${{ needs.link_checker.result }}
+ NEEDS_TEST_LINUX_RESULT: ${{ needs.test_linux.result }}
+ NEEDS_TEST_MAC_RESULT: ${{ needs.test_mac.result }}
+ NEEDS_TEST_WINDOWS_RESULT: ${{ needs.test_windows.result }}
+ NEEDS_CODEQL_RESULT: ${{ needs.codeql.result }}
+ NEEDS_BUNDLE_SIZE_RESULT: ${{ needs.bundle_size.result }}
diff --git a/.github/workflows/deflake.yml b/.github/workflows/deflake.yml
index c9f4c3d59f..a0eb51a7f4 100644
--- a/.github/workflows/deflake.yml
+++ b/.github/workflows/deflake.yml
@@ -68,10 +68,10 @@ jobs:
VERBOSE: 'true'
shell: 'bash'
run: |
- if [[ "${{ env.IS_DOCKER }}" == "true" ]]; then
- npm run deflake:test:integration:sandbox:docker -- --runs="${{ env.RUNS }}" -- --testNamePattern "'${{ env.TEST_NAME_PATTERN }}'"
+ if [[ "${IS_DOCKER}" == "true" ]]; then
+ npm run deflake:test:integration:sandbox:docker -- --runs="${RUNS}" -- --testNamePattern "'${TEST_NAME_PATTERN}'"
else
- npm run deflake:test:integration:sandbox:none -- --runs="${{ env.RUNS }}" -- --testNamePattern "'${{ env.TEST_NAME_PATTERN }}'"
+ npm run deflake:test:integration:sandbox:none -- --runs="${RUNS}" -- --testNamePattern "'${TEST_NAME_PATTERN}'"
fi
deflake_e2e_mac:
@@ -109,7 +109,7 @@ jobs:
TEST_NAME_PATTERN: '${{ github.event.inputs.test_name_pattern }}'
VERBOSE: 'true'
run: |
- npm run deflake:test:integration:sandbox:none -- --runs="${{ env.RUNS }}" -- --testNamePattern "'${{ env.TEST_NAME_PATTERN }}'"
+ npm run deflake:test:integration:sandbox:none -- --runs="${RUNS}" -- --testNamePattern "'${TEST_NAME_PATTERN}'"
deflake_e2e_windows:
name: 'Slow E2E - Win'
@@ -167,4 +167,4 @@ jobs:
TEST_NAME_PATTERN: '${{ github.event.inputs.test_name_pattern }}'
shell: 'pwsh'
run: |
- npm run deflake:test:integration:sandbox:none -- --runs="${{ env.RUNS }}" -- --testNamePattern "'${{ env.TEST_NAME_PATTERN }}'"
+ npm run deflake:test:integration:sandbox:none -- --runs="$env:RUNS" -- --testNamePattern "'$env:TEST_NAME_PATTERN'"
diff --git a/.github/workflows/eval.yml b/.github/workflows/eval.yml
index d5616a3419..02aa38b3dd 100644
--- a/.github/workflows/eval.yml
+++ b/.github/workflows/eval.yml
@@ -44,5 +44,5 @@ jobs:
- name: 'Run evaluation'
working-directory: '/app'
run: |
- poetry run exp_run --experiment-mode=on-demand --branch-or-commit=${{ github.ref_name }} --model-name=gemini-2.5-pro --dataset=swebench_verified --concurrency=15
+ poetry run exp_run --experiment-mode=on-demand --branch-or-commit=${GITHUB_REF_NAME} --model-name=gemini-2.5-pro --dataset=swebench_verified --concurrency=15
poetry run python agent_prototypes/scripts/parse_gcli_logs_experiment.py --experiment_dir=experiments/adhoc/gcli_temp_exp --gcs-bucket="${EVAL_GCS_BUCKET}" --gcs-path=gh_action_artifacts
diff --git a/.github/workflows/evals-nightly.yml b/.github/workflows/evals-nightly.yml
index 6f6767ebfe..1ed9448c03 100644
--- a/.github/workflows/evals-nightly.yml
+++ b/.github/workflows/evals-nightly.yml
@@ -62,7 +62,7 @@ jobs:
TEST_NAME_PATTERN: '${{ github.event.inputs.test_name_pattern }}'
run: |
CMD="npm run test:all_evals"
- PATTERN="${{ env.TEST_NAME_PATTERN }}"
+ PATTERN="${TEST_NAME_PATTERN}"
if [[ -n "$PATTERN" ]]; then
if [[ "$PATTERN" == *.ts || "$PATTERN" == *.js || "$PATTERN" == */* ]]; then
diff --git a/.github/workflows/release-patch-3-release.yml b/.github/workflows/release-patch-3-release.yml
index b0d459f256..26a3208e43 100644
--- a/.github/workflows/release-patch-3-release.yml
+++ b/.github/workflows/release-patch-3-release.yml
@@ -118,6 +118,7 @@ jobs:
ORIGINAL_RELEASE_VERSION: '${{ steps.patch_version.outputs.RELEASE_VERSION }}'
ORIGINAL_RELEASE_TAG: '${{ steps.patch_version.outputs.RELEASE_TAG }}'
ORIGINAL_PREVIOUS_TAG: '${{ steps.patch_version.outputs.PREVIOUS_TAG }}'
+ VARS_CLI_PACKAGE_NAME: ${{vars.CLI_PACKAGE_NAME}}
run: |
echo "π Verifying no concurrent patch releases have occurred..."
@@ -129,7 +130,7 @@ jobs:
# Re-run the same version calculation script
echo "Re-calculating version to check for changes..."
- CURRENT_PATCH_JSON=$(node scripts/get-release-version.js --cli-package-name="${{vars.CLI_PACKAGE_NAME}}" --type=patch --patch-from="${CHANNEL}")
+ CURRENT_PATCH_JSON=$(node scripts/get-release-version.js --cli-package-name="${VARS_CLI_PACKAGE_NAME}" --type=patch --patch-from="${CHANNEL}")
CURRENT_RELEASE_VERSION=$(echo "${CURRENT_PATCH_JSON}" | jq -r .releaseVersion)
CURRENT_RELEASE_TAG=$(echo "${CURRENT_PATCH_JSON}" | jq -r .releaseTag)
CURRENT_PREVIOUS_TAG=$(echo "${CURRENT_PATCH_JSON}" | jq -r .previousReleaseTag)
@@ -162,10 +163,15 @@ jobs:
- name: 'Print Calculated Version'
run: |-
echo "Patch Release Summary:"
- echo " Release Version: ${{ steps.patch_version.outputs.RELEASE_VERSION }}"
- echo " Release Tag: ${{ steps.patch_version.outputs.RELEASE_TAG }}"
- echo " NPM Tag: ${{ steps.patch_version.outputs.NPM_TAG }}"
- echo " Previous Tag: ${{ steps.patch_version.outputs.PREVIOUS_TAG }}"
+ echo " Release Version: ${STEPS_PATCH_VERSION_OUTPUTS_RELEASE_VERSION}"
+ echo " Release Tag: ${STEPS_PATCH_VERSION_OUTPUTS_RELEASE_TAG}"
+ echo " NPM Tag: ${STEPS_PATCH_VERSION_OUTPUTS_NPM_TAG}"
+ echo " Previous Tag: ${STEPS_PATCH_VERSION_OUTPUTS_PREVIOUS_TAG}"
+ env:
+ STEPS_PATCH_VERSION_OUTPUTS_RELEASE_VERSION: ${{ steps.patch_version.outputs.RELEASE_VERSION }}
+ STEPS_PATCH_VERSION_OUTPUTS_RELEASE_TAG: ${{ steps.patch_version.outputs.RELEASE_TAG }}
+ STEPS_PATCH_VERSION_OUTPUTS_NPM_TAG: ${{ steps.patch_version.outputs.NPM_TAG }}
+ STEPS_PATCH_VERSION_OUTPUTS_PREVIOUS_TAG: ${{ steps.patch_version.outputs.PREVIOUS_TAG }}
- name: 'Run Tests'
if: "${{github.event.inputs.force_skip_tests != 'true'}}"
diff --git a/.github/workflows/release-promote.yml b/.github/workflows/release-promote.yml
index ebe16b1a39..100fc54462 100644
--- a/.github/workflows/release-promote.yml
+++ b/.github/workflows/release-promote.yml
@@ -362,23 +362,28 @@ jobs:
- name: 'Create and switch to a new branch'
id: 'release_branch'
run: |
- BRANCH_NAME="chore/nightly-version-bump-${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}"
+ BRANCH_NAME="chore/nightly-version-bump-${NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION}"
git switch -c "${BRANCH_NAME}"
echo "BRANCH_NAME=${BRANCH_NAME}" >> "${GITHUB_OUTPUT}"
+ env:
+ NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION: ${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}
- name: 'Update package versions'
- run: 'npm run release:version "${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}"'
+ run: 'npm run release:version "${NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION}"'
+ env:
+ NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION: ${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}
- name: 'Commit and Push package versions'
env:
BRANCH_NAME: '${{ steps.release_branch.outputs.BRANCH_NAME }}'
DRY_RUN: '${{ github.event.inputs.dry_run }}'
+ NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION: ${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}
run: |-
git add package.json packages/*/package.json
if [ -f package-lock.json ]; then
git add package-lock.json
fi
- git commit -m "chore(release): bump version to ${{ needs.calculate-versions.outputs.NEXT_NIGHTLY_VERSION }}"
+ git commit -m "chore(release): bump version to ${NEEDS_CALCULATE_VERSIONS_OUTPUTS_NEXT_NIGHTLY_VERSION}"
if [[ "${DRY_RUN}" == "false" ]]; then
echo "Pushing release branch to remote..."
git push --set-upstream origin "${BRANCH_NAME}"
diff --git a/.github/workflows/trigger_e2e.yml b/.github/workflows/trigger_e2e.yml
index 52b3a26f6f..d83dc1d7cf 100644
--- a/.github/workflows/trigger_e2e.yml
+++ b/.github/workflows/trigger_e2e.yml
@@ -23,8 +23,8 @@ jobs:
HEAD_SHA: '${{ github.event.inputs.head_sha || github.event.pull_request.head.sha }}'
run: |
mkdir -p ./pr
- echo '${{ env.REPO_NAME }}' > ./pr/repo_name
- echo '${{ env.HEAD_SHA }}' > ./pr/head_sha
+ echo '${REPO_NAME}' > ./pr/repo_name
+ echo '${HEAD_SHA}' > ./pr/head_sha
- uses: 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' # ratchet:actions/upload-artifact@v4
with:
name: 'repo_name'
diff --git a/integration-tests/plan-mode.test.ts b/integration-tests/plan-mode.test.ts
index 784bb890a0..f71006a36c 100644
--- a/integration-tests/plan-mode.test.ts
+++ b/integration-tests/plan-mode.test.ts
@@ -62,7 +62,7 @@ describe('Plan Mode', () => {
});
});
- it('should allow write_file only in the plans directory in plan mode', async () => {
+ it.skip('should allow write_file only in the plans directory in plan mode', async () => {
await rig.setup(
'should allow write_file only in the plans directory in plan mode',
{
diff --git a/packages/cli/src/ui/utils/TableRenderer.test.tsx b/packages/cli/src/ui/utils/TableRenderer.test.tsx
index 9d22d5d301..e9d84e6649 100644
--- a/packages/cli/src/ui/utils/TableRenderer.test.tsx
+++ b/packages/cli/src/ui/utils/TableRenderer.test.tsx
@@ -17,20 +17,21 @@ describe('TableRenderer', () => {
];
const terminalWidth = 80;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expect(output).toContain('Header 1');
expect(output).toContain('Row 1, Col 1');
expect(output).toContain('Row 3, Col 3');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -48,13 +49,14 @@ describe('TableRenderer', () => {
];
const terminalWidth = 80;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
@@ -62,7 +64,7 @@ describe('TableRenderer', () => {
// We just check for some of the content.
expect(output).toContain('Data 1.1');
expect(output).toContain('Data 3.4');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -77,19 +79,20 @@ describe('TableRenderer', () => {
];
const terminalWidth = 50;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expect(output).toContain('This is a very');
expect(output).toContain('long cell');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -104,18 +107,19 @@ describe('TableRenderer', () => {
];
const terminalWidth = 60;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expect(output).toContain('wrapping in');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -130,19 +134,20 @@ describe('TableRenderer', () => {
];
const terminalWidth = 50;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expect(output).toContain('Tiny');
expect(output).toContain('definitely needs');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -158,18 +163,19 @@ describe('TableRenderer', () => {
];
const terminalWidth = 60;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expect(output).toContain('Start. Stop.');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -178,20 +184,21 @@ describe('TableRenderer', () => {
const rows = [['Data 1', 'Data 2', 'Data 3']];
const terminalWidth = 50;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
// The output should NOT contain the literal '**'
expect(output).not.toContain('**Bold Header**');
expect(output).toContain('Bold Header');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -204,20 +211,21 @@ describe('TableRenderer', () => {
const rows = [['Data 1', 'Data 2', 'Data 3']];
const terminalWidth = 40;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
// Markers should be gone
expect(output).not.toContain('**');
expect(output).toContain('Very Long');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -247,7 +255,7 @@ describe('TableRenderer', () => {
const terminalWidth = 160;
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
{
/>,
{ width: terminalWidth },
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
@@ -271,7 +280,7 @@ describe('TableRenderer', () => {
expect(output).toContain('J.');
expect(output).toContain('Doe');
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -317,7 +326,7 @@ describe('TableRenderer', () => {
expected: ['Mixed π δΈζ', 'δ½ ε₯½ π', 'γγγ«γ‘γ― π'],
},
])('$name', async ({ headers, rows, terminalWidth, expected }) => {
- const { lastFrame, waitUntilReady, unmount } = renderWithProviders(
+ const renderResult = renderWithProviders(
{
/>,
{ width: terminalWidth },
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expected.forEach((text) => {
expect(output).toContain(text);
});
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
unmount();
});
@@ -351,19 +361,21 @@ describe('TableRenderer', () => {
])('$name', async ({ headers, rows, expected }) => {
const terminalWidth = 50;
- const { lastFrame, waitUntilReady } = renderWithProviders(
+ const renderResult = renderWithProviders(
,
);
+ const { lastFrame, waitUntilReady, unmount } = renderResult;
await waitUntilReady();
const output = lastFrame();
expected.forEach((text) => {
expect(output).toContain(text);
});
- expect(output).toMatchSnapshot();
+ await expect(renderResult).toMatchSvgSnapshot();
+ unmount();
});
});
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-non-ASCII-characters-emojis-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-non-ASCII-characters-emojis-.snap.svg
new file mode 100644
index 0000000000..d9612cce33
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-non-ASCII-characters-emojis-.snap.svg
@@ -0,0 +1,32 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-wrapped-bold-headers-without-showing-markers.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-wrapped-bold-headers-without-showing-markers.snap.svg
new file mode 100644
index 0000000000..0118d133cf
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-handles-wrapped-bold-headers-without-showing-markers.snap.svg
@@ -0,0 +1,47 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-3x3-table-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-3x3-table-correctly.snap.svg
new file mode 100644
index 0000000000..84e4d856f6
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-3x3-table-correctly.snap.svg
@@ -0,0 +1,39 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-complex-table-with-mixed-content-lengths-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-complex-table-with-mixed-content-lengths-correctly.snap.svg
new file mode 100644
index 0000000000..95654cb4d8
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-complex-table-with-mixed-content-lengths-correctly.snap.svg
@@ -0,0 +1,401 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-long-headers-and-4-columns-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-long-headers-and-4-columns-correctly.snap.svg
new file mode 100644
index 0000000000..b4d6353c3c
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-long-headers-and-4-columns-correctly.snap.svg
@@ -0,0 +1,63 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-mixed-emojis-As-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-mixed-emojis-As-.snap.svg
new file mode 100644
index 0000000000..707bf53f43
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-mixed-emojis-As-.snap.svg
@@ -0,0 +1,32 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-Asian-chara-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-Asian-chara-.snap.svg
new file mode 100644
index 0000000000..0f51eba244
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-Asian-chara-.snap.svg
@@ -0,0 +1,32 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-emojis-and-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-emojis-and-.snap.svg
new file mode 100644
index 0000000000..1a849696dd
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-a-table-with-only-emojis-and-.snap.svg
@@ -0,0 +1,32 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-headers-are-em-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-headers-are-em-.snap.svg
new file mode 100644
index 0000000000..2cc7b1cadd
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-headers-are-em-.snap.svg
@@ -0,0 +1,19 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-there-are-more-.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-there-are-more-.snap.svg
new file mode 100644
index 0000000000..452bb1fb12
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-renders-correctly-when-there-are-more-.snap.svg
@@ -0,0 +1,24 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-strips-bold-markers-from-headers-and-renders-them-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-strips-bold-markers-from-headers-and-renders-them-correctly.snap.svg
new file mode 100644
index 0000000000..6de776060b
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-strips-bold-markers-from-headers-and-renders-them-correctly.snap.svg
@@ -0,0 +1,25 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-all-long-columns-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-all-long-columns-correctly.snap.svg
new file mode 100644
index 0000000000..4b459cfea0
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-all-long-columns-correctly.snap.svg
@@ -0,0 +1,52 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-columns-with-punctuation-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-columns-with-punctuation-correctly.snap.svg
new file mode 100644
index 0000000000..7173ce475f
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-columns-with-punctuation-correctly.snap.svg
@@ -0,0 +1,51 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-long-cell-content-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-long-cell-content-correctly.snap.svg
new file mode 100644
index 0000000000..7f7b67a7dd
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-long-cell-content-correctly.snap.svg
@@ -0,0 +1,35 @@
+
\ No newline at end of file
diff --git a/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-mixed-long-and-short-columns-correctly.snap.svg b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-mixed-long-and-short-columns-correctly.snap.svg
new file mode 100644
index 0000000000..3ff0542a26
--- /dev/null
+++ b/packages/cli/src/ui/utils/__snapshots__/TableRenderer-TableRenderer-wraps-mixed-long-and-short-columns-correctly.snap.svg
@@ -0,0 +1,36 @@
+
\ No newline at end of file