From f8c7a1ee22c08af1285e0826caf92674dee448af Mon Sep 17 00:00:00 2001 From: Samuel K Date: Wed, 24 Jun 2026 08:19:28 -0500 Subject: [PATCH 1/3] docs: reposition for engineering-at-scale and streamline navigation Refresh the docs voice toward organizations scaling engineering operations, collapse the six per-IDE Quick Start pages into a single guide, and fix sidebar section spacing so every category renders consistently. Signed-off-by: Samuel K --- .../inactivity-timeout.mdx | 4 +- .../what-are-workspaces.mdx | 9 +- .../pages/quickstart/browser.mdx | 26 ----- .../pages/quickstart/devsy-cli.mdx | 43 -------- .../pages/quickstart/jetbrains.mdx | 34 ------- .../pages/quickstart/quickstart.mdx | 99 +++++++++++++++++++ sites/docs-devsy-sh/pages/quickstart/ssh.mdx | 35 ------- sites/docs-devsy-sh/pages/quickstart/vim.mdx | 37 ------- .../docs-devsy-sh/pages/quickstart/vscode.mdx | 31 ------ sites/docs-devsy-sh/pages/what-is-devsy.mdx | 24 ++--- sites/docs-devsy-sh/sidebars.js | 34 +------ sites/docs-devsy-sh/src/css/custom.css | 18 +--- 12 files changed, 120 insertions(+), 274 deletions(-) delete mode 100644 sites/docs-devsy-sh/pages/quickstart/browser.mdx delete mode 100644 sites/docs-devsy-sh/pages/quickstart/devsy-cli.mdx delete mode 100644 sites/docs-devsy-sh/pages/quickstart/jetbrains.mdx create mode 100644 sites/docs-devsy-sh/pages/quickstart/quickstart.mdx delete mode 100644 sites/docs-devsy-sh/pages/quickstart/ssh.mdx delete mode 100644 sites/docs-devsy-sh/pages/quickstart/vim.mdx delete mode 100644 sites/docs-devsy-sh/pages/quickstart/vscode.mdx diff --git a/sites/docs-devsy-sh/pages/developing-in-workspaces/inactivity-timeout.mdx b/sites/docs-devsy-sh/pages/developing-in-workspaces/inactivity-timeout.mdx index 5f8b5accb..dcda7fb1c 100644 --- a/sites/docs-devsy-sh/pages/developing-in-workspaces/inactivity-timeout.mdx +++ b/sites/docs-devsy-sh/pages/developing-in-workspaces/inactivity-timeout.mdx @@ -28,9 +28,7 @@ For non-machine providers, Devsy can automatically kill the container its runnin ### Machine Providers -For machine providers, killing just the container within the remote machine is typically not enough as VMs still generate costs even if they are unused. -Instead, Devsy will install itself as a Daemon into the remote VM and track the activity from there. If there wasn't activity for a given amount of time, Devsy will automatically shutdown the machine or even delete it, based on what's cheaper for the given cloud provider. -Then when the developer wants to resume development, Devsy will restart or recreate the virtual machine. +For machine providers, killing just the container within the remote machine is typically not enough as VMs still generate costs even if they are unused. Instead, Devsy will install itself as a Daemon into the remote VM and track the activity from there. If there wasn't activity for a given amount of time, Devsy will automatically shutdown the machine or even delete it, based on whichever is more cost-effective for the given cloud provider. Then when the developer wants to resume development, Devsy restarts or recreates the virtual machine. :::info See [agent's development guide](../developing-providers/agent.mdx#machine-providers) to learn more about how inactivity-timeout works on the provider side. diff --git a/sites/docs-devsy-sh/pages/developing-in-workspaces/what-are-workspaces.mdx b/sites/docs-devsy-sh/pages/developing-in-workspaces/what-are-workspaces.mdx index fd08cfbf5..eb1ded717 100644 --- a/sites/docs-devsy-sh/pages/developing-in-workspaces/what-are-workspaces.mdx +++ b/sites/docs-devsy-sh/pages/developing-in-workspaces/what-are-workspaces.mdx @@ -3,11 +3,8 @@ title: What are Workspaces? sidebar_label: What are Workspaces? --- -A workspace in Devsy is a containerized development environment, that holds the source code of a project as well as the dependencies to work on that project, such as a compiler and debugger. -The underlying environment where the container runs will be created and managed through a Devsy provider. This allows Devsy to provide a consistent development experience no matter where the container is actually running, which can be a remote machine in a public cloud, localhost or even a Kubernetes cluster. +A workspace in Devsy is a containerized development environment that holds a project's source code along with the dependencies needed to work on it, such as a compiler and debugger. The underlying environment where the container runs is created and managed through a Devsy provider. This gives every engineer a consistent development experience no matter where the container actually runs — a remote machine in a public cloud, localhost, or a Kubernetes cluster. -To configure the development container, Devsy reuses the [devcontainer.json](https://containers.dev/) specification, which is also used by other popular tools, such as [VS Code dev containers](https://code.visualstudio.com/docs/devcontainers/containers) or [GitHub Codespaces](https://github.com/features/codespaces). -This means you can already reuse projects that use this configuration to spin up a workspace in Devsy. If no configuration is found, Devsy will automatically try to find out what programming language is used and provide an appropriate template. +To configure the development container, Devsy reuses the [devcontainer.json](https://containers.dev/) specification, which is also used by other popular tools such as [VS Code dev containers](https://code.visualstudio.com/docs/devcontainers/containers) and [GitHub Codespaces](https://github.com/features/codespaces). This means any project that already uses this configuration can spin up a workspace in Devsy with no extra setup. If no configuration is found, Devsy detects the project's programming language and provides an appropriate template. -A workspace in Devsy can be stopped and restarted without losing its state. This allows you to install additional programs or change configuration without the need to reconfigure the container. -Depending on the Provider, Devsy will also automatically determine when a workspace is currently not be used and shutdown any unused resources to save costs. +A workspace can be stopped and restarted without losing its state, so you can install additional programs or change configuration without reconfiguring the container. Depending on the provider, Devsy also detects when a workspace is no longer in use and shuts down idle resources to keep infrastructure costs down. diff --git a/sites/docs-devsy-sh/pages/quickstart/browser.mdx b/sites/docs-devsy-sh/pages/quickstart/browser.mdx deleted file mode 100644 index 63a63a069..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/browser.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Quickstart VS Code Browser -sidebar_label: VS Code Browser ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with VS Code Browser - -Make sure you have installed [Devsy](../getting-started/install.mdx) on your system. - -### Add a Provider - - - -### Start a Workspace with VS Code Browser - -Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: - -1. **Provider** – pick an initialized provider. -2. **Source** – enter your project URL or choose one of the quickstart templates. -3. **IDE** – select **VS Code Browser**. -4. **Review** – confirm the configuration. -5. **Launch** – start the workspace. - -The wizard streams logs as Devsy starts the workspace. Once it's ready, VS Code opens in your browser connected to the DevContainer. diff --git a/sites/docs-devsy-sh/pages/quickstart/devsy-cli.mdx b/sites/docs-devsy-sh/pages/quickstart/devsy-cli.mdx deleted file mode 100644 index 22c881aff..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/devsy-cli.mdx +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Quickstart Devsy CLI -sidebar_label: Devsy CLI ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with Devsy CLI - -Make sure you have installed [Devsy CLI](../getting-started/install.mdx#install-devsy-cli) on your system. - -### Add a Provider - -You can add a provider via (local-docker for example): - -``` -devsy provider add docker -``` - -:::info Other providers -For more providers, please take a look at [Add a Devsy Provider](../managing-providers/add-provider.mdx) -::: - -### Start a Workspace - -Afterwards you can start a workspace via: - -``` -# Start in VS Code browser -devsy workspace up github.com/microsoft/vscode-remote-try-node --ide openvscode - -# Start in VS Code -devsy workspace up github.com/microsoft/vscode-remote-try-node --ide vscode - -# Start without IDE -devsy workspace up github.com/microsoft/vscode-remote-try-node --ide none -``` - -If you have selected an IDE it should popup automatically. If not, you can connect to the workspace manually: - -``` -ssh MY_WORKSPACE_NAME.devsy -``` diff --git a/sites/docs-devsy-sh/pages/quickstart/jetbrains.mdx b/sites/docs-devsy-sh/pages/quickstart/jetbrains.mdx deleted file mode 100644 index 0514543ad..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/jetbrains.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Quickstart JetBrains (IntelliJ etc.) -sidebar_label: JetBrains (IntelliJ etc.) ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with JetBrains - -Make sure you have installed [Devsy](../getting-started/install.mdx) on your system. - -### Install Prerequisites - -Make sure to install the following prerequisites: -* [Jetbrains IDE](https://www.jetbrains.com/) -* [Jetbrains Gateway](https://www.jetbrains.com/remote-development/gateway/) - -### Add a Provider - - - -### Start a Workspace - -Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: - -1. **Provider** – pick an initialized provider. -2. **Source** – enter your project URL or choose one of the quickstart templates. -3. **IDE** – pick a JetBrains IDE (for example IntelliJ IDEA, GoLand, PyCharm, WebStorm, RustRover, RubyMine, CLion). -4. **Review** – confirm the configuration. -5. **Launch** – start the workspace. - -The wizard streams logs as Devsy starts the workspace. After the workspace was created, JetBrains Gateway should automatically open with a prefilled form for the workspace. - -Press 'Check Connection and Continue' without changing any configuration. This should start the IDE in the workspace. After the IDE has been initialized, your JetBrains IDE should open up inside the workspace. diff --git a/sites/docs-devsy-sh/pages/quickstart/quickstart.mdx b/sites/docs-devsy-sh/pages/quickstart/quickstart.mdx new file mode 100644 index 000000000..7d91ead2d --- /dev/null +++ b/sites/docs-devsy-sh/pages/quickstart/quickstart.mdx @@ -0,0 +1,99 @@ +--- +title: Quick Start +sidebar_label: Quick Start +--- + +import AddProvider from '../fragments/add-provider.mdx' + +This guide walks you from a fresh install to a running workspace using either the Devsy Desktop application or the Devsy CLI. Make sure you have installed [Devsy](../getting-started/install.mdx) on your system first. + +## Prerequisites + +Devsy connects your local editor to the workspace, so install the IDE you plan to use: + +- **VS Code** — [download VS Code](https://code.visualstudio.com/download). +- **VS Code Browser** — no local install required; it opens in your browser. +- **JetBrains (IntelliJ, GoLand, PyCharm, WebStorm, RustRover, RubyMine, CLion)** — install a [JetBrains IDE](https://www.jetbrains.com/) and [JetBrains Gateway](https://www.jetbrains.com/remote-development/gateway/). +- **SSH / Vim / Neovim** — no local IDE required; you connect to the workspace over SSH. + +## Quick Start with Devsy Desktop + +### Add a Provider + + + +### Start a Workspace + +Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: + +1. **Provider** – pick an initialized provider. +2. **Source** – enter your project URL or choose one of the quickstart templates. +3. **IDE** – pick how you want to open the workspace: + - **VS Code** – opens VS Code locally, connected to the dev container. + - **VS Code Browser** – opens VS Code in your browser, connected to the dev container. + - **JetBrains** – opens your chosen JetBrains IDE through JetBrains Gateway. + - **None** – skip opening an IDE and connect over SSH (use this for Vim/Neovim or a plain SSH session). +4. **Review** – confirm the configuration. +5. **Launch** – start the workspace. + +The wizard streams logs as Devsy starts the workspace. Once it's ready, your chosen IDE opens connected to the dev container. + +:::info JetBrains Gateway +If you selected a JetBrains IDE, JetBrains Gateway opens automatically with a prefilled form for the workspace. Press **Check Connection and Continue** without changing any configuration to start the IDE inside the workspace. +::: + +### Connect over SSH + +If you selected **None**, connect to the workspace over SSH once it's running: + +``` +ssh WORKSPACE_NAME.devsy +``` + +#### Vim / Neovim + +After connecting, you have two options to start coding in Vim/Neovim: + +- **Netrw/SCP** — Vim/Neovim can edit remote files using [Netrw](https://www.vim.org/scripts/script.php?script_id=1075). Connect from within Vim with `:e scp://[user@]machine[[:#]port]/path`, or start Vim with `vim scp://[user@]machine[[:#]port]/path`. The Devsy logs give you the user/machine combination, usually in the form `WORKSPACE_NAME.devsy`. +- **Your Vim config in the workspace** — because the target environment is a container, you can SSH in and install your Vim/Neovim configuration like you would on any new machine. Run the `ssh WORKSPACE_NAME.devsy` command Devsy prints after starting the workspace. + +:::info Environment variables +To use environment variables in your `devcontainer.json` — for example, for dynamic control over the container image version — see [Environment variables in devcontainer.json](../developing-in-workspaces/environment-variables-in-devcontainer-json.mdx). +::: + +## Quick Start with the Devsy CLI + +Make sure you have installed the [Devsy CLI](../getting-started/install.mdx#install-devsy-cli) on your system. + +### Add a Provider + +Add a provider (local Docker, for example): + +``` +devsy provider add docker +``` + +:::info Other providers +For more providers, take a look at [Add a Devsy Provider](../managing-providers/add-provider.mdx). +::: + +### Start a Workspace + +Start a workspace, choosing how to open it with `--ide`: + +``` +# Start in VS Code browser +devsy workspace up github.com/microsoft/vscode-remote-try-node --ide openvscode + +# Start in VS Code +devsy workspace up github.com/microsoft/vscode-remote-try-node --ide vscode + +# Start without an IDE +devsy workspace up github.com/microsoft/vscode-remote-try-node --ide none +``` + +If you selected an IDE, it should open automatically. Otherwise, connect to the workspace manually: + +``` +ssh WORKSPACE_NAME.devsy +``` diff --git a/sites/docs-devsy-sh/pages/quickstart/ssh.mdx b/sites/docs-devsy-sh/pages/quickstart/ssh.mdx deleted file mode 100644 index 90f3c0657..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/ssh.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Quickstart SSH -sidebar_label: SSH ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with SSH - -Make sure you have installed [Devsy](../getting-started/install.mdx) on your system. - -### Add a Provider - - - -### Start a Workspace with SSH - -Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: - -1. **Provider** – pick an initialized provider. -2. **Source** – enter your project URL or choose one of the quickstart templates. -3. **IDE** – select **None** (you'll connect over SSH). -4. **Review** – confirm the configuration. -5. **Launch** – start the workspace. - -The wizard streams logs as Devsy starts the workspace. After the workspace is created, you can connect to it via ssh: - -``` -ssh MY_WORKSPACE_NAME.devsy -``` - -### Using environment variables in your .devcontainer.json - -If you want to use env variables e.g. for dynamic control over container image version -please follow this instruction: [Environment variables in devcontainer.json](../developing-in-workspaces/environment-variables-in-devcontainer-json.mdx) diff --git a/sites/docs-devsy-sh/pages/quickstart/vim.mdx b/sites/docs-devsy-sh/pages/quickstart/vim.mdx deleted file mode 100644 index 7b6be4cf0..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/vim.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Quickstart Vim/Neovim -sidebar_label: Vim/Neovim ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with Vim/Nvim - -Make sure you have installed [Devsy](../getting-started/install.mdx) on your system. - -### Add a Provider - - - -### Start a Workspace with Vim/Neovim - -Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: - -1. **Provider** – pick an initialized provider. -2. **Source** – enter your project URL or choose one of the quickstart templates. -3. **IDE** – select **None**. -4. **Review** – confirm the configuration. -5. **Launch** – start the workspace. - -After the workspace is created, you have two options to start coding in vim: - -#### Netrw/SCP - -Vim/Neovim allow you to edit remote files using [Netrw](https://www.vim.org/scripts/script.php?script_id=1075). -You can connect it either from within vim `:e scp://[user@]machine[[:#]port]/path` or by starting vim with `vim scp://[user@]machine[[:#]port]/path`. -When you open the workspace, the Devsy logs give you the user/machine combination you'll need to connect to the workspace, usually in the format of `WORKSPACE_NAME.devsy` - -#### Spinning up your vim config in the workspace - -Since Devsy's target environment is a Docker container, you can also SSH into it and install your vim/neovim configuration like you would on any new machine. -To connect to the workspace, run the command Devsy gives you after starting the workspace, usually `ssh WORKSPACE_NAME.devsy`. diff --git a/sites/docs-devsy-sh/pages/quickstart/vscode.mdx b/sites/docs-devsy-sh/pages/quickstart/vscode.mdx deleted file mode 100644 index 6bddd1b79..000000000 --- a/sites/docs-devsy-sh/pages/quickstart/vscode.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Quickstart VS Code -sidebar_label: VS Code ---- - -import AddProvider from '../fragments/add-provider.mdx' - -## Quickstart with VS Code - -Make sure you have installed [Devsy](../getting-started/install.mdx) on your system. - -### Install Prerequisites - -Make sure to install the following prerequisites: -* [VS Code](https://code.visualstudio.com/download) - -### Add a Provider - - - -### Start a Workspace with VS Code - -Navigate to 'Workspaces' > '+ Create' to launch the workspace wizard. Step through: - -1. **Provider** – pick an initialized provider. -2. **Source** – enter your project URL or choose one of the quickstart templates. -3. **IDE** – select **VS Code**. -4. **Review** – confirm the configuration. -5. **Launch** – start the workspace. - -The wizard streams logs as Devsy starts the workspace. Once it's ready, VS Code opens locally connected to the DevContainer. diff --git a/sites/docs-devsy-sh/pages/what-is-devsy.mdx b/sites/docs-devsy-sh/pages/what-is-devsy.mdx index ff7bb476f..20999bed5 100644 --- a/sites/docs-devsy-sh/pages/what-is-devsy.mdx +++ b/sites/docs-devsy-sh/pages/what-is-devsy.mdx @@ -3,25 +3,25 @@ title: What is Devsy? sidebar_label: What is Devsy? --- -Devsy is a tool used to create reproducible developer environments. Each developer environment runs in a separate container and is specified through a [devcontainer.json](https://containers.dev/). [Devsy providers](./managing-providers/what-are-providers) can create these containers on the local computer, any reachable remote machine, or in a public or private cloud. It's also possible to extend Devsy and write your own custom providers. +Devsy helps organizations scale their engineering operations with standardized, reproducible development environments. Each environment runs in its own container, defined by a [devcontainer.json](https://containers.dev/) that lives alongside your source. [Devsy providers](./managing-providers/what-are-providers) provision those containers on a developer's machine, any reachable remote host, or in a public or private cloud — and you can extend Devsy with your own custom providers.
Devsy Flow
Devsy
-You can think of Devsy as the glue connecting your local IDE to a machine you want to use for development. So depending on your project's requirements, you can create a workspace locally on the computer, a powerful cloud machine, or a spare remote computer. Within Devsy, every workspace is managed the same way, which also makes it easy to switch between workspaces that might be hosted somewhere else. +Devsy connects each developer's local IDE to the infrastructure where work actually runs. The same workspace can live on a laptop, a powerful cloud machine, or a shared remote host, and every workspace is created and managed the same way. That consistency is what lets a team standardize on one environment definition and move between backends without re-learning their tooling. ## Why Devsy? -Devsy reuses the open [DevContainer standard](https://containers.dev/) to create a consistent developer experience no matter what backend you want to use. +Devsy implements the open [DevContainer standard](https://containers.dev/), so the environment definition your team commits remains portable across every backend Devsy supports. -Compared to hosted services such as GitHub Codespaces, JetBrains Spaces or Google Cloud Workstations, Devsy has the following advantages: -* **Cost savings**: Devsy is usually around 5-10 times cheaper than existing services with comparable feature sets, because it uses bare virtual machines and shuts down unused virtual machines automatically. -* **No vendor lock-in**: Choose whatever cloud provider suits you best, be it the cheapest one or the most powerful, Devsy supports all cloud providers. If you are tired of using a provider, change it with a single command. -* **Local development**: You get the same developer experience also locally, so you don't need to rely on a cloud provider at all. -* **Cross-IDE support**: VS Code in its various flavors and the full JetBrains suite are supported, all others can be connected through SSH. -* **Client-only**: No need to install a server backend, Devsy runs solely on your computer. -* **Extensible**: Devsy is source-available and extensible. A provider doesn't exist? Just create your own. -* **Rich feature set**: Devsy already supports prebuilds, auto inactivity shutdown, git & docker credentials sync and many more features to come. -* **Desktop App**: Devsy comes with an easy-to-use desktop application that abstracts all the complexity away. If you want to build your own integration, Devsy offers a feature-rich CLI as well. +For engineering organizations, Devsy delivers: +* **Standardized environments**: Define a workspace once in `devcontainer.json` and give every engineer the same toolchain, dependencies, and configuration. New hires are productive on day one instead of spending days on setup. +* **Cost efficiency at scale**: Run workspaces on the infrastructure you already pay for, and let Devsy automatically shut down idle machines so you only spend on capacity that's in use. +* **No vendor lock-in**: Choose the infrastructure that fits each team — local, cloud, Kubernetes, or remote SSH hosts. Switch a workspace's provider with a single command, with no rewrite of your environment definition. +* **Flexible development**: Engineers get the same experience locally and remotely, from quick prototyping on a laptop to heavy builds on a cloud machine. +* **Cross-IDE support**: VS Code and its variants and the full JetBrains suite are supported out of the box; any other editor can connect over SSH. +* **Extensible**: Devsy is source-available and extensible. If a provider doesn't exist for your platform, you can build one. +* **Rich feature set**: Prebuilds, inactivity-based shutdown, and Git and Docker credential sync are built in, with more capabilities on the way. +* **Desktop app and CLI**: The desktop application gives engineers a guided way to manage workspaces, while the CLI drives automation and platform integration across your organization. diff --git a/sites/docs-devsy-sh/sidebars.js b/sites/docs-devsy-sh/sidebars.js index d16bcba17..a39a69540 100644 --- a/sites/docs-devsy-sh/sidebars.js +++ b/sites/docs-devsy-sh/sidebars.js @@ -24,34 +24,8 @@ module.exports = { id: "getting-started/update", }, { - type: "category", - label: "Quick Start", - items: [ - { - type: "doc", - id: "quickstart/browser", - }, - { - type: "doc", - id: "quickstart/vscode", - }, - { - type: "doc", - id: "quickstart/jetbrains", - }, - { - type: "doc", - id: "quickstart/ssh", - }, - { - type: "doc", - id: "quickstart/vim", - }, - { - type: "doc", - id: "quickstart/devsy-cli", - }, - ], + type: "doc", + id: "quickstart/quickstart", }, ], }, @@ -237,9 +211,5 @@ module.exports = { }, ], }, - { - type: "doc", - id: "licenses/devsy", - }, ], }; diff --git a/sites/docs-devsy-sh/src/css/custom.css b/sites/docs-devsy-sh/src/css/custom.css index f3597a7b9..e06738119 100644 --- a/sites/docs-devsy-sh/src/css/custom.css +++ b/sites/docs-devsy-sh/src/css/custom.css @@ -84,33 +84,21 @@ ul ul .table-of-contents__link--active::before { display: none; } -.menu > .menu__list > .menu__list-item:nth-child(-n + 7) { +.menu > .menu__list > .menu__list-item { margin: 1em 0; } -.menu - > .menu__list - > .menu__list-item:nth-child(-n + 7) - > .menu__link--sublist { +.menu > .menu__list > .menu__list-item > .menu__link--sublist { pointer-events: none; color: var(--ifm-menu-color) !important; font-weight: 500; text-transform: uppercase; } -.menu - > .menu__list - > .menu__list-item:nth-child(-n + 7) - > .menu__link--sublist::after { +.menu > .menu__list > .menu__list-item > .menu__link--sublist::after { display: none; } -.menu > .menu__list > .menu__list-item:last-child { - margin-top: 1.5em; - padding-top: 1.5em; - border-top: 1px solid #e9e9e9; -} - .markdown figure figcaption { z-index: 1; } From c32553912bc1492e56b3bd9c6a22fc0fb2aced3c Mon Sep 17 00:00:00 2001 From: Samuel K Date: Wed, 24 Jun 2026 08:19:39 -0500 Subject: [PATCH 2/3] ci: automate third-party Go license attribution Generate THIRD_PARTY_LICENSES.md from the modules actually compiled into the CLI (the union of build dependencies across every released OS/arch) via go-licence-detector, and bundle it into release archives so attribution ships with the binary. Deriving the set from the import graph rather than the full module graph keeps the output deterministic across machines, Go versions, and module-cache state. A PR check enforces the license allowlist and keeps the committed file in sync, and the ci-success gate depends on it. Replaces the hand-maintained docs licenses page. Run with 'task cli:licenses' / 'task cli:licenses:check'. Signed-off-by: Samuel K --- .github/workflows/pr-ci.yml | 19 ++ .goreleaser.yml | 3 + THIRD_PARTY_LICENSES.md | 323 +++++++++++++++++++ Taskfile.yml | 8 + hack/licenses/main.go | 225 +++++++++++++ hack/licenses/overrides.ndjson | 0 hack/licenses/rules.json | 16 + hack/licenses/third-party-licenses.md.tmpl | 21 ++ sites/docs-devsy-sh/pages/licenses/devsy.mdx | 276 ---------------- 9 files changed, 615 insertions(+), 276 deletions(-) create mode 100644 THIRD_PARTY_LICENSES.md create mode 100644 hack/licenses/main.go create mode 100644 hack/licenses/overrides.ndjson create mode 100644 hack/licenses/rules.json create mode 100644 hack/licenses/third-party-licenses.md.tmpl delete mode 100644 sites/docs-devsy-sh/pages/licenses/devsy.mdx diff --git a/.github/workflows/pr-ci.yml b/.github/workflows/pr-ci.yml index 99cdef3da..e571b600c 100644 --- a/.github/workflows/pr-ci.yml +++ b/.github/workflows/pr-ci.yml @@ -34,6 +34,8 @@ jobs: - '.goreleaser.yml' - 'e2e/**' - '.github/workflows/pr-ci.yml' + - 'hack/licenses/**' + - 'THIRD_PARTY_LICENSES.md' precommit: name: Pre-commit @@ -116,6 +118,21 @@ jobs: name: devsy-${{ steps.os.outputs.runner_os }} path: dist/devsy-${{ steps.os.outputs.runner_os }}_*/devsy-${{ steps.os.outputs.runner_os }}-* + licenses: + name: Third-party licenses + needs: [changes, precommit, lint] + if: needs.changes.outputs.go == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-go@v6 + with: + go-version-file: go.mod + + - name: Check license policy and attribution + run: go run ./hack/licenses --check + integration-tests-unprivileged: name: Test ${{ matrix.label }} on ${{ matrix.runner }} needs: [changes, build-cli] @@ -609,6 +626,7 @@ jobs: - changes - precommit - lint + - licenses - build-cli - integration-tests-unprivileged - integration-tests @@ -619,6 +637,7 @@ jobs: if [[ "${{ needs.changes.result }}" == "failure" ]] || \ [[ "${{ needs.precommit.result }}" == "failure" ]] || \ [[ "${{ needs.lint.result }}" == "failure" ]] || \ + [[ "${{ needs.licenses.result }}" == "failure" ]] || \ [[ "${{ needs.build-cli.result }}" == "failure" ]] || \ [[ "${{ needs.integration-tests-unprivileged.result }}" == "failure" ]] || \ [[ "${{ needs.integration-tests.result }}" == "failure" ]]; then diff --git a/.goreleaser.yml b/.goreleaser.yml index 6faf9f969..fc143c33a 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -95,6 +95,9 @@ archives: format_overrides: - goos: windows formats: [zip] + files: + - LICENSE + - THIRD_PARTY_LICENSES.md checksum: name_template: checksums.txt report_sizes: true diff --git a/THIRD_PARTY_LICENSES.md b/THIRD_PARTY_LICENSES.md new file mode 100644 index 000000000..6685bf7ff --- /dev/null +++ b/THIRD_PARTY_LICENSES.md @@ -0,0 +1,323 @@ + + + +# Third-Party Licenses + +The Devsy CLI is built with the open-source Go modules listed below. Each entry +links to the module and notes the license it is distributed under. Some +dependencies are only included on certain operating systems or architectures. + +To regenerate this file after changing dependencies, run `task cli:licenses`. + +## Dependencies + +| Dependency | Version | License | +| ---------- | ------- | ------- | +| [al.essio.dev/pkg/shellescape](https://al.essio.dev/pkg/shellescape) | `v1.6.0` | MIT | +| [cel.dev/expr](https://cel.dev/expr) | `v0.25.1` | Apache-2.0 | +| [charm.land/bubbles/v2](https://charm.land/bubbles/v2) | `v2.0.0` | MIT | +| [charm.land/bubbletea/v2](https://charm.land/bubbletea/v2) | `v2.0.2` | MIT | +| [charm.land/huh/v2](https://charm.land/huh/v2) | `v2.0.3` | MIT | +| [charm.land/lipgloss/v2](https://charm.land/lipgloss/v2) | `v2.0.3` | MIT | +| [cloud.google.com/go/compute/metadata](https://cloud.google.com/go/compute/metadata) | `v0.9.0` | Apache-2.0 | +| [code.gitea.io/sdk/gitea](https://code.gitea.io/sdk/gitea) | `v0.22.1` | MIT | +| [filippo.io/edwards25519](https://filippo.io/edwards25519) | `v1.1.0` | BSD-3-Clause | +| [github.com/42wim/httpsig](https://github.com/42wim/httpsig) | `v1.2.3` | BSD-3-Clause | +| [github.com/AlecAivazis/survey/v2](https://github.com/AlecAivazis/survey) | `v2.3.7` | MIT | +| [github.com/Azure/azure-sdk-for-go/sdk/azcore](https://github.com/Azure/azure-sdk-for-go) | `v1.21.0` | MIT | +| [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) | `v1.13.1` | MIT | +| [github.com/Azure/azure-sdk-for-go/sdk/internal](https://github.com/Azure/azure-sdk-for-go) | `v1.11.2` | MIT | +| [github.com/Azure/go-ansiterm](https://github.com/Azure/go-ansiterm) | `v0.0.0-20250102033503-faa5f7b0171c` | MIT | +| [github.com/AzureAD/microsoft-authentication-library-for-go](https://github.com/AzureAD/microsoft-authentication-library-for-go) | `v1.6.0` | MIT | +| [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) | `v1.5.0` | MIT | +| [github.com/Masterminds/semver/v3](https://github.com/Masterminds/semver) | `v3.4.0` | MIT | +| [github.com/Microsoft/go-winio](https://github.com/Microsoft/go-winio) | `v0.6.2` | MIT | +| [github.com/NYTimes/gziphandler](https://github.com/NYTimes/gziphandler) | `v1.1.1` | Apache-2.0 | +| [github.com/agext/levenshtein](https://github.com/agext/levenshtein) | `v1.2.3` | Apache-2.0 | +| [github.com/alexbrainman/sspi](https://github.com/alexbrainman/sspi) | `v0.0.0-20231016080023-1a75b4708caa` | BSD-3-Clause | +| [github.com/antlr4-go/antlr/v4](https://github.com/antlr4-go/antlr) | `v4.13.1` | BSD-3-Clause | +| [github.com/atotto/clipboard](https://github.com/atotto/clipboard) | `v0.1.4` | BSD-3-Clause | +| [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `v1.41.4` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `v1.32.12` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) | `v1.19.12` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/feature/ec2/imds](https://github.com/aws/aws-sdk-go-v2) | `v1.18.20` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/internal/configsources](https://github.com/aws/aws-sdk-go-v2) | `v1.4.20` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/internal/endpoints/v2](https://github.com/aws/aws-sdk-go-v2) | `v2.7.20` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/internal/ini](https://github.com/aws/aws-sdk-go-v2) | `v1.8.6` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/ecr](https://github.com/aws/aws-sdk-go-v2) | `v1.55.3` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/ecrpublic](https://github.com/aws/aws-sdk-go-v2) | `v1.38.10` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding](https://github.com/aws/aws-sdk-go-v2) | `v1.13.7` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/internal/presigned-url](https://github.com/aws/aws-sdk-go-v2) | `v1.13.20` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/signin](https://github.com/aws/aws-sdk-go-v2) | `v1.0.8` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/sso](https://github.com/aws/aws-sdk-go-v2) | `v1.30.13` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/ssooidc](https://github.com/aws/aws-sdk-go-v2) | `v1.35.17` | Apache-2.0 | +| [github.com/aws/aws-sdk-go-v2/service/sts](https://github.com/aws/aws-sdk-go-v2) | `v1.41.9` | Apache-2.0 | +| [github.com/aws/smithy-go](https://github.com/aws/smithy-go) | `v1.24.2` | Apache-2.0 | +| [github.com/awslabs/amazon-ecr-credential-helper/ecr-login](https://github.com/awslabs/amazon-ecr-credential-helper) | `v0.12.0` | Apache-2.0 | +| [github.com/beorn7/perks](https://github.com/beorn7/perks) | `v1.0.1` | MIT | +| [github.com/blang/semver/v4](https://github.com/blang/semver) | `v4.0.0` | MIT | +| [github.com/bmatcuk/doublestar/v4](https://github.com/bmatcuk/doublestar) | `v4.10.0` | MIT | +| [github.com/catppuccin/go](https://github.com/catppuccin/go) | `v0.3.0` | MIT | +| [github.com/cenkalti/backoff/v5](https://github.com/cenkalti/backoff) | `v5.0.3` | MIT | +| [github.com/cespare/xxhash/v2](https://github.com/cespare/xxhash) | `v2.3.0` | MIT | +| [github.com/charmbracelet/colorprofile](https://github.com/charmbracelet/colorprofile) | `v0.4.3` | MIT | +| [github.com/charmbracelet/ultraviolet](https://github.com/charmbracelet/ultraviolet) | `v0.0.0-20260205113103-524a6607adb8` | MIT | +| [github.com/charmbracelet/x/ansi](https://github.com/charmbracelet/x) | `v0.11.7` | MIT | +| [github.com/charmbracelet/x/exp/ordered](https://github.com/charmbracelet/x) | `v0.1.0` | MIT | +| [github.com/charmbracelet/x/exp/strings](https://github.com/charmbracelet/x) | `v0.0.0-20240722160745-212f7b056ed0` | MIT | +| [github.com/charmbracelet/x/term](https://github.com/charmbracelet/x) | `v0.2.2` | MIT | +| [github.com/charmbracelet/x/termios](https://github.com/charmbracelet/x) | `v0.1.1` | MIT | +| [github.com/charmbracelet/x/windows](https://github.com/charmbracelet/x) | `v0.2.2` | MIT | +| [github.com/clipperhouse/displaywidth](https://github.com/clipperhouse/displaywidth) | `v0.11.0` | MIT | +| [github.com/clipperhouse/uax29/v2](https://github.com/clipperhouse/uax29) | `v2.7.0` | MIT | +| [github.com/coder/websocket](https://github.com/coder/websocket) | `v1.8.12` | ISC | +| [github.com/compose-spec/compose-go/v2](https://github.com/compose-spec/compose-go) | `v2.10.2` | Apache-2.0 | +| [github.com/containerd/console](https://github.com/containerd/console) | `v1.0.5` | Apache-2.0 | +| [github.com/containerd/containerd/api](https://github.com/containerd/containerd) | `v1.10.0` | Apache-2.0 | +| [github.com/containerd/containerd/v2](https://github.com/containerd/containerd) | `v2.2.2` | Apache-2.0 | +| [github.com/containerd/continuity](https://github.com/containerd/continuity) | `v0.4.5` | Apache-2.0 | +| [github.com/containerd/errdefs](https://github.com/containerd/errdefs) | `v1.0.0` | Apache-2.0 | +| [github.com/containerd/errdefs/pkg](https://github.com/containerd/errdefs) | `v0.3.0` | Apache-2.0 | +| [github.com/containerd/log](https://github.com/containerd/log) | `v0.1.0` | Apache-2.0 | +| [github.com/containerd/platforms](https://github.com/containerd/platforms) | `v1.0.0-rc.2` | Apache-2.0 | +| [github.com/containerd/stargz-snapshotter/estargz](https://github.com/containerd/stargz-snapshotter) | `v0.18.2` | Apache-2.0 | +| [github.com/containerd/ttrpc](https://github.com/containerd/ttrpc) | `v1.2.8` | Apache-2.0 | +| [github.com/containerd/typeurl/v2](https://github.com/containerd/typeurl) | `v2.2.3` | Apache-2.0 | +| [github.com/containers/image/v5](https://github.com/containers/image) | `v5.36.2` | Apache-2.0 | +| [github.com/containers/storage](https://github.com/containers/storage) | `v1.59.1` | Apache-2.0 | +| [github.com/coreos/go-semver](https://github.com/coreos/go-semver) | `v0.3.1` | Apache-2.0 | +| [github.com/coreos/go-systemd/v22](https://github.com/coreos/go-systemd) | `v22.7.0` | Apache-2.0 | +| [github.com/creachadair/msync](https://github.com/creachadair/msync) | `v0.7.1` | BSD-3-Clause | +| [github.com/creack/pty](https://github.com/creack/pty) | `v1.1.24` | MIT | +| [github.com/creativeprojects/go-selfupdate](https://github.com/creativeprojects/go-selfupdate) | `v1.5.2` | MIT | +| [github.com/davecgh/go-spew](https://github.com/davecgh/go-spew) | `v1.1.2-0.20180830191138-d8f796af33cc` | ISC | +| [github.com/davidmz/go-pageant](https://github.com/davidmz/go-pageant) | `v1.0.2` | MIT | +| [github.com/dblohm7/wingoes](https://github.com/dblohm7/wingoes) | `v0.0.0-20240119213807-a09d6be7affa` | BSD-3-Clause | +| [github.com/devsy-org/admin-apis](https://github.com/devsy-org/admin-apis) | `v1.2.0` | MPL-2.0 | +| [github.com/devsy-org/agentapi](https://github.com/devsy-org/agentapi) | `v1.0.1` | MPL-2.0 | +| [github.com/devsy-org/api](https://github.com/devsy-org/api) | `v1.1.0` | MPL-2.0 | +| [github.com/devsy-org/apiserver](https://github.com/devsy-org/apiserver) | `v1.5.0` | Apache-2.0 | +| [github.com/devsy-org/ssh](https://github.com/devsy-org/ssh) | `v1.2.0` | BSD-3-Clause | +| [github.com/distribution/reference](https://github.com/distribution/reference) | `v0.6.0` | Apache-2.0 | +| [github.com/docker/cli](https://github.com/docker/cli) | `v29.4.0+incompatible` | Apache-2.0 | +| [github.com/docker/docker](https://github.com/docker/docker) | `v28.5.2+incompatible` | Apache-2.0 | +| [github.com/docker/docker-credential-helpers](https://github.com/docker/docker-credential-helpers) | `v0.9.5` | MIT | +| [github.com/docker/go-connections](https://github.com/docker/go-connections) | `v0.6.0` | Apache-2.0 | +| [github.com/docker/go-units](https://github.com/docker/go-units) | `v0.5.0` | Apache-2.0 | +| [github.com/dustin/go-humanize](https://github.com/dustin/go-humanize) | `v1.0.1` | MIT | +| [github.com/ebitengine/purego](https://github.com/ebitengine/purego) | `v0.10.0` | Apache-2.0 | +| [github.com/emicklei/go-restful/v3](https://github.com/emicklei/go-restful) | `v3.13.0` | MIT | +| [github.com/evanphx/json-patch/v5](https://github.com/evanphx/json-patch) | `v5.9.11` | BSD-3-Clause | +| [github.com/felixge/httpsnoop](https://github.com/felixge/httpsnoop) | `v1.0.4` | MIT | +| [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) | `v1.9.0` | BSD-3-Clause | +| [github.com/fxamacker/cbor/v2](https://github.com/fxamacker/cbor) | `v2.9.0` | MIT | +| [github.com/gaissmai/bart](https://github.com/gaissmai/bart) | `v0.18.0` | MIT | +| [github.com/go-fed/httpsig](https://github.com/go-fed/httpsig) | `v1.1.0` | BSD-3-Clause | +| [github.com/go-json-experiment/json](https://github.com/go-json-experiment/json) | `v0.0.0-20250813024750-ebf49471dced` | BSD-3-Clause | +| [github.com/go-logr/logr](https://github.com/go-logr/logr) | `v1.4.3` | Apache-2.0 | +| [github.com/go-logr/stdr](https://github.com/go-logr/stdr) | `v1.2.2` | Apache-2.0 | +| [github.com/go-logr/zapr](https://github.com/go-logr/zapr) | `v1.3.0` | Apache-2.0 | +| [github.com/go-ole/go-ole](https://github.com/go-ole/go-ole) | `v1.3.0` | MIT | +| [github.com/go-openapi/jsonpointer](https://github.com/go-openapi/jsonpointer) | `v0.22.5` | Apache-2.0 | +| [github.com/go-openapi/jsonreference](https://github.com/go-openapi/jsonreference) | `v0.21.5` | Apache-2.0 | +| [github.com/go-openapi/swag](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/cmdutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/conv](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/fileutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/jsonname](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/jsonutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/loading](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/mangling](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/netutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/stringutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/typeutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-openapi/swag/yamlutils](https://github.com/go-openapi/swag) | `v0.25.5` | Apache-2.0 | +| [github.com/go-viper/mapstructure/v2](https://github.com/go-viper/mapstructure) | `v2.5.0` | MIT | +| [github.com/goccy/go-json](https://github.com/goccy/go-json) | `v0.10.5` | MIT | +| [github.com/godbus/dbus/v5](https://github.com/godbus/dbus) | `v5.2.0` | BSD-2-Clause | +| [github.com/gofrs/flock](https://github.com/gofrs/flock) | `v0.13.0` | BSD-3-Clause | +| [github.com/gogo/protobuf](https://github.com/gogo/protobuf) | `v1.3.2` | BSD-3-Clause | +| [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) | `v5.3.1` | MIT | +| [github.com/golang/groupcache](https://github.com/golang/groupcache) | `v0.0.0-20241129210726-2c02b8208cf8` | Apache-2.0 | +| [github.com/golang/protobuf](https://github.com/golang/protobuf) | `v1.5.4` | BSD-3-Clause | +| [github.com/google/btree](https://github.com/google/btree) | `v1.1.3` | Apache-2.0 | +| [github.com/google/cel-go](https://github.com/google/cel-go) | `v0.26.1` | Apache-2.0 | +| [github.com/google/gnostic-models](https://github.com/google/gnostic-models) | `v0.7.1` | Apache-2.0 | +| [github.com/google/go-cmp](https://github.com/google/go-cmp) | `v0.7.0` | BSD-3-Clause | +| [github.com/google/go-containerregistry](https://github.com/google/go-containerregistry) | `v0.21.5` | Apache-2.0 | +| [github.com/google/go-containerregistry/pkg/authn/kubernetes](https://github.com/google/go-containerregistry) | `v0.0.0-20260414223304-7a662782a11f` | Apache-2.0 | +| [github.com/google/go-github/v74](https://github.com/google/go-github) | `v74.0.0` | BSD-3-Clause | +| [github.com/google/go-querystring](https://github.com/google/go-querystring) | `v1.1.0` | BSD-3-Clause | +| [github.com/google/jsonschema-go](https://github.com/google/jsonschema-go) | `v0.4.3` | MIT | +| [github.com/google/shlex](https://github.com/google/shlex) | `v0.0.0-20191202100458-e7afc7fbc510` | Apache-2.0 | +| [github.com/google/uuid](https://github.com/google/uuid) | `v1.6.0` | BSD-3-Clause | +| [github.com/gorilla/handlers](https://github.com/gorilla/handlers) | `v1.5.2` | BSD-3-Clause | +| [github.com/gorilla/websocket](https://github.com/gorilla/websocket) | `v1.5.4-0.20250319132907-e064f32e3674` | BSD-2-Clause | +| [github.com/grpc-ecosystem/go-grpc-prometheus](https://github.com/grpc-ecosystem/go-grpc-prometheus) | `v1.2.0` | Apache-2.0 | +| [github.com/grpc-ecosystem/grpc-gateway/v2](https://github.com/grpc-ecosystem/grpc-gateway) | `v2.27.7` | BSD-3-Clause | +| [github.com/hashicorp/go-cleanhttp](https://github.com/hashicorp/go-cleanhttp) | `v0.5.2` | MPL-2.0 | +| [github.com/hashicorp/go-retryablehttp](https://github.com/hashicorp/go-retryablehttp) | `v0.7.8` | MPL-2.0 | +| [github.com/hashicorp/go-version](https://github.com/hashicorp/go-version) | `v1.8.0` | MPL-2.0 | +| [github.com/hashicorp/golang-lru/v2](https://github.com/hashicorp/golang-lru) | `v2.0.7` | MPL-2.0 | +| [github.com/hdevalence/ed25519consensus](https://github.com/hdevalence/ed25519consensus) | `v0.2.0` | BSD-3-Clause | +| [github.com/in-toto/attestation](https://github.com/in-toto/attestation) | `v1.1.2` | Apache-2.0 | +| [github.com/in-toto/in-toto-golang](https://github.com/in-toto/in-toto-golang) | `v0.10.0` | Apache-2.0 | +| [github.com/inconshreveable/mousetrap](https://github.com/inconshreveable/mousetrap) | `v1.1.0` | Apache-2.0 | +| [github.com/joho/godotenv](https://github.com/joho/godotenv) | `v1.5.1` | MIT | +| [github.com/jsimonetti/rtnetlink](https://github.com/jsimonetti/rtnetlink) | `v1.4.0` | MIT | +| [github.com/json-iterator/go](https://github.com/json-iterator/go) | `v1.1.12` | MIT | +| [github.com/kballard/go-shellquote](https://github.com/kballard/go-shellquote) | `v0.0.0-20180428030007-95032a82bc51` | MIT | +| [github.com/klauspost/compress](https://github.com/klauspost/compress) | `v1.18.5` | Apache-2.0 | +| [github.com/kr/fs](https://github.com/kr/fs) | `v0.1.0` | BSD-3-Clause | +| [github.com/kylelemons/godebug](https://github.com/kylelemons/godebug) | `v1.1.0` | Apache-2.0 | +| [github.com/liggitt/tabwriter](https://github.com/liggitt/tabwriter) | `v0.0.0-20181228230101-89fcab3d43de` | BSD-3-Clause | +| [github.com/lucasb-eyer/go-colorful](https://github.com/lucasb-eyer/go-colorful) | `v1.4.0` | MIT | +| [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable) | `v0.1.14` | MIT | +| [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) | `v0.0.20` | MIT | +| [github.com/mattn/go-runewidth](https://github.com/mattn/go-runewidth) | `v0.0.23` | MIT | +| [github.com/mattn/go-shellwords](https://github.com/mattn/go-shellwords) | `v1.0.12` | MIT | +| [github.com/mdlayher/netlink](https://github.com/mdlayher/netlink) | `v1.7.3-0.20250113171957-fbb4dce95f42` | MIT | +| [github.com/mdlayher/socket](https://github.com/mdlayher/socket) | `v0.5.1` | MIT | +| [github.com/mgutz/ansi](https://github.com/mgutz/ansi) | `v0.0.0-20200706080929-d51e80ef957d` | MIT | +| [github.com/mitchellh/go-homedir](https://github.com/mitchellh/go-homedir) | `v1.1.0` | MIT | +| [github.com/mitchellh/go-ps](https://github.com/mitchellh/go-ps) | `v1.0.0` | MIT | +| [github.com/mitchellh/go-wordwrap](https://github.com/mitchellh/go-wordwrap) | `v1.0.1` | MIT | +| [github.com/mitchellh/hashstructure/v2](https://github.com/mitchellh/hashstructure) | `v2.0.2` | MIT | +| [github.com/moby/buildkit](https://github.com/moby/buildkit) | `v0.29.0` | Apache-2.0 | +| [github.com/moby/docker-image-spec](https://github.com/moby/docker-image-spec) | `v1.3.1` | Apache-2.0 | +| [github.com/moby/locker](https://github.com/moby/locker) | `v1.0.1` | Apache-2.0 | +| [github.com/moby/patternmatcher](https://github.com/moby/patternmatcher) | `v0.6.1` | Apache-2.0 | +| [github.com/moby/spdystream](https://github.com/moby/spdystream) | `v0.5.0` | Apache-2.0 | +| [github.com/moby/sys/capability](https://github.com/moby/sys) | `v0.4.0` | BSD-2-Clause | +| [github.com/moby/sys/mountinfo](https://github.com/moby/sys) | `v0.7.2` | Apache-2.0 | +| [github.com/moby/sys/signal](https://github.com/moby/sys) | `v0.7.1` | Apache-2.0 | +| [github.com/moby/sys/user](https://github.com/moby/sys) | `v0.4.0` | Apache-2.0 | +| [github.com/moby/term](https://github.com/moby/term) | `v0.5.2` | Apache-2.0 | +| [github.com/modelcontextprotocol/go-sdk](https://github.com/modelcontextprotocol/go-sdk) | `v1.6.1` | Apache-2.0 | +| [github.com/modern-go/concurrent](https://github.com/modern-go/concurrent) | `v0.0.0-20180306012644-bacd9c7ef1dd` | Apache-2.0 | +| [github.com/modern-go/reflect2](https://github.com/modern-go/reflect2) | `v1.0.3-0.20250322232337-35a7c28c31ee` | Apache-2.0 | +| [github.com/morikuni/aec](https://github.com/morikuni/aec) | `v1.1.0` | MIT | +| [github.com/muesli/cancelreader](https://github.com/muesli/cancelreader) | `v0.2.2` | MIT | +| [github.com/munnerz/goautoneg](https://github.com/munnerz/goautoneg) | `v0.0.0-20191010083416-a7dc8b61c822` | BSD-3-Clause | +| [github.com/mxk/go-flowrate](https://github.com/mxk/go-flowrate) | `v0.0.0-20140419014527-cca7078d478f` | BSD-3-Clause | +| [github.com/onsi/ginkgo/v2](https://github.com/onsi/ginkgo) | `v2.28.1` | MIT | +| [github.com/onsi/gomega](https://github.com/onsi/gomega) | `v1.39.1` | MIT | +| [github.com/opencontainers/go-digest](https://github.com/opencontainers/go-digest) | `v1.0.0` | Apache-2.0 | +| [github.com/opencontainers/image-spec](https://github.com/opencontainers/image-spec) | `v1.1.1` | Apache-2.0 | +| [github.com/opencontainers/runtime-spec](https://github.com/opencontainers/runtime-spec) | `v1.3.0` | Apache-2.0 | +| [github.com/pires/go-proxyproto](https://github.com/pires/go-proxyproto) | `v0.8.1` | Apache-2.0 | +| [github.com/pkg/browser](https://github.com/pkg/browser) | `v0.0.0-20240102092130-5ac0b6a4141c` | BSD-2-Clause | +| [github.com/pkg/errors](https://github.com/pkg/errors) | `v0.9.1` | BSD-2-Clause | +| [github.com/pkg/sftp](https://github.com/pkg/sftp) | `v1.13.10` | BSD-2-Clause | +| [github.com/planetscale/vtprotobuf](https://github.com/planetscale/vtprotobuf) | `v0.6.1-0.20240319094008-0393e58bdf10` | BSD-3-Clause | +| [github.com/pmezard/go-difflib](https://github.com/pmezard/go-difflib) | `v1.0.1-0.20181226105442-5d4384ee4fb2` | BSD-3-Clause | +| [github.com/posthog/posthog-go](https://github.com/posthog/posthog-go) | `v1.12.5` | MIT | +| [github.com/prometheus-community/pro-bing](https://github.com/prometheus-community/pro-bing) | `v0.4.0` | MIT | +| [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `v1.23.2` | Apache-2.0 | +| [github.com/prometheus/client_model](https://github.com/prometheus/client_model) | `v0.6.2` | Apache-2.0 | +| [github.com/prometheus/common](https://github.com/prometheus/common) | `v0.66.1` | Apache-2.0 | +| [github.com/prometheus/procfs](https://github.com/prometheus/procfs) | `v0.17.0` | Apache-2.0 | +| [github.com/rivo/uniseg](https://github.com/rivo/uniseg) | `v0.4.7` | MIT | +| [github.com/safchain/ethtool](https://github.com/safchain/ethtool) | `v0.3.0` | Apache-2.0 | +| [github.com/santhosh-tekuri/jsonschema/v6](https://github.com/santhosh-tekuri/jsonschema) | `v6.0.2` | Apache-2.0 | +| [github.com/secure-systems-lab/go-securesystemslib](https://github.com/secure-systems-lab/go-securesystemslib) | `v0.10.0` | MIT | +| [github.com/segmentio/asm](https://github.com/segmentio/asm) | `v1.1.3` | MIT | +| [github.com/segmentio/encoding](https://github.com/segmentio/encoding) | `v0.5.4` | MIT | +| [github.com/shibumi/go-pathspec](https://github.com/shibumi/go-pathspec) | `v1.3.0` | Apache-2.0 | +| [github.com/shirou/gopsutil/v4](https://github.com/shirou/gopsutil) | `v4.26.4` | BSD-3-Clause | +| [github.com/sirupsen/logrus](https://github.com/sirupsen/logrus) | `v1.9.4` | MIT | +| [github.com/skratchdot/open-golang](https://github.com/skratchdot/open-golang) | `v0.0.0-20200116055534-eef842397966` | MIT | +| [github.com/spf13/cobra](https://github.com/spf13/cobra) | `v1.10.2` | Apache-2.0 | +| [github.com/spf13/pflag](https://github.com/spf13/pflag) | `v1.0.10` | BSD-3-Clause | +| [github.com/stoewer/go-strcase](https://github.com/stoewer/go-strcase) | `v1.3.1` | MIT | +| [github.com/stretchr/testify](https://github.com/stretchr/testify) | `v1.11.1` | MIT | +| [github.com/tailscale/certstore](https://github.com/tailscale/certstore) | `v0.1.1-0.20231202035212-d3fa0460f47e` | MIT | +| [github.com/tailscale/go-winio](https://github.com/tailscale/go-winio) | `v0.0.0-20231025203758-c4f33415bf55` | MIT | +| [github.com/tailscale/goupnp](https://github.com/tailscale/goupnp) | `v1.0.1-0.20210804011211-c64d0f06ea05` | BSD-2-Clause | +| [github.com/tailscale/hujson](https://github.com/tailscale/hujson) | `v0.0.0-20260302212456-ecc657c15afd` | BSD-3-Clause | +| [github.com/tailscale/peercred](https://github.com/tailscale/peercred) | `v0.0.0-20250107143737-35a0c7bd7edc` | BSD-3-Clause | +| [github.com/tailscale/web-client-prebuilt](https://github.com/tailscale/web-client-prebuilt) | `v0.0.0-20250124233751-d4cd19a26976` | BSD-3-Clause | +| [github.com/tailscale/wireguard-go](https://github.com/tailscale/wireguard-go) | `v0.0.0-20250716170648-1d0488a3d7da` | MIT | +| [github.com/tidwall/gjson](https://github.com/tidwall/gjson) | `v1.18.0` | MIT | +| [github.com/tidwall/match](https://github.com/tidwall/match) | `v1.1.1` | MIT | +| [github.com/tidwall/pretty](https://github.com/tidwall/pretty) | `v1.2.1` | MIT | +| [github.com/tklauser/go-sysconf](https://github.com/tklauser/go-sysconf) | `v0.3.16` | BSD-3-Clause | +| [github.com/tklauser/numcpus](https://github.com/tklauser/numcpus) | `v0.11.0` | Apache-2.0 | +| [github.com/tonistiigi/fsutil](https://github.com/tonistiigi/fsutil) | `v0.0.0-20251211185533-a2aa163d723f` | MIT | +| [github.com/tonistiigi/go-csvvalue](https://github.com/tonistiigi/go-csvvalue) | `v0.0.0-20240814133006-030d3b2625d0` | MIT | +| [github.com/tonistiigi/units](https://github.com/tonistiigi/units) | `v0.0.0-20180711220420-6950e57a87ea` | MIT | +| [github.com/tonistiigi/vt100](https://github.com/tonistiigi/vt100) | `v0.0.0-20240514184818-90bafcd6abab` | MIT | +| [github.com/u-root/u-root](https://github.com/u-root/u-root) | `v0.16.0` | BSD-3-Clause | +| [github.com/ulikunitz/xz](https://github.com/ulikunitz/xz) | `v0.5.15` | BSD-3-Clause | +| [github.com/vbatts/tar-split](https://github.com/vbatts/tar-split) | `v0.12.2` | BSD-3-Clause | +| [github.com/x448/float16](https://github.com/x448/float16) | `v0.8.4` | MIT | +| [github.com/xhit/go-str2duration/v2](https://github.com/xhit/go-str2duration) | `v2.1.0` | BSD-3-Clause | +| [github.com/xo/terminfo](https://github.com/xo/terminfo) | `v0.0.0-20220910002029-abceb7e1c41e` | MIT | +| [github.com/yosida95/uritemplate/v3](https://github.com/yosida95/uritemplate) | `v3.0.2` | BSD-3-Clause | +| [github.com/yusufpapurcu/wmi](https://github.com/yusufpapurcu/wmi) | `v1.2.4` | MIT | +| [gitlab.com/gitlab-org/api/client-go](https://gitlab.com/gitlab-org/api/client-go) | `v1.9.1` | Apache-2.0 | +| [go.etcd.io/etcd/api/v3](https://go.etcd.io/etcd/api/v3) | `v3.6.5` | Apache-2.0 | +| [go.etcd.io/etcd/client/pkg/v3](https://go.etcd.io/etcd/client/pkg/v3) | `v3.6.5` | Apache-2.0 | +| [go.etcd.io/etcd/client/v3](https://go.etcd.io/etcd/client/v3) | `v3.6.5` | Apache-2.0 | +| [go.opentelemetry.io/auto/sdk](https://go.opentelemetry.io/auto/sdk) | `v1.2.1` | Apache-2.0 | +| [go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc](https://go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc) | `v0.63.0` | Apache-2.0 | +| [go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace](https://go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace) | `v0.63.0` | Apache-2.0 | +| [go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp](https://go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp) | `v0.63.0` | Apache-2.0 | +| [go.opentelemetry.io/otel](https://go.opentelemetry.io/otel) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://go.opentelemetry.io/otel/exporters/otlp/otlptrace) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/otel/metric](https://go.opentelemetry.io/otel/metric) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/otel/sdk](https://go.opentelemetry.io/otel/sdk) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/otel/trace](https://go.opentelemetry.io/otel/trace) | `v1.40.0` | Apache-2.0 | +| [go.opentelemetry.io/proto/otlp](https://go.opentelemetry.io/proto/otlp) | `v1.9.0` | Apache-2.0 | +| [go.uber.org/atomic](https://go.uber.org/atomic) | `v1.11.0` | MIT | +| [go.uber.org/multierr](https://go.uber.org/multierr) | `v1.11.0` | MIT | +| [go.uber.org/zap](https://go.uber.org/zap) | `v1.27.1` | MIT | +| [go.yaml.in/yaml/v2](https://go.yaml.in/yaml/v2) | `v2.4.3` | Apache-2.0 | +| [go.yaml.in/yaml/v3](https://go.yaml.in/yaml/v3) | `v3.0.4` | MIT | +| [go.yaml.in/yaml/v4](https://go.yaml.in/yaml/v4) | `v4.0.0-rc.4` | Apache-2.0 | +| [go4.org/mem](https://go4.org/mem) | `v0.0.0-20240501181205-ae6ca9944745` | Apache-2.0 | +| [go4.org/netipx](https://go4.org/netipx) | `v0.0.0-20231129151722-fdeea329fbba` | BSD-3-Clause | +| [golang.org/x/crypto](https://golang.org/x/crypto) | `v0.50.0` | BSD-3-Clause | +| [golang.org/x/exp](https://golang.org/x/exp) | `v0.0.0-20250911091902-df9299821621` | BSD-3-Clause | +| [golang.org/x/mod](https://golang.org/x/mod) | `v0.35.0` | BSD-3-Clause | +| [golang.org/x/net](https://golang.org/x/net) | `v0.53.0` | BSD-3-Clause | +| [golang.org/x/oauth2](https://golang.org/x/oauth2) | `v0.36.0` | BSD-3-Clause | +| [golang.org/x/sync](https://golang.org/x/sync) | `v0.20.0` | BSD-3-Clause | +| [golang.org/x/sys](https://golang.org/x/sys) | `v0.43.0` | BSD-3-Clause | +| [golang.org/x/term](https://golang.org/x/term) | `v0.42.0` | BSD-3-Clause | +| [golang.org/x/text](https://golang.org/x/text) | `v0.36.0` | BSD-3-Clause | +| [golang.org/x/time](https://golang.org/x/time) | `v0.14.0` | BSD-3-Clause | +| [golang.org/x/tools](https://golang.org/x/tools) | `v0.44.0` | BSD-3-Clause | +| [golang.zx2c4.com/wintun](https://golang.zx2c4.com/wintun) | `v0.0.0-20230126152724-0fa3db229ce2` | MIT | +| [golang.zx2c4.com/wireguard/windows](https://golang.zx2c4.com/wireguard/windows) | `v0.5.3` | MIT | +| [gomodules.xyz/jsonpatch/v2](https://gomodules.xyz/jsonpatch/v2) | `v2.4.0` | Apache-2.0 | +| [google.golang.org/genproto/googleapis/api](https://google.golang.org/genproto/googleapis/api) | `v0.0.0-20260128011058-8636f8732409` | Apache-2.0 | +| [google.golang.org/genproto/googleapis/rpc](https://google.golang.org/genproto/googleapis/rpc) | `v0.0.0-20260128011058-8636f8732409` | Apache-2.0 | +| [google.golang.org/grpc](https://google.golang.org/grpc) | `v1.80.0` | Apache-2.0 | +| [google.golang.org/protobuf](https://google.golang.org/protobuf) | `v1.36.11` | BSD-3-Clause | +| [gopkg.in/evanphx/json-patch.v4](https://gopkg.in/evanphx/json-patch.v4) | `v4.13.0` | BSD-3-Clause | +| [gopkg.in/inf.v0](https://gopkg.in/inf.v0) | `v0.9.1` | BSD-3-Clause | +| [gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) | `v3.0.1` | MIT | +| [gvisor.dev/gvisor](https://gvisor.dev/gvisor) | `v0.0.0-20250205023644-9414b50a5633` | Apache-2.0 | +| [k8s.io/api](https://github.com/kubernetes/api) | `v0.35.3` | Apache-2.0 | +| [k8s.io/apiextensions-apiserver](https://github.com/kubernetes/apiextensions-apiserver) | `v0.35.0` | Apache-2.0 | +| [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) | `v0.35.3` | Apache-2.0 | +| [k8s.io/apiserver](https://github.com/kubernetes/apiserver) | `v0.35.3` | Apache-2.0 | +| [k8s.io/cli-runtime](https://github.com/kubernetes/cli-runtime) | `v0.35.3` | Apache-2.0 | +| [k8s.io/client-go](https://github.com/kubernetes/client-go) | `v0.35.3` | Apache-2.0 | +| [k8s.io/component-base](https://github.com/kubernetes/component-base) | `v0.35.3` | Apache-2.0 | +| [k8s.io/klog/v2](https://github.com/kubernetes/klog) | `v2.140.0` | Apache-2.0 | +| [k8s.io/kube-aggregator](https://github.com/kubernetes/kube-aggregator) | `v0.35.3` | Apache-2.0 | +| [k8s.io/kube-openapi](https://github.com/kubernetes/kube-openapi) | `v0.0.0-20260330154417-16be699c7b31` | Apache-2.0 | +| [k8s.io/kubectl](https://github.com/kubernetes/kubectl) | `v0.35.3` | Apache-2.0 | +| [k8s.io/metrics](https://github.com/kubernetes/metrics) | `v0.35.3` | Apache-2.0 | +| [k8s.io/utils](https://github.com/kubernetes/utils) | `v0.0.0-20260319190234-28399d86e0b5` | Apache-2.0 | +| [mvdan.cc/sh/v3](https://mvdan.cc/sh/v3) | `v3.13.1` | BSD-3-Clause | +| [sigs.k8s.io/apiserver-network-proxy/konnectivity-client](https://sigs.k8s.io/apiserver-network-proxy/konnectivity-client) | `v0.31.2` | Apache-2.0 | +| [sigs.k8s.io/controller-runtime](https://sigs.k8s.io/controller-runtime) | `v0.23.3` | Apache-2.0 | +| [sigs.k8s.io/json](https://sigs.k8s.io/json) | `v0.0.0-20250730193827-2d320260d730` | Apache-2.0 | +| [sigs.k8s.io/randfill](https://sigs.k8s.io/randfill) | `v1.0.0` | Apache-2.0 | +| [sigs.k8s.io/structured-merge-diff/v6](https://sigs.k8s.io/structured-merge-diff/v6) | `v6.3.2-0.20260122202528-d9cc6641c482` | Apache-2.0 | +| [sigs.k8s.io/yaml](https://sigs.k8s.io/yaml) | `v1.6.0` | Apache-2.0 | +| [tailscale.com](https://tailscale.com) | `v1.96.5` | BSD-3-Clause | diff --git a/Taskfile.yml b/Taskfile.yml index 77d158dec..0d0e5c5e5 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -5,6 +5,14 @@ tasks: desc: tidy go.mod and go.sum cmd: go mod tidy + cli:licenses: + desc: regenerate THIRD_PARTY_LICENSES.md and enforce the license allowlist + cmd: go run ./hack/licenses + + cli:licenses:check: + desc: verify THIRD_PARTY_LICENSES.md is in sync and all licenses are allowed (CI) + cmd: go run ./hack/licenses --check + cli:lint: desc: lint go code using golangci-lint cmd: golangci-lint run ./... diff --git a/hack/licenses/main.go b/hack/licenses/main.go new file mode 100644 index 000000000..031231074 --- /dev/null +++ b/hack/licenses/main.go @@ -0,0 +1,225 @@ +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "io" + "maps" + "os" + "os/exec" + "path/filepath" + "sort" +) + +const detectorVersion = "v0.10.0" + +const ( + archAMD64 = "amd64" + archARM64 = "arm64" +) + +var releaseTargets = []struct{ os, arch string }{ + {"linux", archAMD64}, + {"linux", archARM64}, + {"darwin", archAMD64}, + {"darwin", archARM64}, + {"windows", archAMD64}, + {"windows", archARM64}, +} + +func main() { + check := flag.Bool("check", false, + "verify THIRD_PARTY_LICENSES.md is in sync instead of writing it") + flag.Parse() + + if err := run(*check); err != nil { + fmt.Fprintln(os.Stderr, "error:", err) + os.Exit(1) + } +} + +func run(check bool) error { + root, err := repoRoot() + if err != nil { + return err + } + + hackDir := filepath.Join(root, "hack", "licenses") + outFile := filepath.Join(root, "THIRD_PARTY_LICENSES.md") + + deps, err := moduleListJSON(root) + if err != nil { + return fmt.Errorf("collecting module dependencies: %w", err) + } + + if check { + return checkInSync(hackDir, outFile, deps) + } + + fmt.Fprintln(os.Stderr, "Generating", filepath.Base(outFile)+"...") + if err := runDetector(hackDir, deps, outFile); err != nil { + return err + } + fmt.Fprintln(os.Stderr, "Wrote", outFile) + return nil +} + +func checkInSync(hackDir, outFile string, deps []byte) error { + tmp, err := os.CreateTemp("", "third-party-licenses-*.md") + if err != nil { + return err + } + target := tmp.Name() + if err := tmp.Close(); err != nil { + return err + } + defer func() { _ = os.Remove(target) }() + + fmt.Fprintln(os.Stderr, "Generating", filepath.Base(outFile)+"...") + if err := runDetector(hackDir, deps, target); err != nil { + return err + } + + current, err := os.ReadFile(outFile) + if err != nil { + return fmt.Errorf("reading %s: %w", outFile, err) + } + generated, err := os.ReadFile(target) + if err != nil { + return err + } + if !bytes.Equal(current, generated) { + diff := exec.Command("git", "--no-pager", "diff", "--no-index", "--", outFile, target) + diff.Stdout = os.Stderr + diff.Stderr = os.Stderr + _ = diff.Run() + return fmt.Errorf( + "THIRD_PARTY_LICENSES.md is out of date; run 'task cli:licenses' and commit the result", + ) + } + + fmt.Fprintln(os.Stderr, "THIRD_PARTY_LICENSES.md is up to date.") + return nil +} + +func repoRoot() (string, error) { + dir, err := os.Getwd() + if err != nil { + return "", err + } + for { + if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { + return dir, nil + } + parent := filepath.Dir(dir) + if parent == dir { + return "", fmt.Errorf("could not locate go.mod above %q", dir) + } + dir = parent + } +} + +type goModule struct { + Path string + Version string + Main bool + Dir string +} + +type goPackage struct { + Module *goModule +} + +func moduleListJSON(dir string) ([]byte, error) { + modules := map[string]goModule{} + for _, t := range releaseTargets { + mods, err := buildModules(dir, t.os, t.arch) + if err != nil { + return nil, fmt.Errorf("listing deps for %s/%s: %w", t.os, t.arch, err) + } + maps.Copy(modules, mods) + } + + paths := make([]string, 0, len(modules)) + for p := range modules { + paths = append(paths, p) + } + sort.Strings(paths) + + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetIndent("", "\t") + for _, p := range paths { + if err := enc.Encode(modules[p]); err != nil { + return nil, err + } + } + return buf.Bytes(), nil +} + +func buildModules(dir, goos, goarch string) (map[string]goModule, error) { + cmd := exec.Command("go", "list", "-deps", "-mod=readonly", "-json", "./...") + cmd.Dir = dir + cmd.Env = append(os.Environ(), "GOOS="+goos, "GOARCH="+goarch) + cmd.Stderr = os.Stderr + out, err := cmd.Output() + if err != nil { + return nil, err + } + + modules := map[string]goModule{} + dec := json.NewDecoder(bytes.NewReader(out)) + for { + var pkg goPackage + if err := dec.Decode(&pkg); err != nil { + if err == io.EOF { + break + } + return nil, err + } + m := pkg.Module + if m == nil || m.Main || m.Path == "" { + continue + } + modules[m.Path] = *m + } + return modules, nil +} + +func runDetector(hackDir string, deps []byte, outPath string) error { + tmpDir, err := os.MkdirTemp("", "go-licence-detector-") + if err != nil { + return err + } + defer func() { _ = os.RemoveAll(tmpDir) }() + + cmd := exec.Command("go", "run", + "go.elastic.co/go-licence-detector@"+detectorVersion, + "-rules", filepath.Join(hackDir, "rules.json"), + "-overrides", filepath.Join(hackDir, "overrides.ndjson"), + "-depsTemplate", filepath.Join(hackDir, "third-party-licenses.md.tmpl"), + "-depsOut", outPath, + ) + cmd.Dir = tmpDir + cmd.Stdin = bytes.NewReader(deps) + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("go-licence-detector: %w", err) + } + + return normalizeTrailingNewline(outPath) +} + +func normalizeTrailingNewline(path string) error { + content, err := os.ReadFile(path) + if err != nil { + return err + } + normalized := append(bytes.TrimRight(content, "\n"), '\n') + if bytes.Equal(content, normalized) { + return nil + } + return os.WriteFile(path, normalized, 0o644) +} diff --git a/hack/licenses/overrides.ndjson b/hack/licenses/overrides.ndjson new file mode 100644 index 000000000..e69de29bb diff --git a/hack/licenses/rules.json b/hack/licenses/rules.json new file mode 100644 index 000000000..7e95f25b2 --- /dev/null +++ b/hack/licenses/rules.json @@ -0,0 +1,16 @@ +{ + "allowlist": [ + "Apache-2.0", + "MIT", + "BSD-2-Clause", + "BSD-2-Clause-Views", + "BSD-3-Clause", + "ISC", + "MPL-2.0", + "CC-BY-4.0", + "CC0-1.0", + "Unlicense", + "0BSD", + "Zlib" + ] +} diff --git a/hack/licenses/third-party-licenses.md.tmpl b/hack/licenses/third-party-licenses.md.tmpl new file mode 100644 index 000000000..4aa88b893 --- /dev/null +++ b/hack/licenses/third-party-licenses.md.tmpl @@ -0,0 +1,21 @@ +{{- define "depTable" -}} +| Dependency | Version | License | +| ---------- | ------- | ------- | +{{ range $i, $dep := . -}} +| [{{ $dep.Name }}]({{ with $dep.URL }}{{ . }}{{ else }}https://pkg.go.dev/{{ $dep.Name }}{{ end }}) | {{ with $dep.Version }}`{{ . }}`{{ else }}—{{ end }} | {{ $dep.LicenceType }} | +{{ end -}} +{{- end -}} + + + +# Third-Party Licenses + +The Devsy CLI is built with the open-source Go modules listed below. Each entry +links to the module and notes the license it is distributed under. Some +dependencies are only included on certain operating systems or architectures. + +To regenerate this file after changing dependencies, run `task cli:licenses`. + +## Dependencies + +{{ template "depTable" .Direct }} diff --git a/sites/docs-devsy-sh/pages/licenses/devsy.mdx b/sites/docs-devsy-sh/pages/licenses/devsy.mdx deleted file mode 100644 index 65d5bf8b2..000000000 --- a/sites/docs-devsy-sh/pages/licenses/devsy.mdx +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: Open Source Licenses -sidebar_label: OSS Licenses ---- - -# Devsy dependencies - -The following open source dependencies are used to build the [Devsy][] CLI. - -[Devsy]: https://devsy.sh - -## Go Packages - -Some packages may only be included on certain architectures or operating systems. - - - - [cloud.google.com/go/compute/metadata](https://pkg.go.dev/cloud.google.com/go/compute/metadata) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/cloud.google.com/go/compute/metadata/LICENSE)) - - [github.com/AlecAivazis/survey/v2](https://pkg.go.dev/github.com/AlecAivazis/survey/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/AlecAivazis/survey/v2/LICENSE)) - - [github.com/AlecAivazis/survey/v2/terminal](https://pkg.go.dev/github.com/AlecAivazis/survey/v2/terminal) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/AlecAivazis/survey/v2/terminal/LICENSE.txt)) - - [github.com/Azure/azure-sdk-for-go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/azure-sdk-for-go/LICENSE.txt)) - - [github.com/Azure/go-autorest/autorest](https://pkg.go.dev/github.com/Azure/go-autorest/autorest) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/autorest/LICENSE)) - - [github.com/Azure/go-autorest/autorest/adal](https://pkg.go.dev/github.com/Azure/go-autorest/autorest/adal) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE)) - - [github.com/Azure/go-autorest/autorest/azure/auth](https://pkg.go.dev/github.com/Azure/go-autorest/autorest/azure/auth) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/autorest/azure/auth/LICENSE)) - - [github.com/Azure/go-autorest/autorest/azure/cli](https://pkg.go.dev/github.com/Azure/go-autorest/autorest/azure/cli) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/autorest/azure/cli/LICENSE)) - - [github.com/Azure/go-autorest/autorest/date](https://pkg.go.dev/github.com/Azure/go-autorest/autorest/date) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/autorest/date/LICENSE)) - - [github.com/Azure/go-autorest/logger](https://pkg.go.dev/github.com/Azure/go-autorest/logger) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/logger/LICENSE)) - - [github.com/Azure/go-autorest/tracing](https://pkg.go.dev/github.com/Azure/go-autorest/tracing) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/Azure/go-autorest/tracing/LICENSE)) - - [github.com/BurntSushi/toml](https://pkg.go.dev/github.com/BurntSushi/toml) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/BurntSushi/toml/COPYING)) - - [github.com/NYTimes/gziphandler](https://pkg.go.dev/github.com/NYTimes/gziphandler) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/NYTimes/gziphandler/LICENSE)) - - [github.com/acarl005/stripansi](https://pkg.go.dev/github.com/acarl005/stripansi) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/acarl005/stripansi/LICENSE)) - - [github.com/alessio/shellescape](https://pkg.go.dev/github.com/alessio/shellescape) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/alessio/shellescape/LICENSE)) - - [github.com/anmitsu/go-shlex](https://pkg.go.dev/github.com/anmitsu/go-shlex) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/anmitsu/go-shlex/LICENSE)) - - [github.com/antlr4-go/antlr/v4](https://pkg.go.dev/github.com/antlr4-go/antlr/v4) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/antlr4-go/antlr/v4/LICENSE)) - - [github.com/asaskevich/govalidator](https://pkg.go.dev/github.com/asaskevich/govalidator) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/asaskevich/govalidator/LICENSE)) - - [github.com/atotto/clipboard](https://pkg.go.dev/github.com/atotto/clipboard) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/atotto/clipboard/LICENSE)) - - [github.com/aws/aws-sdk-go-v2](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/config](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/config/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/credentials](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/credentials) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/credentials/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/feature/ec2/imds](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/feature/ec2/imds) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/internal/configsources](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/internal/configsources) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/internal/endpoints/v2](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/internal/ini](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/internal/ini) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/internal/sync/singleflight](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/internal/sync/singleflight/LICENSE)) - - [github.com/aws/aws-sdk-go-v2/service/ecr](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/ecr) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/ecr/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/ecrpublic](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/ecrpublic) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/ecrpublic/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/internal/presigned-url](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/sso](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/sso) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/sso/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/ssooidc](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/ssooidc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/LICENSE.txt)) - - [github.com/aws/aws-sdk-go-v2/service/sts](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/sts) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/aws-sdk-go-v2/service/sts/LICENSE.txt)) - - [github.com/aws/smithy-go](https://pkg.go.dev/github.com/aws/smithy-go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/smithy-go/LICENSE)) - - [github.com/aws/smithy-go/internal/sync/singleflight](https://pkg.go.dev/github.com/aws/smithy-go/internal/sync/singleflight) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aws/smithy-go/internal/sync/singleflight/LICENSE)) - - [github.com/awslabs/amazon-ecr-credential-helper/ecr-login](https://pkg.go.dev/github.com/awslabs/amazon-ecr-credential-helper/ecr-login) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/awslabs/amazon-ecr-credential-helper/ecr-login/LICENSE)) - - [github.com/aymanbagabas/go-osc52/v2](https://pkg.go.dev/github.com/aymanbagabas/go-osc52/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/aymanbagabas/go-osc52/v2/LICENSE)) - - [github.com/beorn7/perks/quantile](https://pkg.go.dev/github.com/beorn7/perks/quantile) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/beorn7/perks/LICENSE)) - - [github.com/blang/semver](https://pkg.go.dev/github.com/blang/semver) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/blang/semver/LICENSE)) - - [github.com/blang/semver/v4](https://pkg.go.dev/github.com/blang/semver/v4) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/blang/semver/v4/LICENSE)) - - [github.com/bmatcuk/doublestar/v4](https://pkg.go.dev/github.com/bmatcuk/doublestar/v4) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/bmatcuk/doublestar/v4/LICENSE)) - - [github.com/catppuccin/go](https://pkg.go.dev/github.com/catppuccin/go) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/catppuccin/go/LICENSE)) - - [github.com/cenkalti/backoff/v4](https://pkg.go.dev/github.com/cenkalti/backoff/v4) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/cenkalti/backoff/v4/LICENSE)) - - [github.com/cespare/xxhash/v2](https://pkg.go.dev/github.com/cespare/xxhash/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/cespare/xxhash/v2/LICENSE.txt)) - - [github.com/charmbracelet/bubbles](https://pkg.go.dev/github.com/charmbracelet/bubbles) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/bubbles/LICENSE)) - - [github.com/charmbracelet/bubbletea](https://pkg.go.dev/github.com/charmbracelet/bubbletea) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/bubbletea/LICENSE)) - - [github.com/charmbracelet/huh](https://pkg.go.dev/github.com/charmbracelet/huh) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/huh/LICENSE)) - - [github.com/charmbracelet/lipgloss](https://pkg.go.dev/github.com/charmbracelet/lipgloss) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/lipgloss/LICENSE)) - - [github.com/charmbracelet/x/ansi](https://pkg.go.dev/github.com/charmbracelet/x/ansi) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/x/ansi/LICENSE)) - - [github.com/charmbracelet/x/exp/strings](https://pkg.go.dev/github.com/charmbracelet/x/exp/strings) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/x/exp/strings/LICENSE)) - - [github.com/charmbracelet/x/term](https://pkg.go.dev/github.com/charmbracelet/x/term) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/charmbracelet/x/term/LICENSE)) - - [github.com/compose-spec/compose-go/v2](https://pkg.go.dev/github.com/compose-spec/compose-go/v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/compose-spec/compose-go/v2/LICENSE)) - - [github.com/compose-spec/compose-go/v2/dotenv](https://pkg.go.dev/github.com/compose-spec/compose-go/v2/dotenv) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/compose-spec/compose-go/v2/dotenv/LICENSE)) - - [github.com/containerd/console](https://pkg.go.dev/github.com/containerd/console) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/console/LICENSE)) - - [github.com/containerd/containerd](https://pkg.go.dev/github.com/containerd/containerd) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/containerd/LICENSE)) - - [github.com/containerd/containerd/api/services/content/v1](https://pkg.go.dev/github.com/containerd/containerd/api/services/content/v1) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/containerd/api/LICENSE)) - - [github.com/containerd/continuity/sysx](https://pkg.go.dev/github.com/containerd/continuity/sysx) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/continuity/LICENSE)) - - [github.com/containerd/errdefs](https://pkg.go.dev/github.com/containerd/errdefs) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/errdefs/LICENSE)) - - [github.com/containerd/log](https://pkg.go.dev/github.com/containerd/log) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/log/LICENSE)) - - [github.com/containerd/platforms](https://pkg.go.dev/github.com/containerd/platforms) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/platforms/LICENSE)) - - [github.com/containerd/stargz-snapshotter/estargz](https://pkg.go.dev/github.com/containerd/stargz-snapshotter/estargz) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/stargz-snapshotter/estargz/LICENSE)) - - [github.com/containerd/ttrpc](https://pkg.go.dev/github.com/containerd/ttrpc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/ttrpc/LICENSE)) - - [github.com/containerd/typeurl/v2](https://pkg.go.dev/github.com/containerd/typeurl/v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containerd/typeurl/v2/LICENSE)) - - [github.com/containers/image/v5](https://pkg.go.dev/github.com/containers/image/v5) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containers/image/v5/LICENSE)) - - [github.com/containers/storage/pkg](https://pkg.go.dev/github.com/containers/storage/pkg) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/containers/storage/LICENSE)) - - [github.com/coreos/go-semver/semver](https://pkg.go.dev/github.com/coreos/go-semver/semver) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/coreos/go-semver/LICENSE)) - - [github.com/coreos/go-systemd/v22](https://pkg.go.dev/github.com/coreos/go-systemd/v22) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/coreos/go-systemd/v22/LICENSE)) - - [github.com/creack/pty](https://pkg.go.dev/github.com/creack/pty) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/creack/pty/LICENSE)) - - [github.com/davecgh/go-spew/spew](https://pkg.go.dev/github.com/davecgh/go-spew/spew) ([ISC](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/davecgh/go-spew/LICENSE)) - - [github.com/dimchansky/utfbom](https://pkg.go.dev/github.com/dimchansky/utfbom) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/dimchansky/utfbom/LICENSE)) - - [github.com/distribution/reference](https://pkg.go.dev/github.com/distribution/reference) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/distribution/reference/LICENSE)) - - [github.com/docker/cli/cli/config](https://pkg.go.dev/github.com/docker/cli/cli/config) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/cli/LICENSE)) - - [github.com/docker/distribution/registry/client/auth/challenge](https://pkg.go.dev/github.com/docker/distribution/registry/client/auth/challenge) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/distribution/LICENSE)) - - [github.com/docker/docker](https://pkg.go.dev/github.com/docker/docker) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/docker/LICENSE)) - - [github.com/docker/docker-credential-helpers](https://pkg.go.dev/github.com/docker/docker-credential-helpers) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/docker-credential-helpers/LICENSE)) - - [github.com/docker/go-connections](https://pkg.go.dev/github.com/docker/go-connections) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/go-connections/LICENSE)) - - [github.com/docker/go-units](https://pkg.go.dev/github.com/docker/go-units) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/docker/go-units/LICENSE)) - - [github.com/dustin/go-humanize](https://pkg.go.dev/github.com/dustin/go-humanize) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/dustin/go-humanize/LICENSE)) - - [github.com/emicklei/go-restful/v3](https://pkg.go.dev/github.com/emicklei/go-restful/v3) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/emicklei/go-restful/v3/LICENSE)) - - [github.com/evanphx/json-patch](https://pkg.go.dev/github.com/evanphx/json-patch) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/evanphx/json-patch/LICENSE)) - - [github.com/evanphx/json-patch/v5](https://pkg.go.dev/github.com/evanphx/json-patch/v5) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/evanphx/json-patch/v5/LICENSE)) - - [github.com/felixge/httpsnoop](https://pkg.go.dev/github.com/felixge/httpsnoop) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/felixge/httpsnoop/LICENSE.txt)) - - [github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/fsnotify/fsnotify/LICENSE)) - - [github.com/fxamacker/cbor/v2](https://pkg.go.dev/github.com/fxamacker/cbor/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/fxamacker/cbor/v2/LICENSE)) - - [github.com/go-logr/logr](https://pkg.go.dev/github.com/go-logr/logr) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-logr/logr/LICENSE)) - - [github.com/go-logr/stdr](https://pkg.go.dev/github.com/go-logr/stdr) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-logr/stdr/LICENSE)) - - [github.com/go-openapi/jsonpointer](https://pkg.go.dev/github.com/go-openapi/jsonpointer) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-openapi/jsonpointer/LICENSE)) - - [github.com/go-openapi/jsonreference](https://pkg.go.dev/github.com/go-openapi/jsonreference) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-openapi/jsonreference/LICENSE)) - - [github.com/go-openapi/swag](https://pkg.go.dev/github.com/go-openapi/swag) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-openapi/swag/LICENSE)) - - [github.com/go-viper/mapstructure/v2](https://pkg.go.dev/github.com/go-viper/mapstructure/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/go-viper/mapstructure/v2/LICENSE)) - - [github.com/gofrs/flock](https://pkg.go.dev/github.com/gofrs/flock) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/gofrs/flock/LICENSE)) - - [github.com/gogo/protobuf](https://pkg.go.dev/github.com/gogo/protobuf) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/gogo/protobuf/LICENSE)) - - [github.com/golang-jwt/jwt/v4](https://pkg.go.dev/github.com/golang-jwt/jwt/v4) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/golang-jwt/jwt/v4/LICENSE)) - - [github.com/golang/groupcache/lru](https://pkg.go.dev/github.com/golang/groupcache/lru) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/golang/groupcache/LICENSE)) - - [github.com/golang/protobuf](https://pkg.go.dev/github.com/golang/protobuf) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/golang/protobuf/LICENSE)) - - [github.com/google/cel-go](https://pkg.go.dev/github.com/google/cel-go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/cel-go/LICENSE)) - - [github.com/google/gnostic-models](https://pkg.go.dev/github.com/google/gnostic-models) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/gnostic-models/LICENSE)) - - [github.com/google/go-cmp/cmp](https://pkg.go.dev/github.com/google/go-cmp/cmp) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/go-cmp/LICENSE)) - - [github.com/google/go-containerregistry](https://pkg.go.dev/github.com/google/go-containerregistry) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/go-containerregistry/LICENSE)) - - [github.com/google/go-containerregistry/pkg/authn/kubernetes](https://pkg.go.dev/github.com/google/go-containerregistry/pkg/authn/kubernetes) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/go-containerregistry/pkg/authn/kubernetes/LICENSE)) - - [github.com/google/go-github/v30/github](https://pkg.go.dev/github.com/google/go-github/v30/github) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/go-github/v30/LICENSE)) - - [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/go-querystring/LICENSE)) - - [github.com/google/gofuzz](https://pkg.go.dev/github.com/google/gofuzz) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/gofuzz/LICENSE)) - - [github.com/google/shlex](https://pkg.go.dev/github.com/google/shlex) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/shlex/COPYING)) - - [github.com/google/uuid](https://pkg.go.dev/github.com/google/uuid) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/google/uuid/LICENSE)) - - [github.com/gorilla/websocket](https://pkg.go.dev/github.com/gorilla/websocket) ([BSD-2-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/gorilla/websocket/LICENSE)) - - [github.com/grpc-ecosystem/go-grpc-prometheus](https://pkg.go.dev/github.com/grpc-ecosystem/go-grpc-prometheus) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/grpc-ecosystem/go-grpc-prometheus/LICENSE)) - - [github.com/grpc-ecosystem/grpc-gateway/v2](https://pkg.go.dev/github.com/grpc-ecosystem/grpc-gateway/v2) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/LICENSE)) - - [github.com/hashicorp/errwrap](https://pkg.go.dev/github.com/hashicorp/errwrap) ([MPL-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/hashicorp/errwrap/LICENSE)) - - [github.com/hashicorp/go-cleanhttp](https://pkg.go.dev/github.com/hashicorp/go-cleanhttp) ([MPL-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/hashicorp/go-cleanhttp/LICENSE)) - - [github.com/hashicorp/go-multierror](https://pkg.go.dev/github.com/hashicorp/go-multierror) ([MPL-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/hashicorp/go-multierror/LICENSE)) - - [github.com/imdario/mergo](https://pkg.go.dev/github.com/imdario/mergo) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/imdario/mergo/LICENSE)) - - [github.com/in-toto/in-toto-golang/in_toto](https://pkg.go.dev/github.com/in-toto/in-toto-golang/in_toto) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/in-toto/in-toto-golang/LICENSE)) - - [github.com/inconshreveable/go-update](https://pkg.go.dev/github.com/inconshreveable/go-update) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/inconshreveable/go-update/LICENSE)) - - [github.com/inconshreveable/go-update/internal/binarydist](https://pkg.go.dev/github.com/inconshreveable/go-update/internal/binarydist) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/inconshreveable/go-update/internal/binarydist/License)) - - [github.com/inconshreveable/go-update/internal/osext](https://pkg.go.dev/github.com/inconshreveable/go-update/internal/osext) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/inconshreveable/go-update/internal/osext/LICENSE)) - - [github.com/jmespath/go-jmespath](https://pkg.go.dev/github.com/jmespath/go-jmespath) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/jmespath/go-jmespath/LICENSE)) - - [github.com/joho/godotenv](https://pkg.go.dev/github.com/joho/godotenv) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/joho/godotenv/LICENCE)) - - [github.com/josharian/intern](https://pkg.go.dev/github.com/josharian/intern) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/josharian/intern/license.md)) - - [github.com/json-iterator/go](https://pkg.go.dev/github.com/json-iterator/go) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/json-iterator/go/LICENSE)) - - [github.com/k0kubun/go-ansi](https://pkg.go.dev/github.com/k0kubun/go-ansi) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/k0kubun/go-ansi/LICENSE.txt)) - - [github.com/kballard/go-shellquote](https://pkg.go.dev/github.com/kballard/go-shellquote) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/kballard/go-shellquote/LICENSE)) - - [github.com/klauspost/compress](https://pkg.go.dev/github.com/klauspost/compress) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/klauspost/compress/LICENSE)) - - [github.com/klauspost/compress/internal/snapref](https://pkg.go.dev/github.com/klauspost/compress/internal/snapref) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/klauspost/compress/internal/snapref/LICENSE)) - - [github.com/klauspost/compress/zstd/internal/xxhash](https://pkg.go.dev/github.com/klauspost/compress/zstd/internal/xxhash) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/klauspost/compress/zstd/internal/xxhash/LICENSE.txt)) - - [github.com/kr/fs](https://pkg.go.dev/github.com/kr/fs) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/kr/fs/LICENSE)) - - [github.com/kylelemons/godebug/diff](https://pkg.go.dev/github.com/kylelemons/godebug/diff) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/kylelemons/godebug/LICENSE)) - - [github.com/liggitt/tabwriter](https://pkg.go.dev/github.com/liggitt/tabwriter) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/liggitt/tabwriter/LICENSE)) - - [github.com/lucasb-eyer/go-colorful](https://pkg.go.dev/github.com/lucasb-eyer/go-colorful) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/lucasb-eyer/go-colorful/LICENSE)) - - [github.com/mailru/easyjson](https://pkg.go.dev/github.com/mailru/easyjson) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mailru/easyjson/LICENSE)) - - [github.com/mattn/go-colorable](https://pkg.go.dev/github.com/mattn/go-colorable) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mattn/go-colorable/LICENSE)) - - [github.com/mattn/go-isatty](https://pkg.go.dev/github.com/mattn/go-isatty) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mattn/go-isatty/LICENSE)) - - [github.com/mattn/go-runewidth](https://pkg.go.dev/github.com/mattn/go-runewidth) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mattn/go-runewidth/LICENSE)) - - [github.com/mattn/go-shellwords](https://pkg.go.dev/github.com/mattn/go-shellwords) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mattn/go-shellwords/LICENSE)) - - [github.com/mgutz/ansi](https://pkg.go.dev/github.com/mgutz/ansi) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mgutz/ansi/LICENSE)) - - [github.com/mitchellh/go-homedir](https://pkg.go.dev/github.com/mitchellh/go-homedir) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mitchellh/go-homedir/LICENSE)) - - [github.com/mitchellh/go-wordwrap](https://pkg.go.dev/github.com/mitchellh/go-wordwrap) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md)) - - [github.com/mitchellh/hashstructure/v2](https://pkg.go.dev/github.com/mitchellh/hashstructure/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mitchellh/hashstructure/v2/LICENSE)) - - [github.com/moby/buildkit](https://pkg.go.dev/github.com/moby/buildkit) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/buildkit/LICENSE)) - - [github.com/moby/docker-image-spec/specs-go/v1](https://pkg.go.dev/github.com/moby/docker-image-spec/specs-go/v1) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/docker-image-spec/LICENSE)) - - [github.com/moby/locker](https://pkg.go.dev/github.com/moby/locker) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/locker/LICENSE)) - - [github.com/moby/patternmatcher](https://pkg.go.dev/github.com/moby/patternmatcher) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/patternmatcher/LICENSE)) - - [github.com/moby/spdystream](https://pkg.go.dev/github.com/moby/spdystream) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/spdystream/LICENSE)) - - [github.com/moby/sys/capability](https://pkg.go.dev/github.com/moby/sys/capability) ([BSD-2-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/sys/capability/LICENSE)) - - [github.com/moby/sys/mountinfo](https://pkg.go.dev/github.com/moby/sys/mountinfo) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/sys/mountinfo/LICENSE)) - - [github.com/moby/sys/signal](https://pkg.go.dev/github.com/moby/sys/signal) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/sys/signal/LICENSE)) - - [github.com/moby/sys/user](https://pkg.go.dev/github.com/moby/sys/user) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/sys/user/LICENSE)) - - [github.com/moby/term](https://pkg.go.dev/github.com/moby/term) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/moby/term/LICENSE)) - - [github.com/modern-go/concurrent](https://pkg.go.dev/github.com/modern-go/concurrent) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/modern-go/concurrent/LICENSE)) - - [github.com/modern-go/reflect2](https://pkg.go.dev/github.com/modern-go/reflect2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/modern-go/reflect2/LICENSE)) - - [github.com/morikuni/aec](https://pkg.go.dev/github.com/morikuni/aec) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/morikuni/aec/LICENSE)) - - [github.com/muesli/ansi](https://pkg.go.dev/github.com/muesli/ansi) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/muesli/ansi/LICENSE)) - - [github.com/muesli/cancelreader](https://pkg.go.dev/github.com/muesli/cancelreader) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/muesli/cancelreader/LICENSE)) - - [github.com/muesli/termenv](https://pkg.go.dev/github.com/muesli/termenv) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/muesli/termenv/LICENSE)) - - [github.com/munnerz/goautoneg](https://pkg.go.dev/github.com/munnerz/goautoneg) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/munnerz/goautoneg/LICENSE)) - - [github.com/mxk/go-flowrate/flowrate](https://pkg.go.dev/github.com/mxk/go-flowrate/flowrate) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/mxk/go-flowrate/LICENSE)) - - [github.com/olekukonko/tablewriter](https://pkg.go.dev/github.com/olekukonko/tablewriter) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/olekukonko/tablewriter/LICENSE.md)) - - [github.com/onsi/ginkgo/v2](https://pkg.go.dev/github.com/onsi/ginkgo/v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/onsi/ginkgo/v2/LICENSE)) - - [github.com/onsi/gomega](https://pkg.go.dev/github.com/onsi/gomega) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/onsi/gomega/LICENSE)) - - [github.com/opencontainers/go-digest](https://pkg.go.dev/github.com/opencontainers/go-digest) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/opencontainers/go-digest/LICENSE)) - - [github.com/opencontainers/image-spec/specs-go](https://pkg.go.dev/github.com/opencontainers/image-spec/specs-go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/opencontainers/image-spec/LICENSE)) - - [github.com/opencontainers/runtime-spec/specs-go](https://pkg.go.dev/github.com/opencontainers/runtime-spec/specs-go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/opencontainers/runtime-spec/LICENSE)) - - [github.com/otiai10/copy](https://pkg.go.dev/github.com/otiai10/copy) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/otiai10/copy/LICENSE)) - - [github.com/pkg/errors](https://pkg.go.dev/github.com/pkg/errors) ([BSD-2-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/pkg/errors/LICENSE)) - - [github.com/pkg/sftp](https://pkg.go.dev/github.com/pkg/sftp) ([BSD-2-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/pkg/sftp/LICENSE)) - - [github.com/planetscale/vtprotobuf](https://pkg.go.dev/github.com/planetscale/vtprotobuf) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/planetscale/vtprotobuf/LICENSE)) - - [github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil](https://pkg.go.dev/github.com/prometheus/client_golang/internal/github.com/golang/gddo/httputil) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/prometheus/client_golang/internal/github.com/golang/gddo/LICENSE)) - - [github.com/prometheus/client_golang/prometheus](https://pkg.go.dev/github.com/prometheus/client_golang/prometheus) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/prometheus/client_golang/LICENSE)) - - [github.com/prometheus/client_model/go](https://pkg.go.dev/github.com/prometheus/client_model/go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/prometheus/client_model/LICENSE)) - - [github.com/prometheus/common](https://pkg.go.dev/github.com/prometheus/common) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/prometheus/common/LICENSE)) - - [github.com/prometheus/procfs](https://pkg.go.dev/github.com/prometheus/procfs) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/prometheus/procfs/LICENSE)) - - [github.com/creativeprojects/go-selfupdate](https://pkg.go.dev/github.com/creativeprojects/go-selfupdate) ([MIT](https://github.com/creativeprojects/go-selfupdate/blob/main/LICENSE)) - - [github.com/rivo/uniseg](https://pkg.go.dev/github.com/rivo/uniseg) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/rivo/uniseg/LICENSE.txt)) - - [github.com/secure-systems-lab/go-securesystemslib](https://pkg.go.dev/github.com/secure-systems-lab/go-securesystemslib) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/secure-systems-lab/go-securesystemslib/LICENSE)) - - [github.com/shibumi/go-pathspec](https://pkg.go.dev/github.com/shibumi/go-pathspec) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/shibumi/go-pathspec/LICENSE)) - - [github.com/sirupsen/logrus](https://pkg.go.dev/github.com/sirupsen/logrus) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/sirupsen/logrus/LICENSE)) - - [github.com/skratchdot/open-golang/open](https://pkg.go.dev/github.com/skratchdot/open-golang/open) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/skratchdot/open-golang/LICENSE)) - - [github.com/spf13/cobra](https://pkg.go.dev/github.com/spf13/cobra) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/spf13/cobra/LICENSE.txt)) - - [github.com/spf13/pflag](https://pkg.go.dev/github.com/spf13/pflag) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/spf13/pflag/LICENSE)) - - [github.com/stoewer/go-strcase](https://pkg.go.dev/github.com/stoewer/go-strcase) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/stoewer/go-strcase/LICENSE)) - - [github.com/tailscale/hujson](https://pkg.go.dev/github.com/tailscale/hujson) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tailscale/hujson/LICENSE)) - - [github.com/tcnksm/go-gitconfig](https://pkg.go.dev/github.com/tcnksm/go-gitconfig) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tcnksm/go-gitconfig/LICENSE)) - - [github.com/tidwall/gjson](https://pkg.go.dev/github.com/tidwall/gjson) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tidwall/gjson/LICENSE)) - - [github.com/tidwall/jsonc](https://pkg.go.dev/github.com/tidwall/jsonc) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tidwall/jsonc/LICENSE)) - - [github.com/tidwall/match](https://pkg.go.dev/github.com/tidwall/match) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tidwall/match/LICENSE)) - - [github.com/tidwall/pretty](https://pkg.go.dev/github.com/tidwall/pretty) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tidwall/pretty/LICENSE)) - - [github.com/tonistiigi/fsutil](https://pkg.go.dev/github.com/tonistiigi/fsutil) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tonistiigi/fsutil/LICENSE)) - - [github.com/tonistiigi/go-csvvalue](https://pkg.go.dev/github.com/tonistiigi/go-csvvalue) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tonistiigi/go-csvvalue/LICENSE)) - - [github.com/tonistiigi/units](https://pkg.go.dev/github.com/tonistiigi/units) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tonistiigi/units/LICENSE)) - - [github.com/tonistiigi/vt100](https://pkg.go.dev/github.com/tonistiigi/vt100) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/tonistiigi/vt100/LICENSE)) - - [github.com/ulikunitz/xz](https://pkg.go.dev/github.com/ulikunitz/xz) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/ulikunitz/xz/LICENSE)) - - [github.com/vbatts/tar-split/archive/tar](https://pkg.go.dev/github.com/vbatts/tar-split/archive/tar) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/vbatts/tar-split/LICENSE)) - - [github.com/x448/float16](https://pkg.go.dev/github.com/x448/float16) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/x448/float16/LICENSE)) - - [github.com/xeipuuv/gojsonpointer](https://pkg.go.dev/github.com/xeipuuv/gojsonpointer) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/xeipuuv/gojsonpointer/LICENSE-APACHE-2.0.txt)) - - [github.com/xeipuuv/gojsonreference](https://pkg.go.dev/github.com/xeipuuv/gojsonreference) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/xeipuuv/gojsonreference/LICENSE-APACHE-2.0.txt)) - - [github.com/xeipuuv/gojsonschema](https://pkg.go.dev/github.com/xeipuuv/gojsonschema) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/github.com/xeipuuv/gojsonschema/LICENSE-APACHE-2.0.txt)) - - [go.etcd.io/etcd/api/v3](https://pkg.go.dev/go.etcd.io/etcd/api/v3) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.etcd.io/etcd/api/v3/LICENSE)) - - [go.etcd.io/etcd/client/pkg/v3](https://pkg.go.dev/go.etcd.io/etcd/client/pkg/v3) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.etcd.io/etcd/client/pkg/v3/LICENSE)) - - [go.etcd.io/etcd/client/v3](https://pkg.go.dev/go.etcd.io/etcd/client/v3) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.etcd.io/etcd/client/v3/LICENSE)) - - [go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc](https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/LICENSE)) - - [go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace](https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/LICENSE)) - - [go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp](https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/LICENSE)) - - [go.opentelemetry.io/otel](https://pkg.go.dev/go.opentelemetry.io/otel) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/LICENSE)) - - [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/LICENSE)) - - [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/LICENSE)) - - [go.opentelemetry.io/otel/metric](https://pkg.go.dev/go.opentelemetry.io/otel/metric) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/metric/LICENSE)) - - [go.opentelemetry.io/otel/sdk](https://pkg.go.dev/go.opentelemetry.io/otel/sdk) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/sdk/LICENSE)) - - [go.opentelemetry.io/otel/trace](https://pkg.go.dev/go.opentelemetry.io/otel/trace) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/otel/trace/LICENSE)) - - [go.opentelemetry.io/proto/otlp](https://pkg.go.dev/go.opentelemetry.io/proto/otlp) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.opentelemetry.io/proto/otlp/LICENSE)) - - [go.uber.org/multierr](https://pkg.go.dev/go.uber.org/multierr) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.uber.org/multierr/LICENSE.txt)) - - [go.uber.org/zap](https://pkg.go.dev/go.uber.org/zap) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/go.uber.org/zap/LICENSE)) - - [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/crypto/LICENSE)) - - [golang.org/x/exp](https://pkg.go.dev/golang.org/x/exp) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/exp/LICENSE)) - - [golang.org/x/net](https://pkg.go.dev/golang.org/x/net) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/net/LICENSE)) - - [golang.org/x/oauth2](https://pkg.go.dev/golang.org/x/oauth2) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/oauth2/LICENSE)) - - [golang.org/x/sync](https://pkg.go.dev/golang.org/x/sync) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/sync/LICENSE)) - - [golang.org/x/sys/unix](https://pkg.go.dev/golang.org/x/sys/unix) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/sys/LICENSE)) - - [golang.org/x/term](https://pkg.go.dev/golang.org/x/term) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/term/LICENSE)) - - [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/text/LICENSE)) - - [golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/golang.org/x/time/LICENSE)) - - [gomodules.xyz/jsonpatch/v2](https://pkg.go.dev/gomodules.xyz/jsonpatch/v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gomodules.xyz/jsonpatch/v2/LICENSE)) - - [google.golang.org/genproto/googleapis/api](https://pkg.go.dev/google.golang.org/genproto/googleapis/api) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/google.golang.org/genproto/googleapis/api/LICENSE)) - - [google.golang.org/genproto/googleapis/rpc](https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/google.golang.org/genproto/googleapis/rpc/LICENSE)) - - [google.golang.org/genproto/protobuf/field_mask](https://pkg.go.dev/google.golang.org/genproto/protobuf/field_mask) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/google.golang.org/genproto/LICENSE)) - - [google.golang.org/grpc](https://pkg.go.dev/google.golang.org/grpc) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/google.golang.org/grpc/LICENSE)) - - [google.golang.org/protobuf](https://pkg.go.dev/google.golang.org/protobuf) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/google.golang.org/protobuf/LICENSE)) - - [gopkg.in/evanphx/json-patch.v4](https://pkg.go.dev/gopkg.in/evanphx/json-patch.v4) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/evanphx/json-patch.v4/LICENSE)) - - [gopkg.in/inf.v0](https://pkg.go.dev/gopkg.in/inf.v0) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/inf.v0/LICENSE)) - - [gopkg.in/natefinch/lumberjack.v2](https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/natefinch/lumberjack.v2/LICENSE)) - - [gopkg.in/square/go-jose.v2](https://pkg.go.dev/gopkg.in/square/go-jose.v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/square/go-jose.v2/LICENSE)) - - [gopkg.in/square/go-jose.v2/json](https://pkg.go.dev/gopkg.in/square/go-jose.v2/json) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/square/go-jose.v2/json/LICENSE)) - - [gopkg.in/yaml.v2](https://pkg.go.dev/gopkg.in/yaml.v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/yaml.v2/LICENSE)) - - [gopkg.in/yaml.v3](https://pkg.go.dev/gopkg.in/yaml.v3) ([MIT](https://github.com/devsy-org/devsy/blob/HEAD/vendor/gopkg.in/yaml.v3/LICENSE)) - - [k8s.io/api](https://pkg.go.dev/k8s.io/api) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/api/LICENSE)) - - [k8s.io/apiextensions-apiserver/pkg/apis/apiextensions](https://pkg.go.dev/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/apiextensions-apiserver/LICENSE)) - - [k8s.io/apimachinery/pkg](https://pkg.go.dev/k8s.io/apimachinery/pkg) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/apimachinery/LICENSE)) - - [k8s.io/apimachinery/third_party/forked/golang](https://pkg.go.dev/k8s.io/apimachinery/third_party/forked/golang) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/apimachinery/third_party/forked/golang/LICENSE)) - - [k8s.io/apiserver](https://pkg.go.dev/k8s.io/apiserver) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/apiserver/LICENSE)) - - [k8s.io/cli-runtime/pkg/printers](https://pkg.go.dev/k8s.io/cli-runtime/pkg/printers) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/cli-runtime/LICENSE)) - - [k8s.io/client-go](https://pkg.go.dev/k8s.io/client-go) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/client-go/LICENSE)) - - [k8s.io/client-go/third_party/forked/golang/template](https://pkg.go.dev/k8s.io/client-go/third_party/forked/golang/template) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/client-go/third_party/forked/golang/LICENSE)) - - [k8s.io/component-base](https://pkg.go.dev/k8s.io/component-base) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/component-base/LICENSE)) - - [k8s.io/klog/v2](https://pkg.go.dev/k8s.io/klog/v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/klog/v2/LICENSE)) - - [k8s.io/kube-aggregator/pkg](https://pkg.go.dev/k8s.io/kube-aggregator/pkg) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-aggregator/LICENSE)) - - [k8s.io/kube-openapi/pkg](https://pkg.go.dev/k8s.io/kube-openapi/pkg) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-openapi/LICENSE)) - - [k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json](https://pkg.go.dev/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json/LICENSE)) - - [k8s.io/kube-openapi/pkg/validation/errors](https://pkg.go.dev/k8s.io/kube-openapi/pkg/validation/errors) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-openapi/pkg/validation/errors/LICENSE)) - - [k8s.io/kube-openapi/pkg/validation/spec](https://pkg.go.dev/k8s.io/kube-openapi/pkg/validation/spec) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-openapi/pkg/validation/spec/LICENSE)) - - [k8s.io/kube-openapi/pkg/validation/strfmt](https://pkg.go.dev/k8s.io/kube-openapi/pkg/validation/strfmt) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kube-openapi/pkg/validation/strfmt/LICENSE)) - - [k8s.io/kubectl/pkg/util](https://pkg.go.dev/k8s.io/kubectl/pkg/util) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/kubectl/LICENSE)) - - [k8s.io/utils](https://pkg.go.dev/k8s.io/utils) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/utils/LICENSE)) - - [k8s.io/utils/internal/third_party/forked/golang](https://pkg.go.dev/k8s.io/utils/internal/third_party/forked/golang) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/k8s.io/utils/internal/third_party/forked/golang/LICENSE)) - - [mvdan.cc/sh/v3](https://pkg.go.dev/mvdan.cc/sh/v3) ([BSD-3-Clause](https://github.com/devsy-org/devsy/blob/HEAD/vendor/mvdan.cc/sh/v3/LICENSE)) - - [sigs.k8s.io/apiserver-network-proxy/konnectivity-client](https://pkg.go.dev/sigs.k8s.io/apiserver-network-proxy/konnectivity-client) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/apiserver-network-proxy/konnectivity-client/LICENSE)) - - [sigs.k8s.io/controller-runtime](https://pkg.go.dev/sigs.k8s.io/controller-runtime) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/controller-runtime/LICENSE)) - - [sigs.k8s.io/json](https://pkg.go.dev/sigs.k8s.io/json) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/json/LICENSE)) - - [sigs.k8s.io/structured-merge-diff/v4](https://pkg.go.dev/sigs.k8s.io/structured-merge-diff/v4) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/structured-merge-diff/v4/LICENSE)) - - [sigs.k8s.io/yaml](https://pkg.go.dev/sigs.k8s.io/yaml) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/yaml/LICENSE)) - - [sigs.k8s.io/yaml/goyaml.v2](https://pkg.go.dev/sigs.k8s.io/yaml/goyaml.v2) ([Apache-2.0](https://github.com/devsy-org/devsy/blob/HEAD/vendor/sigs.k8s.io/yaml/goyaml.v2/LICENSE)) From af14ef6b041d2c61622620b6079a8e76645c0fbd Mon Sep 17 00:00:00 2001 From: Samuel K Date: Wed, 24 Jun 2026 08:19:40 -0500 Subject: [PATCH 3/3] ci: migrate devcontainer pre-commit hooks to prek Switch the devcontainer feature to prek and update the devcontainer build smoke test to verify prek instead of pre-commit, matching the prek-action already used in pr-ci. Signed-off-by: Samuel K --- .devcontainer/devcontainer.json | 2 +- .github/workflows/devcontainer.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1abd6f7ee..42d3f6b43 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,6 +1,6 @@ { "image": "mcr.microsoft.com/devcontainers/go:latest", "features": { - "ghcr.io/devcontainers-extra/features/pre-commit:2": {} + "ghcr.io/devcontainers-extra/features/prek:1": {} } } diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 99c300991..00e8abe6d 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -16,13 +16,13 @@ on: runCmd: description: "Command to run inside the devcontainer" required: false - default: test -x "$(command -v pre-commit)" + default: test -x "$(command -v prek)" permissions: contents: read env: - DEFAULT_RUN_CMD: test -x "$(command -v pre-commit)" + DEFAULT_RUN_CMD: test -x "$(command -v prek)" jobs: build: