feat(tools): notify — the first client tool

Desktop notifications are the wave-1 built-in the resident has no
native way to send: the daemon's pushes land in the poll queue, and
this is the program that turns one into an OS notification —
`notify push --title --body [--device]` on the shared plumbing, the
claw's `POST /v1/notifications` on the far end.

The binary is the template for every later client: connection from
the environment the daemon provisions, one contract-headered call,
JSON or error shape, exit code. The e2e test drives the real binary
against a mock claw — a wrong token is a 401 with the code to match,
a consent route is a 403, a good push prints the row — so a packaging
regression cannot pass silently. `skills/` ships the markdown that
teaches the agent the tool exists and what its answers mean.
This commit is contained in:
vhaudiquet committed 2026-10-24 01:02:28 +02:00
1 parent 29099add9d
commit 2fbd93fd79
7 files changed
+1199

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
[package]
name = "notify"
description = "The claw's notification client: push one notification to a device — the daemon queues it, the device's next poll carries it"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
authors.workspace = true
[[bin]]
name = "notify"
path = "src/main.rs"
[dependencies]
rhema-tools-common = { path = "../common" }
rhema-tools-contract = { path = "../contract" }
clap.workspace = true
serde.workspace = true
serde_json.workspace = true
[dev-dependencies]
tokio = { workspace = true, features = ["rt-multi-thread"] }
axum.workspace = true
[lints.rust]
unsafe_code = "forbid"
missing_docs = "deny"