Skip to content

Adopt cargo orthohelp release help#288

Draft
lodyai[bot] wants to merge 17 commits into
mainfrom
cargo-orthohelp-adoption
Draft

Adopt cargo orthohelp release help#288
lodyai[bot] wants to merge 17 commits into
mainfrom
cargo-orthohelp-adoption

Conversation

@lodyai
Copy link
Copy Markdown

@lodyai lodyai Bot commented May 1, 2026

Summary

This branch carries the pre-implementation plan for adopting cargo orthohelp as Netsuke's release help generator. It documents how the release workflow should replace clap_mangen and the current build.rs man-page output with explicit generation of Unix manual pages and Windows PowerShell MAML help.

Execplan: docs/execplans/cargo-orthohelp-adoption.md

This branch also updates Makefile so make markdownlint can resolve the Bun-installed markdownlint-cli2 in sparse hook environments where ~/.bun/bin is not on PATH.

This is a pre-implementation planning PR. It does not authorize implementation until the execplan is approved.

Review walkthrough

  • Start with docs/execplans/cargo-orthohelp-adoption.md to review the proposed release-help migration, approval gate, risks, tolerances, test strategy, and documentation updates.
  • Then review Makefile to confirm the MDLINT fallback keeps the existing override behaviour while fixing hook environments with a sparse PATH.

Validation

  • make check-fmt: passed.
  • make lint: passed.
  • make test: passed.
  • make markdownlint: passed.
  • PATH=/usr/bin:/bin make markdownlint: passed.
  • mbake validate Makefile: passed.

Notes

No roadmap task or issue reference was found in the branch context. The execplan records that implementation must wait for explicit approval.

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

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

Sorry @LodyAI[bot], you have reached your weekly rate limit of 2500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 1, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 17c55d9a-3c75-4e61-abbc-cde31bb7a80a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cargo-orthohelp-adoption

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

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

@lodyai lodyai Bot force-pushed the cargo-orthohelp-adoption branch from f669b09 to 99e3f3c Compare May 3, 2026 23:12
codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

leynos added 8 commits May 7, 2026 18:50
Document the approved-design boundary for replacing build-script help
generation with explicit `cargo orthohelp` release workflow steps.

Capture release artefact paths, test coverage expectations, documentation
updates, risks, tolerances, and the approval gate before implementation.
Make the `MDLINT` default fall back to Bun's installation path when
`markdownlint-cli2` is not present on `PATH`. This keeps `make markdownlint`
working from sparse hook environments without changing interactive overrides.
Mark the cargo orthohelp adoption ExecPlan as approved and in progress so implementation can proceed against the live plan.
Introduce a release helper that calls `cargo orthohelp` for man pages
and Windows PowerShell help, with rstest coverage around success and failure paths.
Replace build-script man-page generation with an explicit release helper
that invokes `cargo orthohelp` for man pages and Windows PowerShell help.
Keep `build.rs` focused on the localization audit and remove the
`clap_mangen` build dependency.

Wire release workflows and staging to consume `target/orthohelp` outputs,
including staged Linux man pages and Windows PowerShell help sidecars. Add
`rstest` contract tests and `rstest-bdd` scenarios covering successful
release help generation, missing outputs, invalid `SOURCE_DATE_EPOCH`, and
removal of the old build-script paths.
Keep the `CARGO` Makefile variable overrideable, but resolve it through
`command -v` with a `$HOME/.cargo/bin/cargo` fallback. This lets
non-login hook environments run `make check-fmt lint` when Cargo is not
present on `PATH`.

Record the hook finding and decision in the cargo-orthohelp ExecPlan.
Expose `make typecheck` as a warning-denying `cargo check` wrapper across
all targets and features. This gives the post-rebase validation set a
stable Makefile target alongside `check-fmt`, `test`, and `lint`.

Record the rebase result and validation-target decision in the
cargo-orthohelp ExecPlan.
@leynos
Copy link
Copy Markdown
Owner

leynos commented May 7, 2026

@coderabbitai Please investigate the cause of the following issue using codegraph exploration and research, identify a fix and provide an AI coding agent prompt for the fix:

Run scripts/generate-release-help.sh "aarch64-apple-darwin" "netsuke" "target/orthohelp/aarch64-apple-darwin/release"
  scripts/generate-release-help.sh "aarch64-apple-darwin" "netsuke" "target/orthohelp/aarch64-apple-darwin/release"
  shell: /opt/homebrew/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: unknown
    UV_CACHE_DIR: /Users/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    SCCACHE_PATH: /Users/runner/hostedtoolcache/sccache/0.15.0/arm64/sccache
    ACTIONS_CACHE_SERVICE_V2: on
    ACTIONS_RESULTS_URL: https://results-receiver.actions.githubusercontent.com/
    ACTIONS_RUNTIME_TOKEN: ***
error: unexpected argument 'orthohelp' found

Usage: cargo-orthohelp [OPTIONS]

For more information, try '--help'.
Error: Process completed with exit code 2.

Update the orthohelp ExecPlan with the latest successful rebase onto
`origin/main`, including the absence of conflicts and the new config
precedence work now present on the branch.

Remove the extra blank line in the users guide so the rebased branch passes
Markdown linting.
@lodyai lodyai Bot force-pushed the cargo-orthohelp-adoption branch from 7d79b22 to 4335334 Compare May 7, 2026 16:53
codescene-delta-analysis[bot]

This comment was marked as outdated.

@coderabbitai

This comment was marked as resolved.

Call `cargo-orthohelp` from the release-help script instead of using Cargo
external subcommand dispatch, which injects an unsupported `orthohelp`
positional argument.

Update the release-help script tests to fake `cargo-orthohelp` directly and
record the invocation decision in the orthohelp ExecPlan.
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner

leynos commented May 8, 2026

@coderabbitai Please investigate the cause of the following issue using codegraph exploration and research, identify a fix and provide an AI coding agent prompt for the fix:

Run leynos/shared-actions/.github/actions/rust-build-release@d400b079fb6a8fa92f7e7b6c57f3d1c92a4b2d54
  with:
    target: x86_64-unknown-linux-gnu
    bin-name: netsuke
    project-dir: .
    manifest-path: Cargo.toml
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
Run astral-sh/setup-uv@557e51de59eb14aaaba2ed9621916900a91d50c6
  with:
    activate-environment: false
    working-directory: /home/runner/work/netsuke/netsuke
    server-url: https://github.com
    github-token: ***
    enable-cache: auto
    cache-dependency-glob: **/*requirements*.txt
  **/*requirements*.in
  **/*constraints*.txt
  **/*constraints*.in
  **/pyproject.toml
  **/uv.lock
  
    prune-cache: true
    ignore-nothing-to-cache: false
    ignore-empty-workdir: false
    add-problem-matchers: true
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
Trying to find version for uv in: /home/runner/work/netsuke/netsuke/uv.toml
Could not find file: /home/runner/work/netsuke/netsuke/uv.toml
Trying to find version for uv in: /home/runner/work/netsuke/netsuke/pyproject.toml
Could not find file: /home/runner/work/netsuke/netsuke/pyproject.toml
Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.
Getting latest version from GitHub API...
manifest-file not provided, reading from local file.
manifest-file does not contain version 0.11.11, arch x86_64, platform unknown-linux-gnu. Falling back to GitHub releases.
Downloading uv from "https://github.com/astral-sh/uv/releases/download/0.11.11/uv-x86_64-unknown-linux-gnu.tar.gz" ...
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/521f040b-a9f5-408a-ae65-842ccda446a0 -f /home/runner/work/_temp/c38ff597-c683-40c7-bf25-28148debd01e
Added /home/runner/.local/bin to the path
Added /opt/hostedtoolcache/uv/0.11.11/x86_64 to the path
Set UV_CACHE_DIR to /home/runner/work/_temp/setup-uv-cache
Successfully installed uv version 0.11.11
Searching files using cache dependency glob: /home/runner/work/netsuke/netsuke/**/*requirements*.txt,/home/runner/work/netsuke/netsuke/**/*requirements*.in,/home/runner/work/netsuke/netsuke/**/*constraints*.txt,/home/runner/work/netsuke/netsuke/**/*constraints*.in,/home/runner/work/netsuke/netsuke/**/pyproject.toml,/home/runner/work/netsuke/netsuke/**/uv.lock
No matches found for glob
Warning: No file matched to [/home/runner/work/netsuke/netsuke/**/*requirements*.txt,/home/runner/work/netsuke/netsuke/**/*requirements*.in,/home/runner/work/netsuke/netsuke/**/*constraints*.txt,/home/runner/work/netsuke/netsuke/**/*constraints*.in,/home/runner/work/netsuke/netsuke/**/pyproject.toml,/home/runner/work/netsuke/netsuke/**/uv.lock]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.
Trying to restore uv cache from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Cache hit for: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Received 133395 of 133395 (100.0%), 1.0 MBs/sec
Cache Size: ~0 MB (133395 B)
/usr/bin/tar -xf /home/runner/work/_temp/c0bc6e91-d9fb-4e18-9e49-17e0423963af/cache.tzst -P -C /home/runner/work/netsuke/netsuke --use-compress-program unzstd
Cache restored successfully
uv cache restored from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Run set -euo pipefail
  set -euo pipefail
  uv run --script "$GITHUB_ACTION_PATH/src/action_setup.py" \
    validate "x86_64-unknown-linux-gnu"
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
Downloading pygments (1.2MiB)
 Downloaded pygments
Installed 10 packages in 11ms
Run set -euo pipefail
  set -euo pipefail
  TOOLCHAIN="$(uv run --script "$GITHUB_ACTION_PATH/src/action_setup.py" \
    toolchain \
    --toolchain "" \
    --manifest-path "Cargo.toml" \
    --target "x86_64-unknown-linux-gnu" \
    --runner-os "Linux" \
    --runner-arch "X64")"
  echo "RBR_TOOLCHAIN=$TOOLCHAIN" >> "$GITHUB_ENV"
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
Run leynos/shared-actions/.github/actions/setup-rust@aebb3f5b831102e2a10ef909c83d7d50ea86c332
  with:
    toolchain: 1.89.0
    install-postgres-deps: false
    install-sqlite-deps: false
    use-sccache: true
    install-binstall: true
    with-darwin: false
    darwin-sdk-version: 12.3
    with-openbsd: false
    openbsd-nightly: nightly-2025-07-20
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
Run actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9
  with:
    override: true
    toolchain: 1.89.0
    components: rustfmt, clippy, llvm-tools-preview
    cache: false
    cache-on-failure: true
    cache-bin: true
    matcher: true
    rustflags: -D warnings
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
Run : construct rustup command line
  : construct rustup command line
  echo "targets=$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)" >> $GITHUB_OUTPUT
  echo "components=$(for c in ${components//,/ }; do echo -n ' --component' $c; done)" >> $GITHUB_OUTPUT
  echo "downgrade=" >> $GITHUB_OUTPUT
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    targets: 
    components: rustfmt, clippy, llvm-tools-preview
Run if [[ ! -v CARGO_INCREMENTAL ]]; then
  if [[ ! -v CARGO_INCREMENTAL ]]; then
    echo "CARGO_INCREMENTAL=0" >> $GITHUB_ENV
  fi
  if [[ ! -v CARGO_PROFILE_DEV_DEBUG ]]; then
    echo "CARGO_PROFILE_DEV_DEBUG=0" >> $GITHUB_ENV
  fi
  if [[ ! -v CARGO_TERM_COLOR ]]; then
    echo "CARGO_TERM_COLOR=always" >> $GITHUB_ENV
  fi
  if [[ ! -v RUST_BACKTRACE ]]; then
    echo "RUST_BACKTRACE=short" >> $GITHUB_ENV
  fi
  if [[ ( ! -v RUSTFLAGS ) && $NEW_RUSTFLAGS != "" ]]; then
    echo "RUSTFLAGS=$NEW_RUSTFLAGS" >> $GITHUB_ENV
  fi
  # Enable faster sparse index on nightly
  # The value is ignored on stable and causes no problems
  # https://internals.rust-lang.org/t/call-for-testing-cargo-sparse-registry/16862
  if [[ ! -v CARGO_UNSTABLE_SPARSE_REGISTRY ]]; then
    echo "CARGO_UNSTABLE_SPARSE_REGISTRY=true" >> $GITHUB_ENV
  fi
  if [[ ! -v CARGO_REGISTRIES_CRATES_IO_PROTOCOL ]]; then
    echo "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse" >> $GITHUB_ENV
  fi
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    NEW_RUSTFLAGS: -D warnings
Run echo "::add-matcher::/home/runner/work/_actions/actions-rust-lang/setup-rust-toolchain/9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9/rust.json"
  echo "::add-matcher::/home/runner/work/_actions/actions-rust-lang/setup-rust-toolchain/9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9/rust.json"
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
Run if ! command -v rustup &> /dev/null ; then
  if ! command -v rustup &> /dev/null ; then
    curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y
    
    # Resolve the correct CARGO_HOME path depending on OS
    if [[ "$RUNNER_OS" == "Windows" ]]; then
      echo "${CARGO_HOME:-$USERPROFILE/.cargo}/bin" | sed 's|/|\\|g' >> $GITHUB_PATH
    else
      echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> $GITHUB_PATH
    fi
  fi
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    RUNNER_OS: Linux
Run if [[ -z "$toolchain" && ( -f "rust-toolchain" || -f "rust-toolchain.toml" ) ]]
  if [[ -z "$toolchain" && ( -f "rust-toolchain" || -f "rust-toolchain.toml" ) ]]
  then
    # Install the toolchain as specified in the file
    # rustup show is the old way that implicitly installed a toolchain
    # rustup toolchain install is the new explicit way
    # https://github.com/rust-lang/rustup/issues/3635#issuecomment-2343511297
    rustup show active-toolchain || rustup toolchain install
    if [[ -n $components ]]; then
      rustup component add ${components//,/ }
    fi
    if [[ -n $targets ]]; then
      rustup target add ${targets//,/ }
    fi
  else
    if [[ -z "$toolchain" ]]
    then
      toolchain=stable
    fi
    rustup toolchain install ${toolchain//,/ }  --component rustfmt --component clippy --component llvm-tools-preview --profile minimal --no-self-update
    # Take the last element from the list
    if [[ "$override" == "true" ]]
    then
      rustup override set ${toolchain//*,/ }
    fi
  fi
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
info: syncing channel updates for 1.89.0-x86_64-unknown-linux-gnu
info: latest update on 2025-08-07 for version 1.89.0 (29483883e 2025-08-04)
info: component clippy is up to date
info: component rustfmt is up to date
info: downloading component llvm-tools

  1.89.0-x86_64-unknown-linux-gnu updated - rustc 1.89.0 (29483883e 2025-08-04) (from rustc 1.89.0 (29483883e 2025-08-04))

info: override toolchain for /home/runner/work/netsuke/netsuke set to 1.89.0-x86_64-unknown-linux-gnu
Run echo "rustc-version=$(rustc --version)" >> $GITHUB_OUTPUT
rustc 1.89.0 (29483883e 2025-08-04)
binary: rustc
commit-hash: 29483883eed69d5fb4db01964cdf2af4d86e9cb2
commit-date: 2025-08-04
host: x86_64-unknown-linux-gnu
release: 1.89.0
LLVM version: 20.1.7
cargo 1.89.0 (c24e10642 2025-06-23)
release: 1.89.0
commit-hash: c24e1064277fe51ab72011e2612e556ac56addf7
commit-date: 2025-06-23
host: x86_64-unknown-linux-gnu
libgit2: 1.9.0 (sys:0.20.2 vendored)
libcurl: 8.12.1-DEV (sys:0.4.80+curl-8.12.1 vendored ssl:OpenSSL/3.5.0)
ssl: OpenSSL 3.5.0 8 Apr 2025
os: Ubuntu 24.4.0 (noble) [64-bit]
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: the currently active `rustc` version is `rustc 1.89.0 (29483883e 2025-08-04)`
info: This is the version for the rustup toolchain manager, not the rustc compiler.
rustup 1.29.0 (28d1352db 2026-03-05)
info: the currently active `rustc` version is `rustc 1.89.0 (29483883e 2025-08-04)`
Run # Not all versions support setting CARGO_REGISTRIES_CRATES_IO_PROTOCOL
  # Not all versions support setting CARGO_REGISTRIES_CRATES_IO_PROTOCOL
  # On versions 1.66, 1.67, and 1.68.0-nightly the value "sparse" is still unstable.
  # https://github.com/dtolnay/rust-toolchain/pull/69#discussion_r1107268108
  # If we detect an incompatible value, set it to "git" which is always supported.
  if [[ "rustc 1.89.0 (29483883e 2025-08-04)" =~ ^rustc\ (1\.6[67]\.|1\.68\.0-nightly) && "${CARGO_REGISTRIES_CRATES_IO_PROTOCOL}" == "sparse" ]]; then
    echo "Downgrade cargo registry protocol to git"
    echo "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git" >> $GITHUB_ENV
  fi
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
Run set -euo pipefail
  set -euo pipefail
  # Keep BINSTALL_VERSION and BINSTALL_SHA256 in sync; update both together.
  # To refresh the checksum: curl -fsSL "$INSTALLER_URL" | shasum -a 256 | awk '{print $1}'
  BINSTALL_VERSION="v1.16.6"
  BINSTALL_SHA256="c2e963fbab3bdd8653b59c28d349bf85740cf4998e5e398d250dcd2884cd667d"
  INSTALLER_URL="https://raw.githubusercontent.com/cargo-bins/cargo-binstall/${BINSTALL_VERSION}/install-from-binstall-release.sh"
  INSTALLER_PATH="$(mktemp)"
  trap 'rm -f "$INSTALLER_PATH"' EXIT
  curl -fsSL --proto '=https' --tlsv1.2 "$INSTALLER_URL" -o "$INSTALLER_PATH"
  if [ ! -s "$INSTALLER_PATH" ]; then
    echo "cargo-binstall installer download failed or empty" >&2
    exit 1
  fi
  if command -v sha256sum >/dev/null 2>&1; then
    ACTUAL_SHA256="$(sha256sum "$INSTALLER_PATH" | awk '{print $1}')"
  else
    ACTUAL_SHA256="$(shasum -a 256 "$INSTALLER_PATH" | awk '{print $1}')"
  fi
  if [ "$ACTUAL_SHA256" != "$BINSTALL_SHA256" ]; then
    echo "cargo-binstall install script checksum mismatch: $ACTUAL_SHA256" >&2
    exit 1
  fi
  bash "$INSTALLER_PATH"
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
+ set -o pipefail
+ set -o pipefail
+ case "${BINSTALL_VERSION:-}" in
++ mktemp -d
+ cd /tmp/tmp.iUzcKTU7bm
+ '[' -z '' ']'
+ base_url=https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-
++ uname -s
+ os=Linux
+ '[' Linux = Darwin ']'
+ '[' Linux = Linux ']'
++ uname -m
+ machine=x86_64
+ '[' x86_64 = armv7l ']'
+ target=x86_64-unknown-linux-musl
+ '[' x86_64 = armv7 ']'
+ url=https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz
+ do_curl https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz
+ curl --retry 10 -A 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0' -L --proto =https --tlsv1.2 -sSf https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz
+ tar -xvzf -
cargo-binstall
+ ./cargo-binstall --self-install
+ CARGO_HOME=/home/runner/.cargo
+ case ":$PATH:" in
+ '[' -n '' ']'
Run astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc
  with:
    cache-dependency-glob: **/pyproject.toml
  **/uv.lock
  **/scripts/*.py
  
    activate-environment: false
    working-directory: /home/runner/work/netsuke/netsuke
    server-url: https://github.com
    github-token: ***
    enable-cache: auto
    prune-cache: true
    ignore-nothing-to-cache: false
    ignore-empty-workdir: false
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
Trying to find version for uv in: /home/runner/work/netsuke/netsuke/uv.toml
Could not find file: /home/runner/work/netsuke/netsuke/uv.toml
Trying to find version for uv in: /home/runner/work/netsuke/netsuke/pyproject.toml
Could not find file: /home/runner/work/netsuke/netsuke/pyproject.toml
Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest.
Found uv in tool-cache for 0.11.11
Added /home/runner/.local/bin to the path
Added /opt/hostedtoolcache/uv/0.11.11/x86_64 to the path
Set UV_CACHE_DIR to /home/runner/work/_temp/setup-uv-cache
Successfully installed uv version 0.11.11
Searching files using cache dependency glob: /home/runner/work/netsuke/netsuke/**/pyproject.toml,/home/runner/work/netsuke/netsuke/**/uv.lock,/home/runner/work/netsuke/netsuke/**/scripts/*.py
No matches found for glob
Warning: No file matched to [/home/runner/work/netsuke/netsuke/**/pyproject.toml,/home/runner/work/netsuke/netsuke/**/uv.lock,/home/runner/work/netsuke/netsuke/**/scripts/*.py]. The cache will never get invalidated. Make sure you have checked out the target repository and configured the cache-dependency-glob input correctly.
Trying to restore uv cache from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Cache hit for: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Received 133395 of 133395 (100.0%), 0.9 MBs/sec
Cache Size: ~0 MB (133395 B)
/usr/bin/tar -xf /home/runner/work/_temp/3940b306-49d8-4d56-89d2-4e69e0b571b1/cache.tzst -P -C /home/runner/work/netsuke/netsuke --use-compress-program unzstd
Cache restored successfully
uv cache restored from GitHub Actions cache with key: setup-uv-1-x86_64-unknown-linux-gnu-3.12.3-pruned-no-dependency-glob
Run actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
  with:
    path: ~/.cargo/registry
  ~/.cargo/git
  target/
  
    key: Linux-cargo--215c930b9ba91c629d891c6a226f6e629eb114074380448a321b42582fd5c15b
    restore-keys: Linux-cargo--
  
    enableCrossOsArchive: false
    fail-on-cache-miss: false
    lookup-only: false
    save-always: false
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
Cache hit for: Linux-cargo--215c930b9ba91c629d891c6a226f6e629eb114074380448a321b42582fd5c15b
Received 71303168 of 171178197 (41.7%), 68.0 MBs/sec
Received 171178197 of 171178197 (100.0%), 100.5 MBs/sec
Cache Size: ~163 MB (171178197 B)
/usr/bin/tar -xf /home/runner/work/_temp/dd2f82c1-67db-4d7d-8762-a8b6bd0f2d3b/cache.tzst -P -C /home/runner/work/netsuke/netsuke --use-compress-program unzstd
Cache restored successfully
Cache restored from key: Linux-cargo--215c930b9ba91c629d891c6a226f6e629eb114074380448a321b42582fd5c15b
Run mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad
  with:
    token: ***
    disable_annotations: false
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
try to setup sccache version: v0.15.0
sccache download from url: https://github.com/mozilla/sccache/releases/download/v0.15.0/sccache-v0.15.0-x86_64-unknown-linux-musl.tar.gz
Correct checksum: 782d2b5dd7ae0a55ebe368ab258114d0928d019ac2d949ab85d5d02f3926709e
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/77bc32c9-bb6d-4fe3-9bae-fa61f672e41b -f /home/runner/work/_temp/59ab7592-15d4-4686-b069-09bba1983231
sccache extracted to: /home/runner/work/_temp/77bc32c9-bb6d-4fe3-9bae-fa61f672e41b
sccache cached to: /opt/hostedtoolcache/sccache/0.15.0/x64
Run set -euo pipefail
  set -euo pipefail
  uv run --script "$GITHUB_ACTION_PATH/src/main.py"
  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: amd64
    UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    SCCACHE_PATH: /opt/hostedtoolcache/sccache/0.15.0/x64/sccache
    ACTIONS_CACHE_SERVICE_V2: on
    ACTIONS_RESULTS_URL: https://results-receiver.actions.githubusercontent.com/
    ACTIONS_RUNTIME_TOKEN: ***
    RBR_TARGET: x86_64-unknown-linux-gnu
    RBR_MANIFEST_PATH: Cargo.toml
    RBR_FEATURES: 
Installed 11 packages in 12ms
$ /home/runner/.cargo/bin/rustup toolchain list
$ /home/runner/.cargo/bin/rustup target add --toolchain 1.89.0-x86_64-unknown-linux-gnu x86_64-unknown-linux-gnu
Installing cross (not found)...
$ /home/runner/.cargo/bin/cargo install cross --locked --version 0.2.5
$ /home/runner/.cargo/bin/cross --version
$ /usr/bin/docker info
$ /usr/bin/podman info
$ /usr/bin/podman info --format {{json .Host.Security}}
Warning:  podman missing CAP_SYS_ADMIN; treating runtime as unavailable
Building with cross (0.2.5)
$ cross build --manifest-path Cargo.toml --release --target x86_64-unknown-linux-gnu
Run set -euo pipefail
  set -euo pipefail
  case "x86_64-unknown-linux-gnu" in
    x86_64-unknown-linux-*)
      os=linux
      arch=amd64
      ;;
    x86_64-unknown-illumos)
      os=illumos
      arch=amd64
      ;;
    aarch64-unknown-linux-*)
      os=linux
      arch=arm64
      ;;
    i686-unknown-linux-*)
      os=linux
      arch=i386
      ;;
    armv7-unknown-linux-gnueabihf|arm-unknown-linux-gnueabihf|armv7-unknown-linux-musleabihf|arm-unknown-linux-musleabihf)
      os=linux
      arch=armhf
      ;;
    riscv64*-unknown-linux-*)
      os=linux
      arch=riscv64
      ;;
    powerpc64le-unknown-linux-*|ppc64le-unknown-linux-*)
      os=linux
      arch=ppc64el
      ;;
    *)
      echo "::error:: unsupported target x86_64-unknown-linux-gnu"
      exit 1
      ;;
  esac
  mkdir -p "dist/netsuke_${os}_${arch}"
  bin_src="target/x86_64-unknown-linux-gnu/release/netsuke"
  if [[ ! -f "${bin_src}" ]]; then
    echo "::error:: binary not found at ${bin_src}"
    exit 1
  fi
  stable_man_path="target/generated-man/x86_64-unknown-linux-gnu/release/netsuke.1"
  man_path="${stable_man_path}"
  if [[ ! -f "${man_path}" ]]; then
    man_matches=()
    while IFS= read -r -d $'\0' _match; do
      man_matches+=("$_match")
    done < <(
      find "target/x86_64-unknown-linux-gnu/release/build" \
        -path "*/out/netsuke.1" \
Error:  man page not found at target/generated-man/x86_64-unknown-linux-gnu/release/netsuke.1 or under target/x86_64-unknown-linux-gnu/release/build/*/out/
Error: Process completed with exit code 1.

@leynos
Copy link
Copy Markdown
Owner

leynos commented May 8, 2026

@coderabbitai Please investigate the cause of the following issue using codegraph exploration and research, identify a fix and provide an AI coding agent prompt for the fix:

Run scripts/generate-release-help.sh "x86_64-pc-windows-msvc" "netsuke" "target/orthohelp/x86_64-pc-windows-msvc/release"
  scripts/generate-release-help.sh "x86_64-pc-windows-msvc" "netsuke" "target/orthohelp/x86_64-pc-windows-msvc/release"
  shell: C:\Program Files\Git\bin\bash.EXE --noprofile --norc -e -o pipefail {0}
  env:
    BIN_NAME: netsuke
    VERSION: 0.1.0
    MAN_ARCH: unknown
    UV_TOOL_BIN_DIR: D:\a\_temp\uv-tool-bin-dir
    UV_TOOL_DIR: D:\a\_temp\uv-tool-dir
    UV_CACHE_DIR: D:\a\_temp\setup-uv-cache
    RBR_TOOLCHAIN: 1.89.0
    CARGO_INCREMENTAL: 0
    CARGO_PROFILE_DEV_DEBUG: 0
    CARGO_TERM_COLOR: always
    RUST_BACKTRACE: short
    RUSTFLAGS: -D warnings
    CARGO_UNSTABLE_SPARSE_REGISTRY: true
    CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    SCCACHE_PATH: C:\hostedtoolcache\windows\sccache\0.15.0\x64/sccache
    ACTIONS_CACHE_SERVICE_V2: on
    ACTIONS_RESULTS_URL: https://results-receiver.actions.githubusercontent.com/
    ACTIONS_RUNTIME_TOKEN: ***
Error: BridgeBuildFailure { status: 101, message: "\u{1b}[1m\u{1b}[32m    Updating\u{1b}[0m crates.io index\n\u{1b}[1m\u{1b}[32m     Locking\u{1b}[0m 287 packages to latest Rust 1.89.0 compatible versions\n\u{1b}[1m\u{1b}[36m      Adding\u{1b}[0m generic-array v0.14.7 \u{1b}[1m\u{1b}[33m(available: v0.14.9)\u{1b}[0m\n\u{1b}[1m\u{1b}[32m Downloading\u{1b}[0m crates ...\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m crypto-common v0.1.7\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anstyle-query v1.1.5\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m winapi-util v0.1.11\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m fastrand v2.4.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zmij v1.0.21\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zerovec-derive v0.11.3\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zerotrie v0.2.4\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m typenum v1.20.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m winnow v1.0.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m unicode-width v0.2.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m minijinja v2.19.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m libc v0.2.186\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m url v2.5.8\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zerovec v0.11.6\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m winnow v0.7.15\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m webpki-roots v1.0.7\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m time v0.3.47\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tracing-subscriber v0.3.23\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m syn v2.0.117\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tracing v0.1.44\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m time-macros v0.2.27\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m yoke-derive v0.8.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m find-msvc-tools v0.1.9\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m clap v4.6.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anstream v1.0.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m rustls v0.23.40\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_properties_data v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m serde_json v1.0.149\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m memchr v2.8.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_normalizer_data v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m hashbrown v0.15.5\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m clap_builder v4.6.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m hashbrown v0.17.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m cc v1.2.61\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tracing-core v0.1.36\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m toml v0.9.12+spec-1.1.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m ryu v1.0.23\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m rustls-webpki v0.103.13\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m rustls-pki-types v1.14.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m log v0.4.29\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m indexmap v2.14.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_provider v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_properties v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_locale_core v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_collections v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m flate2 v1.1.9\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m console v0.16.3\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m backtrace v0.3.76\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m yoke v0.8.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m unicode-ident v1.0.24\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tracing-attributes v0.1.31\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tinystr v0.8.3\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m tempfile v3.27.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m semver v1.0.28\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m proc-macro2 v1.0.106\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m pin-project-lite v0.2.17\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m owo-colors v4.3.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m once_cell v1.21.4\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m nu-ansi-term v0.50.3\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m lru v0.16.4\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m deranged v0.5.8\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m clap_derive v4.6.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m camino v1.2.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m bitflags v2.11.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anstyle v1.0.14\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m writeable v0.6.3\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m toml_writer v1.1.1+spec-1.1.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m toml_parser v1.1.2+spec-1.1.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m thiserror v2.0.18\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m terminal_size v0.4.4\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m smallvec v2.0.0-alpha.12\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m simd-adler32 v0.3.9\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m serde_json_canonicalizer v0.3.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m self_cell v1.2.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m rustc-demangle v0.1.27\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m potential_utf v0.1.5\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m litemap v0.8.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m ipnet v2.12.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m idna_adapter v1.2.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m getrandom v0.2.17\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anyhow v1.0.102\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zerofrom-derive v0.1.7\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m zerofrom v0.1.7\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m time-core v0.1.8\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m supports-hyperlinks v3.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m rustc-hash v2.1.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m icu_normalizer v2.2.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anstyle-parse v1.0.0\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m anstyle-wincon v3.0.11\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m thiserror-impl v2.0.18\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m serde_spanned v1.1.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m num-conv v0.2.1\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m itoa v1.0.18\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m getrandom v0.4.2\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m colorchoice v1.0.5\n\u{1b}[1m\u{1b}[32m  Downloaded\u{1b}[0m clap_lex v1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m proc-macro2 v1.0.106\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unicode-ident v1.0.24\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m quote v1.0.45\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-link v0.2.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_core v1.0.228\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m cfg-if v1.0.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m version_check v0.9.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m stable_deref_trait v1.2.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-sys v0.61.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m proc-macro-hack v0.5.20+deprecated\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m equivalent v1.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m syn v2.0.117\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde v1.0.228\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m hashbrown v0.17.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m once_cell v1.21.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows_x86_64_msvc v0.52.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m once_cell_polyfill v1.70.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anstyle v1.0.14\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m parking_lot_core v0.9.12\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m memchr v2.8.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m utf8parse v0.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m winnow v0.7.15\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m smallvec v1.15.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anstyle-parse v1.0.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-targets v0.52.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m proc-macro2-diagnostics v0.10.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zmij v1.0.21\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m is_terminal_polyfill v1.70.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m colorchoice v1.0.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m getrandom v0.4.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_write v0.1.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m synstructure v0.13.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m option-ext v0.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m io-lifetimes v2.0.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows_x86_64_msvc v0.48.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-sys v0.59.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m heck v0.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m scopeguard v1.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m itoa v1.0.18\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m thiserror v2.0.18\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m yansi v1.0.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m rustc-hash v2.1.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m type-map v0.5.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m lock_api v0.4.14\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m uncased v0.9.10\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m clap_lex v1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m shlex v1.3.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m fastrand v2.4.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m strsim v0.11.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m find-msvc-tools v0.1.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m displaydoc v0.2.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zerofrom-derive v0.1.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m yoke-derive v0.8.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zerovec-derive v0.11.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tinystr v0.8.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unic-langid-impl v0.9.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zerofrom v0.1.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_derive v1.0.228\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unic-langid-macros-impl v0.9.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m yoke v0.8.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m thiserror-impl v2.0.18\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zerovec v0.11.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unic-langid-macros v0.9.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m io-extras v0.18.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m litemap v0.8.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m writeable v0.6.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unic-langid v0.9.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zerotrie v0.2.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m potential_utf v0.1.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_locale_core v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m cc v1.2.61\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m pear_codegen v0.2.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-targets v0.48.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m indexmap v2.14.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m figment v0.10.19\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_properties_data v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m bitflags v2.11.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m cap-primitives v3.4.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m utf8_iter v1.0.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_normalizer_data v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m inlinable_string v0.1.15\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m camino v1.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m pear v0.2.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_spanned v0.6.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_datetime v0.6.11\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_collections v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m winx v0.36.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ring v0.17.14\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m windows-sys v0.48.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_provider v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m fluent-syntax v0.12.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m fs-set-times v0.20.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m clap_derive v4.6.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tracing-attributes v0.1.31\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anstyle-wincon v3.0.11\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anstyle-query v1.1.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m generic-array v0.14.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m pin-project-lite v0.2.17\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m zeroize v1.8.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m maybe-owned v0.3.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ambient-authority v0.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m self_cell v1.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m cap-std v3.4.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ipnet v2.12.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m winnow v1.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m dirs-sys v0.4.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_parser v1.1.2+spec-1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m rustls-pki-types v1.14.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anstream v1.0.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_edit v0.22.27\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_spanned v1.1.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_datetime v0.7.5+spec-1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m typenum v1.20.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_json v1.0.149\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml_writer v1.1.1+spec-1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml v0.9.12+spec-1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m toml v0.8.23\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m parking_lot v0.12.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_normalizer v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m icu_properties v2.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m clap_builder v4.6.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m dirs v5.0.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m intl-memoizer v0.5.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m fluent-langneg v0.13.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m intl_pluralrules v7.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ortho_config_macros v0.8.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m clap-dispatch v0.1.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tempfile v3.27.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m dirs-sys v0.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tracing-core v0.1.36\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m getrandom v0.2.17\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m dunce v1.0.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m untrusted v0.9.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m foldhash v0.1.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unicode-width v0.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m autocfg v1.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m crc32fast v1.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m libc v0.2.186\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m thiserror v1.0.69\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m log v0.4.29\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m num-traits v0.2.19\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m hashbrown v0.15.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tracing v0.1.44\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m clap v4.6.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m directories v6.0.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m idna_adapter v1.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m fluent-bundle v0.16.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m thiserror-impl v1.0.69\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m rustc-demangle v0.1.27\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m portable-atomic v1.13.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m simd-adler32 v0.3.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m owo-colors v4.3.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m adler2 v2.0.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m rustls v0.23.40\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m percent-encoding v2.3.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m miniz_oxide v0.8.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m form_urlencoded v1.2.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m backtrace v0.3.76\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ortho_config v0.8.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m rustls-webpki v0.103.13\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m idna v1.1.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m hashlink v0.10.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m crypto-common v0.1.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m block-buffer v0.10.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m webpki-roots v1.0.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m winapi-util v0.1.11\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m subtle v2.6.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m is_ci v1.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m arraydeque v0.5.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m powerfmt v0.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m time-core v0.1.8\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unicode-linebreak v0.1.5\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m base64 v0.22.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m anyhow v1.0.102\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m encode_unicode v1.0.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m lazy_static v1.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m allocator-api2 v0.2.21\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m num-conv v0.2.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m foldhash v0.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m console v0.16.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m time-macros v0.2.27\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m hashbrown v0.16.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m sharded-slab v0.1.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m textwrap v0.16.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m deranged v0.5.8\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m saphyr-parser v0.0.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m supports-color v3.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m same-file v1.0.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m webpki-roots v0.26.11\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m netsuke v0.1.0 (D:\\a\\netsuke\\netsuke)\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m digest v0.10.7\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m flate2 v1.1.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m url v2.5.8\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m backtrace-ext v0.2.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tracing-log v0.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m miette-derive v7.6.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m terminal_size v0.4.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m nu-ansi-term v0.50.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m thread_local v1.1.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m nohash-hasher v0.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ryu-js v1.0.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m cpufeatures v0.2.17\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m supports-hyperlinks v3.2.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m either v1.15.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unit-prefix v0.5.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m unicode-width v0.1.14\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m supports-unicode v3.0.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m memo-map v0.3.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m smallvec v2.0.0-alpha.12\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ryu v1.0.23\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m minijinja v2.19.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m miette v7.6.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde-saphyr v0.0.6\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m itertools v0.12.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m indicatif v0.18.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m serde_json_canonicalizer v0.3.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m sha2 v0.10.9\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m tracing-subscriber v0.3.23\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ureq v2.12.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m time v0.3.47\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m walkdir v2.5.0\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m lru v0.16.4\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m semver v1.0.28\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m glob v0.3.3\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m ninja_env v0.1.0 (D:\\a\\netsuke\\netsuke\\ninja_env)\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m wait-timeout v0.2.1\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m sys-locale v0.3.2\n\u{1b}[1m\u{1b}[32m   Compiling\u{1b}[0m shell-quote v0.7.2\n\u{1b}[0m\u{1b}[1m\u{1b}[38;5;9merror\u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;15m: use of deprecated method `minijinja::Template::<'env, 'source>::eval_to_state`: use render_captured instead\u{1b}[0m\n\u{1b}[0m   \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m--> \u{1b}[0m\u{1b}[0mD:\\a\\netsuke\\netsuke\\src\\manifest\\jinja_macros\\cache.rs:132:30\u{1b}[0m\n\u{1b}[0m    \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m|\u{1b}[0m\n\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m132\u{1b}[0m\u{1b}[0m \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m|\u{1b}[0m\u{1b}[0m \u{1b}[0m\u{1b}[0m        let state = template.eval_to_state(()).with_context(|| {\u{1b}[0m\n\u{1b}[0m    \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m|\u{1b}[0m\u{1b}[0m                              \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;9m^^^^^^^^^^^^^\u{1b}[0m\n\u{1b}[0m    \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m|\u{1b}[0m\n\u{1b}[0m    \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m= \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;15mnote\u{1b}[0m\u{1b}[0m: `-D deprecated` implied by `-D warnings`\u{1b}[0m\n\u{1b}[0m    \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;14m= \u{1b}[0m\u{1b}[0m\u{1b}[1m\u{1b}[38;5;15mhelp\u{1b}[0m\u{1b}[0m: to override `-D warnings` add `#[allow(deprecated)]`\u{1b}[0m\n\n\u{1b}[1m\u{1b}[31merror\u{1b}[0m\u{1b}[1m:\u{1b}[0m could not compile `netsuke` (lib) due to 1 previous error\n" }
Error: Process completed with exit code 1.

@coderabbitai

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

Use `render_captured` for manifest macro state retention so newer
MiniJinja releases compile cleanly with warnings denied.
@leynos
Copy link
Copy Markdown
Owner

leynos commented May 8, 2026

@coderabbitai will the clap_mangen flow still be supported after this change? If not, please ensure that the instructions give the option of using the clap_mangen flow where cargo orthohelp is not yet available.

## Fix: remove embedded man-page discovery from `rust-build-release` in `leynos/shared-actions`

### Context

The Netsuke release workflow (`build-and-package.yml`) migrated from `clap_mangen`
(which wrote to `target/generated-man/<target>/release/`) to `cargo-orthohelp`
(which writes to `target/orthohelp/<target>/release/man/man1/`). `build.rs` no
longer generates man pages.

The composite action `leynos/shared-actions/.github/actions/rust-build-release`
at the commit currently pinned in `build-and-package.yml` contains an inline
shell step — executed immediately after `cross build` — that searches for the
man page at the OLD `target/generated-man/` and Cargo `OUT_DIR` paths. Because
neither exists any more, the step fails with:

```
Error:  man page not found at target/generated-man/x86_64-unknown-linux-gnu/release/netsuke.1
        or under target/x86_64-unknown-linux-gnu/release/build/*/out/
```

This failure occurs **before** the workflow's `Generate release help` step runs,
so the new `target/orthohelp/…/man/man1/netsuke.1` is never created in time.

### Required changes

#### 1. `leynos/shared-actions/.github/actions/rust-build-release/action.yml`
   (or whichever file within that composite action holds the inline shell step)

Locate the shell step that:
- constructs `stable_man_path="target/generated-man/<target>/release/<bin>.1"`
- falls back to searching `target/<target>/release/build/*/out/`
- errors out with "man page not found"

**Remove the entire man-page discovery block from this step.** The composite
action's responsibility is to produce the release binary. Man-page location,
staging, and validation are the workflow's responsibility (via
`generate-release-help.sh` and `stage-release-artefacts`).

If the step also copies the man page to a `dist/` directory or exports a
`man-path` output, remove that behaviour too. Callers that need a staged
man-page path must use `stage-release-artefacts`.

After removal the step should only:
- identify `os` and `arch` from the target triple
- verify the release binary exists at `target/<target>/release/<bin>`
- create the `dist/<bin>_<os>_<arch>/` staging directory
- copy the binary into it

#### 2. `leynos/netsuke/.github/workflows/build-and-package.yml`

Update the SHA pin on every `uses:` line that references
`leynos/shared-actions/.github/actions/rust-build-release` (and,
if also updated in the same shared-actions commit,
`stage-release-artefacts`, `linux-packages`, `windows-package`, and
`macos-package`) to the new commit hash produced by step 1.

Keep all other workflow structure (generate-release-help step order,
`stage-release-artefacts` inputs) unchanged.

#### 3. Validate in `leynos/shared-actions`

In `leynos/shared-actions`, confirm there are no other composite actions or
reusable workflows that reference `target/generated-man` or
`target/<target>/release/build/*/out/` as a man-page source. Remove any
remaining references.

#### 4. Validate in `leynos/netsuke`

Run the following gates sequentially after updating the pin:

```bash
make check-fmt 2>&1 | tee /tmp/check-fmt-shared-actions-pin.out
make markdownlint 2>&1 | tee /tmp/markdownlint-shared-actions-pin.out
make lint 2>&1 | tee /tmp/lint-shared-actions-pin.out
make test 2>&1 | tee /tmp/test-shared-actions-pin.out
```

All four must pass. In particular, confirm that the tests in
`tests/workflow_build_and_package.rs` that assert `target/generated-man` is
absent from the workflow still pass, and that the contract tests asserting
`"target/orthohelp/${{ inputs.target }}/release"` is present still pass.

codescene-delta-analysis[bot]

This comment was marked as outdated.

@coderabbitai

This comment was marked as resolved.

Keep manifest macro examples and safety notes aligned with
`Template::render_captured`, which replaces the deprecated
`eval_to_state` API in MiniJinja.

Avoid an unfulfilled Clippy expectation on the macro state guard so the
strict warning policy remains clean.
codescene-delta-analysis[bot]

This comment was marked as outdated.

leynos added 2 commits May 8, 2026 03:07
Pin Netsuke workflows to the shared-actions commit that adds `skip-man-page-discovery` and pass the opt-out to the `rust-build-release` call.

Extend the build-and-package workflow test so every `rust-build-release` step must opt out of embedded man-page discovery while release help remains generated under `target/orthohelp`.
Pin every `leynos/shared-actions` workflow reference to
`67025f53e79b821327d2f4d48a2af488cca42803` so CI, packaging, and release
jobs use the same shared action revision.
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner

leynos commented May 10, 2026

@coderabbitai Please suggest a fix for this issue and supply a prompt for an AI coding agent to enable it to apply the fix. Include the file and symbol names indicated in the issue at the head of your response.

tests/workflow_build_and_package.rs

Comment on lines +41 to +64

fn rust_build_release_step_blocks(contents: &str) -> Vec<String> {
    let mut blocks = Vec::new();
    let mut current_block = Vec::new();

    for line in contents.lines() {
        if line.starts_with("      - ") && !current_block.is_empty() {
            let block = current_block.join("\n");
            if block.contains("rust-build-release@") {
                blocks.push(block);
            }
            current_block.clear();
        }
        current_block.push(line);
    }

    if !current_block.is_empty() {
        let block = current_block.join("\n");
        if block.contains("rust-build-release@") {
            blocks.push(block);
        }
    }

    blocks
}

❌ New issue: Bumpy Road Ahead
rust_build_release_step_blocks has 2 blocks with nested conditional logic. Any nesting of 2 or deeper is considered. Threshold is 2 blocks per function

@coderabbitai

This comment was marked as resolved.

@leynos
Copy link
Copy Markdown
Owner

leynos commented May 10, 2026

@coderabbitai are the cargo orthohelp generated manpage and MAML help correctly bundled in the Linux .deb/.rpm packages and Windows .msi respectively?

@coderabbitai

This comment was marked as resolved.

Move the repeated rust-build-release step block flush logic into a small
helper so the workflow contract test keeps the same behaviour with less
nested conditional logic.
codescene-delta-analysis[bot]

This comment was marked as outdated.

Add the release staging configuration consumed by the shared staging
action so Linux and macOS targets publish the generated man page and
Windows targets upload PowerShell help sidecars.

Teach GoReleaser to gzip the orthohelp man page when a pre-staged copy
is not already present, and extend workflow/staging contract tests for
the generated help outputs.
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos
Copy link
Copy Markdown
Owner

leynos commented May 12, 2026

@coderabbitai re:

Windows MSI — MAML help

By the execplan's own decision, MAML is not bundled in the MSI. The windows-package shared action accepts no PowerShell help inputs. Instead, MAML files are intended as sidecar release artefacts uploaded via ${{ steps.stage_paths.outputs.artifact_dir }}. That path is also sourced from the missing release-staging.toml, so the MAML sidecars are likewise not reaching the release artefacts.

Is this something we should add to shared-actions? If so, please provide a detailed agent prompt for support of this for an agent working in the leynos/shared-actions repository.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 12, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== build-and-package.yml full ==="
fd -e yml -e yaml build-and-package --exec cat {}

echo "=== generate-release-help.sh ==="
fd -e sh generate-release-help --exec cat {}

echo "=== execplan ==="
fd cargo-orthohelp-adoption.md --exec cat {}

echo "=== Any reference to stage-release-artefacts in yml files ==="
rg -n "stage-release-artefacts\|windows-package\|artifact_dir\|man.path\|MAML\|maml\|psm1\|psd1\|ps1xml\|orthohelp" --type yaml -C 3

echo "=== Any packaging or staging scripts ==="
fd -e sh -e py . scripts --exec cat {}

echo "=== release-staging.toml if it exists ==="
fd release-staging --exec cat {}

echo "=== workflow_build_and_package tests ==="
fd workflow_build_and_package.rs --exec cat {}

Length of output: 49558


@leynos: Yes — but with a narrow scope. The sidecar route via artifact_dir is the right and already-approved vehicle (per the execplan's Decision Log). The MAML files declared in release-staging.toml under a Windows target section are collected into artifact_dir by stage-release-artefacts and uploaded by the Windows artefact upload step. No MSI changes are needed or wanted here.

What leynos/shared-actions is missing is a powershell_help_dir output from stage-release-artefacts — a convenience output analogous to man_path that surfaces the staged PowerShell module directory, so that a future windows-package enhancement can consume it without a schema renegotiation. Add that output now, document it, and confirm Windows-target-conditional artefact support in the TOML schema. That is the bounded, forwards-compatible change.


## Enhance `stage-release-artefacts` in `leynos/shared-actions` to expose a `powershell_help_dir` output

### Context

`stage-release-artefacts` reads a caller-supplied TOML configuration file and
stages release artefacts into `artifact_dir`. It already exposes `binary_path`,
`license_path`, and `man_path` as named outputs. Callers that generate
PowerShell MAML sidecar files (e.g. Netsuke via `cargo-orthohelp`) declare them
as individual Windows-target-specific artefacts in their staging TOML, and those
files flow into `artifact_dir` and are uploaded alongside the binary.

What is absent is a dedicated `powershell_help_dir` output — a path to the
staged PowerShell module directory within `artifact_dir`. Providing this output
now decouples future callers from having to reconstruct the path themselves, and
allows a future `windows-package` enhancement to optionally embed the MAML
module in the MSI without a schema renegotiation.

**Do NOT embed MAML in the Windows MSI in this change.** The execplan decision
is to ship MAML as sidecar release artefacts. This change only adds the output
and documentation.

### Required changes in `leynos/shared-actions`

#### 1. `stage-release-artefacts` — action inputs

Confirm the existing TOML schema already supports target-conditional artefacts
of the form:

```toml
[targets.windows]
artefacts = [
  { source = "target/orthohelp/{target}/release/powershell/{module}/{module}.psm1",
    dest   = "{module}/{module}.psm1" },
  # … further entries …
]
```

If `required = false` is not yet supported as a per-artefact key (to allow
graceful no-op when the file does not exist on non-Windows runners), add it.
The staging logic must skip entries whose `source` is absent when
`required = false`; it must still error when `required` is omitted or `true`.

#### 2. `stage-release-artefacts` — action outputs

Add a new output:

```yaml
outputs:
  # …existing outputs…
  powershell_help_dir:
    description: >
      Absolute path to the staged PowerShell module directory within
      artifact_dir, if any PowerShell artefacts were staged. Empty string
      when no PowerShell artefacts are present (e.g. on Linux and macOS
      targets). Callers must guard on this being non-empty before use.
    value: ${{ steps.resolve_paths.outputs.powershell_help_dir }}
```

#### 3. `stage-release-artefacts` — path resolution logic

In the step that resolves output paths (adjust to match the real step name),
detect the PowerShell module directory after staging. The heuristic is:
examine all staged artefacts whose destination path contains `/` and whose
first path component matches a known module-name pattern (e.g. `[A-Z][A-Za-z]+`).
The `powershell_help_dir` output should be the absolute path of
`artifact_dir/<module-name>` if any such artefact was staged, or an empty
string otherwise.

A simpler alternative — acceptable if the action already receives a
`ps-module-name` input — is to accept an optional `ps-module-name` input
and output `$artifact_dir/$ps_module_name` when non-empty:

```yaml
inputs:
  ps-module-name:
    description: >
      Name of the PowerShell module staged as a release sidecar (e.g.
      'Netsuke'). When provided, powershell_help_dir is set to
      artifact_dir/<ps-module-name>. Leave empty for non-Windows targets.
    required: false
    default: ''
```

Choose whichever approach fits the action's existing architecture. Document
the chosen approach in the action's README.

#### 4. `stage-release-artefacts` — README

Add a section "PowerShell MAML sidecar artefacts" to the action README. It
must document:

- Declare individual PowerShell files as `[[targets.windows.artefacts]]`
  entries with `required = false` so the staging step is a no-op on
  Linux/macOS runners.
- Use the `powershell_help_dir` output to obtain the absolute path of the
  staged module directory, guarding on it being non-empty before passing it
  to downstream steps.
- State explicitly that MAML is NOT currently embedded in the Windows MSI.
  If MSI embedding is required, open a separate issue against
  `windows-package`.

Include a complete worked example TOML block for a module named `MyTool`:

```toml
[targets.windows]
artefacts = [
  { source = "target/orthohelp/{target}/release/powershell/MyTool/MyTool.psm1",
    dest = "MyTool/MyTool.psm1", required = false },
  { source = "target/orthohelp/{target}/release/powershell/MyTool/MyTool.psd1",
    dest = "MyTool/MyTool.psd1", required = false },
  { source = "target/orthohelp/{target}/release/powershell/MyTool/en-US/MyTool-help.xml",
    dest = "MyTool/en-US/MyTool-help.xml", required = false },
  { source = "target/orthohelp/{target}/release/powershell/MyTool/en-US/about_MyTool.help.txt",
    dest = "MyTool/en-US/about_MyTool.help.txt", required = false },
]
```

And the corresponding workflow wiring:

```yaml
- uses: leynos/shared-actions/.github/actions/stage-release-artefacts@<sha>
  id: stage_paths
  with:
    config-file: .github/release-staging.toml
    target: ${{ inputs.target }}
    bin-name: ${{ env.BIN_NAME }}
    ps-module-name: ${{ inputs.platform == 'windows' && 'MyTool' || '' }}
    normalize-windows-paths: ${{ inputs.platform == 'windows' }}

- name: Upload Windows sidecar artefacts
  if: inputs.platform == 'windows'
  uses: actions/upload-artifact@…
  with:
    name: netsuke-windows-sidecar
    path: ${{ steps.stage_paths.outputs.artifact_dir }}
```

#### 5. Tests

Add integration tests for `stage-release-artefacts` (using whatever test
framework the action already uses) covering:

- A Windows target with four PowerShell artefacts present: all four are staged
  into `artifact_dir`; `powershell_help_dir` equals `artifact_dir/MyTool`.
- A Linux target with `required = false` PowerShell entries and files absent:
  staging succeeds; `powershell_help_dir` is empty string.
- A Windows target where a `required = true` (or omitted) PowerShell artefact
  is absent: staging fails with a clear error referencing the missing path.
- `ps-module-name` left empty: `powershell_help_dir` is empty string regardless
  of what artefacts are staged.

#### 6. Do not change `windows-package`

`windows-package` must not receive a `powershell_help_dir` input in this
change. MSI embedding of MAML is a separate decision. Record a `TODO` comment
in `windows-package/action.yml` noting the gap:

```yaml
# TODO: add optional ps-help-dir input to embed MAML module in MSI.
# See: https://github.com/leynos/shared-actions/issues/<N>
# Decision: currently shipped as sidecar release artefacts via artifact_dir.
```

Open a follow-up issue in `leynos/shared-actions` titled
"windows-package: optionally embed PowerShell MAML module in MSI" describing
the future enhancement, referencing this change, and marking it `enhancement`.

### Validation

```bash
# In leynos/shared-actions
make test   2>&1 | tee /tmp/shared-actions-test-powershell-help-dir.out
make lint   2>&1 | tee /tmp/shared-actions-lint-powershell-help-dir.out
```

Both must pass. Confirm:

```bash
grep -r 'powershell_help_dir' .github/actions/stage-release-artefacts/
```

Returns at least the `action.yml` output declaration and the README example.

Confirm that no reference to `windows-package` was modified to accept a
PowerShell help directory.

After updating the pin in `leynos/netsuke`, run:

```bash
make check-fmt     2>&1 | tee /tmp/check-fmt-ps-help-dir-pin.out
make markdownlint  2>&1 | tee /tmp/markdownlint-ps-help-dir-pin.out
make lint          2>&1 | tee /tmp/lint-ps-help-dir-pin.out
make test          2>&1 | tee /tmp/test-ps-help-dir-pin.out
```

All four must pass.

Update shared-action pins to the revision that exposes
`powershell_help_dir` from `stage-release-artefacts`.

Wire Netsuke's Windows staging through `ps-module-name` and stage the
PowerShell sidecar module at the module directory root so downstream steps
can consume the new output without passing it into `windows-package`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant