{"id":11771742,"name":"microsoft/template-validation-action","ecosystem":"actions","description":"Validate the standard of the gallery","homepage":"","licenses":"mit","normalized_licenses":["MIT"],"repository_url":"https://github.com/microsoft/template-validation-action","keywords_array":[],"namespace":"microsoft","versions_count":25,"first_release_published_at":"2024-07-22T08:13:51.000Z","latest_release_published_at":"2025-10-08T11:27:36.000Z","latest_release_number":"v0.4.4","last_synced_at":"2026-05-12T03:20:03.787Z","created_at":"2025-06-07T21:06:01.030Z","updated_at":"2026-05-12T03:20:03.787Z","registry_url":"https://github.com/microsoft/template-validation-action","install_command":null,"documentation_url":null,"metadata":{"name":"Gallery Standard Validation","description":"Validate the standard of the gallery","inputs":{"workingDirectory":{"description":"The path of target template to validate","required":true,"default":"."},"validatePaths":{"description":"Comma-separated list of paths to validate","required":false},"topics":{"description":"Comma-separated list of topics to check","required":false},"validateAzd":{"description":"Run azd up and azd down for validation","required":true,"default":"true"},"useDevContainer":{"description":"Use dev container for validation","required":true,"default":"true"},"securityAction":{"description":"Run security action validation","required":true,"default":"PSRule","options":["PSRule"]},"validateTests":{"description":"Run tests for validation","required":false,"default":"Playwright","options":["Playwright"]},"validationEnvs":{"description":"Additional environment variables for validation, in KEY=VALUE format, separated by commas","required":false,"default":""}},"outputs":{"resultFile":{"description":"A file path to a results file.","value":"${{ steps.set_output.outputs.resultFile }}"}},"runs":{"using":"composite","steps":[{"name":"Check for .devcontainer config","id":"check_devcontainer","if":"${{ inputs.useDevContainer == 'true' }}","run":"if [ ! -f \"${{ inputs.workingDirectory }}/.devcontainer/devcontainer.json\" ]; then\n  echo \"Error: devcontainer config does not exist but useDevContainer is set to true.\"\n  exit 1\nfi\n","shell":"bash"},{"name":"Check for environment variables","id":"check_env","run":"if [ -z \"${{ env.AZURE_CLIENT_ID }}\" ]; then\n  echo \"Error: AZURE_CLIENT_ID is not set. Please run azd pipeline config for setup.\"\n  exit 1\nfi\nif [ -z \"${{ env.AZURE_TENANT_ID }}\" ]; then\n  echo \"Error: AZURE_TENANT_ID is not set. Please run azd pipeline config for setup.\"\n  exit 1\nfi\nif [ -z \"${{ env.AZURE_SUBSCRIPTION_ID }}\" ]; then\n  echo \"Error: AZURE_SUBSCRIPTION_ID is not set. Please run azd pipeline config for setup.\"\n  exit 1\nfi\n","shell":"bash"},{"name":"Extract topics","id":"extract_repo_info","if":"${{ inputs.topics != '\"\"' }}","run":"repository_name=${{ env.REPOSITORY_NAME || github.repository }}\ntopics_list=$(gh api -H \"Accept: application/vnd.github+json\" -H \"X-GitHub-Api-Version: 2022-11-28\" repos/$repository_name/topics | jq -r '.names | join(\",\")')\necho \"TOPICS=\\\"$topics_list\\\"\" \u003e\u003e $GITHUB_ENV\n","shell":"bash","env":{"GITHUB_TOKEN":"${{ env.GITHUB_TOKEN }}"}},{"name":"Reform path for compatability","id":"reform_path","run":"if [[ \"$RUNNER_OS\" == \"Windows\" ]]; then\n  working_directory=$(cygpath $(echo \"${{ inputs.workingDirectory }}\" | tr '\\\\' '/'))\n  action_path=$(cygpath $(echo \"${{ github.action_path }}\" | tr '\\\\' '/'))\n  workspace=$(cygpath $(echo \"$GITHUB_WORKSPACE\" | tr '\\\\' '/'))\n  echo \"workingDirectory=$working_directory\" \u003e\u003e $GITHUB_OUTPUT\n  echo \"actionPath=$action_path\" \u003e\u003e $GITHUB_OUTPUT\n  echo \"workspace=$workspace\" \u003e\u003e $GITHUB_OUTPUT\nelse\n  echo \"workingDirectory=${{ inputs.workingDirectory }}\" \u003e\u003e $GITHUB_OUTPUT\n  echo \"actionPath=${{ github.action_path }}\" \u003e\u003e $GITHUB_OUTPUT\n  echo \"workspace=$GITHUB_WORKSPACE\" \u003e\u003e $GITHUB_OUTPUT\nfi\n","shell":"bash"},{"name":"Calculate relative paths for PSRule","if":"${{ inputs.securityAction == 'PSRule' }}","id":"calculate_relative_paths","run":"relative_working_directory=$(realpath --relative-to=${{ steps.reform_path.outputs.workspace }} ${{ steps.reform_path.outputs.workingDirectory }})\nif [[ $relative_working_directory == ..* ]]; then\n  rm -rf ${{ github.run_id }}/template\n  mkdir -p ${{ github.run_id }}/template\n  cp -a ${{ steps.reform_path.outputs.workingDirectory }}/. ${{ github.run_id }}/template\n  echo \"relative_working_directory=${{ github.run_id }}/template\" \u003e\u003e $GITHUB_ENV\nelse\n  echo \"relative_working_directory=$relative_working_directory\" \u003e\u003e $GITHUB_ENV\nfi\n","shell":"bash"},{"name":"Prepare PSRule for Azure","if":"${{ inputs.securityAction == 'PSRule' }}","id":"prepare_psrule","run":"rm -rf ${{ env.relative_working_directory }}/.ps-rule\nmkdir -p ${{ env.relative_working_directory }}/.ps-rule\ncp ${{ steps.reform_path.outputs.actionPath }}/.ps-rule/templateCustom.Rule.yaml ${{ env.relative_working_directory }}/.ps-rule/templateCustom.Rule.yaml\ncp ${{ steps.reform_path.outputs.actionPath}}/ps-rule.yaml ${{ env.relative_working_directory }}\ncd ${{ env.relative_working_directory }}\npython3 ${{ steps.reform_path.outputs.actionPath }}/scripts/generate-bicep-test.py \n","shell":"bash"},{"name":"Analyze templates for MI compliance","uses":"microsoft/ps-rule@v2.9.0","if":"${{ inputs.securityAction == 'PSRule' \u0026\u0026 env.relative_working_directory != '.' }}","with":{"path":"${{ env.relative_working_directory }}","modules":"PSRule.Rules.Azure","baseline":"TemplateValidation.MI_2024_10","outputFormat":"json","outputPath":"psrule-output.json","summary":false},"continue-on-error":true},{"name":"Analyze templates for MI compliance","uses":"microsoft/ps-rule@v2.9.0","if":"${{ inputs.securityAction == 'PSRule' \u0026\u0026 env.relative_working_directory == '.' }}","with":{"modules":"PSRule.Rules.Azure","baseline":"TemplateValidation.MI_2024_10","outputFormat":"json","outputPath":"psrule-output.json","summary":false},"continue-on-error":true},{"name":"Copy back psrule-output","if":"${{ inputs.securityAction == 'PSRule' \u0026\u0026 steps.reform_path.outputs.workingDirectory != env.relative_working_directory }}","id":"copy-back-psrule-output","run":"cp ${{ env.relative_working_directory }}/psrule-output.json ${{ steps.reform_path.outputs.workingDirectory}}\n","shell":"bash","continue-on-error":true},{"name":"Check parameters in main.bicep","id":"check_parameters","run":"set +e  # Don't exit on errors\n\n# Wrap the entire logic in a try-catch equivalent\n{\n  echo \"Starting parameter check process...\"\n\nif [ -f \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\" ]; then\n  # Get parameter names that don't have a default value (no equals sign in the line)\n  parameters=$(grep -P \"^param\\s+\\w+\\s+\\w+$\" \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\" | grep -oP \"^param\\s+\\K\\w+\" || echo \"\")\n  echo \"parameters from main.bicep without default value: $parameters\"\n  # remove if parameters are set default values in /infra/main.parameters.json. \n  # The following the sample (no default value) in main.parameters.json: \"location\": { \"value\": \"${AZURE_LOCATION}\" }\n  # The following the sample (with default value) in main.parameters.json: \"location\": { \"value\": \"${AZURE_LOCATION}=eastus2\" }\n  if [ -f \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.parameters.json\" ]; then\n    required_env=\"\"\n    for param in $parameters; do\n      echo \"Checking parameter: $param\"\n      # Check if parameter exists and has no default value\n      param_value=$(jq -r \".parameters.\"$param\".value // empty\" \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.parameters.json\" || echo \"\")\n      echo \"$param value in parameter json file: $param_value\"\n      if [ ! -z \"$param_value\" ] \u0026\u0026 [[ \"$param_value\" =~ ^\\$\\{[A-Za-z_]+\\}$ ]]; then\n        # parse param_value to get the value. e.g get AZURE_LOCATION from \"value\": \"${AZURE_LOCATION}\"\n        env_key=$(echo \"$param_value\" | grep -oP '\\$\\{([^}]+)\\}' | sed 's/\\${//;s/}//g' || echo \"\")\n        echo \"$param env_key: $env_key\"\n        if [[ $env_key == 'AZURE_LOCATION' || $env_key == 'AZURE_ENV_NAME' || $env_key == 'AZURE_PRINCIPAL_ID' || $env_key == 'AZURE_PRINCIPAL_TYPE' || ${env_key,,} == *\"location\"* ]]; then\n          echo \"Ignoring parameter: $param\"\n          continue\n        else\n          # Set env_value with random value (15 characters and starts with a letter)\n          env_value=$(echo -n $(printf \"%c\" $(($RANDOM % 26 + 65)))$(for i in {1..14}; do echo -n $(($RANDOM % 36 + 48)) | awk '{printf \"%c\", ($1 \u003e 57 ? $1 + 39 : $1)}'; done))\n          # If $env_key contains Capacity (ignore case), set env_value to \"10\"\n          if [[ ${env_key,,} == *\"capacity\"* ]]; then\n            env_value=\"10\"\n          elif [[ ${env_key,,} == *\"enabled\"* ]]; then\n            env_value=\"false\"\n          fi\n          echo \"env_value: $env_value\"\n          # Find the nearest @allowed annotation before this parameter\n          allowed_value=\"\"\n          # Get the parameter line and check previous lines for @allowed\n          param_line_num=$(grep -n \"^param $param \" \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\" | cut -d: -f1 | head -1)\n          if [ -n \"$param_line_num\" ]; then\n            # Look backwards from the parameter line to find the nearest @allowed\n            start_line=$((param_line_num-1))\n            end_line=$((param_line_num-10))\n            if [ $end_line -lt 1 ]; then\n              end_line=1\n            fi                    \n            i=$start_line\n            while [ $i -ge $end_line ]; do\n              line=$(sed -n \"${i}p\" \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\")\n              if echo \"$line\" | grep -q \"@allowed\"; then\n                allowed_value=$(echo \"$line\" | grep -oP \"@allowed\\(\\[\\K[^\\]]+\" || echo \"\")\n                break\n              elif echo \"$line\" | grep -q \"^param \"; then\n                # Hit another parameter, stop searching\n                break\n              fi\n              i=$((i-1))\n            done\n          fi\n          if [ -n \"$allowed_value\" ]; then\n            echo \"Parameter $param has allowed value: $allowed_value\"\n            # Select first element in the allowed list\n            env_value=$(echo \"$allowed_value\" | tr -d \"'\" | tr -d '\"' | awk -F, '{print $1}' | xargs)\n            echo \"Using allowed value for $param: $env_value\"\n          fi\n          echo \"Adding to required_env: $env_key=$env_value\"\n          required_env+=\"$env_key=$env_value \"\n          echo \"$env_key=$env_value\" \u003e\u003e $GITHUB_ENV\n        fi\n      fi\n    done\n    echo \"required_env from json: $required_env\"\n  fi\nelse\n  echo \"main.bicep not found, skipping parameter check\"\nfi\n\n} || {\n  echo \"Error occurred during parameter check process: $?\"\n  echo \"Continuing with validation despite parameter check failure...\"\n  exit_code=$?\n}\n\necho \"Parameter check process completed\"\nexit 0  # Always exit successfully\n","shell":"bash","continue-on-error":true},{"name":"Set additional validation environment variables","id":"set_additional_envs","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 inputs.validationEnvs != '' }}","run":"IFS=',' read -ra ADDR \u003c\u003c\u003c \"${{ inputs.validationEnvs }}\"\nfor env_pair in \"${ADDR[@]}\"; do\n  echo \"$env_pair\" \u003e\u003e $GITHUB_ENV\ndone\n","shell":"bash"},{"name":"Check and Set targetScope in main.bicep","id":"check_targetScope","if":"${{ inputs.validateAzd == 'true' }}","run":"if [ -f \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\" ]; then\n  # Check if targetScope is set to 'subscription' or 'resourceGroup'. The sample sentence in bicep is: targetScope = 'subscription'\n  targetScope=$(grep -oP \"targetScope\\s*=\\s*['\\\"]\\K[^'\\\"]+\" \"${{ steps.reform_path.outputs.workingDirectory }}/infra/main.bicep\" 2\u003e/dev/null || echo \"\")\n  echo \"targetScope: $targetScope\"\n  echo \"targetScope=$targetScope\" \u003e\u003e $GITHUB_ENV\n  if [ \"$targetScope\" == \"subscription\" ]; then\n    echo \"targetScope is set to 'subscription' in main.bicep\"\n    # Add the targetScope to the env variables\n  elif [ \"$targetScope\" == \"resourceGroup\" ]; then\n    echo \"targetScope is set to 'resourceGroup' in main.bicep\"\n  else\n    echo \"targetScope is not set to 'subscription' or 'resourceGroup' in main.bicep, set to 'resourceGroup' by default\"\n    targetScope=\"resourceGroup\"\n    echo \"targetScope=$targetScope\" \u003e\u003e $GITHUB_ENV\n  fi\nfi\n","shell":"bash","continue-on-error":true},{"name":"Set azure resource group name in env","id":"set_resource_group","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 env.targetScope == 'resourceGroup' }}","run":"azure_resource_group=\"rg-${{ env.AZURE_ENV_NAME }}\"\necho \"AZURE_RESOURCE_GROUP=$azure_resource_group\" \u003e\u003e $GITHUB_ENV\necho \"AZURE_RESOURCE_GROUP is $azure_resource_group\"\n","shell":"bash","env":{"AZURE_ENV_NAME":"${{ env.AZURE_ENV_NAME }}"}},{"name":"Azure login","uses":"azure/login@v2","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 env.targetScope == 'resourceGroup' }}","with":{"client-id":"${{ env.AZURE_CLIENT_ID }}","tenant-id":"${{ env.AZURE_TENANT_ID }}","subscription-id":"${{ env.AZURE_SUBSCRIPTION_ID }}"}},{"name":"Azure CLI script","id":"create_resource_group","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 env.targetScope == 'resourceGroup' }}","run":"az group create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --location ${{ env.AZURE_LOCATION }}\n","shell":"bash"},{"name":"Copy validator into devcontainer","if":"${{ inputs.useDevContainer == 'true' }}","run":"mkdir -p ${{ steps.reform_path.outputs.workingDirectory }}/tva_${{ github.run_id }}\ncp -r ${{ steps.reform_path.outputs.actionPath }}/src ${{ steps.reform_path.outputs.workingDirectory }}/tva_${{ github.run_id }}/src\ncp ${{ steps.reform_path.outputs.actionPath }}/requirements.txt ${{ steps.reform_path.outputs.workingDirectory }}/tva_${{ github.run_id }}/requirements.txt\nif [ -f \"${{ steps.reform_path.outputs.workingDirectory }}/psrule-output.json\" ]; then\n  cp ${{ steps.reform_path.outputs.workingDirectory }}/psrule-output.json ${{ inputs.workingDirectory }}/tva_${{ github.run_id }};\nfi\nenv \u003e ${{ steps.reform_path.outputs.workingDirectory }}/tva_${{ github.run_id }}/env_variables.txt\n","shell":"bash"},{"uses":"actions/github-script@v6","id":"script","if":"${{ inputs.useDevContainer == 'true' \u0026\u0026 inputs.validateAzd == 'true' }}","with":{"debug":true,"script":"const token = process.env['ACTIONS_RUNTIME_TOKEN']\nconst runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']\nconst aadToken = await core.getIDToken('api://AzureADTokenExchange');\ncore.setOutput('TOKEN', token.trim())\ncore.setOutput('AAD_TOKEN', aadToken.trim())\ncore.setOutput('ID_TOKEN_URL', runtimeUrl.trim())\n"}},{"name":"Start Docker","if":"${{ inputs.useDevContainer == 'true' \u0026\u0026 inputs.validateAzd == 'true' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"if find . -type f -iname 'dockerfile' | grep -q .; then\n  sudo service docker start \u003e /dev/null\nfi\n","subFolder":"${{ steps.reform_path.outputs.workingDirectory }}"},"continue-on-error":true},{"name":"Login azd in devcontainer","id":"azd-login","if":"${{ inputs.useDevContainer == 'true' \u0026\u0026 inputs.validateAzd == 'true' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"azd auth login --client-id \"${{ env.AZURE_CLIENT_ID }}\" --federated-credential-provider \"github\" --tenant-id \"${{ env.AZURE_TENANT_ID }}\"\naz login --service-principal -u \"${{ env.AZURE_CLIENT_ID }}\" --federated-token $AZURE_AD_TOKEN --tenant \"${{ env.AZURE_TENANT_ID }}\"\n","subFolder":"${{ steps.reform_path.outputs.workingDirectory }}","env":"ACTIONS_ID_TOKEN_REQUEST_URL=${{ steps.script.outputs.ID_TOKEN_URL }}\nACTIONS_ID_TOKEN_REQUEST_TOKEN=${{ steps.script.outputs.TOKEN }}\nAZURE_AD_TOKEN=${{ steps.script.outputs.AAD_TOKEN }}\n"},"continue-on-error":true},{"name":"Setup Python in devcontainer","id":"setup-python","if":"${{ inputs.useDevContainer == 'true' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"if ! command -v python \u0026\u003e /dev/null; then\n  echo \"python not found, installing python...\"\n  sudo apt-get update \u0026\u0026 sudo apt-get install -y python3 python3-pip python3-venv\nfi\npython3 -m venv .venv --system-site-packages\nsource .venv/bin/activate\npython3 -m pip install --upgrade pip\npython3 -m pip install jupyter --force-reinstall\npython3 -m pip install -r tva_${{ github.run_id }}/requirements.txt;\n","subFolder":"${{ steps.reform_path.outputs.workingDirectory }}"}},{"name":"Setup Node in devcontainer","id":"setup-node","if":"${{ inputs.useDevContainer == 'true' \u0026\u0026 inputs.validateTests == 'Playwright' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"if ! command -v node \u0026\u003e /dev/null; then\n  echo \"node not found, installing lts. node...\"\n  curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -\n  sudo apt-get install -y nodejs\nfi\necho \"Install playwright node...\"\nnpm install @playwright/test\necho \"Install playwright browsers...\"\n# Clean up package cache to free space\nsudo apt-get clean\nsudo rm -rf /var/lib/apt/lists/*\n# Check available disk space\necho \"Available disk space:\"\ndf -h /\n# Install playwright browsers first\nnpx playwright install\n# Install required system dependencies for Playwright\necho \"Installing Playwright system dependencies...\"\nsudo apt-get update || true\nsudo apt-get install -y \\\n  libdbus-1-3 \\\n  libatk1.0-0t64 \\\n  libatk-bridge2.0-0t64 \\\n  libcups2t64 \\\n  libxkbcommon0 \\\n  libatspi2.0-0t64 \\\n  libxcomposite1 \\\n  libxdamage1 \\\n  libxfixes3 \\\n  libxrandr2 \\\n  libgbm1 \\\n  libasound2t64 || echo \"Some system dependencies could not be installed, but browsers should still work\"\necho \"Playwright browsers and dependencies installed successfully\"\n","subFolder":"${{ steps.reform_path.outputs.workingDirectory }}"}},{"name":"Remove spaces from inputs","id":"remove_spaces","run":"inputs_validatePaths=\"${{ inputs.validatePaths }}\"\ninputs_topics=\"${{ inputs.topics }}\"\ninputs_validatePaths=$(echo \"$inputs_validatePaths\" | sed 's/ //g')\ninputs_topics=$(echo \"$inputs_topics\" | sed 's/ //g')\necho \"validatePaths=$inputs_validatePaths\" \u003e\u003e $GITHUB_ENV\necho \"expected_topics=$inputs_topics\" \u003e\u003e $GITHUB_ENV\n","shell":"bash"},{"name":"Prepare arguments","id":"prepare_arguments","run":"arguments='--topics ${{ env.TOPICS }}'\nif [ -n \"${{ env.expected_topics }}\" ]; then\n  arguments+=\" --expected_topics ${{ env.expected_topics }}\"\nfi\nif [ \"${{ inputs.validateAzd }}\" = \"true\" ]; then\n  arguments+=\" --validate_azd\" \nfi\nif [ -n \"${{ env.validatePaths }}\" ]; then\n  arguments+=\" --validate_paths ${{ env.validatePaths }}\"\nfi\nif [ ${{ inputs.securityAction }} == \"PSRule\" ]; then\n  arguments+=\" --psrule_result ./psrule-output.json\"\nfi\nif [ ${{ inputs.validateTests }} == \"Playwright\" ]; then\n  arguments+=\" --validate_playwright_test\"\nfi\necho \"arguments=$arguments\" \u003e\u003e $GITHUB_OUTPUT\n","shell":"bash"},{"name":"Run validation","id":"validation","if":"${{ inputs.useDevContainer == 'true' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"source .venv/bin/activate\nif [ -f tva_${{ github.run_id }}/env_variables.txt ]; then\n  while IFS= read -r line; do\n    var_name=$(echo \"$line\" | cut -d'=' -f1)\n    if [ -z \"${!var_name}\" ]; then\n      export \"$line\"\n    fi\n  done \u003c tva_${{ github.run_id }}/env_variables.txt\nfi\npython3 tva_${{ github.run_id }}/src/gallery_validate.py . --output tva_${{ github.run_id }}/output.log ${{ steps.prepare_arguments.outputs.arguments }}\n","subFolder":"${{ inputs.workingDirectory }}","env":"ACTIONS_ID_TOKEN_REQUEST_URL=${{ steps.script.outputs.ID_TOKEN_URL }}\nACTIONS_ID_TOKEN_REQUEST_TOKEN=${{ steps.script.outputs.TOKEN }}\nCREATE_ROLE_FOR_USER=false\nAZURE_PRINCIPAL_TYPE=ServicePrincipal\nFORCE_TERRAFORM_REMOTE_STATE_CREATION=false\n"}},{"name":"Send output to main workflow","id":"send_output","if":"${{ inputs.useDevContainer == 'true' }}","uses":"devcontainers/ci@v0.3","with":{"runCmd":"cat tva_${{ github.run_id }}/output.log\n","subFolder":"${{ steps.reform_path.outputs.workingDirectory }}"}},{"name":"Install AZD","if":"${{ inputs.useDevContainer == 'false' }}","uses":"Azure/setup-azd@v2"},{"uses":"actions/setup-node@v4","if":"${{ inputs.useDevContainer == 'false' \u0026\u0026 inputs.validateTests == 'Playwright' }}","with":{"node-version":"lts/*"}},{"name":"Install playwright","if":"${{ inputs.useDevContainer == 'false' \u0026\u0026 inputs.validateTests == 'Playwright' }}","working-directory":"${{ inputs.workingDirectory }}","run":"echo \"Install playwright node...\"\nnpm install @playwright/test\necho \"Install playwright browsers...\"\nnpx playwright install --with-deps\n","shell":"bash"},{"name":"Log in with Azure (Federated Credentials)","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 inputs.useDevContainer == 'false' }}","run":"azd auth login --client-id \"${{ env.AZURE_CLIENT_ID }}\" --federated-credential-provider \"github\" --tenant-id \"${{ env.AZURE_TENANT_ID }}\"\n","shell":"bash","env":{"AZURE_CLIENT_ID":"${{ env.AZURE_CLIENT_ID }}","AZURE_TENANT_ID":"${{ env.AZURE_TENANT_ID }}"}},{"name":"Run validation","id":"run_validation","if":"${{ inputs.useDevContainer == 'false' }}","working-directory":"${{ inputs.workingDirectory }}","run":"pip install -r ${{ steps.reform_path.outputs.actionPath }}/requirements.txt\npython3 ${{ steps.reform_path.outputs.actionPath }}/src/gallery_validate.py . --output ${{ github.run_id }}-output.log ${{ steps.prepare_arguments.outputs.arguments }}\n","shell":"bash","env":{"CREATE_ROLE_FOR_USER":false,"AZURE_PRINCIPAL_TYPE":"ServicePrincipal"}},{"name":"Azure CLI script","id":"delete_resource_group","if":"${{ inputs.validateAzd == 'true' \u0026\u0026 env.targetScope == 'resourceGroup' }}","run":"az group delete --resource-group ${{ env.AZURE_RESOURCE_GROUP }} -y || echo \"Warning: Failed to delete resource group ${AZURE_RESOURCE_GROUP}, continuing...\"\n","shell":"bash","continue-on-error":true},{"id":"set_output","run":"if [[ ${{ inputs.useDevContainer }} == 'true' ]]; then\n  # Use here-document to safely handle special characters and long content\n  cat \u003c\u003c 'VALIDATION_OUTPUT_EOF' \u003e\u003e ${{ github.run_id }}-output.log\n${{ steps.send_output.outputs.runCmdOutput }}\nVALIDATION_OUTPUT_EOF\nfi\noutput_link=$(realpath ${{ github.run_id }}-output.log)\necho \"resultFile is $output_link\"\necho \"resultFile=$output_link\" \u003e\u003e $GITHUB_OUTPUT\n","working-directory":"${{ inputs.workingDirectory }}","shell":"bash"},{"name":"Write to workflow job summary","run":"SUMMARY=$(cat ${{ steps.set_output.outputs.resultFile }})\necho \"$SUMMARY\" \u003e\u003e $GITHUB_STEP_SUMMARY\n","shell":"bash","continue-on-error":true}]},"default_branch":"main","path":null},"repo_metadata":{"id":248824269,"uuid":"829884658","full_name":"microsoft/template-validation-action","owner":"microsoft","description":"This fully reconfigurable action, validates conformity with Azure Developer CLI template standards.","archived":false,"fork":false,"pushed_at":"2025-10-08T11:28:55.000Z","size":161,"stargazers_count":18,"open_issues_count":7,"forks_count":8,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-10T00:13:49.864Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microsoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-17T07:26:49.000Z","updated_at":"2025-10-08T11:27:40.000Z","dependencies_parsed_at":"2024-07-17T09:49:13.909Z","dependency_job_id":"12ebe071-95bd-4a1d-867f-dc1ebb4c2c75","html_url":"https://github.com/microsoft/template-validation-action","commit_stats":{"total_commits":35,"total_committers":3,"mean_commits":"11.666666666666666","dds":0.2571428571428571,"last_synced_commit":"34b22439cd5eb3ed363fb008b8ee2a1a9f1e124d"},"previous_names":["microsoft/template-validation-action"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/microsoft/template-validation-action","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microsoft","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002374,"owners_count":26083356,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"microsoft","name":"Microsoft","uuid":"6154722","kind":"organization","description":"Open source projects and samples from Microsoft","email":"opensource@microsoft.com","website":"https://opensource.microsoft.com","location":"Redmond, WA","twitter":"OpenAtMicrosoft","company":null,"icon_url":"https://avatars.githubusercontent.com/u/6154722?v=4","repositories_count":7413,"last_synced_at":"2025-10-10T00:07:37.919Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/microsoft","funding_links":[],"total_stars":3539276,"followers":104311,"following":0,"created_at":"2022-11-02T16:20:12.368Z","updated_at":"2025-10-10T00:07:37.919Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microsoft","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microsoft/repositories"},"tags":[{"name":"Latest","sha":"9f56864b1ddbfb56dd27f3cbc71a00750cdb9a18","kind":"commit","published_at":"2025-06-04T08:13:00.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/Latest","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/Latest","dependencies_parsed_at":"2025-06-09T04:30:23.898Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@Latest","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/Latest","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/Latest/manifests"},{"name":"v0.4.3","sha":"9f56864b1ddbfb56dd27f3cbc71a00750cdb9a18","kind":"commit","published_at":"2025-06-04T08:13:00.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.4.3","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.4.3","dependencies_parsed_at":"2025-06-09T04:30:23.821Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.4.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.3/manifests"},{"name":"v0.4.2","sha":"9f6d160a767656490a4525f64e64781eff519908","kind":"commit","published_at":"2025-04-10T03:13:42.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.4.2","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.4.2","dependencies_parsed_at":"2025-06-09T04:30:23.762Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.4.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.2/manifests"},{"name":"v0.4.1","sha":"f10394910f2a07a8c4e4ad2f26fefb3e554ba27e","kind":"commit","published_at":"2025-03-16T02:39:11.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.4.1","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.4.1","dependencies_parsed_at":"2025-06-09T04:30:23.761Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.1/manifests"},{"name":"v0.4.0","sha":"529ce9e60195eb74a0ab9e382faa72ba06e8c62a","kind":"commit","published_at":"2025-03-10T13:50:09.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.4.0","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.4.0","dependencies_parsed_at":"2025-06-09T04:30:23.953Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.4.0/manifests"},{"name":"v0.3.9","sha":"f9570142ee5d2e4e3ea2d7dc1918b1c9281dc125","kind":"commit","published_at":"2025-03-08T06:51:40.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.9","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.9","dependencies_parsed_at":"2025-06-09T04:30:23.837Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.9/manifests"},{"name":"v0.3.8","sha":"22cbb5a3ee476b269bd59a20470d859ebbaf7d21","kind":"commit","published_at":"2025-02-28T10:59:57.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.8","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.8","dependencies_parsed_at":"2025-06-09T04:30:23.911Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.8/manifests"},{"name":"v0.3.7","sha":"ebd535dcbdbed535de27a366adca12ee69cfa26d","kind":"commit","published_at":"2025-02-28T06:48:39.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.7","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.7","dependencies_parsed_at":"2025-06-09T04:30:23.914Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.7/manifests"},{"name":"v0.3.6","sha":"d9bf53ac4b55ddab6711148e4dd30a3488169ef3","kind":"commit","published_at":"2025-02-20T12:51:25.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.6","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.6","dependencies_parsed_at":"2025-06-09T04:30:23.821Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.6/manifests"},{"name":"v0.3.5","sha":"e1206403a3695eb48b4426e3ec8b1919101ac770","kind":"commit","published_at":"2024-11-28T09:26:31.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.5","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.5","dependencies_parsed_at":"2025-06-09T04:30:23.909Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.5/manifests"},{"name":"v0.3.4","sha":"5d280a4c441ca3cda35650efffa6b1ccefd1ada5","kind":"commit","published_at":"2024-11-22T06:17:56.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.4","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.4","dependencies_parsed_at":"2025-06-09T04:30:23.799Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.4/manifests"},{"name":"v0.3.3","sha":"a791212f0cce501a53ec0f1cbd5ab01b341daa86","kind":"commit","published_at":"2024-11-06T09:11:49.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.3","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.3","dependencies_parsed_at":"2025-06-09T04:30:23.752Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.3/manifests"},{"name":"0.3.3","sha":"a791212f0cce501a53ec0f1cbd5ab01b341daa86","kind":"commit","published_at":"2024-11-06T09:11:49.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/0.3.3","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/0.3.3","dependencies_parsed_at":"2025-06-09T04:30:23.802Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@0.3.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/0.3.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/0.3.3/manifests"},{"name":"v0.3.2","sha":"5aa002af3b4ff311b20fcf9794c421d1de390046","kind":"commit","published_at":"2024-10-28T09:18:57.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.2","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.2","dependencies_parsed_at":"2025-06-09T04:30:23.821Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.2/manifests"},{"name":"v0.3.1","sha":"f9fc6c5333fb2e5917e5d6797facd9ec059ddf9c","kind":"commit","published_at":"2024-10-25T09:56:59.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.1","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.1","dependencies_parsed_at":"2025-06-09T04:30:23.915Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.1/manifests"},{"name":"v0.3.0","sha":"b8f9f1fc84190025f345989ef87fc43ad3859035","kind":"commit","published_at":"2024-10-24T06:54:09.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.3.0","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.3.0","dependencies_parsed_at":"2025-06-09T04:30:23.856Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.3.0/manifests"},{"name":"v0.2.2","sha":"3bc8da450417d1715f7871e8503773e94e81df46","kind":"commit","published_at":"2024-10-17T04:19:26.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.2.2","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.2.2","dependencies_parsed_at":"2025-06-09T04:30:23.763Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.2.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.2/manifests"},{"name":"v0.2.1","sha":"1ddfe18019323bbc55bfbc8066293087c7e3b741","kind":"commit","published_at":"2024-10-15T04:58:01.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.2.1","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.2.1","dependencies_parsed_at":"2025-06-09T04:30:23.797Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.1/manifests"},{"name":"v0.2.0","sha":"f2683f388ca339660d28a84d306ea5cc9e159402","kind":"commit","published_at":"2024-10-14T05:15:11.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.2.0","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.2.0","dependencies_parsed_at":"2025-06-09T04:30:23.762Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.2.0/manifests"},{"name":"v0.1.0","sha":"db99454a3a075646d0c9074ecb0c52eadbd048bd","kind":"commit","published_at":"2024-09-24T11:14:14.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.1.0","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.1.0","dependencies_parsed_at":"2025-06-09T04:30:23.756Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.1.0/manifests"},{"name":"v0.0.4","sha":"f13262101f97bc4106acd8e1e4f879c06843abdb","kind":"commit","published_at":"2024-08-08T05:21:21.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.0.4","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.0.4","dependencies_parsed_at":"2025-06-09T04:30:23.857Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.4/manifests"},{"name":"v0.0.3","sha":"b784c04bb3f48c72cf80567650d9eabc8cbbd03d","kind":"commit","published_at":"2024-07-24T01:20:06.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.0.3","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.0.3","dependencies_parsed_at":"2025-06-09T04:30:23.706Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.3/manifests"},{"name":"v0.0.2","sha":"6b1b823b9a6a32c4c7e52f63ac454912a3b41963","kind":"commit","published_at":"2024-07-23T08:20:56.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.0.2","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.0.2","dependencies_parsed_at":"2025-06-09T04:30:23.708Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.2/manifests"},{"name":"v0.0.1","sha":"f91895dd5aa064acd5663067d598f4a81dccd589","kind":"commit","published_at":"2024-07-22T08:13:51.000Z","download_url":"https://codeload.github.com/microsoft/template-validation-action/tar.gz/v0.0.1","html_url":"https://github.com/microsoft/template-validation-action/releases/tag/v0.0.1","dependencies_parsed_at":"2025-06-09T04:30:23.708Z","dependency_job_id":null,"purl":"pkg:github/microsoft/template-validation-action@v0.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/tags/v0.0.1/manifests"}]},"repo_metadata_updated_at":"2025-10-11T15:13:26.111Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":34.34343434343434,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":17.17171717171717},"purl":"pkg:githubactions/microsoft/template-validation-action","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/actions/microsoft/template-validation-action","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/actions/microsoft/template-validation-action","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/actions/microsoft/template-validation-action/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2025-10-08T14:03:46.857Z","issues_count":22,"pull_requests_count":124,"avg_time_to_close_issue":684584.7777777778,"avg_time_to_close_pull_request":253205.76033057852,"issues_closed_count":9,"pull_requests_closed_count":121,"pull_request_authors_count":7,"issue_authors_count":10,"avg_comments_per_issue":0.18181818181818182,"avg_comments_per_pull_request":0.06451612903225806,"merged_pull_requests_count":116,"bot_issues_count":1,"bot_pull_requests_count":2,"past_year_issues_count":17,"past_year_pull_requests_count":54,"past_year_avg_time_to_close_issue":524618.3333333334,"past_year_avg_time_to_close_pull_request":335378.1886792453,"past_year_issues_closed_count":6,"past_year_pull_requests_closed_count":53,"past_year_pull_request_authors_count":6,"past_year_issue_authors_count":9,"past_year_avg_comments_per_issue":0.23529411764705882,"past_year_avg_comments_per_pull_request":0.14814814814814814,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":50,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/microsoft%2Ftemplate-validation-action/issues","maintainers":[{"login":"hund030","count":73,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/hund030"},{"login":"LianwMS","count":46,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/LianwMS"},{"login":"anfibiacreativa","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/anfibiacreativa"},{"login":"backwind1233","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/backwind1233"},{"login":"jmatthiesen","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jmatthiesen"},{"login":"murraysean","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/murraysean"}],"active_maintainers":[{"login":"LianwMS","count":31,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/LianwMS"},{"login":"hund030","count":17,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/hund030"},{"login":"anfibiacreativa","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/anfibiacreativa"},{"login":"jmatthiesen","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jmatthiesen"},{"login":"murraysean","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/murraysean"},{"login":"backwind1233","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/backwind1233"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/github%20actions/packages/microsoft%2Ftemplate-validation-action/codemeta","maintainers":[]}