Skip to content

Man pages: render from the CLI, ship on every channel#37

Merged
kjanat merged 14 commits into
masterfrom
man
Jun 4, 2026
Merged

Man pages: render from the CLI, ship on every channel#37
kjanat merged 14 commits into
masterfrom
man

Conversation

@kjanat
Copy link
Copy Markdown
Owner

@kjanat kjanat commented Jun 3, 2026

What

man runner / man run (plus per-subcommand pages), rendered from the clap command tree and shipped by every channel that supports them.

How

  • New man subcommand in src/cmd/man.rs behind the man feature (off by default, Unix-only). Strips the help-text color escapes so the output is clean roff that passes man with zero warnings.
  • Same treatment for the JSON schema: the gen-schema example becomes a schema subcommand behind the schema feature. Both generators stay off the shipped binary; features renamed from man-gen/schema-gen.
  • Shipping:
    • crates.ioman/ rendered before publish, carried in the crate.
    • npm — facade man field (raw .1 files, no archive inside).
    • AUR — both packages install to /usr/share/man/man1/.
    • GitHub releaserunner-<tag>-man.tar.gz (+ .sha256); install.sh downloads and checksum-verifies it.
  • Pages are generated at build/release time, never committed (gitignored). Excluded from Windows builds.

Also

  • Drop this repo's bacon.toml; add .github/CONTRIBUTING.md; regenerate the README demo blocks from the live binary; CI and clippy cleanups.

kjanat added 13 commits June 3, 2026 20:23
Add a `runner man` subcommand that renders roff straight from the clap
command tree via `clap_mangen` (default-on dep, so prebuilt-binary and
`cargo install` builds can self-generate): `runner.1`, `run.1`, and one
page per subcommand. `--output <dir>` writes the full set; bare
`runner man` emits the top-level page to stdout. Bare invocation yields
to a project task named `man` when one exists, matching how the other
built-ins shadow.

Wire the pages into every channel that supports them:
- both AUR PKGBUILDs install to `/usr/share/man/man1/` (makepkg zipman
  gzips them);
- the npm facade ships them via package.json `man`, rendered once in CI
  from the host gnu x86_64 tarball (roff is platform-independent);
- `install.sh` renders into the XDG user man path, best-effort.

`cargo install` users generate on demand. README + CHANGELOG document it.
The `runner man` subcommand forced `clap_mangen` into every shipped
binary (default-on dep) just so each channel could self-generate pages
at install time. That's runtime weight and per-build rendering for an
artifact that never changes between builds.

Render once instead: a `gen-man` example (behind the off-by-default
`man-gen` feature) calls `runner::man_pages()` and writes `man/*.1`,
which are committed as the single source of truth. CI re-runs it and
asserts `git diff --exit-code man/` to keep them in sync.

- `clap_mangen` is now optional (`dep:clap_mangen`), out of the
  release binary like `schemars`/`schema-gen`.
- drop the `Man` CLI variant, `cmd::man`, and `dispatch_man`; move
  rendering to `src/man.rs` gated on `man-gen`.
- npm facade reads the committed `man/` dir directly; the per-build
  `--man-dir` flag is gone.
- `man/` added to the crate `include` so `cargo install` ships pages.
22ac483 committed `man/*.1` as the single source of truth, but a
generated artifact in the tree is just drift waiting to happen — every
CLI help tweak needs a matching `just gen-man` or CI diff-checks fail.

Render once at release instead. A new `man` job runs the `gen-man`
example, archives the pages as `runner-<tag>-man.tar.gz`, and uploads it
to the GitHub release; every channel pulls from there:
- npm facade downloads the `man-pages` artifact, ships via `man` field;
- `install.sh` and `runner-run-bin` fetch the release tarball;
- `runner-run` renders in `build()`;
- crates.io renders pre-publish (`cargo publish --allow-dirty`).

`/man/` is now gitignored and the committed pages dropped. Drop the
`--man-dir`-from-host-render path in build-npm-packages.sh for the
artifact download. Trim the over-long doc comments added with the
original feature down to one-liners.

Side sweep: pin third-party action `# vN` comments to exact tags
(`v6.0.3`, `v2.9.1`, …) so the floating-tag intent is unambiguous.
`gen-man` ran in debug after the release build, compiling the dep tree
twice. Run it `--release` first so `cargo build --release` reuses the
warmed artifacts — single compile.
The `gen-man` example was a second crate target wrapping the same
`man::man_pages()` the CLI could expose itself. Fold it back into a
`man` subcommand gated behind `man-gen` (still off by default, still
never in the shipped binary) so rendering lives with the command tree
it documents and callers invoke the real binary.

- `runner man` writes the top-level page to stdout; `--output <dir>`
  writes every `<stem>.1`. The `man` subcommand hides itself from the
  generated set.
- every channel switches to `cargo run --features man-gen -- man
  --output man`: crates-release, release.yml, AUR `build()`.
- AUR builds the release binaries first, then renders into a separate
  `target/man-gen` so the feature's `clap_mangen` dep tree can't
  pollute the release cache.
- drop the `man_pages()` lib export and the `[[example]]` entry.

Side sweep: regroup `.cargo/config.toml` aliases into labelled blocks
and add a `man` alias.
`man` rendering lived at the crate root (`src/man.rs`) while the
subcommand it backs lives under `cmd`. Move it to `src/cmd/man.rs` and
re-export `write_man_pages`/`write_runner_page_to_stdout` through `cmd`
so the `man-gen` code sits with the command tree it documents.

`dispatch_man` now calls `cmd::write_*`; gating and behaviour unchanged.
The `gen-schema` example was a second crate target wrapping the same
`config_schema()` the CLI could expose itself. Fold it back into a
`schema` subcommand gated behind `schema-gen` (still off by default,
still never in the shipped binary) so rendering lives with the command
tree it documents and callers invoke the real binary.

- `runner schema` writes the JSON Schema to stdout; `--output <file>`
  writes to disk with a trailing newline.
- `just gen-schema` and the `schema` cargo alias switch to
  `cargo schema --output ...`.
- drop the `[[example]]` entry, the `/examples` crate include, and the
  now-stale doc comments on the `schemars` dep + `schema-gen` feature.

Mirrors c1681c3's man-subcommand refactor.
The `man-gen`/`schema-gen` names dated to the example-crate era; now
that both render through real subcommands (`runner man`, `runner
schema`) the `-gen` suffix is vestigial. Rename to `man`/`schema`
across every gate: Cargo.toml, cli.rs `#[cfg]`s, cmd/ module wiring,
config.rs schemars derives, dispatch in lib.rs, plus the .zed,
.gitignore, README, CHANGELOG, PKGBUILD, and release.yml references.

Side sweeps:
- `.cargo/config.toml`: add `f`/`format` (dprint via bin-run) and a
  real `lint` alias; point `man`/`schema` at the renamed features.
- crates-release.yml: hoist `RELEASE_TAG`/`INPUT_DRY_RUN` to top-level
  env, flow-style the verbose blocks, emit a `version` output and feed
  it into the environment URL, add a `::error` annotation on tag
  mismatch, and call the new `cargo man` alias.
- justfile: drop the unused `default-member` var.
Move the working-tree-build and checks notes out of the README into a
dedicated .github/CONTRIBUTING.md, and document the generated-artifact
workflow (schema drift guard, on-demand man pages).

README `run`/`run <TAB>` samples regenerated against 0.12.0: bun + cargo
PMs, Node/monorepo lines, the renamed cargo aliases (f/format, man, rq),
and the new flags (--schema-version, --sequential/--parallel,
--keep-going/--kill-on-fail). Install/CI snippets bumped to 0.12.0 and
the chained `runner install --frozen test build` form. AUR links added.

Drop bacon.toml: bacon is no longer an aggregated task source, so its
jobs no longer show up in listings.
Fold the nine per-group `[lints.clippy.*]` tables into one inline map
under `[lints.clippy]`, keeping each level and `priority = -1`.

While collapsing, promote `complexity` warn → deny and drop the
`cargo_common_metadata`/`multiple_crate_versions` allows so the cargo
group denies fully; `redundant_pub_crate` stays the lone allow.

Also drop the binstall `pkg-url` explanatory comment block.
Show `runner install test build deploy` as a single invocation
instead of separate `run` lines, matching real multi-task usage.
The man pages downloaded from the release without integrity checks
while the binaries above them verified theirs. Fetch the matching
`runner-<version>-man.sha256` and `sha256sum -c` before extracting.

Still best-effort: a checksum mismatch joins a read-only `$HOME` or
a missing asset as a skip-not-fail condition, so the install never
breaks on the optional man pages.
Windows has no `man`, so the subcommand is dead weight there even when
built with `--features man`. Gate every `man` cfg on `not(windows)` so
it compiles on Unix only; a Windows binary never carries it.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 3, 2026

Warning

Review limit reached

@kjanat, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 73 minutes and 4 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 745763a3-fb2e-454c-b2b6-d14a5d8e502b

📥 Commits

Reviewing files that changed from the base of the PR and between d76ea42 and d271b11.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • .github/workflows/aur-release.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • Cargo.toml
  • README.md
  • aur/runner-run-bin/PKGBUILD
  • aur/runner-run/PKGBUILD
  • package.json
  • src/cli.rs
✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch man

Comment @coderabbitai help to get the list of available commands and usage tips.

@kjanat kjanat self-assigned this Jun 3, 2026
Repository owner deleted a comment from coderabbitai Bot Jun 3, 2026
Repository owner deleted a comment from coderabbitai Bot Jun 4, 2026
@kjanat kjanat added the wip wip label Jun 4, 2026
@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation enhancement New feature or request labels Jun 4, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Line 19: The workflow leaves the checkout token persisted and allows PRs to
save rust caches; update the `actions/checkout` step (the uses:
actions/checkout@...) to include persist-credentials: false so the GITHUB_TOKEN
is not stored in git, and modify the `Swatinem/rust-cache` step to set its
save-if input to only save when the event is not a pull_request (e.g., save-if:
${{ github.event_name != 'pull_request' }}), ensuring PR runs cannot persist
caches.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8563c184-f3f4-4229-8bc6-765ac3a3336c

📥 Commits

Reviewing files that changed from the base of the PR and between bd0710c and d76ea42.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (27)
  • .cargo/config.toml
  • .github/CONTRIBUTING.md
  • .github/scripts/build/build-npm-packages.sh
  • .github/scripts/publish/aur-prepare.sh
  • .github/workflows/aur-release.yml
  • .github/workflows/crates-release.yml
  • .github/workflows/npm-release.yml
  • .github/workflows/release.yml
  • .gitignore
  • .zed/settings.json
  • CHANGELOG.md
  • Cargo.toml
  • README.md
  • aur/runner-run-bin/PKGBUILD
  • aur/runner-run/PKGBUILD
  • bacon.toml
  • examples/gen-schema.rs
  • install.sh
  • justfile
  • npm/scripts/build-packages.ts
  • schemas/runner.toml.schema.json
  • src/cli.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/cmd/schema.rs
  • src/config.rs
  • src/lib.rs
💤 Files with no reviewable changes (2)
  • examples/gen-schema.rs
  • bacon.toml
📜 Review details
🧰 Additional context used
📓 Path-based instructions (3)
.github/**/*.{yml,yaml}

⚙️ CodeRabbit configuration file

Do not ever warn about stylistic yamllint shit. Do warn about security related shit. Insecure shell handling of user supplied / defined strings: think of branch names, inputs, pr content, anything needs to be string interpolation and permission safe.

Files:

  • .github/workflows/aur-release.yml
  • .github/workflows/crates-release.yml
  • .github/workflows/npm-release.yml
  • .github/workflows/release.yml
**/CHANGELOG.md

📄 CodeRabbit inference engine (Custom checks)

**/CHANGELOG.md: If any source code files (excluding tests, docs, CI, markdown, or comments-only changes) are modified, CHANGELOG.md MUST also be modified in the same PR.
If a version bump is detected, CHANGELOG.md MUST contain a new section header matching the exact new version number in the format: '## [X.Y.Z] - YYYY-MM-DD'.
If NO version bump is detected, the changes in the PR MUST be added under the existing '## [Unreleased]' section in CHANGELOG.md. The entry MUST describe the changes (e.g., Added, Changed, Fixed, Removed).

Files:

  • CHANGELOG.md
@(package.json|pyproject.toml|setup.py|Cargo.toml|go.mod|pom.xml|build.gradle|VERSION)

📄 CodeRabbit inference engine (Custom checks)

@(package.json|pyproject.toml|setup.py|Cargo.toml|go.mod|pom.xml|build.gradle|VERSION): If any source code files (excluding tests, docs, CI, markdown, or comments-only changes) are modified, then a version field MUST be updated in one of the following files if present in the repo: package.json, pyproject.toml, setup.py, Cargo.toml, go.mod, pom.xml, build.gradle, or a VERSION file.
The new version MUST follow SemVer (MAJOR.MINOR.PATCH). If the PR introduces breaking changes (removal or renaming of public APIs, changes to function signatures, deleted exported symbols, or incompatible config changes), MAJOR must increment. If it adds backward-compatible functionality, MINOR must increment. If it only fixes bugs without changing public APIs, PATCH must increment.

Files:

  • Cargo.toml
🧠 Learnings (16)
📚 Learning: 2026-03-26T20:08:23.153Z
Learnt from: kjanat
Repo: kjanat/runner PR: 1
File: src/detect.rs:22-22
Timestamp: 2026-03-26T20:08:23.153Z
Learning: In `src/detect.rs` within the `kjanat/runner` codebase, `detect()` is intentionally infallible and should return `ProjectContext` directly. Parsing/I/O failures from task extractors (which return `anyhow::Result<Vec<String>>`) must be recorded by `push_extracted_tasks` into `ProjectContext.warnings` as `DetectionWarning` entries and then emitted to stderr via `cmd::print_warnings`. When reviewing, do not flag `detect()` for “swallowing errors” as long as failures are routed into the warnings-list design (i.e., they’re preserved in `ProjectContext.warnings`, not dropped silently).

Applied to files:

  • .gitignore
📚 Learning: 2026-05-04T22:42:28.879Z
Learnt from: kjanat
Repo: kjanat/runner PR: 5
File: CHANGELOG.md:8-27
Timestamp: 2026-05-04T22:42:28.879Z
Learning: In `CHANGELOG.md`, do not treat a `## [Unreleased]` section as an error/mismatch during development PRs even if `Cargo.toml` includes an in-progress version bump. The versioned header format `## [X.Y.Z] - YYYY-MM-DD` should only be added at release/tag time; this repo’s `CHANGELOG.md` includes a “Post-release checklist” confirming that behavior. Only flag changelog/version mismatches if they contradict the intended workflow described in `CHANGELOG.md`.

Applied to files:

  • .gitignore
📚 Learning: 2026-05-14T15:04:39.496Z
Learnt from: kjanat
Repo: kjanat/runner PR: 27
File: src/cli.rs:780-788
Timestamp: 2026-05-14T15:04:39.496Z
Learning: In `src/cli.rs`, do not recommend removing `trailing_var_arg = true` or `allow_hyphen_values = true` from `Command::Run.args` and `RunAliasCli.args`. They are intentionally required for the documented pass-through contract: hyphen-prefixed args (e.g., `--watch`) that appear after a task name must be forwarded to the underlying task. As a result, in chain mode, chain-failure flags like `-k`/`--kill-on-fail` that are placed after task names will be silently consumed as task args rather than parsed as flags; when proposing fixes or usage changes, use the documented workaround of placing all chain flags before task names (e.g., `runner run -s -k build test`). This behavior is verified in `src/lib.rs` (`run_alias_forwards_trailing_args`) and described in the README, so keep this design trade-off intact.

Applied to files:

  • .gitignore
📚 Learning: 2026-05-02T17:50:01.271Z
Learnt from: kjanat
Repo: kjanat/runner PR: 5
File: .gitignore:4-4
Timestamp: 2026-05-02T17:50:01.271Z
Learning: In this repository, `package-lock.json` is intentionally added to `.gitignore` and should not be committed. In future reviews, do not flag the absence/presence of `package-lock.json` as an issue as long as `.gitignore` continues to exclude it intentionally.

Applied to files:

  • .gitignore
📚 Learning: 2026-06-04T04:42:48.221Z
Learnt from: CR
Repo: kjanat/greentv PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-06-04T04:42:48.221Z
Learning: Applies to AGENTS.md : If any AGENTS.md file exists in the repository and the PR modifies architecture, workflows, responsibilities, automation behavior, CLI interfaces, or agent-related logic, the corresponding AGENTS.md file in the affected directory MUST be updated in the same PR. Issue a warning if relevant code changes occur without updates to AGENTS.md.

Applied to files:

  • .github/CONTRIBUTING.md
📚 Learning: 2026-05-04T15:23:38.296Z
Learnt from: kjanat
Repo: kjanat/runner PR: 5
File: .github/workflows/release.yml:73-73
Timestamp: 2026-05-04T15:23:38.296Z
Learning: For GitHub Actions workflows in this repository (kjanat/runner), maintain the maintainer’s preference for “floating” action tags (e.g., `v6`, `v7`) instead of pinned full commit SHAs. During code review, do not flag action usages in `.github/workflows/**/*.yml` for not being pinned to full commit SHAs or suggest switching to SHA pinning.

Applied to files:

  • .github/workflows/aur-release.yml
  • .github/workflows/crates-release.yml
  • .github/workflows/npm-release.yml
  • .github/workflows/release.yml
📚 Learning: 2026-03-26T20:05:44.851Z
Learnt from: kjanat
Repo: kjanat/runner PR: 1
File: src/cmd/mod.rs:67-75
Timestamp: 2026-03-26T20:05:44.851Z
Learning: In Rust, `std::process::Command` does not provide getters for stdio configuration, so whether `Stdio::inherit()` (or other `Stdio::*` settings) was applied cannot be asserted via pure unit tests without spawning a process and inspecting OS-level fds. When reviewing Rust code, do not flag “missing unit test coverage” for stdio configuration on `std::process::Command` as a code issue—treat the explicit `Command::stdin/stdout/stderr` setter calls in the source as the meaningful guarantee.

Applied to files:

  • src/cmd/schema.rs
  • src/cli.rs
  • src/lib.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/config.rs
📚 Learning: 2026-04-21T15:16:40.277Z
Learnt from: kjanat
Repo: kjanat/runner PR: 4
File: src/tool/just.rs:132-133
Timestamp: 2026-04-21T15:16:40.277Z
Learning: In Rust, if a method like `ExtractedTask::name() -> &str` returns a borrowed `&str` tied to `&self`, then using `sort_unstable_by_key(|t| t.name())` should be avoided because `by_key` requires the key to not borrow from the element being sorted (it will fail to compile due to the key’s lifetime). Do not recommend `sort_unstable_by_key` as a simplification in this situation. If you need an allocation-free and idiomatic comparison, use `sort_unstable_by(|a, b| a.name().cmp(b.name()))` instead. Using `.to_owned()` inside `by_key` is an alternative but allocates a `String` per element.

Applied to files:

  • src/cmd/schema.rs
  • src/cli.rs
  • src/lib.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/config.rs
📚 Learning: 2026-05-04T23:28:17.947Z
Learnt from: kjanat
Repo: kjanat/runner PR: 5
File: src/lib.rs:222-223
Timestamp: 2026-05-04T23:28:17.947Z
Learning: When reviewing Rust `rustdoc` comments (`/// ...`), treat a trailing backslash (`\`) at the end of a comment line as valid CommonMark syntax for a hard line break (rendered as `<br>`). Do not flag such trailing backslashes as papercuts or recommend removing them unless there is clear evidence they are unintended (e.g., they are not in the `rustdoc` comment context or the surrounding formatting contradicts the intended CommonMark hard-break usage).

Applied to files:

  • src/cmd/schema.rs
  • src/cli.rs
  • src/lib.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/config.rs
📚 Learning: 2026-06-01T17:42:48.461Z
Learnt from: kjanat
Repo: kjanat/runner PR: 34
File: Cargo.toml:61-61
Timestamp: 2026-06-01T17:42:48.461Z
Learning: In this repo, do not flag `actions_rs::log::GroupGuard` or `actions_rs::log::group_guard` as missing/non-existent when they are referenced in Rust code, because the `actions-rs` crate (dependency `actions-rs = "0.1"` / published v0.1.x) exports `pub struct GroupGuard` and `pub fn group_guard` from `actions_rs::log` (and also exports `actions_rs::env::is_github_actions`). This avoids false positives from outdated/incorrect web search results. If the repo does not depend on `actions-rs = "0.1"` in `Cargo.toml`, then normal missing-import/item checks can apply.

Applied to files:

  • src/cmd/schema.rs
  • src/cli.rs
  • src/lib.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/config.rs
📚 Learning: 2026-05-14T15:35:39.922Z
Learnt from: kjanat
Repo: kjanat/runner PR: 27
File: src/cmd/run.rs:206-212
Timestamp: 2026-05-14T15:35:39.922Z
Learning: For Go projects using the canonical `cmd/` layout, when `runner` dispatches a local Go tool by its bare name (e.g., `some-cli`) under `PackageManager::Go`, resolve it relative to `ctx.root` by probing `ctx.root/cmd/<task_name>/`. If it exists, run the tool with the filesystem-path form: `go run ./cmd/<task_name>` (note the leading `./`). Do NOT generate `go run <task_name>` because bare names are treated as Go import paths, not local directories. While `go run <module>/cmd/<task_name>` can work, it’s unnecessary for local development—prefer `./cmd/<task_name>`.

Applied to files:

  • src/cmd/schema.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
📚 Learning: 2026-05-15T01:31:48.037Z
Learnt from: kjanat
Repo: kjanat/runner PR: 27
File: src/types.rs:584-585
Timestamp: 2026-05-15T01:31:48.037Z
Learning: In the `kjanat/runner` Rust codebase, remember that `just` treats its `justfile` name as officially case-insensitive and allows the hidden variant: `justfile`, `Justfile`, `JUSTFILE`, etc., and `.justfile`. `TaskSource::Justfile` detection should recognize these filename variants. Also note that `from_label` in `src/types.rs` is for parsing user-supplied qualifier prefixes (e.g. `justfile:build`), not for detecting the on-disk justfile. If you add/adjust qualifier label emission for `TaskSource::Justfile`, it’s not strictly required for backward compatibility because `TaskSource::label()` previously only emitted lowercase `"justfile"`, but adding additional casing/hidden variants as a defensive UX improvement is consistent with `just`’s official support.

Applied to files:

  • src/cmd/schema.rs
  • src/cli.rs
  • src/lib.rs
  • src/cmd/man.rs
  • src/cmd/mod.rs
  • src/config.rs
📚 Learning: 2026-06-04T04:42:48.221Z
Learnt from: CR
Repo: kjanat/greentv PR: 0
File: coderabbit-custom-pre-merge-checks-unique-id-file-non-traceable-F7F2B60C-1728-4C9A-8889-4F2235E186CA.txt:0-0
Timestamp: 2026-06-04T04:42:48.221Z
Learning: Applies to CHANGELOG.md : If a version bump is detected in source code modifications, CHANGELOG.md MUST contain a new section header matching the exact new version number in the format: '## [X.Y.Z] - YYYY-MM-DD'. If NO version bump is detected, changes MUST be added under the existing '## [Unreleased]' section with entry descriptions (e.g., Added, Changed, Fixed, Removed).

Applied to files:

  • CHANGELOG.md
  • README.md
📚 Learning: 2026-06-04T01:16:28.162Z
Learnt from: CR
Repo: kjanat/mosaic PR: 0
File: crates/mos-bib/AGENTS.md:0-0
Timestamp: 2026-06-04T01:16:28.162Z
Learning: Applies to crates/mos-bib/**/Cargo.toml : Do not add external dependencies for parsing; use hand-rolled parser approach

Applied to files:

  • Cargo.toml
📚 Learning: 2026-06-04T01:16:28.162Z
Learnt from: CR
Repo: kjanat/mosaic PR: 0
File: crates/mos-bib/AGENTS.md:0-0
Timestamp: 2026-06-04T01:16:28.162Z
Learning: Applies to crates/mos-bib/**/Cargo.toml : Do not depend on `mos-parse` or `mos-eval`; keep this crate close to `mos-core`

Applied to files:

  • Cargo.toml
📚 Learning: 2026-03-26T16:14:15.754Z
Learnt from: kjanat
Repo: kjanat/runner PR: 1
File: src/tool/go_task.rs:64-81
Timestamp: 2026-03-26T16:14:15.754Z
Learning: If code uses let-chains (e.g., `if let Some(x) = foo && ... && let Some(y) = bar`), ensure the crate’s `Cargo.toml` sets `package.edition = "2024"`. Rust 2021/earlier should not be used with let-chains; require 2024 specifically for compilation.

Applied to files:

  • Cargo.toml
🪛 LanguageTool
README.md

[locale-violation] ~369-~369: License must be spelled with a “c” when used as a noun in British English. Use “licence”.
Context: ...unner-run-bin`][aur:runner-run-bin] ## License [MIT][LICENSE] © 2026 Kaj Kowalski [L...

(LICENCE_LICENSE_NOUN_SINGULAR)


[locale-violation] ~371-~371: LICENSE must be spelled with a “c” when used as a noun in British English. Use “licence”.
Context: ...`][aur:runner-run-bin] ## License [MIT][LICENSE] © 2026 Kaj Kowalski [LICENSE]: https:...

(LICENCE_LICENSE_NOUN_SINGULAR)

🪛 zizmor (1.25.2)
.github/workflows/crates-release.yml

[warning] 20-20: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[error] 26-26: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)


[warning] 4-9: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)


[info] 25-25: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)

.github/workflows/npm-release.yml

[error] 70-70: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)

.github/workflows/release.yml

[warning] 19-19: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 21-21: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)


[info] 20-20: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)


[warning] 66-66: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[error] 72-72: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)


[info] 71-71: action functionality is already included by the runner (superfluous-actions): use rustup and/or cargo in a script step

(superfluous-actions)


[warning] 185-185: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)


[error] 191-191: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)

🔇 Additional comments (37)
.cargo/config.toml (1)

4-32: LGTM!

justfile (1)

11-11: LGTM!

Also applies to: 34-34, 37-38

.gitignore (1)

4-5: LGTM!

schemas/runner.toml.schema.json (1)

81-81: LGTM!

CHANGELOG.md (1)

44-50: LGTM!

README.md (1)

32-32: LGTM!

Also applies to: 34-71, 77-113, 126-127, 166-167, 180-185, 270-275, 310-316, 367-368, 373-375, 377-377

.github/CONTRIBUTING.md (1)

1-43: LGTM!

.github/workflows/crates-release.yml (1)

2-2: LGTM!

Also applies to: 5-5, 8-9, 12-13, 20-21, 23-26, 28-28, 35-35, 40-40, 42-43, 46-46, 53-53

.github/workflows/npm-release.yml (1)

61-61: LGTM!

Also applies to: 70-70, 108-108

.github/workflows/aur-release.yml (1)

35-35: LGTM!

npm/scripts/build-packages.ts (1)

19-19: LGTM!

Also applies to: 349-350, 425-425, 434-435, 497-522, 537-552, 964-967

.github/scripts/build/build-npm-packages.sh (1)

9-12: LGTM!

Also applies to: 19-19

.github/workflows/release.yml (1)

21-21: ⚡ Quick win

Arrr—stop Swatinem/rust-cache from writing caches on pull_request to avoid cache poisoning.

.github/workflows/release.yml uses Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 without any save-if guard (seen at the referenced step, and again later in the workflow). If that step runs on PRs, untrusted code can poison shared caches—add an explicit save-if guard.

Suggested patch
-      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
+      - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
+        with:
+          save-if: ${{ github.event_name != 'pull_request' }}
aur/runner-run-bin/PKGBUILD (1)

23-24: LGTM!

Also applies to: 28-28, 75-76

aur/runner-run/PKGBUILD (1)

30-31: LGTM!

Also applies to: 85-86

.github/scripts/publish/aur-prepare.sh (1)

60-68: LGTM!

install.sh (1)

148-161: LGTM!

Cargo.toml (4)

15-15: LGTM!


94-98: LGTM!


100-112: LGTM!


68-70: ⚡ Quick win

Cargo.toml clap_mangen dependency version is already up to date (0.3.x)

clap_mangen’s latest crates.io release is 0.3.0, and your Cargo spec version = "0.3" (caret ^0.3) already covers all 0.3.x, so you’re not missing anything by using 0.3.

.zed/settings.json (1)

19-19: LGTM!

src/cli.rs (3)

877-880: LGTM!


979-991: LGTM!


993-1005: LGTM!

src/cmd/man.rs (5)

12-28: LGTM!


30-60: Kyaa~! Such clean code, senpai! (◕‿◕)

The enumeration logic be properly excludin' hidden subcommands and the man command itself. Very kawaii desu ne~ ✨


62-73: LGTM!


75-118: Arrr! This ANSI-strippin' code be shipshape! ⚓

The implementation correctly handles CSI sequences (ESC [) and OSC sequences (ESC ]) with proper terminators. For the clap help output, this be all ye need, matey!


120-174: LGTM!

src/cmd/schema.rs (1)

10-20: Uwu~ such a simple and elegant function! (。♥‿♥。)

The schema writin' logic be clean and correct, with proper error context for both stdout and file output paths. Trailing newlines be handled in both cases~

src/cmd/mod.rs (2)

17-21: LGTM!


30-34: LGTM!

src/config.rs (1)

51-51: Yarr! The feature migration be complete and consistent across all configuration structs! 🏴‍☠️

Every schema-gen reference has been properly swapped fer schema, includin' both struct-level derives and field-level schemars metadata. Smooth sailin'!

Also applies to: 82-84, 115-115, 159-159, 173-173, 179-179, 186-186, 194-194, 212-212, 218-218, 225-225

src/lib.rs (3)

78-84: LGTM!


730-737: LGTM!


713-716: Kyaa~! The dispatch logic be perfectly integrated! (≧◡≦)

Both Man and Schema subcommands be properly wired into the main dispatch with matchin' cfg gates. The helper functions keep the dispatch function from becomin' too bloated~! ✨

Also applies to: 739-743

Comment thread .github/workflows/release.yml
@kjanat kjanat removed the wip wip label Jun 4, 2026
Restore the Clippy duplicate-version allow and hide the feature-only
`runner man` generator from shipped man-page docs.

Bump release metadata to 0.12.1, harden PR verification cache writes,
and add the root `fmt` package script.
@kjanat kjanat added wip wip and removed wip wip labels Jun 4, 2026
@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented Jun 4, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
runner d271b11 Commit Preview URL

Branch Preview URL
Jun 04 2026, 09:45 AM

@socket-security
Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedcargo/​clap_mangen@​0.3.010010093100100

View full report

@kjanat kjanat merged commit 331e265 into master Jun 4, 2026
16 checks passed
@kjanat kjanat deleted the man branch June 4, 2026 09:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant