From c3cc66bab82fae6b130f3d55b8a26d5d8e3e7a03 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 20:22:42 -0600 Subject: [PATCH 01/14] fix: resolve install failures for tuckr, spectral, and bats helpers --- plugins/bats-assert.toml | 8 ++++++++ plugins/bats-file.toml | 8 ++++++++ plugins/bats-support.toml | 8 ++++++++ plugins/spectral.toml | 1 + plugins/tuckr.toml | 7 +++++++ 5 files changed, 32 insertions(+) diff --git a/plugins/bats-assert.toml b/plugins/bats-assert.toml index ebdfe43..7c2a02b 100644 --- a/plugins/bats-assert.toml +++ b/plugins/bats-assert.toml @@ -1,6 +1,14 @@ +# A TOML plugin for bats-assert: +# https://moonrepo.dev/docs/proto/plugins#toml-plugin +# https://github.com/bats-core/bats-assert +# +# bats-assert is a shell library sourced by bats tests — it has no executable binary. +# proto manages its version and install location; bats loads it via BATS_LIB_PATH. + name = "Bats Assert" type = "cli" description = "bats-assert provides assertion helpers (assert_success, assert_output, refute_output, etc.) for Bats" +no-bin = true [platform.linux] archive-prefix = "bats-assert-{version}" diff --git a/plugins/bats-file.toml b/plugins/bats-file.toml index 62f1ead..fd73e25 100644 --- a/plugins/bats-file.toml +++ b/plugins/bats-file.toml @@ -1,6 +1,14 @@ +# A TOML plugin for bats-file: +# https://moonrepo.dev/docs/proto/plugins#toml-plugin +# https://github.com/bats-core/bats-file +# +# bats-file is a shell library sourced by bats tests — it has no executable binary. +# proto manages its version and install location; bats loads it via BATS_LIB_PATH. + name = "Bats File" type = "cli" description = "bats-file provides filesystem assertion helpers (assert_file_exists, assert_symlink_to, assert_dir_exists, etc.) for Bats" +no-bin = true [platform.linux] archive-prefix = "bats-file-{version}" diff --git a/plugins/bats-support.toml b/plugins/bats-support.toml index 90f3483..12c6f7f 100644 --- a/plugins/bats-support.toml +++ b/plugins/bats-support.toml @@ -1,6 +1,14 @@ +# A TOML plugin for bats-support: +# https://moonrepo.dev/docs/proto/plugins#toml-plugin +# https://github.com/bats-core/bats-support +# +# bats-support is a shell library sourced by bats-assert and bats-file — it has no executable binary. +# proto manages its version and install location; bats loads it via BATS_LIB_PATH. + name = "Bats Support" type = "cli" description = "bats-support provides the output/error formatting library that bats-assert and bats-file build on" +no-bin = true [platform.linux] archive-prefix = "bats-support-{version}" diff --git a/plugins/spectral.toml b/plugins/spectral.toml index c3121d2..6610f0c 100644 --- a/plugins/spectral.toml +++ b/plugins/spectral.toml @@ -20,6 +20,7 @@ exe-path = "spectral.exe" [install] download-url = "https://github.com/stoplightio/spectral/releases/download/v{version}/{download_file}" +no-unpack = true [install.arch] aarch64 = "arm64" diff --git a/plugins/tuckr.toml b/plugins/tuckr.toml index 0f04efb..de1dff4 100644 --- a/plugins/tuckr.toml +++ b/plugins/tuckr.toml @@ -8,14 +8,21 @@ description = "Dotfile manager inspired by GNU Stow" [platform.linux] download-file = "tuckr-{arch}-linux" +exe-path = "tuckr-{arch}-linux" + +[platform.macos] +download-file = "tuckr-{arch}-macos" +exe-path = "tuckr-{arch}-macos" [platform.windows] download-file = "tuckr-{arch}-windows.exe" +exe-path = "tuckr-{arch}-windows.exe" [install] download-url = "https://github.com/RaphGL/Tuckr/releases/download/{version}/{download_file}" [install.arch] +aarch64 = "aarch64" x86_64 = "x86_64" [resolve] From 1d973ea1e4b0a4a092873655f4cc8c4fb3d6099f Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:05:07 -0600 Subject: [PATCH 02/14] fix(tuckr): add [install.exes] primary entry per current non-wasm spec --- plugins/tuckr.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/tuckr.toml b/plugins/tuckr.toml index de1dff4..851fb7d 100644 --- a/plugins/tuckr.toml +++ b/plugins/tuckr.toml @@ -25,5 +25,8 @@ download-url = "https://github.com/RaphGL/Tuckr/releases/download/{version}/{dow aarch64 = "aarch64" x86_64 = "x86_64" +[install.exes.tuckr] +primary = true + [resolve] git-url = "https://github.com/RaphGL/Tuckr" From 35c3bc6357375e99d9de6ffd6cb03fc97c478336 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:15:05 -0600 Subject: [PATCH 03/14] remove(tuckr): no prebuilt binaries, cannot use non-wasm plugin --- plugins/tuckr.toml | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 plugins/tuckr.toml diff --git a/plugins/tuckr.toml b/plugins/tuckr.toml deleted file mode 100644 index 851fb7d..0000000 --- a/plugins/tuckr.toml +++ /dev/null @@ -1,32 +0,0 @@ -# A TOML plugin for tuckr: -# https://moonrepo.dev/docs/proto/plugins#toml-plugin -# https://github.com/RaphGL/Tuckr - -name = "tuckr" -type = "cli" -description = "Dotfile manager inspired by GNU Stow" - -[platform.linux] -download-file = "tuckr-{arch}-linux" -exe-path = "tuckr-{arch}-linux" - -[platform.macos] -download-file = "tuckr-{arch}-macos" -exe-path = "tuckr-{arch}-macos" - -[platform.windows] -download-file = "tuckr-{arch}-windows.exe" -exe-path = "tuckr-{arch}-windows.exe" - -[install] -download-url = "https://github.com/RaphGL/Tuckr/releases/download/{version}/{download_file}" - -[install.arch] -aarch64 = "aarch64" -x86_64 = "x86_64" - -[install.exes.tuckr] -primary = true - -[resolve] -git-url = "https://github.com/RaphGL/Tuckr" From 3bd088196318b90065416ba9c85ff2e2b5999c77 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:17:20 -0600 Subject: [PATCH 04/14] fix(smoke-test): replace proto locate with proto bin --- scripts/smoke-test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 0195e3b..89d4e1b 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -29,8 +29,8 @@ while IFS= read -r id; do echo "--- $id ---" - bin=$(proto locate "$id") || - fail "proto locate exited non-zero" + bin=$(proto bin "$id") || + fail "proto bin exited non-zero" [[ $bin == *"/.proto/tools/$id/"* ]] || fail "resolved outside .proto/tools: $bin" From 8be49d5901e419b0f6ba4445501286010ce89133 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:20:55 -0600 Subject: [PATCH 05/14] fix(smoke-test): split space-separated targets into individual ids --- scripts/smoke-test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 89d4e1b..48a95eb 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -24,7 +24,7 @@ else done) fi -while IFS= read -r id; do +for id in $targets; do [ -z "$id" ] && continue echo "--- $id ---" @@ -40,4 +40,4 @@ while IFS= read -r id; do echo " OK: $bin" -done <<< "$targets" +done From b54f197456fb6738751a5fcf73916f65a881b52b Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:24:37 -0600 Subject: [PATCH 06/14] fix(smoke-test): skip no-bin tools, proto bin is invalid for libs --- scripts/smoke-test.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 48a95eb..606d46c 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -27,6 +27,18 @@ fi for id in $targets; do [ -z "$id" ] && continue + # find the plugin file + plugin_file="" + for ext in toml yaml yml; do + [ -f "plugins/$id.$ext" ] && plugin_file="plugins/$id.$ext" && break + done + + # skip library tools that have no binary + if [ -n "$plugin_file" ] && grep -q 'no-bin\s*=\s*true' "$plugin_file"; then + echo "--- $id (skipped: no-bin) ---" + continue + fi + echo "--- $id ---" bin=$(proto bin "$id") || From 9d7e5dfd74f3fc41ebc3ffb12ea4af37879c5370 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 21:28:06 -0600 Subject: [PATCH 07/14] fix(smoke-test): use grep -qF for literal no-bin match --- scripts/smoke-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 606d46c..6127d63 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -34,7 +34,7 @@ for id in $targets; do done # skip library tools that have no binary - if [ -n "$plugin_file" ] && grep -q 'no-bin\s*=\s*true' "$plugin_file"; then + if [ -n "$plugin_file" ] && grep -qF 'no-bin = true' "$plugin_file"; then echo "--- $id (skipped: no-bin) ---" continue fi From 11a237fec8a3b6040f4f37ad5f04daa8c9349e27 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:24:11 -0600 Subject: [PATCH 08/14] fix(smoke-test): resolve plugin files relative to script dir, not cwd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The smoke-test step runs from /tmp/proto-smoke (no plugins/ dir), so the relative plugins/$id.toml lookup always failed — plugin_file stayed empty, the no-bin branch never fired, and proto bin bats-assert blew up. Fix: derive REPO_ROOT from the script's own path via $0 so the plugin file lookup works regardless of cwd, both in CI and locally. Also switch from positional-args-only to accept $TARGETS env var as fallback so the CI env: block works without dirty coupling — args win when provided, env var is the fallback, all-plugins is the last resort." --- scripts/smoke-test.sh | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 6127d63..38aa898 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -1,23 +1,28 @@ #!/usr/bin/env bash # Usage: -# ./scripts/smoke-test.sh # test all plugins -# ./scripts/smoke-test.sh taplo # test one plugin -# ./scripts/smoke-test.sh taplo gh # test multiple plugins -# ./scripts/smoke-test.sh $CHANGED # from an env var -# bash scripts/smoke-test.sh ${{ steps.targets.outputs.ids }} # from CI step output +# ./scripts/smoke-test.sh # test all plugins +# ./scripts/smoke-test.sh taplo # test one plugin +# ./scripts/smoke-test.sh taplo gh # test multiple plugins +# TARGETS="taplo gh" ./scripts/smoke-test.sh # via env var (CI-friendly) # -# Expects to run from the repo root with proto on PATH. +# Expects proto on PATH. Can be run from any working directory. set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + fail() { echo " FAIL: $*" exit 1 } +# Arg priority: positional args > TARGETS env var > all plugins if [ $# -gt 0 ]; then targets="$*" +elif [ -n "${TARGETS:-}" ]; then + targets="$TARGETS" else - targets=$(for p in plugins/*; do + targets=$(for p in "$REPO_ROOT/plugins/"*; do [ -f "$p" ] || continue name="${p##*/}" printf '%s\n' "${name%.*}" @@ -27,13 +32,14 @@ fi for id in $targets; do [ -z "$id" ] && continue - # find the plugin file + # Locate plugin file relative to repo root, not cwd plugin_file="" for ext in toml yaml yml; do - [ -f "plugins/$id.$ext" ] && plugin_file="plugins/$id.$ext" && break + candidate="$REPO_ROOT/plugins/$id.$ext" + [ -f "$candidate" ] && plugin_file="$candidate" && break done - # skip library tools that have no binary + # Skip library tools that have no binary if [ -n "$plugin_file" ] && grep -qF 'no-bin = true' "$plugin_file"; then echo "--- $id (skipped: no-bin) ---" continue From 88dabf8f001da31affa3c81a090d934fe587e097 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:24:42 -0600 Subject: [PATCH 09/14] fix(ci): smoke-test reads TARGETS env var; drop shell word-split arg passing --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9982969..fa74a83 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,7 +68,7 @@ jobs: working-directory: /tmp/proto-smoke env: TARGETS: ${{ steps.targets.outputs.ids }} - run: bash ${{ github.workspace }}/scripts/smoke-test.sh $TARGETS + run: bash ${{ github.workspace }}/scripts/smoke-test.sh - name: Assemble site if: github.event_name == 'push' From cd1555f35f1b6fee09509907084d3924bef050c9 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:43:27 -0600 Subject: [PATCH 10/14] fix(spectral): drop exe-path overrides and no-unpack, use unpack = false Proto auto-renames the downloaded binary to the tool name. The explicit exe-path = "spectral-linux-{arch}" overrode that rename and pointed to a filename that no longer exists, causing proto bin to fail with missing_executable. no-unpack is also the wrong key; unpack = false is the correct schema field (matching sops, dasel pattern). --- plugins/spectral.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/spectral.toml b/plugins/spectral.toml index 6610f0c..d0a6214 100644 --- a/plugins/spectral.toml +++ b/plugins/spectral.toml @@ -8,19 +8,16 @@ description = "OpenAPI, AsyncAPI, and Arazzo linter and validation CLI by Stopli [platform.linux] download-file = "spectral-linux-{arch}" -exe-path = "spectral-linux-{arch}" [platform.macos] download-file = "spectral-macos-{arch}" -exe-path = "spectral-macos-{arch}" [platform.windows] download-file = "spectral.exe" -exe-path = "spectral.exe" [install] download-url = "https://github.com/stoplightio/spectral/releases/download/v{version}/{download_file}" -no-unpack = true +unpack = false [install.arch] aarch64 = "arm64" From 7a8ab2fe26cffe670aacf1352a408957815bb695 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:48:32 -0600 Subject: [PATCH 11/14] doc: fix bare-binary pattern and exe-path checklist item The spectral bug was caused by following the old 'bare binary' example which said to set exe-path. Proto auto-renames a bare binary to the tool name after download, so exe-path must be omitted. unpack = false is also the correct field (not no-unpack = true which is silently ignored). --- doc/new-plugin-instructions.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/new-plugin-instructions.md b/doc/new-plugin-instructions.md index 4d8c468..e45dbb2 100644 --- a/doc/new-plugin-instructions.md +++ b/doc/new-plugin-instructions.md @@ -38,7 +38,7 @@ Given a URL (repo, homepage, or release page), determine: - `{tool}_{version}_linux_{arch}.tar.gz` with `darwin` for macOS — platform-literal - `{tool}-{arch}-unknown-linux-gnu.tar.gz` — Rust target triple - `v{version}.tar.gz` from `archive/refs/tags/` — source archive (no binary, library/script tools) - - Bare binary with no version in filename (e.g. `spectral-linux-x64`) — use `download-file` and `exe-path` with only `{arch}` + - Bare binary with no version in filename (e.g. `spectral-linux-x64`) — use `download-file` with `{arch}`, set `unpack = false`, omit `exe-path` 4. **Arch strings used** — check what arch labels appear in asset names (`amd64`, `arm64`, `x86_64`, `aarch64`, `x64`, `386`, `armv6`, etc.). 5. **Binary location inside archive** — does the binary sit at the archive root, or inside a subdirectory? If inside a subdirectory, note the path. If not an archive at all (bare binary), note that. 6. **Checksum file** — does the release include a checksums file? Note its name pattern. Many tools do not. @@ -88,7 +88,7 @@ Add one block **per OS that actually has release assets**. Never add a platform [platform.linux] download-file = "" checksum-file = "" # omit if no checksums published -exe-path = "" # omit if binary is at archive root with the tool name +exe-path = "" # omit if binary is at archive root with the tool name, or if bare binary (see below) [platform.macos] download-file = "" @@ -153,7 +153,8 @@ Before committing, verify: - [ ] Platform blocks exist **only** for OSes with actual release assets - [ ] `[install.arch]` values match the exact strings in release asset filenames -- [ ] `exe-path` is set if the binary is not at the archive root or is not named exactly `` (or `.exe` on Windows) +- [ ] `exe-path` is set only for **archive** plugins where the binary is not at the root or not named ``. **Never set `exe-path` for bare binaries** — proto renames the downloaded file to the tool name automatically; an `exe-path` override points to the pre-rename filename which no longer exists. +- [ ] Bare binary downloads use `unpack = false` in `[install]`, not `no-unpack = true` (which is silently ignored) - [ ] `checksum-url` is present only if a checksums file is actually published - [ ] `git-tag-pattern` is set if tags are not standard `v1.2.3` / `1.2.3` - [ ] Comment header present @@ -196,8 +197,17 @@ The CI workflow does the following on every PR: ### Bare binary (no archive, no version in filename) -`spectral` style — assets named `tool-linux-x64` with no version embedded. Use `download-file` and `exe-path` with only `{arch}`. Proto marks the downloaded file executable automatically. +`spectral` style — assets named `tool-linux-x64` with no version embedded. Use `download-file` with `{arch}` and set `unpack = false` in `[install]`. **Do not set `exe-path`** — proto renames the downloaded file to the tool name automatically. Adding `exe-path` causes it to look for the original filename, which no longer exists. + +```toml +[platform.linux] +download-file = "tool-linux-{arch}" + +[install] +download-url = "https://github.com///releases/download/v{version}/{download_file}" +unpack = false +``` ### No binary (library/script archive) -`bats-assert` style — source archive from `archive/refs/tags/v{version}.tar.gz`. No `exe-path`. Use `archive-prefix` to normalize the extracted directory name. +`bats-assert` style — source archive from `archive/refs/tags/v{version}.tar.gz`. No `exe-path`. Use `archive-prefix` to normalize the extracted directory name. Set `no-bin = true` at the top level since there is no executable. From 6e363059dce6381d71c9d4bfba228c0a4f2ee837 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:52:24 -0600 Subject: [PATCH 12/14] fix(bats-*): move no-bin into [install] where schema reads it Root-level no-bin is not a valid Schema field and is silently ignored, so proto's linker still attempted symlinks and warned about missing executables. InstallSchema.no_bin is the correct location. --- plugins/bats-assert.toml | 3 ++- plugins/bats-file.toml | 5 +++-- plugins/bats-support.toml | 7 ++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/plugins/bats-assert.toml b/plugins/bats-assert.toml index 7c2a02b..8fcb6ed 100644 --- a/plugins/bats-assert.toml +++ b/plugins/bats-assert.toml @@ -8,7 +8,6 @@ name = "Bats Assert" type = "cli" description = "bats-assert provides assertion helpers (assert_success, assert_output, refute_output, etc.) for Bats" -no-bin = true [platform.linux] archive-prefix = "bats-assert-{version}" @@ -24,6 +23,8 @@ download-file = "v{version}.tar.gz" [install] download-url = "https://github.com/bats-core/bats-assert/archive/refs/tags/{download_file}" +no-bin = true +no-shim = true [resolve] git-url = "https://github.com/bats-core/bats-assert" diff --git a/plugins/bats-file.toml b/plugins/bats-file.toml index fd73e25..af476ba 100644 --- a/plugins/bats-file.toml +++ b/plugins/bats-file.toml @@ -7,8 +7,7 @@ name = "Bats File" type = "cli" -description = "bats-file provides filesystem assertion helpers (assert_file_exists, assert_symlink_to, assert_dir_exists, etc.) for Bats" -no-bin = true +description = "bats-file provides file-system assertion helpers for Bats" [platform.linux] archive-prefix = "bats-file-{version}" @@ -24,6 +23,8 @@ download-file = "v{version}.tar.gz" [install] download-url = "https://github.com/bats-core/bats-file/archive/refs/tags/{download_file}" +no-bin = true +no-shim = true [resolve] git-url = "https://github.com/bats-core/bats-file" diff --git a/plugins/bats-support.toml b/plugins/bats-support.toml index 12c6f7f..3082cbc 100644 --- a/plugins/bats-support.toml +++ b/plugins/bats-support.toml @@ -2,13 +2,12 @@ # https://moonrepo.dev/docs/proto/plugins#toml-plugin # https://github.com/bats-core/bats-support # -# bats-support is a shell library sourced by bats-assert and bats-file — it has no executable binary. +# bats-support is a shell library sourced by bats tests — it has no executable binary. # proto manages its version and install location; bats loads it via BATS_LIB_PATH. name = "Bats Support" type = "cli" -description = "bats-support provides the output/error formatting library that bats-assert and bats-file build on" -no-bin = true +description = "bats-support provides output formatting and helper functions for Bats test plugins" [platform.linux] archive-prefix = "bats-support-{version}" @@ -24,6 +23,8 @@ download-file = "v{version}.tar.gz" [install] download-url = "https://github.com/bats-core/bats-support/archive/refs/tags/{download_file}" +no-bin = true +no-shim = true [resolve] git-url = "https://github.com/bats-core/bats-support" From 4643a968f70cd7a30a0c98d838426fac956f7548 Mon Sep 17 00:00:00 2001 From: Tom Davidson Date: Sun, 10 May 2026 22:53:32 -0600 Subject: [PATCH 13/14] doc: add no-bin/no-shim placement rule for library plugins --- doc/new-plugin-instructions.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/doc/new-plugin-instructions.md b/doc/new-plugin-instructions.md index e45dbb2..e654646 100644 --- a/doc/new-plugin-instructions.md +++ b/doc/new-plugin-instructions.md @@ -136,6 +136,17 @@ arm = "" # omit if tool does not ship arm32 Only include arch entries for architectures the tool actually ships. +For library/script tools with no executable, add to `[install]`: + +```toml +[install] +download-url = "..." +no-bin = true +no-shim = true +``` + +> **`no-bin` and `no-shim` must be under `[install]`, not at the root.** The root `Schema` struct has no such fields — placing them at the root is silently ignored, proto still attempts symlinks, and you get linker warnings on every install. + ### `[detect]` block (optional) Add only if the tool has a conventional version pin file: @@ -155,6 +166,7 @@ Before committing, verify: - [ ] `[install.arch]` values match the exact strings in release asset filenames - [ ] `exe-path` is set only for **archive** plugins where the binary is not at the root or not named ``. **Never set `exe-path` for bare binaries** — proto renames the downloaded file to the tool name automatically; an `exe-path` override points to the pre-rename filename which no longer exists. - [ ] Bare binary downloads use `unpack = false` in `[install]`, not `no-unpack = true` (which is silently ignored) +- [ ] Library/script plugins with no executable have `no-bin = true` and `no-shim = true` under `[install]`, not at the root (root placement is silently ignored) - [ ] `checksum-url` is present only if a checksums file is actually published - [ ] `git-tag-pattern` is set if tags are not standard `v1.2.3` / `1.2.3` - [ ] Comment header present @@ -210,4 +222,15 @@ unpack = false ### No binary (library/script archive) -`bats-assert` style — source archive from `archive/refs/tags/v{version}.tar.gz`. No `exe-path`. Use `archive-prefix` to normalize the extracted directory name. Set `no-bin = true` at the top level since there is no executable. +`bats-assert` style — source archive from `archive/refs/tags/v{version}.tar.gz`. Use `archive-prefix` to normalize the extracted directory name. Set `no-bin = true` and `no-shim = true` under `[install]` (not at the root — root placement is silently ignored and causes linker warnings). + +```toml +[platform.linux] +archive-prefix = "tool-{version}" +download-file = "v{version}.tar.gz" + +[install] +download-url = "https://github.com///archive/refs/tags/{download_file}" +no-bin = true +no-shim = true +``` From b9c30e0f0cc486c7de97843488ce99440371772c Mon Sep 17 00:00:00 2001 From: tomdavidson Date: Sun, 10 May 2026 22:58:25 -0600 Subject: [PATCH 14/14] avoid the malformed table in logs from proto status --- scripts/smoke-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/smoke-install.sh b/scripts/smoke-install.sh index 2750c6b..3cfa7f0 100755 --- a/scripts/smoke-install.sh +++ b/scripts/smoke-install.sh @@ -7,4 +7,4 @@ cp .prototools.test /tmp/proto-smoke/.prototools cd /tmp/proto-smoke cat .prototools proto install -y -proto status +proto status --json