Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
a64382a
docs: spec for hm Mission Control TUI
markovejnovic May 22, 2026
b9e9b71
docs: implementation plan for Mission Control TUI
markovejnovic May 22, 2026
94dbd11
build(hm): add ratatui/crossterm/tachyonfx/tui-big-text/insta deps
markovejnovic May 22, 2026
75971b7
feat(cli): --no-tui and --no-fx global flags
markovejnovic May 22, 2026
5331ecb
feat(tui): scaffold tui module with TuiOptions/TuiError
markovejnovic May 22, 2026
c329dae
feat(tui): TuiEvent + DeployState
markovejnovic May 22, 2026
4ef2e4e
feat(tui): AppState reducer with chain/step/log/focus tests
markovejnovic May 22, 2026
79a1dfb
chore(tui): address app.rs review feedback
markovejnovic May 22, 2026
a4048bd
feat(tui): source module scaffold + channel helper
markovejnovic May 22, 2026
a1114e6
feat(tui): local source forwarder + scheduler::run extra_event_tx
markovejnovic May 22, 2026
e734d54
chore(tui): address local source forwarder review feedback
markovejnovic May 22, 2026
5d2c11c
feat(protocol): HM_BUILD_EVENT_EMIT host-fn name constant
markovejnovic May 22, 2026
cbe5fba
feat(host): hm_build_event_emit host fn + OrchestratorState.tui_event_tx
markovejnovic May 22, 2026
ea5dfbc
chore(scheduler): drop needless as_ref().cloned()
markovejnovic May 22, 2026
8191cc2
feat(cloud): emit BuildEvents via hm_build_event_emit during watch
markovejnovic May 22, 2026
fe109b6
feat(tui): cloud source reuses local translator
markovejnovic May 22, 2026
24188f8
feat(tui): dev source adapter over LogLine mpsc
markovejnovic May 22, 2026
64d08fd
chore(tui): drop redundant clones in dev source spawn
markovejnovic May 22, 2026
fd2bcdf
feat(tui): TermGuard with alt-screen/raw/mouse + panic hook
markovejnovic May 22, 2026
5525cb6
feat(tui): single dark Theme palette
markovejnovic May 22, 2026
9383dda
feat(tui): FxQueue with sparkle/fade/slide effects + 5-event budget
markovejnovic May 22, 2026
ed94f37
feat(tui): widgets mod + buffer_to_string helper + header widget
markovejnovic May 22, 2026
fe9bc0f
feat(tui): graph widget (one-row-per-chain, status glyphs)
markovejnovic May 22, 2026
e3f91df
feat(tui): timeline widget (gantt + status pill)
markovejnovic May 22, 2026
4276cda
feat(tui): log widget with regex filter + lagged note
markovejnovic May 22, 2026
beb0238
feat(tui): footer widget with hints + counters
markovejnovic May 22, 2026
3fa423e
feat(tui): summary card widget
markovejnovic May 22, 2026
b58cc80
feat(tui): help + filter overlays
markovejnovic May 22, 2026
b8a5a72
feat(tui): run loop with key/mouse/resize + filter/help overlays
markovejnovic May 22, 2026
15830bb
feat(hm run): route TTY runs through Mission Control TUI
markovejnovic May 22, 2026
c47a447
feat(hm dev up): route TTY sessions through Mission Control TUI
markovejnovic May 22, 2026
6b6cd08
feat(hm cloud build watch): TUI session sink + Option<DockerClient>
markovejnovic May 22, 2026
22448f9
docs(demo): vhs tape for hm run TUI
markovejnovic May 22, 2026
b954930
docs(readme): embed Mission Control TUI demo GIF
markovejnovic May 22, 2026
2c7772b
docs(demo): vhs tape for hm dev up TUI
markovejnovic May 22, 2026
0475b79
ci(demo): vhs tape smoke-test on TUI-touching PRs
markovejnovic May 22, 2026
ca5718a
chore: drop TUI plan + spec from repo
markovejnovic May 22, 2026
ccf5f22
fix(tui): use ANSI named colors so light terminals are readable
markovejnovic May 22, 2026
38faedb
fix(orchestrator): surface real cause of plugin host-fn failures
markovejnovic May 22, 2026
69fac00
fix(tui): skip human output plugin when TUI sink is wired
markovejnovic May 22, 2026
6e96702
docs(plan): inline output formatters + ratatui widget refactor plan
markovejnovic May 22, 2026
f011a25
feat(hm): inline human output formatter as native code
markovejnovic May 22, 2026
bce377c
feat(hm): inline json output formatter as native code
markovejnovic May 22, 2026
852a84b
test(hm): assert exact json wire format and cover on_event path
markovejnovic May 22, 2026
4234d0e
feat(hm): dispatch built-in formatters before plugin lookup
markovejnovic May 22, 2026
4a172e0
docs(hm): clarify spawn() contract covers built-in fast path
markovejnovic May 22, 2026
fe96c6d
feat(hm): accept built-in formatters in format validation
markovejnovic May 22, 2026
d628d1b
chore(hm): drop embedded output-formatter wasms; built-ins are native
markovejnovic May 22, 2026
f132bc9
chore(hm): delete output-formatter wasm crates
markovejnovic May 22, 2026
196f951
chore(docs): drop refs to deleted output-formatter wasm crates
markovejnovic May 22, 2026
d370dc0
refactor(tui): render log pane via ratatui Paragraph
markovejnovic May 22, 2026
892268a
refactor(tui): render graph via ratatui Paragraph
markovejnovic May 22, 2026
d660fec
refactor(tui): use Line::from(spans) for empty chain rows
markovejnovic May 22, 2026
791aa96
refactor(tui): render footer via ratatui Paragraph
markovejnovic May 22, 2026
619b0dc
refactor(tui): render filter input via ratatui Paragraph
markovejnovic May 22, 2026
bd5acc9
refactor(tui): render summary card via ratatui Paragraph
markovejnovic May 22, 2026
ab37f69
refactor(tui): render help overlay via ratatui Paragraph
markovejnovic May 22, 2026
9ca1e17
refactor(tui): render timeline via ratatui Paragraph
markovejnovic May 22, 2026
ab801f2
chore: silence clippy strict-warnings across feat/tui-mission-control
markovejnovic May 22, 2026
9381476
ci(demo): make vhs job non-blocking + drop --release + cache
markovejnovic May 22, 2026
248672f
feat(docker): honor docker context for endpoint resolution
markovejnovic May 22, 2026
11dc25e
test(plugin): merge plugin_kv tests to dodge XDG_CONFIG_HOME race
markovejnovic May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions .github/workflows/demo.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: demo-tape-smoke

on:
pull_request:
paths:
- "crates/hm/src/tui/**"
- "docs/demo/**"
- ".github/workflows/demo.yml"

jobs:
vhs:
runs-on: ubuntu-latest
timeout-minutes: 20
# The vhs tape is a best-effort smoke test: the TUI may legitimately
# not have docker/harmont-py available in CI, and vhs+ttyd has its own
# flakiness. Failures here annotate the PR but don't block merging.
continue-on-error: true
steps:
- uses: actions/checkout@v4

- name: install rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1

- uses: Swatinem/rust-cache@v2
with:
shared-key: demo-vhs

- name: cargo build hm
# Debug profile keeps RAM + time in CI limits. The smoke test
# only verifies the TUI exits cleanly; release perf is moot.
run: cargo build -p harmont-cli

- name: install vhs + ffmpeg + ttyd
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg ttyd
curl -fsSL https://github.com/charmbracelet/vhs/releases/download/v0.7.2/vhs_0.7.2_amd64.deb -o /tmp/vhs.deb
sudo dpkg -i /tmp/vhs.deb

- name: smoke-run run.tape
# Non-deterministic frames are OK — we only assert exit-zero.
# The dev.tape references examples/dev-demo/ which doesn't
# exist yet, so it is intentionally skipped here.
# We DON'T require Docker — `hm run` will fail fast without it
# and the TUI will render the failed-build path. We assert vhs
# itself exits OK (tape syntax + binary launched), not that
# the build succeeded.
run: |
if [ -d examples/rust ]; then
export PATH="$PWD/target/debug:$PATH"
vhs docs/demo/run.tape || {
echo "vhs run.tape failed — TUI smoke regression";
exit 1;
}
else
echo "examples/rust missing, skipping"
fi
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ jobs:
# crates/hm/Cargo.toml carries them into the tarball.
run: |
set -euo pipefail
for crate in hm-plugin-docker hm-plugin-output-human hm-plugin-output-json hm-plugin-cloud; do
for crate in hm-plugin-docker hm-plugin-cloud; do
cargo build --target wasm32-wasip1 -p "$crate" --release
done
mkdir -p crates/hm/embedded
for name in hm_plugin_docker hm_plugin_output_human hm_plugin_output_json hm_plugin_cloud; do
for name in hm_plugin_docker hm_plugin_cloud; do
cp "target/wasm32-wasip1/release/$name.wasm" "crates/hm/embedded/$name.wasm"
done
ls -la crates/hm/embedded/
Expand Down
Loading
Loading