Skip to content

Instantly share code, notes, and snippets.

@svor
Last active November 20, 2025 12:07
Show Gist options
  • Select an option

  • Save svor/ff68371ab9448275dc655e29b5632f24 to your computer and use it in GitHub Desktop.

Select an option

Save svor/ff68371ab9448275dc655e29b5632f24 to your computer and use it in GitHub Desktop.
[
{
"id": "donjayamanne.githistory",
"version": "0.6.20"
},
{
"id": "yzane.markdown-pdf",
"version": "1.5.0"
},
{
"id": "DavidAnson.vscode-markdownlint",
"version": "0.60.0"
},
{
"id": "robocorp.robotframework-lsp",
"version": "1.13.0"
},
{
"id": "shardulm94.trailing-spaces",
"version": "0.4.1"
},
{
"id": "adamhartford.vscode-base64",
"version": "0.1.0"
},
{
"id": "usernamehw.indent-one-space",
"version": "0.3.0"
},
{
"id": "redhat.vscode-xml",
"version": "0.29.0"
},
{
"id": "redhat.vscode-yaml",
"version": "1.18.0"
},
{
"id": "vscode.github-authentication",
"version": "1.95.3"
},
{
"id": "GitHub.vscode-pull-request-github",
"version": "0.108.0"
},
{
"id": "vscode.typescript-language-features",
"version": "1.95.3"
},
{
"id": "llvm-vs-code-extensions.vscode-clangd",
"version": "0.2.0"
},
{
"id": "eclipse-cdt.cdt-gdb-vscode",
"version": "2.1.0"
},
{
"id": "bmewburn.vscode-intelephense-client",
"version": "1.14.4"
},
{
"id": "ms-python.python",
"version": "2025.4.0"
},
{
"id": "ms-python.black-formatter",
"version": "2024.6.0"
},
{
"id": "ms-python.debugpy",
"version": "2025.6.0"
},
{
"id": "ms-python.pylint",
"version": "2024.2.0"
},
{
"id": "ms-python.isort",
"version": "2023.11.0-dev"
},
{
"id": "ms-toolsai.jupyter",
"version": "2025.3.0"
},
{
"id": "ms-toolsai.jupyter-keymap",
"version": "1.1.2"
},
{
"id": "ms-toolsai.jupyter-renderers",
"version": "1.3.0"
},
{
"id": "ms-toolsai.vscode-jupyter-cell-tags",
"version": "0.1.9"
},
{
"id": "ms-toolsai.vscode-jupyter-slideshow",
"version": "0.1.6"
},
{
"id": "golang.Go",
"version": "0.48.0"
},
{
"id": "ms-kubernetes-tools.vscode-kubernetes-tools",
"version": "1.3.25"
},
{
"id": "redhat.java",
"version": "1.43.1"
},
{
"id": "vscjava.vscode-java-debug",
"version": "0.58.2"
},
{
"id": "vscjava.vscode-java-test",
"version": "0.43.1"
},
{
"id": "redhat.vscode-microprofile",
"version": "0.14.0"
},
{
"id": "vscode.html-language-features",
"version": "1.95.3"
},
{
"id": "redhat.vscode-quarkus",
"version": "1.21.0"
},
{
"id": "redhat.fabric8-analytics",
"version": "0.9.6"
},
{
"id": "redhat.vscode-redhat-account",
"version": "0.2.0"
},
{
"id": "redhat.vscode-openshift-connector",
"version": "1.20.0"
},
{
"id": "xdebug.php-debug",
"version": "1.36.0"
},
{
"id": "ms-dotnettools.vscode-dotnet-runtime",
"version": "2.3.6"
},
{
"id": "muhammad-sammy.csharp",
"version": "2.84.19"
},
{
"id": "SonarSource.sonarlint-vscode",
"version": "4.27.0"
},
{
"id": "vscode.git-base",
"version": "1.95.3"
},
{
"id": "vscode.git",
"version": "1.95.3"
},
{
"id": "dbaeumer.vscode-eslint",
"version": "3.0.10"
},
{
"id": "redhat.vscode-commons",
"version": "0.0.6"
},
{
"id": "atlassian.atlascode",
"version": "3.8.6"
},
{
"id": "JFrog.jfrog-vscode-extension",
"version": "2.14.0"
},
{
"id": "SonatypeCommunity.vscode-iq-plugin",
"version": "1.3.4"
},
{
"id": "GitLab.gitlab-workflow",
"version": "6.35.0"
},
{
"id": "timonwong.shellcheck",
"version": "0.38.1"
},
{
"id": "redhat.ansible",
"version": "25.7.2"
},
{
"id": "vscode.npm",
"version": "1.95.3"
},
{
"id": "esbenp.prettier-vscode",
"version": "11.0.0"
},
{
"id": "eamodio.gitlens",
"version": "17.3.1"
},
{
"id": "Continue.continue",
"version": "1.0.19"
},
{
"id": "typefox.open-collaboration-tools",
"version": "0.3.4"
},
{
"id": "cnshenj.vscode-task-manager",
"version": "1.0.0"
},
{
"id": "Kelvin.vscode-sshfs",
"version": "1.26.1"
},
{
"id": "mongodb.mongodb-vscode",
"version": "1.13.3"
},
{
"id": "RooVeterinaryInc.roo-cline",
"version": "3.23.16"
},
{
"id": "saoudrizwan.claude-dev",
"version": "3.19.7"
},
{
"id": "RooVeterinaryInc.roo-cline",
"version": "3.32.0"
},
{
"id": "saoudrizwan.claude-dev",
"version": "3.37.1"
},
{
"id": "Google.geminicodeassist",
"version": "2.58.0"
}
]
=======extensions.txt=========
https://open-vsx.org/api/redhat/vscode-yaml/1.19.1/file/redhat.vscode-yaml-1.19.1.vsix
https://open-vsx.org/api/GitHub/vscode-pull-request-github/0.112.0/file/GitHub.vscode-pull-request-github-0.112.0.vsix
https://open-vsx.org/api/eclipse-cdt/cdt-gdb-vscode/2.5.0/file/eclipse-cdt.cdt-gdb-vscode-2.5.0.vsix
https://open-vsx.org/api/bmewburn/vscode-intelephense-client/1.16.0/file/bmewburn.vscode-intelephense-client-1.16.0.vsix
https://open-vsx.org/api/ms-python/python/2025.16.0/file/ms-python.python-2025.16.0.vsix
https://open-vsx.org/api/ms-python/black-formatter/2025.2.0/file/ms-python.black-formatter-2025.2.0.vsix
https://open-vsx.org/api/ms-python/debugpy/linux-x64/2025.14.1/file/[email protected]
https://open-vsx.org/api/ms-python/pylint/2025.2.0/file/ms-python.pylint-2025.2.0.vsix
https://open-vsx.org/api/ms-toolsai/jupyter/2025.4.1/file/ms-toolsai.jupyter-2025.4.1.vsix
https://open-vsx.org/api/golang/Go/0.50.0/file/golang.Go-0.50.0.vsix
https://open-vsx.org/api/redhat/java/1.49.0/file/redhat.java-1.49.0.vsix
https://open-vsx.org/api/vscjava/vscode-java-debug/0.58.3/file/vscjava.vscode-java-debug-0.58.3.vsix
https://open-vsx.org/api/vscjava/vscode-java-test/0.43.2/file/vscjava.vscode-java-test-0.43.2.vsix
https://open-vsx.org/api/redhat/fabric8-analytics/0.10.1/file/redhat.fabric8-analytics-0.10.1.vsix
https://open-vsx.org/api/redhat/vscode-openshift-connector/linux-x64/1.21.1/file/[email protected]
https://open-vsx.org/api/xdebug/php-debug/1.38.0/file/xdebug.php-debug-1.38.0.vsix
https://open-vsx.org/api/muhammad-sammy/csharp/2.93.22/file/muhammad-sammy.csharp-2.93.22.vsix
https://open-vsx.org/api/SonarSource/sonarlint-vscode/4.35.1/file/SonarSource.sonarlint-vscode-4.35.1.vsix
https://open-vsx.org/api/dbaeumer/vscode-eslint/3.0.16/file/dbaeumer.vscode-eslint-3.0.16.vsix
https://open-vsx.org/api/atlassian/atlascode/4.0.9/file/atlassian.atlascode-4.0.9.vsix
https://open-vsx.org/api/JFrog/jfrog-vscode-extension/2.14.5/file/JFrog.jfrog-vscode-extension-2.14.5.vsix
https://open-vsx.org/api/GitLab/gitlab-workflow/6.57.4/file/GitLab.gitlab-workflow-6.57.4.vsix
https://open-vsx.org/api/timonwong/shellcheck/0.38.5/file/timonwong.shellcheck-0.38.5.vsix
https://open-vsx.org/api/redhat/ansible/25.9.0/file/redhat.ansible-25.9.0.vsix
https://open-vsx.org/api/eamodio/gitlens/17.7.1/file/eamodio.gitlens-17.7.1.vsix
https://open-vsx.org/api/Continue/continue/linux-x64/1.2.10/file/[email protected]
https://open-vsx.org/api/RooVeterinaryInc/roo-cline/3.33.2/file/RooVeterinaryInc.roo-cline-3.33.2.vsix
https://open-vsx.org/api/saoudrizwan/claude-dev/3.38.1/file/saoudrizwan.claude-dev-3.38.1.vsix
https://open-vsx.org/api/RooVeterinaryInc/roo-cline/3.33.2/file/RooVeterinaryInc.roo-cline-3.33.2.vsix
https://open-vsx.org/api/saoudrizwan/claude-dev/3.38.1/file/saoudrizwan.claude-dev-3.38.1.vsix
https://open-vsx.org/api/Google/geminicodeassist/2.58.0/file/Google.geminicodeassist-2.58.0.vsix
======update_extensions.sh========
#!/bin/bash
# available under the terms of the Eclipse Public License 2.0
# which is available at https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
#
# This script checks for available versions of VS Code extensions from Open VSX and updates them in the openvsx-sync.json file.
# It identifies the latest stable version compatible with the configured VS Code version,
# updates the download link and checksum, and ensures that artifacts.lock.yaml reflects the correct extension versions.
# If an extension already exists, it updates its metadata; otherwise, it adds a new entry.
trap EXIT
set -e
set -o pipefail
GREEN="\e[32m"
RESETSTYLE="\e[0m"
BOLD="\e[1m"
DEFAULT_EMOJI_HEADER="🏃" # could be overiden with EMOJI_HEADER="-"
EMOJI_HEADER=${EMOJI_HEADER:-$DEFAULT_EMOJI_HEADER}
DEFAULT_EMOJI_PASS="✔" # could be overriden with EMOJI_PASS="[PASS]"
EMOJI_PASS=${EMOJI_PASS:-$DEFAULT_EMOJI_PASS}
DEFAULT_EMOJI_FAIL="✘" # could be overriden with EMOJI_FAIL="[FAIL]"
EMOJI_FAIL=${EMOJI_FAIL:-$DEFAULT_EMOJI_FAIL}
usage() {
echo "Usage: $0 -e 1.97.0
-e|--editor-version [EDITOR_VERSION] VS Code editor version that is used to check the compatibility of the extensions"
exit 1
}
# commandline args
while [[ "$#" -gt 0 ]]; do
case $1 in
'-e' | '--editor-version')
EDITOR_VERSION="$2"
shift 1
;;
'-h' | '--help') usage ;;
esac
shift 1
done
function initMessage() {
echo -e "${BOLD}\n${EMOJI_HEADER} ${1}${RESETSTYLE}"
}
# Ensure EDITOR_VERSION is set
if [[ -z "$EDITOR_VERSION" ]]; then
echo "[ERROR] The -e | --editor-version argument is required."
usage
fi
echo -e "${BOLD}\n${EMOJI_HEADER}${EMOJI_HEADER}${EMOJI_HEADER} Check new versions for extensions from openvsx_sync.json: ${BASH_SOURCE[0]}${RESETSTYLE}"
echo "Che Code version=${EDITOR_VERSION}"
################################################################
vsixMetadata=""
getMetadata() {
vsixName=$1
key=$2
# check there is no error field in the metadata and retry if there is
for j in 1 2 3 4 5; do
vsixMetadata=$(curl -sLS "https://open-vsx.org/api/${vsixName}/${key}")
if [[ $(echo "${vsixMetadata}" | jq -r ".error") != null ]]; then
echo "Attempt $j/5: Error while getting metadata for ${vsixName} version ${key}"
if [[ $j -eq 5 ]]; then
echo "[ERROR] Maximum of 5 attempts reached - must exit!"
exit 1
fi
continue
else
break
fi
done
}
versionsPage=""
getVersions() {
vsixName=$1
# check the versions page is empty and retry if it is
for j in 1 2 3 4 5; do
versionsPage=$(curl -sLS "https://open-vsx.org/api/${vsixName}/versions?size=400")
totalSize=$(echo "${versionsPage}" | jq -r ".totalSize")
if [[ "$totalSize" != "null" && "$totalSize" -eq 0 ]]; then
echo "Attempt $j/5: Error while getting versions for ${vsixName}"
if [[ $j -eq 5 ]]; then
echo "[ERROR] Maximum of 5 attempts reached - must exit!"
exit 1
fi
continue
else
break
fi
done
}
# Extensions file path
openvsxJson="extensions.json"
openVsxSyncFileContent=$(cat "${openvsxJson}")
numberOfExtensions=$(echo "${openVsxSyncFileContent}" | jq ". | length")
echo "The number of extensions is $numberOfExtensions"
IFS=$'\n'
for i in $(seq 0 "$((numberOfExtensions - 1))"); do
vsixFullName=$(echo "${openVsxSyncFileContent}" | jq -r ".[$i].id")
vsixUpdate=$(echo "${openVsxSyncFileContent}" | jq -r ".[$i].update")
if [[ $vsixUpdate == false ]]; then
echo -e "${BOLD}\nSkipping ${vsixFullName}${RESETSTYLE}"
continue
fi
vsixVersion=$(echo "${openVsxSyncFileContent}" | jq -r ".[$i].version")
vsixDownloadLink=$(echo "${openVsxSyncFileContent}" | jq -r ".[$i].download")
# replace the dot by / in the vsix name
vsixName=$(echo "${vsixFullName}" | sed 's/\./\//g')
initMessage "Checking for a new version: $vsixFullName"
# version should not be empty if download link was set
if [[ $vsixDownloadLink != null ]] && [[ -z "$vsixVersion" ]]; then
echo -e "Version should not be empty for $vsixFullName"
exit 1
fi
# grab metadata for the vsix file from openvsx.org
getVersions "${vsixName}"
# if version wasn't set in json, grab it from metadata and add it into the file
# get all versions of the extension
allVersions=$(echo "${versionsPage}" | jq -r '.versions')
if [[ "$allVersions" == "{}" ]]; then
echo "No versions found for ${vsixName}"
exit 1
fi
key_value_pairs=$(echo "$allVersions" | jq -r 'to_entries[] | [ .key, .value ] | @tsv')
# go through all versions of the extension to find the latest stable version that is compatible with the VS Code version
resultedVersion=null
while IFS=$'\t' read -r key value; do
# get metadata for the version
getMetadata "${vsixName}" "${key}"
# check if the version is pre-release
preRelease=$(echo "${vsixMetadata}" | jq -r '.preRelease')
if [[ $preRelease == true ]]; then
echo "Skipping pre-release version ${value}"
continue
fi
# extract the engine version from the json metadata
vscodeEngineVersion=$(echo "${vsixMetadata}" | jq -r '.engines.vscode')
# remove ^ from the engine version
vscodeEngineVersion="${vscodeEngineVersion//^/}"
# remove >= from the engine version
vscodeEngineVersion="${vscodeEngineVersion//>=/}"
# replace x by 0 in the engine version
vscodeEngineVersion="${vscodeEngineVersion//x/0}"
# check if the extension's engine version is compatible with the code version
# if the extension's engine version is ahead of the code version, check a next version of the extension
if [[ "$vscodeEngineVersion" = "$(echo -e "$vscodeEngineVersion\n$EDITOR_VERSION" | sort -V | head -n1)" ]]; then
#VS Code version >= Engine version, can proceed."
resultedVersion=$(echo "${vsixMetadata}" | jq -r ".version")
break
else
echo "Skipping ${value}, it is not compatible with VS Code editor $EDITOR_VERSION"
continue
fi
done <<<"$key_value_pairs"
if [[ "$vsixVersion" == "$resultedVersion" ]]; then
echo "==================== The same version for $vsixName"
continue
fi
if [[ $resultedVersion == null ]]; then
echo "[ERROR] No stable version of $vsixFullName is compatible with VS Code editor verision $EDITOR_VERSION; must exit!"
exit 1
else
vsixVersion=$resultedVersion
fi
# jq --argjson i "$i" --arg version "$vsixVersion" '.[$i] += { "version": $version }' "$openvsxJson" >tmp.json && mv tmp.json "$openvsxJson"
# Extract the download link from metadata
vsixDownloadLink=$(echo "$vsixMetadata" | jq -r '.files.download')
vsixUniversalDownloadLink=$(echo "$vsixMetadata" | jq -r '.downloads.universal // empty')
vsixLinuxDownloadLink=$(echo "$vsixMetadata" | jq -r '.downloads."linux-x64" // empty')
# Prioritize universal, then linux-x64, then fallback to default
vsixDownloadLink=${vsixUniversalDownloadLink:-${vsixLinuxDownloadLink:-$vsixDownloadLink}}
if [[ -z $vsixDownloadLink ]]; then
echo "[ERROR] Failed to determine a valid VSIX download link. Exiting!"
exit 1
fi
# jq --argjson i "$i" --arg downloadLink "$vsixDownloadLink" '.[$i] += { "download": $downloadLink }' "$openvsxJson" >tmp.json && mv tmp.json "$openvsxJson"
echo "$vsixDownloadLink" >> extensions.txt
done
echo -e "${GREEN}${EMOJI_PASS}${RESETSTYLE} Finished checking new versions!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment