feat!: modularize into orac/ package, add Public channel, deduplicate

Split 1424-line monolith into orac/ package with clean separation:
- constants.py — bot identity, radio config, triggers, limits
- crypto.py — Ed25519 identity, channel/peer crypto, ECDH
- meshcore.py — packet parsing/building, routing, dedup, node registry
- ai.py — Claude API integration, query extraction
- state.py — JSON persistence, history tracking
- bot.py — main loop, packet dispatch, connection management

Removed duplicated donglora library code (cobs_frame, read_frame,
encode_radio_config, encode_command, decode_response) — now uses
donglora.send/recv/connect directly.

Added MeshCore Public channel (fixed PSK 8b3387e9...cd72) and
expanded built-in hashtag channels: #nodeops, #repeater-ops, #test,
#weather, #protest, #general, #bot, #net, #emcomm.

Replaced ANSI print() with stdlib logging (color formatter for TTY).
Fixed dependency (donglora-python -> donglora). Strict ruff linting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
swaitsandClaude Opus 4.6 committed 2026-04-08 13:34:18 -06:00
1 parent 9130b3c478
commit 9e6f171c5d
11 files changed
+2350 -1417

No files matched your search

+15 -1
View File
@@ -6,7 +6,7 @@ license = "MIT"
requires-python = ">=3.10"
authors = [{ name = "Stephen Waits" }]
dependencies = [
"donglora-python",
"donglora",
"anthropic",
"cobs",
"pyserial",
@@ -19,3 +19,17 @@ dev = ["ruff"]
[tool.uv]
package = false
[tool.uv.sources]
donglora = { path = "../client-py", editable = true }
[tool.ruff]
line-length = 100
target-version = "py310"
[tool.ruff.lint]
select = ["E", "W", "F", "I", "UP", "B", "C4", "ARG", "SIM", "RUF"]
ignore = ["E501"]
[tool.ruff.lint.isort]
known-first-party = ["donglora", "orac"]