Full Code of ko-build/ko for AI

main 757161aaa19e cached
186 files
594.7 KB
182.6k tokens
537 symbols
1 requests
Download .txt
Showing preview only (639K chars total). Download the full file or copy to clipboard to get everything.
Repository: ko-build/ko
Branch: main
Commit: 757161aaa19e
Files: 186
Total size: 594.7 KB

Directory structure:
gitextract_aa0jajfb/

├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── analyze.yaml
│       ├── boilerplate.yaml
│       ├── build.yaml
│       ├── donotsubmit.yaml
│       ├── e2e.yaml
│       ├── image.yaml
│       ├── kind-e2e.yaml
│       ├── modules-integration-test.yaml
│       ├── publish-site.yaml
│       ├── registries.yaml
│       ├── release.yml
│       ├── sbom.yaml
│       ├── stale.yaml
│       ├── style.yaml
│       ├── test.yaml
│       └── verify.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yml
├── .ko.yaml
├── .wokeignore
├── CNAME
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── ROADMAP.md
├── cmd/
│   └── help/
│       └── main.go
├── code-of-conduct.md
├── docs/
│   ├── CNAME
│   ├── README.md
│   ├── advanced/
│   │   ├── faq.md
│   │   ├── go-packages.md
│   │   ├── lambda.md
│   │   ├── limitations.md
│   │   ├── linux-capabilities.md
│   │   ├── migrating-from-dockerfile.md
│   │   ├── root-ca-certificates.md
│   │   └── terraform.md
│   ├── community.md
│   ├── configuration.md
│   ├── custom/
│   │   ├── main.html
│   │   └── partials/
│   │       └── copyright.html
│   ├── deployment.md
│   ├── features/
│   │   ├── build-cache.md
│   │   ├── debugging.md
│   │   ├── k8s.md
│   │   ├── multi-platform.md
│   │   ├── sboms.md
│   │   └── static-assets.md
│   ├── get-started.md
│   ├── index.md
│   ├── install.md
│   └── reference/
│       ├── ko.md
│       ├── ko_apply.md
│       ├── ko_build.md
│       ├── ko_create.md
│       ├── ko_delete.md
│       ├── ko_login.md
│       ├── ko_resolve.md
│       ├── ko_run.md
│       └── ko_version.md
├── go.mod
├── go.sum
├── hack/
│   ├── boilerplate/
│   │   ├── boilerplate.go.txt
│   │   └── boilerplate.sh.txt
│   ├── presubmit.sh
│   ├── tools.go
│   ├── update-codegen.sh
│   └── update-deps.sh
├── integration_test.sh
├── internal/
│   └── sbom/
│       ├── sbom.go
│       └── spdx.go
├── main.go
├── mkdocs.yml
├── pkg/
│   ├── build/
│   │   ├── build.go
│   │   ├── cache.go
│   │   ├── config.go
│   │   ├── doc.go
│   │   ├── future.go
│   │   ├── future_test.go
│   │   ├── gobuild.go
│   │   ├── gobuild_test.go
│   │   ├── gobuilds.go
│   │   ├── gobuilds_test.go
│   │   ├── layer.go
│   │   ├── limit.go
│   │   ├── limit_test.go
│   │   ├── options.go
│   │   ├── recorder.go
│   │   ├── recorder_test.go
│   │   ├── shared.go
│   │   ├── shared_test.go
│   │   ├── strict.go
│   │   └── strict_test.go
│   ├── caps/
│   │   ├── caps.go
│   │   ├── caps_dd_test.go
│   │   ├── caps_test.go
│   │   ├── gen.sh
│   │   └── new_file_caps_test.go
│   ├── commands/
│   │   ├── apply.go
│   │   ├── build.go
│   │   ├── cache.go
│   │   ├── commands.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── create.go
│   │   ├── delete.go
│   │   ├── options/
│   │   │   ├── build.go
│   │   │   ├── build_test.go
│   │   │   ├── filestuff.go
│   │   │   ├── namer_test.go
│   │   │   ├── publish.go
│   │   │   ├── selector.go
│   │   │   ├── testdata/
│   │   │   │   ├── bad-config/
│   │   │   │   │   └── .ko.yaml/
│   │   │   │   │       └── .gitignore
│   │   │   │   ├── config/
│   │   │   │   │   ├── .ko.yaml
│   │   │   │   │   └── my-ko.yaml
│   │   │   │   ├── multiple-platforms/
│   │   │   │   │   └── .ko.yaml
│   │   │   │   └── paths/
│   │   │   │       ├── .ko.yaml
│   │   │   │       └── app/
│   │   │   │           ├── cmd/
│   │   │   │           │   └── foo/
│   │   │   │           │       └── main.go
│   │   │   │           └── go.mod
│   │   │   └── validate.go
│   │   ├── publisher.go
│   │   ├── publisher_test.go
│   │   ├── resolve.go
│   │   ├── resolver.go
│   │   ├── resolver_test.go
│   │   ├── root.go
│   │   ├── run.go
│   │   └── version.go
│   ├── doc.go
│   ├── internal/
│   │   ├── git/
│   │   │   ├── clone.go
│   │   │   ├── errors.go
│   │   │   ├── git.go
│   │   │   ├── info.go
│   │   │   └── info_test.go
│   │   ├── gittesting/
│   │   │   ├── git.go
│   │   │   └── git_test.go
│   │   └── testing/
│   │       ├── daemon.go
│   │       ├── doc.go
│   │       ├── fixed.go
│   │       └── fixed_test.go
│   ├── publish/
│   │   ├── daemon.go
│   │   ├── daemon_test.go
│   │   ├── default.go
│   │   ├── default_test.go
│   │   ├── doc.go
│   │   ├── future.go
│   │   ├── future_test.go
│   │   ├── kind/
│   │   │   ├── doc.go
│   │   │   ├── write.go
│   │   │   └── write_test.go
│   │   ├── kind.go
│   │   ├── layout.go
│   │   ├── layout_test.go
│   │   ├── multi.go
│   │   ├── multi_test.go
│   │   ├── options.go
│   │   ├── publish.go
│   │   ├── recorder.go
│   │   ├── recorder_test.go
│   │   ├── shared.go
│   │   ├── shared_test.go
│   │   ├── tarball.go
│   │   └── tarball_test.go
│   └── resolve/
│       ├── doc.go
│       ├── resolve.go
│       ├── resolve_test.go
│       ├── selector.go
│       └── selector_test.go
└── test/
    ├── build-configs/
    │   ├── .ko.yaml
    │   ├── bar/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   ├── caps/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   ├── caps.ko.yaml
    │   ├── foo/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   └── toolexec/
    │       ├── cmd/
    │       │   └── main.go
    │       └── go.mod
    ├── kodata/
    │   ├── a
    │   ├── kenobi
    │   └── subdir/
    │       └── file.txt
    ├── main.go
    └── test.yaml

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

================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "daily"
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: "daily"


================================================
FILE: .github/workflows/analyze.yaml
================================================
name: Analyze

on:
  workflow_dispatch:
  push:
    branches: ['main']
  pull_request:
    branches: ['main']

permissions: {}

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest

    permissions:
      security-events: write

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        # We must fetch at least the immediate parents so that if this is
        # a pull request then we can checkout the head.
        fetch-depth: 2
        persist-credentials: false

    - uses: github/codeql-action/init@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9
      with:
        languages: go

    - uses: github/codeql-action/autobuild@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9

    - uses: github/codeql-action/analyze@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9


================================================
FILE: .github/workflows/boilerplate.yaml
================================================
name: Boilerplate

on:
  pull_request:
    branches: ['main']

permissions: {}

jobs:
  check:
    name: Boilerplate Check
    runs-on: ubuntu-latest

    permissions:
      contents: read

    strategy:
      fail-fast: false # Keep running if one leg fails.
      matrix:
        extension:
        - go
        - sh

        # Map between extension and human-readable name.
        include:
        - extension: go
          language: Go
        - extension: sh
          language: Bash

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: chainguard-dev/actions/boilerplate@e82b4e5ae10182af72972addcb3fedf7454621c8 # main
        with:
          extension: ${{ matrix.extension }}
          language: ${{ matrix.language }}


================================================
FILE: .github/workflows/build.yaml
================================================
name: Build

on:
  pull_request:
    branches:
      - "main"

permissions: {}

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version: "1.24"
          check-latest: true

      - uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4
        with:
          go-version-input: "1.25"

      - run: |
          go build ./...
          go test -run=^$ ./...


================================================
FILE: .github/workflows/donotsubmit.yaml
================================================
name: Do Not Submit

on:
  pull_request:
    branches: ['main']

permissions: {}

jobs:
  donotsubmit:
    name: Do Not Submit
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        persist-credentials: false

    - uses: chainguard-dev/actions/donotsubmit@84c993eaf02da1c325854fb272a4df9184bd80fc # main


================================================
FILE: .github/workflows/e2e.yaml
================================================
name: Basic e2e test

on:
  pull_request:
    branches:
      - 'main'

permissions: {}

jobs:
  e2e:
    strategy:
      fail-fast: false
      matrix:
        platform:
        - ubuntu-latest
        - windows-latest

    name: e2e ${{ matrix.platform }}
    runs-on: ${{ matrix.platform }}

    permissions:
      contents: read

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        persist-credentials: false

    - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
      with:
        go-version-file: 'go.mod'
        check-latest: true

    - name: Build and run ko container
      env:
        KO_DOCKER_REPO: ko.local
      shell: bash
      run: |
        set -o errexit
        set -o nounset
        set -o pipefail
        set -x

        # Check that building without push prints the tag (and sha)
        KO_DOCKER_REPO="" go run ./ build --push=false ./test | grep ":latest@sha256:"
        KO_DOCKER_REPO="" go run ./ build --push=false -t test ./test | grep ":test@sha256:"
        KO_DOCKER_REPO="" go run ./ build --push=false -t test --tag-only ./test | grep ":test$"

        # Check that using sbom-dir works.
        KO_DOCKER_REPO=""  go run ./ build -t test --push=false --sbom-dir ./sbom-data ./test
        jq . ./sbom-data/test-linux-amd64.spdx.json

        # Check that using sbom-dir works for multi-arch
        KO_DOCKER_REPO=""  go run ./ build --platform=linux/amd64,linux/arm64 -t test --push=false --sbom-dir ./sbom-data2 ./test
        jq . ./sbom-data2/test-index.spdx.json
        jq . ./sbom-data2/test-linux-amd64.spdx.json
        jq . ./sbom-data2/test-linux-arm64.spdx.json

        export PLATFORM=$(go env GOOS)/$(go env GOARCH)

        if [[ "${{ matrix.platform }}" == "windows-latest" ]]; then
          OSVERSION="10.0.20348"
          PLATFORM=${PLATFORM}:${OSVERSION}
          export KO_DEFAULTBASEIMAGE=mcr.microsoft.com/windows/nanoserver:ltsc2022
        else
          # Explicitly test multiple platform builds (a subset of what's in the base!)
          export PLATFORM=${PLATFORM},linux/arm64
        fi

        echo platform is ${PLATFORM}
        # Build and run the ko binary, which should be runnable.
        docker run $(go run ./ build ./ --platform=${PLATFORM} --preserve-import-paths) version

        # Build and run the test/ binary, which should log "Hello there" served from KO_DATA_PATH
        testimg=$(go run ./ build ./test --platform=${PLATFORM} --preserve-import-paths)
        docker run ${testimg} --wait=false 2>&1 | tee >(grep "Hello there") # Log all output too.

        # Check that symlinks in kodata are chased.
        # Skip this test on Windows.
        if [[ "$RUNNER_OS" == "Linux" ]]; then
          docker run ${testimg} --wait=false -f b
        fi

        # Check that using ldflags to set variables works.
        cat > .ko.yaml << EOF
        builds:
        - id: test
          main: ./test/
          ldflags:
          - "-X main.version=${{ github.sha }}"
        EOF
        docker run $(go run ./ build ./test/ --platform=${PLATFORM}) --wait=false 2>&1 | grep "${{ github.sha }}"

        # TODO: check why it is failing when building for windows
        if [[ "${{ matrix.platform }}" != "windows-latest" ]]; then
          # Check that --debug adds dlv to the image, and that dlv is runnable.
          docker run --entrypoint="dlv" $(go run ./ build ./test/ --platform=${PLATFORM} --debug) version | grep "Delve Debugger"
        fi


================================================
FILE: .github/workflows/image.yaml
================================================
name: image

on:
  push:
    branches:
      - 'main'
  workflow_dispatch:

permissions: {}

jobs:
  image:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      packages: write
      id-token: write

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true
      - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

      # Build ko from HEAD, build and push an image tagged with the commit SHA,
      # then keylessly sign it with cosign.
      - name: Publish and sign image
        env:
          KO_DOCKER_REPO: ghcr.io/${{ github.repository }}
        run: |
          go build ./
          echo "${{ github.token }}" | ./ko login ghcr.io --username "${{ github.actor }}" --password-stdin
          img=$(./ko build --bare --platform=all -t latest -t ${{ github.sha }} ./)
          echo "built ${img}"
          cosign sign ${img} --yes \
              -a sha=${{ github.sha }} \
              -a run_id=${{ github.run_id }} \
              -a run_attempt=${{ github.run_attempt }}


================================================
FILE: .github/workflows/kind-e2e.yaml
================================================
name: KinD e2e tests

on:
  workflow_dispatch:  # Allow manual runs.
  pull_request:
    branches:
      - 'main'

permissions: {}

jobs:
  e2e-tests:
    name: e2e tests
    runs-on: ubuntu-latest
    env:
      # https://github.com/google/go-containerregistry/pull/125 allows insecure registry for
      # '*.local' hostnames. This works both for `ko` and our own tag-to-digest resolution logic,
      # thus allowing us to test without bypassing tag-to-digest resolution.
      REGISTRY_NAME: registry.local
      REGISTRY_PORT: 5000
      KO_DOCKER_REPO: registry.local:5000/ko

    permissions:
      contents: read

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        persist-credentials: false

    - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
      with:
        go-version-file: 'go.mod'
        check-latest: true

    - name: Install ko
      run: go install ./

    - name: Setup Cluster
      uses: chainguard-dev/actions/setup-kind@29fb6e979a0b3efc79748a17e8cec08d0594cbfd # main
      with:
        k8s-version: v1.28.x
        registry-authority: ${{ env.REGISTRY_NAME }}:${{ env.REGISTRY_PORT }}

    - name: Install Cosign
      uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

    - name: Run Smoke Test
      run: |
        # Test with kind load
        KO_DOCKER_REPO=kind.local ko apply --platform=all -f ./test
        kubectl wait --timeout=10s --for=condition=Ready pod/kodata
        kubectl delete pod kodata

        # Test with registry
        ko apply --platform=all -f ./test
        kubectl wait --timeout=60s --for=condition=Ready pod/kodata
        kubectl delete pod kodata

        # Test ko run with kind load
        # This tests that --labels are passed to kubectl, and -wait is passed to the test binary.
        KO_DOCKER_REPO=kind.local ko run ./test -- --labels=foo=bar -- -wait=false

    - name: Check SBOM
      run: |
        set -o pipefail

        echo '::group:: SBOM'
        cosign download sbom $(ko build ./test)
        echo "${SBOM}"
        echo '::endgroup::'

    - name: Collect diagnostics and upload
      if: ${{ failure() }}
      uses: chainguard-dev/actions/kind-diag@29fb6e979a0b3efc79748a17e8cec08d0594cbfd # main


================================================
FILE: .github/workflows/modules-integration-test.yaml
================================================
name: Integration Test

on:
  pull_request:
    branches:
      - 'main'

permissions: {}

jobs:
  test:
    name: Module Tests
    runs-on: 'ubuntu-latest'

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version: '1.24'
          check-latest: true

      - env:
          GOPATH: does not matter
        run: ./integration_test.sh


================================================
FILE: .github/workflows/publish-site.yaml
================================================
name: publish
on:
  workflow_dispatch:
  push:
    branches:
      - 'main'

permissions: {}

jobs:
  publish:
    runs-on: ubuntu-latest

    permissions:
      contents: write
      pages: write

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
        with:
          python-version: 3.x
      - run: pip install mkdocs-material mkdocs-redirects
      - run: mkdocs gh-deploy --force


================================================
FILE: .github/workflows/registries.yaml
================================================
name: Push to registries

on:
  push:
    branches:
      - 'main'

  workflow_dispatch:  # Allow manual runs.

permissions: {}

jobs:
  quay:
    name: Push to quay.io
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        persist-credentials: false

    - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
      with:
        go-version-file: 'go.mod'
        check-latest: true

    - env:
        QUAY_USERNAME: ko-testing+test
        QUAY_PASSWORD: ${{ secrets.QUAY_PASSWORD }}
        KO_DOCKER_REPO: quay.io/ko-testing/test
      run: |
        echo ${QUAY_PASSWORD} | go run ./ login --username=${QUAY_USERNAME} --password-stdin quay.io
        go run ./ build --platform=all ./test/ --sbom=none --bare

  dockerhub:
    name: Push to dockerhub
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
    - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      with:
        persist-credentials: false

    - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
      with:
        go-version-file: 'go.mod'
        check-latest: true

    - env:
        DOCKERHUB_USERNAME: kotesting
        DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
        KO_DOCKER_REPO: kotesting/test
      run: |
        echo ${DOCKERHUB_PASSWORD} | go run ./ login --username=${DOCKERHUB_USERNAME} --password-stdin index.docker.io
        go run ./ build --platform=all ./test/ --bare

  ecr:
    name: Push to ECR
    runs-on: ubuntu-latest
    env:
      # This is an AWS account that Chainguard provides to enable
      # go-containerregistry and ko to test ECR support.
      AWS_ACCOUNT: 479305788615
      AWS_REGION: us-west-2
      REPOSITORY: ko-ecr-e2e-testing

    permissions:
      # This lets us clone the repo
      contents: read
      # This lets us mint identity tokens for federation with AWS.
      id-token: write

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - name: Install ko
        run: go install .

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
        with:
          role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT }}:role/federated-ecr-readwrite
          aws-region: ${{ env.AWS_REGION }}

      - name: Test ko build
        run: |
          export KO_DOCKER_REPO=${{ env.AWS_ACCOUNT }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.REPOSITORY }}

          ko build --bare ./test


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

on:
  push:
    tags:
      - '*'

permissions: {}

jobs:
  goreleaser:
    outputs:
      hashes: ${{ steps.hash.outputs.hashes }}
      tag_name: ${{ steps.tag.outputs.tag_name }}

    permissions:
      packages: write
      id-token: write
      contents: write

    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - run: git fetch --prune --unshallow

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      # This installs the current latest release. We have to manually bump this.
      - uses: ko-build/setup-ko@3aebd0597dc1e9d1a26bcfdb7cbeb19c131d3037 # v0.7
        with:
          version: v0.18.0 # DO NOT REMOVE THIS OR IT WILL CREATE A CYCLE.

      - uses: imjasonh/setup-crane@31b88efe9de28ae0ffa220711af4b60be9435f6e # v0.4

      - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

      - name: Set tag output
        id: tag
        run: echo "tag_name=${GITHUB_REF#refs/*/}" >> "$GITHUB_OUTPUT"

      - uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0
        id: run-goreleaser
        with:
          version: latest
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: sign ko-image
        run: |
          digest=$(crane digest "${REGISTRY}":"${GIT_TAG}")
          cosign sign --yes \
              -a GIT_HASH="${GIT_HASH}" \
              -a GIT_TAG="${GIT_TAG}" \
              -a RUN_ID="${RUN_ID}" \
              -a RUN_ATTEMPT="${RUN_ATTEMPT}" \
              "${REGISTRY}@${digest}"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GIT_HASH: ${{ github.sha }}
          GIT_TAG: ${{ steps.tag.outputs.tag_name }}
          RUN_ATTEMPT: ${{ github.run_attempt }}
          RUN_ID: ${{ github.run_id }}
          REGISTRY: "ghcr.io/${{ github.repository }}"

      - name: Generate subject
        id: hash
        env:
          ARTIFACTS: "${{ steps.run-goreleaser.outputs.artifacts }}"
        run: |
          set -euo pipefail

          checksum_file=$(echo "$ARTIFACTS" | jq -r '.[] | select (.type=="Checksum") | .path')
          echo "hashes=$(cat $checksum_file | base64 -w0)" >> "$GITHUB_OUTPUT"

  provenance:
    needs:
      - goreleaser

    permissions:
      actions: read   # To read the workflow path.
      id-token: write # To sign the provenance.
      contents: write # To add assets to a release.

    uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
    with:
      base64-subjects: "${{ needs.goreleaser.outputs.hashes }}"
      upload-assets: true
      upload-tag-name: "${{ needs.goreleaser.outputs.tag_name }}"

  verification:
    needs:
      - goreleaser
      - provenance

    runs-on: ubuntu-latest
    permissions: read-all

    steps:
      # Note: this will be replaced with the GHA in the future.
      - name: Install the verifier
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          set -euo pipefail

          gh -R slsa-framework/slsa-verifier release download v1.3.2 -p "slsa-verifier-linux-amd64"
          chmod ug+x slsa-verifier-linux-amd64
          # Note: see https://github.com/slsa-framework/slsa-verifier/blob/main/SHA256SUM.md
          COMPUTED_HASH=$(sha256sum slsa-verifier-linux-amd64 | cut -d ' ' -f1)
          EXPECTED_HASH="b1d6c9bbce6274e253f0be33158cacd7fb894c5ebd643f14a911bfe55574f4c0"
          if [[ "$EXPECTED_HASH" != "$COMPUTED_HASH" ]];then
              echo "error: expected $EXPECTED_HASH, computed $COMPUTED_HASH"
              exit 1
          fi

      - name: Download assets
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PROVENANCE: "${{ needs.provenance.outputs.provenance-name }}"
        run: |
          set -euo pipefail

          gh -R "$GITHUB_REPOSITORY" release download "$GITHUB_REF_NAME" -p "*.tar.gz"
          gh -R "$GITHUB_REPOSITORY" release download "$GITHUB_REF_NAME" -p "$PROVENANCE"

      - name: Verify assets
        env:
          CHECKSUMS: ${{ needs.goreleaser.outputs.hashes }}
          PROVENANCE: "${{ needs.provenance.outputs.provenance-name }}"
        run: |
          set -euo pipefail

          checksums=$(echo "$CHECKSUMS" | base64 -d)
          while read -r line; do
              fn=$(echo $line | cut -d ' ' -f2)

              echo "Verifying $fn"
              ./slsa-verifier-linux-amd64 -artifact-path "$fn" \
                                      -provenance "$PROVENANCE" \
                                      -source "github.com/$GITHUB_REPOSITORY" \
                                      -tag "$GITHUB_REF_NAME"

          done <<<"$checksums"


================================================
FILE: .github/workflows/sbom.yaml
================================================
name: Validate SBOMs

on:
  pull_request:
    branches:
      - 'main'

env:
  SPDX_TOOLS_VERSION: 1.1.0

permissions: {}

jobs:
  spdx:
    name: Validate SPDX SBOM
    runs-on: ubuntu-latest

    permissions:
      contents: read

    env:
      KO_DOCKER_REPO: localhost:1338

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - uses: chainguard-dev/actions/setup-registry@main
      - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

      - name: Install SPDX Tools
        run: |
          wget https://github.com/spdx/tools-java/releases/download/v${SPDX_TOOLS_VERSION}/tools-java-${SPDX_TOOLS_VERSION}.zip
          unzip tools-java-${SPDX_TOOLS_VERSION}.zip

      - name: Generate and Validate
        run: |
          cosign download sbom $(go run ./ build) | tee spdx.json
          java -jar ./tools-java-${SPDX_TOOLS_VERSION}-jar-with-dependencies.jar Verify spdx.json

      - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
        if: ${{ always() }}
        with:
          name: spdx.json
          path: spdx.json

  spdx-multi-arch:
    name: Validate SPDX multi-arch SBOM
    runs-on: ubuntu-latest

    env:
      KO_DOCKER_REPO: localhost:1338

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true
      - uses: chainguard-dev/actions/setup-registry@main
      - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0

      - name: Install SPDX Tools
        run: |
          wget https://github.com/spdx/tools-java/releases/download/v${SPDX_TOOLS_VERSION}/tools-java-${SPDX_TOOLS_VERSION}.zip
          unzip tools-java-${SPDX_TOOLS_VERSION}.zip

      - name: Generate and Validate
        run: |
          img=$(go run ./ build --platform=linux/amd64,linux/arm64)
          cosign download sbom $img | tee spdx-multi-arch.json

          java -jar ./tools-java-${SPDX_TOOLS_VERSION}-jar-with-dependencies.jar Verify spdx-multi-arch.json

      - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
        if: ${{ always() }}
        with:
          name: spdx-multi-arch.json
          path: spdx-multi-arch.json


================================================
FILE: .github/workflows/stale.yaml
================================================
name: 'Close stale'

on:
  schedule:
  - cron: '0 1 * * *'

permissions: {}

jobs:
  stale:
    runs-on: 'ubuntu-latest'

    permissions:
      issues: write
      pull-requests: write

    steps:
    - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
      with:
        repo-token: ${{ secrets.GITHUB_TOKEN }}

        stale-issue-message: |-
          This issue is stale because it has been open for 90 days with no
          activity. It will automatically close after 30 more days of
          inactivity. Keep fresh with the 'lifecycle/frozen' label.
        stale-issue-label: 'lifecycle/stale'
        exempt-issue-labels: 'lifecycle/frozen'

        stale-pr-message: |-
          This Pull Request is stale because it has been open for 90 days with
          no activity. It will automatically close after 30 more days of
          inactivity. Keep fresh with the 'lifecycle/frozen' label.
        stale-pr-label: 'lifecycle/stale'
        exempt-pr-labels: 'lifecycle/frozen'

        days-before-stale: 90
        days-before-close: 30


================================================
FILE: .github/workflows/style.yaml
================================================
name: Code Style

on:
  pull_request:
    branches:
      - 'main'

permissions: {}

jobs:
  gofmt:
    name: check gofmt
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - uses: chainguard-dev/actions/gofmt@d886686603afb809f7ef9b734b333e20b7ce5cda
        with:
          args: -s

  goimports:
    name: check goimports
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - uses: chainguard-dev/actions/goimports@d886686603afb809f7ef9b734b333e20b7ce5cda

  lint:
    name: Lint
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - name: Check out code
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - name: Set up Go
        uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - uses: chainguard-dev/actions/trailing-space@d886686603afb809f7ef9b734b333e20b7ce5cda
        if: ${{ always() }}

      - uses: chainguard-dev/actions/eof-newline@d886686603afb809f7ef9b734b333e20b7ce5cda
        if: ${{ always() }}

      - uses: reviewdog/action-misspell@18ffb61effb93b47e332f185216be7e49592e7e1 # v1.26.1
        if: ${{ always() }}
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          fail_level: warning
          locale: "US"
          exclude: |
            ./.golangci.yaml

      - uses: get-woke/woke-action-reviewdog@d71fd0115146a01c3181439ce714e21a69d75e31 # v0
        if: ${{ always() }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          reporter: github-pr-check
          level: error
          fail-on-error: true


================================================
FILE: .github/workflows/test.yaml
================================================
name: Test

on:
  push:
    branches:
      - 'main'
  pull_request:
    branches:
      - 'main'

permissions: {}

jobs:

  test:
    name: Unit Tests
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: 'go.mod'
          check-latest: true

      - run: go test -coverprofile=coverage.txt -covermode=atomic -race ./...


================================================
FILE: .github/workflows/verify.yaml
================================================
name: Verify

on:
  pull_request:
    branches:
      - "main"

permissions: {}

jobs:
  verify:
    name: Verify Codegen
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: "go.mod"
          check-latest: true

      - name: Verify
        run: ./hack/presubmit.sh

  golangci:
    name: lint
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0
        with:
          go-version-file: "go.mod"
          check-latest: true

      - name: golangci-lint
        uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.4.0
        with:
          version: v2.7.2


================================================
FILE: .gitignore
================================================
# Ignore GoLand (IntelliJ) files.
.idea/

ko

.DS_Store

/vendor/


================================================
FILE: .golangci.yaml
================================================
version: "2"
linters:
  enable:
    - asciicheck
    - errorlint
    - gosec
    - importas
    - misspell
    - prealloc
    - revive
    - staticcheck
    - tparallel
    - unconvert
    - unparam
    - whitespace
  disable:
    - depguard
    - errcheck
  settings:
    gosec:
      excludes:
        - G115
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      - linters:
          - gosec
        path: test
    paths:
      - third_party$
      - builtin$
      - examples$
formatters:
  enable:
    - gofmt
    - goimports
  exclusions:
    generated: lax
    paths:
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .goreleaser.yml
================================================
version: 2

before:
  hooks:
    - go mod tidy
    - /bin/bash -c 'if [ -n "$(git --no-pager diff --exit-code go.mod go.sum)" ]; then exit 1; fi'

builds:
  - id: binary
    main: ./main.go
    env:
      - CGO_ENABLED=0
    flags:
      - -trimpath
    ldflags:
      - "-s -w -X github.com/google/ko/pkg/commands.Version={{.Version}}"
    goos:
      - windows
      - linux
      - darwin
    goarch:
      - amd64
      - arm64
      - s390x
      - 386
      - mips64le
      - ppc64le
      - riscv64

kos:
  - id: ko-image
    build: binary
    main: .
    base_image: golang:latest
    ldflags:
      - "-s -w -X github.com/google/ko/pkg/commands.Version={{.Version}}"
    platforms:
      - all
    tags:
      - '{{ .Tag }}'
      - '{{ .FullCommit }}'
      - latest
    sbom: spdx
    bare: true
    preserve_import_paths: false
    base_import_paths: false

archives:
  - id: with-version
    name_template: >-
      {{ .ProjectName }}_
      {{- .Version }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
  - id: without-version
    name_template: >-
      {{ .ProjectName }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}

checksum:
  name_template: 'checksums.txt'

snapshot:
  version_template: "{{ .Tag }}-next"

changelog:
  sort: asc
  use: github
  filters:
    exclude:
      - '^docs:'
      - '^test:'


================================================
FILE: .ko.yaml
================================================
baseImageOverrides:
  github.com/google/ko: golang:latest

builds:
  - id: ko
    ldflags:
      - "{{ .Env.LDFLAGS }}"


================================================
FILE: .wokeignore
================================================
# Uses some Cobra methods
pkg/commands/*


================================================
FILE: CNAME
================================================
ko.build

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

We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.

## Code reviews

All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.

## Testing

Ensure the following passes:
```
./hack/presubmit.sh
```
and commit any resultant changes to `go.mod` and `go.sum`. To update any docs
after client changes, run:

```
./hack/update-codegen.sh
```


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: MAINTAINERS.md
================================================
# Maintainers

This page lists all active members of the maintainers for the `ko` project and any subprojects.

- Jon Johnson (@jonjohnsonjr)
- Matt Moore (@mattmoor)
- Jason Hall (@imjasonh)

New projects and new maintainers can be added or removed with the consensus approval of the current maintainers.


================================================
FILE: README.md
================================================
# `ko`: Easy Go Containers

[![GitHub Actions Build Status](https://github.com/ko-build/ko/workflows/Build/badge.svg)](https://github.com/ko-build/ko/actions?query=workflow%3ABuild)
[![GoDoc](https://godoc.org/github.com/google/ko?status.svg)](https://godoc.org/github.com/google/ko)
[![Go Report Card](https://goreportcard.com/badge/ko-build/ko)](https://goreportcard.com/report/ko-build/ko)
[![SLSA 3](https://slsa.dev/images/gh-badge-level3.svg)](https://slsa.dev/images/gh-badge-level3.svg)

<img src="./docs/images/demo.png" width="100%">

---

> 🎉 Google has applied for `ko` to join the Cloud Native Computing Foundation as a Sandbox project! Learn more [here](https://opensource.googleblog.com/2022/10/ko-applies-to-become-a-cncf-sandbox-project.html)!

`ko` is a simple, fast container image builder for Go applications.

It's ideal for use cases where your image contains a single Go application
without any/many dependencies on the OS base image (e.g., no cgo, no OS package
dependencies).

`ko` builds images by effectively executing `go build` on your local machine,
and as such doesn't require `docker` to be installed. This can make it a good
fit for lightweight CI/CD use cases.

`ko` makes [multi-platform builds](https://ko.build/features/multi-platform/) easy, produces [SBOMs](https://ko.build/features/sboms/) by default, and includes support for simple YAML templating which makes it a powerful tool for [Kubernetes applications](https://ko.build/features/k8s/).

# [Install `ko`](https://ko.build/install/) and [get started](https://ko.build/get-started/)!

### Acknowledgements

This work is based heavily on experience from having built the [Docker](https://github.com/bazelbuild/rules_docker) and [Kubernetes](https://github.com/bazelbuild/rules_k8s) support for [Bazel](https://bazel.build).
That work was presented [here](https://www.youtube.com/watch?v=RS1aiQqgUTA).

### Discuss

Questions? Comments? Ideas?
Come discuss `ko` with us in the `#ko-build` channel on the [Kubernetes Slack](https://slack.k8s.io)!
See you there!

### Community Meetings

You can find all the necessary details about the community meetings in this [page](https://ko.build/community).


================================================
FILE: ROADMAP.md
================================================
# `ko` Project Roadmap

_Last updated October 2022_

- Foster a community of contributors and users
  - give talks, do outreach, expand the pool of contributors
  - identify projects that could benefit from using `ko`, and help onboard them
  - publish case studies from successful migrations

- Integrate [sigstore](https://sigstore.dev) for built artifacts
  - attach signed SBOMs
  - attach signed provenance attestations
  - support the OCI referrers API and [fallback tag scheme](https://github.com/opencontainers/distribution-spec/blob/main/spec.md#referrers-tag-schema)
  - integrate with CI workload identity (e.g., GitHub OIDC) to keylessly sign artifacts

- Faster builds
  - identify unnecessary work and avoid it when possible

- Ecosystem integrations
  - support Terraform provider, and potentially Pulumi and CDK, others
  - provide working examples of these integrations


================================================
FILE: cmd/help/main.go
================================================
// Copyright 2021 ko Build Authors All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
	"fmt"
	"os"

	"github.com/google/ko/pkg/commands"
	"github.com/spf13/cobra"
	"github.com/spf13/cobra/doc"
)

var dir string
var root = &cobra.Command{
	Use:   "gendoc",
	Short: "Generate ko's help docs",
	Args:  cobra.NoArgs,
	RunE: func(*cobra.Command, []string) error {
		return doc.GenMarkdownTree(commands.Root, dir)
	},
}

func init() {
	root.Flags().StringVarP(&dir, "dir", "d", ".", "Path to directory in which to generate docs")
}

func main() {
	if err := root.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}


================================================
FILE: code-of-conduct.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of
experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

- The use of sexualized language or imagery and unwelcome sexual attention or
  advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
  address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening,
offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

<!-- TODO: Need a real CoC contact list. -->

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team. All complaints will be reviewed and
investigated and will result in a response that is deemed necessary and
appropriate to the circumstances. The project team is obligated to maintain
confidentiality with regard to the reporter of an incident. Further details of
specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4, available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org


================================================
FILE: docs/CNAME
================================================
ko.build


================================================
FILE: docs/README.md
================================================
# Docs for https://ko.build

## Development

Update `.md` files to update content.

Update `mkdocs.yml` to update sidebar headers and ordering.

To run locally:

- [install `mkdocs` and `mkdocs-material`](https://squidfunk.github.io/mkdocs-material/getting-started/) and run `mkdocs serve`, or
- `docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material`
  - on an M1 Mac, use `ghcr.io/afritzler/mkdocs-material` instead.

This will start a local server on localhost:8000 that autoupdates as you make changes.

## Deployment

When PRs are merged, the site will be rebuilt and published automatically.

### Credits

The site is powered by [mkdocs-material](https://squidfunk.github.io/mkdocs-material). The code and theme are released under the MIT license.

Content is licensed [CC-BY](https://creativecommons.org/licenses/by/4.0/).



================================================
FILE: docs/advanced/faq.md
================================================
# Frequently Asked Questions

## How can I set `ldflags`?

[Using -ldflags](https://blog.cloudflare.com/setting-go-variables-at-compile-time/) is a common way to embed version info in go binaries (In fact, we do this for `ko`!).
Unfortunately, because `ko` wraps `go build`, it's not possible to use this flag directly; however, you can use the `GOFLAGS` environment variable instead:

```sh
GOFLAGS="-ldflags=-X=main.version=1.2.3" ko build .
```

Currently, there is a limitation that does not allow to set multiple arguments in `ldflags` using `GOFLAGS`.
Using `-ldflags` multiple times also does not work.
In this use case, it works best to use the [`builds` section](./../configuration.md) in the `.ko.yaml` file.

## Why are my images all created in 1970?

In order to support [reproducible builds](https://reproducible-builds.org), `ko` doesn't embed timestamps in the images it produces by default.

However, `ko` does respect the [`SOURCE_DATE_EPOCH`](https://reproducible-builds.org/docs/source-date-epoch/) environment variable, which will set the container image's timestamp accordingly.

Similarly, the `KO_DATA_DATE_EPOCH` environment variable can be used to set the _modtime_ timestamp of the files in `KO_DATA_PATH`.

For example, you can set the container image's timestamp to the current timestamp by executing:

```sh
export SOURCE_DATE_EPOCH=$(date +%s)
```

or set the timestamp of the files in `KO_DATA_PATH` to the latest git commit's timestamp with:

```sh
export KO_DATA_DATE_EPOCH=$(git log -1 --format='%ct')
```

## Can I build Windows containers?

Yes, but support for Windows containers is new, experimental, and tenuous. Be prepared to file bugs. 🐛

The default base image does not provide a Windows image.
You can try out building a Windows container image by [setting the base image](./../configuration.md) to a Windows base image and building with `--platform=windows/amd64` or `--platform=all`:

For example, to build a Windows container image, update your `.ko.yaml` to set the base image:

```plaintext
defaultBaseImage: mcr.microsoft.com/windows/nanoserver:ltsc2022
```

And build for `windows/amd64`.

```sh
ko build ./ --platform=windows/amd64
```

### Known issues 🐛

- Symlinks in `kodata` are ignored when building Windows images; only regular files and directories will be included in the Windows image.

## Does `ko` support autocompletion?

Yes! `ko completion` generates a Bash/Zsh/Fish/PowerShell completion script.
You can get how to load it from help document.

```sh
ko completion [bash|zsh|fish|powershell] --help
```

Or, you can source it directly:

```bash
source <(ko completion)
```

## Does `ko` work with [Kustomize](https://kustomize.io/)?

Yes! `ko resolve -f -` will read and process input from stdin, so you can have `ko` easily process the output of the `kustomize` command.

```sh
kustomize build config | ko resolve -f -
```

## Does `ko` integrate with other build and development tools?

Oh, you betcha. Here's a partial list:

- `ko` support in [Skaffold](https://skaffold.dev/docs/pipeline-stages/builders/ko/)
- `ko` support for [goreleaser](https://goreleaser.com/customization/ko/)
- `ko` task in the [Tekton catalog](https://github.com/tektoncd/catalog/tree/main/task/ko/)
- `ko` support in [Carvel's `kbld`](https://carvel.dev/kbld/docs/latest/config/#ko)
- `ko` extension for [Tilt](https://github.com/tilt-dev/tilt-extensions/tree/master/ko)

## Does `ko` work with [OpenShift Internal Registry](https://access.redhat.com/documentation/en-us/openshift_container_platform/4.11/html/registry/registry-overview#registry-integrated-openshift-registry_registry-overview)?

Yes! Follow these steps:

1. [Connect to your OpenShift installation](https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html#cli-logging-in_cli-developer-commands)
1. [Expose the OpenShift Internal Registry](https://docs.openshift.com/container-platform/latest/registry/securing-exposing-registry.html) so you can push to it:
1. Export your token to `$HOME/.docker/config.json`:

```sh
oc registry login --to=$HOME/.docker/config.json
```

1. Create a namespace where you will push your images, i.e: `ko-images`
1. Execute this command to set `KO_DOCKER_REPO` to publish images to the internal registry.

```sh
export KO_DOCKER_REPO=$(oc registry info --public)/ko-images
```



================================================
FILE: docs/advanced/go-packages.md
================================================
# Go Packages

`ko`'s functionality can be consumed as a library in a Go application.

To build an image, use [`pkg/build`](https://pkg.go.dev/github.com/google/ko/pkg/build), and publish it with [`pkg/publish`](https://pkg.go.dev/github.com/google/ko/pkg/publish).

This is a minimal example of using the packages together, to implement the core subset of `ko`'s functionality:

```go
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/google/go-containerregistry/pkg/authn"
	"github.com/google/go-containerregistry/pkg/name"
	"github.com/google/go-containerregistry/pkg/v1/remote"
	"github.com/google/ko/pkg/build"
	"github.com/google/ko/pkg/publish"
)

const (
	baseImage  = "cgr.dev/chainguard/static:latest"
	targetRepo = "example.registry/my-repo"
	importpath = "github.com/my-org/miniko"
	commitSHA  = "deadbeef"
)

func main() {
	ctx := context.Background()

	b, err := build.NewGo(ctx, ".",
		build.WithPlatforms("linux/amd64"), // only build for these platforms.
		build.WithBaseImages(func(ctx context.Context, _ string) (name.Reference, build.Result, error) {
			ref := name.MustParseReference(baseImage)
			base, err := remote.Index(ref, remote.WithContext(ctx))
			return ref, base, err
		}))
	if err != nil {
		log.Fatalf("NewGo: %v", err)
	}
	r, err := b.Build(ctx, importpath)
	if err != nil {
		log.Fatalf("Build: %v", err)
	}

	p, err := publish.NewDefault(targetRepo,                 // publish to example.registry/my-repo
		publish.WithTags([]string{commitSHA}),               // tag with :deadbeef
		publish.WithAuthFromKeychain(authn.DefaultKeychain)) // use credentials from ~/.docker/config.json
	if err != nil {
		log.Fatalf("NewDefault: %v", err)
	}
	ref, err := p.Publish(ctx, r, importpath)
	if err != nil {
		log.Fatalf("Publish: %v", err)
	}
	fmt.Println(ref.String())
}
```


================================================
FILE: docs/advanced/lambda.md
================================================
# AWS Lambda

`ko` can build images that can be deployed as AWS Lambda functions, using [Lambda's container support](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html).

For best results, use the [Go runtime interface client](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html#go-image-clients) provided by the [`lambda` package](https://pkg.go.dev/github.com/aws/aws-lambda-go/lambda).

For example:

```go
package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-lambda-go/lambda"
)

type Event struct {
	Name string `json:"name"`
	// TODO: add other request fields here.
}

func main() {
	lambda.Start(func(ctx context.Context, event Event) (string, error) {
		return fmt.Sprintf("Hello %s!", event.Name), nil
	})
}
```

See AWS's [documentation](https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html) for more information on writing Lambda functions in Go.

To deploy to Lambda, you must push to AWS Elastic Container Registry (ECR):

```sh
KO_DOCKER_REPO=[account-id].dkr.ecr.[region].amazonaws.com/my-repo
image=$(ko build ./cmd/app)
```

Then, create a Lambda function using the image in ECR:

```sh
aws lambda create-function \
  --function-name hello-world \
  --package-type Image \
  --code ImageUri=${image} \
  --role arn:aws:iam::[account-id]:role/lambda-ex
```

See AWS's [documentation](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html) for more information on deploying Lambda functions using Go container images, including how to configure push access to ECR, and how to configure the IAM role for the function.

The base image that `ko` uses by default supports both x86 and Graviton2 architectures.

You can also use the [`ko` Terraform provider](./terraform.md) to build and deploy Lambda functions as part of your IaC workflow, using the [`aws_lambda_function` resource](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function.html). See the [provider example](https://github.com/ko-build/terraform-provider-ko/tree/main/provider-examples/lambda) to get started.


================================================
FILE: docs/advanced/limitations.md
================================================
# Limitations

`ko` works best when your application has no dependencies on the underlying image.

This means `ko` is ideal when you don't require [cgo](https://pkg.go.dev/cmd/cgo), and builds are executed with `CGO_ENABLED=0` by default.

To install other OS packages, make those available in your [configured base image](../../configuration).

`ko` only supports Go applications.
For a similar tool targeting Java applications, try [Jib](https://github.com/GoogleContainerTools/jib).
For other languages, try [apko](https://github.com/chainguard-dev/apko) and [melange](https://github.com/chainguard-dev/melange).



================================================
FILE: docs/advanced/linux-capabilities.md
================================================
# Linux Capabilities

In Linux, capabilities are a way to selectively grant privileges to a running process.

Docker provides `--cap-add` and `--cap-drop`
[run options](https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities)
to tweak container capabilities, e.g:

```
docker run --cap-add bpf hello-world
```

If container runs as a non-root user,
capabilities are narrowed by intersecting with *file* capabilities of the
application binary. When building images with a Dockerfile, one
typically uses `setcap` tool to modify file capabilities, e.g:
`setcap FILE bpf=ep`.

To set file capabilities with `ko`, specify `linux_capabilities`
in builds configuration section in your `.ko.yaml`. Use `setcap` syntax:

```yaml
builds:
- id: caps
  linux_capabilities: bpf=ep
```
## Alternative spelling

```yaml
builds:
- id: caps
  linux_capabilities:
  - cap1
  - cap2
  - cap3
```

A list of capability names is equivalent to `cap1,cap2,cap3=p`.

## Improving UX in capability-reliant apps

A capability can be *permitted* (`=p`), or both *permitted* and *effective* (`=ep`).
Effective capabilities are used for permission checks.
A program can promote permitted capability to effective when needed.

```yaml
builds:
- id: caps
  linux_capabilities: bpf,perfmon,net_admin=ep
```

Initially, `=ep` might look like a good idea.
There's no need to explicitly promote *permitted* capabilities.
Application takes advantage of *effective* capabilities right away.

There is a catch though.

```
$ docker run --cap-add bpf ko.local/caps.test-4b8f7bca75c467b3d2803e1c087a3287
exec /ko-app/caps.test: operation not permitted
```

When run options request fewer capabilities than specified in file capabilities,
container fails to start. It is hard to tell what went wrong since
`operation not permitted` is a generic error. (Docker is unlikely to improve diagnostics
for this failure case since the check is implemented in Linux kernel.)


We suggest to use `=p` instead. This option puts application in charge of verifying and
promoting permitted capabilities to effective. It can produce much better diagnostics:

```
$ docker run --cap-add bpf ko.local/caps.test-4b8f7bca75c467b3d2803e1c087a3287
current capabilities: cap_bpf=p
activating capabilities: cap_net_admin,cap_perfmon,cap_bpf=ep: operation not permitted
```

[Sample code](https://go.dev/play/p/uPMzyotkNHg).


================================================
FILE: docs/advanced/migrating-from-dockerfile.md
================================================
# Migrating from Dockerfile

If your `Dockerfile` looks like either of the examples in the [official tutorial for writing a Dockerfile to containerize a Go application](https://docs.docker.com/language/golang/build-images/), you can easily migrate to use `ko` instead.

Let's review the best practice multi-stage Dockerfile in that tutorial first:

```Dockerfile
## Build
FROM golang:1.16-buster AS build

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN go build -o /docker-gs-ping

## Deploy
FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=build /docker-gs-ping /docker-gs-ping

EXPOSE 8080

USER nonroot:nonroot

ENTRYPOINT ["/docker-gs-ping"]
```

This `Dockerfile`:

1. pulls the `golang:1.16` image
1. `COPY`s your local source into the container environment (`COPY`ing `go.mod` and `go.sum` first and running `go mod download`, to cache dependencies in the container environment)
1. `RUN`s `go build` on your source, inside the container, to produce an executable
1. `COPY`s the executable built in the previous step into a new image, on top of a minimal [distroless](https://github.com/GoogleContainerTools/distroless) base image.

The result is a Go application built on a minimal base image, with an optimally cached build sequence.

After running `docker build` on this `Dockerfile`, don't forget to push that image to the registry so you can deploy it.

---

## Migrating to `ko`

If your Go source is laid out as described in the tutorial, and you've [installed](../../install) and [set up your environment](../../get-started), you can simply run `ko build ./` to build and push the container image to your registry.

You're done. You can delete your `Dockerfile` and uninstall `docker`.

`ko` takes advantage of your local [Go build cache](../../features/build-cache) without needing to be told to, and it sets the `ENTRYPOINT` and uses a nonroot distroless base image by default.

To build a multi-arch image, simply add `--platform=all`.
Compare this to the [equivalent Docker instructions](https://docs.docker.com/desktop/multi-arch/).



================================================
FILE: docs/advanced/root-ca-certificates.md
================================================
# Root CA Certificates

To install a [root certificate](https://en.wikipedia.org/wiki/Root_certificate) into your container built using `ko`, you can use one of the following methods.

## incert
[`incert`](https://github.com/chainguard-dev/incert) allows you to append CA certificates to an image and push the modified image to a specified registry.

`incert` can be run after `ko build` to build your Go application container image with custom root CA certificates.

### Example
1. Build and push your Go application container image using `ko build`
```sh
KO_DOCKER_REPO=mycompany/myimage:latest ko build .
```

2. Append the built image with your custom CA certificate(s) using `incert`
```sh
incert -image-url=mycompany/myimage:latest -ca-certs-file=/path/to/cacerts.pem -dest-image-url=myregistry/myimage:latest
```

## Custom Base Image

New root certificates can be [installed into a custom image](https://stackoverflow.com/questions/42292444/how-do-i-add-a-ca-root-certificate-inside-a-docker-image) using standard OS packages. Then, this custom image can be used [to override the base image for `ko`](https://ko.build/configuration/#overriding-base-images). Once the Go application container image is built using `ko` with the custom base image, the root certificates installed on the base image will be trusted by the Go application.

### Example

1. Make a custom container image with your new root certificates
```dockerfile
# Dockerfile
FROM alpine

RUN apk update
RUN apk add ca-certificates

ADD new-root-ca.crt /usr/local/share/ca-certificates/new-root-ca.crt
RUN chmod 644 /usr/local/share/ca-certificates/new-root-ca.crt
RUN update-ca-certificates
```

2. Build and push the custom container image to a container registry
```sh
docker build . -t docker.io/ko-build/image-with-new-root-certs
docker push docker.io/ko-build/image-with-new-root-certs
```

3. Configure `ko` to [override the default base image](https://ko.build/configuration/#overriding-base-images) with the custom image
```yaml
# .ko.yaml
defaultBaseImage: docker.io/ko-build/image-with-new-root-certs
```

    **OR**
```sh
export KO_DEFAULTBASEIMAGE=docker.io/ko-build/image-with-new-root-certs
```

4. Build the Go app container image with `ko`
```sh
ko build .
```

## Static Assets
Alternatively, root certificates can be installed into the Go application container image using a combination of [`ko` static assets](https://ko.build/features/static-assets/) and [overriding the default system location for SSL certificates](https://pkg.go.dev/crypto/x509#SystemCertPool).

Using `ko`'s support for static assets, root certificates can be stored in the `<importpath>/kodata` directory (either checked into the repository, or injected dynamically by a CI pipeline). After running `ko build`, the certificate files are then bundled into the built image at the path `$KO_DATA_PATH`.

To enable the Go application to trust the bundled certificate(s), the container runtime or orchestrator (Docker, Kubernetes, etc) must set the environment variable `SSL_CERT_DIR` to the same value as `KO_DATA_PATH`. Go [uses `SSL_CERT_DIR` to determine the directory to check for SSL certificate files](https://go.dev/src/crypto/x509/root_unix.go). Once this variable is set, the Go application will trust the bundled root certificates in `$KO_DATA_PATH`.

### Example

1. Copy the root certificate(s) to the `<importpath>/kodata/` directory
```sh
# $(pwd) assumed to be at <importpath> for this example
mkdir -p kodata
cp $CERT_FILE_DIR/*.crt kodata/
```

2. Build the Go application container image
```sh
KO_DOCKER_REPO=docker.io/ko-build/static-assets-certs ko build .
```

3. Run the Go application container image with `SSL_CERT_DIR` equal to `/var/run/ko` (the default value for `$KO_DATA_PATH`)
```sh
docker run -e SSL_CERT_DIR=/var/run/ko docker.io/ko-build/static-assets-certs
```

A functional client-server example for this can be seen [here](https://github.com/kosamson/ko-private-ca-test).


================================================
FILE: docs/advanced/terraform.md
================================================
# Terraform Provider

In addition to the CLI, `ko`'s functionality is also available as a Terraform provider.

This allows `ko` to be integrated with your Infrastructure-as-Code (IaC) workflows, and makes building your code a seamless part of your deployment process.

Using the Terraform provider is as simple as adding a `ko_build` resource to your Terraform configuration:

```hcl
// Require the `ko-build/ko` provider.
terraform {
  required_providers {
    ko = { source = "ko-build/ko" }
  }
}

// Configure the provider to push to your repo.
provider "ko" {
  repo = "example.registry/my-repo" // equivalent to KO_DOCKER_REPO
}

// Build your code.
resource "ko_build" "app" {
  importpath = "github.com/example/repo/cmd/app"
}

// TODO: use the `ko_build.app` resource elsewhere in your Terraform configuration.

// Report the build image's digest.
output "image" {
  value = ko_build.app.image_ref
}
```

See the [`ko-build/ko` provider on the Terraform Registry](https://registry.terraform.io/providers/ko-build/ko/latest) for more information, and the [GitHub repo](https://github.com/ko-build/terraform-provider-ko) for more examples.


================================================
FILE: docs/community.md
================================================
# Community

## Meetings

We have a bi-weekly community meeting on [Wednesdays at 1:00 PM US Eastern time, 10:00 AM US Western time](https://dateful.com/eventlink/2763257725). The main goal of these meetings is that we want to hear from you! We want to know what you're using `ko` for, what you'd like to see in `ko`, how we can make `ko` better for you. With any remaining time we can go through open issues and PRs.

We have a [meeting agenda](https://ko.build/agenda) you can use to propose topics for discussion/ideas. You can also just show up and we'll figure out what to talk about.

## Slack

Come discuss `ko` with us in the `#ko-build` channel on the [Kubernetes Slack](https://ko.build/slack)!
See you there!


================================================
FILE: docs/configuration.md
================================================
# Configuration

## Basic Configuration

Aside from certain environment variables (see [below](#environment-variables-advanced)) like `KO_DOCKER_REPO`, you can
configure `ko`'s behavior using a `.ko.yaml` file. The location of this file can be overridden with `KO_CONFIG_PATH`.

### Overriding Base Images

By default, `ko` bases images on `cgr.dev/chainguard/static`. This is a
small image that provides the bare necessities to run your Go binary.

You can override this base image in two ways:

1. To override the base image for all images `ko` builds, add this line to your
   `.ko.yaml` file:

```yaml
defaultBaseImage: registry.example.com/base/image
```

You can also use the `KO_DEFAULTBASEIMAGE` environment variable to set the default base image, which overrides the YAML configuration:

```shell
KO_DEFAULTBASEIMAGE=registry.example.com/base/image ko build .
```

2. To override the base image for certain importpaths:

```yaml
baseImageOverrides:
  github.com/my-user/my-repo/cmd/app: registry.example.com/base/for/app
  github.com/my-user/my-repo/cmd/foo: registry.example.com/base/for/foo
```

### Overriding Go build settings

By default, `ko` builds the binary with no additional build flags other than
`-trimpath`. You can replace the default build
arguments by providing build flags and ldflags using a
[GoReleaser](https://github.com/goreleaser/goreleaser) influenced `builds`
configuration section in your `.ko.yaml`.

```yaml
builds:
- id: foo
  dir: .  # default is .
  main: ./foobar/foo
  env:
  - GOPRIVATE=git.internal.example.com,source.developers.google.com
  flags:
  - -tags
  - netgo
  ldflags:
  - -s -w
  - -extldflags "-static"
  - -X main.version={{.Env.VERSION}}
- id: bar
  dir: ./bar
  main: .  # default is .
  env:
  - GOCACHE=/workspace/.gocache
  ldflags:
  - -s
  - -w
```

If your repository contains multiple modules (multiple `go.mod` files in
different directories), use the `dir` field to specify the directory where
`ko` should run `go build`.

`ko` picks the entry from `builds` based on the import path you request. The
import path is matched against the result of joining `dir` and `main`.

The paths specified in `dir` and `main` are relative to the working directory
of the `ko` process.

The `ldflags` default value is `[]`.

### Templating support

The `ko` builds supports templating of `flags` and `ldflags`, similar to the
[GoReleaser `builds` section](https://goreleaser.com/customization/build/).

The table below lists the supported template parameters.

| Template param        | Description                                              |
|-----------------------|----------------------------------------------------------|
| `Env`                 | Map of environment variables used for the build          |
| `GoEnv`               | Map of `go env` environment variables used for the build |
| `Date`                | The UTC build date in RFC 3339 format                    |
| `Timestamp`           | The UTC build date as Unix epoc seconds                  |
| `Git.Branch`          | The current git branch                                   |
| `Git.Tag`             | The current git tag                                      |
| `Git.ShortCommit`     | The git commit short hash                                |
| `Git.FullCommit`      | The git commit full hash                                 |
| `Git.CommitDate`      | The UTC commit date in RFC 3339 format                   |
| `Git.CommitTimestamp` | The UTC commit date in Unix format                       |
| `Git.IsDirty`         | Whether or not current git state is dirty                |
| `Git.IsClean`         | Whether or not current git state is clean.               |
| `Git.TreeState`       | Either `clean` or `dirty`                                |

### Setting default platforms

By default, `ko` builds images based on the platform it runs on. If your target platform differs from your build platform you can specify the build platform:

**As a parameter**
See [Multi-Platform Images](./features/multi-platform.md).

**In .ko.yaml**
Add this to your `.ko.yaml` file:

```yaml
defaultPlatforms:
- linux/arm64
- linux/amd64
```

You can also use the `KO_DEFAULTPLATFORMS` environment variable to set the default platforms, which overrides the YAML configuration:

```shell
KO_DEFAULTPLATFORMS=linux/arm64,linux/amd64
```

### Setting build environment variables

By default, `ko` builds use the ambient environment from the system (i.e. `os.Environ()`).
These values can be overridden for your build.

```yaml
defaultEnv:
- FOO=foo
builds:
- id: foo
  dir: .
  main: ./foobar/foo
  env:
  - FOO=bar
- id: bar     # Will use defaultEnv.
  dir: ./bar
  main: .
```

For a given build, the environment variables are merged in the following order:

- System `os.Environ` (lowest precedence)
- Build variables: `build.env` if specified, otherwise `defaultEnv` (highest precedence)

### Setting build flags and ldflags

You can specify both `flags` and `ldflags` globally as well as per-build.

```yaml
defaultFlags:
- -v
defaultLdflags:
- -s
builds:
- id: foo
  dir: .
  main: ./foobar/foo
  flags:
  - -trimpath
  ldflags:
  - -w
- id: bar     # Will use defaultFlags and defaultLdflags.
  dir: ./bar
  main: .
```

The values for a `build` will be used if specified, otherwise their respective defaults will be used.
Both default and per-build values may use [template parameters](#templating-support).

### Environment Variables (advanced)

For ease of use, backward compatibility and advanced use cases, `ko` supports the following environment variables to
influence the build process.

| Variable         | Default Value                              | Description                                                                                                                                                                                                                      |
|------------------|--------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `KO_DOCKER_REPO` | (not set)                                  | Container repository where to push images built with `ko` (required)                                                                                                                                                             |
| `KO_GO_PATH`     | `go`                                       | `go` binary to use for builds, relative or absolute path, otherwise looked up via $PATH (optional)                                                                                                                               |
| `KO_CONFIG_PATH` | `./.ko.yaml`                               | Path to `ko` configuration file (optional)                                                                                                                                                                                       |
| `KOCACHE`        | (not set)                                  | This tells `ko` to store a local mapping between the `go build` inputs to the image layer that they produce, so `go build` can be skipped entirely if the layer is already present in the image registry (optional).             |

## Naming Images

`ko` provides a few different strategies for naming the image it pushes, to
workaround certain registry limitations and user preferences:

Given `KO_DOCKER_REPO=registry.example.com/repo`, by default,
`ko build ./cmd/app` will produce an image named like
`registry.example.com/repo/app-<md5>`, which includes the MD5 hash of the full
import path, to avoid collisions.

- `--preserve-import-paths` (`-P`) will include the entire importpath:
  `registry.example.com/repo/github.com/my-user/my-repo/cmd/app`
- `--base-import-paths` (`-B`) will omit the MD5 portion:
  `registry.example.com/repo/app`
- `--bare` will only include the `KO_DOCKER_REPO`: `registry.example.com/repo`

## Local Publishing Options

`ko` is normally used to publish images to container image registries,
identified by `KO_DOCKER_REPO`.

`ko` can also load images to a local Docker daemon, if available, by setting
`KO_DOCKER_REPO=ko.local`, or by passing the `--local` (`-L`) flag.

Local images can be used as a base image for other `ko` images:

```yaml
defaultBaseImage: ko.local/example/base/image
```

`ko` can also load images into a local [KinD](https://kind.sigs.k8s.io)
cluster, if available, by setting `KO_DOCKER_REPO=kind.local`. By default this
loads into the default KinD cluster name (`kind`). To load into another KinD
cluster, set `KIND_CLUSTER_NAME=my-other-cluster`.



================================================
FILE: docs/custom/main.html
================================================
{% extends "base.html" %}

{% block site_meta %}
    {{ super() }}
    {% if page and page.meta and page.meta.ko_meta %}
    <meta charset=utf-8>
    <meta name=go-import content="ko.build git https://github.com/ko-build/ko">
    <meta name=go-source content="ko.build git https://github.com/ko-build/ko https://github.com/ko-build/ko/tree/main{/dir} https://github.com/ko-build/ko/blob/main{/dir}/{file}#L{line}">
    {% endif %}
{% endblock %}



================================================
FILE: docs/custom/partials/copyright.html
================================================
<small>The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see <a href="https://www.linuxfoundation.org/legal/trademark-usage" window="_blank">Trademark Usage</a></small>


================================================
FILE: docs/deployment.md
================================================
# Deployment

_See [Kubernetes Integration](../features/k8s) for information about deploying to Kubernetes._

Because the output of `ko build` is an image reference, you can easily pass it to other tools that expect to take an image reference.

### [`docker run`](https://docs.docker.com/engine/reference/run/)

To run the container locally:

```plaintext
docker run -p 8080:8080 $(ko build ./cmd/app)
```

---

### [Google Cloud Run](https://cloud.google.com/run)

```plaintext
gcloud run deploy --image=$(ko build ./cmd/app)
```

> 💡 **Note:** The image must be pushed to [Google Container Registry](https://cloud.google.com/container-registry) or [Artifact Registry](https://cloud.google.com/artifact-registry).

---

###  [fly.io](https://fly.io)

```plaintext
flyctl launch --image=$(ko build ./cmd/app)
```

> 💡 **Note:** The image must be pushed to Fly.io's container registry at `registry.fly.io`, or if not, the image must be publicly available. When pushing to `registry.fly.io`, you must first log in with [`flyctl auth docker`](https://fly.io/docs/flyctl/auth-docker/).

---

### [AWS Lambda](https://aws.amazon.com/lambda/)

```plaintext
aws lambda update-function-code \
  --function-name=my-function-name \
  --image-uri=$(ko build ./cmd/app)
```

> 💡 **Note:** The image must be pushed to [ECR](https://aws.amazon.com/ecr/), based on the AWS provided base image, and use the [`aws-lambda-go`](https://github.com/aws/aws-lambda-go) framework.
See [official docs](https://docs.aws.amazon.com/lambda/latest/dg/go-image.html) for more information.

---

### [Azure Container Apps](https://azure.microsoft.com/services/container-apps/)

```plaintext
az containerapp update \
  --name my-container-app
  --resource-group my-resource-group
  --image $(ko build ./cmd/app)
```

> 💡 **Note:** The image must be pushed to [ACR](https://azure.microsoft.com/services/container-registry/) or other registry service.
See [official docs](https://docs.microsoft.com/azure/container-apps/) for more information.



================================================
FILE: docs/features/build-cache.md
================================================
# Build Cache

Because `ko` just runs `go build` in your normal development environment, it automatically reuses your [`go build` cache](https://pkg.go.dev/cmd/go#hdr-Build_and_test_caching) from previous builds, making iterative development faster.

`ko` also avoids pushing blobs to the remote image registry if they're already present, making pushes faster.

You can make `ko` even faster by setting the `KOCACHE` environment variable.
This tells `ko` to store a local mapping between the `go build` inputs to the image layer that they produce, so `go build` can be skipped entirely if the layer is already present in the image registry.



================================================
FILE: docs/features/debugging.md
================================================
# Debugging

Sometimes it's challenging to track down the cause of unexpected behavior in an app. Because `ko` makes it simple to make tweaks to your app and immediately rebuild your image, it's possible to iteratively explore various aspects of your app, such as by adding log lines that print variable values.

But to help you solve the problem _as fast as possible_, `ko` supports debugging your Go app with [delve](https://github.com/go-delve/delve).

To use this feature, just add the `--debug` flag to your `ko build` command. This adjusts how the image is built:

- It installs `delve` in the image (in addition to your own app).
- It sets the image's `ENTRYPOINT` to a `delve exec ...` command that runs the Go app in debug-mode, listening on port `40000` for a debugger client.
- It ensures your compiled Go app includes debug symbols needed to enable debugging.

**Note:** This feature is geared toward development workflows. It **should not** be used in production.

### How it works

Build the image using the debug feature.

```plaintext
ko build . --debug
```

Run the container, ensuring that the debug port (`40000`) is exposed to allow clients to connect to it.

```plaintext
docker run -p 40000:40000 <img>
```

This sets up your app to be waiting to run the command you've specified. All that's needed now is to connect your debugger client to the running container!


================================================
FILE: docs/features/k8s.md
================================================
# Kubernetes Integration

You _could_ stop at just building and pushing images.

But, because building images is so _easy_ with `ko`, and because building with
`ko` only requires a string importpath to identify the image, we can integrate
this with YAML generation to make Kubernetes use cases much simpler.

## YAML Changes

Traditionally, you might have a Kubernetes deployment, defined in a YAML file,
that runs an image:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: registry.example.com/my-app:v1.2.3
```

...which you apply to your cluster with `kubectl apply`:

```plaintext
kubectl apply -f deployment.yaml
```

With `ko`, you can instead reference your Go binary by its importpath, prefixed
with `ko://`:

```yaml
    ...
    spec:
      containers:
      - name: my-app
        image: ko://github.com/my-user/my-repo/cmd/app
```

## `ko resolve`

With this small change, running `ko resolve -f deployment.yaml` will instruct
`ko` to:

1. scan the YAML file(s) for values with the `ko://` prefix,
2. for each unique `ko://`-prefixed string, execute `ko build <importpath>` to
   build and push an image,
3. replace `ko://`-prefixed string(s) in the input YAML with the fully-specified
   image reference of the built image(s), as above.
4. Print the resulting resolved YAML to stdout.

The result can be redirected to a file, to distribute to others:

```plaintext
ko resolve -f config/ > release.yaml
```

Taken together, `ko resolve` aims to make packaging, pushing, and referencing
container images an invisible implementation detail of your Kubernetes
deployment, and let you focus on writing code in Go.

## `ko apply`

To apply the resulting resolved YAML config, you can redirect the output of
`ko resolve` to `kubectl apply`:

```plaintext
ko resolve -f config/ | kubectl apply -f -
```

Since this is a relatively common use case, the same functionality is available
using `ko apply`:

```plaintext
ko apply -f config/
```

Also, any flags passed after `--` are passed to `kubectl apply` directly, for example to specify context and kubeconfig:
```
ko apply -f config -- --context=foo --kubeconfig=cfg.yaml
```

**NB:** This requires that `kubectl` is available.

## `ko delete`

To teardown resources applied using `ko apply`, you can run `ko delete`:

```plaintext
ko delete -f config/
```

This is purely a convenient alias for `kubectl delete`, and doesn't perform any
builds, or delete any previously built images.



================================================
FILE: docs/features/multi-platform.md
================================================
# Multi-Platform Images

Because Go supports cross-compilation to other CPU architectures and operating systems, `ko` excels at producing multi-platform images.

To build and push an image for all platforms supported by the configured base image, simply add `--platform=all`.
This will instruct `ko` to look up all the supported platforms in the base image, execute `GOOS=<os> GOARCH=<arch> GOARM=<variant> go build` for each platform, and produce a manifest list containing an image for each platform.

You can also select specific platforms, for example, `--platform=linux/amd64,linux/arm64`.

`ko` also has experimental support for building for Windows images.
See [FAQ](../../advanced/faq#can-i-build-windows-containers).



================================================
FILE: docs/features/sboms.md
================================================
# SBOMs

A [Software Bill of Materials (SBOM)](https://en.wikipedia.org/wiki/Software_bill_of_materials) is a list of software components that a software artifact depends on.
Having a list of dependencies can be helpful in determining whether any vulnerable components were used to build the software artifact.

**From v0.9+, `ko` generates and uploads an SBOM for every image it produces by default.**

ko will generate an SBOM in the [SPDX](https://spdx.dev/) format by default. To disable SBOM generation, pass `--sbom=none`.

These SBOMs can be downloaded using the [`cosign download sbom`](https://github.com/sigstore/cosign/blob/main/doc/cosign_download_sbom.md) command.



================================================
FILE: docs/features/static-assets.md
================================================
# Static Assets

`ko` can also bundle static assets into the images it produces.

By convention, any contents of a directory named `<importpath>/kodata/` will be
bundled into the image, and the path where it's available in the image will be
identified by the environment variable `KO_DATA_PATH`.

As an example, you can bundle and serve static contents in your image:

```
cmd/
  app/
    main.go
    kodata/
      favicon.ico
      index.html
```

Then, in your `main.go`:

```go
func main() {
    http.Handle("/", http.FileServer(http.Dir(os.Getenv("KO_DATA_PATH"))))
    log.Fatal(http.ListenAndServe(":8080", nil))
}
```

You can simulate `ko`'s behavior outside of the container image by setting the
`KO_DATA_PATH` environment variable yourself with `KO_DATA_PATH=cmd/app/kodata/ go run ./cmd/app`.

> 💡 **Tip:** Symlinks in `kodata` are followed and included as well. For example,
you can include Git commit information in your image with `ln -s -r .git/HEAD ./cmd/app/kodata/`

Also note that `http.FileServer` will not serve the `Last-Modified` header
(or validate `If-Modified-Since` request headers) because `ko` does not embed
timestamps by default.

This can be supported by manually setting the `KO_DATA_DATE_EPOCH` environment
variable during build ([See FAQ](../../advanced/faq#why-are-my-images-all-created-in-1970)).



================================================
FILE: docs/get-started.md
================================================
# Get Started

## Setup

First, [install `ko`](../install).

### Authenticate

`ko` depends on the authentication configured in your Docker config (typically `~/.docker/config.json`).

✨ **If you can push an image with `docker push`, you are already authenticated for `ko`!** ✨

Since `ko` doesn't require `docker`, `ko login` also provides a surface for logging in to a container image registry with a username and password, similar to [`docker login`](https://docs.docker.com/engine/reference/commandline/login/).

Additionally, even if auth is not configured in the Docker config, `ko` includes built-in support for authenticating to the following container registries using credentials configured in the environment:

- Google Container Registry and Artifact Registry, using [Application Default Credentials](https://cloud.google.com/docs/authentication/production) or auth configured in `gcloud`.
- Amazon Elastic Container Registry, using [AWS credentials](https://github.com/awslabs/amazon-ecr-credential-helper/#aws-credentials)
- Azure Container Registry, using [environment variables](https://github.com/chrismellard/docker-credential-acr-env/)
- GitHub Container Registry, using the `GITHUB_TOKEN` environment variable

### Choose Destination

`ko` depends on an environment variable, `KO_DOCKER_REPO`, to identify where it should push images that it builds. Typically this will be a remote registry, e.g.:

- `KO_DOCKER_REPO=gcr.io/my-project`, or
- `KO_DOCKER_REPO=ghcr.io/my-org/my-repo`, or
- `KO_DOCKER_REPO=my-dockerhub-user`

## Build an Image

`ko build ./cmd/app` builds and pushes a container image, and prints the resulting image digest to stdout.

In this example, `./cmd/app` must be a `package main` that defines `func main()`.

```plaintext
$ ko build ./cmd/app
...
registry.example.com/my-project/app-099ba5bcefdead87f92606265fb99ac0@sha256:6e398316742b7aa4a93161dce4a23bc5c545700b862b43347b941000b112ec3e
```

> 💡 **Note**: Prior to v0.10, the command was called `ko publish` -- this is equivalent to `ko build`, and both commands will work and do the same thing.

The executable binary that was built from `./cmd/app` is available in the image at `/ko-app/app` -- the binary name matches the base import path name -- and that binary is the image's entrypoint.



================================================
FILE: docs/index.md
================================================
---
ko_meta: true
---

# Introduction

`ko` makes building Go container images easy, fast, and secure by default.

![Demo of ko build](./images/demo.png)

`ko` is a simple, fast container image builder for Go applications.

It's ideal for use cases where your image contains a single Go application without many dependencies on the OS base image (e.g., no cgo, no OS package dependencies).

`ko` builds images by executing `go build` on your local machine, and as such doesn't require `docker` to be installed.
This can make it a good fit for lightweight CI/CD use cases.

`ko` makes [multi-platform builds](https://ko.build/features/multi-platform/) easy, produces [SBOMs](https://ko.build/features/sboms/) by default, and includes support for simple YAML templating which makes it a powerful tool for [Kubernetes applications](https://ko.build/features/k8s/).

---

> 🏃 [Install `ko`](./install) and [get started](./get-started)!

---

`ko` is used and loved by these open source projects:

- [Knative](https://knative.dev)
- [Tekton](https://tekton.dev)
- [Karpenter](https://karpenter.sh)
- [Kyverno](https://kyverno.io)
- [Sigstore](https://sigstore.dev)
- [Shipwright](https://shipwright.io)
- [Capsule](https://capsule.clastix.io/)
- [CloudScript](https://cloudscript.com.br/)
- [Kamaji](https://kamaji.clastix.io/)

[_Add your project here!_](https://github.com/ko-build/ko/edit/main/docs/index.md)

---

`ko` is a Cloud Native Computing Foundation Sandbox project.

<a href="https://cncf.io">
    <img width=300 src="./images/cncf-light.svg#only-light" alt="CNCF logo" />
    <img width=300 src="./images/cncf-dark.svg#only-dark" alt="CNCF logo" />
</a>


================================================
FILE: docs/install.md
================================================
# Installation

### Install from [GitHub Releases](https://github.com/ko-build/ko/releases)

```
$ VERSION=TODO # choose the latest version (without v prefix)
$ OS=Linux     # or Darwin
$ ARCH=x86_64  # or arm64, i386, s390x
```

We generate [SLSA3 provenance](https://slsa.dev) using the OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator). To verify our release, install the verification tool from [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation) and verify as follows:


```shell
$ curl -sSfL "https://github.com/ko-build/ko/releases/download/v${VERSION}/ko_${VERSION}_${OS}_${ARCH}.tar.gz" > ko.tar.gz
$ curl -sSfL https://github.com/ko-build/ko/releases/download/v${VERSION}/multiple.intoto.jsonl > multiple.intoto.jsonl
$ slsa-verifier verify-artifact --provenance-path multiple.intoto.jsonl --source-uri github.com/ko-build/ko --source-tag "v${VERSION}" ko.tar.gz
Verified signature against tlog entry index 24413745 at URL: https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77ab97a5263b5fa8f35789618348a39358b1f9470b0c31045effbbe5e23e77a5836
Verified build using builder "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.7.0" at commit 200db7243f02b5c0303e21d8ab8e3b4ad3a229d0
Verifying artifact /Users/batuhanapaydin/workspace/ko/ko.tar.gz: PASSED

PASSED: Verified SLSA provenance
```

```shell
$ tar xzf ko.tar.gz ko
$ chmod +x ./ko
```

### Install using [Homebrew](https://brew.sh)

```plaintext
brew install ko
```

### Install using [MacPorts](https://www.macports.org)

```plaintext
sudo port install ko
```

More info [here](https://ports.macports.org/port/ko/)

### Install on Windows using [Scoop](https://scoop.sh)

```plaintext
scoop install ko
```

### Install on [Alpine Linux](https://www.alpinelinux.org)

Installation on Alpine requires using the [`testing` repository](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository#Using_testing_repositories)

```
echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories
apk update
apk add ko
```

### Build and Install from source

With Go 1.16+, build and install the latest released version:

```plaintext
go install github.com/google/ko@latest
```

### Setup on GitHub Actions

You can use the [setup-ko](https://github.com/ko-build/setup-ko) action to install ko and setup auth to [GitHub Container Registry](https://github.com/features/packages) in a GitHub Action workflow:

```plaintext
steps:
- uses: ko-build/setup-ko@v0.6
```


================================================
FILE: docs/reference/ko.md
================================================
## ko

Rapidly iterate with Go, Containers, and Kubernetes.

```
ko [flags]
```

### Options

```
  -h, --help      help for ko
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko apply](ko_apply.md)	 - Apply the input files with image references resolved to built/pushed image digests.
* [ko build](ko_build.md)	 - Build and publish container images from the given importpaths.
* [ko create](ko_create.md)	 - Create the input files with image references resolved to built/pushed image digests.
* [ko delete](ko_delete.md)	 - See "kubectl help delete" for detailed usage.
* [ko login](ko_login.md)	 - Log in to a registry
* [ko resolve](ko_resolve.md)	 - Print the input files with image references resolved to built/pushed image digests.
* [ko run](ko_run.md)	 - A variant of `kubectl run` that containerizes IMPORTPATH first.
* [ko version](ko_version.md)	 - Print ko version.



================================================
FILE: docs/reference/ko_apply.md
================================================
## ko apply

Apply the input files with image references resolved to built/pushed image digests.

### Synopsis

This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and then feeds the resulting yaml into "kubectl apply".

```
ko apply -f FILENAME [flags]
```

### Examples

```

  # Build and publish import path references to a Docker
  # Registry as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # Then, feed the resulting yaml into "kubectl apply".
  # When KO_DOCKER_REPO is ko.local, it is the same as if
  # --local was passed.
  ko apply -f config/

  # Build and publish import path references to a Docker
  # Registry preserving import path names as:
  #   ${KO_DOCKER_REPO}/<import path>
  # Then, feed the resulting yaml into "kubectl apply".
  ko apply --preserve-import-paths -f config/

  # Build and publish import path references to a Docker
  # daemon as:
  #   ko.local/<import path>
  # Then, feed the resulting yaml into "kubectl apply".
  ko apply --local -f config/

  # Apply from stdin:
  cat config.yaml | ko apply -f -

  # Any flags passed after '--' are passed to 'kubectl apply' directly:
  ko apply -f config -- --namespace=foo --kubeconfig=cfg.yaml

```

### Options

```
      --bare                       Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
  -B, --base-import-paths          Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
      --debug                      Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
      --disable-optimizations      Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
  -f, --filename strings           Filename, directory, or URL to files to use to create the resource
  -h, --help                       help for apply
      --image-annotation strings   Which annotations (key=value[,key=value]) to add to the OCI manifest.
      --image-label strings        Which labels (key=value[,key=value]) to add to the image.
      --image-refs string          Path to file where a list of the published image references will be written.
      --image-user string          The default user the image should be run as.
      --insecure-registry          Whether to skip TLS verification on the registry
  -j, --jobs int                   The maximum number of concurrent builds (default GOMAXPROCS)
  -L, --local                      Load into images to local docker daemon.
      --oci-layout-path string     Path to save the OCI image layout of the built images
      --platform strings           Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
  -P, --preserve-import-paths      Whether to preserve the full import path after KO_DOCKER_REPO.
      --push                       Push images to KO_DOCKER_REPO (default true)
  -R, --recursive                  Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
      --sbom string                The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
      --sbom-dir string            Path to file where the SBOM will be written.
  -l, --selector string            Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
      --tag-only                   Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
  -t, --tags strings               Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
      --tarball string             File to save images tarballs
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_build.md
================================================
## ko build

Build and publish container images from the given importpaths.

### Synopsis

This sub-command builds the provided import paths into Go binaries, containerizes them, and publishes them.

```
ko build IMPORTPATH... [flags]
```

### Examples

```

  # Build and publish import path references to a Docker Registry as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if --local and
  # --preserve-import-paths were passed.
  # If the import path is not provided, the current working directory is the
  # default.
  ko build github.com/foo/bar/cmd/baz github.com/foo/bar/cmd/blah

  # Build and publish a relative import path as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if --local and
  # --preserve-import-paths were passed.
  ko build ./cmd/blah

  # Build and publish a relative import path as:
  #   ${KO_DOCKER_REPO}/<import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if --local was passed.
  ko build --preserve-import-paths ./cmd/blah

  # Build and publish import path references to a Docker daemon as:
  #   ko.local/<import path>
  # This always preserves import paths.
  ko build --local github.com/foo/bar/cmd/baz github.com/foo/bar/cmd/blah
```

### Options

```
      --bare                       Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
  -B, --base-import-paths          Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
      --debug                      Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
      --disable-optimizations      Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
  -h, --help                       help for build
      --image-annotation strings   Which annotations (key=value[,key=value]) to add to the OCI manifest.
      --image-label strings        Which labels (key=value[,key=value]) to add to the image.
      --image-refs string          Path to file where a list of the published image references will be written.
      --image-user string          The default user the image should be run as.
      --insecure-registry          Whether to skip TLS verification on the registry
  -j, --jobs int                   The maximum number of concurrent builds (default GOMAXPROCS)
  -L, --local                      Load into images to local docker daemon.
      --oci-layout-path string     Path to save the OCI image layout of the built images
      --platform strings           Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
  -P, --preserve-import-paths      Whether to preserve the full import path after KO_DOCKER_REPO.
      --push                       Push images to KO_DOCKER_REPO (default true)
      --sbom string                The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
      --sbom-dir string            Path to file where the SBOM will be written.
      --tag-only                   Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
  -t, --tags strings               Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
      --tarball string             File to save images tarballs
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_create.md
================================================
## ko create

Create the input files with image references resolved to built/pushed image digests.

### Synopsis

This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and then feeds the resulting yaml into "kubectl create".

```
ko create -f FILENAME [flags]
```

### Examples

```

  # Build and publish import path references to a Docker
  # Registry as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # Then, feed the resulting yaml into "kubectl create".
  # When KO_DOCKER_REPO is ko.local, it is the same as if
  # --local was passed.
  ko create -f config/

  # Build and publish import path references to a Docker
  # Registry preserving import path names as:
  #   ${KO_DOCKER_REPO}/<import path>
  # Then, feed the resulting yaml into "kubectl create".
  ko create --preserve-import-paths -f config/

  # Build and publish import path references to a Docker
  # daemon as:
  #   ko.local/<import path>
  # Then, feed the resulting yaml into "kubectl create".
  ko create --local -f config/

  # Create from stdin:
  cat config.yaml | ko create -f -

  # Any flags passed after '--' are passed to 'kubectl apply' directly:
  ko apply -f config -- --namespace=foo --kubeconfig=cfg.yaml

```

### Options

```
      --bare                       Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
  -B, --base-import-paths          Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
      --debug                      Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
      --disable-optimizations      Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
  -f, --filename strings           Filename, directory, or URL to files to use to create the resource
  -h, --help                       help for create
      --image-annotation strings   Which annotations (key=value[,key=value]) to add to the OCI manifest.
      --image-label strings        Which labels (key=value[,key=value]) to add to the image.
      --image-refs string          Path to file where a list of the published image references will be written.
      --image-user string          The default user the image should be run as.
      --insecure-registry          Whether to skip TLS verification on the registry
  -j, --jobs int                   The maximum number of concurrent builds (default GOMAXPROCS)
  -L, --local                      Load into images to local docker daemon.
      --oci-layout-path string     Path to save the OCI image layout of the built images
      --platform strings           Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
  -P, --preserve-import-paths      Whether to preserve the full import path after KO_DOCKER_REPO.
      --push                       Push images to KO_DOCKER_REPO (default true)
  -R, --recursive                  Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
      --sbom string                The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
      --sbom-dir string            Path to file where the SBOM will be written.
  -l, --selector string            Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
      --tag-only                   Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
  -t, --tags strings               Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
      --tarball string             File to save images tarballs
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_delete.md
================================================
## ko delete

See "kubectl help delete" for detailed usage.

```
ko delete [flags]
```

### Options

```
  -h, --help   help for delete
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_login.md
================================================
## ko login

Log in to a registry

```
ko login [OPTIONS] [SERVER] [flags]
```

### Examples

```
  # Log in to reg.example.com
  ko login reg.example.com -u AzureDiamond -p hunter2
```

### Options

```
  -h, --help              help for login
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_resolve.md
================================================
## ko resolve

Print the input files with image references resolved to built/pushed image digests.

### Synopsis

This sub-command finds import path references within the provided files, builds them into Go binaries, containerizes them, publishes them, and prints the resulting yaml.

```
ko resolve -f FILENAME [flags]
```

### Examples

```

  # Build and publish import path references to a Docker
  # Registry as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if
  # --local and --preserve-import-paths were passed.
  ko resolve -f config/

  # Build and publish import path references to a Docker
  # Registry preserving import path names as:
  #   ${KO_DOCKER_REPO}/<import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if
  # --local was passed.
  ko resolve --preserve-import-paths -f config/

  # Build and publish import path references to a Docker
  # daemon as:
  #   ko.local/<import path>
  # This always preserves import paths.
  ko resolve --local -f config/
```

### Options

```
      --bare                       Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
  -B, --base-import-paths          Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
      --debug                      Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
      --disable-optimizations      Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
  -f, --filename strings           Filename, directory, or URL to files to use to create the resource
  -h, --help                       help for resolve
      --image-annotation strings   Which annotations (key=value[,key=value]) to add to the OCI manifest.
      --image-label strings        Which labels (key=value[,key=value]) to add to the image.
      --image-refs string          Path to file where a list of the published image references will be written.
      --image-user string          The default user the image should be run as.
      --insecure-registry          Whether to skip TLS verification on the registry
  -j, --jobs int                   The maximum number of concurrent builds (default GOMAXPROCS)
  -L, --local                      Load into images to local docker daemon.
      --oci-layout-path string     Path to save the OCI image layout of the built images
      --platform strings           Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
  -P, --preserve-import-paths      Whether to preserve the full import path after KO_DOCKER_REPO.
      --push                       Push images to KO_DOCKER_REPO (default true)
  -R, --recursive                  Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory.
      --sbom string                The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
      --sbom-dir string            Path to file where the SBOM will be written.
  -l, --selector string            Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
      --tag-only                   Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
  -t, --tags strings               Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
      --tarball string             File to save images tarballs
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_run.md
================================================
## ko run

A variant of `kubectl run` that containerizes IMPORTPATH first.

### Synopsis

This sub-command combines "ko build" and "kubectl run" to support containerizing and running Go binaries on Kubernetes in a single command.

```
ko run IMPORTPATH [flags]
```

### Examples

```

  # Publish the image and run it on Kubernetes as:
  #   ${KO_DOCKER_REPO}/<package name>-<hash of import path>
  # When KO_DOCKER_REPO is ko.local, it is the same as if
  # --local and --preserve-import-paths were passed.
  ko run github.com/foo/bar/cmd/baz

  # This supports relative import paths as well.
  ko run ./cmd/baz

  # You can also supply args and flags to the command.
  ko run ./cmd/baz -- -v arg1 arg2 --yes
```

### Options

```
      --bare                       Whether to just use KO_DOCKER_REPO without additional context (may not work properly with --tags).
  -B, --base-import-paths          Whether to use the base path without MD5 hash after KO_DOCKER_REPO (may not work properly with --tags).
      --debug                      Include Delve debugger into image and wrap around ko-app. This debugger will listen to port 40000.
      --disable-optimizations      Disable optimizations when building Go code. Useful when you want to interactively debug the created container.
  -h, --help                       help for run
      --image-annotation strings   Which annotations (key=value[,key=value]) to add to the OCI manifest.
      --image-label strings        Which labels (key=value[,key=value]) to add to the image.
      --image-refs string          Path to file where a list of the published image references will be written.
      --image-user string          The default user the image should be run as.
      --insecure-registry          Whether to skip TLS verification on the registry
  -j, --jobs int                   The maximum number of concurrent builds (default GOMAXPROCS)
  -L, --local                      Load into images to local docker daemon.
      --oci-layout-path string     Path to save the OCI image layout of the built images
      --platform strings           Which platform to use when pulling a multi-platform base. Format: all | <os>[/<arch>[/<variant>]][,platform]*
  -P, --preserve-import-paths      Whether to preserve the full import path after KO_DOCKER_REPO.
      --push                       Push images to KO_DOCKER_REPO (default true)
      --sbom string                The SBOM media type to use (none will disable SBOM synthesis and upload). (default "spdx")
      --sbom-dir string            Path to file where the SBOM will be written.
      --tag-only                   Include tags but not digests in resolved image references. Useful when digests are not preserved when images are repopulated.
  -t, --tags strings               Which tags to use for the produced image instead of the default 'latest' tag (may not work properly with --base-import-paths or --bare). (default [latest])
      --tarball string             File to save images tarballs
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: docs/reference/ko_version.md
================================================
## ko version

Print ko version.

```
ko version [flags]
```

### Options

```
  -h, --help   help for version
```

### Options inherited from parent commands

```
  -v, --verbose   Enable debug logs
```

### SEE ALSO

* [ko](ko.md)	 - Rapidly iterate with Go, Containers, and Kubernetes.



================================================
FILE: go.mod
================================================
module github.com/google/ko

go 1.25.7

require (
	github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0
	github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589
	github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d
	github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b
	github.com/go-viper/mapstructure/v2 v2.5.0
	github.com/google/go-cmp v0.7.0
	github.com/google/go-containerregistry v0.21.3
	github.com/moby/moby/api v1.54.0
	github.com/moby/moby/client v0.3.0
	github.com/opencontainers/image-spec v1.1.1
	github.com/sigstore/cosign/v3 v3.0.5
	github.com/spf13/cobra v1.10.2
	github.com/spf13/viper v1.21.0
	github.com/stretchr/testify v1.11.1
	go.uber.org/automaxprocs v1.6.0
	go.yaml.in/yaml/v4 v4.0.0-rc.4
	golang.org/x/sync v0.20.0
	golang.org/x/tools v0.43.0
	k8s.io/apimachinery v0.35.3
	sigs.k8s.io/kind v0.31.0
)

require (
	al.essio.dev/pkg/shellescape v1.6.0 // indirect
	cloud.google.com/go/compute/metadata v0.9.0 // indirect
	github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
	github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
	github.com/Azure/go-autorest v14.2.0+incompatible // indirect
	github.com/Azure/go-autorest/autorest v0.11.30 // indirect
	github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect
	github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect
	github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect
	github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect
	github.com/Azure/go-autorest/logger v0.2.2 // indirect
	github.com/Azure/go-autorest/tracing v0.6.1 // indirect
	github.com/BurntSushi/toml v1.6.0 // indirect
	github.com/Microsoft/go-winio v0.6.2 // indirect
	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
	github.com/aws/aws-sdk-go-v2 v1.41.3 // indirect
	github.com/aws/aws-sdk-go-v2/config v1.32.11 // indirect
	github.com/aws/aws-sdk-go-v2/credentials v1.19.11 // indirect
	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 // indirect
	github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect
	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect
	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect
	github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0 // indirect
	github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11 // indirect
	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect
	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect
	github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect
	github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect
	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect
	github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 // indirect
	github.com/aws/smithy-go v1.24.2 // indirect
	github.com/blang/semver v3.5.1+incompatible // indirect
	github.com/cenkalti/backoff/v5 v5.0.3 // indirect
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
	github.com/containerd/errdefs v1.0.0 // indirect
	github.com/containerd/errdefs/pkg v0.3.0 // indirect
	github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect
	github.com/coreos/go-oidc/v3 v3.17.0 // indirect
	github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
	github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
	github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c // indirect
	github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea // indirect
	github.com/dimchansky/utfbom v1.1.1 // indirect
	github.com/distribution/reference v0.6.0 // indirect
	github.com/docker/cli v29.3.0+incompatible // indirect
	github.com/docker/distribution v2.8.3+incompatible // indirect
	github.com/docker/docker-credential-helpers v0.9.5 // indirect
	github.com/docker/go-connections v0.6.0 // indirect
	github.com/docker/go-units v0.5.0 // indirect
	github.com/dustin/go-humanize v1.0.1 // indirect
	github.com/evanphx/json-patch/v5 v5.9.11 // indirect
	github.com/felixge/httpsnoop v1.0.4 // indirect
	github.com/fsnotify/fsnotify v1.9.0 // indirect
	github.com/go-jose/go-jose/v4 v4.1.3 // indirect
	github.com/go-logr/logr v1.4.3 // indirect
	github.com/go-logr/stdr v1.2.2 // indirect
	github.com/go-openapi/analysis v0.24.3 // indirect
	github.com/go-openapi/errors v0.22.7 // indirect
	github.com/go-openapi/jsonpointer v0.22.5 // indirect
	github.com/go-openapi/jsonreference v0.21.5 // indirect
	github.com/go-openapi/loads v0.23.3 // indirect
	github.com/go-openapi/runtime v0.29.3 // indirect
	github.com/go-openapi/spec v0.22.4 // indirect
	github.com/go-openapi/strfmt v0.26.0 // indirect
	github.com/go-openapi/swag v0.25.5 // indirect
	github.com/go-openapi/swag/cmdutils v0.25.5 // indirect
	github.com/go-openapi/swag/conv v0.25.5 // indirect
	github.com/go-openapi/swag/fileutils v0.25.5 // indirect
	github.com/go-openapi/swag/jsonname v0.25.5 // indirect
	github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
	github.com/go-openapi/swag/loading v0.25.5 // indirect
	github.com/go-openapi/swag/mangling v0.25.5 // indirect
	github.com/go-openapi/swag/netutils v0.25.5 // indirect
	github.com/go-openapi/swag/stringutils v0.25.5 // indirect
	github.com/go-openapi/swag/typeutils v0.25.5 // indirect
	github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
	github.com/go-openapi/validate v0.25.2 // indirect
	github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
	github.com/google/certificate-transparency-go v1.3.3 // indirect
	github.com/google/uuid v1.6.0 // indirect
	github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
	github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
	github.com/in-toto/attestation v1.1.2 // indirect
	github.com/in-toto/in-toto-golang v0.10.0 // indirect
	github.com/inconshreveable/mousetrap v1.1.0 // indirect
	github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 // indirect
	github.com/klauspost/compress v1.18.4 // indirect
	github.com/letsencrypt/boulder v0.20251208.0 // indirect
	github.com/mattn/go-isatty v0.0.20 // indirect
	github.com/mitchellh/go-homedir v1.1.0 // indirect
	github.com/moby/docker-image-spec v1.3.1 // indirect
	github.com/moby/term v0.5.2 // indirect
	github.com/oklog/ulid/v2 v2.1.1 // indirect
	github.com/opencontainers/go-digest v1.0.0 // indirect
	github.com/pelletier/go-toml v1.9.5 // indirect
	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
	github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
	github.com/pkg/errors v0.9.1 // indirect
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
	github.com/russross/blackfriday/v2 v2.1.0 // indirect
	github.com/sagikazarmark/locafero v0.12.0 // indirect
	github.com/sassoftware/relic v7.2.1+incompatible // indirect
	github.com/secure-systems-lab/go-securesystemslib v0.10.0 // indirect
	github.com/shibumi/go-pathspec v1.3.0 // indirect
	github.com/sigstore/protobuf-specs v0.5.0 // indirect
	github.com/sigstore/rekor v1.5.1 // indirect
	github.com/sigstore/rekor-tiles/v2 v2.2.1 // indirect
	github.com/sigstore/sigstore v1.10.4 // indirect
	github.com/sigstore/sigstore-go v1.1.4 // indirect
	github.com/sigstore/timestamp-authority/v2 v2.0.5 // indirect
	github.com/sirupsen/logrus v1.9.4 // indirect
	github.com/spf13/afero v1.15.0 // indirect
	github.com/spf13/cast v1.10.0 // indirect
	github.com/spf13/pflag v1.0.10 // indirect
	github.com/subosito/gotenv v1.6.0 // indirect
	github.com/theupdateframework/go-tuf v0.7.0 // indirect
	github.com/theupdateframework/go-tuf/v2 v2.4.1 // indirect
	github.com/transparency-dev/formats v0.1.0 // indirect
	github.com/transparency-dev/merkle v0.0.2 // indirect
	github.com/vbatts/tar-split v0.12.2 // indirect
	go.opentelemetry.io/auto/sdk v1.2.1 // indirect
	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 // indirect
	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
	go.opentelemetry.io/otel v1.42.0 // indirect
	go.opentelemetry.io/otel/metric v1.42.0 // indirect
	go.opentelemetry.io/otel/trace v1.42.0 // indirect
	go.yaml.in/yaml/v2 v2.4.4 // indirect
	go.yaml.in/yaml/v3 v3.0.4 // indirect
	golang.org/x/crypto v0.49.0 // indirect
	golang.org/x/mod v0.34.0 // indirect
	golang.org/x/net v0.52.0 // indirect
	golang.org/x/oauth2 v0.36.0 // indirect
	golang.org/x/sys v0.42.0 // indirect
	golang.org/x/term v0.41.0 // indirect
	golang.org/x/text v0.35.0 // indirect
	google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c // indirect
	google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect
	google.golang.org/grpc v1.79.3 // indirect
	google.golang.org/protobuf v1.36.11 // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
	k8s.io/klog/v2 v2.140.0 // indirect
	k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect
	sigs.k8s.io/yaml v1.6.0 // indirect
)


================================================
FILE: go.sum
================================================
al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=
al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM=
cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
cloud.google.com/go/kms v1.25.0 h1:gVqvGGUmz0nYCmtoxWmdc1wli2L1apgP8U4fghPGSbQ=
cloud.google.com/go/kms v1.25.0/go.mod h1:XIdHkzfj0bUO3E+LvwPg+oc7s58/Ns8Nd8Sdtljihbk=
cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8=
cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk=
filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=
filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=
github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0 h1:E4MgwLBGeVB5f2MdcIVD3ELVAWpr+WD6MUe1i+tM/PA=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0/go.mod h1:Y2b/1clN4zsAoUd/pgNAQHjLDnTis/6ROkUfyob6psM=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA=
github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE=
github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs=
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk=
github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4=
github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM=
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 h1:Q9R3utmFg9K1B4OYtAZ7ZUUvIUdzQt7G2MN5Hi/d670=
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7/go.mod h1:bVrAueELJ0CKLBpUHDIvD516TwmHmzqwCpvONWRsw3s=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/date v0.3.1 h1:o9Z8Jyt+VJJTCZ/UORishuHOusBwolhjokt9s5k8I4w=
github.com/Azure/go-autorest/autorest/date v0.3.1/go.mod h1:Dz/RDmXlfiFFS/eW+b/xMUSFs1tboPVy6UjgADToWDM=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/logger v0.2.2 h1:hYqBsEBywrrOSW24kkOCXRcKfKhK76OzLTfF+MYDE2o=
github.com/Azure/go-autorest/logger v0.2.2/go.mod h1:I5fg9K52o+iuydlWfa9T5K6WFos9XYr9dYTFzpqgibw=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/Azure/go-autorest/tracing v0.6.1 h1:YUMSrC/CeD1ZnnXcNYU4a/fzsO35u2Fsful9L/2nyR0=
github.com/Azure/go-autorest/tracing v0.6.1/go.mod h1:/3EgjbsjraOqiicERAeu3m7/z0x1TzjQGAwDrJrXGkc=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA=
github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
github.com/aws/aws-sdk-go-v2/config v1.32.11 h1:ftxI5sgz8jZkckuUHXfC/wMUc8u3fG1vQS0plr2F2Zs=
github.com/aws/aws-sdk-go-v2/config v1.32.11/go.mod h1:twF11+6ps9aNRKEDimksp923o44w/Thk9+8YIlzWMmo=
github.com/aws/aws-sdk-go-v2/credentials v1.19.11 h1:NdV8cwCcAXrCWyxArt58BrvZJ9pZ9Fhf9w6Uh5W3Uyc=
github.com/aws/aws-sdk-go-v2/credentials v1.19.11/go.mod h1:30yY2zqkMPdrvxBqzI9xQCM+WrlrZKSOpSJEsylVU+8=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 h1:INUvJxmhdEbVulJYHI061k4TVuS3jzzthNvjqvVvTKM=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19/go.mod h1:FpZN2QISLdEBWkayloda+sZjVJL+e9Gl0k1SyTgcswU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 h1:clHU5fm//kWS1C2HgtgWxfQbFbx4b6rx+5jzhgX9HrI=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0 h1:XxNya31nOtsClGghvQ2VkhIB2S/rggb64x5vkHl4xZQ=
github.com/aws/aws-sdk-go-v2/service/ecr v1.56.0/go.mod h1:T+Tz2Xp1gnvtlgvP7OyRHlr84KtI3fZW5Ax/e+s9b64=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11 h1:2T9NCuNzzBh6RUrwYZBFl1D9lLJ2r2CCbg7w383DjQE=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.38.11/go.mod h1:FkD34cqOmnqfAEiNHeqOT50SoXqHEgdDsa8BrMw9t+w=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA=
github.com/aws/aws-sdk-go-v2/service/kms v1.49.5 h1:DKibav4XF66XSeaXcrn9GlWGHos6D/vJ4r7jsK7z5CE=
github.com/aws/aws-sdk-go-v2/service/kms v1.49.5/go.mod h1:1SdcmEGUEQE1mrU2sIgeHtcMSxHuybhPvuEPANzIDfI=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 h1:Y2cAXlClHsXkkOvWZFXATr34b0hxxloeQu/pAZz2row=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.7/go.mod h1:idzZ7gmDeqeNrSPkdbtMp9qWMgcBwykA7P7Rzh5DXVU=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 h1:iSsvB9EtQ09YrsmIc44Heqlx5ByGErqhPK1ZQLppias=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.12/go.mod h1:fEWYKTRGoZNl8tZ77i61/ccwOMJdGxwOhWCkp6TXAr0=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 h1:EnUdUqRP1CNzt2DkV67tJx6XDN4xlfBFm+bzeNOQVb0=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16/go.mod h1:Jic/xv0Rq/pFNCh3WwpH4BEqdbSAl+IyHro8LbibHD8=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 h1:XQTQTF75vnug2TXS8m7CVJfC2nniYPZnO1D4Np761Oo=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.8/go.mod h1:Xgx+PR1NUOjNmQY+tRMnouRp83JRM8pRMw/vCaVhPkI=
github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0 h1:JFWXO6QPihCknDdnL6VaQE57km4ZKheHIGd9YiOGcTo=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0/go.mod h1:046/oLyFlYdAghYQE2yHXi/E//VM5Cf3/dFmA+3CZ0c=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4=
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589/go.mod h1:OuDyvmLnMCwa2ep4Jkm6nyA0ocJuZlGyk2gGseVzERM=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE=
github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw=
github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY=
github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=
github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q=
github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw=
github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ=
github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/digitorus/pkcs7 v0.0.0-20230713084857-e76b763bdc49/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc=
github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c h1:g349iS+CtAvba7i0Ee9EP1TlTZ9w+UncBY6HSmsFZa0=
github.com/digitorus/pkcs7 v0.0.0-20250730155240-ffadbf3f398c/go.mod h1:mCGGmWkOQvEuLdIRfPIpXViBfpWto4AhwtJlAvo62SQ=
github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea h1:ALRwvjsSP53QmnN3Bcj0NpR8SsFLnskny/EIMebAk1c=
github.com/digitorus/timestamp v0.0.0-20250524132541-c45532741eea/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/docker/cli v29.3.0+incompatible h1:z3iWveU7h19Pqx7alZES8j+IeFQZ1lhTwb2F+V9SVvk=
github.com/docker/cli v29.3.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY=
github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c=
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d h1:/USl0X37Afc2SyjRG4/eNrbm4CZRfZLdzwTy9YXxowA=
github.com/dprotaso/go-yit v0.0.0-20260209000607-dfb86291624d/go.mod h1:k03zg0AFMepR2TrssNeMUISoI0QcX2N58Sl0qPU6MZs=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec=
github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug=
github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/analysis v0.24.3 h1:a1hrvMr8X0Xt69KP5uVTu5jH62DscmDifrLzNglAayk=
github.com/go-openapi/analysis v0.24.3/go.mod h1:Nc+dWJ/FxZbhSow5Yh3ozg5CLJioB+XXT6MdLvJUsUw=
github.com/go-openapi/errors v0.22.7 h1:JLFBGC0Apwdzw3484MmBqspjPbwa2SHvpDm0u5aGhUA=
github.com/go-openapi/errors v0.22.7/go.mod h1://QW6SD9OsWtH6gHllUCddOXDL0tk0ZGNYHwsw4sW3w=
github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA=
github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0=
github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE=
github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw=
github.com/go-openapi/loads v0.23.3 h1:g5Xap1JfwKkUnZdn+S0L3SzBDpcTIYzZ5Qaag0YDkKQ=
github.com/go-openapi/loads v0.23.3/go.mod h1:NOH07zLajXo8y55hom0omlHWDVVvCwBM/S+csCK8LqA=
github.com/go-openapi/runtime v0.29.3 h1:h5twGaEqxtQg40ePiYm9vFFH1q06Czd7Ot6ufdK0w/Y=
github.com/go-openapi/runtime v0.29.3/go.mod h1:8A1W0/L5eyNJvKciqZtvIVQvYO66NlB7INMSZ9bw/oI=
github.com/go-openapi/spec v0.22.4 h1:4pxGjipMKu0FzFiu/DPwN3CTBRlVM2yLf/YTWorYfDQ=
github.com/go-openapi/spec v0.22.4/go.mod h1:WQ6Ai0VPWMZgMT4XySjlRIE6GP1bGQOtEThn3gcWLtQ=
github.com/go-openapi/strfmt v0.26.0 h1:SDdQLyOEqu8W96rO1FRG1fuCtVyzmukky0zcD6gMGLU=
github.com/go-openapi/strfmt v0.26.0/go.mod h1:Zslk5VZPOISLwmWTMBIS7oiVFem1o1EI6zULY8Uer7Y=
github.com/go-openapi/swag v0.25.5 h1:pNkwbUEeGwMtcgxDr+2GBPAk4kT+kJ+AaB+TMKAg+TU=
github.com/go-openapi/swag v0.25.5/go.mod h1:B3RT6l8q7X803JRxa2e59tHOiZlX1t8viplOcs9CwTA=
github.com/go-openapi/swag/cmdutils v0.25.5 h1:yh5hHrpgsw4NwM9KAEtaDTXILYzdXh/I8Whhx9hKj7c=
github.com/go-openapi/swag/cmdutils v0.25.5/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=
github.com/go-openapi/swag/conv v0.25.5 h1:wAXBYEXJjoKwE5+vc9YHhpQOFj2JYBMF2DUi+tGu97g=
github.com/go-openapi/swag/conv v0.25.5/go.mod h1:CuJ1eWvh1c4ORKx7unQnFGyvBbNlRKbnRyAvDvzWA4k=
github.com/go-openapi/swag/fileutils v0.25.5 h1:B6JTdOcs2c0dBIs9HnkyTW+5gC+8NIhVBUwERkFhMWk=
github.com/go-openapi/swag/fileutils v0.25.5/go.mod h1:V3cT9UdMQIaH4WiTrUc9EPtVA4txS0TOmRURmhGF4kc=
github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo=
github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU=
github.com/go-openapi/swag/jsonutils v0.25.5 h1:XUZF8awQr75MXeC+/iaw5usY/iM7nXPDwdG3Jbl9vYo=
github.com/go-openapi/swag/jsonutils v0.25.5/go.mod h1:48FXUaz8YsDAA9s5AnaUvAmry1UcLcNVWUjY42XkrN4=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5 h1:SX6sE4FrGb4sEnnxbFL/25yZBb5Hcg1inLeErd86Y1U=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.5/go.mod h1:/2KvOTrKWjVA5Xli3DZWdMCZDzz3uV/T7bXwrKWPquo=
github.com/go-openapi/swag/loading v0.25.5 h1:odQ/umlIZ1ZVRteI6ckSrvP6e2w9UTF5qgNdemJHjuU=
github.com/go-openapi/swag/loading v0.25.5/go.mod h1:I8A8RaaQ4DApxhPSWLNYWh9NvmX2YKMoB9nwvv6oW6g=
github.com/go-openapi/swag/mangling v0.25.5 h1:hyrnvbQRS7vKePQPHHDso+k6CGn5ZBs5232UqWZmJZw=
github.com/go-openapi/swag/mangling v0.25.5/go.mod h1:6hadXM/o312N/h98RwByLg088U61TPGiltQn71Iw0NY=
github.com/go-openapi/swag/netutils v0.25.5 h1:LZq2Xc2QI8+7838elRAaPCeqJnHODfSyOa7ZGfxDKlU=
github.com/go-openapi/swag/netutils v0.25.5/go.mod h1:lHbtmj4m57APG/8H7ZcMMSWzNqIQcu0RFiXrPUara14=
github.com/go-openapi/swag/stringutils v0.25.5 h1:NVkoDOA8YBgtAR/zvCx5rhJKtZF3IzXcDdwOsYzrB6M=
github.com/go-openapi/swag/stringutils v0.25.5/go.mod h1:PKK8EZdu4QJq8iezt17HM8RXnLAzY7gW0O1KKarrZII=
github.com/go-openapi/swag/typeutils v0.25.5 h1:EFJ+PCga2HfHGdo8s8VJXEVbeXRCYwzzr9u4rJk7L7E=
github.com/go-openapi/swag/typeutils v0.25.5/go.mod h1:itmFmScAYE1bSD8C4rS0W+0InZUBrB2xSPbWt6DLGuc=
github.com/go-openapi/swag/yamlutils v0.25.5 h1:kASCIS+oIeoc55j28T4o8KwlV2S4ZLPT6G0iq2SSbVQ=
github.com/go-openapi/swag/yamlutils v0.25.5/go.mod h1:Gek1/SjjfbYvM+Iq4QGwa/2lEXde9n2j4a3wI3pNuOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1 h1:NZOrZmIb6PTv5LTFxr5/mKV/FjbUzGE7E6gLz7vFoOQ=
github.com/go-openapi/testify/enable/yaml/v2 v2.4.1/go.mod h1:r7dwsujEHawapMsxA69i+XMGZrQ5tRauhLAjV/sxg3Q=
github.com/go-openapi/testify/v2 v2.4.1 h1:zB34HDKj4tHwyUQHrUkpV0Q0iXQ6dUCOQtIqn8hE6Iw=
github.com/go-openapi/testify/v2 v2.4.1/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=
github.com/go-openapi/validate v0.25.2 h1:12NsfLAwGegqbGWr2CnvT65X/Q2USJipmJ9b7xDJZz0=
github.com/go-openapi/validate v0.25.2/go.mod h1:Pgl1LpPPGFnZ+ys4/hTlDiRYQdI1ocKypgE+8Q8BLfY=
github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA=
github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b h1:0pOrjn0UzTcHdhDVdxrH8LwM7QLnAp8qiUtwXM04JEE=
github.com/go-training/helloworld v0.0.0-20200225145412-ba5f4379d78b/go.mod h1:hGGmX3bRUkYkc9aKA6mkUxi6d+f1GmZF1je0FlVTgwU=
github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/certificate-transparency-go v1.3.3 h1:hq/rSxztSkXN2tx/3jQqF6Xc0O565UQPdHrOWvZwybo=
github.com/google/certificate-transparency-go v1.3.3/go.mod h1:iR17ZgSaXRzSa5qvjFl8TnVD5h8ky2JMVio+dzoKMgA=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/go-containerregistry v0.21.3 h1:Xr+yt3VvwOOn/5nJzd7UoOhwPGiPkYW0zWDLLUXqAi4=
github.com/google/go-containerregistry v0.21.3/go.mod h1:D5ZrJF1e6dMzvInpBPuMCX0FxURz7GLq2rV3Us9aPkc=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/trillian v1.7.2 h1:EPBxc4YWY4Ak8tcuhyFleY+zYlbCDCa4Sn24e1Ka8Js=
github.com/google/trillian v1.7.2/go.mod h1:mfQJW4qRH6/ilABtPYNBerVJAJ/upxHLX81zxNQw05s=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.12 h1:Fg+zsqzYEs1ZnvmcztTYxhgCBsx3eEhEwQ1W/lHq/sQ=
github.com/googleapis/enterprise-certificate-proxy v0.3.12/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg=
github.com/googleapis/gax-go/v2 v2.17.0 h1:RksgfBpxqff0EZkDWYuz9q/uWsTVz+kf43LsZ1J6SMc=
github.com/googleapis/gax-go/v2 v2.17.0/go.mod h1:mzaqghpQp4JDh3HvADwrat+6M3MOIDp5YKHhb9PAgDY=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM=
github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts=
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4=
github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=
github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I=
github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=
github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0=
github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM=
github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM=
github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
github.com/in-toto/attestation v1.1.2 h1:MBFn6lsMq6dptQZJBhalXTcWMb/aJy3V+GX3VYj/V1E=
github.com/in-toto/attestation v1.1.2/go.mod h1:gYFddHMZj3DiQ0b62ltNi1Vj5rC879bTmBbrv9CRHpM=
github.com/in-toto/in-toto-golang v0.10.0 h1:+s2eZQSK3WmWfYV85qXVSBfqgawi/5L02MaqA4o/tpM=
github.com/in-toto/in-toto-golang v0.10.0/go.mod h1:wjT4RiyFlLWCmLUJjwB8oZcjaq7HA390aMJcD3xXgmg=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.8.0 h1:TYPDoleBBme0xGSAX3/+NujXXtpZn9HBONkQC7IEZSo=
github.com/jackc/pgx/v5 v5.8.0/go.mod h1:QVeDInX2m9VyzvNeiCJVjCkNFqzsNb43204HshNSZKw=
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic=
github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk=
github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY=
github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY=
github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c=
github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/letsencrypt/boulder v0.20251208.0 h1:rG1V+1Oiy8H7i6kSf85RwXeZZ8q2Vj65dbsSk88J7wI=
github.com/letsencrypt/boulder v0.20251208.0/go.mod h1:Wi99CY9yzFg4yaHamFCBIScvY8KOcBUe1rlPjUZNTJM=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE=
github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/moby/api v1.54.0 h1:7kbUgyiKcoBhm0UrWbdrMs7RX8dnwzURKVbZGy2GnL0=
github.com/moby/moby/api v1.54.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc=
github.com/moby/moby/client v0.3.0 h1:UUGL5okry+Aomj3WhGt9Aigl3ZOxZGqR7XPo+RLPlKs=
github.com/moby/moby/client v0.3.0/go.mod h1:HJgFbJRvogDQjbM8fqc1MCEm4mIAGMLjXbgwoZp6jCQ=
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=
github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/oklog/ulid/v2 v2.1.1 h1:suPZ4ARWLOJLegGFiZZ1dFAkqzhMjL3J1TzI+5wHz8s=
github.com/oklog/ulid/v2 v2.1.1/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28=
github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A=
github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk=
github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4=
github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k=
github.com/secure-systems-lab/go-securesystemslib v0.10.0 h1:l+H5ErcW0PAehBNrBxoGv1jjNpGYdZ9RcheFkB2WI14=
github.com/secure-systems-lab/go-securesystemslib v0.10.0/go.mod h1:MRKONWmRoFzPNQ9USRF9i1mc7MvAVvF1LlW8X5VWDvk=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI=
github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE=
github.com/sigstore/cosign/v3 v3.0.5 h1:c1zPqjU+H4wmirgysC+AkWMg7a7fykyOYF/m+F1150I=
github.com/sigstore/cosign/v3 v3.0.5/go.mod h1:ble1vMvJagCFyTIDkibCq6MIHiWDw00JNYl0f9rB4T4=
github.com/sigstore/protobuf-specs v0.5.0 h1:F8YTI65xOHw70NrvPwJ5PhAzsvTnuJMGLkA4FIkofAY=
github.com/sigstore/protobuf-specs v0.5.0/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc=
github.com/sigstore/rekor v1.5.1 h1:Ca1egHRWRuDvXV4tZu9aXEXc3Gej9FG+HKeapV9OAMQ=
github.com/sigstore/rekor v1.5.1/go.mod h1:gTLDuZuo3SyQCuZvKqwRPA79Qo/2rw39/WtLP/rZjUQ=
github.com/sigstore/rekor-tiles/v2 v2.2.1 h1:UmV1CBQ3SjxxPGpFmwDoOhoIwiKpM2Qm1pU5tPGmvNk=
github.com/sigstore/rekor-tiles/v2 v2.2.1/go.mod h1:z8n6l6oidpaLjjE6rJERuQqY9X38ulnHZCXyL+DEL7U=
github.com/sigstore/sigstore v1.10.4 h1:ytOmxMgLdcUed3w1SbbZOgcxqwMG61lh1TmZLN+WeZE=
github.com/sigstore/sigstore v1.10.4/go.mod h1:tDiyrdOref3q6qJxm2G+JHghqfmvifB7hw+EReAfnbI=
github.com/sigstore/sigstore-go v1.1.4 h1:wTTsgCHOfqiEzVyBYA6mDczGtBkN7cM8mPpjJj5QvMg=
github.com/sigstore/sigstore-go v1.1.4/go.mod h1:2U/mQOT9cjjxrtIUeKDVhL+sHBKsnWddn8URlswdBsg=
github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.4 h1:VZ+L6SKVWbLPHznIF0tBuO7qKMFdJiJMVwFKu9DlY5o=
github.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.4/go.mod h1:Rstj47WpJym25il8j4jTL0BfikzP/9AhVD+DsBcYzZc=
github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.4 h1:G7yOv8bxk3zIEEZyVCixPxtePIAm+t3ZWSaKRPzVw+o=
github.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.4/go.mod h1:hxJelB/bRItMYOzi6qD9xEKjse2QZcikh4TbysfdDHc=
github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.4 h1:Qxt6dE4IwhJ6gIXmg2q4S/SeqEDSZ29nmfsv7Zb6LL4=
github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.4/go.mod h1:hJVeNOwarqfyALjOwsf0OR8YA/A96NABucEaQumPr30=
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.4 h1:KVavYMPfSf5NryOl6VrZ9nRG3fXOOJOPp7Czk/YCPkM=
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.4/go.mod h1:J7CA1AaBkyK8dYq6EdQANhj+8oEcsA7PrIp088qgPiY=
github.com/sigstore/timestamp-authority/v2 v2.0.5 h1:WT17MU4bNRvjRLlTvTO5gmrSIWJVbzwrNXgwsjB+53U=
github.com/sigstore/timestamp-authority/v2 v2.0.5/go.mod h1:oV+Yy0GsfgNAeDZcv/WJjQE42wFtMTtuD85bPLAQk5M=
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI=
github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug=
github.com/theupdateframework/go-tuf/v2 v2.4.1 h1:K6ewW064rKZCPkRo1W/CTbTtm/+IB4+coG1iNURAGCw=
github.com/theupdateframework/go-tuf/v2 v2.4.1/go.mod h1:Nex2enPVYDFCklrnbTzl3OVwD7fgIAj0J5++z/rvCj8=
github.com/tink-crypto/tink-go-awskms/v2 v2.1.0 h1:N9UxlsOzu5mttdjhxkDLbzwtEecuXmlxZVo/ds7JKJI=
github.com/tink-crypto/tink-go-awskms/v2 v2.1.0/go.mod h1:PxSp9GlOkKL9rlybW804uspnHuO9nbD98V/fDX4uSis=
github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0 h1:3B9i6XBXNTRspfkTC0asN5W0K6GhOSgcujNiECNRNb0=
github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0/go.mod h1:jY5YN2BqD/KSCHM9SqZPIpJNG/u3zwfLXHgws4x2IRw=
github.com/tink-crypto/tink-go-hcvault/v2 v2.4.0 h1:j+S+WKBQ5ya26A5EM/uXoVe+a2IaPQN8KgBJZ22cJ+4=
github.com/tink-crypto/tink-go-hcvault/v2 v2.4.0/go.mod h1:OCKJIujnTzDq7f+73NhVs99oA2c1TR6nsOpuasYM6Yo=
github.com/tink-crypto/tink-go/v2 v2.6.0 h1:+KHNBHhWH33Vn+igZWcsgdEPUxKwBMEe0QC60t388v4=
github.com/tink-crypto/tink-go/v2 v2.6.0/go.mod h1:2WbBA6pfNsAfBwDCggboaHeB2X29wkU8XHtGwh2YIk8=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=
github.com/transparency-dev/formats v0.1.0 h1:oL0zUFuYUjg8AbtjPMnIRDmjbaHo5jCjEWU5yaNuz0g=
github.com/transparency-dev/formats v0.1.0/go.mod h1:d2FibUOHfCMdCe/+/rbKt1IPLBbPTDfwj46kt541/mU=
github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4=
github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A=
github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4=
github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=
github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns=
github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
github.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=
github.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=
github.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=
github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=
github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=
github.com/ysmood/leakless v0.9.0 h1:qxCG5VirSBvmi3uynXFkcnLMzkphdh3xx5FtrORwDCU=
github.com/ysmood/leakless v0.9.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0 h1:RN3ifU8y4prNWeEnQp2kRRHz8UwonAEYZl8tUzHEXAk=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.64.0/go.mod h1:habDz3tEWiFANTo6oUE99EmaFUrCNYAAg3wiVmusm70=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 h1:OyrsyzuttWTSur2qN/Lm0m2a8yqyIjUVBZcxFPuXq2o=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0/go.mod h1:C2NGBr+kAB4bk3xtMXfZ94gqFDtg/GkI7e9zqGh5Beg=
go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
go.opentelemetry.io/otel/sdk v1.42.0 h1:LyC8+jqk6UJwdrI/8VydAq/hvkFKNHZVIWuslJXYsDo=
go.opentelemetry.io/otel/sdk v1.42.0/go.mod h1:rGHCAxd9DAph0joO4W6OPwxjNTYWghRWmkHuGbayMts=
go.opentelemetry.io/otel/sdk/metric v1.42.0 h1:D/1QR46Clz6ajyZ3G8SgNlTJKBdGp84q9RKCAZ3YGuA=
go.opentelemetry.io/otel/sdk/metric v1.42.0/go.mod h1:Ua6AAlDKdZ7tdvaQKfSmnFTdHx37+J4ba8MwVCYM5hc=
go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY=
go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc=
go.step.sm/crypto v0.76.2 h1:JJ/yMcs/rmcCAwlo+afrHjq74XBFRTJw5B2y4Q4Z4c4=
go.step.sm/crypto v0.76.2/go.mod h1:m6KlB/HzIuGFep0UWI5e0SYi38UxpoKeCg6qUaHV6/Q=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=
go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
go.yaml.in/yaml/v4 v4.0.0-rc.4 h1:UP4+v6fFrBIb1l934bDl//mmnoIZEDK0idg1+AIvX5U=
go.yaml.in/yaml/v4 v4.0.0-rc.4/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI=
golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s=
golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.269.0 h1:qDrTOxKUQ/P0MveH6a7vZ+DNHxJQjtGm/uvdbdGXCQg=
google.golang.org/api v0.269.0/go.mod h1:N8Wpcu23Tlccl0zSHEkcAZQKDLdquxK+l9r2LkwAauE=
google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 h1:VQZ/yAbAtjkHgH80teYd2em3xtIkkHd7ZhqfH2N9CsM=
google.golang.org/genproto v0.0.0-20260128011058-8636f8732409/go.mod h1:rxKD3IEILWEu3P44seeNOAwZN4SaoKaQ/2eTg4mM6EM=
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c h1:OyQPd6I3pN/9gDxz6L13kYGJgqkpdrAohJRBeXyxlgI=
google.golang.org/genproto/googleapis/api v0.0.0-20260311181403-84a4fc48630c/go.mod h1:X2gu9Qwng7Nn009s/r3RUxqkzQNqOrAy79bluY7ojIg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=
google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
k8s.io/apimachinery v0.35.3 h1:MeaUwQCV3tjKP4bcwWGgZ/cp/vpsRnQzqO6J6tJyoF8=
k8s.io/apimachinery v0.35.3/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU=
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk=
pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
sigs.k8s.io/kind v0.31.0 h1:UcT4nzm+YM7YEbqiAKECk+b6dsvc/HRZZu9U0FolL1g=
sigs.k8s.io/kind v0.31.0/go.mod h1:FSqriGaoTPruiXWfRnUXNykF8r2t+fHtK0P0m1AbGF8=
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=


================================================
FILE: hack/boilerplate/boilerplate.go.txt
================================================
// Copyright 2023 ko Build Authors All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.


================================================
FILE: hack/boilerplate/boilerplate.sh.txt
================================================
#!/usr/bin/env bash

# Copyright 2023 ko Build Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


================================================
FILE: hack/presubmit.sh
================================================
#!/usr/bin/env bash

# Copyright 2021 ko Build Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -o errexit
set -o nounset
set -o pipefail

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

pushd "${PROJECT_ROOT}"
trap popd EXIT

# Verify that all source files are correctly formatted.
find . -name "*.go" -exec gofmt -d -e -l {} +

# Verify that generated Markdown docs are up-to-date.
tmpdir=$(mktemp -d)
go run cmd/help/main.go --dir "$tmpdir"
diff -Naur -I '###### Auto generated' "$tmpdir" docs/reference/


================================================
FILE: hack/tools.go
================================================
// Copyright 2021 ko Build Authors All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build tools
// +build tools

package hack

import (
	_ "github.com/go-training/helloworld"
)


================================================
FILE: hack/update-codegen.sh
================================================
#!/usr/bin/env bash

# Copyright 2021 ko Build Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -o errexit
set -o nounset
set -o pipefail

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

pushd ${PROJECT_ROOT}
trap popd EXIT

go mod tidy

go run $PROJECT_ROOT/cmd/help/main.go --dir=$PROJECT_ROOT/docs/reference/


================================================
FILE: hack/update-deps.sh
================================================
#!/usr/bin/env bash

# Copyright 2018 ko Build Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -o errexit
set -o nounset
set -o pipefail

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

pushd ${PROJECT_ROOT}
trap popd EXIT

go mod tidy


================================================
FILE: integration_test.sh
================================================
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail

ROOT_DIR=$(dirname "$0")

pushd "$ROOT_DIR"

ROOT_DIR="$(pwd)"

echo "Moving GOPATH into /tmp/ to test modules behavior."
export GOPATH="${GOPATH:-$(go env GOPATH)}"
export ORIGINAL_GOPATH="$GOPATH"
GOPATH="$(mktemp -d)"
export GOPATH

export CGO_ENABLED=0

GOARCH="${GOARCH:-$(go env GOARCH)}"

pushd "$GOPATH" || exit 1

echo "Copying ko to temp gopath."
mkdir -p "$GOPATH/src/github.com/google/ko"
cp -r "$ROOT_DIR/"* "$GOPATH/src/github.com/google/ko/"

pushd "$GOPATH/src/github.com/google/ko" || exit 1

echo "Building ko"

RESULT="$(go build .)"

echo "Beginning scenarios."

FILTER="[^ ]local[^ ]*"

echo "1. Test should create an image that outputs 'Hello World'."
RESULT="$(./ko build --local --platform="linux/$GOARCH" "$GOPATH/src/github.com/google/ko/test" | grep "$FILTER" | xargs -I% docker run %)"
if [[ "$RESULT" != *"Hello there"* ]]; then
  echo "Test FAILED. Saw $RESULT" && exit 1
else
  echo "Test PASSED"
fi

echo "2. Test knative 'KO_FLAGS' variable is ignored."
# https://github.com/ko-build/ko/issues/1317
RESULT="$(KO_FLAGS="--platform=badvalue" ./ko build --local --platform="linux/$GOARCH" "$GOPATH/src/github.com/google/ko/test" | grep "$FILTER" | xargs -I% docker run %)"
if [[ "$RESULT" != *"Hello there"* ]]; then
  echo "Test FAILED. Saw $RESULT" && exit 1
else
  echo "Test PASSED"
fi

echo "3. Linux capabilities."
pushd test/build-configs || exit 1
# run as non-root user with net_bind_service cap granted
docker_run_opts="--user 1 --cap-add=net_bind_service"
RESULT="$(../../ko build --local --platform="linux/$GOARCH" ./caps/cmd | grep "$FILTER" | xargs -I% docker run $docker_run_opts %)"
if [[ "$RESULT" != "No capabilities" ]]; then
  echo "Test FAILED. Saw '$RESULT' but expected 'No capabilities'. Docker 'cap-add' must have no effect unless matching capabilities are granted to the file." && exit 1
fi
# build with a different config requesting net_bind_service file capability
RESULT_WITH_FILE_CAPS="$(KO_CONFIG_PATH=caps.ko.yaml ../../ko build --local --platform="linux/$GOARCH"  ./caps/cmd | grep "$FILTER" | xargs -I% docker run $docker_run_opts %)"
if [[ "$RESULT_WITH_FILE_CAPS" !=  "Has capabilities"* ]]; then
  echo "Test FAILED. Saw '$RESULT_WITH_FILE_CAPS' but expected 'Has capabilities'. Docker 'cap-add' must work when matching capabilities are granted to the file." && exit 1
else
  echo "Test PASSED"
fi
popd || exit 1

popd || exit 1
popd || exit 1

export GOPATH="$ORIGINAL_GOPATH"


================================================
FILE: internal/sbom/sbom.go
================================================
// Copyright 2022 ko Build Authors All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package sbom

import (
	"bufio"
	"bytes"
	"fmt"
	"runtime/debug"
	"strings"
	"unicode"
)

func modulePackageName(mod *debug.Module) string {
	return fmt.Sprintf("SPDXRef-Package-%s-%s",
		strings.ReplaceAll(mod.Path, "/", "."),
		mod.Version)
}

func goRef(mod *debug.Module) string {
	path := mod.Path
	// Try to lowercase the first 2 path elements to comply with spec
	// https://github.com/package-url/purl-spec/blob/master/PURL-TYPES.rst#golang
	p := strings.Split(path, "/")
	if len(p) > 2 {
		path = strings.Join(
			append(
				[]string{strings.ToLower(p[0]), strings.ToLower(p[1])},
				p[2:]...,
			), "/",
		)
	}
	return fmt.Sprintf("pkg:golang/%s@%s?type=module", path, mod.Version)
}

// massageGoVersionM massages the ou
Download .txt
gitextract_aa0jajfb/

├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── analyze.yaml
│       ├── boilerplate.yaml
│       ├── build.yaml
│       ├── donotsubmit.yaml
│       ├── e2e.yaml
│       ├── image.yaml
│       ├── kind-e2e.yaml
│       ├── modules-integration-test.yaml
│       ├── publish-site.yaml
│       ├── registries.yaml
│       ├── release.yml
│       ├── sbom.yaml
│       ├── stale.yaml
│       ├── style.yaml
│       ├── test.yaml
│       └── verify.yaml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yml
├── .ko.yaml
├── .wokeignore
├── CNAME
├── CONTRIBUTING.md
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── ROADMAP.md
├── cmd/
│   └── help/
│       └── main.go
├── code-of-conduct.md
├── docs/
│   ├── CNAME
│   ├── README.md
│   ├── advanced/
│   │   ├── faq.md
│   │   ├── go-packages.md
│   │   ├── lambda.md
│   │   ├── limitations.md
│   │   ├── linux-capabilities.md
│   │   ├── migrating-from-dockerfile.md
│   │   ├── root-ca-certificates.md
│   │   └── terraform.md
│   ├── community.md
│   ├── configuration.md
│   ├── custom/
│   │   ├── main.html
│   │   └── partials/
│   │       └── copyright.html
│   ├── deployment.md
│   ├── features/
│   │   ├── build-cache.md
│   │   ├── debugging.md
│   │   ├── k8s.md
│   │   ├── multi-platform.md
│   │   ├── sboms.md
│   │   └── static-assets.md
│   ├── get-started.md
│   ├── index.md
│   ├── install.md
│   └── reference/
│       ├── ko.md
│       ├── ko_apply.md
│       ├── ko_build.md
│       ├── ko_create.md
│       ├── ko_delete.md
│       ├── ko_login.md
│       ├── ko_resolve.md
│       ├── ko_run.md
│       └── ko_version.md
├── go.mod
├── go.sum
├── hack/
│   ├── boilerplate/
│   │   ├── boilerplate.go.txt
│   │   └── boilerplate.sh.txt
│   ├── presubmit.sh
│   ├── tools.go
│   ├── update-codegen.sh
│   └── update-deps.sh
├── integration_test.sh
├── internal/
│   └── sbom/
│       ├── sbom.go
│       └── spdx.go
├── main.go
├── mkdocs.yml
├── pkg/
│   ├── build/
│   │   ├── build.go
│   │   ├── cache.go
│   │   ├── config.go
│   │   ├── doc.go
│   │   ├── future.go
│   │   ├── future_test.go
│   │   ├── gobuild.go
│   │   ├── gobuild_test.go
│   │   ├── gobuilds.go
│   │   ├── gobuilds_test.go
│   │   ├── layer.go
│   │   ├── limit.go
│   │   ├── limit_test.go
│   │   ├── options.go
│   │   ├── recorder.go
│   │   ├── recorder_test.go
│   │   ├── shared.go
│   │   ├── shared_test.go
│   │   ├── strict.go
│   │   └── strict_test.go
│   ├── caps/
│   │   ├── caps.go
│   │   ├── caps_dd_test.go
│   │   ├── caps_test.go
│   │   ├── gen.sh
│   │   └── new_file_caps_test.go
│   ├── commands/
│   │   ├── apply.go
│   │   ├── build.go
│   │   ├── cache.go
│   │   ├── commands.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── create.go
│   │   ├── delete.go
│   │   ├── options/
│   │   │   ├── build.go
│   │   │   ├── build_test.go
│   │   │   ├── filestuff.go
│   │   │   ├── namer_test.go
│   │   │   ├── publish.go
│   │   │   ├── selector.go
│   │   │   ├── testdata/
│   │   │   │   ├── bad-config/
│   │   │   │   │   └── .ko.yaml/
│   │   │   │   │       └── .gitignore
│   │   │   │   ├── config/
│   │   │   │   │   ├── .ko.yaml
│   │   │   │   │   └── my-ko.yaml
│   │   │   │   ├── multiple-platforms/
│   │   │   │   │   └── .ko.yaml
│   │   │   │   └── paths/
│   │   │   │       ├── .ko.yaml
│   │   │   │       └── app/
│   │   │   │           ├── cmd/
│   │   │   │           │   └── foo/
│   │   │   │           │       └── main.go
│   │   │   │           └── go.mod
│   │   │   └── validate.go
│   │   ├── publisher.go
│   │   ├── publisher_test.go
│   │   ├── resolve.go
│   │   ├── resolver.go
│   │   ├── resolver_test.go
│   │   ├── root.go
│   │   ├── run.go
│   │   └── version.go
│   ├── doc.go
│   ├── internal/
│   │   ├── git/
│   │   │   ├── clone.go
│   │   │   ├── errors.go
│   │   │   ├── git.go
│   │   │   ├── info.go
│   │   │   └── info_test.go
│   │   ├── gittesting/
│   │   │   ├── git.go
│   │   │   └── git_test.go
│   │   └── testing/
│   │       ├── daemon.go
│   │       ├── doc.go
│   │       ├── fixed.go
│   │       └── fixed_test.go
│   ├── publish/
│   │   ├── daemon.go
│   │   ├── daemon_test.go
│   │   ├── default.go
│   │   ├── default_test.go
│   │   ├── doc.go
│   │   ├── future.go
│   │   ├── future_test.go
│   │   ├── kind/
│   │   │   ├── doc.go
│   │   │   ├── write.go
│   │   │   └── write_test.go
│   │   ├── kind.go
│   │   ├── layout.go
│   │   ├── layout_test.go
│   │   ├── multi.go
│   │   ├── multi_test.go
│   │   ├── options.go
│   │   ├── publish.go
│   │   ├── recorder.go
│   │   ├── recorder_test.go
│   │   ├── shared.go
│   │   ├── shared_test.go
│   │   ├── tarball.go
│   │   └── tarball_test.go
│   └── resolve/
│       ├── doc.go
│       ├── resolve.go
│       ├── resolve_test.go
│       ├── selector.go
│       └── selector_test.go
└── test/
    ├── build-configs/
    │   ├── .ko.yaml
    │   ├── bar/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   ├── caps/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   ├── caps.ko.yaml
    │   ├── foo/
    │   │   ├── cmd/
    │   │   │   └── main.go
    │   │   └── go.mod
    │   └── toolexec/
    │       ├── cmd/
    │       │   └── main.go
    │       └── go.mod
    ├── kodata/
    │   ├── a
    │   ├── kenobi
    │   └── subdir/
    │       └── file.txt
    ├── main.go
    └── test.yaml
Download .txt
SYMBOL INDEX (537 symbols across 90 files)

FILE: cmd/help/main.go
  function init (line 36) | func init() {
  function main (line 40) | func main() {

FILE: internal/sbom/sbom.go
  function modulePackageName (line 26) | func modulePackageName(mod *debug.Module) string {
  function goRef (line 32) | func goRef(mod *debug.Module) string {
  function massageGoVersionM (line 53) | func massageGoVersionM(b []byte) ([]byte, error) {

FILE: internal/sbom/spdx.go
  type qualifier (line 36) | type qualifier struct
  function ociRef (line 43) | func ociRef(path string, imgDigest v1.Hash, qual ...qualifier) string {
  function h1ToSHA256 (line 56) | func h1ToSHA256(s string) string {
  constant dateFormat (line 67) | dateFormat = "2006-01-02T15:04:05Z"
  function GenerateImageSPDX (line 69) | func GenerateImageSPDX(koVersion string, mod []byte, img oci.SignedImage...
  function extractDate (line 202) | func extractDate(sii oci.SignedImageIndex) (*time.Time, error) {
  function GenerateIndexSPDX (line 229) | func GenerateIndexSPDX(koVersion string, sii oci.SignedImageIndex) ([]by...
  function ociPackageName (line 359) | func ociPackageName(d v1.Hash) string {
  function starterDocument (line 363) | func starterDocument(koVersion string, date time.Time, d v1.Hash) (Docum...
  function addBaseImage (line 379) | func addBaseImage(doc *Document, annotations map[string]string, h v1.Has...
  constant NOASSERTION (line 462) | NOASSERTION = "NOASSERTION"
  constant Version (line 463) | Version     = "SPDX-2.3"
  type Document (line 466) | type Document struct
  type CreationInfo (line 480) | type CreationInfo struct
  type Package (line 486) | type Package struct
  type PackageVerificationCode (line 506) | type PackageVerificationCode struct
  type File (line 511) | type File struct
  type Checksum (line 523) | type Checksum struct
  type ExternalRef (line 528) | type ExternalRef struct
  type Relationship (line 534) | type Relationship struct
  type ExternalDocumentRef (line 540) | type ExternalDocumentRef struct

FILE: main.go
  function main (line 26) | func main() {

FILE: pkg/build/build.go
  type Interface (line 26) | type Interface interface
  type Result (line 48) | type Result interface

FILE: pkg/build/cache.go
  type diffIDToDescriptor (line 34) | type diffIDToDescriptor
  type buildIDToDiffID (line 35) | type buildIDToDiffID
  type layerCache (line 37) | type layerCache struct
    method get (line 45) | func (c *layerCache) get(ctx context.Context, file string, miss layerF...
    method getMeta (line 72) | func (c *layerCache) getMeta(ctx context.Context, file string) (*v1.Ha...
    method put (line 109) | func (c *layerCache) put(ctx context.Context, file string, layer v1.La...
    method readDiffToDesc (line 164) | func (c *layerCache) readDiffToDesc(file string) (diffIDToDescriptor, ...
    method readBuildToDiff (line 183) | func (c *layerCache) readBuildToDiff(file string) (buildIDToDiffID, er...
  type layerFactory (line 43) | type layerFactory
  function getBuildID (line 202) | func getBuildID(ctx context.Context, file string) (string, error) {

FILE: pkg/build/config.go
  type StringArray (line 24) | type StringArray
    method UnmarshalYAML (line 27) | func (a *StringArray) UnmarshalYAML(unmarshal func(any) error) error {
  type FlagArray (line 42) | type FlagArray
    method UnmarshalYAML (line 45) | func (a *FlagArray) UnmarshalYAML(unmarshal func(any) error) error {
  type Config (line 64) | type Config struct

FILE: pkg/build/future.go
  function newFuture (line 21) | func newFuture(work func() (Result, error)) *future {
  type result (line 40) | type result struct
  type future (line 45) | type future struct
    method Get (line 53) | func (f *future) Get() (Result, error) {

FILE: pkg/build/future_test.go
  function makeImage (line 23) | func makeImage() (Result, error) {
  function digest (line 27) | func digest(t *testing.T, img Result) string {
  function TestSameFutureSameImage (line 35) | func TestSameFutureSameImage(t *testing.T) {
  function TestDiffFutureDiffImage (line 55) | func TestDiffFutureDiffImage(t *testing.T) {

FILE: pkg/build/gobuild.go
  constant defaultAppFilename (line 59) | defaultAppFilename = "ko-app"
  constant defaultGoBin (line 61) | defaultGoBin = "go"
  constant goBinPathEnv (line 62) | goBinPathEnv = "KO_GO_PATH"
  type GetBase (line 66) | type GetBase
  type buildContext (line 69) | type buildContext struct
  type builder (line 79) | type builder
  type sbomber (line 81) | type sbomber
  type platformMatcher (line 83) | type platformMatcher struct
    method matches (line 1469) | func (pm *platformMatcher) matches(base *v1.Platform) bool {
  type gobuild (line 88) | type gobuild struct
    method qualifyLocalImport (line 203) | func (g *gobuild) qualifyLocalImport(importpath string) (string, error) {
    method QualifyImport (line 223) | func (g *gobuild) QualifyImport(importpath string) (string, error) {
    method IsSupportedReference (line 241) | func (g *gobuild) IsSupportedReference(s string) error {
    method kodataPath (line 669) | func (g *gobuild) kodataPath(ref reference) (string, error) {
    method tarKoData (line 791) | func (g *gobuild) tarKoData(ref reference, platform *v1.Platform) (*by...
    method configForImportPath (line 936) | func (g *gobuild) configForImportPath(ip string) Config {
    method useDebugging (line 963) | func (g gobuild) useDebugging(platform v1.Platform) bool {
    method buildOne (line 967) | func (g *gobuild) buildOne(ctx context.Context, refStr string, base v1...
    method Build (line 1273) | func (g *gobuild) Build(ctx context.Context, s string) (Result, error) {
    method buildAll (line 1321) | func (g *gobuild) buildAll(ctx context.Context, ref string, baseRef na...
  type Option (line 114) | type Option
  type gobuildOpener (line 116) | type gobuildOpener struct
    method Open (line 139) | func (gbo *gobuildOpener) Open() (Interface, error) {
  function NewGo (line 187) | func NewGo(ctx context.Context, dir string, options ...Option) (Interfac...
  function getGoarm (line 263) | func getGoarm(platform v1.Platform) (string, error) {
  function getGoBinary (line 283) | func getGoBinary() string {
  function doesPlatformSupportDebugging (line 290) | func doesPlatformSupportDebugging(platform v1.Platform) bool {
  function getDelve (line 300) | func getDelve(ctx context.Context, platform v1.Platform) (string, error) {
  function build (line 363) | func build(ctx context.Context, buildCtx buildContext) (string, error) {
  function goenv (line 425) | func goenv(ctx context.Context) (map[string]string, error) {
  function goversionm (line 461) | func goversionm(ctx context.Context, file string, appPath string, appFil...
  function spdx (line 492) | func spdx(version string) sbomber {
  function writeSBOM (line 530) | func writeSBOM(sbom []byte, appFileName, dir, ext string) error {
  function buildEnv (line 546) | func buildEnv(platform v1.Platform, osEnv, buildEnv []string) ([]string,...
  function appFilename (line 575) | func appFilename(importpath string) string {
  constant userOwnerAndGroupSID (line 591) | userOwnerAndGroupSID = "AQAAgBQAAAAkAAAAAAAAAAAAAAABAgAAAAAABSAAAAAhAgAA...
  function tarBinary (line 593) | func tarBinary(name, binary string, platform *v1.Platform, opts *layerOp...
  constant kodataRoot (line 688) | kodataRoot = "/var/run/ko"
  function writeDirToTar (line 691) | func writeDirToTar(tw *tar.Writer, name string, modTime time.Time) error {
  function writeFileToTar (line 704) | func writeFileToTar(tw *tar.Writer, name, evalPath string, size int64, m...
  function walkRecursive (line 740) | func walkRecursive(tw *tar.Writer, root, chroot string, creationTime v1....
  function createTemplateData (line 832) | func createTemplateData(ctx context.Context, buildCtx buildContext) (map...
  function applyTemplating (line 878) | func applyTemplating(list []string, data map[string]any) ([]string, erro...
  function createBuildArgs (line 897) | func createBuildArgs(ctx context.Context, buildCtx buildContext) ([]stri...
  type layerOptions (line 1235) | type layerOptions struct
  function buildLayer (line 1239) | func buildLayer(appPath, file string, platform *v1.Platform, layerMediaT...
  function updatePath (line 1253) | func updatePath(cf *v1.ConfigFile, appPath string) {
  function parseSpec (line 1451) | func parseSpec(spec []string) (*platformMatcher, error) {

FILE: pkg/build/gobuild_test.go
  function repoRootDir (line 46) | func repoRootDir() (string, error) {
  function TestGoBuildQualifyImport (line 56) | func TestGoBuildQualifyImport(t *testing.T) {
  function TestGoBuildIsSupportedRef (line 142) | func TestGoBuildIsSupportedRef(t *testing.T) {
  function TestGoBuildIsSupportedRefWithModules (line 177) | func TestGoBuildIsSupportedRefWithModules(t *testing.T) {
  function TestBuildEnv (line 218) | func TestBuildEnv(t *testing.T) {
  function TestGoEnv (line 303) | func TestGoEnv(t *testing.T) {
  function TestCreateTemplateData (line 312) | func TestCreateTemplateData(t *testing.T) {
  function TestBuildConfig (line 427) | func TestBuildConfig(t *testing.T) {
  function nilGetBase (line 557) | func nilGetBase(context.Context, string) (name.Reference, Result, error) {
  constant wantSBOM (line 561) | wantSBOM = "This is our fake SBOM"
  function fauxSBOM (line 564) | func fauxSBOM(context.Context, string, string, string, oci.SignedEntity,...
  function writeTempFile (line 569) | func writeTempFile(_ context.Context, buildCtx buildContext) (string, er...
  function TestGoBuildNoKoData (line 586) | func TestGoBuildNoKoData(t *testing.T) {
  function validateImage (line 681) | func validateImage(t *testing.T, img oci.SignedImage, baseLayers int64, ...
  function TestGoBuild (line 915) | func TestGoBuild(t *testing.T) {
  function TestGoBuild_Defaults (line 1026) | func TestGoBuild_Defaults(t *testing.T) {
  function TestGoBuild_ConfigOverrideDefaults (line 1071) | func TestGoBuild_ConfigOverrideDefaults(t *testing.T) {
  function TestGoBuildWithKOCACHE (line 1120) | func TestGoBuildWithKOCACHE(t *testing.T) {
  function TestGoBuildWithoutSBOM (line 1159) | func TestGoBuildWithoutSBOM(t *testing.T) {
  function TestGoBuildIndex (line 1197) | func TestGoBuildIndex(t *testing.T) {
  function TestNestedIndex (line 1269) | func TestNestedIndex(t *testing.T) {
  function TestGoarm (line 1303) | func TestGoarm(t *testing.T) {
  function TestMatchesPlatformSpec (line 1370) | func TestMatchesPlatformSpec(t *testing.T) {
  function TestGoBuildConsistentMediaTypes (line 1506) | func TestGoBuildConsistentMediaTypes(t *testing.T) {
  function TestDebugger (line 1580) | func TestDebugger(t *testing.T) {

FILE: pkg/build/gobuilds.go
  type gobuilds (line 26) | type gobuilds struct
    method QualifyImport (line 72) | func (g *gobuilds) QualifyImport(importpath string) (string, error) {
    method IsSupportedReference (line 85) | func (g *gobuilds) IsSupportedReference(importpath string) error {
    method Build (line 90) | func (g *gobuilds) Build(ctx context.Context, importpath string) (Resu...
    method builder (line 96) | func (g *gobuilds) builder(importpath string) builderWithConfig {
  type builderWithConfig (line 38) | type builderWithConfig struct
  function NewGobuilds (line 44) | func NewGobuilds(ctx context.Context, workingDirectory string, buildConf...
  function relativePath (line 138) | func relativePath(baseDir string, importpath string) (string, error) {

FILE: pkg/build/gobuilds_test.go
  function Test_gobuilds (line 25) | func Test_gobuilds(t *testing.T) {
  function Test_relativePath (line 132) | func Test_relativePath(t *testing.T) {

FILE: pkg/build/layer.go
  type lazyLayer (line 25) | type lazyLayer struct
    method Digest (line 36) | func (l *lazyLayer) Digest() (v1.Hash, error) {
    method DiffID (line 40) | func (l *lazyLayer) DiffID() (v1.Hash, error) {
    method Size (line 44) | func (l *lazyLayer) Size() (int64, error) {
    method MediaType (line 48) | func (l *lazyLayer) MediaType() (types.MediaType, error) {
    method Compressed (line 53) | func (l *lazyLayer) Compressed() (io.ReadCloser, error) {
    method Uncompressed (line 62) | func (l *lazyLayer) Uncompressed() (io.ReadCloser, error) {
    method compute (line 70) | func (l *lazyLayer) compute() (v1.Layer, error) {

FILE: pkg/build/limit.go
  type Limiter (line 24) | type Limiter struct
    method QualifyImport (line 33) | func (l *Limiter) QualifyImport(ip string) (string, error) {
    method IsSupportedReference (line 38) | func (l *Limiter) IsSupportedReference(ip string) error {
    method Build (line 43) | func (l *Limiter) Build(ctx context.Context, ip string) (Result, error) {
  function NewLimiter (line 55) | func NewLimiter(b Interface, n int) *Limiter {

FILE: pkg/build/limit_test.go
  type sleeper (line 25) | type sleeper struct
    method QualifyImport (line 30) | func (*sleeper) QualifyImport(ip string) (string, error) {
    method IsSupportedReference (line 35) | func (*sleeper) IsSupportedReference(_ string) error {
    method Build (line 40) | func (*sleeper) Build(_ context.Context, _ string) (Result, error) {
  function TestLimiter (line 45) | func TestLimiter(t *testing.T) {

FILE: pkg/build/options.go
  function WithBaseImages (line 25) | func WithBaseImages(gb GetBase) Option {
  function WithCreationTime (line 34) | func WithCreationTime(t v1.Time) Option {
  function WithKoDataCreationTime (line 43) | func WithKoDataCreationTime(t v1.Time) Option {
  function WithDisabledOptimizations (line 52) | func WithDisabledOptimizations() Option {
  function WithDisabledSBOM (line 60) | func WithDisabledSBOM() Option {
  function WithTrimpath (line 69) | func WithTrimpath(v bool) Option {
  function WithConfig (line 81) | func WithConfig(buildConfigs map[string]Config) Option {
  function WithDefaultEnv (line 90) | func WithDefaultEnv(env []string) Option {
  function WithDefaultFlags (line 98) | func WithDefaultFlags(flags []string) Option {
  function WithDefaultLdflags (line 106) | func WithDefaultLdflags(ldflags []string) Option {
  function WithPlatforms (line 123) | func WithPlatforms(platforms ...string) Option {
  function WithLabel (line 135) | func WithLabel(k, v string) Option {
  function WithAnnotation (line 146) | func WithAnnotation(k, v string) Option {
  function WithUser (line 157) | func WithUser(user string) Option {
  function withBuilder (line 166) | func withBuilder(b builder) Option {
  function WithSPDX (line 175) | func WithSPDX(version string) Option {
  function withSBOMber (line 184) | func withSBOMber(sbom sbomber) Option {
  function WithJobs (line 192) | func WithJobs(jobs int) Option {
  function WithSBOMDir (line 200) | func WithSBOMDir(dir string) Option {
  function WithDebugger (line 207) | func WithDebugger() Option {

FILE: pkg/build/recorder.go
  type Recorder (line 23) | type Recorder struct
    method QualifyImport (line 33) | func (r *Recorder) QualifyImport(ip string) (string, error) {
    method IsSupportedReference (line 38) | func (r *Recorder) IsSupportedReference(ip string) error {
    method Build (line 43) | func (r *Recorder) Build(ctx context.Context, ip string) (Result, erro...

FILE: pkg/build/recorder_test.go
  type fake (line 24) | type fake struct
    method QualifyImport (line 32) | func (r *fake) QualifyImport(ip string) (string, error) { return ip, n...
    method IsSupportedReference (line 35) | func (r *fake) IsSupportedReference(ip string) error { return r.isr(ip) }
    method Build (line 38) | func (r *fake) Build(_ context.Context, ip string) (Result, error) { r...
  function TestISRPassThrough (line 40) | func TestISRPassThrough(t *testing.T) {
  function TestBuildRecording (line 74) | func TestBuildRecording(t *testing.T) {

FILE: pkg/build/shared.go
  type Caching (line 25) | type Caching struct
    method Build (line 45) | func (c *Caching) Build(ctx context.Context, ip string) (Result, error) {
    method QualifyImport (line 68) | func (c *Caching) QualifyImport(ip string) (string, error) {
    method IsSupportedReference (line 73) | func (c *Caching) IsSupportedReference(ip string) error {
    method Invalidate (line 78) | func (c *Caching) Invalidate(ip string) {
  function NewCaching (line 37) | func NewCaching(inner Interface) (*Caching, error) {

FILE: pkg/build/shared_test.go
  type slowbuild (line 25) | type slowbuild struct
    method QualifyImport (line 32) | func (sb *slowbuild) QualifyImport(ip string) (string, error) { return...
    method IsSupportedReference (line 34) | func (sb *slowbuild) IsSupportedReference(string) error { return nil }
    method Build (line 36) | func (sb *slowbuild) Build(context.Context, string) (Result, error) {
  function TestCaching (line 41) | func TestCaching(t *testing.T) {

FILE: pkg/build/strict.go
  constant StrictScheme (line 21) | StrictScheme = "ko://"
  type reference (line 23) | type reference struct
    method IsStrict (line 35) | func (r reference) IsStrict() bool {
    method Path (line 39) | func (r reference) Path() string {
    method String (line 43) | func (r reference) String() string {
  function newRef (line 28) | func newRef(s string) reference {

FILE: pkg/build/strict_test.go
  function TestStrictReference (line 19) | func TestStrictReference(t *testing.T) {

FILE: pkg/caps/caps.go
  type Mask (line 28) | type Mask
  function Parse (line 36) | func Parse(s string) (Mask, error) {
  function allKnownCaps (line 51) | func allKnownCaps() Mask {
  type Flags (line 105) | type Flags
  constant FlagEffective (line 110) | FlagEffective Flags = 1
  function XattrBytes (line 116) | func XattrBytes(permitted, inheritable Mask, flags Flags) ([]byte, error) {
  type FileCaps (line 143) | type FileCaps struct
    method ToXattrBytes (line 211) | func (fc *FileCaps) ToXattrBytes() ([]byte, error) {
  function NewFileCaps (line 151) | func NewFileCaps(terms ...string) (*FileCaps, error) {

FILE: pkg/caps/caps_test.go
  function TestParse (line 23) | func TestParse(t *testing.T) {
  type ddTest (line 55) | type ddTest struct
  function TestDd (line 61) | func TestDd(t *testing.T) {

FILE: pkg/caps/new_file_caps_test.go
  function TestNewFileCaps (line 23) | func TestNewFileCaps(t *testing.T) {

FILE: pkg/commands/apply.go
  function addApply (line 29) | func addApply(topLevel *cobra.Command) {

FILE: pkg/commands/build.go
  function addBuild (line 25) | func addBuild(topLevel *cobra.Command) {

FILE: pkg/commands/cache.go
  type imageCache (line 38) | type imageCache struct
    method get (line 69) | func (i *imageCache) get(ctx context.Context, ref name.Reference, miss...
    method newLazyIndex (line 220) | func (i *imageCache) newLazyIndex(ref name.Reference, idx v1.ImageInde...
    method newLazyImage (line 240) | func (i *imageCache) newLazyImage(ref name.Reference, img v1.Image, mi...
  function newCache (line 50) | func newCache(puller *remote.Puller) (*imageCache, error) {
  type lazyIndex (line 272) | type lazyIndex struct
    method MediaType (line 281) | func (i *lazyIndex) MediaType() (types.MediaType, error) {
    method Digest (line 285) | func (i *lazyIndex) Digest() (v1.Hash, error) {
    method Size (line 289) | func (i *lazyIndex) Size() (int64, error) {
    method IndexManifest (line 293) | func (i *lazyIndex) IndexManifest() (*v1.IndexManifest, error) {
    method RawManifest (line 297) | func (i *lazyIndex) RawManifest() ([]byte, error) {
    method Image (line 301) | func (i *lazyIndex) Image(h v1.Hash) (v1.Image, error) {
    method ImageIndex (line 315) | func (i *lazyIndex) ImageIndex(h v1.Hash) (v1.ImageIndex, error) {
  type lazyImage (line 329) | type lazyImage struct
    method Layers (line 342) | func (i *lazyImage) Layers() ([]v1.Layer, error) {
    method MediaType (line 366) | func (i *lazyImage) MediaType() (types.MediaType, error) {
    method Digest (line 370) | func (i *lazyImage) Digest() (v1.Hash, error) {
    method Size (line 374) | func (i *lazyImage) Size() (int64, error) {
    method ConfigName (line 378) | func (i *lazyImage) ConfigName() (v1.Hash, error) {
    method ConfigFile (line 382) | func (i *lazyImage) ConfigFile() (*v1.ConfigFile, error) {
    method RawConfigFile (line 386) | func (i *lazyImage) RawConfigFile() ([]byte, error) {
    method Manifest (line 390) | func (i *lazyImage) Manifest() (*v1.Manifest, error) {
    method RawManifest (line 394) | func (i *lazyImage) RawManifest() ([]byte, error) {
    method LayerByDigest (line 398) | func (i *lazyImage) LayerByDigest(h v1.Hash) (v1.Layer, error) {
    method LayerByDiffID (line 422) | func (i *lazyImage) LayerByDiffID(h v1.Hash) (v1.Layer, error) {
  type lazyLayer (line 431) | type lazyLayer struct
    method Digest (line 440) | func (l *lazyLayer) Digest() (v1.Hash, error) {
    method DiffID (line 444) | func (l *lazyLayer) DiffID() (v1.Hash, error) {
    method Size (line 448) | func (l *lazyLayer) Size() (int64, error) {
    method MediaType (line 452) | func (l *lazyLayer) MediaType() (types.MediaType, error) {
    method Compressed (line 456) | func (l *lazyLayer) Compressed() (io.ReadCloser, error) {
    method Uncompressed (line 470) | func (l *lazyLayer) Uncompressed() (io.ReadCloser, error) {

FILE: pkg/commands/commands.go
  function AddKubeCommands (line 27) | func AddKubeCommands(topLevel *cobra.Command) {
  function isKubectlAvailable (line 38) | func isKubectlAvailable() bool {

FILE: pkg/commands/config.go
  function getBaseImage (line 55) | func getBaseImage(bo *options.BuildOptions) build.GetBase {
  function getTimeFromEnv (line 147) | func getTimeFromEnv(env string) (*v1.Time, error) {
  function getCreationTime (line 160) | func getCreationTime() (*v1.Time, error) {
  function getKoDataCreationTime (line 164) | func getKoDataCreationTime() (*v1.Time, error) {
  type baseFactory (line 168) | type baseFactory

FILE: pkg/commands/config_test.go
  function TestOverrideDefaultBaseImageUsingBuildOption (line 27) | func TestOverrideDefaultBaseImageUsingBuildOption(t *testing.T) {

FILE: pkg/commands/create.go
  function addCreate (line 29) | func addCreate(topLevel *cobra.Command) {

FILE: pkg/commands/delete.go
  type runCmd (line 26) | type runCmd
  function passthru (line 30) | func passthru(command string) runCmd {
  function addDelete (line 55) | func addDelete(topLevel *cobra.Command) {

FILE: pkg/commands/options/build.go
  constant configDefaultBaseImage (line 34) | configDefaultBaseImage = "cgr.dev/chainguard/static:latest"
  type BuildOptions (line 38) | type BuildOptions struct
    method LoadConfig (line 110) | func (bo *BuildOptions) LoadConfig() error {
  function AddBuildOptions (line 87) | func AddBuildOptions(cmd *cobra.Command, bo *BuildOptions) {
  function yamlUnmarshallerHookFunc (line 208) | func yamlUnmarshallerHookFunc(_ reflect.Type, to reflect.Type, data any)...
  function createBuildConfigMap (line 235) | func createBuildConfigMap(workingDirectory string, configs []build.Confi...

FILE: pkg/commands/options/build_test.go
  function TestDefaultBaseImage (line 28) | func TestDefaultBaseImage(t *testing.T) {
  function TestDefaultPlatformsAll (line 43) | func TestDefaultPlatformsAll(t *testing.T) {
  function TestDefaultEnv (line 71) | func TestDefaultEnv(t *testing.T) {
  function TestDefaultFlags (line 80) | func TestDefaultFlags(t *testing.T) {
  function TestDefaultLdFlags (line 89) | func TestDefaultLdFlags(t *testing.T) {
  function TestBuildConfigWithWorkingDirectoryAndDirAndMain (line 98) | func TestBuildConfigWithWorkingDirectoryAndDirAndMain(t *testing.T) {
  function TestCreateBuildConfigs (line 116) | func TestCreateBuildConfigs(t *testing.T) {
  function TestAddBuildOptionsSetsDefaultsForNonFlagOptions (line 151) | func TestAddBuildOptionsSetsDefaultsForNonFlagOptions(t *testing.T) {
  function TestOverrideConfigPath (line 160) | func TestOverrideConfigPath(t *testing.T) {

FILE: pkg/commands/options/filestuff.go
  type FilenameOptions (line 26) | type FilenameOptions struct
  function AddFileArg (line 31) | func AddFileArg(cmd *cobra.Command, fo *FilenameOptions) {
  function EnumerateFiles (line 40) | func EnumerateFiles(fo *FilenameOptions) chan string {

FILE: pkg/commands/options/namer_test.go
  function TestMakeNamer (line 24) | func TestMakeNamer(t *testing.T) {
  function foreachTestCaseMakeNamer (line 37) | func foreachTestCaseMakeNamer(fn func(tc testMakeNamerCase)) {
  function testMakeNamerCases (line 43) | func testMakeNamerCases() []testMakeNamerCase {
  type testMakeNamerCase (line 68) | type testMakeNamerCase struct

FILE: pkg/commands/options/publish.go
  type PublishOptions (line 29) | type PublishOptions struct
  function AddPublishArg (line 75) | func AddPublishArg(cmd *cobra.Command, po *PublishOptions) {
  function packageWithMD5 (line 109) | func packageWithMD5(base, importpath string) string {
  function preserveImportPath (line 115) | func preserveImportPath(base, importpath string) string {
  function baseImportPaths (line 119) | func baseImportPaths(base, importpath string) string {
  function bareDockerRepo (line 123) | func bareDockerRepo(base, _ string) string {
  function MakeNamer (line 127) | func MakeNamer(po *PublishOptions) publish.Namer {

FILE: pkg/commands/options/selector.go
  type SelectorOptions (line 22) | type SelectorOptions struct
  function AddSelectorArg (line 26) | func AddSelectorArg(cmd *cobra.Command, so *SelectorOptions) {

FILE: pkg/commands/options/testdata/paths/app/cmd/foo/main.go
  function main (line 19) | func main() {

FILE: pkg/commands/options/validate.go
  constant bareBaseFlagsWarning (line 24) | bareBaseFlagsWarning = `WARNING!
  constant localFlagsWarning (line 34) | localFlagsWarning = `WARNING!
  function Validate (line 44) | func Validate(po *PublishOptions, bo *BuildOptions) error {

FILE: pkg/commands/publisher.go
  function PublishImages (line 27) | func PublishImages(ctx context.Context, importpaths []string, pub publis...
  function publishImages (line 31) | func publishImages(ctx context.Context, importpaths []string, pub publis...

FILE: pkg/commands/publisher_test.go
  function TestPublishImages (line 29) | func TestPublishImages(t *testing.T) {
  function sampleAppRelDir (line 98) | func sampleAppRelDir() (string, error) {

FILE: pkg/commands/resolve.go
  function addResolve (line 26) | func addResolve(topLevel *cobra.Command) {

FILE: pkg/commands/resolver.go
  function ua (line 40) | func ua() string {
  function gobuildOptions (line 47) | func gobuildOptions(bo *options.BuildOptions) ([]build.Option, error) {
  function NewBuilder (line 146) | func NewBuilder(ctx context.Context, bo *options.BuildOptions) (build.In...
  function makeBuilder (line 150) | func makeBuilder(ctx context.Context, bo *options.BuildOptions) (*build....
  function NewPublisher (line 180) | func NewPublisher(po *options.PublishOptions) (publish.Interface, error) {
  function makePublisher (line 184) | func makePublisher(po *options.PublishOptions) (publish.Interface, error) {
  type nopPublisher (line 289) | type nopPublisher struct
    method Publish (line 296) | func (n nopPublisher) Publish(_ context.Context, br build.Result, s st...
    method Close (line 315) | func (n nopPublisher) Close() error { return nil }
  type resolvedFuture (line 318) | type resolvedFuture
  function ResolveFilesToWriter (line 320) | func ResolveFilesToWriter(
  function resolveFile (line 415) | func resolveFile(
  function unique (line 487) | func unique(ss []string) []string {

FILE: pkg/commands/resolver_test.go
  type erroringClient (line 67) | type erroringClient struct
    method Ping (line 74) | func (m *erroringClient) Ping(context.Context, client.PingOptions) (cl...
    method ImageLoad (line 77) | func (m *erroringClient) ImageLoad(context.Context, io.Reader, ...clie...
    method ImageTag (line 80) | func (m *erroringClient) ImageTag(context.Context, client.ImageTagOpti...
    method ImageInspect (line 84) | func (m *erroringClient) ImageInspect(_ context.Context, _ string, _ ....
  function TestResolveMultiDocumentYAMLs (line 88) | func TestResolveMultiDocumentYAMLs(t *testing.T) {
  function TestResolveMultiDocumentYAMLsWithSelector (line 142) | func TestResolveMultiDocumentYAMLsWithSelector(t *testing.T) {
  function TestNewBuilder (line 172) | func TestNewBuilder(t *testing.T) {
  function TestNewPublisherCanPublish (line 243) | func TestNewPublisherCanPublish(t *testing.T) {
  function registryServerWithImage (line 329) | func registryServerWithImage(namespace string) (*httptest.Server, error) {
  function mustRepository (line 342) | func mustRepository(s string) name.Repository {
  function mustDigest (line 350) | func mustDigest(img v1.Image) v1.Hash {
  function mustRandom (line 358) | func mustRandom() v1.Image {
  function yamlToTmpFile (line 366) | func yamlToTmpFile(t *testing.T, yaml []byte) string {

FILE: pkg/commands/root.go
  function New (line 28) | func New() *cobra.Command {

FILE: pkg/commands/run.go
  function addRun (line 31) | func addRun(topLevel *cobra.Command) {
  function unparsedDashes (line 153) | func unparsedDashes() int {

FILE: pkg/commands/version.go
  function addVersion (line 28) | func addVersion(topLevel *cobra.Command) {
  function version (line 43) | func version() string {

FILE: pkg/internal/git/clone.go
  function Clone (line 46) | func Clone(ctx context.Context, dir string, repoURL string) error {

FILE: pkg/internal/git/errors.go
  type ErrDirty (line 58) | type ErrDirty struct
    method Error (line 62) | func (e ErrDirty) Error() string {

FILE: pkg/internal/git/git.go
  type runConfig (line 47) | type runConfig struct
  function run (line 54) | func run(ctx context.Context, cfg runConfig) (string, error) {
  function clean (line 80) | func clean(output string, err error) (string, error) {
  function cleanAllLines (line 89) | func cleanAllLines(output string, err error) ([]string, error) {

FILE: pkg/internal/git/info.go
  type Info (line 50) | type Info struct
    method TemplateValue (line 60) | func (i Info) TemplateValue() map[string]any {
  function GetInfo (line 80) | func GetInfo(ctx context.Context, dir string) (Info, error) {
  function isRepo (line 132) | func isRepo(ctx context.Context, dir string) bool {
  function checkDirty (line 141) | func checkDirty(ctx context.Context, dir string) error {
  function getBranch (line 152) | func getBranch(ctx context.Context, dir string) (string, error) {
  function getCommitDate (line 159) | func getCommitDate(ctx context.Context, dir string) (time.Time, error) {
  function getShortCommit (line 178) | func getShortCommit(ctx context.Context, dir string) (string, error) {
  function getFullCommit (line 185) | func getFullCommit(ctx context.Context, dir string) (string, error) {
  function getTag (line 192) | func getTag(ctx context.Context, dir string, excluding []string) (string...
  function gitDescribe (line 203) | func gitDescribe(ctx context.Context, dir, ref string, excluding []strin...
  function filterOut (line 219) | func filterOut(tags []string, exclude []string) string {

FILE: pkg/internal/git/info_test.go
  constant fakeGitURL (line 50) | fakeGitURL = "git@github.com:foo/bar.git"
  function TestNotAGitFolder (line 52) | func TestNotAGitFolder(t *testing.T) {
  function TestSingleCommit (line 61) | func TestSingleCommit(t *testing.T) {
  function TestBranch (line 82) | func TestBranch(t *testing.T) {
  function TestNewRepository (line 104) | func TestNewRepository(t *testing.T) {
  function TestNoTags (line 115) | func TestNoTags(t *testing.T) {
  function TestDirty (line 135) | func TestDirty(t *testing.T) {
  function TestValidState (line 161) | func TestValidState(t *testing.T) {
  function TestGitNotInPath (line 176) | func TestGitNotInPath(t *testing.T) {
  function requireEmpty (line 185) | func requireEmpty(t *testing.T, tpl map[string]any) {

FILE: pkg/internal/gittesting/git.go
  function GitInit (line 49) | func GitInit(t *testing.T, dir string) {
  function GitRemoteAdd (line 60) | func GitRemoteAdd(t *testing.T, dir, url string) {
  function GitCommit (line 68) | func GitCommit(t *testing.T, dir, msg string) {
  function GitTag (line 76) | func GitTag(t *testing.T, dir, tag string) {
  function GitAdd (line 84) | func GitAdd(t *testing.T, dir string) {
  function fakeGit (line 91) | func fakeGit(dir string, args ...string) (string, error) {
  function GitCheckoutBranch (line 104) | func GitCheckoutBranch(t *testing.T, dir, name string) {
  function gitRun (line 111) | func gitRun(dir string, args ...string) (string, error) {

FILE: pkg/internal/gittesting/git_test.go
  function TestGit (line 41) | func TestGit(t *testing.T) {

FILE: pkg/internal/testing/daemon.go
  type MockDaemon (line 26) | type MockDaemon struct
    method Ping (line 34) | func (m *MockDaemon) Ping(context.Context, client.PingOptions) (client...
    method ImageLoad (line 37) | func (m *MockDaemon) ImageLoad(context.Context, io.Reader, ...client.I...
    method ImageTag (line 41) | func (m *MockDaemon) ImageTag(_ context.Context, opt client.ImageTagOp...
    method ImageInspect (line 49) | func (m *MockDaemon) ImageInspect(context.Context, string, ...client.I...

FILE: pkg/internal/testing/fixed.go
  type fixedBuild (line 29) | type fixedBuild struct
    method QualifyImport (line 40) | func (f *fixedBuild) QualifyImport(ip string) (string, error) {
    method IsSupportedReference (line 45) | func (f *fixedBuild) IsSupportedReference(s string) error {
    method Build (line 54) | func (f *fixedBuild) Build(_ context.Context, s string) (build.Result,...
  function NewFixedBuild (line 35) | func NewFixedBuild(entries map[string]build.Result) build.Interface {
  type fixedPublish (line 62) | type fixedPublish struct
    method Publish (line 74) | func (f *fixedPublish) Publish(_ context.Context, _ build.Result, s st...
    method Close (line 87) | func (f *fixedPublish) Close() error {
  function NewFixedPublish (line 69) | func NewFixedPublish(base name.Repository, entries map[string]v1.Hash) p...
  function ComputeDigest (line 91) | func ComputeDigest(base name.Repository, ref string, h v1.Hash) string {

FILE: pkg/internal/testing/fixed_test.go
  function TestFixedPublish (line 27) | func TestFixedPublish(t *testing.T) {
  function TestFixedBuild (line 64) | func TestFixedBuild(t *testing.T) {

FILE: pkg/publish/daemon.go
  constant LocalDomain (line 32) | LocalDomain = "ko.local"
  type demon (line 37) | type demon struct
    method getOpts (line 82) | func (d *demon) getOpts(ctx context.Context) []daemon.Option {
    method Publish (line 90) | func (d *demon) Publish(ctx context.Context, br build.Result, s string...
    method Close (line 168) | func (d *demon) Close() error {
  type DaemonOption (line 45) | type DaemonOption
  function WithLocalDomain (line 48) | func WithLocalDomain(domain string) DaemonOption {
  function WithDockerClient (line 58) | func WithDockerClient(client daemon.Client) DaemonOption {
  function NewDaemon (line 68) | func NewDaemon(namer Namer, tags []string, opts ...DaemonOption) (Interf...

FILE: pkg/publish/daemon_test.go
  function TestDaemon (line 28) | func TestDaemon(t *testing.T) {
  function TestDaemonTags (line 48) | func TestDaemonTags(t *testing.T) {
  function TestDaemonDomain (line 81) | func TestDaemonDomain(t *testing.T) {

FILE: pkg/publish/default.go
  type defalt (line 41) | type defalt struct
    method pushResult (line 149) | func (d *defalt) pushResult(ctx context.Context, tag name.Tag, br buil...
    method Publish (line 226) | func (d *defalt) Publish(ctx context.Context, br build.Result, s strin...
    method Close (line 283) | func (d *defalt) Close() error {
  type Option (line 54) | type Option
  type defaultOpener (line 56) | type defaultOpener struct
    method Open (line 84) | func (do *defaultOpener) Open() (Interface, error) {
  type Namer (line 71) | type Namer
  function identity (line 78) | func identity(base, in string) string { return path.Join(base, in) }
  constant latestTag (line 82) | latestTag = "latest"
  function NewDefault (line 124) | func NewDefault(base string, options ...Option) (Interface, error) {

FILE: pkg/publish/default_test.go
  function TestDefault (line 45) | func TestDefault(t *testing.T) {
  function md5Hash (line 88) | func md5Hash(base, s string) string {
  function TestDefaultWithCustomNamer (line 95) | func TestDefaultWithCustomNamer(t *testing.T) {
  function TestDefaultWithTags (line 128) | func TestDefaultWithTags(t *testing.T) {
  function TestDefaultWithReleaseTag (line 176) | func TestDefaultWithReleaseTag(t *testing.T) {

FILE: pkg/publish/future.go
  function newFuture (line 23) | func newFuture(work func() (name.Reference, error)) *future {
  type result (line 42) | type result struct
  type future (line 47) | type future struct
    method Get (line 55) | func (f *future) Get() (name.Reference, error) {

FILE: pkg/publish/future_test.go
  function makeRef (line 25) | func makeRef() (name.Reference, error) {
  function TestSameFutureSameReference (line 37) | func TestSameFutureSameReference(t *testing.T) {
  function TestDiffFutureDiffReference (line 57) | func TestDiffFutureDiffReference(t *testing.T) {

FILE: pkg/publish/kind.go
  constant KindDomain (line 32) | KindDomain = "kind.local"
  type kindPublisher (line 35) | type kindPublisher struct
    method Publish (line 51) | func (t *kindPublisher) Publish(ctx context.Context, br build.Result, ...
    method Close (line 128) | func (t *kindPublisher) Close() error {
  function NewKindPublisher (line 42) | func NewKindPublisher(base string, namer Namer, tags []string) Interface {

FILE: pkg/publish/kind/write.go
  constant clusterNameEnvKey (line 35) | clusterNameEnvKey = "KIND_CLUSTER_NAME"
  type provider (line 38) | type provider interface
  function Tag (line 48) | func Tag(ctx context.Context, src, dest name.Tag) error {
  function Write (line 62) | func Write(ctx context.Context, tag name.Tag, img v1.Image) error {
  function onEachNode (line 88) | func onEachNode(f func(nodes.Node) error) error {
  function getNodes (line 104) | func getNodes() ([]nodes.Node, error) {

FILE: pkg/publish/kind/write_test.go
  function TestWrite (line 31) | func TestWrite(t *testing.T) {
  function TestTag (line 66) | func TestTag(t *testing.T) {
  function TestFailWithNoNodes (line 101) | func TestFailWithNoNodes(t *testing.T) {
  function TestFailCommands (line 130) | func TestFailCommands(t *testing.T) {
  type fakeProvider (line 164) | type fakeProvider struct
    method ListInternalNodes (line 168) | func (f *fakeProvider) ListInternalNodes(string) ([]nodes.Node, error) {
  type fakeNode (line 172) | type fakeNode struct
    method CommandContext (line 177) | func (f *fakeNode) CommandContext(_ context.Context, cmd string, args ...
    method String (line 186) | func (f *fakeNode) String() string {
    method Command (line 191) | func (f *fakeNode) Command(string, ...string) exec.Cmd { return nil }
    method Role (line 192) | func (f *fakeNode) Role() (string, error)              { return "", nil }
    method IP (line 193) | func (f *fakeNode) IP() (string, string, error)        { return "", ""...
    method SerialLogs (line 194) | func (f *fakeNode) SerialLogs(io.Writer) error         { return nil }
  type fakeCmd (line 196) | type fakeCmd struct
    method Run (line 202) | func (f *fakeCmd) Run() error {
    method SetStdin (line 210) | func (f *fakeCmd) SetStdin(stdin io.Reader) exec.Cmd {
    method SetEnv (line 216) | func (f *fakeCmd) SetEnv(...string) exec.Cmd    { return f }
    method SetStdout (line 217) | func (f *fakeCmd) SetStdout(io.Writer) exec.Cmd { return f }
    method SetStderr (line 218) | func (f *fakeCmd) SetStderr(io.Writer) exec.Cmd { return f }

FILE: pkg/publish/layout.go
  type LayoutPublisher (line 30) | type LayoutPublisher struct
    method writeResult (line 39) | func (l *LayoutPublisher) writeResult(br build.Result) (layout.Path, e...
    method Publish (line 78) | func (l *LayoutPublisher) Publish(_ context.Context, br build.Result, ...
    method Close (line 99) | func (l *LayoutPublisher) Close() error {
  function NewLayout (line 35) | func NewLayout(p string) Interface {

FILE: pkg/publish/layout_test.go
  function TestLayout (line 26) | func TestLayout(t *testing.T) {

FILE: pkg/publish/multi.go
  function MultiPublisher (line 30) | func MultiPublisher(publishers ...Interface) Interface {
  type multiPublisher (line 34) | type multiPublisher struct
    method Publish (line 39) | func (p *multiPublisher) Publish(ctx context.Context, br build.Result,...
    method Close (line 53) | func (p *multiPublisher) Close() (err error) {

FILE: pkg/publish/multi_test.go
  function TestMulti (line 27) | func TestMulti(t *testing.T) {
  function TestMulti_Zero (line 63) | func TestMulti_Zero(t *testing.T) {

FILE: pkg/publish/options.go
  type staticKeychain (line 24) | type staticKeychain struct
    method Resolve (line 28) | func (s staticKeychain) Resolve(authn.Resource) (authn.Authenticator, ...
  function WithTransport (line 34) | func WithTransport(t http.RoundTripper) Option {
  function WithUserAgent (line 43) | func WithUserAgent(ua string) Option {
  function WithAuth (line 52) | func WithAuth(a authn.Authenticator) Option {
  function WithAuthFromKeychain (line 61) | func WithAuthFromKeychain(keys authn.Keychain) Option {
  function WithNamer (line 70) | func WithNamer(n Namer) Option {
  function WithTags (line 78) | func WithTags(tags []string) Option {
  function WithTagOnly (line 86) | func WithTagOnly(tagOnly bool) Option {
  function Insecure (line 93) | func Insecure(b bool) Option {
  function WithJobs (line 112) | func WithJobs(jobs int) Option {

FILE: pkg/publish/publish.go
  type Interface (line 25) | type Interface interface

FILE: pkg/publish/recorder.go
  type recorder (line 32) | type recorder struct
    method Publish (line 51) | func (r *recorder) Publish(ctx context.Context, br build.Result, ref s...
    method Close (line 90) | func (r *recorder) Close() error {
  function NewRecorder (line 43) | func NewRecorder(inner Interface, name string) (Interface, error) {

FILE: pkg/publish/recorder_test.go
  type cbPublish (line 30) | type cbPublish struct
    method Publish (line 36) | func (sp *cbPublish) Publish(ctx context.Context, br build.Result, ref...
    method Close (line 40) | func (sp *cbPublish) Close() error {
  function TestRecorder (line 44) | func TestRecorder(t *testing.T) {

FILE: pkg/publish/shared.go
  type caching (line 27) | type caching struct
    method Publish (line 54) | func (c *caching) Publish(ctx context.Context, br build.Result, ref st...
    method Close (line 79) | func (c *caching) Close() error {
  type entry (line 36) | type entry struct
  function NewCaching (line 46) | func NewCaching(inner Interface) (Interface, error) {

FILE: pkg/publish/shared_test.go
  type slowpublish (line 27) | type slowpublish struct
    method Publish (line 34) | func (sp *slowpublish) Publish(context.Context, build.Result, string) ...
    method Close (line 39) | func (sp *slowpublish) Close() error {
  function TestCaching (line 43) | func TestCaching(t *testing.T) {

FILE: pkg/publish/tarball.go
  type tar (line 29) | type tar struct
    method Publish (line 49) | func (t *tar) Publish(_ context.Context, br build.Result, s string) (n...
    method Close (line 95) | func (t *tar) Close() error {
  function NewTarball (line 38) | func NewTarball(file, base string, namer Namer, tags []string) Interface {

FILE: pkg/publish/tarball_test.go
  function TestTarball (line 29) | func TestTarball(t *testing.T) {

FILE: pkg/resolve/resolve.go
  function ImageReferences (line 34) | func ImageReferences(ctx context.Context, docs []*yaml.Node, builder bui...
  function refsFromDoc (line 89) | func refsFromDoc(doc *yaml.Node) yit.Iterator {

FILE: pkg/resolve/resolve_test.go
  function TestYAMLArrays (line 54) | func TestYAMLArrays(t *testing.T) {
  function TestYAMLMaps (line 121) | func TestYAMLMaps(t *testing.T) {
  type object (line 189) | type object struct
  function TestYAMLObject (line 196) | func TestYAMLObject(t *testing.T) {
  function TestStrict (line 253) | func TestStrict(t *testing.T) {
  function TestIsSupportedReferenceError (line 275) | func TestIsSupportedReferenceError(t *testing.T) {
  function mustRandom (line 295) | func mustRandom() build.Result {
  function mustRepository (line 303) | func mustRepository(s string) name.Repository {
  function mustDigest (line 311) | func mustDigest(img build.Result) v1.Hash {

FILE: pkg/resolve/selector.go
  function MatchesSelector (line 31) | func MatchesSelector(doc *yaml.Node, selector labels.Selector) (bool, er...
  function docKind (line 52) | func docKind(doc *yaml.Node) (string, error) {
  function objMatchesSelector (line 82) | func objMatchesSelector(doc *yaml.Node, selector labels.Selector) bool {
  function listMatchesSelector (line 110) | func listMatchesSelector(doc *yaml.Node, selector labels.Selector) (bool...
  type labelsNode (line 145) | type labelsNode struct
    method Get (line 151) | func (n labelsNode) Get(label string) (value string) {
    method Has (line 160) | func (n labelsNode) Has(label string) bool {
    method Lookup (line 169) | func (n labelsNode) Lookup(label string) (value string, exists bool) {

FILE: pkg/resolve/selector_test.go
  constant webPod (line 35) | webPod = `apiVersion: v1
  constant dbPod (line 43) | dbPod = `apiVersion: v1
  constant podNoLabel (line 51) | podNoLabel = `apiVersion: v1
  constant podList (line 56) | podList = `apiVersion: v1
  constant webPodList (line 75) | webPodList = `apiVersion: v1
  constant dbPodList (line 88) | dbPodList = `apiVersion: v1
  constant podListNoLabel (line 101) | podListNoLabel = `apiVersion: v1
  function TestMatchesSelector (line 118) | func TestMatchesSelector(t *testing.T) {
  function TestSelectorFailure (line 225) | func TestSelectorFailure(t *testing.T) {
  function selector (line 264) | func selector(s string) labels.Selector {
  function normalizeYAML (line 272) | func normalizeYAML(t *testing.T, yuml string) string {
  function yamlToStr (line 277) | func yamlToStr(t *testing.T, node *yaml.Node) string {
  function strToYAML (line 286) | func strToYAML(t *testing.T, yuml string) *yaml.Node {
  function TestLabelsNode (line 297) | func TestLabelsNode(t *testing.T) {

FILE: test/build-configs/bar/cmd/main.go
  function main (line 19) | func main() {

FILE: test/build-configs/caps/cmd/main.go
  function permittedCaps (line 25) | func permittedCaps() (uint64, error) {
  function main (line 39) | func main() {

FILE: test/build-configs/foo/cmd/main.go
  function main (line 19) | func main() {

FILE: test/build-configs/toolexec/cmd/main.go
  function main (line 19) | func main() {

FILE: test/main.go
  function main (line 40) | func main() {
Condensed preview — 186 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (662K chars).
[
  {
    "path": ".github/dependabot.yml",
    "chars": 201,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"gomod\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n  - package-"
  },
  {
    "path": ".github/workflows/analyze.yaml",
    "chars": 840,
    "preview": "name: Analyze\n\non:\n  workflow_dispatch:\n  push:\n    branches: ['main']\n  pull_request:\n    branches: ['main']\n\npermissio"
  },
  {
    "path": ".github/workflows/boilerplate.yaml",
    "chars": 834,
    "preview": "name: Boilerplate\n\non:\n  pull_request:\n    branches: ['main']\n\npermissions: {}\n\njobs:\n  check:\n    name: Boilerplate Che"
  },
  {
    "path": ".github/workflows/build.yaml",
    "chars": 597,
    "preview": "name: Build\n\non:\n  pull_request:\n    branches:\n      - \"main\"\n\npermissions: {}\n\njobs:\n  build:\n    name: Build\n    runs-"
  },
  {
    "path": ".github/workflows/donotsubmit.yaml",
    "chars": 427,
    "preview": "name: Do Not Submit\n\non:\n  pull_request:\n    branches: ['main']\n\npermissions: {}\n\njobs:\n  donotsubmit:\n    name: Do Not "
  },
  {
    "path": ".github/workflows/e2e.yaml",
    "chars": 3529,
    "preview": "name: Basic e2e test\n\non:\n  pull_request:\n    branches:\n      - 'main'\n\npermissions: {}\n\njobs:\n  e2e:\n    strategy:\n    "
  },
  {
    "path": ".github/workflows/image.yaml",
    "chars": 1286,
    "preview": "name: image\n\non:\n  push:\n    branches:\n      - 'main'\n  workflow_dispatch:\n\npermissions: {}\n\njobs:\n  image:\n    runs-on:"
  },
  {
    "path": ".github/workflows/kind-e2e.yaml",
    "chars": 2306,
    "preview": "name: KinD e2e tests\n\non:\n  workflow_dispatch:  # Allow manual runs.\n  pull_request:\n    branches:\n      - 'main'\n\npermi"
  },
  {
    "path": ".github/workflows/modules-integration-test.yaml",
    "chars": 577,
    "preview": "name: Integration Test\n\non:\n  pull_request:\n    branches:\n      - 'main'\n\npermissions: {}\n\njobs:\n  test:\n    name: Modul"
  },
  {
    "path": ".github/workflows/publish-site.yaml",
    "chars": 515,
    "preview": "name: publish\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - 'main'\n\npermissions: {}\n\njobs:\n  publish:\n    runs-"
  },
  {
    "path": ".github/workflows/registries.yaml",
    "chars": 2891,
    "preview": "name: Push to registries\n\non:\n  push:\n    branches:\n      - 'main'\n\n  workflow_dispatch:  # Allow manual runs.\n\npermissi"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 4877,
    "preview": "name: goreleaser\n\non:\n  push:\n    tags:\n      - '*'\n\npermissions: {}\n\njobs:\n  goreleaser:\n    outputs:\n      hashes: ${{"
  },
  {
    "path": ".github/workflows/sbom.yaml",
    "chars": 2714,
    "preview": "name: Validate SBOMs\n\non:\n  pull_request:\n    branches:\n      - 'main'\n\nenv:\n  SPDX_TOOLS_VERSION: 1.1.0\n\npermissions: {"
  },
  {
    "path": ".github/workflows/stale.yaml",
    "chars": 1071,
    "preview": "name: 'Close stale'\n\non:\n  schedule:\n  - cron: '0 1 * * *'\n\npermissions: {}\n\njobs:\n  stale:\n    runs-on: 'ubuntu-latest'"
  },
  {
    "path": ".github/workflows/style.yaml",
    "chars": 2364,
    "preview": "name: Code Style\n\non:\n  pull_request:\n    branches:\n      - 'main'\n\npermissions: {}\n\njobs:\n  gofmt:\n    name: check gofm"
  },
  {
    "path": ".github/workflows/test.yaml",
    "chars": 602,
    "preview": "name: Test\n\non:\n  push:\n    branches:\n      - 'main'\n  pull_request:\n    branches:\n      - 'main'\n\npermissions: {}\n\njobs"
  },
  {
    "path": ".github/workflows/verify.yaml",
    "chars": 1110,
    "preview": "name: Verify\n\non:\n  pull_request:\n    branches:\n      - \"main\"\n\npermissions: {}\n\njobs:\n  verify:\n    name: Verify Codege"
  },
  {
    "path": ".gitignore",
    "chars": 66,
    "preview": "# Ignore GoLand (IntelliJ) files.\n.idea/\n\nko\n\n.DS_Store\n\n/vendor/\n"
  },
  {
    "path": ".golangci.yaml",
    "chars": 729,
    "preview": "version: \"2\"\nlinters:\n  enable:\n    - asciicheck\n    - errorlint\n    - gosec\n    - importas\n    - misspell\n    - preallo"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 1516,
    "preview": "version: 2\n\nbefore:\n  hooks:\n    - go mod tidy\n    - /bin/bash -c 'if [ -n \"$(git --no-pager diff --exit-code go.mod go."
  },
  {
    "path": ".ko.yaml",
    "chars": 120,
    "preview": "baseImageOverrides:\n  github.com/google/ko: golang:latest\n\nbuilds:\n  - id: ko\n    ldflags:\n      - \"{{ .Env.LDFLAGS }}\"\n"
  },
  {
    "path": ".wokeignore",
    "chars": 41,
    "preview": "# Uses some Cobra methods\npkg/commands/*\n"
  },
  {
    "path": "CNAME",
    "chars": 8,
    "preview": "ko.build"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 623,
    "preview": "# How to Contribute to ko\n\nWe'd love to accept your patches and contributions to this project. There are\njust a few smal"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "MAINTAINERS.md",
    "chars": 306,
    "preview": "# Maintainers\n\nThis page lists all active members of the maintainers for the `ko` project and any subprojects.\n\n- Jon Jo"
  },
  {
    "path": "README.md",
    "chars": 2192,
    "preview": "# `ko`: Easy Go Containers\n\n[![GitHub Actions Build Status](https://github.com/ko-build/ko/workflows/Build/badge.svg)](h"
  },
  {
    "path": "ROADMAP.md",
    "chars": 887,
    "preview": "# `ko` Project Roadmap\n\n_Last updated October 2022_\n\n- Foster a community of contributors and users\n  - give talks, do o"
  },
  {
    "path": "cmd/help/main.go",
    "chars": 1169,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "code-of-conduct.md",
    "chars": 3250,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "docs/CNAME",
    "chars": 9,
    "preview": "ko.build\n"
  },
  {
    "path": "docs/README.md",
    "chars": 852,
    "preview": "# Docs for https://ko.build\n\n## Development\n\nUpdate `.md` files to update content.\n\nUpdate `mkdocs.yml` to update sideba"
  },
  {
    "path": "docs/advanced/faq.md",
    "chars": 4373,
    "preview": "# Frequently Asked Questions\n\n## How can I set `ldflags`?\n\n[Using -ldflags](https://blog.cloudflare.com/setting-go-varia"
  },
  {
    "path": "docs/advanced/go-packages.md",
    "chars": 1817,
    "preview": "# Go Packages\n\n`ko`'s functionality can be consumed as a library in a Go application.\n\nTo build an image, use [`pkg/buil"
  },
  {
    "path": "docs/advanced/lambda.md",
    "chars": 2069,
    "preview": "# AWS Lambda\n\n`ko` can build images that can be deployed as AWS Lambda functions, using [Lambda's container support](htt"
  },
  {
    "path": "docs/advanced/limitations.md",
    "chars": 617,
    "preview": "# Limitations\n\n`ko` works best when your application has no dependencies on the underlying image.\n\nThis means `ko` is id"
  },
  {
    "path": "docs/advanced/linux-capabilities.md",
    "chars": 2392,
    "preview": "# Linux Capabilities\n\nIn Linux, capabilities are a way to selectively grant privileges to a running process.\n\nDocker pro"
  },
  {
    "path": "docs/advanced/migrating-from-dockerfile.md",
    "chars": 2101,
    "preview": "# Migrating from Dockerfile\n\nIf your `Dockerfile` looks like either of the examples in the [official tutorial for writin"
  },
  {
    "path": "docs/advanced/root-ca-certificates.md",
    "chars": 3970,
    "preview": "# Root CA Certificates\n\nTo install a [root certificate](https://en.wikipedia.org/wiki/Root_certificate) into your contai"
  },
  {
    "path": "docs/advanced/terraform.md",
    "chars": 1147,
    "preview": "# Terraform Provider\n\nIn addition to the CLI, `ko`'s functionality is also available as a Terraform provider.\n\nThis allo"
  },
  {
    "path": "docs/community.md",
    "chars": 720,
    "preview": "# Community\n\n## Meetings\n\nWe have a bi-weekly community meeting on [Wednesdays at 1:00 PM US Eastern time, 10:00 AM US W"
  },
  {
    "path": "docs/configuration.md",
    "chars": 8765,
    "preview": "# Configuration\n\n## Basic Configuration\n\nAside from certain environment variables (see [below](#environment-variables-ad"
  },
  {
    "path": "docs/custom/main.html",
    "chars": 447,
    "preview": "{% extends \"base.html\" %}\n\n{% block site_meta %}\n    {{ super() }}\n    {% if page and page.meta and page.meta.ko_meta %}"
  },
  {
    "path": "docs/custom/partials/copyright.html",
    "chars": 224,
    "preview": "<small>The Linux Foundation® (TLF) has registered trademarks and uses trademarks. For a list of TLF trademarks, see <a h"
  },
  {
    "path": "docs/deployment.md",
    "chars": 2012,
    "preview": "# Deployment\n\n_See [Kubernetes Integration](../features/k8s) for information about deploying to Kubernetes._\n\nBecause th"
  },
  {
    "path": "docs/features/build-cache.md",
    "chars": 642,
    "preview": "# Build Cache\n\nBecause `ko` just runs `go build` in your normal development environment, it automatically reuses your [`"
  },
  {
    "path": "docs/features/debugging.md",
    "chars": 1386,
    "preview": "# Debugging\n\nSometimes it's challenging to track down the cause of unexpected behavior in an app. Because `ko` makes it "
  },
  {
    "path": "docs/features/k8s.md",
    "chars": 2648,
    "preview": "# Kubernetes Integration\n\nYou _could_ stop at just building and pushing images.\n\nBut, because building images is so _eas"
  },
  {
    "path": "docs/features/multi-platform.md",
    "chars": 727,
    "preview": "# Multi-Platform Images\n\nBecause Go supports cross-compilation to other CPU architectures and operating systems, `ko` ex"
  },
  {
    "path": "docs/features/sboms.md",
    "chars": 679,
    "preview": "# SBOMs\n\nA [Software Bill of Materials (SBOM)](https://en.wikipedia.org/wiki/Software_bill_of_materials) is a list of so"
  },
  {
    "path": "docs/features/static-assets.md",
    "chars": 1335,
    "preview": "# Static Assets\n\n`ko` can also bundle static assets into the images it produces.\n\nBy convention, any contents of a direc"
  },
  {
    "path": "docs/get-started.md",
    "chars": 2290,
    "preview": "# Get Started\n\n## Setup\n\nFirst, [install `ko`](../install).\n\n### Authenticate\n\n`ko` depends on the authentication config"
  },
  {
    "path": "docs/index.md",
    "chars": 1663,
    "preview": "---\nko_meta: true\n---\n\n# Introduction\n\n`ko` makes building Go container images easy, fast, and secure by default.\n\n![Dem"
  },
  {
    "path": "docs/install.md",
    "chars": 2625,
    "preview": "# Installation\n\n### Install from [GitHub Releases](https://github.com/ko-build/ko/releases)\n\n```\n$ VERSION=TODO # choose"
  },
  {
    "path": "docs/reference/ko.md",
    "chars": 889,
    "preview": "## ko\n\nRapidly iterate with Go, Containers, and Kubernetes.\n\n```\nko [flags]\n```\n\n### Options\n\n```\n  -h, --help      help"
  },
  {
    "path": "docs/reference/ko_apply.md",
    "chars": 4186,
    "preview": "## ko apply\n\nApply the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis sub"
  },
  {
    "path": "docs/reference/ko_build.md",
    "chars": 3810,
    "preview": "## ko build\n\nBuild and publish container images from the given importpaths.\n\n### Synopsis\n\nThis sub-command builds the p"
  },
  {
    "path": "docs/reference/ko_create.md",
    "chars": 4199,
    "preview": "## ko create\n\nCreate the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis s"
  },
  {
    "path": "docs/reference/ko_delete.md",
    "chars": 315,
    "preview": "## ko delete\n\nSee \"kubectl help delete\" for detailed usage.\n\n```\nko delete [flags]\n```\n\n### Options\n\n```\n  -h, --help   "
  },
  {
    "path": "docs/reference/ko_login.md",
    "chars": 549,
    "preview": "## ko login\n\nLog in to a registry\n\n```\nko login [OPTIONS] [SERVER] [flags]\n```\n\n### Examples\n\n```\n  # Log in to reg.exam"
  },
  {
    "path": "docs/reference/ko_resolve.md",
    "chars": 3963,
    "preview": "## ko resolve\n\nPrint the input files with image references resolved to built/pushed image digests.\n\n### Synopsis\n\nThis s"
  },
  {
    "path": "docs/reference/ko_run.md",
    "chars": 3193,
    "preview": "## ko run\n\nA variant of `kubectl run` that containerizes IMPORTPATH first.\n\n### Synopsis\n\nThis sub-command combines \"ko "
  },
  {
    "path": "docs/reference/ko_version.md",
    "chars": 290,
    "preview": "## ko version\n\nPrint ko version.\n\n```\nko version [flags]\n```\n\n### Options\n\n```\n  -h, --help   help for version\n```\n\n### "
  },
  {
    "path": "go.mod",
    "chars": 9074,
    "preview": "module github.com/google/ko\n\ngo 1.25.7\n\nrequire (\n\tgithub.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.12.0\n\tgi"
  },
  {
    "path": "go.sum",
    "chars": 57037,
    "preview": "al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=\nal.essio.dev/pkg/shellescape v1.6.0/"
  },
  {
    "path": "hack/boilerplate/boilerplate.go.txt",
    "chars": 613,
    "preview": "// Copyright 2023 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "hack/boilerplate/boilerplate.sh.txt",
    "chars": 622,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2023 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
  },
  {
    "path": "hack/presubmit.sh",
    "chars": 1056,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
  },
  {
    "path": "hack/tools.go",
    "chars": 712,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "hack/update-codegen.sh",
    "chars": 860,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
  },
  {
    "path": "hack/update-deps.sh",
    "chars": 785,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2018 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
  },
  {
    "path": "integration_test.sh",
    "chars": 2504,
    "preview": "#!/bin/bash\nset -o errexit\nset -o nounset\nset -o pipefail\n\nROOT_DIR=$(dirname \"$0\")\n\npushd \"$ROOT_DIR\"\n\nROOT_DIR=\"$(pwd)"
  },
  {
    "path": "internal/sbom/sbom.go",
    "chars": 2387,
    "preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "internal/sbom/spdx.go",
    "chars": 15619,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "main.go",
    "chars": 943,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "mkdocs.yml",
    "chars": 2788,
    "preview": "site_name: 'ko: Easy Go Containers'\nsite_url: https://ko.build\nrepo_url: https://github.com/ko-build/ko\nedit_uri: edit/m"
  },
  {
    "path": "pkg/build/build.go",
    "chars": 2120,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/cache.go",
    "chars": 5234,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/config.go",
    "chars": 3503,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/doc.go",
    "chars": 726,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/future.go",
    "chars": 1866,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/future_test.go",
    "chars": 1620,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/gobuild.go",
    "chars": 45295,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/gobuild_test.go",
    "chars": 43894,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/gobuilds.go",
    "chars": 5446,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/gobuilds_test.go",
    "chars": 5611,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/layer.go",
    "chars": 1860,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/limit.go",
    "chars": 1705,
    "preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/limit_test.go",
    "chars": 1553,
    "preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/options.go",
    "chars": 5745,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/recorder.go",
    "chars": 1424,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/recorder_test.go",
    "chars": 2678,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/shared.go",
    "chars": 2278,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/shared_test.go",
    "chars": 2402,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/strict.go",
    "chars": 1218,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/build/strict_test.go",
    "chars": 1428,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/caps/caps.go",
    "chars": 5765,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/caps/caps_dd_test.go",
    "chars": 5380,
    "preview": "// Generated file, do not edit.\n\n// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache"
  },
  {
    "path": "pkg/caps/caps_test.go",
    "chars": 2358,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/caps/gen.sh",
    "chars": 2518,
    "preview": "#!/usr/bin/env bash\n\n# Copyright 2024 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Versi"
  },
  {
    "path": "pkg/caps/new_file_caps_test.go",
    "chars": 2349,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/apply.go",
    "chars": 4713,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/build.go",
    "chars": 3184,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/cache.go",
    "chars": 10176,
    "preview": "// Copyright 2023 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/commands.go",
    "chars": 1243,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/config.go",
    "chars": 5032,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/config_test.go",
    "chars": 1713,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/create.go",
    "chars": 4739,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/delete.go",
    "chars": 2026,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/build.go",
    "chars": 10445,
    "preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/build_test.go",
    "chars": 5671,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/filestuff.go",
    "chars": 2700,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/namer_test.go",
    "chars": 2124,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/publish.go",
    "chars": 5095,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/selector.go",
    "chars": 1026,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/testdata/bad-config/.ko.yaml/.gitignore",
    "chars": 69,
    "preview": ".# We just want to have a practically empty directory.\n*\n!.gitignore\n"
  },
  {
    "path": "pkg/commands/options/testdata/config/.ko.yaml",
    "chars": 127,
    "preview": "defaultBaseImage: alpine\ndefaultPlatforms: all\ndefaultEnv: FOO=bar\ndefaultFlags:\n  - -tags\n  - netgo\ndefaultLdflags:\n  -"
  },
  {
    "path": "pkg/commands/options/testdata/config/my-ko.yaml",
    "chars": 22,
    "preview": "defaultBaseImage: wow\n"
  },
  {
    "path": "pkg/commands/options/testdata/multiple-platforms/.ko.yaml",
    "chars": 71,
    "preview": "defaultBaseImage: alpine\ndefaultPlatforms:\n- linux/arm64\n- linux/amd64\n"
  },
  {
    "path": "pkg/commands/options/testdata/paths/.ko.yaml",
    "chars": 112,
    "preview": "builds:\n- id: app-with-main-package-in-different-directory-to-go-mod-and-ko-yaml\n  dir: ./app\n  main: ./cmd/foo\n"
  },
  {
    "path": "pkg/commands/options/testdata/paths/app/cmd/foo/main.go",
    "chars": 682,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/options/testdata/paths/app/go.mod",
    "chars": 36,
    "preview": "module example.com/testapp\n\ngo 1.15\n"
  },
  {
    "path": "pkg/commands/options/validate.go",
    "chars": 1856,
    "preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/publisher.go",
    "chars": 1788,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/publisher_test.go",
    "chars": 3129,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/resolve.go",
    "chars": 2812,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/resolver.go",
    "chars": 14152,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/resolver_test.go",
    "chars": 11068,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/root.go",
    "chars": 1890,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/run.go",
    "chars": 4760,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/commands/version.go",
    "chars": 1282,
    "preview": "// Copyright 2019 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/doc.go",
    "chars": 685,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/git/clone.go",
    "chars": 2228,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/git/errors.go",
    "chars": 2647,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/git/git.go",
    "chars": 3205,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/git/info.go",
    "chars": 6296,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/git/info_test.go",
    "chars": 6657,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/gittesting/git.go",
    "chars": 3892,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/gittesting/git_test.go",
    "chars": 1997,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/testing/daemon.go",
    "chars": 1577,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/testing/doc.go",
    "chars": 699,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/testing/fixed.go",
    "chars": 2819,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/internal/testing/fixed_test.go",
    "chars": 2649,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/daemon.go",
    "chars": 4323,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/daemon_test.go",
    "chars": 3340,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/default.go",
    "chars": 7674,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/default_test.go",
    "chars": 8112,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/doc.go",
    "chars": 782,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/future.go",
    "chars": 1944,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/future_test.go",
    "chars": 1712,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/kind/doc.go",
    "chars": 698,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/kind/write.go",
    "chars": 3379,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/kind/write_test.go",
    "chars": 5423,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/kind.go",
    "chars": 3227,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/layout.go",
    "chars": 2552,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/layout_test.go",
    "chars": 1276,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/multi.go",
    "chars": 1711,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/multi_test.go",
    "chars": 1876,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/options.go",
    "chars": 2921,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/publish.go",
    "chars": 1193,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/recorder.go",
    "chars": 2683,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/recorder_test.go",
    "chars": 2952,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/shared.go",
    "chars": 2220,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/shared_test.go",
    "chars": 2436,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/tarball.go",
    "chars": 2876,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/publish/tarball_test.go",
    "chars": 1889,
    "preview": "// Copyright 2020 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/resolve/doc.go",
    "chars": 700,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/resolve/resolve.go",
    "chars": 2511,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/resolve/resolve_test.go",
    "chars": 9518,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/resolve/selector.go",
    "chars": 3986,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "pkg/resolve/selector_test.go",
    "chars": 8518,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/.ko.yaml",
    "chars": 877,
    "preview": "# Copyright 2021 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "test/build-configs/bar/cmd/main.go",
    "chars": 678,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/bar/go.mod",
    "chars": 646,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/caps/cmd/main.go",
    "chars": 1298,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/caps/go.mod",
    "chars": 647,
    "preview": "// Copyright 2024 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/caps.ko.yaml",
    "chars": 707,
    "preview": "# Copyright 2024 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "test/build-configs/foo/cmd/main.go",
    "chars": 678,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/foo/go.mod",
    "chars": 646,
    "preview": "// Copyright 2021 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/toolexec/cmd/main.go",
    "chars": 683,
    "preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/build-configs/toolexec/go.mod",
    "chars": 651,
    "preview": "// Copyright 2022 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/kodata/a",
    "chars": 6,
    "preview": "hello\n"
  },
  {
    "path": "test/kodata/kenobi",
    "chars": 12,
    "preview": "Hello there\n"
  },
  {
    "path": "test/kodata/subdir/file.txt",
    "chars": 20,
    "preview": "subdir file content\n"
  },
  {
    "path": "test/main.go",
    "chars": 2233,
    "preview": "// Copyright 2018 ko Build Authors All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "test/test.yaml",
    "chars": 782,
    "preview": "# Copyright 2018 ko Build Authors All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  }
]

About this extraction

This page contains the full source code of the ko-build/ko GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 186 files (594.7 KB), approximately 182.6k tokens, and a symbol index with 537 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!