dwarves — server-side git RegisterPipeline + live RunReport Pipeline tab
Two additive capabilities that finish the two follow-ups the SSH-source + warehouse work explicitly deferred: (a) the SERVER clones on register, and (b) the demo Pipeline tab renders a REAL forge run. Both reuse shared leaves (L5), keep the SSH-only law (L6), and add no
nornircrate dep (that edge is a cycle).
(a) Server-side git source on RegisterPipeline
Before, RegisterPipeline(repo_root) only registered a repo the server ALREADY had on disk; a git@… clone was a client-side CLI verb (dwarves repo add). Now the server can clone on register.
- Proto.
dwarf.v1 RegisterRequestgainsstring source = 2;— agit@…/ssh://git@…SSH remote. When set it wins overrepo_root; empty keeps the original local-path behaviour (additive, no regression). - Handler.
DwarfSvc::register_pipeline, given asource, clones/fetches it over SSH (deploy-key auth) into the forge's repos root (<repos>/<host>/<owner>/<repo>, the warehouse's siblingrepos/dir), then discovers + registers thebrokkr.tomlat the checkout — exactly the pipeline the cloned repo declares. The clone runs inspawn_blocking(network I/O off the async reactor). - Reuse, never twin (L5). The clone is the SHARED
crate::repo::add_repo→edda/crates/nornir-git(ssh::parse_ssh_url+gitio::clone_or_fetch, gix + russh) with the/home/dwarves/.ssh/id_ed25519deploy key — the SAME seamdwarves repo addalready used. Never thegitbinary (L9). - SSH-only (LAW L6). An
https:///git://sourceis rejected before any I/O (insideadd_repo) ⇒InvalidArgument. The forge never authenticates over https. - CLI seam extended.
dwarves repo add <ssh-url> --server <url>now ships the url asRegisterRequest.sourceso the FORGE does the clone (thin mode); local (fat) mode still clones here. One verb, two placements.
(b) Live RunReport → the Pipeline tab
The dwarves-gui Pipeline tab rendered a hand-typed ledger fixture (invented Running/Passed cells). It now renders a real forge run.
pipeline_view()runs the forge's build pipeline through the ACTUAL brokkr engine (brokkr::engine::run_pipeline, the same enginedwarves-serverdrives) with the toolchain-freeDemoRunner, producing a genuineRunReport(parent row + a row per step, real per-step durations).- That report feeds
ForgePipelineAdapter::from_report(&dag, &report)(the constructor that already existed) →PipelineView::from_adapter— the REUSED engine-agnostic viewer (one viewer, many adapters). Steps → nodes,needs→ edges. - Because a real completed run greens every step, the tab shows all 5 nodes Done (0 running / 0 idle) — honest status, never an invented in-flight cell. Swapping
DemoRunnerforRealRunnermakes the same pane a live cargo build with no adapter change.
Testability (L4 — observed from outside, RED-when-broken)
- register+source (server): an injected network-free clone seam materialises a checkout with a
brokkr.toml; aRegisterRequest{ source }is asserted to clone → discover → register (RED ifsourcewere ignored —repo_rootis empty). A second test proves anhttps://source is refused asInvalidArgumentbefore any network I/O (the SSH-only law at the register surface). - live report (demo): the Pipeline pane, fed the real
RunReport, is asserted to hold 5 nodes / 5 edges and all-Done status counts(0,0,5,0)— driven headless over the tabbed host'sstate_json/update_jsonrobot seam, emitting anornir-testmatrixcell.