Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package arkade for openSUSE:Factory checked in at 2025-11-18 15:40:43 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/arkade (Old) and /work/SRC/openSUSE:Factory/.arkade.new.2061 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "arkade" Tue Nov 18 15:40:43 2025 rev:63 rq:1318410 version:0.11.59 Changes: -------- --- /work/SRC/openSUSE:Factory/arkade/arkade.changes 2025-11-17 12:25:02.273968759 +0100 +++ /work/SRC/openSUSE:Factory/.arkade.new.2061/arkade.changes 2025-11-18 15:43:11.863941591 +0100 @@ -1,0 +2,8 @@ +Tue Nov 18 06:55:48 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 0.11.59: + * Add agents.md to help with LLM automation + * Add kluctl by opencode/grok coder + * feat: add nushell + +------------------------------------------------------------------- Old: ---- arkade-0.11.58.obscpio New: ---- arkade-0.11.59.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ arkade.spec ++++++ --- /var/tmp/diff_new_pack.wy4DwS/_old 2025-11-18 15:43:13.576013710 +0100 +++ /var/tmp/diff_new_pack.wy4DwS/_new 2025-11-18 15:43:13.584014046 +0100 @@ -17,7 +17,7 @@ Name: arkade -Version: 0.11.58 +Version: 0.11.59 Release: 0 Summary: Open Source Kubernetes Marketplace License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.wy4DwS/_old 2025-11-18 15:43:13.928028537 +0100 +++ /var/tmp/diff_new_pack.wy4DwS/_new 2025-11-18 15:43:14.000031570 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/alexellis/arkade</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">0.11.58</param> + <param name="revision">0.11.59</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.wy4DwS/_old 2025-11-18 15:43:14.216040669 +0100 +++ /var/tmp/diff_new_pack.wy4DwS/_new 2025-11-18 15:43:14.260042523 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/alexellis/arkade</param> - <param name="changesrevision">a120f8caa7aaf0a084a2dc4f5c4d88a5710850aa</param></service></servicedata> + <param name="changesrevision">5e1ea83ad4b9e1e5e7dec229d4d74cd6032bf300</param></service></servicedata> (No newline at EOF) ++++++ arkade-0.11.58.obscpio -> arkade-0.11.59.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.58/AGENTS.md new/arkade-0.11.59/AGENTS.md --- old/arkade-0.11.58/AGENTS.md 1970-01-01 01:00:00.000000000 +0100 +++ new/arkade-0.11.59/AGENTS.md 2025-11-17 20:02:25.000000000 +0100 @@ -0,0 +1,207 @@ +# AGENTS.md - Guide for AI Agents Contributing to Arkade + +This document provides guidance for AI agents working on arkade, specifically for reviewing and adding new CLI tools to the `arkade get` command. + +## Types of Arkade Commands + +Arkade provides several types of installers: + +- **`arkade get`** - CLI tools usually to be placed at `/usr/local/bin/` or `$HOME/.arkade/bin/`. These are standalone binaries that can be downloaded and executed directly. + +- **`arkade system install`** - Linux-only system-level tools like Node.js, Go, Prometheus. These require additional installation steps or system configuration. + +- **`arkade oci install`** - Fetches binaries out of OCI images. Ideal for projects that use private repositories like slicer/actuated/k3sup-pro. + +- **`arkade install`** - Kubernetes Helm charts or manifests for add-ons like OpenFaaS CE, Istio, PostgreSQL. These deploy software to Kubernetes clusters. + +**This guide focuses on `arkade get`** - adding CLI tools that provide static binaries for download. + +## 1. How to Add a New CLI (Tool) to Arkade + +### What Can Be Added + +**Only tools with static binaries** can be added to arkade. The tool must provide pre-compiled binaries for download. + +**Cannot be added:** +- Python-based tools (e.g., `aws-cli`, `azure-cli`) - require Python runtime +- Node.js-based tools without static binaries - require Node.js runtime +- Tools that require installation scripts or package managers +- Tools that need runtime dependencies beyond the binary itself + +### Prerequisites + +1. Fork and create a branch: `git checkout -b add-TOOL_NAME` + +### Step 1: Check GitHub Releases + +**CRITICAL**: Before writing code, check the latest stable release on GitHub to see what OS/architecture combinations are available. + +1. Go to `https://github.com/OWNER/REPO/releases/latest` (adds `/latest` to go directly to the latest release) +2. Examine ALL download URLs in the "Assets" section +3. Note available combinations: + - Linux amd64 (x86_64) + - Linux arm64 (aarch64) + - Darwin amd64 (x86_64) + - Darwin arm64 + - Windows amd64 (x86_64) + +**Important**: Match the exact naming used by the upstream project (`amd64` vs `x86_64`, `arm64` vs `aarch64`). + +### Step 2: Add Tool Definition + +Edit `pkg/get/tools.go` and add a new `Tool` entry. **Reference existing examples** like `faas-cli` (lines 27-50) for the structure. + +**Key points:** +- Use `BinaryTemplate` for GitHub releases (simpler) +- Use `URLTemplate` for custom URLs or non-GitHub sources +- Supported archive formats: `.tar.gz`, `.zip` (`.tar.xz` is NOT supported) +- Template variables: `.OS`, `.Arch`, `.Name`, `.Version`, `.VersionNumber`, `.Repo`, `.Owner` +- Windows detection: `HasPrefix .OS "ming"` +- **CRITICAL**: If a binary is missing for a specific OS/arch (e.g., Windows amd64), the template must still generate a URL that results in a 404 error, NOT download the wrong binary (e.g., don't download Linux binary when Windows was requested) + +### Step 3: Write Unit Tests + +Add a test function in `pkg/get/get_test.go`. **Reference `Test_DownloadFaasCli`** (around line 2761) as an example. + +**Requirements:** +- Use a pinned version (not "latest") +- Test all available OS/arch combinations +- Verify URLs match actual GitHub release URLs + +### Step 4: Download and Verify Every OS/Arch Combination + +**MANDATORY**: Download and verify EVERY combination using the `file` command. + +```bash +# Build arkade +go build + +# Test all combinations (script automates this) +./hack/test-tool.sh TOOL_NAME +``` + +For each combination, verify the `file` command output: +- Linux amd64: `ELF 64-bit LSB executable, x86-64` +- Linux arm64: `ELF 64-bit LSB executable, ARM aarch64` +- Darwin amd64: `Mach-O 64-bit x86_64 executable` +- Darwin arm64: `Mach-O 64-bit arm64 executable` +- Windows amd64: `PE32+ executable (console) x86-64` + +**Include the full output of `./hack/test-tool.sh TOOL_NAME` in your PR description.** + +### Step 5: Update Documentation + +The README.md file contains instructions for updating itself. Follow the note at the bottom of the "Catalog of CLIs" section: run `go build && ./arkade get --format markdown` to generate the updated table, then replace the existing catalog section. + +### Step 6: Create Pull Request + +**PR Description must include:** +- List of available/unavailable OS/arch combinations from GitHub releases page +- Full output from `./hack/test-tool.sh TOOL_NAME` showing `file` command results +- Output from `make e2e` (if applicable) + +**Checklist:** +- [ ] All commits signed off (`git commit -s`) +- [ ] Unit tests pass +- [ ] All OS/arch combinations verified with `file` command +- [ ] README.md updated +- [ ] PR description includes verification output + +### Architecture Support Reference + +| OS | Architecture | Const name | Notes | +|---|---|---|---| +| macOS (Intel) | x86_64 | `arch64bit` | Intel Macs | +| macOS (Apple Silicon) | arm64 | `archDarwinARM64` | M1/M2/M3 Macs | +| Linux | x86_64 | `arch64bit` | Standard Linux | +| Linux | aarch64/arm64 | `archARM64` | ARM64 Linux | +| Windows | x86_64 | `arch64bit` | Windows (Git Bash) | + +**Note**: Do not add ARMv6 or 32-bit x86 support. + +### Troubleshooting + +- **URLs don't match**: Check actual release URLs on GitHub and adjust template +- **Wrong architecture in binary**: Verify binary names on GitHub releases page +- **Missing combinations**: Document why in PR description if upstream doesn't provide them. The template must still generate a URL that returns 404 (not download the wrong binary) +- **Downloads wrong binary**: If requesting Windows but getting Linux binary, the template is incorrectly falling back. Each OS/arch must have a unique URL that matches the actual release or returns 404 + +--- + +## 2. How to Review a New CLI Being Added as an AI Agent + +### Pre-Review Checklist + +- [ ] Issue has `design/approved` label +- [ ] All commits signed off +- [ ] PR adds only one tool + +### Code Review + +#### Tool Definition (`pkg/get/tools.go`) + +- [ ] Tool provides static binaries (not Python/Node.js-based) +- [ ] Required fields: `Name`, `Owner`, `Repo`, `Description` +- [ ] Either `BinaryTemplate` or `URLTemplate` provided +- [ ] Supports required OS/arch combinations (Linux amd64/arm64, Darwin amd64/arm64, Windows amd64) +- [ ] Archive format is `.tar.gz` or `.zip` (not `.tar.xz`) +- [ ] Missing OS/arch combinations generate URLs that return 404 (not download wrong binary) + +#### Unit Tests (`pkg/get/get_test.go`) + +- [ ] Test function exists with pinned version +- [ ] Test cases for all available platforms +- [ ] URLs match actual GitHub release URLs + +#### Documentation + +- [ ] README.md updated with tool entry + +#### PR Description + +- [ ] **CRITICAL**: Includes `file` command output for **every** OS/arch combination +- [ ] Documents which OS/arch combinations are available from upstream +- [ ] Includes output from `./hack/test-tool.sh TOOL_NAME` +- [ ] Includes output from `make e2e` (if applicable) + +### Critical Review: Binary Verification + +**MANDATORY**: Verify `file` command output for every combination shows correct architecture: +- Linux amd64: `ELF 64-bit LSB executable, x86-64` +- Linux arm64: `ELF 64-bit LSB executable, ARM aarch64` +- Darwin amd64: `Mach-O 64-bit x86_64 executable` +- Darwin arm64: `Mach-O 64-bit arm64 executable` +- Windows amd64: `PE32+ executable (console) x86-64` + +**If missing, request it before approving.** + +### Review Commands + +```bash +go build && ./hack/test-tool.sh TOOL_NAME +go test ./pkg/get/... -v +./arkade get --format markdown | grep TOOL_NAME +``` + +### Common Issues + +1. Tool requires runtime (Python/Node.js) - cannot be added +2. Missing `file` command output for all combinations +3. URLs don't match actual GitHub releases +4. Missing architecture support +5. Wrong architecture mapping (`arm64` vs `aarch64`, `amd64` vs `x86_64`) +6. Using unsupported archive format (`.tar.xz`) +7. Template downloads wrong binary when combination is missing (e.g., downloads Linux when Windows requested) - must return 404 instead + +--- + +## Reference Examples + +- **Simple BinaryTemplate**: `faas-cli` (lines 27-50 in `pkg/get/tools.go`) +- **Test example**: `Test_DownloadFaasCli` (around line 2761 in `pkg/get/get_test.go`) +- **Recent additions**: `dufs` (commit a120f8c), `logcli` (commit 4f72efe), `ripgrep` (commit a80f284) + +## Additional Resources + +- [CONTRIBUTING.md](CONTRIBUTING.md) - General contribution guidelines +- [.github/PULL_REQUEST_TEMPLATE.md](.github/PULL_REQUEST_TEMPLATE.md) - PR template diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.58/README.md new/arkade-0.11.59/README.md --- old/arkade-0.11.58/README.md 2025-11-14 22:53:52.000000000 +0100 +++ new/arkade-0.11.59/README.md 2025-11-17 20:02:25.000000000 +0100 @@ -790,12 +790,13 @@ | [crossplane](https://github.com/crossplane/crossplane) | Simplify some development and administration aspects of Crossplane. | | [dagger](https://github.com/dagger/dagger) | A portable devkit for CI/CD pipelines. | | [devpod](https://github.com/loft-sh/devpod) | Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker. | -| [discord-updater](https://github.com/alexellis/discord-updater) | Discord updater tool. | | [devspace](https://github.com/devspace-sh/devspace) | Automate your deployment workflow with DevSpace and develop software directly inside Kubernetes. | +| [discord-updater](https://github.com/alexellis/discord-updater) | Discord updater tool. | | [dive](https://github.com/wagoodman/dive) | A tool for exploring each layer in a docker image | | [docker-compose](https://github.com/docker/compose) | Define and run multi-container applications with Docker. | | [doctl](https://github.com/digitalocean/doctl) | Official command line interface for the DigitalOcean API. | | [dotenv-linter](https://github.com/dotenv-linter/dotenv-linter) | A lightning-fast linter for .env files. | +| [dufs](https://github.com/sigoden/dufs) | A file server that supports static serving, uploading | | [duplik8s](https://github.com/Telemaco019/duplik8s) | kubectl plugin to duplicate resources in a Kubernetes cluster. | | [eks-node-viewer](https://github.com/awslabs/eks-node-viewer) | eks-node-viewer is a tool for visualizing dynamic node usage within an EKS cluster. | | [eksctl](https://github.com/eksctl-io/eksctl) | Amazon EKS Kubernetes cluster management | @@ -843,6 +844,7 @@ | [kgctl](https://github.com/squat/kilo) | A CLI to manage Kilo, a multi-cloud network overlay built on WireGuard and designed for Kubernetes. | | [kim](https://github.com/rancher/kim) | Build container images inside of Kubernetes. (Experimental) | | [kind](https://github.com/kubernetes-sigs/kind) | Run local Kubernetes clusters using Docker container nodes. | +| [kluctl](https://github.com/kluctl/kluctl) | Kluctl is a tool to deploy applications declaratively to Kubernetes via a gitops approach. | | [kops](https://github.com/kubernetes/kops) | Production Grade K8s Installation, Upgrades, and Management. | | [krew](https://github.com/kubernetes-sigs/krew) | Package manager for kubectl plugins. | | [ktop](https://github.com/vladimirvivien/ktop) | A top-like tool for your Kubernetes cluster. | @@ -883,6 +885,7 @@ | [nerdctl](https://github.com/containerd/nerdctl) | Docker-compatible CLI for containerd, with support for Compose | | [node_exporter](https://github.com/prometheus/node_exporter) | Prometheus exporter for monitoring server metrics | | [nova](https://github.com/FairwindsOps/nova) | Find outdated or deprecated Helm charts running in your cluster. | +| [nu](https://github.com/nushell/nushell) | A new type of shell that can handle structured data like YAML really well | | [oc](https://github.com/openshift/oc) | Client to use an OpenShift 4.x cluster. | | [oh-my-posh](https://github.com/jandedobbeleer/oh-my-posh) | A prompt theme engine for any shell that can display kubernetes information. | | [op](https://github.com/1password/) | 1Password CLI enables you to automate administrative tasks and securely provision secrets across development environments. | @@ -936,6 +939,6 @@ | [waypoint](https://github.com/hashicorp/waypoint) | Easy application deployment for Kubernetes and Amazon ECS | | [yq](https://github.com/mikefarah/yq) | Portable command-line YAML processor. | | [yt-dlp](https://github.com/yt-dlp/yt-dlp) | Fork of youtube-dl with additional features and fixes | -There are 175 tools, use `arkade get NAME` to download one. +There are 178 tools, use `arkade get NAME` to download one. > Note to contributors, run `go build && ./arkade get --format markdown` to > generate this list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.58/pkg/get/get_test.go new/arkade-0.11.59/pkg/get/get_test.go --- old/arkade-0.11.58/pkg/get/get_test.go 2025-11-14 22:53:52.000000000 +0100 +++ new/arkade-0.11.59/pkg/get/get_test.go 2025-11-17 20:02:25.000000000 +0100 @@ -8745,6 +8745,57 @@ } } +func Test_DownloadKluctl(t *testing.T) { + tools := MakeTools() + name := "kluctl" + version := "v2.27.0" + + tool := getTool(name, tools) + + tests := []test{ + { + os: "linux", + arch: arch64bit, + version: version, + url: `https://github.com/kluctl/kluctl/releases/download/v2.27.0/kluctl_v2.27.0_linux_amd64.tar.gz`, + }, + { + os: "linux", + arch: archARM64, + version: version, + url: `https://github.com/kluctl/kluctl/releases/download/v2.27.0/kluctl_v2.27.0_linux_arm64.tar.gz`, + }, + { + os: "darwin", + arch: arch64bit, + version: version, + url: `https://github.com/kluctl/kluctl/releases/download/v2.27.0/kluctl_v2.27.0_darwin_amd64.tar.gz`, + }, + { + os: "darwin", + arch: archDarwinARM64, + version: version, + url: `https://github.com/kluctl/kluctl/releases/download/v2.27.0/kluctl_v2.27.0_darwin_arm64.tar.gz`, + }, + { + os: "ming", + arch: arch64bit, + version: version, + url: `https://github.com/kluctl/kluctl/releases/download/v2.27.0/kluctl_v2.27.0_windows_amd64.zip`, + }, + } + + for _, tc := range tests { + got, _, err := tool.GetURL(tc.os, tc.arch, tc.version, false) + if err != nil { + t.Fatal(err) + } + if got != tc.url { + t.Errorf("want: %s, got: %s", tc.url, got) + } + } +} + func Test_Download_pulumi(t *testing.T) { tools := MakeTools() name := "pulumi" @@ -8800,6 +8851,58 @@ } } } + +func Test_DownloadNushell(t *testing.T) { + tools := MakeTools() + name := "nu" + + tool := getTool(name, tools) + + const toolVersion = "0.108.0" + + tests := []test{ + { + os: "linux", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/nushell/nushell/releases/download/0.108.0/nu-0.108.0-x86_64-unknown-linux-musl.tar.gz", + }, + { + os: "linux", + arch: archARM64, + version: toolVersion, + url: "https://github.com/nushell/nushell/releases/download/0.108.0/nu-0.108.0-aarch64-unknown-linux-gnu.tar.gz", + }, + { + os: "darwin", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/nushell/nushell/releases/download/0.108.0/nu-0.108.0-x86_64-apple-darwin.tar.gz", + }, + { + os: "darwin", + arch: archDarwinARM64, + version: toolVersion, + url: "https://github.com/nushell/nushell/releases/download/0.108.0/nu-0.108.0-aarch64-apple-darwin.tar.gz", + }, + { + os: "ming", + arch: arch64bit, + version: toolVersion, + url: "https://github.com/nushell/nushell/releases/download/0.108.0/nu-0.108.0-x86_64-pc-windows-msvc.zip", + }, + } + verify := false + for _, tc := range tests { + got, _, err := tool.GetURL(tc.os, tc.arch, tc.version, verify) + if err != nil { + t.Fatal(err) + } + if got != tc.url { + t.Errorf("want: %s, got: %s", tc.url, got) + } + } +} func Test_DownloadOpencode(t *testing.T) { tools := MakeTools() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/arkade-0.11.58/pkg/get/tools.go new/arkade-0.11.59/pkg/get/tools.go --- old/arkade-0.11.58/pkg/get/tools.go 2025-11-14 22:53:52.000000000 +0100 +++ new/arkade-0.11.59/pkg/get/tools.go 2025-11-17 20:02:25.000000000 +0100 @@ -876,6 +876,25 @@ tools = append(tools, Tool{ + Owner: "kluctl", + Repo: "kluctl", + Name: "kluctl", + Description: "Kluctl is a tool to deploy applications declaratively to Kubernetes via a gitops approach.", + BinaryTemplate: `{{$os := .OS}} +{{ if HasPrefix .OS "ming" -}} +{{$os = "windows"}} +{{- end -}} +{{$arch := .Arch}} +{{- if eq .Arch "x86_64" -}} +{{$arch = "amd64"}} +{{- else if eq .Arch "aarch64" -}} +{{$arch = "arm64"}} +{{- end -}} +kluctl_{{.Version}}_{{$os}}_{{$arch}}.{{if HasPrefix .OS "ming"}}zip{{else}}tar.gz{{end}}`, + }) + + tools = append(tools, + Tool{ Owner: "derailed", Repo: "popeye", Name: "popeye", @@ -4826,6 +4845,39 @@ }) tools = append(tools, + Tool{ + Owner: "nushell", + Repo: "nushell", + Name: "nu", + Description: "A new type of shell that can handle structured data like YAML really well", + BinaryTemplate: `nu`, + URLTemplate: ` +{{$target := ""}} +{{$ext := "tar.gz"}} +{{- if eq .OS "linux" -}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-unknown-linux-musl"}} + {{ else if eq .Arch "aarch64" -}} + {{$target = "aarch64-unknown-linux-gnu"}} + {{ else if eq .Arch "armv7l" -}} + {{$target = "armv7-unknown-linux-musleabihf"}} + {{- end -}} +{{- else if eq .OS "darwin" -}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-apple-darwin"}} + {{ else if eq .Arch "arm64" -}} + {{$target = "aarch64-apple-darwin"}} + {{- end -}} +{{- else if HasPrefix .OS "ming" -}} + {{$ext = "zip"}} + {{- if eq .Arch "x86_64" -}} + {{$target = "x86_64-pc-windows-msvc"}} + {{- end -}} +{{- end -}} +https://github.com/{{.Owner}}/{{.Repo}}/releases/download/{{.Version}}/nu-{{.Version}}-{{$target}}.{{$ext}}`, + }) + + tools = append(tools, Tool{ Owner: "grafana", Repo: "loki", ++++++ arkade.obsinfo ++++++ --- /var/tmp/diff_new_pack.wy4DwS/_old 2025-11-18 15:43:18.076203273 +0100 +++ /var/tmp/diff_new_pack.wy4DwS/_new 2025-11-18 15:43:18.132205632 +0100 @@ -1,5 +1,5 @@ name: arkade -version: 0.11.58 -mtime: 1763157232 -commit: a120f8caa7aaf0a084a2dc4f5c4d88a5710850aa +version: 0.11.59 +mtime: 1763406145 +commit: 5e1ea83ad4b9e1e5e7dec229d4d74cd6032bf300 ++++++ vendor.tar.gz ++++++
