service_collab.nu — hero_collab server + UI lifecycle module #84

Closed
opened 2026-04-19 19:17:23 +00:00 by mahmoud · 3 comments
Owner

Child of #75.

Objective

Add tools/modules/services/service_collab.nu implementing the standard install | start | stop | status lifecycle for the hero_collab service (server + UI).

Scope

  • Repo: ssh://git@forge.ourworld.tf/lhumina_code/hero_collab.git
  • Binaries (per buildenv.sh): hero_collab, hero_collab_server, hero_collab_ui
  • Runtime actions: hero_collab_server, hero_collab_ui
  • TOML: lhumina_code/hero_zero/services/hero_collab.toml
  • Sockets: $HERO_SOCKET_DIR/hero_collab/rpc.sock, $HERO_SOCKET_DIR/hero_collab/ui.sock (confirm in spec)
  • Env: RUST_LOG=info for both — no placeholders.
  • Dependencies: none in TOML.
  • Workspace layout: virtual workspace (no root [package]).
  • --root flag optional, user-level default.

Acceptance criteria

  • use services/mod.nu * makes service_collab available.
  • service_collab install [--root] [--update] clones + builds all 3 binaries, installs to ~/hero/bin/ (or /root/hero/bin/).
  • service_collab start [--reset] [--root] [--update] registers both actions + the service, starts, prints sockets + UI URL. Idempotent without --reset.
  • service_collab status [--root] reports state.
  • service_collab stop [--root] cleanly unregisters.
  • Smoke-tested on Hetzner: install → start --reset → running with 0 restarts → stop.

Template

service_whiteboard.nu (PR #83, merged) — identical pattern expected (virtual workspace, no serve, no preflight, no env placeholders). This should be another pure copy-rename if the spec phase confirms hero_collab's binaries match.

Spec should verify:

  • No serve subcommand via hero_collab_server --help / main.rs inspection.
  • No hard-fail boot prerequisites (DB auto-created, sockets auto-cleaned on bind).
  • Socket paths match the standard $HERO_SOCKET_DIR/hero_collab/{rpc,ui}.sock convention.

If any of those diverge, the spec should call out exactly what and adapt.

Child of #75. ## Objective Add `tools/modules/services/service_collab.nu` implementing the standard `install | start | stop | status` lifecycle for the **hero_collab** service (server + UI). ## Scope - **Repo**: `ssh://git@forge.ourworld.tf/lhumina_code/hero_collab.git` - **Binaries** (per `buildenv.sh`): `hero_collab`, `hero_collab_server`, `hero_collab_ui` - **Runtime actions**: `hero_collab_server`, `hero_collab_ui` - **TOML**: `lhumina_code/hero_zero/services/hero_collab.toml` - **Sockets**: `$HERO_SOCKET_DIR/hero_collab/rpc.sock`, `$HERO_SOCKET_DIR/hero_collab/ui.sock` (confirm in spec) - **Env**: `RUST_LOG=info` for both — no placeholders. - **Dependencies**: none in TOML. - **Workspace layout**: virtual workspace (no root `[package]`). - `--root` flag optional, user-level default. ## Acceptance criteria - [ ] `use services/mod.nu *` makes `service_collab` available. - [ ] `service_collab install [--root] [--update]` clones + builds all 3 binaries, installs to `~/hero/bin/` (or `/root/hero/bin/`). - [ ] `service_collab start [--reset] [--root] [--update]` registers both actions + the service, starts, prints sockets + UI URL. Idempotent without `--reset`. - [ ] `service_collab status [--root]` reports state. - [ ] `service_collab stop [--root]` cleanly unregisters. - [ ] Smoke-tested on Hetzner: install → start --reset → running with 0 restarts → stop. ## Template `service_whiteboard.nu` (PR #83, merged) — identical pattern expected (virtual workspace, no `serve`, no preflight, no env placeholders). This should be another pure copy-rename if the spec phase confirms hero_collab's binaries match. Spec should verify: - No `serve` subcommand via `hero_collab_server --help` / `main.rs` inspection. - No hard-fail boot prerequisites (DB auto-created, sockets auto-cleaned on bind). - Socket paths match the standard `$HERO_SOCKET_DIR/hero_collab/{rpc,ui}.sock` convention. If any of those diverge, the spec should call out exactly what and adapt.
Author
Owner

Implementation Spec for Issue #84

Objective

Add tools/modules/services/service_collab.nu — a pure copy-rename of service_whiteboard.nu providing install | start | stop | status for hero_collab (server + UI) via hero_proc.

Requirements

  • Three binaries compiled from lhumina_code/hero_collab: hero_collab, hero_collab_server, hero_collab_ui (CLI is shipped, not registered as a hero_proc action).
  • Two hero_proc actions: hero_collab_server (rpc.sock, OpenRPC health check) and hero_collab_ui (ui.sock, OpenRPC health check).
  • One hero_proc service hero_collab in context core, class system, critical false.
  • env: {RUST_LOG: "info"} on both actions — no other env vars, no placeholders.
  • No depends_on (matches hero_collab.toml — zero dependencies declared).
  • Standard hero_proc dependency check via svc_require_proc; --root with sudo; --update for forge merge; --reset for clean re-register.
  • Register via ./lib.nu's shared helpers only. No new helpers, no preflight, no custom state directories.

Files to Modify/Create

  • tools/modules/services/service_collab.nu — new, ~310 lines, cloned from service_whiteboard.nu.
  • tools/modules/services/mod.nu — append export use service_collab.nu (last line, after service_whiteboard.nu on line 10).

Implementation Plan

Verbatim copy-rename of service_whiteboard.nu. Every edit is a literal string substitution — no structural changes.

Step 1: Copy service_whiteboard.nuservice_collab.nu

cp tools/modules/services/service_whiteboard.nu tools/modules/services/service_collab.nu

Step 2: Header comment block (service_whiteboard.nu lines 1–39)

Substitute whiteboardcollab throughout the banner. Adjust the description lines:

  • server: OpenRPC state server for workspaces, channels, messages, canvases, and huddles.
  • UI: HTTP server that serves the collab UI at '/' and admin dashboard at '/admin/' over a Unix socket.
  • Lines 10–11: socket paths $HERO_SOCKET_DIR/hero_collab/{rpc,ui}.sock (confirmed against crates/hero_collab_server/src/main.rs:98-104,266-268 and crates/hero_collab_ui/src/main.rs:22-34).
  • Lines 19–23 (the "No external dependencies" paragraph): keep the spirit. sqlite DB is auto-created on first start (main.rs:262-274). Add a one-liner noting the server accepts optional --auth-mode, --livekit-*, and --seed-dev-users flags (main.rs:38-95) — the module passes NONE, which gives the safe production defaults (auth_mode=proxy, huddles disabled).

Step 3: Constants block (lines 48–53)

  • SVX_SERVICE_NAME = "hero_collab"
  • SVX_FORGE_LOC = "lhumina_code/hero_collab"
  • Comment: hero_collab is the CLI, shipped but not registered as a hero_proc action.
  • SVX_BINARIES = ["hero_collab" "hero_collab_server" "hero_collab_ui"]
  • SVX_ACTIONS = ["hero_collab_server" "hero_collab_ui"]

Step 4: Action spec builders

svx_server_action (whiteboard lines 59–98):

  • svc_bin "hero_collab_server".
  • name: "hero_collab_server".
  • kill_other.socket: [$"($sock_base)/hero_collab/rpc.sock"].
  • health_checks[0].action: "hero_collab_server", .openrpc_socket: .../hero_collab/rpc.sock.
  • Retry / health-check policy values identical to whiteboard.

svx_ui_action (whiteboard lines 100–139):

  • svc_bin "hero_collab_ui".
  • name: "hero_collab_ui".
  • kill_other.socket: [$"($sock_base)/hero_collab/ui.sock"].
  • health_checks[0].action: "hero_collab_ui", .openrpc_socket: .../hero_collab/ui.sock.
  • Policy values identical.

svx_service_config (whiteboard lines 141–153):

  • description: "Hero Collab — collaboration platform: workspaces, channels, messages, canvases, huddles" (mirrors hero_collab.toml:3).
  • All other fields unchanged.

svx_drop_registration (whiteboard lines 156–162): no changes — constants drive it.

Step 5: install, start, stop, status (whiteboard lines 171–312)

Text substitution of whiteboardcollab throughout. Key spots:

  • svc_require_proc "service_collab" in start and status.
  • User-facing prints: "hero_collab is already running", "→ ensuring hero_collab binaries…", "→ dropping any previous hero_collab registration…", "→ starting hero_collab…", "hero_collab stopped and unregistered".
  • Socket strings in summary: ($sock_base)/hero_collab/rpc.sock, /hero_collab/ui.sock.
  • proc logs tail hero_collab_server / hero_collab_ui in the commands block.

Step 6: Register in mod.nu

Append export use service_collab.nu after service_whiteboard.nu (current line 10).

Step 7: Syntax-check and smoke test

  • nu -c "source tools/modules/services/service_collab.nu; print parse-ok".
  • nu -c "use tools/modules/services/mod.nu *; scope commands | where name =~ '^service_collab '" — expect 4 subcommands.
  • On Hetzner with hero_proc running:
    1. service_collab install --root — cargo build + 3 binaries in /root/hero/bin/.
    2. service_collab start --reset --root — both actions registered, both sockets live, state: running.
    3. service_collab status --root — record shows running, 0 restarts.
    4. Probe rpc.sock + ui.sock with curl — HTTP response.
    5. service_collab start --root — idempotent "already running".
    6. Observe 15 s — no new restarts.
    7. service_collab stop --root — clean unregistration.
    8. Post-stop service_collab status --root — expected service 'hero_collab' not found.

Acceptance Criteria

  • tools/modules/services/service_collab.nu exists and exports install, start, stop, status.
  • tools/modules/services/mod.nu includes export use service_collab.nu.
  • service_collab install builds all three binaries and copies them to $HOME/hero/bin/ (or /root/hero/bin/ with --root).
  • service_collab start registers hero_collab_server + hero_collab_ui actions and the hero_collab service, starts it, prints the summary block with both socket paths.
  • service_collab start is idempotent; --reset forces clean re-register.
  • service_collab stop unregisters cleanly; safe when nothing is registered or hero_proc is down.
  • service_collab status proxies proc service status hero_collab.
  • --root works end-to-end with passwordless sudo; --update pulls via forge merge before rebuild.
  • Health-check endpoints on both sockets respond OK under proc service status.

Notes

  • Workspace shape: virtual. hero_collab/Cargo.toml:1-10 is [workspace]-only with 6 members and no root [package]; no hybrid-workspace accommodation needed. Matches whiteboard.
  • No serve subcommand on either binary. hero_collab_server uses clap with optional args only (--auth-mode, --livekit-*, --seed-dev-users; all have safe defaults — main.rs:38-95). hero_collab_ui takes zero args (main.rs:36-43). Both launch with bare exec.
  • Socket paths confirmed: $HERO_SOCKET_DIR/hero_collab/rpc.sock (server, main.rs:98-104,266-268) and $HERO_SOCKET_DIR/hero_collab/ui.sock (UI, main.rs:22-34). Both binaries remove a stale socket before bind.
  • Boot prerequisites:
    • Server auto-creates ~/hero/var/data/hero_collab/ and opens collab.db on first start. No preflight needed.
    • Server needs HOME env to be set; hero_proc's spawn sets this.
    • The apikeys.db at the repo root is a dev artifact — no code path in main.rs or db.rs references it. Ignore it.
    • Auth mode defaults to proxy (fail-closed). Raw RPC calls without hero_proxy's X-Hero-User header will be rejected, but the service itself starts cleanly and health checks pass. Production-correct default — do not pass --auth-mode=dev from the module.
    • LiveKit (huddles) is optional and off-by-default. No env var to wire.
  • Extra env beyond RUST_LOG: none required at the module level. TOML agrees (hero_collab.toml:9-11,17-19 has only RUST_LOG = "info" on each of [server.env] / [ui.env]).
  • Dependencies: hero_collab.toml declares none.
  • No WASM / no embedder / no oschema preflight — whiteboard is the complete template.

Critical Files for Implementation

  • /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/service_whiteboard.nu
  • /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/mod.nu
  • /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/lib.nu
  • /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_zero/services/hero_collab.toml
  • /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_collab/crates/hero_collab_server/src/main.rs
## Implementation Spec for Issue #84 ### Objective Add `tools/modules/services/service_collab.nu` — a pure copy-rename of `service_whiteboard.nu` providing `install | start | stop | status` for `hero_collab` (server + UI) via `hero_proc`. ### Requirements - Three binaries compiled from `lhumina_code/hero_collab`: `hero_collab`, `hero_collab_server`, `hero_collab_ui` (CLI is shipped, not registered as a hero_proc action). - Two hero_proc actions: `hero_collab_server` (rpc.sock, OpenRPC health check) and `hero_collab_ui` (ui.sock, OpenRPC health check). - One hero_proc service `hero_collab` in context `core`, class `system`, critical `false`. - `env: {RUST_LOG: "info"}` on both actions — no other env vars, no placeholders. - No `depends_on` (matches `hero_collab.toml` — zero dependencies declared). - Standard hero_proc dependency check via `svc_require_proc`; `--root` with sudo; `--update` for `forge merge`; `--reset` for clean re-register. - Register via `./lib.nu`'s shared helpers only. No new helpers, no preflight, no custom state directories. ### Files to Modify/Create - `tools/modules/services/service_collab.nu` — new, ~310 lines, cloned from `service_whiteboard.nu`. - `tools/modules/services/mod.nu` — append `export use service_collab.nu` (last line, after `service_whiteboard.nu` on line 10). ### Implementation Plan Verbatim copy-rename of `service_whiteboard.nu`. Every edit is a literal string substitution — no structural changes. #### Step 1: Copy `service_whiteboard.nu` → `service_collab.nu` ``` cp tools/modules/services/service_whiteboard.nu tools/modules/services/service_collab.nu ``` #### Step 2: Header comment block (`service_whiteboard.nu` lines 1–39) Substitute `whiteboard` → `collab` throughout the banner. Adjust the description lines: - server: `OpenRPC state server for workspaces, channels, messages, canvases, and huddles.` - UI: `HTTP server that serves the collab UI at '/' and admin dashboard at '/admin/' over a Unix socket.` - Lines 10–11: socket paths `$HERO_SOCKET_DIR/hero_collab/{rpc,ui}.sock` (confirmed against `crates/hero_collab_server/src/main.rs:98-104,266-268` and `crates/hero_collab_ui/src/main.rs:22-34`). - Lines 19–23 (the "No external dependencies" paragraph): keep the spirit. sqlite DB is auto-created on first start (`main.rs:262-274`). Add a one-liner noting the server accepts optional `--auth-mode`, `--livekit-*`, and `--seed-dev-users` flags (`main.rs:38-95`) — the module passes NONE, which gives the safe production defaults (`auth_mode=proxy`, huddles disabled). #### Step 3: Constants block (lines 48–53) - `SVX_SERVICE_NAME = "hero_collab"` - `SVX_FORGE_LOC = "lhumina_code/hero_collab"` - Comment: `hero_collab is the CLI, shipped but not registered as a hero_proc action`. - `SVX_BINARIES = ["hero_collab" "hero_collab_server" "hero_collab_ui"]` - `SVX_ACTIONS = ["hero_collab_server" "hero_collab_ui"]` #### Step 4: Action spec builders `svx_server_action` (whiteboard lines 59–98): - `svc_bin "hero_collab_server"`. - `name: "hero_collab_server"`. - `kill_other.socket: [$"($sock_base)/hero_collab/rpc.sock"]`. - `health_checks[0].action: "hero_collab_server"`, `.openrpc_socket: .../hero_collab/rpc.sock`. - Retry / health-check policy values identical to whiteboard. `svx_ui_action` (whiteboard lines 100–139): - `svc_bin "hero_collab_ui"`. - `name: "hero_collab_ui"`. - `kill_other.socket: [$"($sock_base)/hero_collab/ui.sock"]`. - `health_checks[0].action: "hero_collab_ui"`, `.openrpc_socket: .../hero_collab/ui.sock`. - Policy values identical. `svx_service_config` (whiteboard lines 141–153): - `description: "Hero Collab — collaboration platform: workspaces, channels, messages, canvases, huddles"` (mirrors `hero_collab.toml:3`). - All other fields unchanged. `svx_drop_registration` (whiteboard lines 156–162): no changes — constants drive it. #### Step 5: `install`, `start`, `stop`, `status` (whiteboard lines 171–312) Text substitution of `whiteboard` → `collab` throughout. Key spots: - `svc_require_proc "service_collab"` in start and status. - User-facing prints: "hero_collab is already running", "→ ensuring hero_collab binaries…", "→ dropping any previous hero_collab registration…", "→ starting hero_collab…", "hero_collab stopped and unregistered". - Socket strings in summary: `($sock_base)/hero_collab/rpc.sock`, `/hero_collab/ui.sock`. - `proc logs tail hero_collab_server` / `hero_collab_ui` in the commands block. #### Step 6: Register in `mod.nu` Append `export use service_collab.nu` after `service_whiteboard.nu` (current line 10). #### Step 7: Syntax-check and smoke test - `nu -c "source tools/modules/services/service_collab.nu; print parse-ok"`. - `nu -c "use tools/modules/services/mod.nu *; scope commands | where name =~ '^service_collab '"` — expect 4 subcommands. - On Hetzner with hero_proc running: 1. `service_collab install --root` — cargo build + 3 binaries in `/root/hero/bin/`. 2. `service_collab start --reset --root` — both actions registered, both sockets live, state: running. 3. `service_collab status --root` — record shows running, 0 restarts. 4. Probe rpc.sock + ui.sock with curl — HTTP response. 5. `service_collab start --root` — idempotent "already running". 6. Observe 15 s — no new restarts. 7. `service_collab stop --root` — clean unregistration. 8. Post-stop `service_collab status --root` — expected `service 'hero_collab' not found`. ### Acceptance Criteria - [ ] `tools/modules/services/service_collab.nu` exists and exports `install`, `start`, `stop`, `status`. - [ ] `tools/modules/services/mod.nu` includes `export use service_collab.nu`. - [ ] `service_collab install` builds all three binaries and copies them to `$HOME/hero/bin/` (or `/root/hero/bin/` with `--root`). - [ ] `service_collab start` registers `hero_collab_server` + `hero_collab_ui` actions and the `hero_collab` service, starts it, prints the summary block with both socket paths. - [ ] `service_collab start` is idempotent; `--reset` forces clean re-register. - [ ] `service_collab stop` unregisters cleanly; safe when nothing is registered or hero_proc is down. - [ ] `service_collab status` proxies `proc service status hero_collab`. - [ ] `--root` works end-to-end with passwordless sudo; `--update` pulls via `forge merge` before rebuild. - [ ] Health-check endpoints on both sockets respond OK under `proc service status`. ### Notes - **Workspace shape**: virtual. `hero_collab/Cargo.toml:1-10` is `[workspace]`-only with 6 members and no root `[package]`; no hybrid-workspace accommodation needed. Matches whiteboard. - **No `serve` subcommand** on either binary. `hero_collab_server` uses clap with optional args only (`--auth-mode`, `--livekit-*`, `--seed-dev-users`; all have safe defaults — `main.rs:38-95`). `hero_collab_ui` takes zero args (`main.rs:36-43`). Both launch with bare `exec`. - **Socket paths confirmed**: `$HERO_SOCKET_DIR/hero_collab/rpc.sock` (server, `main.rs:98-104,266-268`) and `$HERO_SOCKET_DIR/hero_collab/ui.sock` (UI, `main.rs:22-34`). Both binaries remove a stale socket before bind. - **Boot prerequisites**: - Server auto-creates `~/hero/var/data/hero_collab/` and opens `collab.db` on first start. No preflight needed. - Server needs `HOME` env to be set; hero_proc's spawn sets this. - The `apikeys.db` at the repo root is a dev artifact — no code path in `main.rs` or `db.rs` references it. Ignore it. - Auth mode defaults to `proxy` (fail-closed). Raw RPC calls without hero_proxy's `X-Hero-User` header will be rejected, but the service itself starts cleanly and health checks pass. Production-correct default — do not pass `--auth-mode=dev` from the module. - LiveKit (huddles) is optional and off-by-default. No env var to wire. - **Extra env beyond RUST_LOG**: none required at the module level. TOML agrees (`hero_collab.toml:9-11,17-19` has only `RUST_LOG = "info"` on each of `[server.env]` / `[ui.env]`). - **Dependencies**: `hero_collab.toml` declares none. - **No WASM / no embedder / no oschema preflight** — whiteboard is the complete template. ### Critical Files for Implementation - /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/service_whiteboard.nu - /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/mod.nu - /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_skills/tools/modules/services/lib.nu - /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_zero/services/hero_collab.toml - /Users/mahmoud/code/forge.ourworld.tf/lhumina_code/hero_collab/crates/hero_collab_server/src/main.rs
Author
Owner

Implementation summary

Changes

  • Added tools/modules/services/service_collab.nu — ~275 lines, pure copy-rename of service_whiteboard.nu.
  • Updated tools/modules/services/mod.nu — added export use service_collab.nu.

End-to-end smoke test on Hetzner

Every assertion green.

# Assertion Result
1a–1c hero_proc-down error paths (status / stop / start) PASS
2a service_proc start --root healthy PASS
2b service_collab install --root produced 3 binaries PASS
2c service_collab start --reset --root registers + starts PASS
2d rpc.sock live unix socket PASS
2e ui.sock live unix socket PASS
2f curl --unix-socket rpc.sock accepts HTTP PASS
2g curl --unix-socket ui.sock accepts HTTP PASS
2h status returns {name: hero_collab, state: running, restarts: 0} PASS
2i Idempotent start without --reset prints "already running" PASS
2j 15 s observation — no new restarts, state held running PASS
2k service_collab stop --root stops and unregisters PASS
2l Post-stop status returns expected service 'hero_collab' not found PASS

Every dimension tested matches the service_whiteboard baseline — no hero_collab-specific surprises. Both sockets come up, both health-check clean, auth_mode defaults to proxy (production-correct) without intervention, LiveKit is off as expected.

Acceptance criteria

  • Module loadable via use services/mod.nu * or use services/service_collab.nu *.
  • install builds 3 binaries and places them in ~/hero/bin/ (or /root/hero/bin/ with --root).
  • start registers both actions + the service, starts, surfaces both sockets in the summary.
  • status reports the hero_proc record.
  • stop cleanly unregisters.
  • --root optional, user-level default.
  • Smoke-tested end-to-end on the Hetzner box.
## Implementation summary ### Changes - Added `tools/modules/services/service_collab.nu` — ~275 lines, pure copy-rename of `service_whiteboard.nu`. - Updated `tools/modules/services/mod.nu` — added `export use service_collab.nu`. ### End-to-end smoke test on Hetzner Every assertion green. | # | Assertion | Result | |---|---|---| | 1a–1c | hero_proc-down error paths (status / stop / start) | PASS | | 2a | `service_proc start --root` healthy | PASS | | 2b | `service_collab install --root` produced 3 binaries | PASS | | 2c | `service_collab start --reset --root` registers + starts | PASS | | 2d | `rpc.sock` live unix socket | PASS | | 2e | `ui.sock` live unix socket | PASS | | 2f | `curl --unix-socket rpc.sock` accepts HTTP | PASS | | 2g | `curl --unix-socket ui.sock` accepts HTTP | PASS | | 2h | `status` returns `{name: hero_collab, state: running, restarts: 0}` | PASS | | 2i | Idempotent `start` without `--reset` prints "already running" | PASS | | 2j | 15 s observation — no new restarts, state held `running` | PASS | | 2k | `service_collab stop --root` stops and unregisters | PASS | | 2l | Post-stop `status` returns expected `service 'hero_collab' not found` | PASS | Every dimension tested matches the service_whiteboard baseline — no hero_collab-specific surprises. Both sockets come up, both health-check clean, auth_mode defaults to `proxy` (production-correct) without intervention, LiveKit is off as expected. ### Acceptance criteria - [x] Module loadable via `use services/mod.nu *` or `use services/service_collab.nu *`. - [x] `install` builds 3 binaries and places them in `~/hero/bin/` (or `/root/hero/bin/` with `--root`). - [x] `start` registers both actions + the service, starts, surfaces both sockets in the summary. - [x] `status` reports the hero_proc record. - [x] `stop` cleanly unregisters. - [x] `--root` optional, user-level default. - [x] Smoke-tested end-to-end on the Hetzner box.
Author
Owner

PR opened: #85

PR opened: https://forge.ourworld.tf/lhumina_code/hero_skills/pulls/85
mahmoud self-assigned this 2026-04-19 19:44:35 +00:00
mahmoud added this to the ACTIVE project 2026-04-19 19:44:37 +00:00
mahmoud added this to the now milestone 2026-04-19 19:44:40 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/hero_skills#84
No description provided.