Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
e40a0c9
quest: open the tooling line
kixelated Sep 24, 2026
5dda936
chore(just): thin justfiles with one impact map (#4058)
kixelated Sep 25, 2026
e00ec3f
Merge origin/main into quest/m1/tooling/README
kixelated Sep 25, 2026
f5eeab4
Merge origin/main into quest/m1/tooling/README
kixelated Sep 25, 2026
c5000be
chore(ci): every workflow step runs a just recipe (#4098)
kixelated Sep 25, 2026
87f5981
Merge origin/main into quest/m1/tooling/README
kixelated Sep 25, 2026
ad8f166
Merge origin/main into quest/m1/tooling/README
kixelated Sep 25, 2026
3934889
chore(ci): moq-cli and moq-relay share one reusable release workflow …
kixelated Sep 25, 2026
e1997df
chore(ci): the moq-ffi releases share one reusable build workflow (#4…
kixelated Sep 25, 2026
3b76b64
quest(tooling): scoped checks refuse a host toolchain (#4176)
kixelated Sep 25, 2026
c53f1a8
chore(just): scoped checks refuse a host toolchain (#4269)
kixelated Sep 27, 2026
c5dea33
Merge origin/main into quest/m1/tooling/README
kixelated Sep 28, 2026
5e83656
quest: point moq-installer at the tooling line for the binary release…
kixelated Sep 28, 2026
3962b0e
Merge origin/main into quest/m1/tooling/README
kixelated Sep 28, 2026
e0b0b7a
Merge origin/main into quest/m1/tooling/README
kixelated Sep 29, 2026
32a69f9
chore(quest): scope check.yml from the impact map
kixelated Sep 29, 2026
8c18b66
chore(quest): claim forward-args
kixelated Sep 29, 2026
11c16fb
fix(just): forward recipe arguments without re-splitting them
kixelated Sep 29, 2026
82d9617
quest(tooling/check-scope): claim
kixelated Sep 29, 2026
74dc6df
quest(tooling/demo-scripts): claim
kixelated Sep 29, 2026
a533d36
refactor(demo): move recipe logic into sh/demo scripts
kixelated Sep 29, 2026
fefa63c
ci: scope check.yml from the dispatch impact map
kixelated Sep 29, 2026
d86da23
Merge pull request #4540 from moq-dev/quest/m1/tooling/forward-args
kixelated Sep 29, 2026
657e0dc
ci: drop check.yml's Scope steps; always set up
kixelated Sep 29, 2026
717d942
Merge branch 'quest/m1/tooling/README' into quest/m1/tooling/check-scope
kixelated Sep 29, 2026
b597c0f
Merge branch 'quest/m1/tooling/README' into quest/m1/tooling/demo-scr…
kixelated Sep 29, 2026
23882d8
fix(demo): a signal ends hls.sh instead of resuming its waits
kixelated Sep 30, 2026
57e5c96
Merge pull request #4547 from moq-dev/quest/m1/tooling/demo-scripts
kixelated Sep 30, 2026
ba730b5
Merge remote-tracking branch 'origin/quest/m1/tooling/README' into tm…
kixelated Sep 30, 2026
a7b3a70
Merge pull request #4548 from moq-dev/quest/m1/tooling/check-scope
kixelated Sep 30, 2026
5970238
Merge remote-tracking branch 'origin/main' into quest/m1/tooling/README
kixelated Sep 30, 2026
e4a47b8
Merge origin/main into quest/m1/tooling/README; finish the line
kixelated Sep 30, 2026
5ba7bee
ci: main's new steps run through recipes
kixelated Sep 30, 2026
1f906b1
Merge remote-tracking branch 'origin/main' into quest/m1/tooling/README
kixelated Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/actions/just/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Install just
description: Install the pinned just for jobs outside the nix dev shell, which already provides it.

runs:
using: composite
steps:
# A checksum-verified prebuilt, so it costs seconds rather than a
# `cargo install`. Keep the version in step with nixpkgs' just in flake.lock.
- uses: taiki-e/install-action@4cef1412cce204788f482e778a0b9187f9626a29 # v2.87.21
with:
tool: just@1.58.0
49 changes: 38 additions & 11 deletions .github/justfile
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
set fallback
set working-directory := '..'

# actionlint is skipped when absent locally; the root `_tools` preflight makes
# it a hard requirement under MOQ_STRICT, so CI can't skip it.

# Lint GitHub Actions workflows.
# Lint GitHub Actions workflows, their alert coverage, and that every step runs a recipe.
check:
python3 {{ source_directory() }}/scripts/install-formula.test.py
{{ source_directory() }}/scripts/release.test.sh
@if command -v nfpm >/dev/null 2>&1 && command -v envsubst >/dev/null 2>&1 && command -v dpkg-deb >/dev/null 2>&1 && command -v rpm >/dev/null 2>&1; then python3 {{ source_directory() }}/../rs/scripts/package-rename.test.py; fi
@if command -v actionlint >/dev/null 2>&1; then actionlint; fi
{{ source_directory() }}/scripts/alert.sh check-coverage
@if command -v rustc >/dev/null 2>&1; then {{ source_directory() }}/scripts/package-binary.test.sh; fi
actionlint
sh/gh/alert.sh check-coverage
bun sh/gh/check-runs.ts

# Tests of the release tooling itself; nightly, not on every pull request.
test:
python3 sh/gh/install-formula.test.py
sh/gh/release.test.sh
python3 sh/rs/package-rename.test.py
sh/go/publish-wrapper.test.sh
bash .claude/hooks/direnv.test.sh

# Release workflow helpers, e.g. `just gh release parse-version moq-cli`.
[positional-arguments]
release *args:
sh/gh/release.sh "$@"

# Post a failed run to Discord, or check that alert.yml covers every workflow.
[positional-arguments]
alert *args:
sh/gh/alert.sh "$@"

# Render a Homebrew formula template for a release.
[positional-arguments]
formula *args:
sh/gh/render-formula.sh "$@"

# Copy a rendered formula into a Homebrew tap checkout, migrating renamed formulae.
[positional-arguments]
install-formula *args:
python3 sh/gh/install-formula.py "$@"

# Trigger the apt-repo and rpm-repo workflows for a release tag.
[positional-arguments]
trigger-repo-publish *args:
sh/gh/trigger-repo-publish.sh "$@"
72 changes: 0 additions & 72 deletions .github/scripts/package-binary.test.sh

This file was deleted.

4 changes: 3 additions & 1 deletion .github/workflows/alert.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ jobs:
with:
persist-credentials: false

- uses: ./.github/actions/just

- name: Post to Discord
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
Expand All @@ -91,4 +93,4 @@ jobs:
RUN_REF: ${{ github.event.workflow_run.head_branch }}
RUN_TITLE: ${{ github.event.workflow_run.display_title }}
RUN_ACTOR: ${{ github.event.workflow_run.triggering_actor.login }}
run: .github/scripts/alert.sh discord
run: just gh alert discord
10 changes: 2 additions & 8 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ concurrency:

env:
CARGO_NDK_VERSION: 4.1.2
JUST_VERSION: 1.52.0

jobs:
android:
Expand All @@ -74,15 +73,10 @@ jobs:

# No Rust cache: this workflow only runs on pull requests, which may not
# save one, so it would have nothing to restore.
- uses: ./.github/actions/just

- name: Install cargo-ndk
run: cargo install --locked "cargo-ndk@$CARGO_NDK_VERSION"

# A checksummed release binary, where `cargo install` would spend ~2 minutes
# building just from source.
- name: Install just
uses: taiki-e/install-action@4cef1412cce204788f482e778a0b9187f9626a29 # v2.87.21
with:
tool: just@${{ env.JUST_VERSION }}

- name: Check
run: just rs android
5 changes: 3 additions & 2 deletions .github/workflows/apt-repo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ jobs:
with:
persist-credentials: false

- uses: ./.github/actions/just

- name: Set up packaging tools
uses: ./.github/actions/setup-packaging

Expand All @@ -53,10 +55,9 @@ jobs:
- name: Publish to R2
shell: bash
env:
ARTIFACTS_DIR: artifacts
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
run: ./infra/apt/publish.sh
run: just infra apt publish "$GITHUB_WORKSPACE/artifacts"
39 changes: 5 additions & 34 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,7 @@ jobs:
# Full history so `just ci check` can diff against origin/$GITHUB_BASE_REF.
fetch-depth: 0

# Quests, agent config, and root Markdown compile nothing, so a diff of only
# those skips the disk cleanup and Rust cache that exist for the build.
- name: Scope
id: scope
run: |
base=$(git merge-base "origin/$GITHUB_BASE_REF" HEAD)
files=$(git diff --name-only "$base")
if grep -qvE '^(quest/|\.claude/|[^/]+\.md$)' <<< "$files"; then
echo build=true >> "$GITHUB_OUTPUT"
fi

- name: Free disk space
if: steps.scope.outputs.build
uses: jlumbroso/free-disk-space@ceedf095f4ec1a097402bc6bd80831f2e1a6fde6 # main
with:
tool-cache: false
Expand All @@ -75,20 +63,19 @@ jobs:
# scope such an entry to the PR's own branch anyway, where no later PR
# could read it while it ate the repository's 10 GB budget.
- name: Rust cache
if: steps.scope.outputs.build
uses: ./.github/actions/rust-cache

# The same recipe a developer runs locally. It diffs against
# origin/$GITHUB_BASE_REF and touches only the packages this PR changed
# plus their dependents, so a one-crate PR compiles one crate.
# plus their dependents, so a one-crate PR compiles one crate and a
# quest-only PR runs only the lints. sh/dispatch.sh's impact map is the one
# place that decides; the setup above always runs rather than keep a second
# path map here.
#
# MOQ_STRICT turns every "tool missing, skipping" guard into an error.
# Locally an absent formatter means less gets checked; here it would mean
# a green run that checked nothing, which is the failure mode worth
# spending a preflight on.
- name: Test direnv hook
run: bash .claude/hooks/direnv.test.sh

- name: Check
run: nix develop --command just ci check
env:
Expand All @@ -108,26 +95,12 @@ jobs:
# Full history so `just ci test` can diff against origin/$GITHUB_BASE_REF.
fetch-depth: 0

# Same scope as the `check` job. No test covers those files either, so the
# job skips everything and reports green instead of spending a minute of
# setup to run nothing.
- name: Scope
id: scope
run: |
base=$(git merge-base "origin/$GITHUB_BASE_REF" HEAD)
files=$(git diff --name-only "$base")
if grep -qvE '^(quest/|\.claude/|[^/]+\.md$)' <<< "$files"; then
echo build=true >> "$GITHUB_OUTPUT"
fi

- name: Free disk space
if: steps.scope.outputs.build
uses: jlumbroso/free-disk-space@ceedf095f4ec1a097402bc6bd80831f2e1a6fde6 # main
with:
tool-cache: false

- if: steps.scope.outputs.build
uses: DeterminateSystems/nix-installer-action@1d87d45818068401a10cf16bdc5f00b24994a83f # main
- uses: DeterminateSystems/nix-installer-action@1d87d45818068401a10cf16bdc5f00b24994a83f # main
with:
determinate: false
# Trust the flake's cachix substituter. `nixConfig` in flake.nix is
Expand All @@ -142,13 +115,11 @@ jobs:

# Restore only, same as the `check` job above.
- name: Rust cache
if: steps.scope.outputs.build
uses: ./.github/actions/rust-cache

# NEXTEST_PROFILE picks up the longer hang timeout in .config/nextest.toml;
# without it a runner under load could trip the local one.
- name: Test
if: steps.scope.outputs.build
run: nix develop --command just ci test
env:
MOQ_STRICT: 1
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ jobs:
with:
persist-credentials: false

- uses: ./.github/actions/just

- id: parse
env:
CRATE: ${{ inputs.package }}
Expand All @@ -58,7 +60,7 @@ jobs:
*) package="$crate" ;;
esac
echo "package=${package}" >> "$GITHUB_OUTPUT"
.github/scripts/release.sh parse-version "$crate"
just gh release parse-version "$crate"

build:
name: Build ${{ matrix.platform }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/interop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ on:
- "test/justfile"
- "package.json"
# The Go client builds against the modules this script stages.
- "go/scripts/**"
- "sh/go/**"
- ".github/workflows/interop.yml"

concurrency:
Expand Down
Loading
Loading