Three things that belong together:
1. rustfmt the gamepad-new-types host files ci.yml's `cargo fmt --all
--check` gate flags (the .21/.133 verify recipes ran clippy+tests
but never fmt — the same class of miss as 69f30f30).
2. Enforce it at the source: scripts/git-hooks/{pre-commit,pre-push}
run the exact CI fmt gates (main workspace + the shipped-driver
crates of the UMDF workspace); CONTRIBUTING documents the one-time
`git config core.hooksPath scripts/git-hooks`. pre-push is the
enforcement point (plumbing commits bypass pre-commit).
3. N4 follow-up — the spike verdict FLIPS TO GO: SwDeviceProfile grows
`usb_mi`, synthesizing `&MI_02` into the Deck spike's USB hardware
ids. hidclass mirrors the parent's USB tokens into the HID child's
hardware ids, and hidapi/SDL/Steam parse `MI_` as bInterfaceNumber
(defaulting to 0 when absent — the exact gate the first run hit:
Steam wants the Deck controller on interface 2). Re-run live on
.173: Steam logs `Interface: 2`, then `!! Steam controller device
opened`, `Steam Controller reserving XInput slot 0`, and activates
a mapping — full Steam Input promotion of the software-devnode
Deck, no driver change needed. The PS identities pass
`usb_mi: None` (real single-interface devices carry no MI_ token).
A proper Windows-Deck backend phase is now justified; planned
separately.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.6 KiB
Contributing to punktfunk
Thanks for your interest in contributing!
Licensing of contributions (inbound = outbound)
punktfunk is dual-licensed under MIT OR Apache-2.0.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as MIT OR Apache-2.0, without any additional terms or conditions.
By opening a pull request you agree to license your contribution under these terms. This is the standard Rust-ecosystem "inbound = outbound" model; it keeps the project's licensing unambiguous (including the Apache-2.0 §5 contributor patent grant) and any future relicensing clean. You retain the copyright to your contributions.
Do not paste copyleft (or otherwise incompatibly-licensed) code
The single thing that could poison the permissive license is copied source from a copyleft project. Several adjacent projects (Sunshine, Apollo, Moonlight) are GPL-3.0. You may study them and reimplement a technique, protocol, or wire format — those are not copyrightable — but never paste their code, and do not translate a GPL implementation line-by-line. When a comment credits prior art, make clear it is an independent reimplementation, not a copy. The same applies to any third party's code under a license incompatible with MIT/Apache.
If you add a new third-party dependency, it must be permissive (MIT / Apache-2.0 / BSD / ISC / Zlib /
Unicode-3.0 / etc.). about.toml holds the accepted-license allow-list; regenerate the attribution
file with scripts/gen-third-party-notices.sh when the dependency tree changes.
Before you push
Enable the repo git hooks once per clone — they run the exact rustfmt gates CI runs (main workspace + the UMDF driver workspace) on every commit and push, so a push can never fail CI on formatting alone:
git config core.hooksPath scripts/git-hooks
Then the usual full pass:
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
Generated artifacts are checked in and CI fails on drift: include/punktfunk_core.h (cbindgen) and
api/openapi.json (cargo run -p punktfunk-host -- openapi). Match the surrounding code's comment
density and naming. Commit messages end with the Co-Authored-By trailer (see git log).
See the README's Build & test section and Design invariants for the full build/test/run guide, and the docs site for architecture and per-platform guides.