Skip to content

Give install-tools.sh a Machine-Readable Report Mode, So a Caller Can Act on It Without Screen-Scraping #1645

Description

@ptr727

What Is Missing

host-setup/linux/install-tools.sh --report emits a column-aligned human table
(TOOL INSTALLED AVAILABLE SOURCE STATUS) followed by a free-text Notes: section. There is no
--json, no --porcelain, and no other stable output contract, so the only way for a program to
learn that a tool is trailing is to parse that table.

Why It Matters

The script is reachable from any host with no checkout at all: a downstream repository's thin wrapper
resolves HUB_REF to a commit, fetches this script to a temp file, and runs it. That makes it the
natural authority for "what does the fleet manage, and is this host current?", which is exactly the
question a scheduled reporter on a downstream host wants to ask before it says anything at login or
in a summary mail.

Screen-scraping the table breaks on changes that are otherwise free: widening a column when a version
string grows, adding a tool whose name exceeds the current field width, rewording a note, introducing
a status word. None of those are breaking changes to a human reader, and every one of them is a
breaking change to a parser. A downstream consumer built on the table would therefore convert routine
edits here into silent breakage there, which is the opposite of what a reporter is for.

Suggested Shape

A --json action alongside --report, carrying the same data, with the human table suppressed:

{
  "tools": [
    {
      "tool": "<name>",
      "installed": "<version, or null>",
      "available": "<version, or null>",
      "source": "<distro, an apt repository host, a GitHub owner/repo, ...>",
      "mechanism": "apt | binary",
      "status": "current | outdated | missing | unmanaged | unknown",
      "notes": ["<one string per note line this tool produced>"]
    }
  ]
}

mechanism is worth emitting even though --report does not print it today, because it is the field
that decides whether an OS package upgrade moves a tool at all. The jq | uv | git-restore-mtime arm
installs binaries into $BIN_DIR, and nothing but this script ever moves those, while the
apt-sourced tools ride along with any ordinary apt-get upgrade. A caller reporting drift has to
tell those two apart to say anything useful about what the operator should do next, and today it can
only infer it from the SOURCE string.

Worth settling at the same time whether install-tools.ps1 emits the same schema, since a fleet
reporter that works on one platform only is half a feature.

Not In Scope

What --report prints for a human, and what --install and --upgrade do.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestscriptA defect in hub tooling

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions