Full Code of asdf-vm/asdf for AI

master 9d5f08b100fc cached
299 files
1.1 MB
383.1k tokens
415 symbols
1 requests
Download .txt
Showing preview only (1,229K chars total). Download the full file or copy to clipboard to get everything.
Repository: asdf-vm/asdf
Branch: master
Commit: 9d5f08b100fc
Files: 299
Total size: 1.1 MB

Directory structure:
gitextract_9qphyuig/

├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   ├── documentation.yaml
│   │   └── feature_request.yaml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── documentation.yml
│       ├── lint.yml
│       ├── release-build.yml
│       ├── release.yml
│       ├── semantic-pr.yml
│       └── tests.yml
├── .gitignore
├── .release-please-manifest.json
├── .tool-versions
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── asdf.elv
├── asdf.fish
├── asdf.nu
├── asdf.ps1
├── asdf.sh
├── ballad-of-asdf.md
├── bin/
│   └── private/
│       └── asdf-exec
├── defaults
├── docs/
│   ├── .gitattributes
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .tool-versions
│   ├── .vitepress/
│   │   ├── config.ts
│   │   ├── navbars.ts
│   │   ├── sidebars.ts
│   │   └── theme/
│   │       ├── custom.css
│   │       └── index.ts
│   ├── CNAME
│   ├── contribute/
│   │   ├── core.md
│   │   ├── documentation.md
│   │   ├── first-party-plugins.md
│   │   └── github-actions.md
│   ├── guide/
│   │   ├── getting-started-legacy.md
│   │   ├── getting-started.md
│   │   ├── introduction.md
│   │   └── upgrading-to-v0-16.md
│   ├── index.md
│   ├── ja-jp/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started-legacy.md
│   │   │   ├── getting-started.md
│   │   │   ├── introduction.md
│   │   │   ├── parts/
│   │   │   │   └── install-dependencies.md
│   │   │   └── upgrading-to-v0-16.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   ├── ko-kr/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started.md
│   │   │   └── introduction.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   ├── manage/
│   │   ├── commands.md
│   │   ├── configuration.md
│   │   ├── core.md
│   │   ├── dependencies.md
│   │   ├── plugins.md
│   │   └── versions.md
│   ├── more/
│   │   ├── community-projects.md
│   │   ├── faq.md
│   │   └── thanks.md
│   ├── package.json
│   ├── parts/
│   │   ├── install-dependencies-cmds.md
│   │   └── install-dependencies.md
│   ├── plugins/
│   │   └── create.md
│   ├── pt-br/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started.md
│   │   │   └── introduction.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   └── zh-hans/
│       ├── contribute/
│       │   ├── core.md
│       │   ├── documentation.md
│       │   ├── first-party-plugins.md
│       │   └── github-actions.md
│       ├── guide/
│       │   ├── getting-started-legacy.md
│       │   ├── getting-started.md
│       │   ├── introduction.md
│       │   └── upgrading-to-v0-16.md
│       ├── index.md
│       ├── manage/
│       │   ├── commands.md
│       │   ├── configuration.md
│       │   ├── core.md
│       │   ├── dependencies.md
│       │   ├── plugins.md
│       │   └── versions.md
│       ├── more/
│       │   ├── community-projects.md
│       │   ├── faq.md
│       │   └── thanks.md
│       ├── parts/
│       │   ├── install-dependencies-cmds.md
│       │   └── install-dependencies.md
│       └── plugins/
│           └── create.md
├── go.mod
├── go.sum
├── help.txt
├── internal/
│   ├── cli/
│   │   ├── cli.go
│   │   └── set/
│   │       ├── set.go
│   │       └── set_test.go
│   ├── completions/
│   │   ├── asdf.bash
│   │   ├── asdf.elvish
│   │   ├── asdf.fish
│   │   ├── asdf.nushell
│   │   ├── asdf.zsh
│   │   ├── completions.go
│   │   └── completions_test.go
│   ├── config/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   └── testdata/
│   │       ├── asdfrc
│   │       └── empty-asdfrc
│   ├── data/
│   │   ├── data.go
│   │   └── data_test.go
│   ├── exec/
│   │   ├── exec.go
│   │   ├── exec_test.go
│   │   └── testdata/
│   │       └── script/
│   │           ├── exec-env.txtar
│   │           └── exec-simple.txtar
│   ├── execenv/
│   │   ├── execenv.go
│   │   └── execenv_test.go
│   ├── execute/
│   │   ├── execute.go
│   │   ├── execute_test.go
│   │   └── testdata/
│   │       └── script
│   ├── git/
│   │   ├── git.go
│   │   └── git_test.go
│   ├── help/
│   │   ├── help.go
│   │   ├── help.txt
│   │   └── help_test.go
│   ├── hook/
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── info/
│   │   ├── info.go
│   │   └── info_test.go
│   ├── installs/
│   │   ├── installs.go
│   │   └── installs_test.go
│   ├── installtest/
│   │   └── installtest.go
│   ├── paths/
│   │   ├── paths.go
│   │   └── paths_test.go
│   ├── pluginindex/
│   │   ├── pluginindex.go
│   │   └── pluginindex_test.go
│   ├── plugins/
│   │   ├── plugins.go
│   │   └── plugins_test.go
│   ├── repotest/
│   │   └── repotest.go
│   ├── resolve/
│   │   ├── resolve.go
│   │   ├── resolve_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── shims/
│   │   ├── shims.go
│   │   ├── shims_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── toolversions/
│   │   ├── toolversions.go
│   │   └── toolversions_test.go
│   └── versions/
│       ├── testdata/
│       │   ├── asdfrc
│       │   ├── list-all-elixir
│       │   ├── list-all-python
│       │   ├── list-all-ruby
│       │   └── uninstall-asdfrc
│       ├── versions.go
│       └── versions_test.go
├── lib/
│   ├── commands/
│   │   ├── command-current.bash
│   │   ├── command-env.bash
│   │   ├── command-exec.bash
│   │   ├── command-export-shell-version.bash
│   │   ├── command-global.bash
│   │   ├── command-help.bash
│   │   ├── command-info.bash
│   │   ├── command-install.bash
│   │   ├── command-latest.bash
│   │   ├── command-list-all.bash
│   │   ├── command-list.bash
│   │   ├── command-local.bash
│   │   ├── command-plugin-add.bash
│   │   ├── command-plugin-list-all.bash
│   │   ├── command-plugin-list.bash
│   │   ├── command-plugin-push.bash
│   │   ├── command-plugin-remove.bash
│   │   ├── command-plugin-test.bash
│   │   ├── command-plugin-update.bash
│   │   ├── command-reshim.bash
│   │   ├── command-shim-versions.bash
│   │   ├── command-uninstall.bash
│   │   ├── command-update.bash
│   │   ├── command-version.bash
│   │   ├── command-where.bash
│   │   ├── command-which.bash
│   │   ├── reshim.bash
│   │   └── version_commands.bash
│   ├── functions/
│   │   ├── installs.bash
│   │   ├── plugins.bash
│   │   └── versions.bash
│   └── utils.bash
├── release-please-config.json
├── scripts/
│   ├── checkstyle.py
│   ├── install_dependencies.bash
│   ├── lint.bash
│   └── test.bash
├── staticcheck.conf
├── test/
│   ├── asdf_elvish.bats
│   ├── asdf_fish.bats
│   ├── asdf_nu.bats
│   ├── asdf_pwsh.bats
│   ├── asdf_sh.bats
│   ├── banned_commands.bats
│   ├── current_command.bats
│   ├── fixtures/
│   │   ├── dummy_broken_plugin/
│   │   │   └── bin/
│   │   │       ├── download
│   │   │       ├── install
│   │   │       └── list-all
│   │   ├── dummy_legacy_plugin/
│   │   │   └── bin/
│   │   │       ├── get-version-from-legacy-file
│   │   │       ├── install
│   │   │       ├── list-all
│   │   │       ├── list-legacy-filenames
│   │   │       └── parse-legacy-file
│   │   ├── dummy_plugin/
│   │   │   ├── LICENSE
│   │   │   └── bin/
│   │   │       ├── debug
│   │   │       ├── download
│   │   │       ├── get-version-from-legacy-file
│   │   │       ├── help.overview
│   │   │       ├── install
│   │   │       ├── latest-stable
│   │   │       ├── list-all
│   │   │       ├── list-legacy-filenames
│   │   │       ├── parse-legacy-file
│   │   │       ├── post-plugin-add
│   │   │       ├── post-plugin-update
│   │   │       └── pre-plugin-remove
│   │   ├── dummy_plugin_no_download/
│   │   │   ├── LICENSE
│   │   │   └── bin/
│   │   │       └── install
│   │   └── dummy_plugins_repo/
│   │       └── plugins/
│   │           ├── bar
│   │           ├── dummy
│   │           └── foo
│   ├── get_asdf_config_value.bats
│   ├── help_command.bats
│   ├── info_command.bats
│   ├── install_command.bats
│   ├── latest_command.bats
│   ├── list_command.bats
│   ├── non_existent_command.bats
│   ├── plugin_add_command.bats
│   ├── plugin_extension_command.bats
│   ├── plugin_list_all_command.bats
│   ├── plugin_remove_command.bats
│   ├── plugin_test_command.bats
│   ├── plugin_update_command.bats
│   ├── remove_command.bats
│   ├── reshim_command.bats
│   ├── setup_suite.bash
│   ├── shim_env_command.bats
│   ├── shim_exec.bats
│   ├── shim_versions_command.bats
│   ├── test_helpers.bash
│   ├── uninstall_command.bats
│   ├── update_command.bats
│   ├── utils.bats
│   ├── version_commands.bats
│   ├── where_command.bats
│   └── which_command.bats
├── tools.go
└── version.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.go]
indent_style = tab

[*.py]
indent_size = 4

[*.fish]
indent_size = 4

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .git-blame-ignore-revs
================================================
# Run shfmt on bash files
b8dc5f160447baabab9c69683824512ded577254

# fix: Remove == inside [ (#1421)
d81b81f9de2dc5961624464df04cef7cafae588c

# chore: Fix ShellCheck errors in tests
407a6696c0739f5e368543c4fc1b14e41458f177
998180e3625643644603504bea75e3bcc668465f
6f64aa8d847d53f272d30bcf2532937c02826080
b5e981cf1d9a37af17e48f6a871ff692720df810
28b348a041b3dfd1898eb0073aa1e83bdae70e4a
720fd172004c9f29045eb2ad19f35eba47ae31c7
ffa018763c10de63e6548372e7eaad2ae53643d6
90ead5ea0ae06418c58a47f4c7732797af5fe336


================================================
FILE: .gitattributes
================================================
## GITATTRIBUTES
#
# Details per file setting:
#   text    These files should be normalized (i.e. convert CRLF to LF).
#   binary  These files are binary and should be left untouched.
#
# Note that binary is a macro for -text -diff.
######################################################################

## AUTO-DETECT
##   Handle line endings automatically for files detected as
##   text and leave all files detected as binary untouched.
##   This will handle all files NOT defined below.
* text=auto

## SOURCE CODE
*.bats     text
*.css      text
*.htm      text
*.html     text
*.js       text
*.sh       text
*.bash     text
*.fish     text
*.elv      text
#### asdf/bin/* explicitly define as text
*asdf      text
*asdf-exec text
*_asdf     text
#### asdf/test/fixtures/* should be covered by * text=auto on L14

## DOCKER
*.dockerignore    text
Dockerfile        text

## DOCUMENTATION
*.markdown   text
*.md         text
*.mdwn       text
*.mdown      text
*.mkd        text
*.mkdn       text
*.mdtxt      text
*.mdtext     text
*.txt        text
AUTHORS      text
CHANGELOG    text
CHANGES      text
CONTRIBUTING text
COPYING      text
copyright    text
*COPYRIGHT*  text
INSTALL      text
license      text
LICENSE      text
NEWS         text
readme       text
*README*     text
TODO         text

## CONFIGS
.editorconfig  text
.gitattributes text
.gitconfig     text
*.yaml         text
*.yml          text


================================================
FILE: .github/CODEOWNERS
================================================
# Default owners for all the code in this repo
* @asdf-vm/core


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug Report
description: Create a report to help us improve
title: "bug: "
labels: [bug]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!
  - type: textarea
    id: description
    attributes:
      label: Describe the Bug
      description: A clear and concise description of what the bug is.
    validations:
      required: true
  - type: textarea
    id: reproduction
    attributes:
      label: Steps to Reproduce
      description: Tell us what actions you performed before the issue occurred
      placeholder: |
        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error
    validations:
      required: true
  - type: textarea
    id: expected
    attributes:
      label: Expected Behaviour
      description: Tell us what should have happened?
    validations:
      required: true
  - type: textarea
    id: actual
    attributes:
      label: Actual Behaviour
      description: Tell us what happened instead
    validations:
      required: true
  - type: textarea
    id: environment
    attributes:
      label: Environment
      description: Copy the output of `asdf info` here
      render: shell
    validations:
      required: true
  - type: textarea
    id: plugins
    attributes:
      label: asdf plugins affected (if relevant)
      description: The plugins you list here should appear in the list from `asdf info`


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# Force users to use one of our predefined issue templates
blank_issues_enabled: false
contact_links:
  - name: Question (StackOverflow)
    url: https://stackoverflow.com/questions/tagged/asdf-vm
    about: Ask new or browse existing questions on StackOverflow.


================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yaml
================================================
name: Documentation
description: Suggest a documentation improvements for this project
labels: "documentation"
body: 
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to help improve our docs!
  - type: textarea
    id: problem
    attributes:
      label: How can we improve the documentation?
      description: Please provide a clear and concise description of the problem. The more information you can provide here, the better.
      placeholder: The documentation can be improved by...
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
name: Feature Request
description: Suggest an idea for this project
labels: "enhancement"
body: 
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to request this feature!
  - type: textarea
    id: problem
    attributes:
      label: Is your feature request related to a problem? Please describe
      description: Please provide a clear and concise description the problem this feature would solve. The more information you can provide here, the better.
      placeholder: I'm always frustrated when...
    validations:
      required: true
  - type: textarea
    id: solution
    attributes:
      label: Describe the proposed solution
      description: Please provide a clear and concise description of what you would like to happen.
      placeholder: I would like to see...
    validations:
      required: true
  - type: textarea
    id: alternatives
    attributes:
      label: "Describe similar `asdf` features and why they are not sufficient"
      description: "Describe asdf features you tried to use to accomplish what you wanted. Explain why they are insufficient for the task you were trying to accomplish."
    validations:
      required: true
  - type: textarea
    id: workarounds
    attributes:
      label: "Describe other workarounds you've considered"
      description: "A clear and concise description of any alternative solutions or features you've considered."
    validations:
      required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# Summary

<!-- Provide a general description of the code changes in your pull request. -->

Fixes: List issue numbers here

## Other Information

<!-- If there is anything else that is relevant to your pull request include that information here. Thank you for contributing to asdf! -->


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  # Maintain dependencies for GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    reviewers:
      - "jthegedus"
      - "stratus3d"
  # Maintain dependencies for npm used in Documentation site
  - package-ecosystem: "npm"
    directory: "/docs"
    schedule:
      interval: "monthly"
    reviewers:
      - "jthegedus"
    groups:
      docs:
        patterns:
          - "*"


================================================
FILE: .github/workflows/documentation.yml
================================================
name: Documentation

on:
  # trigger deployment on push to master branch when changes to docs/**
  push:
    paths:
      - "docs/**"
    branches:
      - master
  # trigger deployment manually
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: docs/

    steps:
      - uses: actions/checkout@v6
        with:
          # fetch all commits to get last updated time or other git log info
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "20"

      - name: Cache dependencies
        uses: actions/cache@v5
        id: npm-cache
        with:
          path: |
            **/node_modules
          key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-

      - name: Install dependencies
        if: steps.npm-cache.outputs.cache-hit != 'true'
        run: npm install

      - name: Build VitePress site
        run: npm run build

      - name: Bundle CNAME with site dist
        run: cp CNAME .vitepress/dist

      - name: Deploy to GitHub Pages
        uses: crazy-max/ghaction-github-pages@v5
        with:
          # deploy to gh-pages branch
          target_branch: gh-pages
          # deploy the default output dir of VitePress
          build_dir: docs/.vitepress/dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/lint.yml
================================================
name: Lint

on:
  push:
    branches:
      - master
  pull_request:

env:
  PYTHON_MIN_VERSION: "3.13.1"

jobs:
  asdf-bash:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: asdf-vm/actions/install@v3
      - uses: actions/setup-python@v6
        with:
          python-version: ${{ env.PYTHON_MIN_VERSION }}
      - run: scripts/install_dependencies.bash
      - run: scripts/lint.bash --check

  asdf-golang:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24.9'
      - name: Install dependencies
        run: go get ./...
      - name: Run 'gofumpt'
        run: go run mvdan.cc/gofumpt -l -w .
      - name: Check format
        run: '[ -z "$(gofmt -l ./...)" ]'
      - name: Run 'revive'
        run: go run github.com/mgechev/revive -set_exit_status ./...
      - name: Vet
        run: go vet ./...
      - name: Lint
        run: go run honnef.co/go/tools/cmd/staticcheck -tests -show-ignored ./...
      - name: Build
        run: go build -v ./...

  actions:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Check workflow files
        uses: docker://rhysd/actionlint:1.6.24
        with:
          args: -color


================================================
FILE: .github/workflows/release-build.yml
================================================
name: Build Binaries for Release

on:
  release:
    types: [published]
  workflow_dispatch:
    inputs:
      tag:
        description: 'Tag to build binaries for'
        required: true
        type: string

permissions:
  contents: write
  packages: write

jobs:
  build:
    name: Build release binaries
    runs-on: ubuntu-latest
    strategy:
      matrix:
        # windows isn't working on windows right now, add it to this list once
        # I fix the code.
        goos: [linux, darwin]
        goarch: ["386", amd64, arm64]
        exclude:
          - goarch: "386"
            goos: darwin
          #- goarch: arm64
          #  goos: windows
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Build Go binaries
        uses: wangyoucao577/go-release-action@v1
        with:
          pre_command: "export CGO_ENABLED=0"
          github_token: ${{ secrets.GITHUB_TOKEN }}
          goos: ${{ matrix.goos }}
          goarch: ${{ matrix.goarch }}
          goversion: "1.24.9"
          binary_name: "asdf"
          project_path: ./cmd/asdf
          release_tag: ${{ github.event.release.tag_name || inputs.tag }}
          release_name: ${{ github.event.release.tag_name || inputs.tag }}
          ldflags: -s -X main.version=${{ github.event.release.tag_name || inputs.tag }}


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    branches:
      - master

permissions:
  contents: write
  pull-requests: write

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: googleapis/release-please-action@v4
        name: create release
        with:
          token: ${{ secrets.ASDF_WORKFLOW_TOKEN }}
          config-file: release-please-config.json
          manifest-file: .release-please-manifest.json


================================================
FILE: .github/workflows/semantic-pr.yml
================================================
name: Lint

on:
  pull_request_target:
    types:
      - opened
      - edited
      - synchronize

jobs:
  semantic-pr:
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v6.1.1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          scopes: |
            # The scope for all the Golang rewrite commits
            golang-rewrite
            # A list of all used scopes can be computed by running this command:
            #
            # git log --pretty=format:%s | rg '^[^: ]*\(([^):]*)\).*' -r '$1' | sort | uniq
            #
            # We only want to allow a limited set of scopes going forward, so
            # the list of valid scopes has been pared down here.
            docs
            website
            plugin
            completions
            deps


================================================
FILE: .github/workflows/tests.yml
================================================
name: Test

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  detect-changes:
    runs-on: ubuntu-latest
    # Set job outputs to values from filter step
    outputs:
      documentation: ${{ steps.filter.outputs.documentation }}
      cli: ${{ steps.filter.outputs.cli }}
      go: ${{ steps.filter.outputs.go }}
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            documentation:
              - '.github/workflows/**'
              - 'docs/**'
            cli:
              - '.github/workflows/**'
              - 'bin/**'
              - 'lib/**'
              - 'scripts/**'
              - 'test/**'
              - '.tool-versions'
              - 'asdf.*'
              - 'defaults'
              - 'help.txt'
            go:
              - '**.go'
              - 'go.mod'
              - 'go.sum'

  test-golang:
    needs: detect-changes
    if: ${{ needs.detect-changes.outputs.go == 'true' || needs.detect-changes.outputs.cli == 'true' }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v6
      - name: Setup Go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24.9'
      - run: scripts/install_dependencies.bash
      - name: Install dependencies
        run: go get ./...
      - name: Run Go tests
        run: go test -coverprofile=/tmp/coverage.out  -bench= -race ./...

  # Because I changed the test helper code Bash tests now fail. I removed them
  # from here to get passing checks. They can be added back at a later time if
  # I fix the test helper.

  documentation-site:
    needs: detect-changes
    # only run if
    # - changes to documentation
    # - pull_request (workflows/docs.yml deploys on main branch)
    if: ${{ github.event_name == 'pull_request' && needs.detect-changes.outputs.documentation == 'true' }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          # fetch all commits to get git log info for Vuepress
          fetch-depth: 0

      # only run steps past here if changes to docs/** directory
      - uses: actions/setup-node@v6
        with:
          node-version: "18"

      - uses: actions/cache@v5
        id: npm-cache
        with:
          path: |
            docs/node_modules
          key: ${{ runner.os }}-npm-${{ hashFiles('docs/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-

      - name: Install dependencies
        if: steps.npm-cache.outputs.cache-hit != 'true'
        working-directory: docs/
        run: npm install

      - name: Check errors by building Documentation site
        working-directory: docs/
        run: npm run build


================================================
FILE: .gitignore
================================================
/installs
/downloads
/shims
repository
.vagrant
keyrings
/tmp

dist/

# ignore build binary
asdf


================================================
FILE: .release-please-manifest.json
================================================
{
  ".": "0.18.1"
}


================================================
FILE: .tool-versions
================================================
golang 1.24.9
bats 1.8.2
shellcheck 0.10.0
shfmt 3.6.0


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## [0.18.1](https://github.com/asdf-vm/asdf/compare/v0.18.0...v0.18.1) (2026-03-04)


### Bug Fixes

* Only show already installed versions in shell completion for the asdf set command ([#2172](https://github.com/asdf-vm/asdf/pull/2172)) ([c3910d7](https://github.com/asdf-vm/asdf/commit/c3910d73776980e649605205352334c09c8c85b1))
* set LANG=C for locale-dependent tests ([#2197](https://github.com/asdf-vm/asdf/issues/2197)) ([2423f6d](https://github.com/asdf-vm/asdf/commit/2423f6da496b5b1955ce9cb19d524dc0a7b88e26))

## [0.18.0](https://github.com/asdf-vm/asdf/compare/v0.17.0...v0.18.0) (2025-06-07)


### Features

* `asdf list` exit with status code of 0 when no versions installed ([#2116](https://github.com/asdf-vm/asdf/issues/2116)) ([e7d5289](https://github.com/asdf-vm/asdf/commit/e7d5289c57894ebbc0f966cb91794efd970377af))


### Bug Fixes

* correct flag handling in commands run by `asdf exec` ([#2115](https://github.com/asdf-vm/asdf/issues/2115)) ([d6cd693](https://github.com/asdf-vm/asdf/commit/d6cd6930cff8e7159cb2f1a57b23bd0ec1faa6ac))
* only return version starting with number when no filter is supplied ([#2120](https://github.com/asdf-vm/asdf/issues/2120)) ([cf29b51](https://github.com/asdf-vm/asdf/commit/cf29b5136bbe481ae3803dbdb78086c808eeef7a))
* print all error output to stderr when shim can't be resolved ([#2109](https://github.com/asdf-vm/asdf/issues/2109)) ([c9049ea](https://github.com/asdf-vm/asdf/commit/c9049ea2fd09fc7958fb1a5a5b44e0670740465b))
* rename tool version filename environment variable for clarity ([#2101](https://github.com/asdf-vm/asdf/issues/2101)) ([e3d6014](https://github.com/asdf-vm/asdf/commit/e3d6014419296281c4156fc65a3e02bb542495a2))
* upgrade urfave/cli to version 3 ([#2105](https://github.com/asdf-vm/asdf/issues/2105)) ([392d09a](https://github.com/asdf-vm/asdf/commit/392d09a8b263a5ef18fd05f27312717bf9baa292))

## [0.17.0](https://github.com/asdf-vm/asdf/compare/v0.16.7...v0.17.0) (2025-05-19)


### Features

* **golang-rewrite:** add support for shim templates resolution ([#2076](https://github.com/asdf-vm/asdf/issues/2076)) ([a3bccea](https://github.com/asdf-vm/asdf/commit/a3bccea5c9b64bf81675efaa5c76d6eb367fd37f))
* log failure to add plugin in "plugin test" ([#2059](https://github.com/asdf-vm/asdf/issues/2059)) ([92de803](https://github.com/asdf-vm/asdf/commit/92de803ff15f1a887f031d570ae6404f008d829d))
* switch back to native git client ([#1998](https://github.com/asdf-vm/asdf/issues/1998)) ([1efa2bb](https://github.com/asdf-vm/asdf/commit/1efa2bbd04b833d0435a15bddd882beb973cfc2d))


### Bug Fixes

* address linter warning ([67581cf](https://github.com/asdf-vm/asdf/commit/67581cf030d4eb39f261acac5e861444fedad7f6))
* correct intersection logic in `shims.FindExecutable` function so ordering of multiple versions is preserved ([#2063](https://github.com/asdf-vm/asdf/issues/2063)) ([083f20a](https://github.com/asdf-vm/asdf/commit/083f20aa3e21cad594b35972ca570eb47e389899))
* correct output of install command when system or path version set ([#2097](https://github.com/asdf-vm/asdf/issues/2097)) ([82d67e3](https://github.com/asdf-vm/asdf/commit/82d67e3242b0ac4d01cccd9712daaae574ce6eca))
* ensures output always ends with a newline when printed ([#2098](https://github.com/asdf-vm/asdf/issues/2098)) ([6f4837e](https://github.com/asdf-vm/asdf/commit/6f4837ea9b82b442fdfa78c3bb315b088e60dc9c))
* handle tilde in env vars ([#2092](https://github.com/asdf-vm/asdf/issues/2092)) ([6da599a](https://github.com/asdf-vm/asdf/commit/6da599a93ad2655c2bf061c038da330ee4413985))
* remove default error action from plugin command ([#2027](https://github.com/asdf-vm/asdf/issues/2027)) ([c376481](https://github.com/asdf-vm/asdf/commit/c376481cb4d1fa1e67dd9ef326381c07c935151d))
* remove unused ForcePrepend option from Go code ([#2089](https://github.com/asdf-vm/asdf/issues/2089)) ([49e9f33](https://github.com/asdf-vm/asdf/commit/49e9f330a719de6bd599b84c90b93e7d7358043c))
* set correct version for go install and make builds ([#2077](https://github.com/asdf-vm/asdf/issues/2077)) ([4c73527](https://github.com/asdf-vm/asdf/commit/4c73527d6323ca41d8ea9a9e78a8db49f3794d16))

## [0.16.7](https://github.com/asdf-vm/asdf/compare/v0.16.6...v0.16.7) (2025-03-25)


### Bug Fixes

* remove comment from first line zsh completion output ([#2035](https://github.com/asdf-vm/asdf/issues/2035)) ([#2037](https://github.com/asdf-vm/asdf/issues/2037)) ([74d7b17](https://github.com/asdf-vm/asdf/commit/74d7b17a1cc9f640cf0f5134416d1cf7a56fe19f))

## [0.16.6](https://github.com/asdf-vm/asdf/compare/v0.16.5...v0.16.6) (2025-03-21)


### Bug Fixes

* correct ASDF_INSTALL_* envvar unset test ([#2006](https://github.com/asdf-vm/asdf/issues/2006)) ([6fbf94a](https://github.com/asdf-vm/asdf/commit/6fbf94a75b8e045eea53038182e376b21a6947e4))
* correct concurrency to align with documentation ([#2014](https://github.com/asdf-vm/asdf/issues/2014)) ([807ea38](https://github.com/asdf-vm/asdf/commit/807ea3883139da48300e72931680431aa35e593d))
* correct handling of `ASDF_FORCE_PREPEND` environment variable ([#2011](https://github.com/asdf-vm/asdf/issues/2011)) ([43a84a0](https://github.com/asdf-vm/asdf/commit/43a84a024faeacb04044c9e2cf20ccbe87ea4263))
* improve zsh completion suggestions ([#2022](https://github.com/asdf-vm/asdf/issues/2022)) ([b1cf58d](https://github.com/asdf-vm/asdf/commit/b1cf58d2bd01c1c2c3662cca6bd8927d68a37258))
* remove filtering from latest-stable call ([#2032](https://github.com/asdf-vm/asdf/issues/2032)) ([6fcdcdf](https://github.com/asdf-vm/asdf/commit/6fcdcdf6df693fec6d643fab54e2d520bd5b539b))
* remove install directory for version when install fails ([#2024](https://github.com/asdf-vm/asdf/issues/2024)) ([932ac46](https://github.com/asdf-vm/asdf/commit/932ac468b7c24c2adef90a293a1f7280a0074cc4))

## [0.16.5](https://github.com/asdf-vm/asdf/compare/v0.16.4...v0.16.5) (2025-03-04)


### Bug Fixes

* always propagate env variables when executing commands ([#1982](https://github.com/asdf-vm/asdf/issues/1982)) ([80265a8](https://github.com/asdf-vm/asdf/commit/80265a8eecedc623cb8cf5cca18ae563e9d4f94c))
* build static binary to improve portability ([#1993](https://github.com/asdf-vm/asdf/issues/1993)) ([45047a6](https://github.com/asdf-vm/asdf/commit/45047a6c451599e718f996fdadbdcea3ecf683fd))
* correct exit status when sub-command does not exist ([#1991](https://github.com/asdf-vm/asdf/issues/1991)) ([3dd0dd3](https://github.com/asdf-vm/asdf/commit/3dd0dd3b475d1c4ddcb6d76248a988be5cceef51)), closes [#1928](https://github.com/asdf-vm/asdf/issues/1928)
* latest version returns latest version ([#1996](https://github.com/asdf-vm/asdf/issues/1996)) ([0ceac7a](https://github.com/asdf-vm/asdf/commit/0ceac7af8c126980901caba4d8daa80900819451))
* preserve files untracked by Git on plugin update ([#1995](https://github.com/asdf-vm/asdf/issues/1995)) ([d4d8db0](https://github.com/asdf-vm/asdf/commit/d4d8db035d9f349bfed513af6976734db18e2c14))
* set correct env vars on recursive calls ([#1989](https://github.com/asdf-vm/asdf/issues/1989)) ([97a91cc](https://github.com/asdf-vm/asdf/commit/97a91cc8d01bda0896a50dff50a162e87fd61e57))
* simplify env vars parsing ([#1988](https://github.com/asdf-vm/asdf/issues/1988)) ([8990b6b](https://github.com/asdf-vm/asdf/commit/8990b6b4ae3c9754f3764289f0d7cf410815d29d)), closes [#1986](https://github.com/asdf-vm/asdf/issues/1986)

## [0.16.4](https://github.com/asdf-vm/asdf/compare/v0.16.3...v0.16.4) (2025-02-19)


### Bug Fixes

* Add a newline delimiter when suggesting versions to install ([#1972](https://github.com/asdf-vm/asdf/issues/1972)) ([38bea71](https://github.com/asdf-vm/asdf/commit/38bea7145495a53c1a6fbad0542a32a4e7937e91))
* correct version resolution order to restore legacy file fallback behavior ([#1956](https://github.com/asdf-vm/asdf/issues/1956)) ([6696d47](https://github.com/asdf-vm/asdf/commit/6696d4702937442842a3643fab31d21a7fd0208f))
* support environment variables with equals sign and newlines in value ([#1977](https://github.com/asdf-vm/asdf/issues/1977)) ([1acf082](https://github.com/asdf-vm/asdf/commit/1acf0824ccfd33f118cb7440970df9e43899a1c1))

## [0.16.3](https://github.com/asdf-vm/asdf/compare/v0.16.2...v0.16.3) (2025-02-17)


### Bug Fixes

* add missing version command ([#1931](https://github.com/asdf-vm/asdf/issues/1931)) ([5339c41](https://github.com/asdf-vm/asdf/commit/5339c413d2fd77e971ed9b7621f0454b96fe3a0d))
* correct formatting of version in "already installed" error message ([df5e283](https://github.com/asdf-vm/asdf/commit/df5e283fb74a63faecd9ab234af1f0c24f1afdcd))
* correct typo in `Upgrading to 0.16.0` documentation ([#1938](https://github.com/asdf-vm/asdf/issues/1938)) ([7e8e5f6](https://github.com/asdf-vm/asdf/commit/7e8e5f60d13b0672e65982e21d7dc864246be8eb))
* don't error if version already installed ([06f8990](https://github.com/asdf-vm/asdf/commit/06f89907b2002db0e53b9bb2acd8ad11935f051c))
* pass environment variables through to `exec-env` callback ([9e6b559](https://github.com/asdf-vm/asdf/commit/9e6b5594080acd4208427505d9018123f1fb1f36))
* repair invalid fish shell completion code ([#1936](https://github.com/asdf-vm/asdf/issues/1936)) ([8388f99](https://github.com/asdf-vm/asdf/commit/8388f992e9be7f21313d8c8e363b43e82e44f207))
* return no error from shims.RemoveAll when shims dir missing ([#1967](https://github.com/asdf-vm/asdf/issues/1967)) ([45c31c9](https://github.com/asdf-vm/asdf/commit/45c31c9761f62a45896f6e45707a60fd0c1f4111))

## [0.16.2](https://github.com/asdf-vm/asdf/compare/v0.16.1...v0.16.2) (2025-02-08)


### Bug Fixes

* correct Bash completion ([#1886](https://github.com/asdf-vm/asdf/issues/1886)) ([fdb1bc7](https://github.com/asdf-vm/asdf/commit/fdb1bc793a06263a0eac8818c14498e23906108a))
* improve completions for Zsh and Fish ([#1912](https://github.com/asdf-vm/asdf/issues/1912)) ([2f806de](https://github.com/asdf-vm/asdf/commit/2f806de830655d9146d25663d74e3fceedcc300f))
* correct help for asdf set command ([#1920](https://github.com/asdf-vm/asdf/issues/1920)) ([554b4ea](https://github.com/asdf-vm/asdf/commit/554b4eaf351c08fed2261715308320838f0c5afb))
* correct help for asdf set command in Bash completion ([#1921](https://github.com/asdf-vm/asdf/issues/1921)) ([63e7dca](https://github.com/asdf-vm/asdf/commit/63e7dcaeae46d6d43ae63db9bf635e227a6ba944))
* improve Zsh completion suggestions ([#1925](https://github.com/asdf-vm/asdf/issues/1925)) ([e190624](https://github.com/asdf-vm/asdf/commit/e190624fa82fb2caf4d56521232de4e873b63118))
* run go tests when go.mod or go.sum change ([#1917](https://github.com/asdf-vm/asdf/issues/1917)) ([6e4a7b5](https://github.com/asdf-vm/asdf/commit/6e4a7b5ad3d6abdbb98faa383bc41643b35ef6bf))
* fix typo ([#1897](https://github.com/asdf-vm/asdf/issues/1897)) ([98ffa86](https://github.com/asdf-vm/asdf/commit/98ffa861e9b64a2e029a0ed26205bfcc81838180))
* update make utils script to set correct version ([892736b](https://github.com/asdf-vm/asdf/commit/892736bf76ac37487cfca75d2cfcc57d5cdec913))
* update urfave/cli to fix cmd output ([#1914](https://github.com/asdf-vm/asdf/issues/1914)) ([3525e9e](https://github.com/asdf-vm/asdf/commit/3525e9ed4edb05f15a15f00378f5336ef29aa2f4))

## [0.16.1](https://github.com/asdf-vm/asdf/compare/v0.16.0...v0.16.1) (2025-02-05)


### Bug Fixes

* correct SliceToMap environment variable parsing function ([#1879](https://github.com/asdf-vm/asdf/issues/1879)) ([e63aec6](https://github.com/asdf-vm/asdf/commit/e63aec61020a907fe5960d74b6d3dbf229214ae0))
* remove old hyphenated command from help ([1f0296a](https://github.com/asdf-vm/asdf/commit/1f0296a3d11a9df0d300ca61f59d097750ab6f1c))
* replace reference to removed subcommands ([#1868](https://github.com/asdf-vm/asdf/issues/1868)) ([0785d35](https://github.com/asdf-vm/asdf/commit/0785d35263b2bd5ad570ee6706e1b38d8dd05422))
* revert change to old Bash help text ([de019fd](https://github.com/asdf-vm/asdf/commit/de019fde849d2f3a258b3f40e5b2004d1973c804))
* use version in home dir when no version found in root dir ([#1883](https://github.com/asdf-vm/asdf/issues/1883)) ([5ae5f76](https://github.com/asdf-vm/asdf/commit/5ae5f769f1042add6219e98633063e76a03e12b9))

## [0.16.0](https://github.com/asdf-vm/asdf/compare/v0.15.0...v0.16.0) (2025-01-30)


### Features

* **Rewrite asdf in Golang** The rewrite in Go was spread across 88 pull requests that are all included in this release. The primary goal of the rewrite was to create a codebase that was faster, simpler and easier to maintain. The rewrite tries to maintain feature parity with the previous version. However, a number of breaking changes were introduced. Some of these were due to the change of language, a few out of a desire to simplify the code, and some to improve the user experience. For the full list of breaking changes and the upgrade guide visit the [Upgrading to 0.16.0 page](https://asdf-vm.com/guide/upgrading-to-v0-16.html#breaking-changes) on the asdf website. **It is highly recommended that you read this guide before upgrading**.

A warning has also been added to the Bash code for asdf in 0.16.0. anyone trying to use asdf as they did in version 0.15.0 and earlier will get a warning message instructing them to follow the upgrade guide.

The full list of pull requests and merge commits for this rewrite are listed below.

   ([3a9f539](https://github.com/asdf-vm/asdf/commit/3a9f539aa092fa7c043661232f8caa154e861c6f)) ([f41ce90](https://github.com/asdf-vm/asdf/commit/f41ce90dc4410da7bb76c5ccf73147759716be07)) ([#1833](https://github.com/asdf-vm/asdf/issues/1833)) ([4f9a5d3](https://github.com/asdf-vm/asdf/commit/4f9a5d3d314bc6a8abd5e14d9c38472055033fa7)) ([d06d71f](https://github.com/asdf-vm/asdf/commit/d06d71f9f6b2fd6069c6fbf27bc7b13b8b0ec5c2)) ([7d5281a](https://github.com/asdf-vm/asdf/commit/7d5281a8a9151d57113ea0dd5d2fea2b07f55228)) ([8ad3472](https://github.com/asdf-vm/asdf/commit/8ad3472abc64d8a07589a16096142b52aeae18af)) ([b40beb6](https://github.com/asdf-vm/asdf/commit/b40beb6039b031d350bd1c621f34d90f23f72765)) ([b23e5a3](https://github.com/asdf-vm/asdf/commit/b23e5a320fd231c4fa55baa3b32d90b55a6ff4f1)) ([bc05110](https://github.com/asdf-vm/asdf/commit/bc0511015920acd8421bbccaead86e2badf0c2ae)) ([477e9d5](https://github.com/asdf-vm/asdf/commit/477e9d57293b8c99bcb184cfc72e064f4b68eda0)) ([6d708b2](https://github.com/asdf-vm/asdf/commit/6d708b280720d2144ae7976229fd5630eeb31eaf)) ([572ed07](https://github.com/asdf-vm/asdf/commit/572ed07f2bdb31f04a7244d1d127594ef9922db0)) ([19a0597](https://github.com/asdf-vm/asdf/commit/19a0597502ebecb0dfe2946fe19d9f9da3d57a18)) ([b33ab64](https://github.com/asdf-vm/asdf/commit/b33ab6463c7825a0d03f82f430cfad18a1e941c8)) ([b966ca6](https://github.com/asdf-vm/asdf/commit/b966ca66271f1be81abee751dec929f97cadfab4)) ([8db188a](https://github.com/asdf-vm/asdf/commit/8db188a702b1a64812fbb6e5832ec74ed47dfb34)) ([3fd4a83](https://github.com/asdf-vm/asdf/commit/3fd4a839757a2646054f2d86f487731e0715eeaa)) ([09d06ff](https://github.com/asdf-vm/asdf/commit/09d06ff125107c19a24043e52cf60b378b8b4c3b)) ([d2afb85](https://github.com/asdf-vm/asdf/commit/d2afb85eb80bce85e79c9c0d91ad3103a7f985f0)) ([778ab34](https://github.com/asdf-vm/asdf/commit/778ab34a6f47ac913a0ebc5035d74bfbb3744ebe)) ([9f09f78](https://github.com/asdf-vm/asdf/commit/9f09f78ec06b28bd90d7cdd42762acc1e18011c7)) ([6568891](https://github.com/asdf-vm/asdf/commit/65688915a5d6816b15acf7332d22920d10e8d99a)) ([771f184](https://github.com/asdf-vm/asdf/commit/771f18493fcc8684f02373b2f03750937016f51a)) ([8313ebc](https://github.com/asdf-vm/asdf/commit/8313ebca2d2305b8e176286ae0a43b0359d78059)) ([be52d8f](https://github.com/asdf-vm/asdf/commit/be52d8f39c3aa253496c5469963cd0ecc995d19c)) ([c2e5ee6](https://github.com/asdf-vm/asdf/commit/c2e5ee652532f54aaed7e93796f7239a2a333446)) ([9097696](https://github.com/asdf-vm/asdf/commit/9097696a4fa5ad7efeb383509ecce16125df3cbf)) ([ad0907a](https://github.com/asdf-vm/asdf/commit/ad0907a74df1edf42e7c72ecba96ea52e3de2bcf)) ([2b02f51](https://github.com/asdf-vm/asdf/commit/2b02f51fa1acb2090713f6dfa70903281d28735a)) ([c480044](https://github.com/asdf-vm/asdf/commit/c4800443bd805afd1878891c56108366f3faba0c)) ([26b91aa](https://github.com/asdf-vm/asdf/commit/26b91aa8288787e552dbc50a1c2234ad2264205c)) ([202cdae](https://github.com/asdf-vm/asdf/commit/202cdae831b4909280e0f19ff77bbe4acaec36b4)) ([325cd33](https://github.com/asdf-vm/asdf/commit/325cd3334b3898cbd084ac3b3686458cc92b613e)) ([07b5813](https://github.com/asdf-vm/asdf/commit/07b5813566431ce9f6245e884fe86dd13ad1c195)) ([822e14c](https://github.com/asdf-vm/asdf/commit/822e14c561ab1df74f091bb46bcb340ae9c2bda6)) ([53cd454](https://github.com/asdf-vm/asdf/commit/53cd4544741cab2e58ca7ea8aa36c9c28890b0a1)) ([9f6a65f](https://github.com/asdf-vm/asdf/commit/9f6a65f5dda41d25a9e894ff6a8482810fd6dec8)) ([bd7ab9a](https://github.com/asdf-vm/asdf/commit/bd7ab9ae0844c4c9e41760661a555bab13509752)) ([b6ec89f](https://github.com/asdf-vm/asdf/commit/b6ec89f95f6afedbbdb2daaf4c3d2f67f50f0cf1)) ([162cb8e](https://github.com/asdf-vm/asdf/commit/162cb8eceed53f58c20c547d29ca8068e411ce64)) ([d94bace](https://github.com/asdf-vm/asdf/commit/d94baceb184b8a501a8eb1fd2cd33ca75bf962d9)) ([e7df5ff](https://github.com/asdf-vm/asdf/commit/e7df5ff3253b6caba8ceef6b0754d17fcb765a9b)) ([369beeb](https://github.com/asdf-vm/asdf/commit/369beebab9c80197eb877660add870c0a6be5bda)) ([#1829](https://github.com/asdf-vm/asdf/issues/1829)) ([f68b29b](https://github.com/asdf-vm/asdf/commit/f68b29bd508cfe993d4926377891d0a3e902f2ef)) ([26a3815](https://github.com/asdf-vm/asdf/commit/26a38159483588cd0143b58272f42c96e127d265)) ([ccc98ad](https://github.com/asdf-vm/asdf/commit/ccc98ad4e997b73dcc1e9d6839a17a539c5ec649)) ([447acd1](https://github.com/asdf-vm/asdf/commit/447acd13d1225e2e9ef80ae853c5da02fca034c3)) ([72c20b1](https://github.com/asdf-vm/asdf/commit/72c20b1b51d223dd6633f279258cb8bc54eb4661)) ([924eecf](https://github.com/asdf-vm/asdf/commit/924eecfa6af25f59162e3f35b913a1d0247bd34f)) ([f5a5967](https://github.com/asdf-vm/asdf/commit/f5a59677df42f990529bd8a1668fcfea353ea4a0)) ([3af0291](https://github.com/asdf-vm/asdf/commit/3af02913169abf9049933abc4d99406687d743c3)) ([9ed4216](https://github.com/asdf-vm/asdf/commit/9ed4216525a2076b84e9e5fc6d454746a3b4d825)) ([b9e79e6](https://github.com/asdf-vm/asdf/commit/b9e79e64564ad5a94c9d435458e1a57053744b8d)) ([626bde0](https://github.com/asdf-vm/asdf/commit/626bde0a9785e400eaeb2fa72fb11fff6102b458)) ([f639f8a](https://github.com/asdf-vm/asdf/commit/f639f8a4d0a3fcc3cc175def3b3b2d1ebdac1ade)) ([c0963a3](https://github.com/asdf-vm/asdf/commit/c0963a38a62e61586ef0dd34ea568d23345e3739)) ([cb49b64](https://github.com/asdf-vm/asdf/commit/cb49b64a5adb8944acff0c03e617df0a0f39453c)) ([f74efbf](https://github.com/asdf-vm/asdf/commit/f74efbf1bff5d7489f86f2f568eba2667d95645e)) ([15e1f06](https://github.com/asdf-vm/asdf/commit/15e1f06f3751c9b72deea5cbad587140ba03c645)) ([620c0d8](https://github.com/asdf-vm/asdf/commit/620c0d87e8bf1e1c99a5772c9103fa017e75f487)) ([518a0fa](https://github.com/asdf-vm/asdf/commit/518a0fa4422cff1625cb7b676f40c4bc0a42eed9)) ([5d5d04f](https://github.com/asdf-vm/asdf/commit/5d5d04fbb7a41c83ae5031182d7d671fae434cb5)) ([2fc8006](https://github.com/asdf-vm/asdf/commit/2fc80064902a3b467a82466add1db186a99f075a)) ([c859384](https://github.com/asdf-vm/asdf/commit/c8593842eeb2a3eae74af7747afc62fa406a5b54)) ([2951011](https://github.com/asdf-vm/asdf/commit/2951011090a2a8ac3f42d54198a2447213171c38)) ([c5092c6](https://github.com/asdf-vm/asdf/commit/c5092c6dbfce3614f3de2db08afaa6fcb8b7792e)) ([3f9744d](https://github.com/asdf-vm/asdf/commit/3f9744df0fd8b23684ef2c705642232c5d2151af)) ([985c181](https://github.com/asdf-vm/asdf/commit/985c181118b39bb555a2bd2a1cdbf111a25bd512)) ([18e21c9](https://github.com/asdf-vm/asdf/commit/18e21c90284be35fa01e957b49336ffac515e19b)) ([0058988](https://github.com/asdf-vm/asdf/commit/005898800bded840fa7dd9b62a0c60a93c124c8c)) ([#1820](https://github.com/asdf-vm/asdf/issues/1820)) ([c3bd8fe](https://github.com/asdf-vm/asdf/commit/c3bd8feccd2e4589bc905ccf6b1bcd8dc74f4f37)) ([8394e85](https://github.com/asdf-vm/asdf/commit/8394e858fee419ed38833fa953b122fe04754830)) ([5266ba5](https://github.com/asdf-vm/asdf/commit/5266ba581ddf5f96de2d20391e340bb4f7c123c4)) ([3155dc3](https://github.com/asdf-vm/asdf/commit/3155dc374e9cbea6d2d792fef08914124320a292)) ([7dfa8b4](https://github.com/asdf-vm/asdf/commit/7dfa8b40ae5e557b90fb7917bc86a569cf2bd0a6)) ([5a24864](https://github.com/asdf-vm/asdf/commit/5a2486463238e2473aab739520793011267be19f)) ([80ac9bb](https://github.com/asdf-vm/asdf/commit/80ac9bb51c684c04829328c28a06aa1f1f67a8f2)) ([#1849](https://github.com/asdf-vm/asdf/issues/1849)) ([8b1b024](https://github.com/asdf-vm/asdf/commit/8b1b024f51b166bf29481162fa57e5752d0d9300)) ([1b3c426](https://github.com/asdf-vm/asdf/commit/1b3c42699a30b6bcc7295d3f433dad9cd520f130)) ([163d6b4](https://github.com/asdf-vm/asdf/commit/163d6b4b462954a2f52b6a1b9e09faa806292260)) ([87d3c06](https://github.com/asdf-vm/asdf/commit/87d3c06cf5dc859dab4d1af3dec290ed49651b67)) ([3f17a80](https://github.com/asdf-vm/asdf/commit/3f17a80fbe34ee68a3d5580798374caf1a7bc4ae)) ([#1841](https://github.com/asdf-vm/asdf/issues/1841)) ([251812b](https://github.com/asdf-vm/asdf/commit/251812bfd58a768c4a51b82c0f5f88601abfd84c)) ([#1852](https://github.com/asdf-vm/asdf/issues/1852)) ([78a00fc](https://github.com/asdf-vm/asdf/commit/78a00fc90345bd77d83bb9b2b61f85756fceb1a6)) ([6b45a5e](https://github.com/asdf-vm/asdf/commit/6b45a5e5f74f60a22fd20b331163f5e5d6a3881c)) ([2a31caf](https://github.com/asdf-vm/asdf/commit/2a31cafd38128be86696c0a46e0223a95b8129fe)) ([7439ea9](https://github.com/asdf-vm/asdf/commit/7439ea916829f7c3f1f2932fa17b3d2848c2dbe7)) ([88af4ee](https://github.com/asdf-vm/asdf/commit/88af4eea00c395407a4b904e80e307ad864a6535))

### Bug Fixes

* bash command set end of line LF ([#1847](https://github.com/asdf-vm/asdf/issues/1847)) ([8211421](https://github.com/asdf-vm/asdf/commit/8211421f4e0d1f62d2d2b7436f9070040231fcbd))

## [0.15.0](https://github.com/asdf-vm/asdf/compare/v0.14.1...v0.15.0) (2024-12-18)


### Features

* golang-rewrite: remove `asdf update` command to prepare for Go version ([#1806](https://github.com/asdf-vm/asdf/issues/1806)) ([15571a2](https://github.com/asdf-vm/asdf/commit/15571a2d28818644673bbaf0fcf7d1d9e342cda4))


### Patches

* completions: Address two Bash completion bugs ([#1770](https://github.com/asdf-vm/asdf/issues/1770)) ([ebdb229](https://github.com/asdf-vm/asdf/commit/ebdb229ce68979a18dae5c0922620b860c56b22f))
* make plugin-test work on alpine linux ([#1778](https://github.com/asdf-vm/asdf/issues/1778)) ([f5a1f3a](https://github.com/asdf-vm/asdf/commit/f5a1f3a0a8bb50796f6ccf618d2bf4cf3bdea097))
* nushell: nushell spread operator ([#1777](https://github.com/asdf-vm/asdf/issues/1777)) ([a0ce37b](https://github.com/asdf-vm/asdf/commit/a0ce37b89bd5eb4ddaa806f96305ee99a8c5d365))
* nushell: Use correct env var for shims dir ([#1742](https://github.com/asdf-vm/asdf/issues/1742)) ([2f07629](https://github.com/asdf-vm/asdf/commit/2f0762991c35da933b81ba6ab75457a504deedbb))
* when download path got removed, it should use -f to force delete the download files ([#1746](https://github.com/asdf-vm/asdf/issues/1746)) ([221507f](https://github.com/asdf-vm/asdf/commit/221507f1c0288f0df13315a7f0f2c0a7bc39e7c2))


### Documentation

* add Korean translation ([#1757](https://github.com/asdf-vm/asdf/issues/1757)) ([9e16306](https://github.com/asdf-vm/asdf/commit/9e16306f42b4bbffd62779aaebb9cbbc9ba59007))
* propose edits for tiny typographical/grammatical errors ([#1747](https://github.com/asdf-vm/asdf/issues/1747)) ([d462b55](https://github.com/asdf-vm/asdf/commit/d462b55ec9868eeaddba4b70850aba908236dd93))
* split Lint and Test badges for title asdf in `README.MD` ([#1725](https://github.com/asdf-vm/asdf/issues/1725)) ([c778ea1](https://github.com/asdf-vm/asdf/commit/c778ea1deca19d8ccd91253c2f206a6b51a0a9b1))
* Update Japanese(ja-jp) Translations ([#1715](https://github.com/asdf-vm/asdf/issues/1715)) ([bd19e4c](https://github.com/asdf-vm/asdf/commit/bd19e4cbdc2f0a9380dbdfcec46584d619e8ed56))

## [0.14.1](https://github.com/asdf-vm/asdf/compare/v0.14.0...v0.14.1) (2024-08-15)


### Patches

* Only display the "can't keep downloads" warning when asked to keep downloads ([#1756](https://github.com/asdf-vm/asdf/issues/1756)) ([44f3efb](https://github.com/asdf-vm/asdf/commit/44f3efb63b7517520f4610d504d30783a85c9d79))

## [0.14.0](https://github.com/asdf-vm/asdf/compare/v0.13.1...v0.14.0) (2024-01-19)


### ⚠ BREAKING CHANGES

* Enable `pipefail` ([#1608](https://github.com/asdf-vm/asdf/issues/1608))

### Patches

* `plugin test` git-ref to use plugin repo default branch ([#1694](https://github.com/asdf-vm/asdf/issues/1694)) ([6d8cf9d](https://github.com/asdf-vm/asdf/commit/6d8cf9d44b3d985ac59f1eac827c5275392f90fd))
* avoid mention of `ASDF_NU_DIR` ([#1660](https://github.com/asdf-vm/asdf/issues/1660)) ([dfea89c](https://github.com/asdf-vm/asdf/commit/dfea89ccc703f3ef5a87c4b85726456d70167d89))
* Enable `pipefail` ([#1608](https://github.com/asdf-vm/asdf/issues/1608)) ([4085e55](https://github.com/asdf-vm/asdf/commit/4085e5542bac824ea124610ad247c2f90d1b8d93))
* **fish:** use PATH instead of fish_user_paths ([#1709](https://github.com/asdf-vm/asdf/issues/1709)) ([5327697](https://github.com/asdf-vm/asdf/commit/53276973f7c99695cd9a28b04c010b006d7f60ca))
* list `asdf version` command under help.txt UTILS section ([#1673](https://github.com/asdf-vm/asdf/issues/1673)) ([240a5fb](https://github.com/asdf-vm/asdf/commit/240a5fbdea1de055672d02f83db1de990ea2bf83))
* **nushell:** Use `def --env` instead of `def-env` ([#1681](https://github.com/asdf-vm/asdf/issues/1681)) ([3b8f400](https://github.com/asdf-vm/asdf/commit/3b8f400c3e628851286bfebd8da5bc7ab45cd676))
* plugin extension commands to not require `bin/` directory ([#1643](https://github.com/asdf-vm/asdf/issues/1643)) ([61420ad](https://github.com/asdf-vm/asdf/commit/61420ad90829b2c9bf1ca16681a2eb652adcc755))
* use universal scope for fish_user_paths ([#1699](https://github.com/asdf-vm/asdf/issues/1699)) ([0ffee72](https://github.com/asdf-vm/asdf/commit/0ffee7224bc00a917ceaea689c6268fd1f03bd62))
* warn if plugin does not support keeping downloads if configured ([#1644](https://github.com/asdf-vm/asdf/issues/1644)) ([19515ed](https://github.com/asdf-vm/asdf/commit/19515eda3b91167b0d76c35ffc4402de688007e0))


### Documentation

* add Japanese translation ([#1667](https://github.com/asdf-vm/asdf/issues/1667)) ([2b9bec7](https://github.com/asdf-vm/asdf/commit/2b9bec7710cd18e51a01652e1f58cc309baf2fd7))
* fix some pt-br spelling ([#1640](https://github.com/asdf-vm/asdf/issues/1640)) ([0c7c41a](https://github.com/asdf-vm/asdf/commit/0c7c41ab44d3a42a9e57e3d20a646569c2eacfdc))
* fix typo "node version" filename ([#1679](https://github.com/asdf-vm/asdf/issues/1679)) ([fad23bc](https://github.com/asdf-vm/asdf/commit/fad23bc9f4d38747f28d6708ab01689749030063))
* fix typo ([#1670](https://github.com/asdf-vm/asdf/issues/1670)) ([5737fa3](https://github.com/asdf-vm/asdf/commit/5737fa316eab01c4033565eacf678222cd861f8d))
* Improve `.asdfrc` plugin hook documentation ([#1661](https://github.com/asdf-vm/asdf/issues/1661)) ([8fbf9a3](https://github.com/asdf-vm/asdf/commit/8fbf9a396bd4a5b71ec7cf215d12040fb5365d6a))

## [0.13.1](https://github.com/asdf-vm/asdf/compare/v0.13.0...v0.13.1) (2023-09-12)


### Patches

* **fish:** use builtin realpath over system one ([#1637](https://github.com/asdf-vm/asdf/issues/1637)) ([5ac3032](https://github.com/asdf-vm/asdf/commit/5ac30328a7bbd1a8d974bb5fb1f14d8bd2d1e03f))

## [0.13.0](https://github.com/asdf-vm/asdf/compare/v0.12.0...v0.13.0) (2023-09-11)


### ⚠ BREAKING CHANGES

* `plugin list` exit code 0 when no plugins are installed ([#1597](https://github.com/asdf-vm/asdf/issues/1597))
* 0 exit code for success when adding an existing plugin ([#1598](https://github.com/asdf-vm/asdf/issues/1598))
* **fish:** don't resolve symlinks for ASDF_DIR ([#1583](https://github.com/asdf-vm/asdf/issues/1583))

### Features

* add plugin location when update the plugin ([#1602](https://github.com/asdf-vm/asdf/issues/1602)) ([36c7024](https://github.com/asdf-vm/asdf/commit/36c7024baa4b829b3629b4e0430157266d354158))


### Patches

* `plugin list` exit code 0 when no plugins are installed ([#1597](https://github.com/asdf-vm/asdf/issues/1597)) ([a029c00](https://github.com/asdf-vm/asdf/commit/a029c007503f2eec911a0c836e8622bb38c5e065))
* 0 exit code for success when adding an existing plugin ([#1598](https://github.com/asdf-vm/asdf/issues/1598)) ([4dd1904](https://github.com/asdf-vm/asdf/commit/4dd190466a9855dac300ce691e66a7629ef37b82))
* **fish:** don't resolve symlinks for ASDF_DIR ([#1583](https://github.com/asdf-vm/asdf/issues/1583)) ([d1a563d](https://github.com/asdf-vm/asdf/commit/d1a563dcc0107d5c631f73b114044898b5cadcf9))
* improve lint and test scripts ([#1607](https://github.com/asdf-vm/asdf/issues/1607)) ([b320803](https://github.com/asdf-vm/asdf/commit/b3208031204aabad6e85346155baacab16862da8))
* Make asdf.fish compatible with Fish 3.1.2 ([#1590](https://github.com/asdf-vm/asdf/issues/1590)) ([e83d71e](https://github.com/asdf-vm/asdf/commit/e83d71e43f525453994eb4cfda8ad66f8b914529))
* no longer write temporary files to home directory ([#1592](https://github.com/asdf-vm/asdf/issues/1592)) ([624604a](https://github.com/asdf-vm/asdf/commit/624604a8626dc6006d78121d4cf0f6c920449c56))
* nushell language syntax update ([#1624](https://github.com/asdf-vm/asdf/issues/1624)) ([0ddab5d](https://github.com/asdf-vm/asdf/commit/0ddab5dfaf28ad97c84a6aa56b08ccc212e07b4d))
* set default shell version values on POSIX entrypoint ([#1594](https://github.com/asdf-vm/asdf/issues/1594)) ([4d5f22d](https://github.com/asdf-vm/asdf/commit/4d5f22ddb89ce53e24b1ab1cbefce3be95238a19))
* warn when any ./lib/commands are marked as executable ([#1593](https://github.com/asdf-vm/asdf/issues/1593)) ([2043a09](https://github.com/asdf-vm/asdf/commit/2043a09574bdfdfcf2daf2fdb3bff2d9d2dad64e))


### Documentation

* `bin/latest-stable` empty query is set to default ([#1591](https://github.com/asdf-vm/asdf/issues/1591)) ([299dc97](https://github.com/asdf-vm/asdf/commit/299dc97a5b63d8afe1a0bba03e32dddfb7fb8e51))
* migrate to VitePress from VuePress ([#1578](https://github.com/asdf-vm/asdf/issues/1578)) ([5133819](https://github.com/asdf-vm/asdf/commit/5133819a77aaa393def347bfecb1c442ece4c7f8))
* upgrade deps & fix breaking changes ([446f8c5](https://github.com/asdf-vm/asdf/commit/446f8c5f947cc5f30f03403c2cfe4dec71b0a494))

## [0.12.0](https://github.com/asdf-vm/asdf/compare/v0.11.3...v0.12.0) (2023-06-09)


### ⚠ BREAKING CHANGES

* Remove files containing only `asdf` wrapper functions ([#1525](https://github.com/asdf-vm/asdf/issues/1525))
* align Fish entrypoint behaviour with other shells ([#1524](https://github.com/asdf-vm/asdf/issues/1524))
* do not remove items from PATH in POSIX entrypoint ([#1521](https://github.com/asdf-vm/asdf/issues/1521))
* rework POSIX entrypoint for greater shell support ([#1480](https://github.com/asdf-vm/asdf/issues/1480))

### Features

* Support configurable `ASDF_CONCURRENCY` ([#1532](https://github.com/asdf-vm/asdf/issues/1532)) ([684f4f0](https://github.com/asdf-vm/asdf/commit/684f4f058f24cc418f77825a59a22bacd16a9bee))
* Support PowerShell Core ([#1522](https://github.com/asdf-vm/asdf/issues/1522)) ([213aa22](https://github.com/asdf-vm/asdf/commit/213aa22378cf0ecf5b1924f1bfc4fee43338255a))


### Documentation

* Add Nushell installation instructions for all languages ([#1519](https://github.com/asdf-vm/asdf/issues/1519)) ([6a6c539](https://github.com/asdf-vm/asdf/commit/6a6c539f4a21fdb863fd938edd94ac3bdced349b))
* fix `ASDF_${LANG}_VERSION` usage ([#1528](https://github.com/asdf-vm/asdf/issues/1528)) ([63f422b](https://github.com/asdf-vm/asdf/commit/63f422b4c7afcf53ef72002e39967eb9ca2da2a9))
* fix Nushell-Homebrew setup instructions ([#1495](https://github.com/asdf-vm/asdf/issues/1495)) ([49e541a](https://github.com/asdf-vm/asdf/commit/49e541a29ff7a2f35917a4544a8b9adbc02bb1b4))
* fix uninstall instructions for Fish Shell ([#1547](https://github.com/asdf-vm/asdf/issues/1547)) ([a1e858d](https://github.com/asdf-vm/asdf/commit/a1e858d2542691adabf9b066add86f16e759a90c))
* Improve wording of env vars section ([#1514](https://github.com/asdf-vm/asdf/issues/1514)) ([ec3eb2d](https://github.com/asdf-vm/asdf/commit/ec3eb2d64f0531be86d10e1202a92f6b7820e294))
* verbose plugin create command details ([#1445](https://github.com/asdf-vm/asdf/issues/1445)) ([8108ca6](https://github.com/asdf-vm/asdf/commit/8108ca6d7e5f34b9b9723f945a9c4b137f2e10ef))


### Patches

* `asdf info` show BASH_VERSION & all asdf envs ([#1513](https://github.com/asdf-vm/asdf/issues/1513)) ([a1b5eee](https://github.com/asdf-vm/asdf/commit/a1b5eeec1caf605c0e4c80748703b9e227b57aeb))
* align Fish entrypoint behaviour with other shells ([#1524](https://github.com/asdf-vm/asdf/issues/1524)) ([8919f40](https://github.com/asdf-vm/asdf/commit/8919f4009ea233c32298911b28ceb879e2dbc675))
* assign default values to all internal variables ([#1518](https://github.com/asdf-vm/asdf/issues/1518)) ([86477ee](https://github.com/asdf-vm/asdf/commit/86477ee8dea14ab63faf7132133304855a647fde))
* Better handling with paths that include spaces ([#1485](https://github.com/asdf-vm/asdf/issues/1485)) ([bbcbddc](https://github.com/asdf-vm/asdf/commit/bbcbddcdd4ffa0f49c3772b66d87331420fa5727))
* create install directory with `mkdir -p` ([#1563](https://github.com/asdf-vm/asdf/issues/1563)) ([d6185a2](https://github.com/asdf-vm/asdf/commit/d6185a21207e0ac45e69499883dad5e2b585c1b6))
* do not remove items from PATH in POSIX entrypoint ([#1521](https://github.com/asdf-vm/asdf/issues/1521)) ([b6d0ca2](https://github.com/asdf-vm/asdf/commit/b6d0ca28d5fd2b63c7da67b127e6c2a0e01b2670))
* enforce consistent shell redirection format ([#1533](https://github.com/asdf-vm/asdf/issues/1533)) ([1bc205e](https://github.com/asdf-vm/asdf/commit/1bc205e8aa61287c766c673acb8f0d4f9c6ee249))
* improve readability of the non-set `nullglob` guard ([#1545](https://github.com/asdf-vm/asdf/issues/1545)) ([f273612](https://github.com/asdf-vm/asdf/commit/f273612155188f62cf8daf584d5581cd4214daf4))
* Introduce `ASDF_FORCE_PREPEND` variable on POSIX entrypoint ([#1560](https://github.com/asdf-vm/asdf/issues/1560)) ([5b7d0fe](https://github.com/asdf-vm/asdf/commit/5b7d0fea0a10681d89dd7bf4010e0a39e6696841))
* lint & style errors in `bin/asdf` ([#1516](https://github.com/asdf-vm/asdf/issues/1516)) ([13c0e2f](https://github.com/asdf-vm/asdf/commit/13c0e2fab0e9ad4dccf72b6f5586fb32458b8709))
* Nushell plugin list --urls ([#1507](https://github.com/asdf-vm/asdf/issues/1507)) ([9363fb2](https://github.com/asdf-vm/asdf/commit/9363fb2f72e7fa08d3580b22d465af48a7d37031))
* nushell plugin list all ([#1501](https://github.com/asdf-vm/asdf/issues/1501)) ([#1502](https://github.com/asdf-vm/asdf/issues/1502)) ([c5b8b3c](https://github.com/asdf-vm/asdf/commit/c5b8b3c128b48e1531f6d03d2083435f413a4738))
* Remove files containing only `asdf` wrapper functions ([#1525](https://github.com/asdf-vm/asdf/issues/1525)) ([00fee78](https://github.com/asdf-vm/asdf/commit/00fee78423de0e399f5705bb483e599e39b707c9))
* remove leading asterick in Fish completion ([#1543](https://github.com/asdf-vm/asdf/issues/1543)) ([198ced5](https://github.com/asdf-vm/asdf/commit/198ced50327b20b136cb6ec165610d37334a2962))
* rename internal function `asdf_tool_versions_filename` ([#1544](https://github.com/asdf-vm/asdf/issues/1544)) ([b36ec73](https://github.com/asdf-vm/asdf/commit/b36ec7338654abc3773314147540dfa8297b48b8))
* rename internal plugin repository functions ([#1537](https://github.com/asdf-vm/asdf/issues/1537)) ([5367f1f](https://github.com/asdf-vm/asdf/commit/5367f1f09079070c7b47551dc453c686991564a0))
* rework POSIX entrypoint for greater shell support ([#1480](https://github.com/asdf-vm/asdf/issues/1480)) ([3379af8](https://github.com/asdf-vm/asdf/commit/3379af845ed2e281703bc0e9e4f388a7845edc2a))
* support `asdf shim-versions` completions in fish & bash ([#1554](https://github.com/asdf-vm/asdf/issues/1554)) ([99623d7](https://github.com/asdf-vm/asdf/commit/99623d7eac0fe17e330a950c71b7ba378f656b2c))
* Typo in POSIX entrypoint ([#1562](https://github.com/asdf-vm/asdf/issues/1562)) ([6b2ebf5](https://github.com/asdf-vm/asdf/commit/6b2ebf575ff98d3970b518de04238d30804a40d1))
* warn if `.tool-versions` or asdfrc contains carriage returns ([#1561](https://github.com/asdf-vm/asdf/issues/1561)) ([097f773](https://github.com/asdf-vm/asdf/commit/097f7733d67aaf8d0dca1c793407babbdf6f8394))

## [0.11.3](https://github.com/asdf-vm/asdf/compare/v0.11.2...v0.11.3) (2023-03-16)


### Bug Fixes

* Prepend asdf directories to the PATH in Nushell ([#1496](https://github.com/asdf-vm/asdf/issues/1496)) ([745950c](https://github.com/asdf-vm/asdf/commit/745950c3589c4047a5b94b34bc9cf06dff5dc3c7))

## [0.11.2](https://github.com/asdf-vm/asdf/compare/v0.11.1...v0.11.2) (2023-02-21)


### Bug Fixes

* bash completion for latest command ([#1472](https://github.com/asdf-vm/asdf/issues/1472)) ([2606a87](https://github.com/asdf-vm/asdf/commit/2606a875eba8d74be56c78c97a76f3eb92c8253d))
* enforce & use consistent function definitions ([#1464](https://github.com/asdf-vm/asdf/issues/1464)) ([e0fd7a7](https://github.com/asdf-vm/asdf/commit/e0fd7a7be8bbbbf0f3cb6dc38cea3b62963eb0c9))
* nushell PATH conversion to list before filter ([#1471](https://github.com/asdf-vm/asdf/issues/1471)) ([cd0e12b](https://github.com/asdf-vm/asdf/commit/cd0e12b3ee4090242b884ac4aea0f65784e52946))
* Remove `==` inside `[` ([#1421](https://github.com/asdf-vm/asdf/issues/1421)) ([d81b81f](https://github.com/asdf-vm/asdf/commit/d81b81f9de2dc5961624464df04cef7cafae588c))
* support nushell v0.75.0 ([#1481](https://github.com/asdf-vm/asdf/issues/1481)) ([dd8d399](https://github.com/asdf-vm/asdf/commit/dd8d3999d41cfdd8518a9ea478929b5291b8838c))

## [0.11.1](https://github.com/asdf-vm/asdf/compare/v0.11.0...v0.11.1) (2023-01-13)


### Bug Fixes

* `reshim` did not rewrite executable path ([#1311](https://github.com/asdf-vm/asdf/issues/1311)) ([5af7625](https://github.com/asdf-vm/asdf/commit/5af76257693d1f560b9c27c9cdcc6f5a5a33c4d5))
* Add test for nushell integration and fix some bugs ([#1415](https://github.com/asdf-vm/asdf/issues/1415)) ([60d4494](https://github.com/asdf-vm/asdf/commit/60d4494d5d21f9d7bdd0778ca962ddb44280aff7))
* Allow `path:` versions to use `~` ([#1403](https://github.com/asdf-vm/asdf/issues/1403)) ([670c96d](https://github.com/asdf-vm/asdf/commit/670c96d1a6d6d2c19ff63ce2ed14f784c340e9b9))
* Ban use of 'test' ([#1383](https://github.com/asdf-vm/asdf/issues/1383)) ([ec972cb](https://github.com/asdf-vm/asdf/commit/ec972cbdf0acbecf70e3678c055e27866c49341d))
* correct order of checks in conditional for adding a missing newline ([#1418](https://github.com/asdf-vm/asdf/issues/1418)) ([4125d2b](https://github.com/asdf-vm/asdf/commit/4125d2b5560efc646e6048202ceb00fffd0b9eaf)), closes [#1417](https://github.com/asdf-vm/asdf/issues/1417)
* Do not use `pwd` ([dd37b6f](https://github.com/asdf-vm/asdf/commit/dd37b6f0c0ed20d15e3d96b730db82f21c9e2e6f))
* Do not use type not exported on older Python versions ([#1409](https://github.com/asdf-vm/asdf/issues/1409)) ([7460809](https://github.com/asdf-vm/asdf/commit/74608098cdfc70c2d2e85d1f3861500ef668a041))
* force lwrcase plugin name fix capitalization mismatch errs ([#1400](https://github.com/asdf-vm/asdf/issues/1400)) ([196a05b](https://github.com/asdf-vm/asdf/commit/196a05b2dcef48f3a281350734c76ba7bc73fa81))
* lint errors from `scripts/checkstyle.py` ([#1385](https://github.com/asdf-vm/asdf/issues/1385)) ([3492043](https://github.com/asdf-vm/asdf/commit/3492043241e466337c5965a6fe2e089147bc4152))
* mv dev dep from repo root to subdir to avoid clash ([#1408](https://github.com/asdf-vm/asdf/issues/1408)) ([5df70da](https://github.com/asdf-vm/asdf/commit/5df70dadacd66b4150ed47e58c861418c0d1281f))
* Remove unnecessary backslashes ([#1384](https://github.com/asdf-vm/asdf/issues/1384)) ([15faf93](https://github.com/asdf-vm/asdf/commit/15faf93a0d3615834e550ea1562fb6b8cee5a205))
* Remove usage of `$(pwd)` in favor of `$PWD` ([f522ab9](https://github.com/asdf-vm/asdf/commit/f522ab98797345d767b239041246dfb4b740423e))

## [0.11.0](https://github.com/asdf-vm/asdf/compare/v0.10.2...v0.11.0) (2022-12-12)


### Features

* **completions:** bash improvements ([#1329](https://github.com/asdf-vm/asdf/issues/1329)) ([7c802c3](https://github.com/asdf-vm/asdf/commit/7c802c3fc9b5dc556993a98e5aaf96650cbb0d5b))
* Disable short-name repository with config value ([#1227](https://github.com/asdf-vm/asdf/issues/1227)) ([18caea3](https://github.com/asdf-vm/asdf/commit/18caea3eb7d989d195cf13b3c9ffc2058d906fc5))
* mark current resolved versions in `asdf list` output ([#762](https://github.com/asdf-vm/asdf/issues/762)) ([5ea6795](https://github.com/asdf-vm/asdf/commit/5ea67953be74cb5fde11240dc40a541c69afc65c))
* support nushell ([#1355](https://github.com/asdf-vm/asdf/issues/1355)) ([274a638](https://github.com/asdf-vm/asdf/commit/274a638e155c08cd0d6dbda1a0d4da02c3466c97))


### Bug Fixes

* add missing "does not add paths to PATH more than once" test for elvish ([#1275](https://github.com/asdf-vm/asdf/issues/1275)) ([3c55167](https://github.com/asdf-vm/asdf/commit/3c55167a6807b48cacaaed18df7bf0db2526ed59))
* append trailing newline to .tool-versions files when missing ([#1310](https://github.com/asdf-vm/asdf/issues/1310)) ([eb7dac3](https://github.com/asdf-vm/asdf/commit/eb7dac3a2b15ad458f55a897d49a377508ea92fe)), closes [#1299](https://github.com/asdf-vm/asdf/issues/1299)
* excludes "milestone" releases in "latest" command ([#1307](https://github.com/asdf-vm/asdf/issues/1307)) ([5334d1d](https://github.com/asdf-vm/asdf/commit/5334d1db3d390c46ed49101528f74483eb6b2987)), closes [#1306](https://github.com/asdf-vm/asdf/issues/1306)
* improve formatting of ballad ([#1367](https://github.com/asdf-vm/asdf/issues/1367)) ([e0c2c31](https://github.com/asdf-vm/asdf/commit/e0c2c31fc3274387efdddebe1450f0662f91a726))
* use ELVISH_VERSION to specify elvish test version ([#1276](https://github.com/asdf-vm/asdf/issues/1276)) ([72c3a23](https://github.com/asdf-vm/asdf/commit/72c3a2377a1afa3027c6f29cb9f3f1a7fbddaa8c))

### [0.10.2](https://www.github.com/asdf-vm/asdf/compare/v0.10.1...v0.10.2) (2022-06-08)


### Bug Fixes

* always use ASDF_DEFAULT_TOOL_VERSIONS_FILENAME for filename when present ([#1238](https://www.github.com/asdf-vm/asdf/issues/1238)) ([711ad99](https://www.github.com/asdf-vm/asdf/commit/711ad991043a1980fa264098f29e78f2ecafd610)), closes [#1082](https://www.github.com/asdf-vm/asdf/issues/1082)
* get invalid ASDF_DATA_DIR when exec asdf shims by non-shell ([#1154](https://www.github.com/asdf-vm/asdf/issues/1154)) ([b9962f7](https://www.github.com/asdf-vm/asdf/commit/b9962f71564ce77cf97772cc100b80f9d77019b1))
* update event trigger for doc-version workflow ([#1232](https://www.github.com/asdf-vm/asdf/issues/1232)) ([0bc8c3a](https://www.github.com/asdf-vm/asdf/commit/0bc8c3ab6895b88c96bff86f5f79575ee80cc718))
* update plugin-add regex to support other languages ([#1241](https://www.github.com/asdf-vm/asdf/issues/1241)) ([92d005d](https://www.github.com/asdf-vm/asdf/commit/92d005dacd2ec434a9d912ab9938b59ab1b7c51f)), closes [#1237](https://www.github.com/asdf-vm/asdf/issues/1237)
* updating references to legacy github.io site ([#1240](https://www.github.com/asdf-vm/asdf/issues/1240)) ([738306b](https://www.github.com/asdf-vm/asdf/commit/738306bc5d1c53a22c06e4d6d3ddb6d511dc5d50))

### [0.10.1](https://www.github.com/asdf-vm/asdf/compare/v0.10.0...v0.10.1) (2022-05-17)


### Bug Fixes

* add asdf to list of banned commands ([#1224](https://www.github.com/asdf-vm/asdf/issues/1224)) ([39909e0](https://www.github.com/asdf-vm/asdf/commit/39909e01af2bbf23fc821de5cec6c5c9661c59bb))
* don't invoke asdf inside asdf commands ([#1208](https://www.github.com/asdf-vm/asdf/issues/1208)) ([27f7ef7](https://www.github.com/asdf-vm/asdf/commit/27f7ef78529649534b8383daa58e4b370b3cbd7f))
* fixing bats ([#1215](https://www.github.com/asdf-vm/asdf/issues/1215)) ([a9caa5b](https://www.github.com/asdf-vm/asdf/commit/a9caa5bdffca5401798fb37e6f34af933b6ce0d2))
* instead /tmp, use TMPDIR if defined ([9113623](https://www.github.com/asdf-vm/asdf/commit/91136234e90b5fe8718338f513fa770c99151d3e))
* make fish shell setup match other shells ([#1209](https://www.github.com/asdf-vm/asdf/issues/1209)) ([6fc4bb8](https://www.github.com/asdf-vm/asdf/commit/6fc4bb8fc650e73152ce326267f89df6865cdd24))
* only iterate over directories in the plugins/ directory ([#1228](https://www.github.com/asdf-vm/asdf/issues/1228)) ([788ccab](https://www.github.com/asdf-vm/asdf/commit/788ccab5971cb828cf25364b0df5ed6f5e9e713d))
* update elvish to 0.18.0 ([5a89563](https://www.github.com/asdf-vm/asdf/commit/5a89563c0a37f244fa3daa46c5100b7711edde1d))

## [0.10.0](https://www.github.com/asdf-vm/asdf/compare/v0.9.0...v0.10.0) (2022-04-14)


### Features

* case-insensitive filtering of unstable versions in `latest` ([#1139](https://www.github.com/asdf-vm/asdf/issues/1139)) ([e61e3d9](https://www.github.com/asdf-vm/asdf/commit/e61e3d9ade0d7bdfb4413184284038c50ba1e09c))
* **latest:** adds the flag --all to the latest command ([#1096](https://www.github.com/asdf-vm/asdf/issues/1096)) ([f85fef5](https://www.github.com/asdf-vm/asdf/commit/f85fef533f249df5a9f58307d288f2f069351e88))
* upgrade elvish to 0.17.0 ([#1159](https://www.github.com/asdf-vm/asdf/issues/1159)) ([824550e](https://www.github.com/asdf-vm/asdf/commit/824550ed2009c7e8c4c84afd7a01197d451c47bf))


### Bug Fixes

* Ban `ls` command ([#1141](https://www.github.com/asdf-vm/asdf/issues/1141)) ([87137e4](https://www.github.com/asdf-vm/asdf/commit/87137e41031f17b30acf12ee35925e689c84e2d8))
* ban grep long flags ([#1117](https://www.github.com/asdf-vm/asdf/issues/1117)) ([6e4c39c](https://www.github.com/asdf-vm/asdf/commit/6e4c39c244a289a54f235cf15a29874fb8885927))
* do not print `find` errors ([#1102](https://www.github.com/asdf-vm/asdf/issues/1102)) ([5992abb](https://www.github.com/asdf-vm/asdf/commit/5992abb09e6f5e0af690bf0e99619386187949db))
* don't generate on error if backup file doesn't exists ([#1057](https://www.github.com/asdf-vm/asdf/issues/1057)) ([288468f](https://www.github.com/asdf-vm/asdf/commit/288468f93f6c5cb4e7cca1173d4ad73154d0d564))
* **elvish:** prepend asdf paths to `$PATH` ([#1174](https://www.github.com/asdf-vm/asdf/issues/1174)) ([682b7a1](https://www.github.com/asdf-vm/asdf/commit/682b7a1d6dc1a35f7f8b0ddbab977e0a3dae2c9c))
* latest --all correctly report plugins as missing ([#1118](https://www.github.com/asdf-vm/asdf/issues/1118)) ([aafe1e5](https://www.github.com/asdf-vm/asdf/commit/aafe1e5304c2d2a026831976c18faa6fb48d25bc))
* local plugin in then clause too ([#1203](https://www.github.com/asdf-vm/asdf/issues/1203)) ([448f750](https://www.github.com/asdf-vm/asdf/commit/448f750891a4366f45d905b112ad20d4be66c496))
* newline after error msg for ASDF_DIR ([#1113](https://www.github.com/asdf-vm/asdf/issues/1113)) ([ac2791e](https://www.github.com/asdf-vm/asdf/commit/ac2791e49f7fcdbeb420415d8ddcb5f17bcf296e))
* Prevent unbound variable error with nounset in asdf.sh ([#1158](https://www.github.com/asdf-vm/asdf/issues/1158)) ([b7dd291](https://www.github.com/asdf-vm/asdf/commit/b7dd291c983af321af20550fa89bf1cfbc888aec))
* remove comments from whole file instead of line by line for performance ([#1198](https://www.github.com/asdf-vm/asdf/issues/1198)) ([de6e22f](https://www.github.com/asdf-vm/asdf/commit/de6e22f909946f7d17047f4aeab41e581546b674))
* shorthand grep options for alpine support ([#1106](https://www.github.com/asdf-vm/asdf/issues/1106)) ([234778a](https://www.github.com/asdf-vm/asdf/commit/234778a397f19c398d2f76a0321fef3273c9a086))

## [0.9.0](https://www.github.com/asdf-vm/asdf/compare/v0.8.1...v0.9.0) (2021-11-18)


### Features

* add post update plugin support ([#1049](https://www.github.com/asdf-vm/asdf/issues/1049)) ([304f72d](https://www.github.com/asdf-vm/asdf/commit/304f72dbb207606fd82c04ee2c73cf11e9e6e0cc))
* asdf latest defer to plugin to determine the latest version ([#938](https://www.github.com/asdf-vm/asdf/issues/938)) ([664d82e](https://www.github.com/asdf-vm/asdf/commit/664d82ed8a734eb30988840829a972f8ddd8e523))
* configurable plugin repo last check time ([#957](https://www.github.com/asdf-vm/asdf/issues/957)) ([1716afa](https://www.github.com/asdf-vm/asdf/commit/1716afa02125aa322d8a688ff4b3e95f2e08b33c))
* display plugin repo refs alongside urls in info cmd ([#1014](https://www.github.com/asdf-vm/asdf/issues/1014)) ([cd0a6a7](https://www.github.com/asdf-vm/asdf/commit/cd0a6a779eb18236fe7bf1f84403e33e636ef1f3))
* Displays a warning when a plugin from the tools-version list does not exist ([#1033](https://www.github.com/asdf-vm/asdf/issues/1033)) ([9430a39](https://www.github.com/asdf-vm/asdf/commit/9430a39aef1dbf806a8954d71711747be1001076))
* Elvish Shell support ([#1066](https://www.github.com/asdf-vm/asdf/issues/1066)) ([cc7778a](https://www.github.com/asdf-vm/asdf/commit/cc7778a040751f6801524135f5f5ece3a748fa8c))
* toggle off repo sync completely ([#1011](https://www.github.com/asdf-vm/asdf/issues/1011)) ([a3ba5a7](https://www.github.com/asdf-vm/asdf/commit/a3ba5a794c07efb4aa9cce9c15d41b4b61d5df01))


### Bug Fixes

* Adds "grep -P" to the list of banned commands ([#1064](https://www.github.com/asdf-vm/asdf/issues/1064)) ([8a515f4](https://www.github.com/asdf-vm/asdf/commit/8a515f49d7443ee318badbd4d8f092ad0d8f04ca))
* allow plugin callbacks to be in any language ([#995](https://www.github.com/asdf-vm/asdf/issues/995)) ([2ad0f5e](https://www.github.com/asdf-vm/asdf/commit/2ad0f5ea452bd8f843951c4a9cc56a020e172b07))
* clarify the wording when no version is set ([#1088](https://www.github.com/asdf-vm/asdf/issues/1088)) ([4116284](https://www.github.com/asdf-vm/asdf/commit/41162849cf5c966c749ec435ebe32bd649a86ee8))
* completions for asdf plugin list ([#1061](https://www.github.com/asdf-vm/asdf/issues/1061)) ([43412aa](https://www.github.com/asdf-vm/asdf/commit/43412aad5f668686daa058505a61c070561b46fc))
* Correct typo on getting started page ([#1086](https://www.github.com/asdf-vm/asdf/issues/1086)) ([4321980](https://www.github.com/asdf-vm/asdf/commit/4321980c3385ac1bafd77503c8ec77b26042d05b))
* don't override existing ASDF_DIR ([#1008](https://www.github.com/asdf-vm/asdf/issues/1008)) ([73efc9f](https://www.github.com/asdf-vm/asdf/commit/73efc9fa97744c49c5004ee8bb9b6064b6ce22f2))
* ensure shims get created when data dir has spaces ([#996](https://www.github.com/asdf-vm/asdf/issues/996)) ([39c9999](https://www.github.com/asdf-vm/asdf/commit/39c9999519a1d3c51ffb3b8dddd141dbc29b3bd1))
* Fix plugin-test arg parsing ([#1084](https://www.github.com/asdf-vm/asdf/issues/1084)) ([c911f2d](https://www.github.com/asdf-vm/asdf/commit/c911f2d43198945f21bb25100c9dab5a375c780b))
* full_version_name is not available here ([#1031](https://www.github.com/asdf-vm/asdf/issues/1031)) ([8490526](https://www.github.com/asdf-vm/asdf/commit/84905265467c9fdf618c11f69a5ae71408e18bea))
* help for extension commands for plugins with hyphens in the name. ([#1048](https://www.github.com/asdf-vm/asdf/issues/1048)) ([3e0cb9a](https://www.github.com/asdf-vm/asdf/commit/3e0cb9aaea7f2bf282a18c4912454737fef0741b))
* help text as per new feats in [#633](https://www.github.com/asdf-vm/asdf/issues/633) ([#991](https://www.github.com/asdf-vm/asdf/issues/991)) ([0d95663](https://www.github.com/asdf-vm/asdf/commit/0d956635b5cabe35f0895121929e8e668a3ee03d))
* incorrect usage of grep ([#1035](https://www.github.com/asdf-vm/asdf/issues/1035)) ([30d27cb](https://www.github.com/asdf-vm/asdf/commit/30d27cbe6b358cd790fb66dbc8a14806eca23f05))
* insert error handling in list-all & download plugin scripts ([#881](https://www.github.com/asdf-vm/asdf/issues/881)) ([a7d3661](https://www.github.com/asdf-vm/asdf/commit/a7d3661f6c53b24ae1c21e93f94209f3af243349))
* lint scripts for local and CI ([#961](https://www.github.com/asdf-vm/asdf/issues/961)) ([5dafbc8](https://www.github.com/asdf-vm/asdf/commit/5dafbc8e390eacbcfcf97d6d2890e0aa6ef9cd60))
* pipe find into while ([26d2c64](https://www.github.com/asdf-vm/asdf/commit/26d2c64477a1faabedd9a5f97aa7da706988cd72))
* Quote commands correctly in plugin-test ([#1078](https://www.github.com/asdf-vm/asdf/issues/1078)) ([69ff2d0](https://www.github.com/asdf-vm/asdf/commit/69ff2d0c9a4fd273c9dac151345f60f7b146e569))
* regex validate plugin names on plugin add cmd ([#1010](https://www.github.com/asdf-vm/asdf/issues/1010)) ([7697e6e](https://www.github.com/asdf-vm/asdf/commit/7697e6e344809ab4603d0764fb8a969c2bbaf3b6))
* remove find -print0 ([b9228a2](https://www.github.com/asdf-vm/asdf/commit/b9228a26de6a0337a7b59fb5252323d368a72a92))
* Sed improvements ([#1087](https://www.github.com/asdf-vm/asdf/issues/1087)) ([4b93bc8](https://www.github.com/asdf-vm/asdf/commit/4b93bc81aa982b72621cd09e71eeea71ee009185))
* sed re error trailing backslash on FreeBSD ([#1046](https://www.github.com/asdf-vm/asdf/issues/1046)). ([#1047](https://www.github.com/asdf-vm/asdf/issues/1047)) ([47e8fb0](https://www.github.com/asdf-vm/asdf/commit/47e8fb051b3577d251376976d5767c520f3524fc))
* support latest with filter on local and global ([#633](https://www.github.com/asdf-vm/asdf/issues/633)) ([5cf8f89](https://www.github.com/asdf-vm/asdf/commit/5cf8f8962fbd5fe2bc86856bc4676f88e1aa8885))
* Use more idiomatic fish ([#1042](https://www.github.com/asdf-vm/asdf/issues/1042)) ([847ec73](https://www.github.com/asdf-vm/asdf/commit/847ec73751ced9d149ce0826309fee0f894ca664))
* wait until the plugin update are finished ([#1037](https://www.github.com/asdf-vm/asdf/issues/1037)) ([7e1f2a0](https://www.github.com/asdf-vm/asdf/commit/7e1f2a0d938052d4fa5ce6546f07b3decbd740cf))

## 0.8.1

Features

* Support for latest version in shell, local, and global commands (#802, #801)
* Parallel updating of all plugins (#626, #530)
* Print documentation website and GitHub URLs in help command (#820)

Fixed Bugs

* Fix plugin-update --all when there are no plugins (#805, #803)
* Ban `echo` command from asdf codebase (#806, #781)
* Add basic tests for plugin-update command (#807)
* Cleanup unused code in plugin update tests (#810)
* Fix resolution of relative symlinks (#815, #625)
* Fixes to GitHub workflow (#833)
* Update no plugin installed error message (#818)
* Remove process substitution that was problematic when POSIXLY_CORRECT is set (#851, #581)
* Fix warnings from find command (#853)
* Ban the `sort -V` command from the asdf codebase (#755, #867)
* Fix `plugin update --all` so that the default branch is used for each plugin (#800)
* Fix issues with awk command on some platforms used by plugin update command (#924, #899, #919)
* Add completion for the `system` version (#911)

Documentation

* Link to Homebrew common issues from documentation site (#795)
* Remove -vm suffix name in documentation (#798, #796)
* Fix file renames in release script (#809)
* Update supported versions in documentation (#825)
* Fix references to icongram files (#827)
* Fix broken links in CONTRIBUTING.md (#832, #852)
* Fix broken link in README.md (#835)
* Improve zsh completion directions for macOS,ZSH,Homebrew (#843)
* Add GitHub discussions link (#839)
* Add note about unsolicited formatting pull requests (#848)
* Fix formatting of GitHub name (#847)
* Explain the difference between ASDF_DIR and ASDF_DATA_DIR (#855)
* Update BATS link to bats-core GitHub repo (#858)
* Instruct users to symlink completions for Fish shell (#860)
* Support alternate locations for `.zshrc` (#871)
* Add "Add translation" link to navbar (#876)
* Clarify usage of the ASDF_DEFAULT_TOOL_VERSIONS_FILENAME variable (#912, #900)
* Show how to use the `system` version (#925, #868)
* Remove instructions for installing dependencies for Homebrew installs (#937, #936)

## 0.8.0

Features

* Add support for plugin documentation callback scripts (#512, #757)
* Add support for installing one tool specified in `.tool-versions` (#759, #760)
* Improve introduction and install sections of documentation (#699, #740)
* Add dependencies for openSUSE and ArchLinux to documentation (#714)
* Add support for keeping downloaded tool source code (#74, #669)
* Add `asdf info` command to print debug information (#786, #787)

Fixed Bugs

* Fix typo that caused plugin-test to erroneously fail (#780)
* Make sure shims are only appended to `PATH` once in Fish shell (#767, #777, #778)
* Print `.tool-versions` file path on shim error (#749, #750)
* Add `column` and `sort -V` to list of banned commands for the asdf codebase (#661, #754)
* Use editorconfig for shell formatting (#751)
* Remove use of `column` command in favor of awk (#721)
* Add `asdf shell` command to help output (#715, #737)
* Ensure consistency in indentation for message shown when no versions installed (#728)
* Fix dead link in documentation (#733)
* Fix typo in docs/core-manage-versions.md (#722)
* Fix a typo in the `asdf env` command documentation (#717)
* Fix Fish shell documentation (#709)
* Only list asdf dependencies on asdf website (#511, #710)
* Add CODEOWNERS file for GitHub reviews (#705)
* Add unit test for `asdf plugin-add` exit code (#689)

## 0.7.8

Features

* Add support for `post-plugin-add` and `pre-plugin-remove` in plugins. Add configurable command hooks for plugin installation and removal (#670, #683)

    ```shell
    pre_asdf_plugin_remove = echo will remove plugin ${1}
    pre_asdf_plugin_remove_foo = echo will remove plugin foo
    post_asdf_plugin_remove = echo removed plugin ${1}
    post_asdf_plugin_remove_foo = echo removed plugin foo
    ```

* Use different exit code if updates are disabled (#676)

Fixed Bugs

* Make sure extension commands are properly displayed by `asdf help`

  Extension commands are now expected to be inside plugins's `lib/commands/command-*.bash` instead of `bin/command*`.

  This change was made for two reasons: Keep the convention that all files to be sourced by bash should end with
  the `.bash` extension. And the `lib/commands/` directory mirrors the location of asdf own core commands.

  Added tests to make sure `asdf help` properly displays available extension commands.

* Remove automatic `compinit` from asdf.sh (#674, #678)

## 0.7.7

Features

* Add .bash file extension to files executed by Bash (#664)
* Add security policy (#660)

Fixed Bugs

* consistent use of plugin_name (#657)
* Default ZSH_VERSION to empty string (#656)
* Fix support for path version (#654)
* Fix hanging 'asdf update is a noop for non-git repos' test (#644)
* Fix Bash completions for `plugin-add` (#643)
* Fix `--unset` for Fish shell (#640)
* Misc. documentation fixes (#631, #652)
* Defaults to empty ASDF_DATA_DIR (#630)
* Remove shebang lines of sourced scripts (#629)
* Ignore shim directory for executable lookups (#623)
* Fix issue with preset version warning assuming that the shim name and plugin name are the same (#622)

## 0.7.6

Features

* Improve output format of `asdf plugin list all`

  Long plugin names were causing problems with how we used printf.
  Now we use the `column` command to properly render output.

* Now `asdf plugin list` can take both `--urls` and `--refs` options.

  When `--url` is used, we print the plugin's remote origin URL.
  While `--refs` prints the git branch/commit the plugin is at.

* It's now possible to update a plugin to an specific branch/commit.

  `asdf plugin update <name> [git-ref]`

  Checkouts a plugin to the specified `git-ref`. Defaults to `master`

* Now the `asdf plugin test` command can be specified with a plugin commit/branch to test.

  This will help CI checks to actually test the commit they are running for.
  Previously we always used the plugin's `master` branch.

* Subcommand CLI support.

   Users familiar with sub-command aware tools like `git` can now
   use `asdf` commands in the same way. For example:

   `asdf plugin list all` is equivalent to `asdf plugin-list-all`

   This is also the case for plugin extension commands, where the
   plugin name is an asdf main subcommand. ie. Having a `foo` plugin
   you can invoke: `asdf foo bar`

* Make `asdf plugin test` use the new `asdf latest` command. (#541)

   If a plugin version is not given explicitly, we use `asdf latest` to
   obtain the version of plugin to install for testing.

* `asdf --version` displays git revision when asdf_dir is a git clone.

   This will allow better bug reports since people can now include the
   git commit they are using.

* Add support for asdf extension commands.

   Plugins can provide `bin/command*` scripts or executables that will
   be callable using the asdf command line interface.

   See `docs/plugins-create.md` for more info.

* Add support for installing the latest stable version of a tool (#216)

    ```shell
    asdf install python latest
    asdf install python latest:3.7 # installs latest Python 3.7 version
    ```

* Add `asdf latest` command to display the latest stable version of a tool (#575)

    ```shell
    asdf latest python
    asdf latest python 3.7 # displays latest Python 3.7 version
    ```

* Add support for filtering versions returned by `asdf list-all`

    ```shell
    asdf list-all python 3.7 # lists available Python 3.7 versions
    ````

## 0.7.5

Features

* Add AppVeyor config for builds on Windows, for eventual Windows support (#450, #451)
* Add `--unset` flag to shell command (#563)

Fixed Bugs

* Fix multiple version install (#540, #585)
* Handle dashes in executable/shim names properly (#565, #589)
* Fix bug in sed command so `path:...` versions are handled correctly (#559, #591)

## 0.7.4

Features

* Add quite flag to git clone (#546)
* Improve docs for Homebrew (#553, #554)

Fixed Bugs

* Don't include the current directory in `PATH` variable in `asdf env` environment (#543, #560)
* Fix `asdf plugin-test` dependency on Git when installed via Homebrew (#509, #556)

## 0.7.3

Features

* Make `asdf install` check for versions in legacy files (#533, #539)

Fixed Bugs

* Address shellcheck warning and use shell globbing instead of `ls` (#525)

## 0.7.2

Features

* Add unit tests for untested code in asdf.sh and asdf.fish (#286, #507, #508)
* Switched to a maintained version of BATS (#521)

Fixed Bugs

* Don't iterate on output of `ls` (#513)
* Check shims for full tool version so adding new versions to a shim works properly (#517, #524)

## 0.7.1

Features

* Add mksh support
* Add documentation about using multiple versions of the same plugin
* Remove post_COMMAND hooks
* Add `asdf shell` command to set a version for the current shell (#480)
* Ignore comments in .tool-versions (#498, #504)

Fixed Bugs

* Avoid modifying `fish_user_paths`
* Restore support for legacy file version (#484)
* Restore support for multiple versions
* Fix bug when trying to locate shim (#488)
* Run executable using `exec` (#502)

## 0.7.0

Features

* Shims can be invoked directly via `asdf exec <command> [args...]` without requiring to have all shims on path (#374).
* New `asdf env <command>` can be used to print or execute with the env that would be used to execute a shim. (#435)
* Configurable command hooks from `.asdfrc` (#432, #434)
  Suppose a `foo` plugin is installed and provides a `bar` executable,
  The following hooks will be executed when set:

    ```shell
    pre_asdf_install_foo = echo will install foo version ${1}
    post_asdf_install_foo = echo installed foo version ${1}

    pre_asdf_reshim_foo = echo will reshim foo version ${1}
    post_asdf_reshim_foo = echo reshimmed foo version ${1}

    pre_foo_bar = echo about to execute command bar from foo with args: ${@}
    post_foo_bar = echo just executed command bar from foo with args: ${@}

    pre_asdf_uninstall_foo = echo will remove foo version ${1}
    post_asdf_uninstall_foo = echo removed foo version ${1}
    ```
* New shim version meta-data allows shims to not depend on a particular plugin
  nor on its relative executable path (#431)
  Upgrading requires shim re-generation and should happen automatically by `asdf-exec`:
  `rm -rf ~/.asdf/shims/` followed by `asdf reshim`
* Added lots of tests for shim execution.
  We now make sure that shim execution obeys plugins hooks like `list-bin-paths` and
  `exec-path`.
* Shims now are thin wrappers around `asdf exec` that might be faster
  for most common use case: (versions on local .tool-versions file) but fallbacks to
  slower `get_preset_version_for` which takes legacy formats into account.
* Shim exec recommends which plugins or versions to set when command is not found.
* `asdf reshim` without arguments now reshims all installed plugins (#407)
* Add `asdf shim-versions <executable>` to list on which plugins and versions is a command
  available. (#380, #433)
* Add documentation on installing dependencies via Spack (#471)

Fixed Bugs

* Fix `update` command so it doesn't crash when used on Brew installations (#429, #474, #439, #436)

## 0.6.3

Features

* Make `which` command work with any binary included in a plugin installation (#205, #382)
* Add documentation for documentation website (#274, #396, #422, #423, #427, #430)

Fixed Bugs

* Silence errors during tab completion (#404)
* Remove unused asdf shims directory from `PATH` (#408)
* Fix issues with update command that prevented updates for installations in custom locations (#411)
* Fix shellcheck warnings on OSX (#416)
* Add tests for versions set by environment variables (#417, #327)
* Continue `list` output even when version is not found (#419)
* Fixed user paths for fish (#420, #421)
* Custom exec path tests (#324, #424)

## 0.6.2

Fixed Bugs

* Fix `system` logic so shims directory is removed from `PATH` properly (#402, #406)
* Support `.tool-versions` files that don't end in a newline (#403)

## 0.6.1

Features

* Make `where` command default to current version (#389)
* Optimize code for listing all plugins (#388)
* Document `$TRAVIS_BUILD_DIR` in the plugin guide (#386)
* Add `--asdf-tool-version` flag to plugin-test command (#381)
* Add `-p` flag to `local` command (#377)

Fixed Bugs

* Fix behavior of `current` command when multiple versions are set (#401)
* Fix fish shell init code (#392)
* Fix `plugin-test` command (#379)
* Add space before parenthesis in `current` command output (#371)

## 0.6.0

Features

* Add support for `ASDF_DATA_DIR` environment variable (#275, #335, #361, #364, #365)

Fixed Bugs

* Fix `asdf current` so it works when no versions are installed (#368, #353)
* Don't try to install system version (#369, #351)
* Make `resolve_symlink` function work with relative symlinks (#370, #366)
* Fix version changing code so it preserves symlinks (#329, #337)
* Fix ShellCheck warnings (#336)

## 0.5.1

Features

* Better formatting for `asdf list` output (#330, #331)

Fixed Bugs

* Correct environment variable name used for version lookup (#319, #326 #328)
* Remove unnecessary `cd` in `asdf.sh` (#333, #334)
* Correct Fish shell load script (#340)

## 0.5.0

Features

* Changed exit codes for shims so we use codes with special meanings when possible (#305, #310)
* Include plugin name in error message if plugin doesn't exist (#315)
* Add support for custom executable paths (#314)
* `asdf list` with no arguments should list all installed versions of all plugins (#311)

Fixed Bugs

* Print "No version set" message to stderr (#309)
* Fix check for asdf directories in path for Fish shell (#306)

## 0.4.3

Features

* Suggest action when no version is set (#291, #293)

Fixed Bugs

* Fix issue with asdf not always being added to beginning of `$PATH` (#288, #303, #304)
* Fix incorrect `ASDF_CONFIG_FILE` environment variable name (#300)
* Fix `asdf current` so it shows environment variables that are setting versions (#292, 294)

## 0.4.2

Features

* Add support for `ASDF_DEFAULT_TOOL_VERSIONS_FILENAME` environment variable (#201, #228)
* Only add asdf to `PATH` once (#261, #271)
* Add `--urls` flag to `plugin-list` commands (#273)

Fixed Bugs

* Incorrect `grep` command caused version command to look at the wrong tool when reporting the version (#262)

## 0.4.1

Features

* `asdf install` will also search for `.tool-versions` in parent directories (#237)

Fixed Bugs

* bad use of `sed` caused shims and `.tool-versions` to be duplicated with `-e` (#242, #250)
* `asdf list` now outputs ref-versions as used on `.tool-versions` file (#243)
* `asdf update` will explicitly use the `origin` remote when updating tags (#231)
* All code is now linted by shellcheck (#223)
* Add test to fail builds if banned commands are found (#251)

## 0.4.0

Features

* Add CONTRIBUTING guidelines and GitHub issue and pull request templates (#217)
* Add `plugin-list-all` command to list plugins from asdf-plugins repo. (#221)
* `asdf current` shows all current tool versions when given no args (#219)
* Add asdf-plugin-version metadata to shims (#212)
* Add release.sh script to automate release of new versions (#220)

Fixed Bugs

* Allow spaces on path containing the `.tool-versions` file (#224)
* Fixed bug in `--version` functionality so it works regardless of how asdf was installed (#198)

## 0.3.0

Features

* Add `update` command to make it easier to update asdf to the latest release (#172, #180)
* Add support for `system` version to allow passthrough to system installed tools (#55, #182)

Fixed Bugs

* Set `GREP_OPTIONS` and `GREP_COLORS` variables in util.sh so grep is always invoked with the correct settings (#170)
* Export `ASDF_DIR` variable so the Zsh plugin can locate asdf if it's in a custom location (#156)
* Don't add execute permission to files in a plugin's bin directory when adding the plugin (#124, #138, #154)

## 0.2.1

Features

* Determine global tool version even when used outside of home directory (#106)

Fixed Bugs

* Correct reading of `ref:` and `path:` versions (#112)
* Remove shims when uninstalling a version or removing a plugin (#122, #123, #125, #128, #131)
* Add a helpful error message to the install command (#135)

## 0.2.0

Features

* Improve plugin API for legacy file support (#87)
* Unify `asdf local` and `asdf global` version getters as `asdf current` (#83)
* Rename `asdf which` to `asdf current` (#78)

Fixed Bugs

* Fix bug that caused the `local` command to crash when the directory contains whitespace (#90)
* Misc typo corrections (#93, #99)

## 0.1.0

* First tagged release


================================================
FILE: CONTRIBUTING.md
================================================
# How to Contribute to asdf

There are many ways to contribute to `asdf`, thanks for taking the time to read and help.

## `asdf` Core

### Did you find a bug?

Ensure the bug is actually an issue with asdf and not a plugin. If the bug only occurs when using one tool installed by `asdf` and not others it is likely an issue with the **plugin**. Find the plugin repo URL with `asdf plugin list --urls`, browse their repo Issues and if no solution is found open a new Issue there.

Ensure the bug was not already reported in existing [Issues](https://github.com/asdf-vm/asdf/issues). If not, then please [open a new Issue](https://github.com/asdf-vm/asdf/issues/new/choose). Please be as specific as possible when reporting the issue.

### New Features/Proposals

Please [open a new Feature Request](https://github.com/asdf-vm/asdf/issues/new/choose) to discuss the feature before implementing a solution.

### Developing with the Core

See [docs/contribute/core.md](docs/contribute/core.md) or on our [Docs Site](https://asdf-vm.com/contribute/core.html).

## Documentation

Documentation can always be improved! See [docs/contribute/documentation.md](docs/contribute/documentation.md) or on our [Docs Site](https://asdf-vm.com/contribute/documentation.html).

## First-Party Plugins

We always need help to maintain our plugins. See [docs/contribute/first-party-plugins.md](docs/contribute/first-party-plugins.md) or on our [Docs Site](https://asdf-vm.com/contribute/first-party-plugins.html).

## Create a Plugin?

Please read the [docs/plugins/create.md](docs/plugins/create.md) or on our [Docs Site](https://asdf-vm.com/plugins/create.html).

## GitHub Action

See the [asdf actions repo](https://github.com/asdf-vm/actions) for existing Issues, conversations and Contributing Guidelines.

---

Thanks for contributing!


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2014 Akash Manohar J

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: Makefile
================================================
MAIN_PACKAGE_PATH := ./cmd/asdf
TARGET_DIR := .
TARGET := asdf
LINKER_FLAGS = '-s'

# Not sure what the default location should be for builds
build: # test lint
	go build -ldflags=${LINKER_FLAGS} -o=${TARGET_DIR}/${TARGET} ${MAIN_PACKAGE_PATH}

fmt:
	go fmt ./...
	go run mvdan.cc/gofumpt -l -w .

verify:
	go mod verify

tidy:
	go mod tidy -v

audit: verify vet test

test:
	go test -coverprofile=/tmp/coverage.out  -bench= -race ./...

cover: test
	go tool cover -html=/tmp/coverage.out

lint: fmt
	go run honnef.co/go/tools/cmd/staticcheck -tests -show-ignored ./...
	go run github.com/mgechev/revive -set_exit_status ./...

vet: fmt
	go vet ./...

run: build
	${TARGET_DIR}/${TARGET}

.PHONY: fmt lint vet build test run


================================================
FILE: README.md
================================================
# asdf

[![Lint](https://github.com/asdf-vm/asdf/actions/workflows/lint.yml/badge.svg)](https://github.com/asdf-vm/asdf/actions/workflows/lint.yml) [![Tests](https://github.com/asdf-vm/asdf/actions/workflows/tests.yml/badge.svg)](https://github.com/asdf-vm/asdf/actions/workflows/tests.yml)

**Manage multiple runtime versions with a single CLI tool, extendable via plugins** - [docs at asdf-vm.com](https://asdf-vm.com/)

asdf is a CLI tool that can manage multiple language runtime versions on a per-project basis. It is like `gvm`, `nvm`, `rbenv` & `pyenv` (and more) all in one! Simply install your language's plugin!

## Why use asdf?

- single CLI for multiple languages
- consistent commands to manage all your languages
- single global config keeping defaults in one place
- single `.tool-versions` config file per project
- support for existing config files `.node-version`, `.nvmrc`, `.ruby-version` for easy migration
- automatically switches runtime versions as you traverse your directories
- simple plugin system to add support for your language of choice
- shell completion available for common shells (Bash, Zsh, Fish, Elvish)

## Documentation

[Please head over to the documentation site for more information](https://asdf-vm.com/)!

- [Getting Started](https://asdf-vm.com/guide/getting-started.html)
- [All Commands](https://asdf-vm.com/manage/commands.html)
- [All Plugins](https://github.com/asdf-vm/asdf-plugins)
- [Create a Plugin](https://asdf-vm.com/plugins/create.html) with our [asdf-plugin-template](https://github.com/asdf-vm/asdf-plugin-template)
- [asdf GitHub Actions](https://github.com/asdf-vm/actions)

## Contributing

See [CONTRIBUTING.md in the repo](https://github.com/asdf-vm/asdf/blob/master/CONTRIBUTING.md) or the [Contributing section on the docs site](http://asdf-vm.com/contribute/core.html#initial-setup).

## Community & Questions

- [FAQ](https://asdf-vm.com/more/faq.html)
- [![GitHub Issues](https://icongr.am/simple/github.svg?color=808080&size=16) GitHub Issues](https://github.com/asdf-vm/asdf/issues): report a bug or raise a feature request to the `asdf` core team
- [![StackOverflow Tag](https://icongr.am/fontawesome/stack-overflow.svg?size=16&color=808080) StackOverflow Tag](https://stackoverflow.com/questions/tagged/asdf-vm): see existing Q&A for `asdf`. Some of the core team watch this tag in addition to our helpful community

## Ballad of asdf

> Once upon a time there was a programming language<br/>
> There were many versions of it<br/>
> So people wrote a version manager for it<br/>
> To switch between versions for projects<br/>
> Different, old, new.
> 
> Then there came more programming languages<br/>
> So there came more version managers<br/>
> And many commands for them
> 
> I installed a lot of them<br/>
> I learnt a lot of commands
> 
> Then I said, just one more version manager<br/>
> Which I will write instead
> 
> So, there came another version manager<br/>
> **asdf version manager** - <https://github.com/asdf-vm/asdf>
> 
> A version manager so extendable<br/>
> for which anyone can create a plugin<br/>
> To support their favourite language<br/>
> No more installing more version managers<br/>
> Or learning more commands

---

<figure>
  <blockquote>
  This was the mail I wrote to a few friends to tell them about the project. Thanks to <a href="https://twitter.com/roshanvid" target="_blank" rel="noreferrer">@roshanvid</a> for suggesting that this go into the readme
  </blockquote>
  <figcaption>
    <a href="https://github.com/HashNuke" target="_blank" rel="noreferrer">@HashNuke</a>
  </figcaption>
</figure>


================================================
FILE: SECURITY.md
================================================
# Security Policy

**This security policy only applies to asdf core, which is the code contained in
this repository. All plugins are the responsibility of their creators and are
not covered under this security policy.**

## Supported Versions

<!-- x-release-please-start-version -->

```
0.18.1
```

<!-- x-release-please-end -->

Typically only the latest version is maintained. Versions are released
sequentially, with major, minor, and patch versions incremented as necessary.

If a vulnerability is found in an old version of asdf, updating to the latest
version of asdf will be required.

## Reporting a Vulnerability

To report a vulnerability please contact one of:

- @Stratus3D via email: see https://stratus3d.com/contact/ for email. PGP is not
  setup for this email address.
- @danhper via email: see https://daniel.perez.sh/ for email and PGP key
- @jthegedus via email: see https://github.com/jthegedus for email. PGP is not
  setup for this email address.


================================================
FILE: asdf.elv
================================================
use path
use re
use str

var asdf_dir = ~'/.asdf'
if (and (has-env ASDF_DIR) (!=s $E:ASDF_DIR '')) {
  set asdf_dir = $E:ASDF_DIR
} else {
  set-env ASDF_DIR $asdf_dir
}

var asdf_data_dir = $asdf_dir
if (and (has-env ASDF_DATA_DIR) (!=s $E:ASDF_DATA_DIR '')) {
  set asdf_data_dir = $E:ASDF_DATA_DIR
}

# Add function wrapper so we can export variables
fn asdf {|command @args|
  if (==s $command 'shell') {
    # set environment variables
    var parts = [($asdf_dir'/bin/asdf' export-shell-version elvish $@args)]
    if (==s $parts[0] 'set-env') {
      set-env $parts[1] $parts[2]
    } elif (==s $parts[0] 'unset-env') {
      unset-env $parts[1]
    }
  } else {
    # forward other commands to asdf script
    $asdf_dir'/bin/asdf' $command $@args
  }
}

fn match {|argz @pats|
  var matched = $true
  if (!= (count $argz) (count $pats)) {
    set matched = $false
  } else {
    for i [(range (count $pats))] {
      var pat = '^'$pats[$i]'$'
      var arg = $argz[$i]
      if (not (re:match $pat $arg)) {
        set matched = $false
        break
      }
    }
  }
  put $matched
}

fn ls-shims {
  ls $asdf_data_dir'/shims'
}

fn ls-executables {
  # Print all executable files and links in path
  try {
    find $@paths '(' -type f -o -type l ')' -print 2>/dev/null | each {|p|
      try {
        if (test -x $p) {
          path:base $p
        }
      } catch {
        # don't fail if permission denied
      }
    }
  } catch {
    # silence default non-zero exit status
  }
}

fn ls-installed-versions {|plugin_name|
  asdf list $plugin_name | each {|version|
    put (re:replace '\s*(.*)\s*' '${1}' $version)
  }
}

fn ls-all-versions {|plugin_name|
  asdf list-all $plugin_name | each {|version|
    put (re:replace '\s*(.*)\s*' '${1}' $version)
  }
}

# Append ~/.asdf/bin and ~/.asdf/shims to PATH
for path [
  $asdf_dir'/bin'
  $asdf_data_dir'/shims'
] {
  if (not (has-value $paths $path)) {
    set paths = [
      $path
      $@paths
    ]
  }
}

# Setup argument completions
fn arg-completer {|@argz|
  set argz = $argz[1..-1]  # strip 'asdf' and trailing empty string
  var num = (count $argz)
  if (== $num 0) {
    # list all subcommands
    find $asdf_dir'/lib/commands' -name 'command-*' | each {|cmd|
      put (re:replace '.*/command-(.*)\.bash' '${1}' $cmd)
    }
    put 'plugin'
  } else {
    if (match $argz 'current') {
      # asdf current <name>
      asdf plugin-list
    } elif (match $argz 'env') {
      # asdf env <command>
      ls-shims
    } elif (match $argz 'env' '.*') {
      # asdf env <command> [util]
      ls-executables
    } elif (match $argz 'exec') {
      # asdf exec <command>
      ls-shims
    } elif (match $argz 'global') {
      # asdf global <name>
      asdf plugin-list
    } elif (match $argz 'global' '.*') {
      # asdf global <name> <version>
      ls-installed-versions $argz[-1]
    } elif (match $argz 'install') {
      # asdf install <name>
      asdf plugin-list
    } elif (match $argz 'install' '.*') {
      # asdf install <name> <version>
      ls-all-versions $argz[-1]
    } elif (match $argz 'install' '.*' '.*') {
      # asdf install <name> <version> [--keep-download]
      put '--keep-download'
    } elif (match $argz 'latest') {
      # asdf latest <name>
      asdf plugin-list
    } elif (match $argz 'latest' '.*') {
      # asdf latest <name> [<version>]
      ls-all-versions $argz[-1]
    } elif (match $argz 'list-all') {
      # asdf list all <name>
      asdf plugin-list
    } elif (match $argz 'list-all' '.*') {
      # asdf list all <name> [<version>]
      ls-all-versions $argz[-1]
    } elif (match $argz 'list') {
      # asdf list <name>
      asdf plugin-list
    } elif (match $argz 'list' '.*') {
      # asdf list <name> [<version>]
      ls-installed-versions $argz[-1]
    } elif (match $argz 'local') {
      # asdf local <name> [-p|--parent]
      asdf plugin-list
      put '-p'
      put '--parent'
    } elif (match $argz 'local' '(-p|(--parent))') {
      # asdf local <name> [-p|--parent] <version>
      asdf plugin-list
    } elif (match $argz 'local' '.*') {
      # asdf local <name> [-p|--parent]
      # asdf local <name> <version>
      ls-installed-versions $argz[-1]
      put '-p'
      put '--parent'
    } elif (match $argz 'local' '(-p|(--parent))' '.*') {
      # asdf local [-p|--parent] <name> <version>
      ls-installed-versions $argz[-1]
    } elif (match $argz 'local' '.*' '(-p|(--parent))') {
      # asdf local <name> [-p|--parent] <version>
      ls-installed-versions $argz[-2]
    } elif (match $argz 'local' '.*' '.*') {
      # asdf local <name> <version> [-p|--parent]
      put '-p'
      put '--parent'
    } elif (or (match $argz 'plugin-add') (match $argz 'plugin' 'add')) {
      # asdf plugin add <name>
      asdf plugin-list-all | each {|line|
        put (re:replace '([^\s]+)\s+.*' '${1}' $line)
      }
    } elif (or (match $argz 'plugin-list') (match $argz 'plugin' 'list')) {
      # asdf plugin list
      put '--urls'
      put '--refs'
      put 'all'
    } elif (or (match $argz 'plugin-push') (match $argz 'plugin' 'push')) {
      # asdf plugin push <name>
      asdf plugin-list
    } elif (or (match $argz 'plugin-remove') (match $argz 'plugin' 'remove')) {
      # asdf plugin remove <name>
      asdf plugin-list
    } elif (and (>= (count $argz) 3) (match $argz[..3] 'plugin-test' '.*' '.*')) {
      # asdf plugin-test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
      put '--asdf-plugin-gitref'
      put '--asdf-tool-version'
      ls-executables
      ls-shims
    } elif (and (>= (count $argz) 4) (match $argz[..4] 'plugin' 'test' '.*' '.*')) {
      # asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
      put '--asdf-plugin-gitref'
      put '--asdf-tool-version'
      ls-executables
      ls-shims
    } elif (or (match $argz 'plugin-update') (match $argz 'plugin' 'update')) {
      # asdf plugin update <name>
      asdf plugin-list
      put '--all'
    } elif (match $argz 'plugin') {
      # list plugin-* subcommands
      find $asdf_dir'/lib/commands' -name 'command-plugin-*' | each {|cmd|
        put (re:replace '.*/command-plugin-(.*)\.bash' '${1}' $cmd)
      }
    } elif (match $argz 'reshim') {
      # asdf reshim <name>
      asdf plugin-list
    } elif (match $argz 'reshim' '.*') {
      # asdf reshim <name> <version>
      ls-installed-versions $argz[-1]
    } elif (match $argz 'shim-versions') {
      # asdf shim-versions <command>
      ls-shims
    } elif (match $argz 'uninstall') {
      # asdf uninstall <name>
      asdf plugin-list
    } elif (match $argz 'uninstall' '.*') {
      # asdf uninstall <name> <version>
      ls-installed-versions $argz[-1]
    } elif (match $argz 'update') {
      if (== $num 1) {
        # asdf update
        put '--head'
      }
    } elif (match $argz 'where') {
      # asdf where <name>
      asdf plugin-list
    } elif (match $argz 'where' '.*') {
      # asdf where <name> [<version>]
      ls-installed-versions $argz[-1]
    } elif (match $argz 'which') {
      ls-shims
    }
  }
}


================================================
FILE: asdf.fish
================================================
if test -z $ASDF_DIR
    set ASDF_DIR (builtin realpath --no-symlinks (dirname (status filename)))
end
set --export ASDF_DIR $ASDF_DIR

set -l _asdf_bin "$ASDF_DIR/bin"
if test -z $ASDF_DATA_DIR
    set _asdf_shims "$HOME/.asdf/shims"
else
    set _asdf_shims "$ASDF_DATA_DIR/shims"
end

# Do not use fish_add_path (added in Fish 3.2) because it
# potentially changes the order of items in PATH
if not contains $_asdf_bin $PATH
    set -gx --prepend PATH $_asdf_bin
end
if not contains $_asdf_shims $PATH
    set -gx --prepend PATH $_asdf_shims
end
set --erase _asdf_bin
set --erase _asdf_shims

# The asdf function is a wrapper so we can export variables
function asdf
    set command $argv[1]
    set -e argv[1]

    switch "$command"
        case shell
            # Source commands that need to export variables.
            command asdf export-shell-version fish $argv | source # asdf_allow: source
        case '*'
            # Forward other commands to asdf script.
            command asdf "$command" $argv
    end
end


================================================
FILE: asdf.nu
================================================
def --env configure-asdf [] {
    $env.ASDF_DIR = (
      if ($env | get --ignore-errors ASDF_NU_DIR | is-empty) == false {
        $env.ASDF_NU_DIR
      }
      else if ($env | get --ignore-errors ASDF_DIR | is-empty) == false {
        $env.ASDF_DIR
      } else {
        print --stderr "asdf: Either ASDF_NU_DIR or ASDF_DIR must not be empty"
        return
      }
    )

    let shims_dir = (
      if ( $env | get --ignore-errors ASDF_DATA_DIR | is-empty ) {
        $env.HOME | path join '.asdf'
      } else {
        $env.ASDF_DATA_DIR
      } | path join 'shims'
    )
    let asdf_bin_dir = ( $env.ASDF_DIR | path join 'bin' )

    $env.PATH = ( $env.PATH | split row (char esep) | where { |p| $p != $shims_dir } | prepend $shims_dir )
    $env.PATH = ( $env.PATH | split row (char esep) | where { |p| $p != $asdf_bin_dir } | prepend $asdf_bin_dir )
}

configure-asdf

## Completions

module asdf {

    def "complete asdf sub-commands" [] {
        [
            "plugin",
            "list",
            "install",
            "uninstall",
            "current",
            "where",
            "which",
            "local",
            "global",
            "shell",
            "latest",
            "help",
            "exec",
            "env",
            "info",
            "reshim",
            "shim-version",
            "update"
        ]
    }

    def "complete asdf installed" [] {
        ^asdf plugin list | lines | each { |line| $line | str trim }
    }


    def "complete asdf plugin sub-commands" [] {
        [
            "list",
            "list all",
            "add",
            "remove",
            "update"
        ]
    }

    def "complete asdf installed plugins" [] {
        ^asdf plugin list | lines | each { |line|
            $line | str trim
        }
    }

    def "complete asdf plugin versions all" [context: string] {
        let plugin = $context | str trim | split words | last
        ^asdf list all $plugin 
        | lines 
        | each { |line| $line | str trim } 
        | prepend "latest"
    }

    def "complete asdf plugin versions installed" [context: string] {
        let plugin = $context | str trim | split words | last
        let versions = ^asdf list $plugin 
        | lines 
        | each { |line| $line | str trim }
        | each { |version| if ($version | str starts-with "*") {{value: ($version | str substring 1..), description: "current version"}} else {{value: $version, description: ""}} }
        
        let latest = ^asdf latest $plugin | str trim

        if ($versions | get value | any {|el| $el == $latest}) {
            $versions | prepend {value: "latest", description: $"alias to ($latest)"}
        } else {
            $versions
        }
    }

    # ASDF version manager
    export extern main [
        subcommand?: string@"complete asdf sub-commands"
    ]

    # Manage plugins
    export extern "asdf plugin" [
        subcommand?: string@"complete asdf plugin sub-commands"
    ]

    # List installed plugins
    export def "asdf plugin list" [
        --urls # Show urls
        --refs # Show refs
    ] {

        let params = [
            {name: 'urls', enabled: $urls, flag: '--urls',
             template: '\s+?(?P<repository>(?:http[s]?|git).+\.git|/.+)'}
            {name: 'refs', enabled: $refs, flag: '--refs',
             template: '\s+?(?P<branch>\w+)\s+(?P<ref>\w+)'}
        ]

        let template = '(?P<name>.+)' + (
                            $params |
                            where enabled |
                            get --ignore-errors template |
                            str join '' |
                            str trim
                        )

        let flags = ($params | where enabled | get --ignore-errors flag | default '' )

        ^asdf plugin list ...$flags | lines | parse -r $template | str trim
    }

    # list all available plugins
    export def "asdf plugin list all" [] {
        let template = '(?P<name>.+)\s+?(?P<installed>[*]?)(?P<repository>(?:git|http|https).+)'
        let is_installed = { |it| $it.installed == '*' }

        ^asdf plugin list all |
            lines |
            parse -r $template |
            str trim |
            update installed $is_installed |
            sort-by name
    }

    # Add a plugin
    export extern  "asdf plugin add" [
        name: string # Name of the plugin
        git_url?: string # Git url of the plugin
    ]

    # Remove an installed plugin and their package versions
    export extern "asdf plugin remove" [
        name: string@"complete asdf installed plugins" # Name of the plugin
    ]

    # Update a plugin
    export extern "asdf plugin update" [
        name: string@"complete asdf installed plugins" # Name of the plugin
        git_ref?: string # Git ref to update the plugin
    ]

    # Update all plugins to the latest commit
    export extern "asdf plugin update --all" []

    # install a package version
    export extern "asdf install" [
        name?: string@"complete asdf installed plugins" # Name of the package
        version?: string@"complete asdf plugin versions all" # Version of the package or latest
    ]


    # Remove an installed package version
    export extern "asdf uninstall" [
        name: string@"complete asdf installed" # Name of the package
        version: string@"complete asdf plugin versions installed" # Version of the package
    ]

    # Display current version
    export extern "asdf current" [
        name?: string@"complete asdf installed" # Name of installed version of a package
    ]

    # Display path of an executable
    export extern "asdf which" [
        command: string # Name of command
    ]

    # Display install path for an installed package version
    export extern "asdf where" [
        name: string@"complete asdf installed" # Name of installed package
        version?: string@"complete asdf plugin versions installed" # Version of installed package
    ]

    # Set the package local version
    export extern "asdf local" [
        name: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Version of the package or latest
    ]

    # Set the package global version
    export extern "asdf global" [
        name: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Version of the package or latest
    ]

    # Set the package to version in the current shell
    export extern "asdf shell" [
        name: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Version of the package or latest
    ]

    # Show latest stable version of a package
    export extern "asdf latest" [
        name: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Filter latest stable version from this version
    ]

    # Show latest stable version for all installed packages
    export extern "asdf latest --all" []

    # List installed package versions
    export extern "asdf list" [
        name?: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Filter the version
    ]

    # List all available package versions
    export def "asdf list all" [
        name: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed"="" # Filter the version
    ]    {
        ^asdf list all $name $version | lines | parse "{version}" | str trim
    }

    # Show documentation for plugin
    export extern "asdf help" [
        name: string@"complete asdf installed" # Name of the plugin
        version?: string@"complete asdf plugin versions installed" # Version of the plugin
    ]

    # Execute a command shim for the current version
    export extern "asdf exec" [
        command: string # Name of the command
        ...args: any # Arguments to pass to the command
    ]

    # Run util (default: env) inside the environment used for command shim execution
    export extern "asdf env" [
        command?: string # Name of the command
        util?: string = 'env' # Name of util to run
    ]

    # Show information about OS, Shell and asdf Debug
    export extern "asdf info" []

    # Recreate shims for version package
    export extern "asdf reshim" [
        name?: string@"complete asdf installed" # Name of the package
        version?: string@"complete asdf plugin versions installed" # Version of the package
    ]

    # List the plugins and versions that provide a command
    export extern "asdf shim-version" [
        command: string # Name of the command
    ]

    # Update asdf to the latest version on the stable branch
    export extern "asdf update" []

    # Update asdf to the latest version on the main branch
    export extern "asdf update --head" []

}

use asdf *


================================================
FILE: asdf.ps1
================================================
$Env:ASDF_DIR = $PSScriptRoot

$_asdf_bin = "$Env:ASDF_DIR/bin"
if ($null -eq $ASDF_DATA_DIR -or $ASDF_DATA_DIR -eq '') {
  $_asdf_shims = "${env:HOME}/.asdf/shims"
}
else {
  $_asdf_shims = "$ASDF_DATA_DIR/shims"
}

$env:PATH = "${_asdf_bin}:${_asdf_shims}:${env:PATH}"

if ($env:PATH -cnotlike "*${_asdf_bin}*") {
  $env:PATH = "_asdf_bin:${env:PATH}"
}
if ($env:PATH -cnotlike "*${_asdf_shims}*") {
  $env:PATH = "_asdf_shims:${env:PATH}"
}

Remove-Variable -Force _asdf_bin, _asdf_shims

function asdf {
  $asdf = $(Get-Command -CommandType Application asdf).Source

  if ($args.Count -gt 0 -and $args[0] -eq 'shell') {
    Invoke-Expression $(& $asdf 'export-shell-version' pwsh $args[1..($args.Count + -1)])
  }
  else {
    & $asdf $args
  }
}


================================================
FILE: asdf.sh
================================================
# shellcheck shell=sh
# shellcheck disable=SC1007

# This file is the entrypoint for all POSIX-compatible shells. If `ASDF_DIR` is
# not already set, this script is able to calculate it, but only if the shell is
# either Bash, Zsh, and Ksh. For other shells, `ASDF_DIR` must be manually set.

export ASDF_DIR="${ASDF_DIR:-}"

if [ -z "$ASDF_DIR" ]; then
  if [ -n "${BASH_VERSION:-}" ]; then
    # Use BASH_SOURCE[0] to obtain the relative path to this source'd file. Since it's
    # a relative path, 'cd' to its dirname and use '$PWD' to obtain the fullpath.
    # Use 'builtin cd' to ensure user-defined 'cd()' functions aren't called.
    # Use variable '_asdf_old_dir' to avoid using subshells.

    _asdf_old_dir=$PWD
    # shellcheck disable=SC3028,SC3054
    if ! CDPATH= builtin cd -- "${BASH_SOURCE[0]%/*}"; then
      printf '%s\n' 'asdf: Error: Failed to cd' >&2
      unset -v _asdf_old_dir
      return 1
    fi
    ASDF_DIR=$PWD
    if ! CDPATH= builtin cd -- "$_asdf_old_dir"; then
      printf '%s\n' 'asdf: Error: Failed to cd' >&2
      unset -v _asdf_old_dir
      return 1
    fi
    unset -v _asdf_old_dir
  elif [ -n "${ZSH_VERSION:-}" ]; then
    # Use '%x' to expand to path of current file. It must be prefixed
    # with '(%):-', so it expands in non-prompt-string contexts.

    # shellcheck disable=SC2296
    ASDF_DIR=${(%):-%x}
    ASDF_DIR=${ASDF_DIR%/*}
  elif [ -n "${KSH_VERSION:-}" ] && [ -z "$PATHSEP" ]; then
    # Only the original KornShell (kornshell.com) has a '.sh.file' variable with the path
    # of the current file. To prevent errors with other variations, such as the MirBSD
    # Korn shell (mksh), test for 'PATHSEP' which is _not_ set on the original Korn Shell.

    # shellcheck disable=SC2296
    ASDF_DIR=${.sh.file}
    ASDF_DIR=${ASDF_DIR%/*}
  fi
fi

if [ -z "$ASDF_DIR" ]; then
  printf "%s\n" "asdf: Error: Source directory could not be calculated. Please set \$ASDF_DIR manually before sourcing this file." >&2
  return 1
fi

if [ ! -d "$ASDF_DIR" ]; then
  printf "%s\n" "asdf: Error: Variable '\$ASDF_DIR' is not a directory: $ASDF_DIR" >&2
  return 1
fi

_asdf_bin="$ASDF_DIR/bin"
_asdf_shims="${ASDF_DATA_DIR:-$HOME/.asdf}/shims"

_asdf_should_prepend=no
if [ -n "${ASDF_FORCE_PREPEND+x}" ]; then
  _asdf_should_prepend=$ASDF_FORCE_PREPEND
else
  # If ASDF_FORCE_PREPEND is not set, then prepend by default on macOS
  # to workaround `path_helper`.
  if [ -n "${BASH_VERSION:-}" ] || [ -n "${ZSH_VERSION:-}" ]; then
    # shellcheck disable=SC3028
    case $OSTYPE in
      darwin*) _asdf_should_prepend=yes ;;
    esac
  else
    if ! _asdf_output=$(uname); then
      printf "%s\n" "asdf: Error: Failed to execute 'uname'" >&2
      return 1
    fi
    if [ "$_asdf_output" = 'Darwin' ]; then
      _asdf_should_prepend=yes
    fi
    unset -v _asdf_output
  fi
fi

# If prepending is enabled, remove any existing instances of asdf from PATH so
# the prepending done after is always at the frontmost part of the PATH.
if [ "$_asdf_should_prepend" = 'yes' ]; then
  if [ -n "${BASH_VERSION:-}" ] || [ -n "${ZSH_VERSION:-}" ]; then
    # shellcheck disable=SC3060
    case ":$PATH:" in
      *":${_asdf_bin}:"*) PATH=${PATH//$_asdf_bin:/} ;;
    esac
    # shellcheck disable=SC3060
    case ":$PATH:" in
      *":${_asdf_shims}:"*) PATH=${PATH//$_asdf_shims:/} ;;
    esac
  else
    _path=${PATH}:
    _new_path=
    while [ -n "$_path" ]; do
      _part=${_path%%:*}
      _path=${_path#*:}

      if [ "$_part" = "$_asdf_bin" ] || [ "$_part" = "$_asdf_shims" ]; then
        continue
      fi

      _new_path="$_new_path${_new_path:+:}$_part"
    done
    PATH=$_new_path
    unset -v _path _new_path _part
  fi
fi
unset -v _asdf_should_prepend

case ":$PATH:" in
  *":$_asdf_bin:"*) : ;;
  *) PATH="$_asdf_bin:$PATH" ;;
esac
case ":$PATH:" in
  *":$_asdf_shims:"*) : ;;
  *) PATH="$_asdf_shims:$PATH" ;;
esac

unset -v _asdf_bin _asdf_shims

# The asdf function is a wrapper so we can export variables
asdf() {
  case $1 in
  "shell")
    if ! shift; then
      printf '%s\n' 'asdf: Error: Failed to shift' >&2
      return 1
    fi

    # Invoke command that needs to export variables.
    eval "$(asdf export-shell-version sh "$@")" # asdf_allow: eval
    ;;
  *)
    # Forward other commands to asdf script.
    command asdf "$@" # asdf_allow: ' asdf '
    ;;
  esac
}


================================================
FILE: ballad-of-asdf.md
================================================
# Ballad of asdf

> Once upon a time there was a programming language<br/>
> There were many versions of it<br/>
> So people wrote a version manager for it<br/>
> To switch between versions for projects<br/>
> Different, old, new.

> Then there came more programming languages<br/>
> So there came more version managers<br/>
> And many commands for them

> I installed a lot of them<br/>
> I learnt a lot of commands

> Then I said, just one more version manager<br/>
> Which I will write instead

> So, there came another version manager<br/>
> **asdf version manager** - <https://github.com/HashNuke/asdf>

> A version manager so extendable<br/>
> for which anyone can create a plugin<br/>
> To support their favourite language<br/>
> No more installing more version managers<br/>
> Or learning more commands

---

*This was the mail I wrote to a few friends to tell them about the project. Thanks to [@roshanvid](https://twitter.com/roshanvid) for suggesting that this go into the readme*


================================================
FILE: bin/private/asdf-exec
================================================
#!/usr/bin/env bash

# remove this asdf-exec file when releasing >=0.6.5
printf "asdf is self upgrading shims to new asdf exec ...\\n"

asdf_dir="$(dirname "$(dirname "$(dirname "$0")")")"
# shellcheck source=lib/utils.bash
. "$asdf_dir/lib/utils.bash"
rm "$(asdf_data_dir)"/shims/*
"$asdf_dir"/bin/asdf reshim
shim_name=$(basename "$2")

printf "asdf: now running %s\\n" "$shim_name"

exec "$shim_name" "${@:3}"


================================================
FILE: defaults
================================================
# See the docs for explanations: https://asdf-vm.com/manage/configuration.html

legacy_version_file = no
use_release_candidates = no
always_keep_download = no
plugin_repository_last_check_duration = 60
disable_plugin_short_name_repository = no
concurrency = auto


================================================
FILE: docs/.gitattributes
================================================
## GITATTRIBUTES FOR WEB PROJECTS
#
# These settings are for any web project.
#
# Details per file setting:
#   text    These files should be normalized (i.e. convert CRLF to LF).
#   binary  These files are binary and should be left untouched.
#
# Note that binary is a macro for -text -diff.
######################################################################

# Auto detect
##   Handle line endings automatically for files detected as
##   text and leave all files detected as binary untouched.
##   This will handle all files NOT defined below.
*                 text=auto

# Source code
*.bash            text eol=lf
*.bat             text eol=crlf
*.cmd             text eol=crlf
*.coffee          text
*.css             text
*.htm             text diff=html
*.html            text diff=html
*.inc             text
*.ini             text
*.js              text
*.json            text
*.jsx             text
*.less            text
*.ls              text
*.map             text -diff
*.od              text
*.onlydata        text
*.php             text diff=php
*.pl              text
*.ps1             text eol=crlf
*.py              text diff=python
*.rb              text diff=ruby
*.sass            text
*.scm             text
*.scss            text diff=css
*.sh              text eol=lf
*.sql             text
*.styl            text
*.tag             text
*.ts              text
*.tsx             text
*.xml             text
*.xhtml           text diff=html

# Docker
Dockerfile        text

# Documentation
*.ipynb           text
*.markdown        text
*.md              text
*.mdwn            text
*.mdown           text
*.mkd             text
*.mkdn            text
*.mdtxt           text
*.mdtext          text
*.txt             text
AUTHORS           text
CHANGELOG         text
CHANGES           text
CONTRIBUTING      text
COPYING           text
copyright         text
*COPYRIGHT*       text
INSTALL           text
license           text
LICENSE           text
NEWS              text
readme            text
*README*          text
TODO              text

# Templates
*.dot             text
*.ejs             text
*.haml            text
*.handlebars      text
*.hbs             text
*.hbt             text
*.jade            text
*.latte           text
*.mustache        text
*.njk             text
*.phtml           text
*.tmpl            text
*.tpl             text
*.twig            text
*.vue             text

# Configs
*.cnf             text
*.conf            text
*.config          text
.editorconfig     text
.env              text
.gitattributes    text
.gitconfig        text
.htaccess         text
*.lock            text -diff
package-lock.json text -diff
*.toml            text
*.yaml            text
*.yml             text
browserslist      text
Makefile          text
makefile          text

# Heroku
Procfile          text

# Graphics
*.ai              binary
*.bmp             binary
*.eps             binary
*.gif             binary
*.gifv            binary
*.ico             binary
*.jng             binary
*.jp2             binary
*.jpg             binary
*.jpeg            binary
*.jpx             binary
*.jxr             binary
*.pdf             binary
*.png             binary
*.psb             binary
*.psd             binary
# SVG treated as an asset (binary) by default.
*.svg             text
# If you want to treat it as binary,
# use the following line instead.
# *.svg           binary
*.svgz            binary
*.tif             binary
*.tiff            binary
*.wbmp            binary
*.webp            binary

# Audio
*.kar             binary
*.m4a             binary
*.mid             binary
*.midi            binary
*.mp3             binary
*.ogg             binary
*.ra              binary

# Video
*.3gpp            binary
*.3gp             binary
*.as              binary
*.asf             binary
*.asx             binary
*.fla             binary
*.flv             binary
*.m4v             binary
*.mng             binary
*.mov             binary
*.mp4             binary
*.mpeg            binary
*.mpg             binary
*.ogv             binary
*.swc             binary
*.swf             binary
*.webm            binary

# Archives
*.7z              binary
*.gz              binary
*.jar             binary
*.rar             binary
*.tar             binary
*.zip             binary

# Fonts
*.ttf             binary
*.eot             binary
*.otf             binary
*.woff            binary
*.woff2           binary

# Executables
*.exe             binary
*.pyc             binary

# RC files (like .babelrc or .eslintrc)
*.*rc             text

# Ignore files (like .npmignore or .gitignore)
*.*ignore         text


================================================
FILE: docs/.gitignore
================================================
### Custom ###
# VitePress build output & cache directory
.vitepress/cache
.vitepress/dist

# Created by https://www.toptal.com/developers/gitignore/api/node
# Edit at https://www.toptal.com/developers/gitignore?templates=node

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Snowpack dependency directory (https://snowpack.dev/)
web_modules/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test
.env.production

# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache

# Next.js build output
.next
out

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/.cache
.vuepress/.temp

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port

# Stores VSCode versions used for testing VSCode extensions
.vscode-test

# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

# End of https://www.toptal.com/developers/gitignore/api/node


================================================
FILE: docs/.prettierignore
================================================
# VitePress build output & cache directory
.vitepress/cache
.vitepress/dist
node_modules
package.json
package-lock.json


================================================
FILE: docs/.tool-versions
================================================
nodejs 22.10.0


================================================
FILE: docs/.vitepress/config.ts
================================================
import { defineConfig } from "vitepress";
import * as navbars from "./navbars";
import * as sidebars from "./sidebars";

// https://vitepress.dev/reference/site-config
export default defineConfig({
  title: "asdf",
  description: "Manage multiple runtime versions with a single CLI tool",
  lastUpdated: true,
  locales: {
    root: {
      label: "English",
      lang: "en-US",
      themeConfig: {
        nav: navbars.en,
        sidebar: sidebars.en,
      },
    },
    "ko-kr": {
      label: "한국어",
      lang: "ko-kr",
      themeConfig: {
        nav: navbars.ko_kr,
        sidebar: sidebars.ko_kr,
      },
    },
    "ja-jp": {
      label: "日本語",
      lang: "ja-jp",
      themeConfig: {
        nav: navbars.ja_jp,
        sidebar: sidebars.ja_jp,
      },
    },
    "pt-br": {
      label: "Brazilian Portuguese",
      lang: "pr-br",
      themeConfig: {
        nav: navbars.pt_br,
        sidebar: sidebars.pt_br,
      },
    },
    "zh-hans": {
      label: "简体中文",
      lang: "zh-hans",
      themeConfig: {
        nav: navbars.zh_hans,
        sidebar: sidebars.zh_hans,
      },
    },
  },
  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    search: {
      provider: "local",
    },
    socialLinks: [
      { icon: "github", link: "https://github.com/asdf-vm/asdf" },
      // { icon: "twitter", link: "https://twitter.com/asdf_vm" },
    ],
  },
});


================================================
FILE: docs/.vitepress/navbars.ts
================================================
import path from "path";
import fs from "fs";
import process from "process";

export const getVersion = () => {
  const versionFilepath = path.join(__dirname, "../../.release-please-manifest.json");
  try {
    const version = JSON.parse(fs.readFileSync(versionFilepath, "utf8"))['.'];
    console.log(`Found version ${version} from ${versionFilepath}`);
    return version;
  } catch (error) {
    console.error(`Failed to find version from file ${versionFilepath}`, error);
    process.exit(1);
  }
};

const en = [
  { text: "Guide", link: "/guide/getting-started" },
  {
    text: "Reference",
    link: "/manage/configuration",
  },
  {
    text: getVersion(),
    items: [
      {
        text: "Changelog",
        link: "https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md",
      },
      { text: "Contribute", link: "/contribute/core" },
    ],
  },
];

const ja_jp = [
  { text: "ガイド", link: "/ja-jp/guide/getting-started" },
  {
    text: "リファレンス",
    link: "/ja-jp/manage/configuration",
  },
  {
    text: getVersion(),
    items: [
      {
        text: "変更履歴",
        link: "https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md",
      },
      { text: "コントリビューション", link: "/ja-jp/contribute/core" },
    ],
  },
];

const ko_kr = [
  { text: "가이드", link: "/ko-kr/guide/getting-started" },
  {
    text: "참고자료",
    link: "/ko-kr/manage/configuration",
  },
  {
    text: getVersion(),
    items: [
      {
        text: "변동사항",
        link: "https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md",
      },
      { text: "기여하기", link: "/ko-kr/contribute/core" },
    ],
  },
];

const pt_br = [
  { text: "Guia", link: "/pt-br/guide/getting-started" },
  {
    text: "Referência",
    link: "/pt-br/manage/configuration",
  },
  {
    text: getVersion(),
    items: [
      {
        text: "Changelog",
        link: "https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md",
      },
      { text: "Contribute", link: "/pt-br/contribute/core" },
    ],
  },
];

const zh_hans = [
  { text: "指导", link: "/zh-hans/guide/getting-started" },
  {
    text: "参考",
    link: "/zh-hans/manage/configuration",
  },
  {
    text: getVersion(),
    items: [
      {
        text: "Changelog",
        link: "https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md",
      },
      { text: "如何贡献", link: "/zh-hans/contribute/core" },
    ],
  },
];

export { en, ko_kr, ja_jp, pt_br, zh_hans };


================================================
FILE: docs/.vitepress/sidebars.ts
================================================
const en = [
  {
    text: "Guide",
    collapsed: false,
    items: [
      { text: "What is asdf?", link: "/guide/introduction" },
      { text: "Getting Started", link: "/guide/getting-started" },
      { text: "Getting Started (pre-0.16.0)", link: "/guide/getting-started-legacy" },
      { text: "Upgrading to 0.16.0", link: "/guide/upgrading-to-v0-16" },

    ],
  },
  {
    text: "Usage",
    collapsed: false,
    items: [
      { text: "Core", link: "/manage/core" },
      { text: "Plugins", link: "/manage/plugins" },
      { text: "Versions", link: "/manage/versions" },
    ],
  },
  {
    text: "Reference",
    collapsed: false,
    items: [
      { text: "Configuration", link: "/manage/configuration" },
      { text: "All Commands", link: "/manage/commands" },
      { text: "Dependencies", link: "/manage/dependencies" },
      {
        text: "Plugin Shortname Index",
        link: "https://github.com/asdf-vm/asdf-plugins",
      },
    ],
  },
  {
    text: "Plugins",
    collapsed: true,
    items: [
      {
        text: "Authors",
        items: [
          { text: "Create a Plugin", link: "/plugins/create" },
          {
            text: "GitHub Plugin Template",
            link: "https://github.com/asdf-vm/asdf-plugin-template",
          },
        ],
      },
      {
        text: "First Party Plugins",
        items: [
          {
            text: "Elixir",
            link: "https://github.com/asdf-vm/asdf-elixir",
          },
          {
            text: "Erlang",
            link: "https://github.com/asdf-vm/asdf-erlang",
          },
          {
            text: "Node.js",
            link: "https://github.com/asdf-vm/asdf-nodejs",
          },
          {
            text: "Ruby",
            link: "https://github.com/asdf-vm/asdf-ruby",
          },
        ],
      },
      {
        text: "Community Plugins",
        items: [
          {
            text: "asdf-community",
            link: "https://github.com/asdf-community",
          },
          {
            text: "GitHub Topics Search",
            link: "https://github.com/topics/asdf-plugin",
          },
        ],
      },
    ],
  },
  {
    text: "Questions",
    collapsed: true,
    items: [
      { text: "FAQ", link: "/more/faq" },
      {
        text: "GitHub Issues",
        link: "https://github.com/asdf-vm/asdf/issues",
      },
      {
        text: "Stack Overflow Tag",
        link: "https://stackoverflow.com/questions/tagged/asdf-vm",
      },
    ],
  },
  {
    text: "Contribute",
    collapsed: true,
    items: [
      { text: "Core asdf", link: "/contribute/core" },
      { text: "Documentation", link: "/contribute/documentation" },
      {
        text: "First-Party Plugins",
        link: "/contribute/first-party-plugins",
      },
      { text: "GitHub Actions", link: "/contribute/github-actions" },
    ],
  },
  { text: "Community Projects", link: "/more/community-projects" },
  { text: "Thanks", link: "/more/thanks" },
];

const ko_kr = [
  {
    text: "가이드",
    collapsed: false,
    items: [
      { text: "asdf이란?", link: "/ko-kr/guide/introduction" },
      { text: "시작하기", link: "/ko-kr/guide/getting-started" },
    ],
  },
  {
    text: "사용방법",
    collapsed: false,
    items: [
      { text: "코어", link: "/ko-kr/manage/core" },
      { text: "플러그인", link: "/ko-kr/manage/plugins" },
      { text: "버전", link: "/ko-kr/manage/versions" },
    ],
  },
  {
    text: "참고자료",
    collapsed: false,
    items: [
      { text: "설정", link: "/ko-kr/manage/configuration" },
      { text: "모든 명령어", link: "/ko-kr/manage/commands" },
      {
        text: "플러그인 Shortname 인덱스",
        link: "https://github.com/asdf-vm/asdf-plugins",
      },
    ],
  },
  {
    text: "플러그인",
    collapsed: true,
    items: [
      {
        text: "저자",
        items: [
          { text: "플러그인 만들기", link: "/ko-kr/plugins/create" },
          {
            text: "GitHub 플러그인 템플릿",
            link: "https://github.com/asdf-vm/asdf-plugin-template",
          },
        ],
      },
      {
        text: "공식 플러그인",
        items: [
          {
            text: "Elixir",
            link: "https://github.com/asdf-vm/asdf-elixir",
          },
          {
            text: "Erlang",
            link: "https://github.com/asdf-vm/asdf-erlang",
          },
          {
            text: "Node.js",
            link: "https://github.com/asdf-vm/asdf-nodejs",
          },
          {
            text: "Ruby",
            link: "https://github.com/asdf-vm/asdf-ruby",
          },
        ],
      },
      {
        text: "커뮤니티 플러그인",
        items: [
          {
            text: "asdf-community",
            link: "https://github.com/asdf-community",
          },
          {
            text: "GitHub 토픽 검색",
            link: "https://github.com/topics/asdf-plugin",
          },
        ],
      },
    ],
  },
  {
    text: "질문",
    collapsed: true,
    items: [
      { text: "자주 묻는 질문", link: "/ko-kr/more/faq" },
      {
        text: "GitHub 이슈",
        link: "https://github.com/asdf-vm/asdf/issues",
      },
      {
        text: "Stack Overflow 태그",
        link: "https://stackoverflow.com/questions/tagged/asdf-vm",
      },
    ],
  },
  {
    text: "기여하기",
    collapsed: true,
    items: [
      { text: "코어 asdf", link: "/ko-kr/contribute/core" },
      { text: "문서", link: "/ko-kr/contribute/documentation" },
      {
        text: "공식 플러그인",
        link: "/ko-kr/contribute/first-party-plugins",
      },
      { text: "GitHub Actions", link: "/ko-kr/contribute/github-actions" },
    ],
  },
  { text: "커뮤니티 프로젝트", link: "/ko-kr/more/community-projects" },
  { text: "감사인사", link: "/ko-kr/more/thanks" },
];

const ja_jp = [
  {
    text: "ガイド",
    collapsed: false,
    items: [
      { text: "asdfってなに?", link: "/ja-jp/guide/introduction" },
      { text: "はじめよう", link: "/ja-jp/guide/getting-started" },
      { text: "はじめよう (0.16.0以前)", link: "/ja-jp/guide/getting-started-legacy" },
      { text: "0.16.0にアップグレードする", link: "/ja-jp/guide/upgrading-to-v0-16" },
    ],
  },
  {
    text: "使い方",
    collapsed: false,
    items: [
      { text: "コア", link: "/ja-jp/manage/core" },
      { text: "プラグイン", link: "/ja-jp/manage/plugins" },
      { text: "バージョン", link: "/ja-jp/manage/versions" },
    ],
  },
  {
    text: "リファレンス",
    collapsed: false,
    items: [
      { text: "構成設定", link: "/ja-jp/manage/configuration" },
      { text: "すべてのコマンド", link: "/ja-jp/manage/commands" },
      {
        text: "プラグインショートネームの一覧",
        link: "https://github.com/asdf-vm/asdf-plugins",
      },
    ],
  },
  {
    text: "プラグイン",
    collapsed: true,
    items: [
      {
        text: "開発者向け",
        items: [
          { text: "プラグインの作成", link: "/ja-jp/plugins/create" },
          {
            text: "GitHubプラグインテンプレート",
            link: "https://github.com/asdf-vm/asdf-plugin-template",
          },
        ],
      },
      {
        text: "公式プラグイン",
        items: [
          {
            text: "Elixir",
            link: "https://github.com/asdf-vm/asdf-elixir",
          },
          {
            text: "Erlang",
            link: "https://github.com/asdf-vm/asdf-erlang",
          },
          {
            text: "Node.js",
            link: "https://github.com/asdf-vm/asdf-nodejs",
          },
          {
            text: "Ruby",
            link: "https://github.com/asdf-vm/asdf-ruby",
          },
        ],
      },
      {
        text: "コミュニティプラグイン",
        items: [
          {
            text: "asdf-community",
            link: "https://github.com/asdf-community",
          },
          {
            text: "GitHubトピック検索",
            link: "https://github.com/topics/asdf-plugin",
          },
        ],
      },
    ],
  },
  {
    text: "困ったときは",
    collapsed: true,
    items: [
      { text: "FAQ", link: "/ja-jp/more/faq" },
      {
        text: "GitHub イシュー",
        link: "https://github.com/asdf-vm/asdf/issues",
      },
      {
        text: "Stack Overflow タグ",
        link: "https://stackoverflow.com/questions/tagged/asdf-vm",
      },
    ],
  },
  {
    text: "コントリビューション",
    collapsed: true,
    items: [
      { text: "asdf コア", link: "/ja-jp/contribute/core" },
      { text: "ドキュメント", link: "/ja-jp/contribute/documentation" },
      {
        text: "公式プラグイン",
        link: "/ja-jp/contribute/first-party-plugins",
      },
      { text: "GitHub Actions", link: "/ja-jp/contribute/github-actions" },
    ],
  },
  { text: "コミュニティプロジェクト", link: "/ja-jp/more/community-projects" },
  { text: "謝辞", link: "/ja-jp/more/thanks" },
];

const pt_br = [
  {
    text: "Guia",
    collapsed: false,
    items: [
      { text: "O que é asdf?", link: "/pt-br/guide/introduction" },
      { text: "Começar", link: "/pt-br/guide/getting-started" },
    ],
  },
  {
    text: "Uso",
    collapsed: false,
    items: [
      { text: "Essencial", link: "/pt-br/manage/core" },
      { text: "Plugins", link: "/pt-br/manage/plugins" },
      { text: "Versões", link: "/pt-br/manage/versions" },
    ],
  },
  {
    text: "Referência",
    collapsed: false,
    items: [
      { text: "Configuração", link: "/pt-br/manage/configuration" },
      { text: "Todos os comandos", link: "/pt-br/manage/commands" },
      {
        text: "Plugin Shortname Index",
        link: "https://github.com/asdf-vm/asdf-plugins",
      },
    ],
  },
  {
    text: "Plugins",
    collapsed: true,
    items: [
      {
        text: "Autoria",
        items: [
          { text: "Criar um plug-in", link: "/pt-br/plugins/create" },
          {
            text: "GitHub Plugin Template",
            link: "https://github.com/asdf-vm/asdf-plugin-template",
          },
        ],
      },
      {
        text: "Plug-ins Próprios",
        items: [
          {
            text: "Elixir",
            link: "https://github.com/asdf-vm/asdf-elixir",
          },
          {
            text: "Erlang",
            link: "https://github.com/asdf-vm/asdf-erlang",
          },
          {
            text: "Node.js",
            link: "https://github.com/asdf-vm/asdf-nodejs",
          },
          {
            text: "Ruby",
            link: "https://github.com/asdf-vm/asdf-ruby",
          },
        ],
      },
      {
        text: "Plug-ins da Comunidade",
        items: [
          {
            text: "asdf-community",
            link: "https://github.com/asdf-community",
          },
          {
            text: "GitHub Topics Search",
            link: "https://github.com/topics/asdf-plugin",
          },
        ],
      },
    ],
  },
  {
    text: "Questões",
    collapsed: true,
    items: [
      { text: "Perguntas Frequentes", link: "/pt-br/more/faq" },
      {
        text: "GitHub Issues",
        link: "https://github.com/asdf-vm/asdf/issues",
      },
      {
        text: "Stack Overflow Tag",
        link: "https://stackoverflow.com/questions/tagged/asdf-vm",
      },
    ],
  },
  {
    text: "Contribute",
    collapsed: true,
    items: [
      { text: "Essencial asdf", link: "/pt-br/contribute/core" },
      { text: "Documentação", link: "/pt-br/contribute/documentation" },
      {
        text: "Plug-ins Próprios",
        link: "/pt-br/contribute/first-party-plugins",
      },
      { text: "GitHub Actions", link: "/pt-br/contribute/github-actions" },
    ],
  },
  { text: "Projetos Comunitários", link: "/pt-br/more/community-projects" },
  { text: "Créditos", link: "/pt-br/more/thanks" },
];

const zh_hans = [
  {
    text: "指导",
    collapsed: false,
    items: [
      { text: "什么是 asdf?", link: "/zh-hans/guide/introduction" },
      { text: "快速入门", link: "/zh-hans/guide/getting-started" },
      {
        text: "快速入门 (0.16.0 之前)",
        link: "/zh-hans/guide/getting-started-legacy",
      },
      { text: "升级到 0.16.0", link: "/zh-hans/guide/upgrading-to-v0-16" },
    ],
  },
  {
    text: "用法",
    collapsed: false,
    items: [
      { text: "核心", link: "/zh-hans/manage/core" },
      { text: "插件", link: "/zh-hans/manage/plugins" },
      { text: "版本", link: "/zh-hans/manage/versions" },
    ],
  },
  {
    text: "参考",
    collapsed: false,
    items: [
      { text: "配置", link: "/zh-hans/manage/configuration" },
      { text: "所有命令", link: "/zh-hans/manage/commands" },
      { text: "依赖", link: "/zh-hans/manage/dependencies" },
      {
        text: "插件缩写索引",
        link: "https://github.com/asdf-vm/asdf-plugins",
      },
    ],
  },
  {
    text: "插件",
    collapsed: true,
    items: [
      {
        text: "成为作者",
        items: [
          { text: "创建插件", link: "/zh-hans/plugins/create" },
          {
            text: "GitHub 插件模板",
            link: "https://github.com/asdf-vm/asdf-plugin-template",
          },
        ],
      },
      {
        text: "官方插件",
        items: [
          {
            text: "Elixir",
            link: "https://github.com/asdf-vm/asdf-elixir",
          },
          {
            text: "Erlang",
            link: "https://github.com/asdf-vm/asdf-erlang",
          },
          {
            text: "Node.js",
            link: "https://github.com/asdf-vm/asdf-nodejs",
          },
          {
            text: "Ruby",
            link: "https://github.com/asdf-vm/asdf-ruby",
          },
        ],
      },
      {
        text: "社区插件",
        items: [
          {
            text: "asdf-community",
            link: "https://github.com/asdf-community",
          },
          {
            text: "GitHub 主题搜索",
            link: "https://github.com/topics/asdf-plugin",
          },
        ],
      },
    ],
  },
  {
    text: "问题",
    collapsed: true,
    items: [
      { text: "经常问的问题", link: "/zh-hans/more/faq" },
      {
        text: "GitHub Issues",
        link: "https://github.com/asdf-vm/asdf/issues",
      },
      {
        text: "Stack Overflow Tag",
        link: "https://stackoverflow.com/questions/tagged/asdf-vm",
      },
    ],
  },
  {
    text: "如何贡献",
    collapsed: true,
    items: [
      { text: "核心", link: "/zh-hans/contribute/core" },
      { text: "文档", link: "/zh-hans/contribute/documentation" },
      {
        text: "官方插件",
        link: "/zh-hans/contribute/first-party-plugins",
      },
      { text: "GitHub Actions", link: "/zh-hans/contribute/github-actions" },
    ],
  },
  { text: "社区项目", link: "/zh-hans/more/community-projects" },
  { text: "致谢", link: "/zh-hans/more/thanks" },
];

export { en, ko_kr, ja_jp, pt_br, zh_hans };


================================================
FILE: docs/.vitepress/theme/custom.css
================================================
:root {
  --vp-c-brand-1: #b744b8;
  --vp-c-brand-2: #a379c9;
  /* TODO: make brand-2 and brand-3 different & set brand-soft */
  --vp-c-brand-3: #a379c9;
  /* --vp-c-brand-soft: #fae3ff; */
}


================================================
FILE: docs/.vitepress/theme/index.ts
================================================
import DefaultTheme from "vitepress/theme";
import "./custom.css";

export default DefaultTheme;


================================================
FILE: docs/CNAME
================================================
asdf-vm.com

================================================
FILE: docs/contribute/core.md
================================================
# asdf

`asdf` core contribution guide.

## Initial Setup

Fork `asdf` on GitHub and/or Git clone the default branch:

```shell
# clone your fork
git clone https://github.com/<GITHUB_USER>/asdf.git
# or clone asdf
git clone https://github.com/asdf-vm/asdf.git
```

The tools for core development are in this repo's `.tool-versions`. If you wish to manage with `asdf` itself, add the plugins:

```shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
```

Install the versions to develop `asdf` with:

```shell
asdf install
```

It _may_ be useful to not use `asdf` to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:

- [bats-core](https://github.com/bats-core/bats-core): Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
- [shellcheck](https://github.com/koalaman/shellcheck): Static analysis tool for shell scripts.
- [shfmt](https://github.com/mvdan/sh): A shell parser, formatter, and interpreter with bash support; includes shfmt

## Development

If you want to try out your changes without making change to your installed `asdf`, you can set the `$ASDF_DIR` variable to the path where you cloned the repository, and temporarily prepend the `bin` and `shims` directory of the directory to your path.

It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:

```shell
# Lint
./scripts/lint.bash --check

# Fix & Format
./scripts/lint.bash --fix

# Test: all tests
./scripts/test.bash

# Test: for specific command
bats test/list_commands.bash
```

::: tip

**Add tests!** - Tests are **required** for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See [bats-core documentation](https://bats-core.readthedocs.io/en/stable/index.html)

:::

### Gitignore

The following is the `.gitignore` file in the `asdf-vm/asdf` repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global `.gitignore` configuration, [see here](http://stratus3d.com/blog/2018/06/03/stop-excluding-editor-temp-files-in-gitignore/) for more details.

<<< @/../.gitignore

### `.git-blame-ignore-revs`

`asdf` uses a `.git-blame-ignore-revs` to reduce noise when running a blame. See the [git blame documentation](https://git-scm.com/docs/git-blame) for more information.

Use the file with `git blame` like so:

```sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats
```

Optionally, configure to use the file on every invocation of `blame` without manually supplying it:

```sh
git config blame.ignoreRevsFile .git-blame-ignore-revs
```

It is possible to configure IDEs to use this file. For example, when using VSCode (with [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)), write the following to `.vscode/settings.json`:

```json
{
  "gitlens.advanced.blame.customArguments": [
    "--ignore-revs-file",
    ".git-blame-ignore-revs"
  ]
}
```

## Bats Testing

Execute tests locally with:

```shell
./scripts/test.bash
```

Before writing tests **please read**:

- existing tests in `test/`
- [bats-core documentation](https://bats-core.readthedocs.io/en/stable/index.html)
- existing Bats settings used in `scripts/test.bash`

### Bats Tips

Bats debugging can be difficult at times. Using the TAP output with `-t` flag will enable you to print outputs with the special file descriptor `>&3` during test execution, simplifying debugging. As an example:

```shell
# test/some_tests.bats

printf "%s\n" "Will not be printed during bats test/some_tests.bats"
printf "%s\n" "Will be printed during bats -t test/some_tests.bats" >&3
```

This is further documented in bats-core [Printing to the Terminal](https://bats-core.readthedocs.io/en/stable/writing-tests.html#printing-to-the-terminal).

## Pull Requests, Releases & Conventional Commits

`asdf` is using an automated release tool called [Release Please](https://github.com/googleapis/release-please) to automatically bump the [SemVer](https://semver.org/) version and generate the [Changelog](https://github.com/asdf-vm/asdf/blob/master/CHANGELOG.md). This information is determined by reading the commit history since the last release.

[Conventional Commit messages](https://www.conventionalcommits.org/) define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action [`amannn/action-semantic-pull-request`](https://github.com/amannn/action-semantic-pull-request).

Conventional Commit follows this format:

```
<type>[optional scope][optional !]: <description>

<!-- examples -->
fix: some fix
feat: a new feature
docs: some documentation update
docs(website): some change for the website
feat!: feature with breaking change
```

The full list of `<types>` are: `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `build`, `ci`, `chore`, `revert`.

- `!`: indicates a breaking change
- `fix`: will create a new SemVer `patch`
- `feat`: will create a new SemVer `minor`
- `<type>!`: will create a new SemVer `major`

The Pull Request Title must follow this format.

::: tip

Use Conventional Commit message format for your Pull Request Title.

:::

## Docker Images

The [asdf-alpine](https://github.com/vic/asdf-alpine) and [asdf-ubuntu](https://github.com/vic/asdf-ubuntu) projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.


================================================
FILE: docs/contribute/documentation.md
================================================
# Docs & Site

Documentation & site contribution guide.

## Initial Setup

Fork `asdf` on GitHub and/or Git clone the default branch:

```shell
# clone your fork
git clone https://github.com/<GITHUB_USER>/asdf.git
# or clone asdf
git clone https://github.com/asdf-vm/asdf.git
```

The tools for Docs site development are managed with `asdf` in the `docs/.tool-versions`. Add the plugins with:

```shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
```

Install the tool version(s) with:

```shell
asdf install
```

- [Node.js](https://nodejs.org): JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from `docs/package.json`:

```shell
npm install
```

## Development

[VitePress (v2)](https://vitepress.dev/) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace [Docsify.js](https://docsify.js.org/) and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quickly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.

`package.json` contains the scripts required for development:

@[code json{3-5}](../package.json)

To start the local development server:

```shell
npm run dev
```

Format the code before committing:

```shell
npm run format
```

## Pull Requests, Releases & Conventional Commits

`asdf` is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the [core contribution guide](./core.md).

When creating a PR for documentation changes please make the PR title with the Conventional Commit type `docs` in the format `docs: <description>`.

## Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

- `docs/.vitepress/config.js`: the root config file for the site. Read the [VitePress documentation](https://vitepress.dev/reference/site-config) for it's spec.

To simplify the root config, the larger JS Objects representing the _navbar_ and _sidebar_ configuration have been extracted and separated by their locale. See both in:

- `docs/.vitepress/navbars.js`
- `docs/.vitepress/sidebars.js`

With the official documentation for these configs living in the [Default Theme Reference](https://vitepress.dev/reference/default-theme-config).

## I18n

VitePress has first-class support for internationalization. The
root config `docs/.vitepress/config.js` defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.

The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.

The markdown content for each locale must fall under a folder with the same name as the keys for `locales` in the root config. That is:

```js
// docs/.vitepress/config.js
export default defineConfig({
  ...
  locales: {
    root: {
      label: "English",
        lang: "en-US",
        themeConfig: {
        nav: navbars.en,
          sidebar: sidebars.en,
      },
    },
    "pt-br": {
      label: "Brazilian Portuguese",
        lang: "pr-br",
        themeConfig: {
        nav: navbars.pt_br,
          sidebar: sidebars.pt_br,
      },
    },
    "zh-hans": {
      label: "简体中文",
        lang: "zh-hans",
        themeConfig: {
        nav: navbars.zh_hans,
          sidebar: sidebars.zh_hans,
      },
    },
  },
})
```

`/pt-BR/` will require the same set of markdown files located under `docs/pt-BR/`, like so:

```shell
docs
├─ README.md
├─ foo.md
├─ nested
│  └─ README.md
└─ pt-BR
   ├─ README.md
   ├─ foo.md
   └─ nested
      └─ README.md
```

The [official VitePress i18n documentation](https://vitepress.dev/guide/i18n) goes into more detail.


================================================
FILE: docs/contribute/first-party-plugins.md
================================================
# First-Party Plugins

The asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:

- [Elixir](https://github.com/asdf-vm/asdf-elixir)
- [Erlang](https://github.com/asdf-vm/asdf-erlang)
- [Node.js](https://github.com/asdf-vm/asdf-nodejs)
- [Ruby](https://github.com/asdf-vm/asdf-ruby)

For community plugins, see:

- [`asdf-community` organisation](https://github.com/asdf-community): A collaborative, community-driven project for long-term maintenance of `asdf` plugins.
- [`asdf-plugins` shortname repo](https://github.com/asdf-vm/asdf-plugins): Short-name list used by `asdf` core to lookup popular `asdf` plugins.
- [GitHub `asdf-plugin` topic search](https://github.com/topics/asdf-plugin)


================================================
FILE: docs/contribute/github-actions.md
================================================
# GitHub Actions

Thanks for your interest, please see the [asdf actions repo](https://github.com/asdf-vm/actions) for their existing Issues, conversations and Contributing Guidelines.


================================================
FILE: docs/guide/getting-started-legacy.md
================================================
# Getting Started

`asdf` installation involves:

1. Installing dependencies
2. Downloading `asdf` core
3. Installing `asdf`
4. Installing a plugin for each tool/runtime you wish to manage
5. Installing a version of the tool/runtime
6. Setting global and project versions via `.tool-versions` config files

## 1. Install Dependencies

asdf primarily requires `git` & `curl`. Here is a _non-exhaustive_ list of commands to run for _your_ package manager (some might automatically install these tools in later steps).

| OS    | Package Manager | Command                            |
| ----- | --------------- | ---------------------------------- |
| linux | Aptitude        | `apt install curl git`             |
| linux | DNF             | `dnf install curl git`             |
| linux | Pacman          | `pacman -S curl git`               |
| linux | Zypper          | `zypper install curl git`          |
| macOS | Homebrew        | `brew install coreutils curl git`  |
| macOS | Spack           | `spack install coreutils curl git` |

::: tip Note

`sudo` may be required depending on your system configuration.

:::

## 2. Download asdf

### Official Download

<!-- x-release-please-start-version -->


```shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

```

<!-- x-release-please-end -->

### Community Supported Download Methods

We highly recommend using the official `git` method.

| Method   | Command                                                                                                                                                             |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Homebrew | `brew install asdf`                                                                                                                                                 |
| Pacman   | `git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si` or use your preferred [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers) |

## 3. Install asdf

There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.

**macOS users, be sure to read the warning about `path_helper` at the end of this section.**

::: details Bash & Git

Add the following to `~/.bashrc`:

```shell
. "$HOME/.asdf/asdf.sh"
```

Completions must be configured by adding the following to your `.bashrc`:

```shell
. "$HOME/.asdf/completions/asdf.bash"
```

:::

::: details Bash & Git (macOS)

If using **macOS Catalina or newer**, the default shell has changed to **ZSH**. Unless changing back to Bash, follow the ZSH instructions.

Add the following to `~/.bash_profile`:

```shell
. "$HOME/.asdf/asdf.sh"
```

Completions must be configured manually with the following entry in your `.bash_profile`:

```shell
. "$HOME/.asdf/completions/asdf.bash"
```

:::

::: details Bash & Homebrew

Add `asdf.sh` to your `~/.bashrc` with:

```shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc
```

Completions will need to be [configured as per Homebrew's instructions](https://docs.brew.sh/Shell-Completion#configuring-completions-in-bash) or with the following:

```shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
```

:::

::: details Bash & Homebrew (macOS)

If using **macOS Catalina or newer**, the default shell has changed to **ZSH**. Unless changing back to Bash, follow the ZSH instructions.

Add `asdf.sh` to your `~/.bash_profile` with:

```shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile
```

Completions will need to be [configured as per Homebrew's instructions](https://docs.brew.sh/Shell-Completion#configuring-completions-in-bash) or with the following:

```shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
```

:::

::: details Bash & Pacman

Add the following to `~/.bashrc`:

```shell
. /opt/asdf-vm/asdf.sh
```

[`bash-completion`](https://wiki.archlinux.org/title/bash#Common_programs_and_options) needs to be installed for the completions to work.
:::

::: details Fish & Git

Add the following to `~/.config/fish/config.fish`:

```shell
source ~/.asdf/asdf.fish
```

Completions must be configured manually with the following command:

```shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
```

:::

::: details Fish & Homebrew

Add `asdf.fish` to your `~/.config/fish/config.fish` with:

```shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
```

Completions are [handled by Homebrew for the Fish shell](https://docs.brew.sh/Shell-Completion#configuring-completions-in-fish). Friendly!
:::

::: details Fish & Pacman

Add the following to `~/.config/fish/config.fish`:

```shell
source /opt/asdf-vm/asdf.fish
```

Completions are automatically configured on installation by the AUR package.
:::

::: details Elvish & Git

Add `asdf.elv` to your `~/.config/elvish/rc.elv` with:

```shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
```

Completions are automatically configured.

:::

::: details Elvish & Homebrew

Add `asdf.elv` to your `~/.config/elvish/rc.elv` with:

```shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
```

Completions are automatically configured.
:::

::: details Elvish & Pacman

Add `asdf.elv` to your `~/.config/elvish/rc.elv` with:

```shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
```

Completions are automatically configured.
:::

::: details ZSH & Git

Add the following to `~/.zshrc`:

```shell
. "$HOME/.asdf/asdf.sh"
```

**OR** use a ZSH Framework plugin like [asdf for oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/asdf) which will source this script and setup completions.

Completions are configured by either a ZSH Framework `asdf` plugin or by adding the following to your `.zshrc`:

```shell
# append completions to fpath
fpath=(${ASDF_DIR}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit
```

- if you are using a custom `compinit` setup, ensure `compinit` is below your sourcing of `asdf.sh`
- if you are using a custom `compinit` setup with a ZSH Framework, ensure `compinit` is below your sourcing of the framework

:::

::: details ZSH & Homebrew

Add `asdf.sh` to your `~/.zshrc` with:

```shell
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```

**OR** use a ZSH Framework plugin like [asdf for oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/asdf) which will source this script and setup completions.

Completions are configured by either a ZSH Framework `asdf` or will need to be [configured as per Homebrew's instructions](https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh). If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via `fpath`. The Oh-My-ZSH asdf plugin is yet to be updated, see [ohmyzsh/ohmyzsh#8837](https://github.com/ohmyzsh/ohmyzsh/pull/8837).
:::

::: details ZSH & Pacman

Add the following to `~/.zshrc`:

```shell
. /opt/asdf-vm/asdf.sh
```

Completions are placed in a ZSH friendly location, but [ZSH must be configured to use the autocompletions](https://wiki.archlinux.org/index.php/zsh#Command_completion).
:::

::: details PowerShell Core & Git

Add the following to `~/.config/powershell/profile.ps1`:

```shell
. "$HOME/.asdf/asdf.ps1"
```

:::

::: details PowerShell Core & Homebrew

Add `asdf.sh` to your `~/.config/powershell/profile.ps1` with:

```shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
```

:::

::: details PowerShell Core & Pacman

Add the following to `~/.config/powershell/profile.ps1`:

```shell
. /opt/asdf-vm/asdf.ps1
```

:::

::: details Nushell & Git

Add `asdf.nu` to your `~/.config/nushell/config.nu` with:

```shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
```

Completions are automatically configured
:::

::: details Nushell & Homebrew

Add `asdf.nu` to your `~/.config/nushell/config.nu` with:

```shell
"\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
```

Completions are automatically configured
:::

::: details Nushell & Pacman

Add `asdf.nu` to your `~/.config/nushell/config.nu` with:

```shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
```

Completions are automatically configured.
:::

::: details POSIX Shell & Git

Add the following to `~/.profile`:

```shell
export ASDF_DIR="$HOME/.asdf"
. "$HOME/.asdf/asdf.sh"
```

:::

::: details POSIX Shell & Homebrew

Add `asdf.sh` to your `~/.profile` with:

```shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
```

:::

::: details POSIX Shell & Pacman

Add the following to `~/.profile`:

```shell
export ASDF_DIR="/opt/asdf-vm"
. /opt/asdf-vm/asdf.sh
```

:::

`asdf` scripts need to be sourced **after** you have set your `$PATH` and **after** you have sourced your framework (oh-my-zsh etc).

::: warning
On macOS, starting a Bash or Zsh shell automatically calls a utility called `path_helper`. `path_helper` can rearrange items in `PATH` (and `MANPATH`), causing inconsistent behavior for tools that require specific ordering. To workaround this, `asdf` on macOS defaults to forcibly adding its `PATH`-entries to the front (taking highest priority). This is controllable with the `ASDF_FORCE_PREPEND` variable.
:::

Restart your shell so that `PATH` changes take effect. Opening a new terminal tab will usually do it.

## Core Installation Complete!

This completes the installation of the `asdf` core :tada:

`asdf` is only useful once you install a **plugin**, install a **tool** and manage its **versions**. Continue the guide below to learn how to do this.

## 4. Install a Plugin

For demonstration purposes we will install & set [Node.js](https://nodejs.org/) via the [`asdf-nodejs`](https://github.com/asdf-vm/asdf-nodejs/) plugin.

### Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For `asdf-nodejs` they are:

| OS                             | Dependency Installation                 |
| ------------------------------ | --------------------------------------- |
| Debian                         | `apt-get install dirmngr gpg curl gawk` |
| CentOS/ Rocky Linux/ AlmaLinux | `yum install gnupg2 curl gawk`          |
| macOS                          | `brew install gpg gawk`                 |

We should install dependencies first as some Plugins have post-install hooks.

### Install the Plugin

```shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
```

## 5. Install a Version

Now we have a plugin for Node.js we can install a version of the tool.

We can see which versions are available with `asdf list all nodejs` or a subset of versions with `asdf list all nodejs 14`.

We will just install the `latest` available version:

```shell
asdf install nodejs latest
```

::: tip Note
`asdf` enforces exact versions. `latest` is a helper throughout `asdf` that will resolve to the actual version number at the time of execution.
:::

## 6. Set a Version

`asdf` performs a version lookup of a tool in all `.tool-versions` files from the current working directory up to the `$HOME` directory. The lookup occurs just-in-time when you execute a tool that `asdf` manages.

::: warning
Without a version listed for a tool execution of the tool will **error**. `asdf current` will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.
:::

### Global

Global defaults are managed in `$HOME/.tool-versions`. Set a global version with:

```shell
asdf global nodejs latest
```

`$HOME/.tool-versions` will then look like:

```
nodejs 16.5.0
```

Some OSs already have tools installed that are managed by the system and not `asdf`, `python` is a common example. You need to tell `asdf` to pass the management back to the system. The [Versions reference section](/manage/versions.md) will guide you.

### Local

Local versions are defined in the `$PWD/.tool-versions` file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:

```shell
asdf local nodejs latest
```

`$PWD/.tool-versions` will then look like:

```
nodejs 16.5.0
```

### Using Existing Tool Version Files

`asdf` supports the migration from existing version files from other version managers. Eg: `.ruby-version` for the case of `rbenv`. This is supported on a per-plugin basis.

[`asdf-nodejs`](https://github.com/asdf-vm/asdf-nodejs/) supports this via both `.nvmrc` and `.node-version` files. To enable this, add the following to your `asdf` configuration file `$HOME/.asdfrc`:

```
legacy_version_file = yes
```

See the [configuration](/manage/configuration.md) reference page for more config options.

## Guide Complete!

That completes the Getting Started guide for `asdf` :tada: You can now manage `nodejs` versions for your project. Follow similar steps for each type of tool in your project!

`asdf` has many more commands to become familiar with, you can see them all by running `asdf --help` or `asdf`. The core of the commands are broken into three categories:

- [core `asdf`](/manage/core.md)
- [plugins](/manage/plugins.md)
- [versions (of tools)](/manage/versions.md)


================================================
FILE: docs/guide/getting-started.md
================================================
# Getting Started

## 1. Install asdf

asdf can be installed in several different ways:

::: details With Package Manager - **Recommended**

| Package Manager   | Command                                                                                                                                                             |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Homebrew | `brew install asdf`                                                                                                                                                 |
| Zypper   | `zypper install asdf`                                                                                                                                               |
| Pacman   | `git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si` or use your preferred [AUR helper](https://wiki.archlinux.org/index.php/AUR_helpers) |

:::

:::: details Download Pre-Compiled Binary - **Easy**

<!--@include: @/parts/install-dependencies.md-->

##### Install asdf

1. Visit https://github.com/asdf-vm/asdf/releases and download the appropriate archive for your operating system/architecture combination.
2. Extract the `asdf` binary in the archive into a directory on your `$PATH`.
3. Verify `asdf` is on your shell's `$PATH` by running `type -a asdf`. The directory you placed the `asdf` binary in should be listed on the first line of the output from `type`. If it is not that means step #2 was not completed correctly.

::::

:::: details With `go install`

<!--@include: @/parts/install-dependencies.md-->

##### Install asdf

<!-- x-release-please-start-version -->
1. [Install Go](https://go.dev/doc/install)
2. Run `go install github.com/asdf-vm/asdf/cmd/asdf@v0.18.1`
<!-- x-release-please-end -->

::::

:::: details Build from Source

<!--@include: @/parts/install-dependencies.md-->

##### Install asdf

<!-- x-release-please-start-version -->
1. Clone the asdf repository:
  ```shell
  git clone https://github.com/asdf-vm/asdf.git --branch v0.18.1
  ```
<!-- x-release-please-end -->
2. Run `make`
3. Copy the `asdf` binary into a directory on your `$PATH`.
4. Verify `asdf` is on your shell's `$PATH` by running `type -a asdf`. The directory you placed the `asdf` binary in should be listed on the first line of the output from `type`. If it is not that means step #3 was not completed correctly.

::::

## 2. Configure asdf

::: tip Note
Most users **DO NOT** need to customize the location that asdf writes plugin,
install, and shim data to. However, if `$HOME/.asdf` isn't the directory you
want asdf writing to, you can change it. Specify the directory by exporting
a variable named `ASDF_DATA_DIR` in your shell's RC file.
:::

There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.

::: details Bash

**macOS Catalina or newer**: The default shell has changed to **ZSH**. Unless changing back to Bash, follow the ZSH instructions.

**Pacman**: [`bash-completion`](https://wiki.archlinux.org/title/bash#Common_programs_and_options) needs to be installed for the completions to work.

##### Add shims directory to path (required)

Add the following to `~/.bash_profile`:
```shell
export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
```

###### Custom data directory (optional)

Add the following to `~/.bash_profile` above the line you added above:

```shell
export ASDF_DATA_DIR="/your/custom/data/dir"
```

##### Set up shell completions (optional)

Completions must be configured by adding the following to your `.bashrc`:

```shell
. <(asdf completion bash)
```

:::

::: details Fish

##### Add shims directory to path (required)

Add the following to `~/.config/fish/config.fish`:

```shell
# ASDF configuration code
if test -z $ASDF_DATA_DIR
    set _asdf_shims "$HOME/.asdf/shims"
else
    set _asdf_shims "$ASDF_DATA_DIR/shims"
end

# Do not use fish_add_path (added in Fish 3.2) because it
# potentially changes the order of items in PATH
if not contains $_asdf_shims $PATH
    set -gx --prepend PATH $_asdf_shims
end
set --erase _asdf_shims
```

###### Custom data directory (optional)

**Pacman**: Completions are automatically configured on installation by the AUR package.

Add the following to `~/.config/fish/config.fish` above the lines you added above:

```shell
set -gx --prepend ASDF_DATA_DIR "/your/custom/data/dir"
```

##### Set up shell completions (optional)

Completions must be configured manually with the following command:

```shell
$ asdf completion fish > ~/.config/fish/completions/asdf.fish
```

:::

::: details Elvish

##### Add shims directory to path (required)

Add the following to `~/.config/elvish/rc.elv`:

```shell
var asdf_data_dir = ~'/.asdf'
if (and (has-env ASDF_DATA_DIR) (!=s $E:ASDF_DATA_DIR '')) {
  set asdf_data_dir = $E:ASDF_DATA_DIR
}

if (not (has-value $paths $asdf_data_dir'/shims')) {
  set paths = [$path $@paths]
}
```

###### Custom data directory (optional)

Change the following line in the above snippet to set a custom data directory:

```diff
-var asdf_data_dir = ~'/.asdf'
+var asdf_data_dir = '/your/custom/data/dir'
```

##### Set up shell completions (optional)

```shell
$ asdf completion elvish >> ~/.config/elvish/rc.elv
$ echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
```

:::

::: details ZSH

**Pacman**: Completions are placed in a ZSH friendly location, but [ZSH must be configured to use the autocompletions](https://wiki.archlinux.org/index.php/zsh#Command_completion).

##### Add shims directory to path (required)

Add the following to `~/.zshrc`:
```shell
export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
```

###### Custom data directory (optional)

Add the following to `~/.zshrc` above the line you added above:

```shell
export ASDF_DATA_DIR="/your/custom/data/dir"
```

##### Set up shell completions (optional)

Completions are configured by either a ZSH Framework `asdf` plugin (like [asdf for oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/asdf)) or by doing the following:

```shell
$ mkdir -p "${ASDF_DATA_DIR:-$HOME/.asdf}/completions"
$ asdf completion zsh > "${ASDF_DATA_DIR:-$HOME/.asdf}/completions/_asdf"
```

Then add the following to your `.zshrc`:

```shell
# append completions to fpath
fpath=(${ASDF_DATA_DIR:-$HOME/.asdf}/completions $fpath)
# initialise completions with ZSH's compinit
autoload -Uz compinit && compinit
```

**Note**

If you are using a custom `compinit` setup with a ZSH Framework, ensure `compinit` is below your sourcing of the framework

Completions are configured by either a ZSH Framework `asdf` or will need to be [configured as per Homebrew's instructions](https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh). If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via `fpath`. The Oh-My-ZSH asdf plugin is yet to be updated, see [ohmyzsh/ohmyzsh#8837](https://github.com/ohmyzsh/ohmyzsh/pull/8837).
:::

::: details PowerShell Core

##### Add shims directory to path (required)

Add the following to `~/.config/powershell/profile.ps1`:
```shell
# Determine the location of the shims directory
if ($null -eq $ASDF_DATA_DIR -or $ASDF_DATA_DIR -eq '') {
  $_asdf_shims = "${env:HOME}/.asdf/shims"
}
else {
  $_asdf_shims = "$ASDF_DATA_DIR/shims"
}

# Then add it to path
$env:PATH = "${_asdf_shims}:${env:PATH}"
```

###### Custom data directory (optional)

Add the following to `~/.config/powershell/profile.ps1` above the snippet you added above:

```shell
$env:ASDF_DATA_DIR = "/your/custom/data/dir"
```

Shell completions not available for PowerShell

:::

::: details Nushell

##### Add shims directory to path (required)

Add the following to `~/.config/nushell/config.nu`:

```shell
let shims_dir = (
  if ( $env | get --ignore-errors ASDF_DATA_DIR | is-empty ) {
    $env.HOME | path join '.asdf'
  } else {
    $env.ASDF_DATA_DIR
  } | path join 'shims'
)
$env.PATH = ( $env.PATH | split row (char esep) | where { |p| $p != $shims_dir } | prepend $shims_dir )
```

###### Custom data directory (optional)

Add the following to `~/.config/nushell/config.nu` above the line you added above:

```shell
$env.ASDF_DATA_DIR = "/your/custom/data/dir"
```

##### Set up shell completions (optional)

```shell
# If you've not customized the asdf data directory:
$ mkdir $"($env.HOME)/.asdf/completions"
$ asdf completion nushell | save $"($env.HOME)/.asdf/completions/nushell.nu"

# If you have customized the data directory by setting ASDF_DATA_DIR:
$ mkdir $"($env.ASDF_DATA_DIR)/completions"
$ asdf completion nushell | save $"($env.ASDF_DATA_DIR)/completions/nushell.nu"
```

Then add the following to `~/.config/nushell/config.nu`:

```shell
let asdf_data_dir = (
  if ( $env | get --ignore-errors ASDF_DATA_DIR | is-empty ) {
    $env.HOME | path join '.asdf'
  } else {
    $env.ASDF_DATA_DIR
  }
)
. "$asdf_data_dir/completions/nushell.nu"
```

:::

::: details POSIX Shell

##### Add shims directory to path (required)

Add the following to `~/.profile`:
```shell
export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
```

###### Custom data directory (optional)

Add the following to `~/.profile` above the line you added above:

```shell
export ASDF_DATA_DIR="/your/custom/data/dir"
```

:::

`asdf` scripts need to be sourced **after** you have set your `$PATH` and **after** you have sourced your framework (oh-my-zsh etc).

Restart your shell so that `PATH` changes take effect. Opening a new terminal tab will usually do it.


## Core Installation Complete!

This completes the installation of the `asdf` core :tada:

`asdf` is only useful once you install a **plugin**, install a **tool** and manage its **versions**. Continue the guide below to learn how to do this.

## 4. Install a Plugin

For demonstration purposes we will install & set [Node.js](https://nodejs.org/) via the [`asdf-nodejs`](https://github.com/asdf-vm/asdf-nodejs/) plugin.

### Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For `asdf-nodejs` they are:

| OS                             | Dependency Installation                 |
| ------------------------------ | --------------------------------------- |
| Debian                         | `apt-get install dirmngr gpg curl gawk` |
| CentOS/ Rocky Linux/ AlmaLinux | `yum install gnupg2 curl gawk`          |
| macOS                          | `brew install gpg gawk`                 |

We should install dependencies first as some Plugins have post-install hooks.

### Install the Plugin

```shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
```

## 5. Install a Version

Now we have a plugin for Node.js we can install a version of the tool.

We can see which versions are available with `asdf list all nodejs` or a subset of versions with `asdf list all nodejs 14`.

We will just install the `latest` available version:

```shell
asdf install nodejs latest
```

::: tip Note
`asdf` enforces exact versions. `latest` is a helper throughout `asdf` that will resolve to the actual version number at the time of execution.
:::

## 6. Set a Version

`asdf` performs a version lookup of a tool in all `.tool-versions` files from the current working directory up to the `$HOME` directory. The lookup occurs just-in-time when you execute a tool that `asdf` manages.

::: warning
Without a version listed for a tool execution of the tool will **error**. `asdf current` will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.
:::

Because asdf looks for a `.tool-versions` file in the current directory first, and if the file is not found it then climbs up the file tree looking for a `.tool-versions` in a parent directory until it finds one. If no `.tool-versions` file is found the version resolution process will fail and an error will be printed.

If you want to set a default version that will apply to all directories you work in you can set a version in `$HOME/.tool-versions`. Any directory under your home directory will have that same version set, unless a particular directory sets another version.

```shell
asdf set -u nodejs 16.5.0
```

`$HOME/.tool-versions` will then look like:

```
nodejs 16.5.0
```

Some OSs already have tools installed that are managed by the system and not `asdf`, `python` is a common example. You need to tell `asdf` to pass the management back to the system. The [Versions reference section](/manage/versions.md) will guide you.

The first place asdf looks for a version is your current working directory (`$PWD/.tool-versions`). This may be a directory containing a source code or Git repository for a project. When in your desired directory execute you can use `asdf set` to set the version:

```shell
asdf set nodejs 16.5.0
```

`$PWD/.tool-versions` will then look like:

```
nodejs 16.5.0
```

### Using Existing Tool Version Files

`asdf` supports the migration from existing version files from other version managers. Eg: `.ruby-version` for the case of `rbenv`. This is supported on a per-plugin basis.

[`asdf-nodejs`](https://github.com/asdf-vm/asdf-nodejs/) supports this via both `.nvmrc` and `.node-version` files. To enable this, add the following to your `asdf` configuration file `$HOME/.asdfrc`:

```
legacy_version_file = yes
```

See the [configuration](/manage/configuration.md) reference page for more config options.

## Guide Complete!

That completes the Getting Started guide for `asdf` :tada: You can now manage `nodejs` versions for your project. Follow similar steps for each type of tool in your project!

`asdf` has many more commands to become familiar with, you can see them all by running `asdf --help` or `asdf`. The core of the commands are broken into three categories:

- [core `asdf`](/manage/core.md)
- [plugins](/manage/plugins.md)
- [versions (of tools)](/manage/versions.md)


================================================
FILE: docs/guide/introduction.md
================================================
# Introduction

`asdf` is a tool version manager. All tool version definitions are contained within one file (`.tool-versions`) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the **exact** same versions of tools.

The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. `$PATH` manipulation, shims, environment variables, etc...). `asdf` provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.

## How It Works

Once `asdf` core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have [shims](<https://en.wikipedia.org/wiki/Shim_(computing)>) created for each of them. When you try and run one of these executables, the shim is run instead, allowing `asdf` to identify which version of the tool is set in `.tool-versions` and execute that version.

## Related Projects

### nvm / n / rbenv etc

Tools like [nvm](https://github.com/nvm-sh/nvm), [n](https://github.com/tj/n) and [rbenv](https://github.com/rbenv/rbenv) are all written as Shell scripts which create shims for the executables installed by these tools.

`asdf` is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for `asdf` is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different `*-version` files in your repo.

<!-- ### pyenv

TODO: someone with Python background expand on this

`asdf` has some similarities to `pyenv` but is missing some key features. The `asdf` team is looking at introducing some of these `pyenv` specific features, though no roadmap or timeline is available. -->

### direnv

> augments existing shells with a new feature that can load and unload environment variables depending on the current directory.

`asdf` does not manage Environment Variables, however there is a plugin [`asdf-direnv`](https://github.com/asdf-community/asdf-direnv) to integrate direnv behaviour with `asdf`.

See [direnv docs](https://direnv.net/) for more.

### Homebrew

> The Missing Package Manager for macOS (or Linux)

Homebrew manages your packages and their upstream dependencies. `asdf` does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.

See [Homebrew docs](https://brew.sh/) for more.

### NixOS

> Nix is a tool that takes a unique approach to package management and system configuration

NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something `asdf` does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.

Again, `asdf` does not manage upstream dependencies and is not a package manager.

See [NixOS docs](https://nixos.org/guides/how-nix-works.html) for more.

## Why use asdf?

`asdf` ensures teams are using the **exact** same versions of tools, with support for **many** tools via a plugin system, and the _simplicity and familiarity_ of being a single **Shell** script you include in your Shell config.

::: tip Note
`asdf` is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with `asdf`, does not mean that is the best course of action for that specific tool.
:::


================================================
FILE: docs/guide/upgrading-to-v0-16.md
================================================
# Upgrading to 0.16.0

asdf versions 0.15.0 and older were written in Bash and distributed as a set of
Bash scripts with the `asdf` function loaded into your shell. asdf version
0.16.0 is a complete rewrite of asdf in Go. Since it is a complete rewrite
there are a [number of breaking](#breaking-changes) changes and it is now
a binary rather than a set of scripts.

## Installation

Installation of version 0.16.0 and newer is much simpler than previous versions
of asdf. It's just three steps:

* Download the appropriate `asdf` binary for your operating system/architecture
combo via [any of the install methods available](/guide/getting-started.html#_1-install-asdf).
If using a package manager verify it's installing version 0.16.0 or later.
* Add `$ASDF_DATA_DIR/shims` to the front of your `$PATH`.
* Optionally, if you previously had a customized location for asdf data, set
`ASDF_DATA_DIR` to the directory you already had the old version installing
plugins, versions, and shims.

If your operating system's package manager already offers asdf 0.16.0 that is
probably the best method for installing it. Upgrading asdf is now only possible
via OS package managers and manual installation. There is no self-upgrade
feature.

### Upgrading Without Losing Data

You can upgrade to the latest version of asdf without losing your existing
install data. It's the same sequence of steps as above.

#### 1. Download the appropriate `asdf` binary for your operating system & architecture

Download the binary from the [GitHub releases page](https://github.com/asdf-vm/asdf/releases) and place it in a directory on your path. I chose to place
the asdf binary in `$HOME/bin` and then added `$HOME/bin` to the front of my
`$PATH`:

```
# In .zshrc, .bashrc, etc...
export PATH="$HOME/bin:$PATH"
```

#### 2. Set `ASDF_DATA_DIR`

Run `asdf info` and copy the line containing the `ASDF_DATA_DIR` variable:

```
...
ASDF_DATA_DIR="/home/myuser/.asdf"
...
```

In your shell RC file (`.zshrc` if Zsh, `.bashrc` if Bash, etc...) add a line
to the end setting `ASDF_DATA_DIR` to that same value:

```bash
export ASDF_DATA_DIR="/home/myuser/.asdf"
```

#### 3. Add `$ASDF_DATA_DIR/shims` to the front of your `$PATH`

In your shell RC file (same file as step #2) add `$ASDF_DATA_DIR/shims` to the
front of your path:

```bash
export ASDF_DATA_DIR="/home/myuser/.asdf"
export PATH="$ASDF_DATA_DIR/shims:$PATH"
```

#### 4. Remove Old Config

In your shells RC file you'll have the old code running the asdf shell script at
startup. It'll probably look something like this:

```
. "$HOME/.asdf/asdf.sh"
```

Or this:

```
. /opt/homebrew/opt/asdf/libexec/asdf.sh
```

Comment out these lines or remove them entirely.

If you are not using Zsh or Bash please see the legacy
[Getting Started guide](https://asdf-vm.com/guide/getting-started-legacy.html#_3-install-asdf)
for the code snippet you need to remove.

#### 5. Regenerate Shims

Verify that `asdf` command in your shell session is version 0.16.0+ by running
`asdf --help`. If you still see an older version you will need to start a new
shell session.

Once you've verified the `asdf` command is the new version run `asdf reshim` to
regenerate all shims. This is necessary as the old shims may still reference
the old Bash version.

### Testing

If you aren't sure if the upgrade to 0.16.0 will break things for you can you
can test by installing 0.16.0 in addition to your existing version as described
above in "Upgrading Without Losing Data". If it turns out that the upgrade to
0.16.0 or greater breaks things for you you can revert back to the older
version. Remove the lines you added to your shell RC file, and add back in the
lines you removed or commented out.

### Removing old files

**Only do this after you've completed all the steps above and have verified
your new asdf installation is working correctly!** After upgrade there are
various files you can remove from the old Bash-script based versions of asdf.
Most of the files in your data directory (typically `~/.asdf/`) can be removed.
Note that you don't have to do this. There is no harm in keeping the files from
old versions of asdf around. The only directories that must be **kept** are:

* `downloads/`
* `installs/`
* `plugins/`
* `shims/`

The rest can be deleted. This can be done in one command with `find`:

```
find ${ASDF_DATA_DIR:-$HOME/.asdf}/ -maxdepth 1 -mindepth 1 -not -name downloads -not -name plugins -not -name installs -not -name shims -exec rm -r {} \;
```

## Breaking Changes

### Hyphenated commands have been removed

asdf version 0.15.0 and earlier supported by hyphenated and non-hyphenated
versions of certain commands. With version 0.16.0 only the non-hyphenated
versions are supported. The affected commands:

* `asdf list-all` -> `asdf list all`
* `asdf plugin-add` -> `asdf plugin add`
* `asdf plugin-list` -> `asdf plugin list`
* `asdf plugin-list-all` -> `asdf plugin list all`
* `asdf plugin-update` -> `asdf plugin update`
* `asdf plugin-remove` -> `asdf plugin remove`
* `asdf plugin-test` -> `asdf plugin test`
* `asdf shim-versions` -> `asdf shimversions`

### `asdf global` and `asdf local` commands have been replaced with `asdf set`

`asdf global` and `asdf local` have been removed. The "global" and "local"
terminology was wrong and also misleading. asdf doesn't actually support
"global" versions that apply everywhere. Any version that was specified with
`asdf global` could easily be overridden by a `.tool-versions` file in your
current directory specifying a different version. This was confusing to users.
The new `asdf set` behaves the same as `asdf local` by default, but also has
flags for setting versions in the user's home directory (`--home`) and in an
existing `.tool-versions` file in one of the parent directories (`--parent`).
This new interface will hopefully convey a better understanding of how asdf
resolves versions and provide equivalent functionality.

### `asdf update` command has been removed

Updates can no longer be performed this way. Use your OS package manager or
download the latest binary manually. Additionally, the `asdf update` command
present in versions 0.15.0 and older cannot upgrade to version 0.16.0 because
the install process has changed. **You cannot upgrade to the latest Go
implementation using `asdf update`.**

### `asdf shell` command has been removed

This command actually set an environment variable in the user's curre
Download .txt
gitextract_9qphyuig/

├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   ├── documentation.yaml
│   │   └── feature_request.yaml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── documentation.yml
│       ├── lint.yml
│       ├── release-build.yml
│       ├── release.yml
│       ├── semantic-pr.yml
│       └── tests.yml
├── .gitignore
├── .release-please-manifest.json
├── .tool-versions
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── asdf.elv
├── asdf.fish
├── asdf.nu
├── asdf.ps1
├── asdf.sh
├── ballad-of-asdf.md
├── bin/
│   └── private/
│       └── asdf-exec
├── defaults
├── docs/
│   ├── .gitattributes
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .tool-versions
│   ├── .vitepress/
│   │   ├── config.ts
│   │   ├── navbars.ts
│   │   ├── sidebars.ts
│   │   └── theme/
│   │       ├── custom.css
│   │       └── index.ts
│   ├── CNAME
│   ├── contribute/
│   │   ├── core.md
│   │   ├── documentation.md
│   │   ├── first-party-plugins.md
│   │   └── github-actions.md
│   ├── guide/
│   │   ├── getting-started-legacy.md
│   │   ├── getting-started.md
│   │   ├── introduction.md
│   │   └── upgrading-to-v0-16.md
│   ├── index.md
│   ├── ja-jp/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started-legacy.md
│   │   │   ├── getting-started.md
│   │   │   ├── introduction.md
│   │   │   ├── parts/
│   │   │   │   └── install-dependencies.md
│   │   │   └── upgrading-to-v0-16.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   ├── ko-kr/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started.md
│   │   │   └── introduction.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   ├── manage/
│   │   ├── commands.md
│   │   ├── configuration.md
│   │   ├── core.md
│   │   ├── dependencies.md
│   │   ├── plugins.md
│   │   └── versions.md
│   ├── more/
│   │   ├── community-projects.md
│   │   ├── faq.md
│   │   └── thanks.md
│   ├── package.json
│   ├── parts/
│   │   ├── install-dependencies-cmds.md
│   │   └── install-dependencies.md
│   ├── plugins/
│   │   └── create.md
│   ├── pt-br/
│   │   ├── contribute/
│   │   │   ├── core.md
│   │   │   ├── documentation.md
│   │   │   ├── first-party-plugins.md
│   │   │   └── github-actions.md
│   │   ├── guide/
│   │   │   ├── getting-started.md
│   │   │   └── introduction.md
│   │   ├── index.md
│   │   ├── manage/
│   │   │   ├── commands.md
│   │   │   ├── configuration.md
│   │   │   ├── core.md
│   │   │   ├── plugins.md
│   │   │   └── versions.md
│   │   ├── more/
│   │   │   ├── community-projects.md
│   │   │   ├── faq.md
│   │   │   └── thanks.md
│   │   └── plugins/
│   │       └── create.md
│   └── zh-hans/
│       ├── contribute/
│       │   ├── core.md
│       │   ├── documentation.md
│       │   ├── first-party-plugins.md
│       │   └── github-actions.md
│       ├── guide/
│       │   ├── getting-started-legacy.md
│       │   ├── getting-started.md
│       │   ├── introduction.md
│       │   └── upgrading-to-v0-16.md
│       ├── index.md
│       ├── manage/
│       │   ├── commands.md
│       │   ├── configuration.md
│       │   ├── core.md
│       │   ├── dependencies.md
│       │   ├── plugins.md
│       │   └── versions.md
│       ├── more/
│       │   ├── community-projects.md
│       │   ├── faq.md
│       │   └── thanks.md
│       ├── parts/
│       │   ├── install-dependencies-cmds.md
│       │   └── install-dependencies.md
│       └── plugins/
│           └── create.md
├── go.mod
├── go.sum
├── help.txt
├── internal/
│   ├── cli/
│   │   ├── cli.go
│   │   └── set/
│   │       ├── set.go
│   │       └── set_test.go
│   ├── completions/
│   │   ├── asdf.bash
│   │   ├── asdf.elvish
│   │   ├── asdf.fish
│   │   ├── asdf.nushell
│   │   ├── asdf.zsh
│   │   ├── completions.go
│   │   └── completions_test.go
│   ├── config/
│   │   ├── config.go
│   │   ├── config_test.go
│   │   └── testdata/
│   │       ├── asdfrc
│   │       └── empty-asdfrc
│   ├── data/
│   │   ├── data.go
│   │   └── data_test.go
│   ├── exec/
│   │   ├── exec.go
│   │   ├── exec_test.go
│   │   └── testdata/
│   │       └── script/
│   │           ├── exec-env.txtar
│   │           └── exec-simple.txtar
│   ├── execenv/
│   │   ├── execenv.go
│   │   └── execenv_test.go
│   ├── execute/
│   │   ├── execute.go
│   │   ├── execute_test.go
│   │   └── testdata/
│   │       └── script
│   ├── git/
│   │   ├── git.go
│   │   └── git_test.go
│   ├── help/
│   │   ├── help.go
│   │   ├── help.txt
│   │   └── help_test.go
│   ├── hook/
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── info/
│   │   ├── info.go
│   │   └── info_test.go
│   ├── installs/
│   │   ├── installs.go
│   │   └── installs_test.go
│   ├── installtest/
│   │   └── installtest.go
│   ├── paths/
│   │   ├── paths.go
│   │   └── paths_test.go
│   ├── pluginindex/
│   │   ├── pluginindex.go
│   │   └── pluginindex_test.go
│   ├── plugins/
│   │   ├── plugins.go
│   │   └── plugins_test.go
│   ├── repotest/
│   │   └── repotest.go
│   ├── resolve/
│   │   ├── resolve.go
│   │   ├── resolve_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── shims/
│   │   ├── shims.go
│   │   ├── shims_test.go
│   │   └── testdata/
│   │       └── asdfrc
│   ├── toolversions/
│   │   ├── toolversions.go
│   │   └── toolversions_test.go
│   └── versions/
│       ├── testdata/
│       │   ├── asdfrc
│       │   ├── list-all-elixir
│       │   ├── list-all-python
│       │   ├── list-all-ruby
│       │   └── uninstall-asdfrc
│       ├── versions.go
│       └── versions_test.go
├── lib/
│   ├── commands/
│   │   ├── command-current.bash
│   │   ├── command-env.bash
│   │   ├── command-exec.bash
│   │   ├── command-export-shell-version.bash
│   │   ├── command-global.bash
│   │   ├── command-help.bash
│   │   ├── command-info.bash
│   │   ├── command-install.bash
│   │   ├── command-latest.bash
│   │   ├── command-list-all.bash
│   │   ├── command-list.bash
│   │   ├── command-local.bash
│   │   ├── command-plugin-add.bash
│   │   ├── command-plugin-list-all.bash
│   │   ├── command-plugin-list.bash
│   │   ├── command-plugin-push.bash
│   │   ├── command-plugin-remove.bash
│   │   ├── command-plugin-test.bash
│   │   ├── command-plugin-update.bash
│   │   ├── command-reshim.bash
│   │   ├── command-shim-versions.bash
│   │   ├── command-uninstall.bash
│   │   ├── command-update.bash
│   │   ├── command-version.bash
│   │   ├── command-where.bash
│   │   ├── command-which.bash
│   │   ├── reshim.bash
│   │   └── version_commands.bash
│   ├── functions/
│   │   ├── installs.bash
│   │   ├── plugins.bash
│   │   └── versions.bash
│   └── utils.bash
├── release-please-config.json
├── scripts/
│   ├── checkstyle.py
│   ├── install_dependencies.bash
│   ├── lint.bash
│   └── test.bash
├── staticcheck.conf
├── test/
│   ├── asdf_elvish.bats
│   ├── asdf_fish.bats
│   ├── asdf_nu.bats
│   ├── asdf_pwsh.bats
│   ├── asdf_sh.bats
│   ├── banned_commands.bats
│   ├── current_command.bats
│   ├── fixtures/
│   │   ├── dummy_broken_plugin/
│   │   │   └── bin/
│   │   │       ├── download
│   │   │       ├── install
│   │   │       └── list-all
│   │   ├── dummy_legacy_plugin/
│   │   │   └── bin/
│   │   │       ├── get-version-from-legacy-file
│   │   │       ├── install
│   │   │       ├── list-all
│   │   │       ├── list-legacy-filenames
│   │   │       └── parse-legacy-file
│   │   ├── dummy_plugin/
│   │   │   ├── LICENSE
│   │   │   └── bin/
│   │   │       ├── debug
│   │   │       ├── download
│   │   │       ├── get-version-from-legacy-file
│   │   │       ├── help.overview
│   │   │       ├── install
│   │   │       ├── latest-stable
│   │   │       ├── list-all
│   │   │       ├── list-legacy-filenames
│   │   │       ├── parse-legacy-file
│   │   │       ├── post-plugin-add
│   │   │       ├── post-plugin-update
│   │   │       └── pre-plugin-remove
│   │   ├── dummy_plugin_no_download/
│   │   │   ├── LICENSE
│   │   │   └── bin/
│   │   │       └── install
│   │   └── dummy_plugins_repo/
│   │       └── plugins/
│   │           ├── bar
│   │           ├── dummy
│   │           └── foo
│   ├── get_asdf_config_value.bats
│   ├── help_command.bats
│   ├── info_command.bats
│   ├── install_command.bats
│   ├── latest_command.bats
│   ├── list_command.bats
│   ├── non_existent_command.bats
│   ├── plugin_add_command.bats
│   ├── plugin_extension_command.bats
│   ├── plugin_list_all_command.bats
│   ├── plugin_remove_command.bats
│   ├── plugin_test_command.bats
│   ├── plugin_update_command.bats
│   ├── remove_command.bats
│   ├── reshim_command.bats
│   ├── setup_suite.bash
│   ├── shim_env_command.bats
│   ├── shim_exec.bats
│   ├── shim_versions_command.bats
│   ├── test_helpers.bash
│   ├── uninstall_command.bats
│   ├── update_command.bats
│   ├── utils.bats
│   ├── version_commands.bats
│   ├── where_command.bats
│   └── which_command.bats
├── tools.go
└── version.txt
Download .txt
SYMBOL INDEX (415 symbols across 42 files)

FILE: internal/cli/cli.go
  constant usageText (line 37) | usageText = `The Multiple Runtime Version Manager.
  constant updateCommandRemovedText (line 43) | updateCommandRemovedText = `
  function Execute (line 52) | func Execute(version string) {
  function completionCommand (line 352) | func completionCommand(l *log.Logger, shell string) error {
  function currentCommand (line 367) | func currentCommand(logger *log.Logger, tool string, noHeader bool) error {
  function getVersionInfo (line 431) | func getVersionInfo(conf config.Config, plugin plugins.Plugin, currentDi...
  function writeHeader (line 442) | func writeHeader(w *tabwriter.Writer) {
  function formatCurrentVersionLine (line 446) | func formatCurrentVersionLine(w *tabwriter.Writer, plugin plugins.Plugin...
  function formatInstalled (line 459) | func formatInstalled(toolversion resolve.ToolVersions, name string, foun...
  function formatSource (line 469) | func formatSource(toolversion resolve.ToolVersions, found bool) string {
  function formatVersions (line 476) | func formatVersions(versions []string) string {
  function envCommand (line 487) | func envCommand(logger *log.Logger, shimmedCommand string, args []string...
  function setPath (line 547) | func setPath(paths []string) string {
  function execCommand (line 551) | func execCommand(logger *log.Logger, command string, args []string) error {
  function extensionCommand (line 603) | func extensionCommand(logger *log.Logger, args []string) error {
  function runExtensionCommand (line 624) | func runExtensionCommand(plugin plugins.Plugin, args []string) (err erro...
  function getExecutable (line 647) | func getExecutable(logger *log.Logger, conf config.Config, command strin...
  function anyInstalled (line 700) | func anyInstalled(conf config.Config, toolVersions []toolversions.ToolVe...
  function pluginAddCommand (line 713) | func pluginAddCommand(_ *cli.Command, conf config.Config, logger *log.Lo...
  function pluginRemoveCommand (line 739) | func pluginRemoveCommand(_ *cli.Command, logger *log.Logger, pluginName ...
  function pluginListCommand (line 771) | func pluginListCommand(cCtx *cli.Command, logger *log.Logger) error {
  function pluginListAllCommand (line 810) | func pluginListAllCommand(logger *log.Logger) error {
  function pluginInstalled (line 862) | func pluginInstalled(plugin pluginindex.Plugin, installedPlugins []plugi...
  function infoCommand (line 872) | func infoCommand(conf config.Config, version string) error {
  function helpCommand (line 876) | func helpCommand(logger *log.Logger, asdfVersion, tool, version string) ...
  function pluginUpdateCommand (line 912) | func pluginUpdateCommand(cCtx *cli.Command, logger *log.Logger, pluginNa...
  function pluginTestCommand (line 945) | func pluginTestCommand(l *log.Logger, args []string, toolVersion, ref st...
  function failTest (line 1043) | func failTest(logger *log.Logger, msg string) {
  function formatUpdateResult (line 1048) | func formatUpdateResult(logger *log.Logger, pluginName, updatedToRef str...
  function installCommand (line 1058) | func installCommand(logger *log.Logger, toolName, version string, keepDo...
  function filterInstallErrors (line 1145) | func filterInstallErrors(errs []error) []error {
  function latestCommand (line 1160) | func latestCommand(logger *log.Logger, all bool, toolName, pattern strin...
  function listCommand (line 1198) | func listCommand(logger *log.Logger, first, second, third string) (err e...
  function listAllCommand (line 1214) | func listAllCommand(logger *log.Logger, conf config.Config, toolName, fi...
  function filterByExactMatch (line 1260) | func filterByExactMatch(allVersions []string, pattern string) (versions ...
  function listLocalCommand (line 1270) | func listLocalCommand(logger *log.Logger, conf config.Config, pluginName...
  function reshimCommand (line 1345) | func reshimCommand(logger *log.Logger, tool, version string) (err error) {
  function shimVersionsCommand (line 1378) | func shimVersionsCommand(logger *log.Logger, shimName string) error {
  function whichCommand (line 1401) | func whichCommand(logger *log.Logger, command string) error {
  function uninstallCommand (line 1439) | func uninstallCommand(logger *log.Logger, tool, version string) error {
  function whereCommand (line 1473) | func whereCommand(logger *log.Logger, tool, versionStr string) error {
  function loadPlugin (line 1536) | func loadPlugin(logger *log.Logger, conf config.Config, pluginName strin...
  function reshimToolVersion (line 1547) | func reshimToolVersion(conf config.Config, plugin plugins.Plugin, versio...
  function latestForPlugin (line 1553) | func latestForPlugin(conf config.Config, toolName, pattern string, showS...
  function installedStatus (line 1577) | func installedStatus(installed bool) string {
  function unsetAsdfReservedEnvVars (line 1584) | func unsetAsdfReservedEnvVars() error {

FILE: internal/cli/set/set.go
  function Main (line 19) | func Main(_ io.Writer, stderr io.Writer, args []string, home bool, paren...
  function printError (line 93) | func printError(stderr io.Writer, msg string) error {
  function findVersionFileInParentDir (line 101) | func findVersionFileInParentDir(conf config.Config, directory string) (s...

FILE: internal/cli/set/set_test.go
  function TestAll (line 12) | func TestAll(t *testing.T) {
  function buildOutputs (line 118) | func buildOutputs() (strings.Builder, strings.Builder) {

FILE: internal/completions/completions.go
  function Get (line 21) | func Get(name string) (fs.File, bool) {
  function Names (line 33) | func Names() []string {

FILE: internal/completions/completions_test.go
  function TestGet (line 9) | func TestGet(t *testing.T) {
  function TestNames (line 26) | func TestNames(t *testing.T) {

FILE: internal/config/config.go
  constant dataDirDefault (line 17) | dataDirDefault                     = "~/.asdf"
  constant configFileDefault (line 18) | configFileDefault                  = "~/.asdfrc"
  constant defaultToolVersionsFilenameDefault (line 19) | defaultToolVersionsFilenameDefault = ".tool-versions"
  constant defaultPluginIndexURL (line 20) | defaultPluginIndexURL              = "https://github.com/asdf-vm/asdf-pl...
  type PluginRepoCheckDuration (line 26) | type PluginRepoCheckDuration struct
  type Config (line 34) | type Config struct
    method LegacyVersionFile (line 135) | func (c *Config) LegacyVersionFile() (bool, error) {
    method AlwaysKeepDownload (line 146) | func (c *Config) AlwaysKeepDownload() (bool, error) {
    method PluginRepositoryLastCheckDuration (line 157) | func (c *Config) PluginRepositoryLastCheckDuration() (PluginRepoCheckD...
    method DisablePluginShortNameRepository (line 168) | func (c *Config) DisablePluginShortNameRepository() (bool, error) {
    method Concurrency (line 178) | func (c *Config) Concurrency() (string, error) {
    method GetHook (line 188) | func (c *Config) GetHook(hook string) (string, error) {
    method loadSettings (line 201) | func (c *Config) loadSettings() error {
  type Settings (line 44) | type Settings struct
  function defaultConfig (line 56) | func defaultConfig(dataDir, configFile string) *Config {
  function defaultSettings (line 65) | func defaultSettings() *Settings {
  function newPluginRepoCheckDuration (line 77) | func newPluginRepoCheckDuration(checkDuration string) PluginRepoCheckDur...
  function LoadConfig (line 92) | func LoadConfig() (Config, error) {
  function normalizePath (line 222) | func normalizePath(homeDir string, path string) string {
  function loadSettings (line 229) | func loadSettings(asdfrcPath string) (Settings, error) {
  function boolOverride (line 257) | func boolOverride(field *bool, section *ini.Section, key string) {
  function getConcurrency (line 268) | func getConcurrency(concurrency string) string {

FILE: internal/config/config_test.go
  function TestLoadConfig (line 13) | func TestLoadConfig(t *testing.T) {
  function TestLoadSettings (line 40) | func TestLoadSettings(t *testing.T) {
  function TestConfigMethods (line 100) | func TestConfigMethods(t *testing.T) {
  function TestConfigGetHook (line 157) | func TestConfigGetHook(t *testing.T) {

FILE: internal/data/data.go
  constant dataDirDownloads (line 10) | dataDirDownloads = "downloads"
  constant dataDirInstalls (line 11) | dataDirInstalls  = "installs"
  constant dataDirPlugins (line 12) | dataDirPlugins   = "plugins"
  function DownloadDirectory (line 17) | func DownloadDirectory(dataDir, pluginName string) string {
  function InstallDirectory (line 22) | func InstallDirectory(dataDir, pluginName string) string {
  function PluginsDirectory (line 27) | func PluginsDirectory(dataDir string) string {
  function PluginDirectory (line 33) | func PluginDirectory(dataDir, pluginName string) string {

FILE: internal/data/data_test.go
  constant testPluginName (line 5) | testPluginName = "lua"
  function TestPluginDirectory (line 7) | func TestPluginDirectory(t *testing.T) {

FILE: internal/exec/exec.go
  function Exec (line 10) | func Exec(executablePath string, args []string, env []string) error {

FILE: internal/exec/exec_test.go
  function execit (line 12) | func execit() {
  function TestMain (line 21) | func TestMain(m *testing.M) {
  function TestExec (line 27) | func TestExec(t *testing.T) {

FILE: internal/execenv/execenv.go
  constant execEnvCallbackName (line 13) | execEnvCallbackName = "exec-env"
  function Generate (line 17) | func Generate(plugin plugins.Plugin, callbackEnv map[string]string) (env...

FILE: internal/execenv/execenv_test.go
  constant testPluginName (line 13) | testPluginName  = "lua"
  constant testPluginName2 (line 14) | testPluginName2 = "ruby"
  function TestGenerate (line 17) | func TestGenerate(t *testing.T) {

FILE: internal/execute/execute.go
  type Command (line 15) | type Command struct
    method Run (line 38) | func (c Command) Run() error {
  function New (line 27) | func New(command string, args []string) Command {
  function NewExpression (line 33) | func NewExpression(expression string, args []string) Command {
  function MergeWithCurrentEnv (line 67) | func MergeWithCurrentEnv(env map[string]string) (slice []string) {
  function CurrentEnv (line 72) | func CurrentEnv() map[string]string {
  function MergeEnv (line 77) | func MergeEnv(map1, map2 map[string]string) map[string]string {
  function MapToSlice (line 86) | func MapToSlice(env map[string]string) (slice []string) {
  function SliceToMap (line 95) | func SliceToMap(env []string) map[string]string {
  function formatArgString (line 109) | func formatArgString(args []string) string {

FILE: internal/execute/execute_test.go
  function TestNew (line 13) | func TestNew(t *testing.T) {
  function TestNewExpression (line 21) | func TestNewExpression(t *testing.T) {
  function TestRun_Command (line 29) | func TestRun_Command(t *testing.T) {
  function TestRun_Expression (line 132) | func TestRun_Expression(t *testing.T) {
  function TestMergeWithCurrentEnv (line 208) | func TestMergeWithCurrentEnv(t *testing.T) {
  function TestCurrentEnv (line 220) | func TestCurrentEnv(t *testing.T) {
  function TestMergeEnv (line 229) | func TestMergeEnv(t *testing.T) {
  function TestSliceToMap (line 253) | func TestSliceToMap(t *testing.T) {

FILE: internal/git/git.go
  constant DefaultRemoteName (line 16) | DefaultRemoteName = "origin"
  type Repoer (line 24) | type Repoer interface
  type Repo (line 32) | type Repo struct
    method Clone (line 43) | func (r Repo) Clone(pluginURL, ref string) error {
    method Head (line 59) | func (r Repo) Head() (string, error) {
    method RemoteURL (line 74) | func (r Repo) RemoteURL() (string, error) {
    method Update (line 91) | func (r Repo) Update(ref string) (string, string, string, error) {
    method defaultRemote (line 137) | func (r Repo) defaultRemote() (string, error) {
    method remoteDefaultBranch (line 146) | func (r Repo) remoteDefaultBranch() (string, error) {
  function NewRepo (line 38) | func NewRepo(directory string) Repo {
  function stdErrToErrMsg (line 159) | func stdErrToErrMsg(stdErr string) string {
  function exec (line 164) | func exec(command []string) (string, string, error) {
  function repositoryExists (line 176) | func repositoryExists(directory string) error {

FILE: internal/git/git_test.go
  function TestRepoClone (line 14) | func TestRepoClone(t *testing.T) {
  function TestRepoHead (line 69) | func TestRepoHead(t *testing.T) {
  function TestRepoRemoteURL (line 84) | func TestRepoRemoteURL(t *testing.T) {
  function TestRepoUpdate (line 98) | func TestRepoUpdate(t *testing.T) {
  function getCurrentCommit (line 217) | func getCurrentCommit(path string) (string, error) {
  function getCommit (line 221) | func getCommit(path, revision string) (string, error) {
  function checkoutPreviousCommit (line 232) | func checkoutPreviousCommit(path string) (string, error) {
  function generateRepo (line 256) | func generateRepo(t *testing.T) string {

FILE: internal/help/help.go
  constant quote (line 20) | quote = "\"Late but latest\"\n-- Rajinikanth"
  function Print (line 23) | func Print(asdfVersion string, plugins []plugins.Plugin) error {
  function PrintTool (line 28) | func PrintTool(conf config.Config, toolName string) error {
  function PrintToolVersion (line 33) | func PrintToolVersion(conf config.Config, toolName, toolVersion string) ...
  function Write (line 38) | func Write(asdfVersion string, allPlugins []plugins.Plugin, writer io.Wr...
  function WriteToolHelp (line 84) | func WriteToolHelp(conf config.Config, toolName string, writer io.Writer...
  function WriteToolVersionHelp (line 89) | func WriteToolVersionHelp(conf config.Config, toolName, toolVersion stri...
  function writePluginHelp (line 93) | func writePluginHelp(conf config.Config, toolName, toolVersion string, w...
  function pluginExtensionCommands (line 139) | func pluginExtensionCommands(plugins []plugins.Plugin) (string, error) {

FILE: internal/help/help_test.go
  constant version (line 17) | version        = "0.15.0"
  constant testPluginName (line 18) | testPluginName = "lua"
  function TestWrite (line 21) | func TestWrite(t *testing.T) {
  function TestWriteToolHelp (line 48) | func TestWriteToolHelp(t *testing.T) {
  function TestWriteToolVersionHelp (line 87) | func TestWriteToolVersionHelp(t *testing.T) {
  function generateConfig (line 126) | func generateConfig(t *testing.T) (config.Config, plugins.Plugin) {
  function installPlugin (line 136) | func installPlugin(t *testing.T, conf config.Config, fixture, pluginName...
  function writeExtensionCommand (line 143) | func writeExtensionCommand(t *testing.T, plugin plugins.Plugin, name, co...

FILE: internal/hook/hook.go
  function Run (line 15) | func Run(conf config.Config, hookName string, arguments []string) error {
  function RunWithOutput (line 21) | func RunWithOutput(config config.Config, hookName string, arguments []st...

FILE: internal/hook/hook_test.go
  function TestRun (line 11) | func TestRun(t *testing.T) {

FILE: internal/info/info.go
  function Print (line 16) | func Print(conf config.Config, version string) error {
  function Write (line 21) | func Write(conf config.Config, version string, writer io.Writer) error {
  function pluginsTable (line 66) | func pluginsTable(plugins []plugins.Plugin, output io.Writer) error {

FILE: internal/info/info_test.go
  function TestWrite (line 13) | func TestWrite(t *testing.T) {

FILE: internal/installs/installs.go
  function Installed (line 18) | func Installed(conf config.Config, plugin plugins.Plugin) (versions []st...
  function InstallPath (line 41) | func InstallPath(conf config.Config, plugin plugins.Plugin, version tool...
  function DownloadPath (line 50) | func DownloadPath(conf config.Config, plugin plugins.Plugin, version too...
  function IsInstalled (line 59) | func IsInstalled(conf config.Config, plugin plugins.Plugin, version tool...

FILE: internal/installs/installs_test.go
  constant testPluginName (line 16) | testPluginName = "lua"
  function TestDownloadPath (line 18) | func TestDownloadPath(t *testing.T) {
  function TestInstallPath (line 34) | func TestInstallPath(t *testing.T) {
  function TestInstalled (line 50) | func TestInstalled(t *testing.T) {
  function TestIsInstalled (line 68) | func TestIsInstalled(t *testing.T) {
  function generateConfig (line 83) | func generateConfig(t *testing.T) (config.Config, plugins.Plugin) {
  function mockInstall (line 96) | func mockInstall(t *testing.T, conf config.Config, plugin plugins.Plugin...
  function installVersion (line 104) | func installVersion(t *testing.T, conf config.Config, plugin plugins.Plu...

FILE: internal/installtest/installtest.go
  constant dataDirInstalls (line 18) | dataDirInstalls  = "installs"
  constant dataDirDownloads (line 19) | dataDirDownloads = "downloads"
  function InstallOneVersion (line 24) | func InstallOneVersion(conf config.Config, plugin plugins.Plugin, versio...
  function InstallPath (line 68) | func InstallPath(conf config.Config, plugin plugins.Plugin, version stri...
  function DownloadPath (line 73) | func DownloadPath(conf config.Config, plugin plugins.Plugin, version str...
  function pluginInstallPath (line 77) | func pluginInstallPath(conf config.Config, plugin plugins.Plugin) string {
  function formatVersionStringForFS (line 81) | func formatVersionStringForFS(version string) string {

FILE: internal/paths/paths.go
  function RemoveFromPath (line 11) | func RemoveFromPath(currentPath, pathToRemove string) string {

FILE: internal/paths/paths_test.go
  function TestRemoveFromPath (line 9) | func TestRemoveFromPath(t *testing.T) {

FILE: internal/pluginindex/pluginindex.go
  constant pluginIndexDir (line 17) | pluginIndexDir      = "plugin-index"
  constant repoUpdatedFilename (line 18) | repoUpdatedFilename = "repo-updated"
  type PluginIndex (line 23) | type PluginIndex struct
    method Get (line 55) | func (p PluginIndex) Get() (plugins []Plugin, err error) {
    method Refresh (line 67) | func (p PluginIndex) Refresh() (bool, error) {
    method doUpdate (line 104) | func (p PluginIndex) doUpdate() (bool, error) {
    method GetPluginSourceURL (line 118) | func (p PluginIndex) GetPluginSourceURL(name string) (string, error) {
  type Plugin (line 32) | type Plugin struct
  function Build (line 38) | func Build(dataDir string, URL string, disableUpdate bool, updateDuratio...
  function New (line 44) | func New(directory, url string, disableUpdate bool, updateDurationMinute...
  function touchFS (line 132) | func touchFS(directory string) (bool, error) {
  function lastUpdated (line 143) | func lastUpdated(dir string) (int64, error) {
  function readPlugin (line 154) | func readPlugin(dir, name string) (string, error) {
  function getPlugins (line 165) | func getPlugins(dir string) (plugins []Plugin, err error) {

FILE: internal/pluginindex/pluginindex_test.go
  constant mockIndexURL (line 17) | mockIndexURL    = "https://github.com/asdf-vm/asdf-plugins.git"
  constant badIndexURL (line 18) | badIndexURL     = "http://asdf-vm.com/non-existent"
  constant fooPluginURL (line 19) | fooPluginURL    = "http://example.com/foo"
  constant elixirPluginURL (line 20) | elixirPluginURL = "https://github.com/asdf-vm/asdf-elixir.git"
  constant erlangPluginURL (line 21) | erlangPluginURL = "https://github.com/asdf-vm/asdf-erlang.git"
  type MockIndex (line 24) | type MockIndex struct
    method Head (line 31) | func (m *MockIndex) Head() (string, error)      { return "", nil }
    method RemoteURL (line 32) | func (m *MockIndex) RemoteURL() (string, error) { return "", nil }
    method Clone (line 34) | func (m *MockIndex) Clone(URL, _ string) error {
    method Update (line 49) | func (m *MockIndex) Update(_ string) (string, string, string, error) {
  function writeMockPluginFile (line 63) | func writeMockPluginFile(dir, pluginName, pluginURL string) error {
  function TestGet (line 85) | func TestGet(t *testing.T) {
  function TestGetPluginSourceURL (line 96) | func TestGetPluginSourceURL(t *testing.T) {
  function TestRefresh (line 165) | func TestRefresh(t *testing.T) {

FILE: internal/plugins/plugins.go
  function NewPluginAlreadyExists (line 24) | func NewPluginAlreadyExists(plugin string) PluginAlreadyExists {
  type PluginAlreadyExists (line 30) | type PluginAlreadyExists struct
    method Error (line 34) | func (e PluginAlreadyExists) Error() string {
  type PluginMissing (line 40) | type PluginMissing struct
    method Error (line 44) | func (e PluginMissing) Error() string {
  type NoCallbackError (line 50) | type NoCallbackError struct
    method Error (line 55) | func (e NoCallbackError) Error() string {
  type NoShimTemplateError (line 61) | type NoShimTemplateError struct
    method Error (line 66) | func (e NoShimTemplateError) Error() string {
  type NoCommandError (line 72) | type NoCommandError struct
    method Error (line 77) | func (e NoCommandError) Error() string {
  constant dataDirPlugins (line 82) | dataDirPlugins         = "plugins"
  constant invalidPluginNameMsg (line 83) | invalidPluginNameMsg   = "%s is invalid. Name may only contain lowercase...
  constant pluginAlreadyExistsMsg (line 84) | pluginAlreadyExistsMsg = "Plugin named %s already added"
  constant pluginMissingMsg (line 85) | pluginMissingMsg       = "Plugin named %s not installed"
  constant hasNoCallbackMsg (line 86) | hasNoCallbackMsg       = "Plugin named %s does not have a callback named...
  constant hasNoShimTemplateMsg (line 87) | hasNoShimTemplateMsg   = "Plugin named %s does not have a shim template ...
  constant hasNoCommandMsg (line 88) | hasNoCommandMsg        = "Plugin named %s does not have a extension comm...
  type Plugin (line 94) | type Plugin struct
    method LegacyFilenames (line 110) | func (p Plugin) LegacyFilenames() (filenames []string, err error) {
    method ParseLegacyVersionFile (line 133) | func (p Plugin) ParseLegacyVersionFile(path string) (versions []string...
    method Exists (line 166) | func (p Plugin) Exists() error {
    method RunCallback (line 180) | func (p Plugin) RunCallback(name string, arguments []string, environme...
    method CallbackPath (line 196) | func (p Plugin) CallbackPath(name string) (string, error) {
    method ShimTemplatePath (line 207) | func (p Plugin) ShimTemplatePath(shimName string) (string, error) {
    method GetExtensionCommands (line 222) | func (p Plugin) GetExtensionCommands() ([]string, error) {
    method ExtensionCommandPath (line 250) | func (p Plugin) ExtensionCommandPath(name string) (string, error) {
    method Update (line 267) | func (p Plugin) Update(conf config.Config, ref string, out, errout io....
  function New (line 103) | func New(config config.Config, name string) Plugin {
  function List (line 303) | func List(config config.Config, urls, refs bool) (plugins []Plugin, err ...
  function Add (line 361) | func Add(config config.Config, pluginName, pluginURL, ref string) error {
  function Remove (line 429) | func Remove(config config.Config, pluginName string, stdout, stderr io.W...
  function PluginExists (line 479) | func PluginExists(dataDir, pluginName string) (bool, error) {
  function directoryExists (line 484) | func directoryExists(dir string) (bool, error) {
  function validatePluginName (line 497) | func validatePluginName(name string) error {

FILE: internal/plugins/plugins_test.go
  constant testPluginName (line 16) | testPluginName = "lua"
  function TestList (line 18) | func TestList(t *testing.T) {
  function TestNew (line 72) | func TestNew(t *testing.T) {
  function TestAdd (line 84) | func TestAdd(t *testing.T) {
  function TestRemove (line 175) | func TestRemove(t *testing.T) {
  function TestUpdate (line 230) | func TestUpdate(t *testing.T) {
  function TestExists (line 313) | func TestExists(t *testing.T) {
  function TestPluginExists (line 333) | func TestPluginExists(t *testing.T) {
  function TestValidatePluginName (line 382) | func TestValidatePluginName(t *testing.T) {
  function TestRunCallback (line 401) | func TestRunCallback(t *testing.T) {
  function TestCallbackPath (line 451) | func TestCallbackPath(t *testing.T) {
  function TestGetExtensionCommands (line 473) | func TestGetExtensionCommands(t *testing.T) {
  function TestExtensionCommandPath (line 503) | func TestExtensionCommandPath(t *testing.T) {
  function writeExtensionCommand (line 532) | func writeExtensionCommand(t *testing.T, plugin Plugin, name, contents s...
  function TestLegacyFilenames (line 545) | func TestLegacyFilenames(t *testing.T) {
  function TestParseLegacyVersionFile (line 570) | func TestParseLegacyVersionFile(t *testing.T) {
  function touchFile (line 607) | func touchFile(name string) error {

FILE: internal/repotest/repotest.go
  constant fixturesDir (line 22) | fixturesDir = "fixtures"
  function Setup (line 26) | func Setup(asdfDataDir string) error {
  function WritePluginCallback (line 35) | func WritePluginCallback(pluginDir, callbackName, script string) error {
  function InstallPlugin (line 42) | func InstallPlugin(fixtureName, asdfDataDir, pluginName string) (string,...
  function GeneratePlugin (line 54) | func GeneratePlugin(fixtureName, dir, pluginName string) (string, error) {
  function InstallPluginIndex (line 66) | func InstallPluginIndex(asdfDataDir string) error {
  function GeneratePluginIndex (line 79) | func GeneratePluginIndex(asdfDataDir string) (string, error) {
  function generatePluginInDir (line 97) | func generatePluginInDir(root, fixtureName, outputDir, pluginName string...
  function getModuleRoot (line 108) | func getModuleRoot() (string, error) {
  function createGitRepo (line 118) | func createGitRepo(location string) (string, error) {
  function copyInPlugin (line 171) | func copyInPlugin(root, name, destination, newName string) (string, erro...
  function findModuleRoot (line 179) | func findModuleRoot(dir string) (roots string) {
  function runCmd (line 200) | func runCmd(cmdName string, args ...string) error {

FILE: internal/resolve/resolve.go
  type ToolVersions (line 18) | type ToolVersions struct
  function Version (line 26) | func Version(conf config.Config, plugin plugins.Plugin, directory string...
  function findVersionsInDir (line 58) | func findVersionsInDir(conf config.Config, plugin plugins.Plugin, direct...
  function findVersionsInEnv (line 85) | func findVersionsInEnv(pluginName string) ([]string, string, bool) {
  function findVersionsInLegacyFile (line 98) | func findVersionsInLegacyFile(plugin plugins.Plugin, directory string) (...
  function parseVersion (line 122) | func parseVersion(rawVersions string) []string {
  function variableVersionName (line 133) | func variableVersionName(toolName string) string {

FILE: internal/resolve/resolve_test.go
  constant testPluginName (line 16) | testPluginName = "test-plugin"
  function TestVersion (line 18) | func TestVersion(t *testing.T) {
  function TestFindVersionsInDir (line 75) | func TestFindVersionsInDir(t *testing.T) {
  function TestFindVersionsLegacyFiles (line 163) | func TestFindVersionsLegacyFiles(t *testing.T) {
  function TestFindVersionsInEnv (line 202) | func TestFindVersionsInEnv(t *testing.T) {
  function TestVariableVersionName (line 230) | func TestVariableVersionName(t *testing.T) {

FILE: internal/shims/shims.go
  constant shimDirName (line 25) | shimDirName = "shims"
  type UnknownCommandError (line 28) | type UnknownCommandError struct
    method Error (line 32) | func (e UnknownCommandError) Error() string {
  type NoVersionSetError (line 37) | type NoVersionSetError struct
    method Error (line 41) | func (e NoVersionSetError) Error() string {
  type NoExecutableForPluginError (line 47) | type NoExecutableForPluginError struct
    method Error (line 53) | func (e NoExecutableForPluginError) Error() string {
  function FindExecutable (line 59) | func FindExecutable(conf config.Config, shimName, currentDirectory strin...
  function SystemExecutableOnPath (line 153) | func SystemExecutableOnPath(conf config.Config, executableName string) (...
  function ExecutableOnPath (line 162) | func ExecutableOnPath(path, command string) (string, error) {
  function GetExecutablePath (line 170) | func GetExecutablePath(conf config.Config, plugin plugins.Plugin, shimNa...
  function GetToolsAndVersionsFromShimFile (line 199) | func GetToolsAndVersionsFromShimFile(shimPath string) (versions []toolve...
  function getCustomExecutablePath (line 211) | func getCustomExecutablePath(conf config.Config, plugin plugins.Plugin, ...
  function RemoveAll (line 232) | func RemoveAll(conf config.Config) error {
  function GenerateAll (line 253) | func GenerateAll(conf config.Config, stdOut io.Writer, stdErr io.Writer)...
  function GenerateForPluginVersions (line 271) | func GenerateForPluginVersions(conf config.Config, plugin plugins.Plugin...
  function GenerateForVersion (line 286) | func GenerateForVersion(conf config.Config, plugin plugins.Plugin, versi...
  function Write (line 311) | func Write(conf config.Config, plugin plugins.Plugin, version toolversio...
  function Path (line 333) | func Path(conf config.Config, shimName string) string {
  function Directory (line 339) | func Directory(conf config.Config) string {
  function ensureShimDirExists (line 343) | func ensureShimDirExists(conf config.Config) error {
  function ToolExecutables (line 348) | func ToolExecutables(conf config.Config, plugin plugins.Plugin, version ...
  function ExecutablePaths (line 375) | func ExecutablePaths(conf config.Config, plugin plugins.Plugin, version ...
  function ExecutableDirs (line 392) | func ExecutableDirs(plugin plugins.Plugin) ([]string, error) {
  function parse (line 417) | func parse(contents string) (versions []toolversions.ToolVersions) {
  function encode (line 432) | func encode(shimName string, toolVersions []toolversions.ToolVersions) s...
  function dirsToPaths (line 450) | func dirsToPaths(dirs []string, root string) (paths []string) {

FILE: internal/shims/shims_test.go
  constant testPluginName (line 21) | testPluginName = "lua"
  function TestFindExecutable (line 23) | func TestFindExecutable(t *testing.T) {
  function TestFindExecutable_Ref (line 139) | func TestFindExecutable_Ref(t *testing.T) {
  function TestGetExecutablePath (line 162) | func TestGetExecutablePath(t *testing.T) {
  function TestRemoveAll (line 205) | func TestRemoveAll(t *testing.T) {
  function TestGenerateAll (line 231) | func TestGenerateAll(t *testing.T) {
  function TestGenerateForPluginVersions (line 260) | func TestGenerateForPluginVersions(t *testing.T) {
  function TestGenerateForVersion (line 298) | func TestGenerateForVersion(t *testing.T) {
  function TestWrite (line 333) | func TestWrite(t *testing.T) {
  function TestToolExecutables (line 393) | func TestToolExecutables(t *testing.T) {
  function TestExecutablePaths (line 443) | func TestExecutablePaths(t *testing.T) {
  function TestExecutableDirs (line 490) | func TestExecutableDirs(t *testing.T) {
  function buildOutputs (line 512) | func buildOutputs() (strings.Builder, strings.Builder) {
  function generateConfig (line 519) | func generateConfig(t *testing.T) (config.Config, plugins.Plugin) {
  function installDummyExecPathScript (line 529) | func installDummyExecPathScript(t *testing.T, conf config.Config, plugin...
  function installPlugin (line 544) | func installPlugin(t *testing.T, conf config.Config, fixture, pluginName...
  function installVersion (line 551) | func installVersion(t *testing.T, conf config.Config, plugin plugins.Plu...
  function setupShimTemplate (line 557) | func setupShimTemplate(t *testing.T, plugin plugins.Plugin, shimName str...

FILE: internal/toolversions/toolversions.go
  type Version (line 14) | type Version struct
  type ToolVersions (line 20) | type ToolVersions struct
  function WriteToolVersionsToFile (line 28) | func WriteToolVersionsToFile(filepath string, toolVersions []ToolVersion...
  function updateContentWithToolVersions (line 38) | func updateContentWithToolVersions(content string, toolVersions []ToolVe...
  function FindToolVersions (line 79) | func FindToolVersions(filepath, toolName string) (versions []string, fou...
  function GetAllToolsAndVersions (line 91) | func GetAllToolsAndVersions(filepath string) (toolVersions []ToolVersion...
  function Intersect (line 103) | func Intersect(versions1 []string, versions2 []string) (versions []strin...
  function Unique (line 114) | func Unique(versions []ToolVersions) (uniques []ToolVersions) {
  function ParseFromCliArg (line 139) | func ParseFromCliArg(version string) Version {
  function Parse (line 153) | func Parse(version string) Version {
  function ParseSlice (line 178) | func ParseSlice(versions []string) (parsedVersions []Version) {
  function Format (line 186) | func Format(version Version) string {
  function FormatForFS (line 201) | func FormatForFS(version Version) string {
  function VersionStringFromFSFormat (line 212) | func VersionStringFromFSFormat(version string) string {
  function readLines (line 219) | func readLines(content string) (lines []string) {
  function findToolVersionsInContent (line 223) | func findToolVersionsInContent(content, toolName string) (versions []str...
  function getAllToolsAndVersionsInContent (line 234) | func getAllToolsAndVersionsInContent(content string) (toolVersions []Too...
  function parseLine (line 249) | func parseLine(line string) (tokens []string, comment string) {
  function toolVersionsToTokens (line 261) | func toolVersionsToTokens(tv ToolVersions) []string {
  function encodeLine (line 265) | func encodeLine(tokens []string, comment string) string {
  function writeLine (line 276) | func writeLine(output *strings.Builder, line string) {

FILE: internal/toolversions/toolversions_test.go
  function TestGetAllToolsAndVersions (line 11) | func TestGetAllToolsAndVersions(t *testing.T) {
  function TestFindToolVersions (line 32) | func TestFindToolVersions(t *testing.T) {
  function TestWriteToolVersionsToFile (line 54) | func TestWriteToolVersionsToFile(t *testing.T) {
  function TestUpdateContentWithToolVersions (line 87) | func TestUpdateContentWithToolVersions(t *testing.T) {
  function TestIntersect (line 155) | func TestIntersect(t *testing.T) {
  function TestUnique (line 202) | func TestUnique(t *testing.T) {
  function TestFindToolVersionsInContent (line 233) | func TestFindToolVersionsInContent(t *testing.T) {
  function TestGetAllToolsAndVersionsInContent (line 253) | func TestGetAllToolsAndVersionsInContent(t *testing.T) {
  function TestParse (line 291) | func TestParse(t *testing.T) {
  function TestParseFromCliArg (line 317) | func TestParseFromCliArg(t *testing.T) {
  function TestParseSlice (line 355) | func TestParseSlice(t *testing.T) {
  function TestFormat (line 372) | func TestFormat(t *testing.T) {
  function TestFormatForFS (line 408) | func TestFormatForFS(t *testing.T) {
  function TestVersionStringFromFSFormat (line 418) | func TestVersionStringFromFSFormat(t *testing.T) {
  function BenchmarkUnique (line 441) | func BenchmarkUnique(b *testing.B) {

FILE: internal/versions/versions.go
  constant systemVersion (line 23) | systemVersion           = "system"
  constant latestVersion (line 24) | latestVersion           = "latest"
  constant latestFilterRegex (line 25) | latestFilterRegex       = "(?i)(^Available versions:|-src|-dev|-latest|-...
  constant numericStartFilterRegex (line 26) | numericStartFilterRegex = "^\\s*[0-9]"
  constant noLatestVersionErrMsg (line 27) | noLatestVersionErrMsg   = "no latest version found"
  type UninstallableVersionError (line 32) | type UninstallableVersionError struct
    method Error (line 37) | func (e UninstallableVersionError) Error() string {
  type NoVersionSetError (line 43) | type NoVersionSetError struct
    method Error (line 47) | func (e NoVersionSetError) Error() string {
  type VersionAlreadyInstalledError (line 56) | type VersionAlreadyInstalledError struct
    method Error (line 61) | func (e VersionAlreadyInstalledError) Error() string {
  function InstallAll (line 69) | func InstallAll(conf config.Config, dir string, stdOut io.Writer, stdErr...
  function Install (line 92) | func Install(conf config.Config, plugin plugins.Plugin, dir string, stdO...
  function InstallVersion (line 123) | func InstallVersion(conf config.Config, plugin plugins.Plugin, version t...
  function InstallOneVersion (line 141) | func InstallOneVersion(conf config.Config, plugin plugins.Plugin, versio...
  function Latest (line 238) | func Latest(plugin plugins.Plugin, query string) (version string, err er...
  function AllVersions (line 279) | func AllVersions(plugin plugins.Plugin) (versions []string, err error) {
  function Uninstall (line 296) | func Uninstall(conf config.Config, plugin plugins.Plugin, rawVersion str...
  function filterByExactMatch (line 337) | func filterByExactMatch(allVersions []string, pattern string) (versions ...
  function filterByRegex (line 347) | func filterByRegex(allVersions []string, pattern string, keepMatch bool)...
  function parseVersions (line 361) | func parseVersions(rawVersions string) []string {

FILE: internal/versions/versions_test.go
  constant testPluginName (line 17) | testPluginName = "testlua"
  function TestInstallAll (line 19) | func TestInstallAll(t *testing.T) {
  function TestInstall (line 75) | func TestInstall(t *testing.T) {
  function TestInstallVersion (line 151) | func TestInstallVersion(t *testing.T) {
  function TestInstallOneVersion (line 184) | func TestInstallOneVersion(t *testing.T) {
  function TestLatest (line 324) | func TestLatest(t *testing.T) {
  function TestLatestWithSamples (line 396) | func TestLatestWithSamples(t *testing.T) {
  function TestAllVersions (line 433) | func TestAllVersions(t *testing.T) {
  function TestUninstall (line 458) | func TestUninstall(t *testing.T) {
  function buildOutputs (line 515) | func buildOutputs() (strings.Builder, strings.Builder) {
  function assertVersionInstalled (line 522) | func assertVersionInstalled(t *testing.T, dataDir, pluginName, version s...
  function assertNotInstalled (line 545) | func assertNotInstalled(t *testing.T, dataDir, pluginName, version strin...
  function generateConfig (line 556) | func generateConfig(t *testing.T) (config.Config, plugins.Plugin) {
  function installPlugin (line 569) | func installPlugin(t *testing.T, conf config.Config, fixture, name strin...
  function writeVersionFile (line 575) | func writeVersionFile(t *testing.T, dir, contents string) {

FILE: scripts/checkstyle.py
  class c (line 26) | class c:
  function utilGetStrs (line 38) | def utilGetStrs(line: Any, m: Any):
  function noDoubleBackslashFixer (line 47) | def noDoubleBackslashFixer(line: str, m: Any) -> str:
  function noPwdCaptureFixer (line 54) | def noPwdCaptureFixer(line: str, m: Any) -> str:
  function noTestDoubleEqualsFixer (line 61) | def noTestDoubleEqualsFixer(line: str, m: Any) -> str:
  function noFunctionKeywordFixer (line 71) | def noFunctionKeywordFixer(line: str, m: Any) -> str:
  function noVerboseRedirectionFixer (line 88) | def noVerboseRedirectionFixer(line: str, m: Any) -> str:
  function lintfile (line 93) | def lintfile(file: Path, rules: List[Rule], options: Dict[str, Any]):
  function main (line 135) | def main():
Condensed preview — 299 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,264K chars).
[
  {
    "path": ".editorconfig",
    "chars": 265,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 512,
    "preview": "# Run shfmt on bash files\nb8dc5f160447baabab9c69683824512ded577254\n\n# fix: Remove == inside [ (#1421)\nd81b81f9de2dc59616"
  },
  {
    "path": ".gitattributes",
    "chars": 1421,
    "preview": "## GITATTRIBUTES\n#\n# Details per file setting:\n#   text    These files should be normalized (i.e. convert CRLF to LF).\n#"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 63,
    "preview": "# Default owners for all the code in this repo\n* @asdf-vm/core\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 1463,
    "preview": "name: Bug Report\ndescription: Create a report to help us improve\ntitle: \"bug: \"\nlabels: [bug]\nbody:\n  - type: markdown\n "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 263,
    "preview": "# Force users to use one of our predefined issue templates\nblank_issues_enabled: false\ncontact_links:\n  - name: Question"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation.yaml",
    "chars": 565,
    "preview": "name: Documentation\ndescription: Suggest a documentation improvements for this project\nlabels: \"documentation\"\nbody: \n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "chars": 1465,
    "preview": "name: Feature Request\ndescription: Suggest an idea for this project\nlabels: \"enhancement\"\nbody: \n  - type: markdown\n    "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 287,
    "preview": "# Summary\n\n<!-- Provide a general description of the code changes in your pull request. -->\n\nFixes: List issue numbers h"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 464,
    "preview": "version: 2\nupdates:\n  # Maintain dependencies for GitHub Actions\n  - package-ecosystem: \"github-actions\"\n    directory: "
  },
  {
    "path": ".github/workflows/documentation.yml",
    "chars": 1468,
    "preview": "name: Documentation\n\non:\n  # trigger deployment on push to master branch when changes to docs/**\n  push:\n    paths:\n    "
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 1321,
    "preview": "name: Lint\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\nenv:\n  PYTHON_MIN_VERSION: \"3.13.1\"\n\njobs:\n  asdf-"
  },
  {
    "path": ".github/workflows/release-build.yml",
    "chars": 1365,
    "preview": "name: Build Binaries for Release\n\non:\n  release:\n    types: [published]\n  workflow_dispatch:\n    inputs:\n      tag:\n    "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 417,
    "preview": "name: Release\n\non:\n  push:\n    branches:\n      - master\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  "
  },
  {
    "path": ".github/workflows/semantic-pr.yml",
    "chars": 843,
    "preview": "name: Lint\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n\njobs:\n  semantic-pr"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 2861,
    "preview": "name: Test\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n  detect-changes:\n    runs-on: ubuntu-latest"
  },
  {
    "path": ".gitignore",
    "chars": 97,
    "preview": "/installs\n/downloads\n/shims\nrepository\n.vagrant\nkeyrings\n/tmp\n\ndist/\n\n# ignore build binary\nasdf\n"
  },
  {
    "path": ".release-please-manifest.json",
    "chars": 20,
    "preview": "{\n  \".\": \"0.18.1\"\n}\n"
  },
  {
    "path": ".tool-versions",
    "chars": 55,
    "preview": "golang 1.24.9\nbats 1.8.2\nshellcheck 0.10.0\nshfmt 3.6.0\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 70544,
    "preview": "# Changelog\n\n## [0.18.1](https://github.com/asdf-vm/asdf/compare/v0.18.0...v0.18.1) (2026-03-04)\n\n\n### Bug Fixes\n\n* Only"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1824,
    "preview": "# How to Contribute to asdf\n\nThere are many ways to contribute to `asdf`, thanks for taking the time to read and help.\n\n"
  },
  {
    "path": "LICENSE",
    "chars": 1082,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Akash Manohar J\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "Makefile",
    "chars": 725,
    "preview": "MAIN_PACKAGE_PATH := ./cmd/asdf\nTARGET_DIR := .\nTARGET := asdf\nLINKER_FLAGS = '-s'\n\n# Not sure what the default location"
  },
  {
    "path": "README.md",
    "chars": 3609,
    "preview": "# asdf\n\n[![Lint](https://github.com/asdf-vm/asdf/actions/workflows/lint.yml/badge.svg)](https://github.com/asdf-vm/asdf/"
  },
  {
    "path": "SECURITY.md",
    "chars": 972,
    "preview": "# Security Policy\n\n**This security policy only applies to asdf core, which is the code contained in\nthis repository. All"
  },
  {
    "path": "asdf.elv",
    "chars": 7190,
    "preview": "use path\nuse re\nuse str\n\nvar asdf_dir = ~'/.asdf'\nif (and (has-env ASDF_DIR) (!=s $E:ASDF_DIR '')) {\n  set asdf_dir = $E"
  },
  {
    "path": "asdf.fish",
    "chars": 1028,
    "preview": "if test -z $ASDF_DIR\n    set ASDF_DIR (builtin realpath --no-symlinks (dirname (status filename)))\nend\nset --export ASDF"
  },
  {
    "path": "asdf.nu",
    "chars": 9017,
    "preview": "def --env configure-asdf [] {\n    $env.ASDF_DIR = (\n      if ($env | get --ignore-errors ASDF_NU_DIR | is-empty) == fals"
  },
  {
    "path": "asdf.ps1",
    "chars": 751,
    "preview": "$Env:ASDF_DIR = $PSScriptRoot\n\n$_asdf_bin = \"$Env:ASDF_DIR/bin\"\nif ($null -eq $ASDF_DATA_DIR -or $ASDF_DATA_DIR -eq '') "
  },
  {
    "path": "asdf.sh",
    "chars": 4344,
    "preview": "# shellcheck shell=sh\n# shellcheck disable=SC1007\n\n# This file is the entrypoint for all POSIX-compatible shells. If `AS"
  },
  {
    "path": "ballad-of-asdf.md",
    "chars": 992,
    "preview": "# Ballad of asdf\n\n> Once upon a time there was a programming language<br/>\n> There were many versions of it<br/>\n> So pe"
  },
  {
    "path": "bin/private/asdf-exec",
    "chars": 413,
    "preview": "#!/usr/bin/env bash\n\n# remove this asdf-exec file when releasing >=0.6.5\nprintf \"asdf is self upgrading shims to new asd"
  },
  {
    "path": "defaults",
    "chars": 263,
    "preview": "# See the docs for explanations: https://asdf-vm.com/manage/configuration.html\n\nlegacy_version_file = no\nuse_release_can"
  },
  {
    "path": "docs/.gitattributes",
    "chars": 4672,
    "preview": "## GITATTRIBUTES FOR WEB PROJECTS\n#\n# These settings are for any web project.\n#\n# Details per file setting:\n#   text    "
  },
  {
    "path": "docs/.gitignore",
    "chars": 2172,
    "preview": "### Custom ###\n# VitePress build output & cache directory\n.vitepress/cache\n.vitepress/dist\n\n# Created by https://www.top"
  },
  {
    "path": "docs/.prettierignore",
    "chars": 120,
    "preview": "# VitePress build output & cache directory\n.vitepress/cache\n.vitepress/dist\nnode_modules\npackage.json\npackage-lock.json\n"
  },
  {
    "path": "docs/.tool-versions",
    "chars": 15,
    "preview": "nodejs 22.10.0\n"
  },
  {
    "path": "docs/.vitepress/config.ts",
    "chars": 1411,
    "preview": "import { defineConfig } from \"vitepress\";\nimport * as navbars from \"./navbars\";\nimport * as sidebars from \"./sidebars\";\n"
  },
  {
    "path": "docs/.vitepress/navbars.ts",
    "chars": 2418,
    "preview": "import path from \"path\";\nimport fs from \"fs\";\nimport process from \"process\";\n\nexport const getVersion = () => {\n  const "
  },
  {
    "path": "docs/.vitepress/sidebars.ts",
    "chars": 14438,
    "preview": "const en = [\n  {\n    text: \"Guide\",\n    collapsed: false,\n    items: [\n      { text: \"What is asdf?\", link: \"/guide/intr"
  },
  {
    "path": "docs/.vitepress/theme/custom.css",
    "chars": 193,
    "preview": ":root {\n  --vp-c-brand-1: #b744b8;\n  --vp-c-brand-2: #a379c9;\n  /* TODO: make brand-2 and brand-3 different & set brand-"
  },
  {
    "path": "docs/.vitepress/theme/index.ts",
    "chars": 97,
    "preview": "import DefaultTheme from \"vitepress/theme\";\nimport \"./custom.css\";\n\nexport default DefaultTheme;\n"
  },
  {
    "path": "docs/CNAME",
    "chars": 11,
    "preview": "asdf-vm.com"
  },
  {
    "path": "docs/contribute/core.md",
    "chars": 5844,
    "preview": "# asdf\n\n`asdf` core contribution guide.\n\n## Initial Setup\n\nFork `asdf` on GitHub and/or Git clone the default branch:\n\n`"
  },
  {
    "path": "docs/contribute/documentation.md",
    "chars": 3950,
    "preview": "# Docs & Site\n\nDocumentation & site contribution guide.\n\n## Initial Setup\n\nFork `asdf` on GitHub and/or Git clone the de"
  },
  {
    "path": "docs/contribute/first-party-plugins.md",
    "chars": 829,
    "preview": "# First-Party Plugins\n\nThe asdf core team has authored some plugins relevant to their daily work life. Help is always we"
  },
  {
    "path": "docs/contribute/github-actions.md",
    "chars": 185,
    "preview": "# GitHub Actions\n\nThanks for your interest, please see the [asdf actions repo](https://github.com/asdf-vm/actions) for t"
  },
  {
    "path": "docs/guide/getting-started-legacy.md",
    "chars": 14723,
    "preview": "# Getting Started\n\n`asdf` installation involves:\n\n1. Installing dependencies\n2. Downloading `asdf` core\n3. Installing `a"
  },
  {
    "path": "docs/guide/getting-started.md",
    "chars": 14231,
    "preview": "# Getting Started\n\n## 1. Install asdf\n\nasdf can be installed in several different ways:\n\n::: details With Package Manage"
  },
  {
    "path": "docs/guide/introduction.md",
    "chars": 3701,
    "preview": "# Introduction\n\n`asdf` is a tool version manager. All tool version definitions are contained within one file (`.tool-ver"
  },
  {
    "path": "docs/guide/upgrading-to-v0-16.md",
    "chars": 10442,
    "preview": "# Upgrading to 0.16.0\n\nasdf versions 0.15.0 and older were written in Bash and distributed as a set of\nBash scripts with"
  },
  {
    "path": "docs/index.md",
    "chars": 1305,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: asdf\n  text: The Multiple Runt"
  },
  {
    "path": "docs/ja-jp/contribute/core.md",
    "chars": 4752,
    "preview": "# asdf\n\nこれは、`asdf`コアのコントリビューションガイドです。\n\n## 初期セットアップ\n\nGitHubで`asdf`をフォークするか、デフォルトのブランチをGitクローンしてください:\n\n```shell\n# clone yo"
  },
  {
    "path": "docs/ja-jp/contribute/documentation.md",
    "chars": 3218,
    "preview": "# ドキュメント & サイト\n\nこれは、ドキュメントおよびサイトのコントリビューションガイドです。\n\n## 初期セットアップ\n\nGitHubで`asdf`をフォークするか、デフォルトのブランチをGitクローンしてください:\n\n```shel"
  },
  {
    "path": "docs/ja-jp/contribute/first-party-plugins.md",
    "chars": 679,
    "preview": "# 公式プラグイン\n\nasdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポ"
  },
  {
    "path": "docs/ja-jp/contribute/github-actions.md",
    "chars": 135,
    "preview": "# GitHub Actions\n\nご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、[asdf actions リポジトリ](https://github.com/asdf-vm/ac"
  },
  {
    "path": "docs/ja-jp/guide/getting-started-legacy.md",
    "chars": 12186,
    "preview": "# はじめよう\n\n`asdf`のインストールには次の手順が必要です:\n\n1. 依存関係のインストール\n2. `asdf`コアのダウンロード\n3. `asdf`のインストール\n4. 管理したいツール/ランタイムごとにプラグインをインストール\n"
  },
  {
    "path": "docs/ja-jp/guide/getting-started.md",
    "chars": 11285,
    "preview": "# はじめよう\n\n## 1. asdfのインストール\n\nasdfはいくつかの方法でインストールできます:\n\n::: details パッケージマネージャーを使用 - **推奨**\n\n| パッケージマネージャー   | コマンド       "
  },
  {
    "path": "docs/ja-jp/guide/introduction.md",
    "chars": 2409,
    "preview": "# イントロダクション\n\n`asdf`は、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(`.tool-versions`)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有すること"
  },
  {
    "path": "docs/ja-jp/guide/parts/install-dependencies.md",
    "chars": 672,
    "preview": "##### 依存関係のインストール\n\nasdfの動作には`git`が必要です。以下の表は、 _あなたが使用している_ パッケージマネージャで実行するコマンドの _一部例_ です(いくつかのツールは、後の手順で自動的にインストールされます)。"
  },
  {
    "path": "docs/ja-jp/guide/upgrading-to-v0-16.md",
    "chars": 5640,
    "preview": "# 0.16.0にアップグレードする\n\nasdfはバージョン0.15.0以前まではBashで書かれており、`asdf`関数がシェルにロードされたBashスクリプトのセットとして配布されていました。バージョン0.16.0はasdfをGoで完全"
  },
  {
    "path": "docs/ja-jp/index.md",
    "chars": 1070,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: asdf\n  text: マルチランタイム<br/>バージョ"
  },
  {
    "path": "docs/ja-jp/manage/commands.md",
    "chars": 108,
    "preview": "# すべてのコマンド\n\n`asdf`で利用可能なすべてのコマンドの一覧です。この一覧は、`asdf help`コマンドで表示されるテキストです。\n\n<<< @../../internal/help/help.txt\n"
  },
  {
    "path": "docs/ja-jp/manage/configuration.md",
    "chars": 9816,
    "preview": "# 構成設定\n\n`asdf`の構成設定には、他人と共有可能な`.tool-versions`ファイルと、`.asdfrc`や環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。\n\n## `.tool-versions`\n\n`.t"
  },
  {
    "path": "docs/ja-jp/manage/core.md",
    "chars": 7551,
    "preview": "# コア\n\nコアとなる`asdf`のコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。\n\n## インストール & セットアップ\n\n[はじめよう](/ja-jp/guide/getting-started.md)のガ"
  },
  {
    "path": "docs/ja-jp/manage/plugins.md",
    "chars": 1839,
    "preview": "# プラグイン\n\nプラグインは、`asdf`がNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。\n\n様々なツールをサポートするために使用されるプラグインAPIについては、[プラグインの作成](/j"
  },
  {
    "path": "docs/ja-jp/manage/versions.md",
    "chars": 3998,
    "preview": "# バージョン\n\n## バージョンのインストール\n\n```shell\nasdf install <name> <version>\n# asdf install erlang 17.3\n```\n\nプラグインが、ソースコードからのダウンロード・"
  },
  {
    "path": "docs/ja-jp/more/community-projects.md",
    "chars": 517,
    "preview": "# コミュニティプロジェクト\n\n`asdf`に関連するコミュニティプロジェクトをいくつか紹介します:\n\n- [asdf-community](https://github.com/asdf-community): asdfプラグインの長期的"
  },
  {
    "path": "docs/ja-jp/more/faq.md",
    "chars": 1260,
    "preview": "# FAQ\n\nここでは、`asdf`に関するよくある質問を紹介します。\n\n## WSL1をサポートしていますか?\n\nWSL1 ([Windows Subsystem for Linux](https://ja.wikipedia.org/w"
  },
  {
    "path": "docs/ja-jp/more/thanks.md",
    "chars": 527,
    "preview": "# 謝辞\n\nこのページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!\n\n## クレジット\n\n私 ([@HashNuke](https://github.com/HashNuke))、高熱、風邪、咳。\n\nコピ"
  },
  {
    "path": "docs/ja-jp/plugins/create.md",
    "chars": 24764,
    "preview": "# プラグインの作成\n\nプラグインとは、\n言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。\nこれらのスクリプトは、`asdf list-all <name>`や`asdf install <"
  },
  {
    "path": "docs/ko-kr/contribute/core.md",
    "chars": 4472,
    "preview": "# asdf\n\n`asdf` 코어 기여 가이드.\n\n## 초기 설정\n\nGithub의 `asdf`를 fork하거나 clone하세요:\n\n```shell\n# clone your fork\ngit clone https://git"
  },
  {
    "path": "docs/ko-kr/contribute/documentation.md",
    "chars": 2924,
    "preview": "# 문서 & 사이트\n\n문서 & 사이트 기여 가이드.\n\n## 초기 세팅\n\nGithub의 `asdf` fork 그리고/혹은 기본 브랜치 Git clone:\n\n```shell\n# clone your fork\ngit clo"
  },
  {
    "path": "docs/ko-kr/contribute/first-party-plugins.md",
    "chars": 643,
    "preview": "# 공식 플러그인\n\nasdf 코어 팀은 일상 업무 환경에서 사용되는 플러그인들을 작성해왔습니다. 이 플러그인들을 관리하고 발전시키는 도움은 언제든 환영입니다. 아래 각 링크들에서 관련된 리포지토리들을 확인하세요:\n\n"
  },
  {
    "path": "docs/ko-kr/contribute/github-actions.md",
    "chars": 130,
    "preview": "# GitHub Actions\n\n당신의 관심에 감사드리며, 존재하는 이슈들, 대화들, 그리고 기여 가이드라인을 [asdf actions 리포지토리](https://github.com/asdf-vm/actions)에서"
  },
  {
    "path": "docs/ko-kr/guide/getting-started.md",
    "chars": 11691,
    "preview": "# 시작하기\n\n`asdf` 설치는 다음과 같습니다:\n\n1. dependencies 설치\n2. `asdf` 코어 다운로드\n3. `asdf` 설치\n4. 관리하고 싶은 각각의 툴/런타임 플러그인 설치\n5. 툴/런타임 버전"
  },
  {
    "path": "docs/ko-kr/guide/introduction.md",
    "chars": 2381,
    "preview": "# 소개\n\n`asdf`는 툴 버전 매니저입니다. 모든 툴 버전 정의들은 당신의 팀들과 공유되는 프로젝트의 Git 리포지토리에서 확인할 수 있는 하나의 (`.tool-versions`) 파일에 있으며, 모든 사람들이 "
  },
  {
    "path": "docs/ko-kr/index.md",
    "chars": 1019,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: asdf\n  text: 다중 런타임 버전 매니저\n  t"
  },
  {
    "path": "docs/ko-kr/manage/commands.md",
    "chars": 115,
    "preview": "# 모든 명령어\n\n다음 목록은 `asdf`에서 이용가능한 모든 명령어들입니다. 해당 목록은 `asdf help` 명령어를 통해 확인가능합니다.\n\n<<< @../../internal/help/help.txt\n"
  },
  {
    "path": "docs/ko-kr/manage/configuration.md",
    "chars": 9612,
    "preview": "# 설정\n\n`asdf`의 설정은 공유가능한 `.tool-versions` 파일들 뿐만 아니라 `.asdfrc`를 통한 특정한 사용자 맞춤화 및 환경 변수들을 모두 포함합니다.\n\n## `.tool-versions`\n\n"
  },
  {
    "path": "docs/ko-kr/manage/core.md",
    "chars": 7475,
    "preview": "# 코어\n\n코어 `asdf` 명령어는 소수지만, 많은 워크플로우를 원활하게 만들어줍니다.\n\n## 설치 & 설정\n\n[시작하기](/ko-kr/guide/getting-started.md)의 가이드에 설명되어 있습니다.\n"
  },
  {
    "path": "docs/ko-kr/manage/plugins.md",
    "chars": 1799,
    "preview": "# 플러그인\n\n플로그인들은 `asdf`가 Node.js, Ruby, Elixir 등 여러가지 툴들을 취급하는 방법입니다.\n\n더 많은 툴들 지원을 위한 플러그인 API는 [플러그인 생성하기](/ko-kr/plugins"
  },
  {
    "path": "docs/ko-kr/manage/versions.md",
    "chars": 4051,
    "preview": "# 버전\n\n## 버전 설치\n\n```shell\nasdf install <name> <version>\n# asdf install erlang 17.3\n```\n\n플러그인이 소스에서 다운로드 & 컴파일을 지원하는 경우, `"
  },
  {
    "path": "docs/ko-kr/more/community-projects.md",
    "chars": 475,
    "preview": "# 커뮤니티 프로젝트\n\n`asdf`와 관련된 커뮤니티 프로젝트들입니다:\n\n- [asdf-community](https://github.com/asdf-community): \n  asdf 플로그인들의 장기 관리를 위한"
  },
  {
    "path": "docs/ko-kr/more/faq.md",
    "chars": 1308,
    "preview": "# 자주 묻는 질문\n\n`asdf`에 관련된 공통된 질문들입니다.\n\n## WSL1을 지원하나요?\n\nWSL1 ([Windows Subsystem for Linux](https://en.wikipedia.org/wiki/"
  },
  {
    "path": "docs/ko-kr/more/thanks.md",
    "chars": 507,
    "preview": "# 감사인사\n\nasdf 저자들 & 기여자들을 위한 감사 페이지!\n\n## Credits\n\n나 ([@HashNuke](https://github.com/HashNuke)), 고열, 감기, 기침.\n\n2014년부터 종료까지"
  },
  {
    "path": "docs/ko-kr/plugins/create.md",
    "chars": 23942,
    "preview": "# 플러그인 생성하기\n\n플러그인은 언어 / 툴의 버전 관리를 지원하는 실행 가능한 스크립트들이 있는\nGit 리포지토리입니다. 이 스크립트들은 asdf에 의해 특정 명령어들을 받아\n`asdf list-all <name"
  },
  {
    "path": "docs/manage/commands.md",
    "chars": 140,
    "preview": "# All Commands\n\nThe list of all commands available in `asdf`. This list is the `asdf help` command text.\n\n<<< @../../int"
  },
  {
    "path": "docs/manage/configuration.md",
    "chars": 12254,
    "preview": "# Configuration\n\nConfiguration of `asdf` encompasses both the sharable `.tool-versions` files as well as user specific c"
  },
  {
    "path": "docs/manage/core.md",
    "chars": 8906,
    "preview": "# Core\n\nThe core `asdf` command list is rather small, but can facilitate many workflows.\n\n## Installation & Setup\n\nCover"
  },
  {
    "path": "docs/manage/dependencies.md",
    "chars": 694,
    "preview": "# Dependencies\n\nThis list is for asdf version 0.16.0 and greater. Older versions of asdf have\nadditional dependencies.\n\n"
  },
  {
    "path": "docs/manage/plugins.md",
    "chars": 2374,
    "preview": "# Plugins\n\nPlugins are how `asdf` knows to handle different tools like Node.js, Ruby, Elixir etc.\n\nSee [Creating Plugins"
  },
  {
    "path": "docs/manage/versions.md",
    "chars": 5429,
    "preview": "# Versions\n\n## Install Version\n\n```shell\nasdf install <name> <version>\n# asdf install erlang 17.3\n```\n\nIf a plugin suppo"
  },
  {
    "path": "docs/more/community-projects.md",
    "chars": 655,
    "preview": "# Community Projects\n\nHere are some community projects related to `asdf`:\n\n- [asdf-community](https://github.com/asdf-co"
  },
  {
    "path": "docs/more/faq.md",
    "chars": 4523,
    "preview": "# FAQ\n\nHere are some common questions regarding `asdf`.\n\n## WSL1 support?\n\nWSL1 ([Windows Subsystem for Linux](https://e"
  },
  {
    "path": "docs/more/thanks.md",
    "chars": 593,
    "preview": "# Thanks\n\nThank you page to the asdf authors & contributors!\n\n## Credits\n\nMe ([@HashNuke](https://github.com/HashNuke)),"
  },
  {
    "path": "docs/package.json",
    "chars": 344,
    "preview": "{\n  \"type\": \"module\",\n  \"scripts\": {\n    \"fmt\": \"prettier --write '.vitepress/{config,navbars,sidebars}.ts' '.vitepress/"
  },
  {
    "path": "docs/parts/install-dependencies-cmds.md",
    "chars": 520,
    "preview": "| OS    | Package Manager | Command                            |\n| ----- | --------------- | ---------------------------"
  },
  {
    "path": "docs/parts/install-dependencies.md",
    "chars": 418,
    "preview": "##### Install Dependencies\n\nasdf primarily requires `git`. Here is a _non-exhaustive_ list of commands to run for _your_"
  },
  {
    "path": "docs/plugins/create.md",
    "chars": 32206,
    "preview": "# Create a Plugin\n\nA plugin is a Git repo with some executable scripts to support versioning a\nlanguage / tool. These sc"
  },
  {
    "path": "docs/pt-br/contribute/core.md",
    "chars": 5028,
    "preview": "# asdf\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, "
  },
  {
    "path": "docs/pt-br/contribute/documentation.md",
    "chars": 4103,
    "preview": "# Docs & Site\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this"
  },
  {
    "path": "docs/pt-br/contribute/first-party-plugins.md",
    "chars": 1029,
    "preview": "# First-Party Plugins\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help transl"
  },
  {
    "path": "docs/pt-br/contribute/github-actions.md",
    "chars": 366,
    "preview": "# GitHub Actions\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate t"
  },
  {
    "path": "docs/pt-br/guide/getting-started.md",
    "chars": 15494,
    "preview": "# Começando\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this p"
  },
  {
    "path": "docs/pt-br/guide/introduction.md",
    "chars": 4206,
    "preview": "# Introdução\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this "
  },
  {
    "path": "docs/pt-br/index.md",
    "chars": 1419,
    "preview": "---\nlayout: home\n\nhero:\n  name: asdf\n  text: O Gerenciador de Múltiplas Versões de Tempo de Execução\n  tagline: Gerencie"
  },
  {
    "path": "docs/pt-br/manage/commands.md",
    "chars": 318,
    "preview": "# All Commands\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate thi"
  },
  {
    "path": "docs/pt-br/manage/configuration.md",
    "chars": 4046,
    "preview": "# Configuration\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate th"
  },
  {
    "path": "docs/pt-br/manage/core.md",
    "chars": 9514,
    "preview": "# Core\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, "
  },
  {
    "path": "docs/pt-br/manage/plugins.md",
    "chars": 2479,
    "preview": "# Plugins\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this pag"
  },
  {
    "path": "docs/pt-br/manage/versions.md",
    "chars": 5005,
    "preview": "# Versões\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this pag"
  },
  {
    "path": "docs/pt-br/more/community-projects.md",
    "chars": 650,
    "preview": "# Community Projects\n\nHere are some community projects related to `asdf`:\n\n- [asdf-community](https://github.com/asdf-co"
  },
  {
    "path": "docs/pt-br/more/faq.md",
    "chars": 1913,
    "preview": "# Perguntas frequentes\n\nAqui estão algumas perguntas comuns sobre `asdf`.\n\n## Suporte WSL1?\n\nWSL1 ([Windows Subsystem fo"
  },
  {
    "path": "docs/pt-br/more/thanks.md",
    "chars": 547,
    "preview": "# Créditos\n\nEu ([@HashNuke](https://github.com/HashNuke)), febre alta, resfriado e tosse.\n\nCopyright 2014 até o final do"
  },
  {
    "path": "docs/pt-br/plugins/create.md",
    "chars": 15882,
    "preview": "# Criar um plug-in\n\n> Hi, we've recently migrated our docs and added some new pages. If you would like to help translate"
  },
  {
    "path": "docs/zh-hans/contribute/core.md",
    "chars": 3993,
    "preview": "# asdf\n\n`asdf` 核心贡献指南.\n\n## 初始化安装\n\n在 Github 上 fork `asdf` 并且/或者使用 Git 克隆默认分支:\n\n```shell\n# 克隆你 fork 的 asdf\ngit clone https"
  },
  {
    "path": "docs/zh-hans/contribute/documentation.md",
    "chars": 2553,
    "preview": "# 文档 & 网站\n\n文档 & 网站贡献指南。\n\n## 初始化设置\n\n在 Github 上 fork `asdf` 并且/或者使用 Git 克隆默认分支:\n\n```shell\n# 克隆你 fork 的 asdf\ngit clone http"
  },
  {
    "path": "docs/zh-hans/contribute/first-party-plugins.md",
    "chars": 546,
    "preview": "# 官方插件\n\nasdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:\n\n- [Elixir](https://github.com/asdf-vm/asdf-elix"
  },
  {
    "path": "docs/zh-hans/contribute/github-actions.md",
    "chars": 102,
    "preview": "# GitHub Actions\n\n感谢你的关注,请参考 [asdf actions repo](https://github.com/asdf-vm/actions) 了解现有的问题、对话和贡献指南。\n"
  },
  {
    "path": "docs/zh-hans/guide/getting-started-legacy.md",
    "chars": 11205,
    "preview": "# 快速入门\n\n`asdf` 安装过程包括:\n\n1. 安装依赖\n2. 下载 `asdf` 核心\n3. 安装 `asdf`\n4. 为每一个你想要管理的工具/运行环境安装插件\n5. 安装工具/运行环境的一个版本\n6. 通过 `.tool-ver"
  },
  {
    "path": "docs/zh-hans/guide/getting-started.md",
    "chars": 9380,
    "preview": "# 快速入门\n\n## 1. 安装 asdf\n\nasdf 的安装方式有以下几种:\n\n::: details 使用包管理器 - **推荐**\n\n| 包管理器 | 命令 |\n| -------- | ----- |\n| Homebrew | `b"
  },
  {
    "path": "docs/zh-hans/guide/introduction.md",
    "chars": 1905,
    "preview": "# 项目简介\n\n`asdf` 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(`.tool-versions`)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用**完全**相同的工具版"
  },
  {
    "path": "docs/zh-hans/guide/upgrading-to-v0-16.md",
    "chars": 5413,
    "preview": "# 升级到 0.16.0\n\nasdf 0.15.0 版本以及更早版本是用 Bash 编写的,并以一系列 Bash 脚本的形式分发,其中 `asdf` 函数加载到 shell 中。从 0.16.0 版本开始 asdf 用 Go 语言完全重写了"
  },
  {
    "path": "docs/zh-hans/index.md",
    "chars": 935,
    "preview": "---\n# https://vitepress.dev/reference/default-theme-home-page\nlayout: home\n\nhero:\n  name: asdf\n  text: 多运行时版本管理器\n  tagli"
  },
  {
    "path": "docs/zh-hans/manage/commands.md",
    "chars": 89,
    "preview": "# 所有命令\n\n`asdf` 中所有可用命令的列表。这个列表就是 `asdf help` 命令的打印内容。\n\n<<< @../../internal/help/help.txt\n"
  },
  {
    "path": "docs/zh-hans/manage/configuration.md",
    "chars": 8305,
    "preview": "# 配置\n\n`asdf` 配置既包括可共享的 `.tool-versions` 文件,也包括用户特定的自定义 `.asdfrc` 和环境变量。\n\n## `.tool-versions`\n\n无论何时 `.tool-versions` 出现在目"
  },
  {
    "path": "docs/zh-hans/manage/core.md",
    "chars": 6752,
    "preview": "# 核心\n\n核心 `asdf` 命令列表很小,但可以促进很多工作流。\n\n## 安装和配置\n\n请查看 [快速上手](/zh-hans/guide/getting-started.md) 了解更多详情。\n\n## Exec\n\n```shell\na"
  },
  {
    "path": "docs/zh-hans/manage/dependencies.md",
    "chars": 334,
    "preview": "# 依赖\n\n此列表适用于 asdf 版本 0.16.0 及更高版本。旧版本的 asdf 具有额外的依赖。\n\nasdf 本身需要安装以下内容:\n\n* Bash 版本 `3.2.48`\n* Git 版本 `1.7.7.2`\n\n::: tip 注"
  },
  {
    "path": "docs/zh-hans/manage/plugins.md",
    "chars": 1533,
    "preview": "# 插件\n\n插件告诉 `asdf` 如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。\n\n请参考 [创建插件](/zh-hans/plugins/create.md) 了解用于支持更多工具的插件 API。\n\n## 添加"
  },
  {
    "path": "docs/zh-hans/manage/versions.md",
    "chars": 3384,
    "preview": "# 版本\n\n## 安装版本\n\n```shell\nasdf install <name> <version>\n# asdf install erlang 17.3\n```\n\n如果一个插件支持从源代码下载和编译,你可以指定 `ref:foo`,"
  },
  {
    "path": "docs/zh-hans/more/community-projects.md",
    "chars": 650,
    "preview": "# Community Projects\n\nHere are some community projects related to `asdf`:\n\n- [asdf-community](https://github.com/asdf-co"
  },
  {
    "path": "docs/zh-hans/more/faq.md",
    "chars": 2357,
    "preview": "# FAQ\n\n以下是 `asdf` 相关的一些常见问题。\n\n## 支持 WSL1 吗?\n\nWSL1 ([Windows Subsystem for Linux 1](https://en.wikipedia.org/wiki/Windows"
  },
  {
    "path": "docs/zh-hans/more/thanks.md",
    "chars": 479,
    "preview": "# 致谢\n\nasdf 作者和贡献者的感谢页!\n\n## 作者\n\n我 ([@HashNuke](https://github.com/HashNuke)),高烧、感冒、咳嗽。\n\n版权 2014 直到时间尽头 ([MIT License](htt"
  },
  {
    "path": "docs/zh-hans/parts/install-dependencies-cmds.md",
    "chars": 513,
    "preview": "| 操作系统 |    包管理器     | 命令                               |\n| ----- | --------------- | ----------------------------------"
  },
  {
    "path": "docs/zh-hans/parts/install-dependencies.md",
    "chars": 234,
    "preview": "##### 安装依赖\n\nasdf 主要依赖 `git`。 这是一份 _非穷举_ 的命令清单用于运行 _你的_ 包管理器(有些可能在后面的步骤自动安装这些工具)。\n\n<!--@include: @/zh-hans/parts/install-"
  },
  {
    "path": "docs/zh-hans/plugins/create.md",
    "chars": 19782,
    "preview": "# 创建插件\n\n插件是一个包含一些可执行脚本的 Git 存储库,用于支持对某种语言/工具进行版本控制。这些脚本由 asdf 通过命令运行,以支持诸如 `asdf list-all <name>`、`asdf install <name> <"
  },
  {
    "path": "go.mod",
    "chars": 2443,
    "preview": "module github.com/asdf-vm/asdf\n\ngo 1.24.9\n\nrequire (\n\tgithub.com/go-git/go-git/v5 v5.16.5\n\tgithub.com/mgechev/revive v1."
  },
  {
    "path": "go.sum",
    "chars": 14556,
    "preview": "dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=\ndario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobSt"
  },
  {
    "path": "help.txt",
    "chars": 4224,
    "preview": "MANAGE PLUGINS\nasdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,\n                           "
  },
  {
    "path": "internal/cli/cli.go",
    "chars": 41112,
    "preview": "// Package cli contains the asdf CLI command code\npackage cli\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"log"
  },
  {
    "path": "internal/cli/set/set.go",
    "chars": 3255,
    "preview": "// Package set provides the 'asdf set' command\npackage set\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"str"
  },
  {
    "path": "internal/cli/set/set_test.go",
    "chars": 3954,
    "preview": "package set\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestAl"
  },
  {
    "path": "internal/completions/asdf.bash",
    "chars": 4268,
    "preview": "_asdf_list_shims() (\n  # this function runs in a subshell so shopt is scoped\n  shopt -s nullglob # globs that don't matc"
  },
  {
    "path": "internal/completions/asdf.elvish",
    "chars": 5216,
    "preview": "# Setup argument completions\nfn arg-completer {|@argz|\n  set argz = $argz[1..-1]  # strip 'asdf' and trailing empty stri"
  },
  {
    "path": "internal/completions/asdf.fish",
    "chars": 7189,
    "preview": "set -x asdf_data_dir (\n  if test -n \"$ASDF_DATA_DIR\"; echo $ASDF_DATA_DIR;\n  else; echo $HOME/.asdf; end)\n\nfunction __fi"
  },
  {
    "path": "internal/completions/asdf.nushell",
    "chars": 8218,
    "preview": "module asdf {\n\n    def \"complete asdf sub-commands\" [] {\n        [\n            \"plugin\",\n            \"list\",\n           "
  },
  {
    "path": "internal/completions/asdf.zsh",
    "chars": 11635,
    "preview": "#compdef asdf\n#description tool to manage versions of multiple runtimes\n\n# Initialize local variables for ZSH completion"
  },
  {
    "path": "internal/completions/completions.go",
    "chars": 918,
    "preview": "// Package completions handles shell completion files.\n//\n// To add completion support for a shell, simply add a file na"
  },
  {
    "path": "internal/completions/completions_test.go",
    "chars": 708,
    "preview": "package completions\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestGet(t *testing.T) {\n\tt.Run(\""
  },
  {
    "path": "internal/config/config.go",
    "chars": 7504,
    "preview": "// Package config provides a unified API for fetching asdf config. Either from\n// the asdfrc file or environment variabl"
  },
  {
    "path": "internal/config/config_test.go",
    "chars": 7474,
    "preview": "package config\n\nimport (\n\t\"os\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfun"
  },
  {
    "path": "internal/config/testdata/asdfrc",
    "chars": 497,
    "preview": "# This is a test asdfrc file containing all possible values. Each field to set\n# to a value that is different than the d"
  },
  {
    "path": "internal/config/testdata/empty-asdfrc",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "internal/data/data.go",
    "chars": 1110,
    "preview": "// Package data provides constants and functions pertaining to directories and\n// files in the asdf data directory on di"
  },
  {
    "path": "internal/data/data_test.go",
    "chars": 374,
    "preview": "package data\n\nimport \"testing\"\n\nconst testPluginName = \"lua\"\n\nfunc TestPluginDirectory(t *testing.T) {\n\tt.Run(\"returns n"
  },
  {
    "path": "internal/exec/exec.go",
    "chars": 349,
    "preview": "// Package exec handles replacing the asdf go process with\npackage exec\n\nimport (\n\t\"syscall\"\n)\n\n// Exec invokes syscall."
  },
  {
    "path": "internal/exec/exec_test.go",
    "chars": 514,
    "preview": "package exec\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"testing\"\n\n\t\"github.com/rogpeppe/go-internal/testscript\"\n)\n\nfunc execit("
  },
  {
    "path": "internal/exec/testdata/script/exec-env.txtar",
    "chars": 64,
    "preview": "env ENV=foo\nexecit echo this is a $ENV\nstdout 'this is a foo\\n'\n"
  },
  {
    "path": "internal/exec/testdata/script/exec-simple.txtar",
    "chars": 53,
    "preview": "execit echo this is a test\nstdout 'this is a test\\n'\n"
  },
  {
    "path": "internal/execenv/execenv.go",
    "chars": 1282,
    "preview": "// Package execenv contains logic for generating execution environing using a plugin's\n// exec-env callback script if av"
  },
  {
    "path": "internal/execenv/execenv_test.go",
    "chars": 3348,
    "preview": "package execenv\n\nimport (\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config\"\n\t\"github.com/asdf-vm/asdf/internal/plug"
  },
  {
    "path": "internal/execute/execute.go",
    "chars": 3001,
    "preview": "// Package execute is a simple package that wraps the os/exec Command features\n// for convenient use in asdf. It was ins"
  },
  {
    "path": "internal/execute/execute_test.go",
    "chars": 7489,
    "preview": "package execute\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc T"
  },
  {
    "path": "internal/execute/testdata/script",
    "chars": 29,
    "preview": "#!/usr/bin/env bash\n\necho $@\n"
  },
  {
    "path": "internal/git/git.go",
    "chars": 5041,
    "preview": "// Package git contains all the Git operations that can be applied to asdf\n// Git repositories like the plugin index rep"
  },
  {
    "path": "internal/git/git_test.go",
    "chars": 7028,
    "preview": "package git\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/repotest\"\n\t\"github.com/go-gi"
  },
  {
    "path": "internal/help/help.go",
    "chars": 4119,
    "preview": "// Package help contains functions responsible for generating help output for\n// asdf and asdf plugins.\npackage help\n\nim"
  },
  {
    "path": "internal/help/help.txt",
    "chars": 3685,
    "preview": "MANAGE PLUGINS\nasdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,\n                           "
  },
  {
    "path": "internal/help/help_test.go",
    "chars": 4802,
    "preview": "package help\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config\"\n\t"
  },
  {
    "path": "internal/hook/hook.go",
    "chars": 990,
    "preview": "// Package hook provides a simple interface for running hook commands that may\n// be defined in the asdfrc file\npackage "
  },
  {
    "path": "internal/hook/hook_test.go",
    "chars": 1225,
    "preview": "package hook\n\nimport (\n\t\"os/exec\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config\"\n\t\"github.com/stretchr/testify/a"
  },
  {
    "path": "internal/hook/testdata/asdfrc",
    "chars": 321,
    "preview": "# This is a test asdfrc file containing all possible values. Each field to set\n# to a value that is different than the d"
  },
  {
    "path": "internal/info/info.go",
    "chars": 1966,
    "preview": "// Package info exists to print important info about this asdf installation to STDOUT for use in debugging and bug repor"
  },
  {
    "path": "internal/info/info_test.go",
    "chars": 855,
    "preview": "package info\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config\"\n\t\"github"
  },
  {
    "path": "internal/installs/installs.go",
    "chars": 2010,
    "preview": "// Package installs contains tool installation logic. It is \"dumb\" when it comes\n// to versions and treats versions as o"
  },
  {
    "path": "internal/installs/installs_test.go",
    "chars": 3378,
    "preview": "package installs\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config\"\n\t\"github.com/as"
  },
  {
    "path": "internal/installtest/installtest.go",
    "chars": 2496,
    "preview": "// Package installtest provides functions used by various asdf tests for\n// installing versions of tools. It provides a "
  },
  {
    "path": "internal/paths/paths.go",
    "chars": 529,
    "preview": "// Package paths contains a variety of helper functions responsible for\n// computing paths to various things. This packa"
  },
  {
    "path": "internal/paths/paths_test.go",
    "chars": 782,
    "preview": "package paths\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestRemoveFromPath(t *testing.T) {\n\tt."
  },
  {
    "path": "internal/pluginindex/pluginindex.go",
    "chars": 4677,
    "preview": "// Package pluginindex is a package that handles fetching plugin repo URLs by\n// name for user convenience.\npackage plug"
  },
  {
    "path": "internal/pluginindex/pluginindex_test.go",
    "chars": 7139,
    "preview": "package pluginindex\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/asdf-vm/asdf/inte"
  },
  {
    "path": "internal/plugins/plugins.go",
    "chars": 13722,
    "preview": "// Package plugins provides functions for interacting with asdf plugins\npackage plugins\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\""
  },
  {
    "path": "internal/plugins/plugins_test.go",
    "chars": 18906,
    "preview": "package plugins\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config"
  },
  {
    "path": "internal/repotest/repotest.go",
    "chars": 6214,
    "preview": "// Package repotest contains various test helpers for tests that work with code\n// relying on plugin Git repos and the a"
  },
  {
    "path": "internal/resolve/resolve.go",
    "chars": 4133,
    "preview": "// Package resolve contains functions for resolving a tool version in a given\n// directory. This is a core feature of as"
  },
  {
    "path": "internal/resolve/resolve_test.go",
    "chars": 8630,
    "preview": "package resolve\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/config"
  },
  {
    "path": "internal/resolve/testdata/asdfrc",
    "chars": 26,
    "preview": "legacy_version_file = yes\n"
  },
  {
    "path": "internal/shims/shims.go",
    "chars": 13575,
    "preview": "// Package shims manages writing and parsing of asdf shim scripts.\npackage shims\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"os\"\n\t"
  },
  {
    "path": "internal/shims/shims_test.go",
    "chars": 20933,
    "preview": "package shims\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/interna"
  },
  {
    "path": "internal/shims/testdata/asdfrc",
    "chars": 84,
    "preview": "pre_asdf_reshim_lua = echo pre_reshim $@\npost_asdf_reshim_lua = echo post_reshim $@\n"
  },
  {
    "path": "internal/toolversions/toolversions.go",
    "chars": 8033,
    "preview": "// Package toolversions handles reading and writing tools and versions from\n// asdf's .tool-versions files. It also hand"
  },
  {
    "path": "internal/toolversions/toolversions_test.go",
    "chars": 13818,
    "preview": "package toolversions\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestGetA"
  },
  {
    "path": "internal/versions/testdata/asdfrc",
    "chars": 199,
    "preview": "pre_asdf_download_testlua = echo pre_asdf_download_lua $@\npre_asdf_install_testlua = echo pre_asdf_install_lua $@\npost_a"
  },
  {
    "path": "internal/versions/testdata/list-all-elixir",
    "chars": 6456,
    "preview": "0.12.4 0.12.5 0.13.0 0.13.1 0.13.2 0.13.3 0.14.0 0.14.1 0.14.2 0.14.3 0.15.0 0.15.1 1.0.0 1.0.0-otp-17 1.0.0-rc1 1.0.0-r"
  },
  {
    "path": "internal/versions/testdata/list-all-python",
    "chars": 13777,
    "preview": "2.1.3 2.2.3 2.3.7 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5.0 2.5.1 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.6.0 2.6.1 2.6.2 "
  },
  {
    "path": "internal/versions/testdata/list-all-ruby",
    "chars": 7407,
    "preview": "1.8.5-p52 1.8.5-p113 1.8.5-p114 1.8.5-p115 1.8.5-p231 1.8.6 1.8.6-p36 1.8.6-p110 1.8.6-p111 1.8.6-p114 1.8.6-p230 1.8.6-"
  },
  {
    "path": "internal/versions/testdata/uninstall-asdfrc",
    "chars": 138,
    "preview": "pre_asdf_uninstall_uninstall-test = echo pre_asdf_uninstall_test $@\npost_asdf_uninstall_uninstall-test = echo post_asdf_"
  },
  {
    "path": "internal/versions/versions.go",
    "chars": 11176,
    "preview": "// Package versions handles all operations pertaining to specific versions.\n// Install, uninstall, etc...\npackage versio"
  },
  {
    "path": "internal/versions/versions_test.go",
    "chars": 19997,
    "preview": "package versions\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/asdf-vm/asdf/internal/confi"
  }
]

// ... and 99 more files (download for full content)

About this extraction

This page contains the full source code of the asdf-vm/asdf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 299 files (1.1 MB), approximately 383.1k tokens, and a symbol index with 415 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!