Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8852572
docs: call out supported ROCm versions (7.14, 10.0, 10.1)
pmoutsias-amd Oct 8, 2026
b29cf4e
docs: copyedit README, CONTRIBUTING, and vLLM guide
pmoutsias-amd Oct 9, 2026
7d2986b
docs: tighten README flag lists and add lead-ins
pmoutsias-amd Oct 9, 2026
638807b
docs: rejoin prune lock sentence and complete acceptance-script list
pmoutsias-amd Oct 9, 2026
3d8b1f9
docs: add install verification and rocm uninstall guidance
pmoutsias-amd Oct 9, 2026
6920612
docs: clarify verify and uninstall guidance
pmoutsias-amd Oct 9, 2026
e764eba
docs: link install pages to uninstall guidance
pmoutsias-amd Oct 9, 2026
a87de84
docs: give the install page uninstall pointer its own heading
pmoutsias-amd Oct 9, 2026
74d08fb
docs: fix command synopses and document model, chat provider, and aut…
pmoutsias-amd Oct 9, 2026
2153b6e
docs: clarify that rocm chat --provider applies only to one-prompt use
pmoutsias-amd Oct 9, 2026
f5fee37
docs: correct contained-mode, chat flag, and model verbose descriptions
pmoutsias-amd Oct 9, 2026
c92e88a
docs: clarify uninstall cache and data scope, add APU case to diagnose
pmoutsias-amd Oct 9, 2026
033fa1e
docs: address review findings on uninstall, ROCm versions, and synopses
pmoutsias-amd Oct 9, 2026
558fd45
docs: avoid calling 7.14 the latest stable ROCm release
pmoutsias-amd Oct 9, 2026
30b5022
Merge origin/main into docs/editorial-copyedit-readme-contributing-vllm
pmoutsias-amd Oct 9, 2026
3f564b9
docs: address review comments on getting started, uninstall, and vLLM
pmoutsias-amd Oct 9, 2026
985f773
Merge main into docs/editorial-copyedit-readme-contributing-vllm
pmoutsias-amd Oct 12, 2026
d807a97
docs: correct stale install, serve, and cleanup guidance
pmoutsias-amd Oct 12, 2026
9915a90
docs: align vLLM, uninstall, and help wording with the code
pmoutsias-amd Oct 13, 2026
b80ab1c
Merge main into docs/editorial-copyedit-readme-contributing-vllm
pmoutsias-amd Oct 13, 2026
3dbac26
Merge main into docs/editorial-copyedit-readme-contributing-vllm
pmoutsias-amd Oct 13, 2026
b308ca3
docs: tie the serve step to the install it follows
pmoutsias-amd Oct 19, 2026
0e08f3f
Merge main into docs/editorial-copyedit-readme-contributing-vllm
pmoutsias-amd Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 19 additions & 16 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SPDX-License-Identifier: MIT

# Contributing to ROCm CLI

Thank you for your interest in contributing. This document explains how to get started, how work is tracked, and what to expect from the review process.
Thank you for your interest in contributing. This page covers how to get started, how work is tracked, and what to expect from the review process.

## Code of Conduct

Expand Down Expand Up @@ -36,33 +36,35 @@ fix/vram-probe-fallback

## Development setup

Prerequisites: Rust (see `rust-toolchain.toml` for the pinned version) and [uv](https://github.com/astral-sh/uv) (for prek and scripts).
Prerequisites: Rust (see `rust-toolchain.toml` for the pinned version) and [uv](https://github.com/astral-sh/uv) (for `prek` and the scripts).

```bash
git clone https://github.com/ROCm/rocm-cli
cd rocm-cli
uv tool install prek # or: cargo install --locked prek
uv tool install prek # alternative: cargo install --locked prek
prek install # fast checks on every commit
prek install -t pre-push # heavier checks on push (clippy + tests)
```

`prek` runs the same checks locally that CI enforces: `cargo fmt`, `clippy`, `cargo test`, `ruff` (Python), `shellcheck` (shell), PowerShell syntax, license headers (`hawkeye`), markdown links (`lychee`), and the generated manifests (`MANIFEST.md`, `THIRD_PARTY_NOTICES.txt`).

The manifest hooks only run when you change the dependency graph, and they *rewrite* the generated file rather than just reporting it stale — when that happens the commit stops so you can re-stage the refreshed file. `THIRD_PARTY_NOTICES.txt` additionally needs the pinned generator; without it that hook skips and CI remains the gate:
The manifest hooks only run when you change the dependency graph. They *rewrite* the generated file instead of only reporting that it is stale. When that happens, the commit stops so you can re-stage the refreshed file.

The `THIRD_PARTY_NOTICES.txt` hook also needs the pinned generator. Without it, the hook skips and CI remains the gate:

```bash
cargo install cargo-about@0.9.1 --locked --features cli # optional, for THIRD_PARTY_NOTICES.txt
```

The license-headers hook (`hawkeye`) runs on every commit and push, whatever is staged — it has no file-type filter, because hawkeye always scans the whole working tree per `licenserc.toml` regardless of which files changed or are staged, including untracked files that aren't gitignored, so an unrelated unheadered file (even one not yet committed) can block an otherwise-unrelated commit. A clean CI checkout never has untracked files, so this hook can be stricter locally than CI is. prek runs it like the others, but doesn't provision the `hawkeye` binary — and, unlike the manifest hooks above, it fails hard (not just skips) when the binary is missing. It does not check that an installed binary is the pinned version; a mismatched version may run whatever that version's own license-header rules happen to be, which may disagree with CI, or may reject `licenserc.toml` outright — for example, hawkeye 6.x rejects this repo's config with `unknown field 'files'`, which blocks every commit and push, not just ones touching code:
The license-headers hook (`hawkeye`) runs on every commit and push, whatever is staged. It has no file-type filter, because `hawkeye` always scans the whole working tree per `licenserc.toml` regardless of which files changed or are staged, including untracked files that aren't gitignored, so an unrelated unheadered file (even one not yet committed) can block an otherwise-unrelated commit. A clean CI checkout never has untracked files, so this hook can be stricter locally than CI is. `prek` runs it like the others, but doesn't provision the `hawkeye` binary. Unlike the manifest hooks above, it fails hard (not just skips) when the binary is missing. It does not check that an installed binary is the pinned version; a mismatched version may run whatever that version's own license-header rules happen to be, which may disagree with CI, or may reject `licenserc.toml` outright. For example, `hawkeye` 6.x rejects this repository's config with `unknown field 'files'`, which blocks every commit and push, not just ones touching code:

```bash
cargo install hawkeye@7.0.0 --locked # pinned to match the CI license-headers job
```

To commit or push without it (for example, while iterating without the binary installed, or on a version it rejects), skip it explicitly: `SKIP=license-headers git commit ...` or `SKIP=license-headers git push`. CI's `license-headers` job still enforces the check either way.

The markdown-links hook (`lychee`) runs on every commit, over the whole repo rather than just the changed files, since moving or deleting a file can break a link in a markdown file you didn't touch. It checks your working tree, so a link to a new file you haven't `git add`ed passes locally and still fails in CI. The hook runs `cargo xtask lychee --if-available`. prek doesn't provision the binary; without it the hook prints a warning and passes, leaving the `docs-links` CI job as the gate, and a version other than the pinned one runs with a warning:
The Markdown-links hook (`lychee`) runs on every commit, over the whole repository rather than just the changed files, since moving or deleting a file can break a link in a Markdown file you didn't touch. It checks your working tree, so a link to a new file you haven't `git add`ed passes locally and still fails in CI. The hook runs `cargo xtask lychee --if-available`. `prek` doesn't provision the binary; without it the hook prints a warning and passes, leaving the `docs-links` CI job as the gate, and a version other than the pinned one runs with a warning:

```bash
cargo install lychee@0.24.2 --locked # pinned to match the CI docs-links job (lycheeVersion)
Expand All @@ -75,33 +77,33 @@ cargo install lychee@0.24.2 --locked # pinned to match the CI docs-links job (
| `apps/rocm` | Main CLI binary |
| `apps/rocmd` | Background daemon |
| `crates/rocm-core` | Core library |
| `crates/rocm-dash-*` | Dashboard TUI libraries |
| `crates/rocm-dash-*` | Dashboard terminal user interface (TUI) libraries |
| `crates/rocm-engine-protocol` | Engine IPC protocol |
| `engines/` | Inference engine adapters (lemonade, vllm) |

### Module organization

New subcommands and subsystems default to their own file from day one — don't let them grow inside `main.rs`/`lib.rs` waiting for a future extraction pass. See `docs/architecture.md` for the two extraction patterns in use, the current module map, and the module-organization convention in full — its file links, including every concrete file citation in the per-crate inventories, are checked for resolution (not prose accuracy) by the `docs-links` job below; its section headings and directory names stay bare and unchecked.
New subcommands and subsystems default to their own file from day one. Don't let them grow inside `main.rs`/`lib.rs` waiting for a future extraction pass. See `docs/architecture.md` for the two extraction patterns in use, the current module map, and the module-organization convention in full. Its file links, including every concrete file citation in the per-crate inventories, are checked for resolution (not prose accuracy) by the `docs-links` job below; its section headings and directory names stay bare and unchecked.

Crate-layering invariants (e.g. `rocmd` must never depend on `rocm`) are enforced by `cargo xtask check-crate-edges` (`xtask/src/crate_edges.rs`).
Crate-layering invariants, such as `rocmd` never depending on `rocm`, are enforced by `cargo xtask check-crate-edges` (`xtask/src/crate_edges.rs`).

Every local (relative-path) markdown link and `#anchor` fragment in the repo — outside `docs/rocm-docs/`, which `docs-build` covers instead, and hidden directories such as `.github/`, which neither check walks — is checked by the `docs-links` CI job and by the `lychee` prek hook above, both configured by `lychee.toml` (which lists the current exclusions). Both run offline only, so they don't catch broken external `https://` links.
Every local (relative-path) Markdown link and `#anchor` fragment in the repository (outside `docs/rocm-docs/`, which `docs-build` covers instead, and hidden directories such as `.github/`, which neither check walks) is checked by the `docs-links` CI job and by the `lychee` prek hook above, both configured by `lychee.toml` (which lists the current exclusions). Both run offline only, so they don't catch broken external `https://` links.

Since only links are checked, cite a specific repo file as a link relative to the citing file — `[fix.rs](../crates/rocm-core/src/fix.rs)` from `docs/` — rather than a bare backtick path, which nothing checks. The full rule, including the link forms that fail the check and the places it doesn't apply (`.github/`, `docs/rocm-docs/` and the files it includes — this one and README.md — and links leaving a `skills/` folder), is in AGENTS.md §5 ("Investigate rocm-cli Before Editing"); it applies to citations you add or edit.
Since only links are checked, cite a specific repository file as a link relative to the citing file, `[fix.rs](../crates/rocm-core/src/fix.rs)` from `docs/`, rather than a bare backtick path, which nothing checks. The full rule, including the link forms that fail the check and the places it doesn't apply (`.github/`, links leaving a `skills/` folder, and `docs/rocm-docs/` along with the files it includes, which are this file and README.md), is in AGENTS.md section 5 ("Investigate rocm-cli Before Editing"); it applies to citations you add or edit.

### Test commands

| Component | Command |
| --- | --- |
| Rust (all crates) | `cargo test` |
| Lint + format check | `prek run --all-files` |
| Lint and format check | `prek run --all-files` |

See `docs/testing.md` for the full test guide and `docs/manual-testing.md` for manual QA steps.
See the [test guide](https://github.com/ROCm/rocm-cli/blob/main/docs/testing.md) for the full set of tests and the [manual testing guide](https://github.com/ROCm/rocm-cli/blob/main/docs/manual-testing.md) for manual QA steps.

## Making changes

1. **Fork** the repository and create a branch from `main`.
2. **Make your changes.** Keep commits focused — one logical change per commit.
2. **Make your changes.** Keep commits focused, with one logical change per commit.
3. **Add or update tests** for any new behavior.
4. **Run the relevant test suite** before opening a PR.
5. **Open a pull request** against `main` with a clear title and description following the Conventional Commits format.
Expand All @@ -118,13 +120,14 @@ git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
```

See `docs/commit-signatures.md` for GPG signing, GitHub "Verified" status, and troubleshooting.
See [Commit signatures](https://github.com/ROCm/rocm-cli/blob/main/docs/commit-signatures.md) for GPG signing, GitHub "Verified" status, and troubleshooting.

### What reviewers look for

- Tests cover the new behavior
- No secrets, credentials, or internal hostnames in committed files
- Third-party dependencies declared in `Cargo.lock`; license headers present on new source files (see `licenserc.toml`)
- Third-party dependencies recorded in `Cargo.lock`
- License headers on new source files (see `licenserc.toml`)

## Reporting security issues

Expand Down
6 changes: 4 additions & 2 deletions MANIFEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -683,8 +683,10 @@ filesystem: a bind mount or `subPath` volume is enough to make Linux refuse the
hardlink, and `uv` then silently copies. This cache holds every wheel `uv`
downloads — the ROCm SDK and the torch stack included — so it is typically the
largest directory rocm-cli manages, on the order of several GB per SDK version
installed. It is removed by `rocm uninstall` unless `--keep-data` is passed, and
its location can be overridden with `ROCM_CLI_UV_CACHE_DIR`.
installed. It is removed by `rocm uninstall`. On the default layout, the
configuration and data directories are both `~/.rocm`, so keeping it takes
`--keep-data` and `--keep-config` together. Its location can be overridden
with `ROCM_CLI_UV_CACHE_DIR`.

### Lemonade Embeddable Runtime

Expand Down
Loading
Loading