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:
1 parent
29099add9d
commit
2fbd93fd79
7 files changed
+1199
No files matched your search
@@ -0,0 +1,24 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
members = ["contract", "common", "notify"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
rust-version = "1.85"
|
||||
license = "MIT"
|
||||
repository = "https://github.com/vhaudiquet/rhema"
|
||||
authors = ["Valentin Haudiquet"]
|
||||
|
||||
[workspace.dependencies]
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
thiserror = "2"
|
||||
tokio = { version = "1", features = ["macros", "rt"] }
|
||||
# The thin clients' HTTP: loopback, no TLS (the contract is bearer-over-HTTP
|
||||
# to a loopback or otherwise trusted daemon; a remote TLS endpoint is a
|
||||
# stated non-goal v1).
|
||||
ureq = { version = "2", default-features = false, features = ["json"] }
|
||||
# Command-line surfaces and their test harness
|
||||
clap = { version = "4", features = ["derive"] }
|
||||
axum = { version = "0.8", features = ["json"] }
|
||||
Reference in new issue
Block a user