diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 55dee9d..5dd3ef1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,9 +14,8 @@ Use a unique request envelope and response envelope for each RPC. Run `buf lint`. Document compatibility. -The 0.1 `qsoripper.services` wire-package identifier is a compatibility -boundary. Do not rename it in place. Do not interpret it as a source -dependency. +The `cathub.services` wire-package identifier is part of the public contract. +Changing it requires a new protocol major version and a client migration plan. An operator must attend all hardware transmission tests. Automated tests must not key a physical transmitter. diff --git a/Cargo.lock b/Cargo.lock index 83b2d80..f8299fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,7 +179,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cathub" -version = "0.1.2" +version = "0.2.0" dependencies = [ "async-trait", "bytes", @@ -201,7 +201,7 @@ dependencies = [ [[package]] name = "cathub-protocol" -version = "0.1.1" +version = "0.2.0" dependencies = [ "prost", "protoc-bin-vendored", diff --git a/Cargo.toml b/Cargo.toml index fb307aa..123347f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ members = [ ] [workspace.package] -version = "0.1.1" +version = "0.2.0" edition = "2021" rust-version = "1.88" license = "MIT" diff --git a/README.md b/README.md index d1f8926..e954778 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ The daemon leaves the station unkeyed after shutdown or a client failure. Install the daemon from crates.io with Rust 1.88 or newer: ```powershell -cargo install cathub --version 0.1.1 +cargo install cathub --version 0.2.0 ``` You can also download the Windows or Linux archive from the diff --git a/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto b/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto index e30ea84..0bf906f 100644 --- a/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto +++ b/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceAbortClientRequest { string client_name = 1; diff --git a/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto b/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto index f3b0104..21c40f5 100644 --- a/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto +++ b/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceAbortClientResponse { bool accepted = 1; diff --git a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto index 0399937..395bc3f 100644 --- a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto +++ b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceCancelJobRequest { string client_name = 1; diff --git a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto index 06cae7b..5cff171 100644 --- a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto +++ b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceCancelJobResponse { bool canceled = 1; diff --git a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto index 4056043..941d511 100644 --- a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto +++ b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceGetStatusRequest { string client_name = 1; diff --git a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto index 39af150..dec4b3d 100644 --- a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto +++ b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/winkeyer_broker_status.proto"; diff --git a/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto b/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto index 22374c1..a139253 100644 --- a/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto +++ b/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/winkeyer_speed_mode.proto"; diff --git a/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto b/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto index 7485156..bfd289c 100644 --- a/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto +++ b/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceSendTextResponse { uint64 job_id = 1; diff --git a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto index 0d5481a..bf29586 100644 --- a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto +++ b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/winkeyer_speed_mode.proto"; diff --git a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto index 6fb088a..fed73fc 100644 --- a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto +++ b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/winkeyer_speed_mode.proto"; diff --git a/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto b/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto index bc73d7f..1c2ecfa 100644 --- a/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto +++ b/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerServiceStreamEventsRequest { string client_name = 1; diff --git a/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto b/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto index d073465..4bb0d5f 100644 --- a/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto +++ b/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/winkeyer_broker_event_kind.proto"; import "services/winkeyer_broker_status.proto"; diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto index 0eb9608..59f0457 100644 --- a/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto +++ b/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; enum WinkeyerBrokerEventKind { WINKEYER_BROKER_EVENT_KIND_UNSPECIFIED = 0; diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto index d8c2c33..ca7ddb0 100644 --- a/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto +++ b/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; import "services/abort_winkeyer_client_request.proto"; import "services/abort_winkeyer_client_response.proto"; diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto index 7e47eb8..96afc64 100644 --- a/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto +++ b/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; message WinkeyerBrokerStatus { bool connected = 1; diff --git a/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto b/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto index 9c7be10..810efe3 100644 --- a/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto +++ b/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto @@ -1,8 +1,8 @@ syntax = "proto3"; -package qsoripper.services; +package cathub.services; -option csharp_namespace = "QsoRipper.Services"; +option csharp_namespace = "CatHub.Protocol"; enum WinkeyerSpeedMode { WINKEYER_SPEED_MODE_UNSPECIFIED = 0; diff --git a/crates/cathub-protocol/src/lib.rs b/crates/cathub-protocol/src/lib.rs index 4107409..d06dbe0 100644 --- a/crates/cathub-protocol/src/lib.rs +++ b/crates/cathub-protocol/src/lib.rs @@ -1,12 +1,10 @@ //! Generated client and server types for CatHub's public protocol. //! -//! Version 0.1 retains the legacy `qsoripper.services` wire-package identifier so -//! pre-release clients remain compatible. The identifier does not imply a runtime -//! or source dependency on another product. +//! Version 0.2 uses the CatHub-owned `cathub.services` wire-package identifier. // Generated prost/tonic code is not authored against this workspace's pedantic lint profile. #![allow(clippy::all, clippy::pedantic)] // Generated prost/tonic items do not carry Rust documentation from the proto comments. #![allow(missing_docs)] -tonic::include_proto!("qsoripper.services"); +tonic::include_proto!("cathub.services"); diff --git a/crates/cathub/Cargo.toml b/crates/cathub/Cargo.toml index a18b9d2..d816aac 100644 --- a/crates/cathub/Cargo.toml +++ b/crates/cathub/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "cathub" description = "Multi-client CAT and WinKeyer hub daemon" -version = "0.1.2" +version.workspace = true edition.workspace = true rust-version.workspace = true license.workspace = true @@ -19,7 +19,7 @@ path = "src/main.rs" [dependencies] async-trait = { workspace = true } bytes = { workspace = true } -cathub-protocol = { path = "../cathub-protocol", version = "0.1.1" } +cathub-protocol = { path = "../cathub-protocol", version = "0.2.0" } clap = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/docs/architecture/release-and-compatibility.md b/docs/architecture/release-and-compatibility.md index da9fd6e..2414965 100644 --- a/docs/architecture/release-and-compatibility.md +++ b/docs/architecture/release-and-compatibility.md @@ -31,7 +31,7 @@ Set the `NUGET_USER` Actions repository variable to the policy owner's NuGet use Then dispatch the publication workflow: ```powershell -gh workflow run publish-registries.yml -f release_tag=v0.1.1 +gh workflow run publish-registries.yml -f release_tag=v0.2.0 ``` The workflow rejects a draft or prerelease. @@ -57,12 +57,9 @@ The daemon crate depends on the same version of `cathub-protocol`. ## Wire compatibility -The 0.1 typed WinKeyer API retains the legacy `qsoripper.services` protobuf package string -so existing pre-release clients can connect. That string is a wire identifier, not a source -or runtime dependency. Do not rename it in the 0.1 line. - -Introduce a future wire namespace as a new protocol version. -Give clients an explicit migration period. +The 0.2 typed WinKeyer API uses the CatHub-owned `cathub.services` protobuf package string. +It is a public wire identifier. Renaming it is a breaking protocol change and requires a new +major protocol version plus a client migration period. Request and response envelopes remain unique for each RPC. Protobuf 1-1-1 remains the default file layout. diff --git a/docs/integration/setup.md b/docs/integration/setup.md index 34404f5..f9ca2f4 100644 --- a/docs/integration/setup.md +++ b/docs/integration/setup.md @@ -17,7 +17,7 @@ Put `cathub` or `cathub.exe` on `PATH`. If Rust 1.88 or newer is already installed, the equivalent installation from crates.io is: ```powershell -cargo install cathub --version 0.1.1 +cargo install cathub --version 0.2.0 ``` To build from source instead: diff --git a/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj b/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj index cdfb7b0..821a2d4 100644 --- a/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj +++ b/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj @@ -4,7 +4,7 @@ enable enable CatHub.Protocol - 0.1.1 + 0.2.0 Versioned gRPC client contracts for CatHub. README.md MIT