Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/cache.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ jobs:
# and the test artifacts (codegen + linked test binaries). They share
# little, and a PR usually needs both.
- name: Check
run: nix develop --command just check-all
run: nix develop --command just check --all
env:
MOQ_STRICT: 1

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ jobs:
shell: bash -leo pipefail {0}

- name: Smoke (full matrix)
run: nix develop --command just test smoke-full
run: nix develop --command just test smoke --all
shell: bash -leo pipefail {0}

- name: Negative control
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# Claude Code scratch space. These are untracked working directories, and
# `just _changed` counts untracked files, so leaving them visible pushes the
# changed-file list past its cap and silently turns every scoped `just check`
# into `check-all`. The worktrees also carry their own biome.jsonc, which the
# into `check --all`. The worktrees also carry their own biome.jsonc, which the
# unscoped run then rejects as a nested root config.
/.claude/cache/
/.claude/tmp/
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,6 @@ These diff the branch against its base and only run the affected packages.

Any wire-format change updates its matching IETF draft in the same PR, including framing, message fields, enum values, and version negotiation. Use the feature-specific draft for extensions and validate with `just drafts check`. See `drafts/CLAUDE.md`.

For wire, `moq-ffi`, or gateway changes, also run `just test smoke-full` for cross-language interop; plain `smoke` is Rust-only.
For wire, `moq-ffi`, or gateway changes, also run `just test smoke --all` for cross-language interop; plain `smoke` is Rust-only.

When a CLI interface changes, search the whole repo for the binary name and update every example invocation, including docs and demo recipes. Check examples against `--help`.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,9 @@ just test
just fix

# Same as the above, over every package
just check-all
just check --all
just test all
just fix-all
just fix --all
```

CI runs these same two recipes, so they cover the same ground locally. It sets two things you don't: `MOQ_STRICT=1`, which turns a missing tool into an error instead of a skipped check, and `NEXTEST_PROFILE=ci`, which allows a longer hang timeout.
Expand Down
2 changes: 1 addition & 1 deletion doc/setup/dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ match CI.
| `just fix` | Format and lint the packages this branch changed. |
| `just check` | Compile and lint the same scope. This is what CI runs. |
| `just test` | Run tests for the same scope. |
| `just fix-all`, `just check-all`, `just test all` | The same, over every package. |
| `just fix --all`, `just check --all`, `just test all` | The same, over every package. |
| `just pub bbb <url>` | Publish Big Buck Bunny (also `tos`, `clock`, `gst`, `hls`). |
| `just sub gst bbb <url>` | Play a broadcast through GStreamer. |
| `just relay` | Run a local relay on its own. |
Expand Down
108 changes: 48 additions & 60 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ _changed-test $LIMIT=changed_max:
fail() { echo "changed: _changed-test: $1" >&2; exit 1; }

# Synthetic sizes rather than whatever the working tree happens to hold: a
# clean checkout has no diff at all, and `check-all` runs there (cache.yml
# clean checkout has no diff at all, and `check --all` runs there (cache.yml
# warms the cache from `main`), so a test keyed on the real list would take
# down the one job allowed to write the shared Rust cache.
[[ "$(printf 'aaaa' | just _changed-cap 3)" == ALL ]] || fail "over budget must print ALL"
Expand Down Expand Up @@ -424,7 +424,7 @@ _echo $VALUE:
# Required per scope, mirroring what `check` actually dispatches for a given
# diff: demanding gradle on a docs-only PR would fail a run that was never going
# to invoke it. Takes the same file list as the dispatch, or `ALL` to require
# everything (`check-all`).
# everything (`check --all`).
#
# One deliberate absence: swift exists only on macOS, and `swift check` skips
# off-macOS by design; swift.yml is its real gate.
Expand Down Expand Up @@ -480,36 +480,49 @@ _tools $FILES="":
# Lints and compiles only the packages the branch changed plus everything
# depending on them, so several worktrees can build at once. This is also what
# CI runs (with MOQ_STRICT=1), so there is no second, drifting definition of
# "checked". Tests are the sibling `just test`; `check-all` is the unscoped suite.
# "checked". Tests are the sibling `just test`; `check --all` is the unscoped suite.

# Lint and compile what the branch changed since BASE, plus its dependents.
check $BASE="":
check $BASE="" *args:
#!/usr/bin/env bash
set -euo pipefail

files=$(just _changed "$BASE")
if [[ "$BASE" == --all ]]; then
files=ALL
else
files=$(just _changed "$BASE")
fi

# `_changed` says ALL when the list outgrew what argv can carry. The unscoped
# suite is the path that passes no list at all, so it is the one that works.
if [[ "$files" == ALL ]]; then
just check-all
exit 0
fi

just _tools "$files"

# The dispatch below lives in these two files, and neither matches any
# language scope, so a PR that rewrites how CI dispatches would otherwise
# validate none of it. Hand off to the unscoped suite instead.
if grep -qE '^(justfile|test/justfile)$' <<< "$files"; then
echo "check: root orchestration changed; checking everything." >&2
just check-all
exit 0
# validate none of it. Widen to the unscoped suite instead.
if [[ "$files" != ALL ]] && grep -qE '^(justfile|test/justfile)$' <<< "$files"; then
echo "check: root orchestration changed; checking everything." >&2
files=ALL
fi

# An empty list means "force-run" to the per-lang recipes, which is the
# wrong semantic here, so don't dispatch at all.
if [[ -n "$files" ]]; then
just _tools "$files"

if [[ "$files" == ALL ]]; then
just js check
just drafts check
just rs check --workspace --exclude moq-net-fuzz {{ args }}
just rs tokio-features
just --justfile bench/justfile check
cargo run --quiet --locked --package quest -- check
# Not covered by the line above: moq-wasm only exists on the wasm32 target.
just rs wasm
just py check
just kt check
just swift check
just go check
just dart check
just obs check
just obs compile
just _flake
elif [[ -n "$files" ]]; then
just js check "$files"
just rs check-changed "$files"
if echo "$files" | grep -q '^bench/'; then
Expand Down Expand Up @@ -560,27 +573,6 @@ check $BASE="":

just _check-common

# Check every package in every language, plus moq-wasm.
check-all *args:
just _tools ALL
just js check
just drafts check
just rs check --workspace --exclude moq-net-fuzz {{ args }}
just rs tokio-features
just --justfile bench/justfile check
cargo run --quiet --locked --package quest -- check
# Not covered by the line above: moq-wasm only exists on the wasm32 target.
just rs wasm
just py check
just kt check
just swift check
just go check
just dart check
just obs check
just obs compile
just _flake
just _check-common

# Skips when nix is absent: the flake is not a precondition for working on the
# repo, and `_tools` already makes it required under MOQ_STRICT.

Expand All @@ -589,7 +581,7 @@ check-all *args:
_flake:
@if command -v nix >/dev/null 2>&1; then nix flake check; fi

# Repository-wide non-compiling checks shared by `check` and `check-all`.
# Repository-wide non-compiling checks shared by scoped and unscoped `check`.
# Optional shell, workflow, TOML, Nix, and justfile lints skip if missing.
#
# `bun install` because remark-cli lives in node_modules and `just js check` is
Expand Down Expand Up @@ -745,7 +737,7 @@ _markdown-test:

echo "markdown: check/fix regression ok"

# Repository-wide lints, shared by `check` and `check-all`.
# Repository-wide lints, shared by scoped and unscoped `check`.
[private]
_check-common:
just _changed-test
Expand All @@ -759,22 +751,27 @@ _check-common:
just gh check

# Scoped exactly like `check`, because `clippy --fix` compiles what it fixes.
# `fix-all` is the unscoped version.
# Pass `--all` for the unscoped version.

# Auto-fix lint and formatting for what the branch changed since BASE.
fix $BASE="":
#!/usr/bin/env bash
set -euo pipefail

files=$(just _changed "$BASE")
if [[ "$BASE" == --all ]]; then
files=ALL
else
files=$(just _changed "$BASE")
fi

# Mirrors `check`: too long for argv means fix everything instead.
if [[ "$files" == ALL ]]; then
just fix-all
exit 0
fi

if [[ -n "$files" ]]; then
just js fix
just rs fix --workspace --exclude moq-net-fuzz
just py fix
just dart fix
just obs fix
elif [[ -n "$files" ]]; then
just js fix "$files"
just rs fix-changed "$files"
just py fix "$files"
Expand All @@ -788,19 +785,10 @@ fix $BASE="":

just _fix-common

# Auto-fix every JavaScript workspace and every default Rust member.
fix-all:
just js fix
just rs fix --workspace --exclude moq-net-fuzz
just py fix
just dart fix
just obs fix
just _fix-common

# Optional tools skip if missing locally. `bun install` for the same reason as
# `_check-common`.

# Repository-wide fixes, shared by `fix` and `fix-all`.
# Repository-wide fixes, shared by scoped and unscoped `fix`.
[private]
_fix-common:
bun install
Expand Down
2 changes: 1 addition & 1 deletion quest/dev/api-origin-scopes.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ cross-language binding mirror that PR explicitly left unfinished.
with `captures` on `MoqAnnounceUpdate`; `rs/libmoq`
(`moq_announce_update` gains the captures under the existing string-out
convention), the `py`, `swift`, `kt`, `dart`, and `go` wrappers,
`doc/lib/*` for each, and `just test smoke-full`.
`doc/lib/*` for each, and `just test smoke --all`.
- `announced_broadcast(path)` keeps its shape; it is the literal case.

Public API: breaking on moq-ffi, libmoq, and every binding, so on dev.
Expand Down
4 changes: 2 additions & 2 deletions quest/dev/merge-dev.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ adopts.
## Plan

main is merged into dev as of 2026-09-12, so the merge PR opens from dev with
the list below as closing keywords once the gates clear. Run `just check-all`,
`just test all`, `just test smoke-full`, and `just bench origin/main` on the
the list below as closing keywords once the gates clear. Run `just check --all`,
`just test all`, `just test smoke --all`, and `just bench origin/main` on the
merged tree, and record the revision the proof ran on.

Resolve by behavior, never by side. The traps the last main-into-dev merge
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ delayed first buffers, multiple pads, timescale conversion, numeric limits,
source restarts, idle gaps, and a system-clock adjustment. Existing timeline
records remain unchanged. Consume the prerequisite's catalog format; no new
transport TIMESTAMP/TIMESCALE semantics, synchronization protocol, or drift
correction is introduced here. Run the GStreamer CI and smoke-full lanes.
correction is introduced here. Run the GStreamer CI and `smoke --all` lanes.

## Required

Expand Down
2 changes: 1 addition & 1 deletion quest/next/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Implementation that depends on a dev contract requires
- [@moq/net additive](/quest/next/js-net-additive.md) - a live-broadcasts getter, `Table.dynamic`, credential refresh before redial, inferred `share`
- [Last frame duration](/quest/next/mux-last-frame-duration.md) - a group's final frame keeps its duration on 90 kHz and nanosecond imports
- [Snapshot clobber](/quest/next/json-modify-clobber.md) - a snapshot edit fails on a shape mismatch instead of seeding a default
- [Binding audio tests](/quest/next/binding-audio-tests.md) - every binding proves the Opus frame duration and throwing setters it exposes, and smoke-full publishes audio with an explicit config
- [Binding audio tests](/quest/next/binding-audio-tests.md) - every binding proves the Opus frame duration and throwing setters it exposes, and `smoke --all` publishes audio with an explicit config
- [Decode format](/quest/next/ffi-decode-format.md) - the C-only decode pixel format knob reaches every uniffi binding
- [JSON mutate](/quest/next/json-mutate.md) - Rust gains the closure edit JS already has, beside the guard
- [Publisher clocks](/quest/next/publisher-clock.md) - wire the shared clock through native and browser publisher restarts
Expand Down
2 changes: 1 addition & 1 deletion quest/next/auth/moq-transport.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ union without disconnecting, cancelling only work that loses authorization;
an out-of-scope new publication aborts before any PUBLISH_NAMESPACE is written; a
peer without the option (the relay built without it, and the interop runner's
reference relay) sees no AUTH stream and keeps working. Run
`just test smoke-full`.
`just test smoke --all`.

On main, additive.

Expand Down
4 changes: 2 additions & 2 deletions quest/next/binding-audio-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ consumer's. Today only Python asserts a sub-millisecond Opus frame duration
(`py/moq-rs/tests/test_local.py`), Go pins only the 20 ms default, Kotlin and
Swift never set one, no Kotlin test proves the fallible configuration setters
throw (#3642 added the Python and Swift cases and skipped `kt/`), and
`smoke-full` publishes audio from no binding with an explicit codec config.
`smoke --all` publishes audio from no binding with an explicit codec config.

## Plan

Expand All @@ -18,7 +18,7 @@ refuses a value outside the Opus set. Add a Kotlin test that a setter called
during an in-flight connect throws and the client is cancelled, mirroring
`py/moq-rs/tests/test_server.py`. Give the smoke publishers under
`test/smoke/` an Opus config with a non-default frame duration so
`just test smoke-full` exercises the audio path across bindings. Dart omits
`just test smoke --all` exercises the audio path across bindings. Dart omits
audio by design ([Dart codecs](/quest/next/dart-codecs.md)).

Public API: none. Wire: none.
Expand Down
2 changes: 1 addition & 1 deletion quest/next/check-uring-feature.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ feature for days (fixed in #3749) with every PR green.

In `rs/justfile`, `check-changed` runs the feature clippy from the nightly
`uring` recipe (`--features io-uring`, `-D warnings`, no tests) when
`_select` includes moq-relay; `check-all` already covers it through `bench
`_select` includes moq-relay; `check --all` already covers it through `bench
check`. Keep the nightly `uring` matrix for the tests. Verify by breaking the
feature on a scratch branch and watching `just check` fail on an
`rs/moq-relay` diff, and by timing the added compile on a warm cache.
Expand Down
2 changes: 1 addition & 1 deletion quest/next/cpp/package.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
`find_package(moq)` or the tarball's `moq.pc` gives a C++17 program
`<moq/moq.hpp>`, and the program publishes and subscribes through the full
moq-ffi surface with futures and `moq::expected`, `co_await`-able on C++20.
A `test/smoke/clients/cpp` client joins `just test smoke-full`, and
A `test/smoke/clients/cpp` client joins `just test smoke --all`, and
`doc/lib/cpp` documents the package the way `doc/lib/go` does Go.

## Plan
Expand Down
2 changes: 1 addition & 1 deletion quest/next/cs/package.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
with the mocking library on NuGet) gives a .NET 8 program the full moq-ffi
surface as `await`-able classes, with `runtimes/<rid>/native` libraries for
the release matrix. A `test/smoke/clients/cs` client joins `just test
smoke-full` and `doc/lib/cs` documents the package.
smoke --all` and `doc/lib/cs` documents the package.

## Plan

Expand Down
2 changes: 1 addition & 1 deletion quest/next/decoded-frames.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ fields to a published C struct is not automatically additive.
Test handle release, conversion failures, cancellation, delayed consumption,
and retained ownership through the existing libmoq/FFI test lanes. Platform
adapters own their hardware import proof. Update `moq.h`, affected wrappers,
and C/binding documentation; run `just test smoke-full` in CI.
and C/binding documentation; run `just test smoke --all` in CI.

Public API: owned frame access and conversion at the binding boundary. Wire:
none. Consume the settled main frame/output contracts without replacing them.
Expand Down
2 changes: 1 addition & 1 deletion quest/next/ffi-websocket-fallback.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ Cross-package sync from the root CLAUDE.md table, with the lines that mirror

Tests: a moq-ffi unit test that each setter lands in `config.websocket`, and a
wrapper test where the tls setter is covered today
(`py/moq-rs/tests/test_server.py`). `just test smoke-full` for the bindings.
(`py/moq-rs/tests/test_server.py`). `just test smoke --all` for the bindings.
2 changes: 1 addition & 1 deletion quest/next/flate/bindings.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ sibling. Document in `doc/lib/{c,py,swift,kt,go,dart}` beside the JSON entry.
Tests: a moq-ffi round trip next to `json_snapshot_roundtrip`, a libmoq C
round trip in `src/test.rs`, and one cross-language check that a C-published
group decodes with the shared vector from the track quest. Run
`just test smoke-full`.
`just test smoke --all`.

Public API impact: additive on moq-ffi, libmoq, and every wrapper; `main`.
Wire impact: none.
Expand Down
2 changes: 1 addition & 1 deletion quest/next/intra-refresh/bindings.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ and changes the libmoq C struct layout, so it targets `dev`.
- Hand-written wrappers and docs per the cross-package table: `py/moq-rs`,
`swift/`, `kt/`, `dart/moq`, `go/wrapper/moq`, and `doc/lib/{py,swift,kt,go,dart,c}`.
Go gets no uniffi default, so its zero value must read as keyframe mode.
- Run `just test smoke-full` for the cross-language check.
- Run `just test smoke --all` for the cross-language check.

## Required

Expand Down
2 changes: 1 addition & 1 deletion quest/next/js-fetch.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Use an in-memory application responder for verification, without OPFS or an
archive writer. A browser publisher serves a native subscriber after a group
is evicted or was never cached; verify exact group/frame replay, empty groups,
missing groups, concurrent requests, and cancellation while awaiting a reply.
Run the supported-draft matrix and `just test smoke-full` through CI.
Run the supported-draft matrix and `just test smoke --all` through CI.

Public API: a producer-side on-demand group request surface in `@moq/net`,
matching Rust's lifecycle. Wire: implement the existing supported IETF FETCH
Expand Down
2 changes: 1 addition & 1 deletion quest/next/js-hotpath/publish-audio.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Choose a group duration only from those comparisons; retain one-frame groups
if the overhead saving does not justify the latency or loss tradeoff.

Add CI regressions for final-group completion, discontinuity, late join,
reconnect, and audio delivery on stream-only sessions. Run smoke-full for the
reconnect, and audio delivery on stream-only sessions. Run `smoke --all` for the
cross-language delivery paths. Reuse the audio quality harness's metrics and
impairment fixtures when available rather than creating a second definition.

Expand Down
2 changes: 1 addition & 1 deletion quest/next/mobile/ffi-video-consumer.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ owns mobile capture; native mobile surface views remain deferred.
its usable wrapper, codec-enabled artifacts, and decode proof to Dart codec
parity. Document the temporary omission rather than shipping a stub.
- Verify on an iOS simulator and an Android emulator with the smoke media,
and on macOS through libmoq so `just test smoke-full` covers it.
and on macOS through libmoq so `just test smoke --all` covers it.

Dart codec parity requires this quest and owns the remaining Dart integration.
This quest must not require Dart artifact enablement, which would create a cycle.
Expand Down
Loading
Loading