Skip to content

Commit 75bae2e

Browse files
authored
Merge pull request #41 from codejunkie99/codex/tui-dashboard [skip ci]
feat: add agentic-stack dashboard TUI with trust-console parity
2 parents a628b28 + 1b901f2 commit 75bae2e

9 files changed

Lines changed: 1316 additions & 30 deletions

File tree

CHANGELOG.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,48 @@ All notable changes to this project.
55
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.15.0] — 2026-05-06
9+
10+
Minor release. Adds a production dashboard TUI for installed agentic-stack
11+
projects, with the trust-console inspection surface folded into the same
12+
user-facing entrypoint.
13+
14+
### Added
15+
- **`agentic-stack dashboard` / `dash`.** Adds a terminal dashboard for project
16+
health, installed adapters, doctor checks, harness verification, memory, team
17+
brain, skills, managed instances, transfer, and local data exports.
18+
- **Trust-console parity.** The dashboard includes a per-harness verify matrix,
19+
team brain status/init, skills listing, active instance listing,
20+
accepted/rejected memory review, and `memory_why()` evidence lookup.
21+
- **Plain renderer.** `agentic-stack dashboard --plain` and non-TTY fallback
22+
produce a script-safe text dashboard for logs, agents, and tests.
23+
- **Interactive dashboard coverage.** Adds local tests for renderer output,
24+
CLI aliases, trust-console parity sections, non-TTY fallback, up/down
25+
navigation, refresh, quit, and Enter-open behavior.
26+
27+
### Changed
28+
- Bare interactive `agentic-stack` / `./install.sh` opens the dashboard when an
29+
existing `.agent/install.json` is present. Non-TTY shells keep printing
30+
command guidance instead of launching an interactive UI.
31+
- README, POSIX installer help, and PowerShell installer help now document the
32+
dashboard entrypoint.
33+
34+
### Fixed
35+
- `test_claude_code_hook.py` now works both as a standalone validation script
36+
and as a pytest-collected module by providing a real `mod` fixture.
37+
38+
### Migration
39+
No migration required. Existing projects can run `agentic-stack dashboard`
40+
after upgrading. Re-run an adapter install only if you want the latest copied
41+
adapter guidance files in a project.
42+
43+
### Release prep
44+
- GitHub release notes should use this changelog entry after PR #41 merges.
45+
- `v0.14.0` already exists on GitHub, so this production dashboard release uses
46+
the next minor tag, `v0.15.0`.
47+
- `Formula/agentic-stack.rb` must be bumped in the usual follow-up after the
48+
`v0.15.0` tag exists and the tag tarball sha256 can be computed.
49+
850
## [0.13.0] — 2026-05-02
951

1052
Minor release. Adds an onboarding-style transfer wizard for moving a portable

README.md

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,22 @@ metrics without training a model or sending telemetry.
2525
<img src="docs/diagram.svg" alt="agentic-stack architecture" width="880"/>
2626
</p>
2727

28-
### New in v0.13.0 — transfer wizard
29-
30-
Minor release. Adds an onboarding-style `agentic-stack transfer` wizard for
31-
moving a project brain into Codex, Cursor, Windsurf, or a terminal-only
32-
`AGENTS.md` setup.
33-
34-
- **Natural-language transfer plans.** Say things like `move my memory into
35-
Codex`; the wizard detects targets, memory scopes, and whether to generate a
36-
curl command, apply locally, or both.
37-
- **Portable memory bundles.** Transfers preferences, accepted lessons,
38-
skills, working memory, episodic/history logs, and candidate lessons, with
39-
SHA-256 verification and secret-like content blocking.
40-
- **One-line import.** Generated curl/PowerShell bootstraps import the bundle
41-
into another project and install the selected adapter files.
42-
- **Modern Windsurf rules.** Windsurf now gets `.windsurf/rules/agentic-stack.md`
43-
while keeping legacy `.windsurfrules` compatibility.
28+
### New in v0.15.0 — dashboard TUI
29+
30+
Minor release. Adds `agentic-stack dashboard` as the production front door for
31+
installed projects: one terminal screen for health, adapters, verification,
32+
memory, team brain, skills, instances, transfer, and local dashboard exports.
33+
34+
- **Dashboard command.** Run `agentic-stack dashboard` or `./install.sh dashboard`
35+
to open the TUI; use `dash` or `--plain` for a compact script-safe view.
36+
- **Trust-console parity.** The dashboard includes a per-harness verify matrix,
37+
accepted/rejected memory, `memory_why()` evidence lookup, team brain
38+
status/init, skills, and managed instances.
39+
- **Safer installed-project default.** Bare interactive `./install.sh` opens the
40+
dashboard once `.agent/install.json` exists; non-TTY shells still print
41+
script-safe command guidance instead of launching a TUI.
42+
- **Production coverage.** Renderer, CLI, parity, non-TTY fallback, and
43+
interactive keypress navigation are covered by local tests.
4444

4545
See [CHANGELOG.md](CHANGELOG.md) for the full list.
4646

@@ -130,6 +130,7 @@ cd agentic-stack
130130

131131
```bash
132132
brew update && brew upgrade agentic-stack
133+
agentic-stack dashboard
133134
```
134135

135136
### Clone instead?
@@ -147,6 +148,7 @@ After the first `./install.sh <adapter>`, manage your project with
147148
verb-style subcommands (works with both `install.sh` and `install.ps1`):
148149

149150
```bash
151+
./install.sh dashboard # TUI dashboard: health, verify, memory, team, skills, instances
150152
./install.sh add cursor # add a second adapter (Claude Code + Cursor in same repo)
151153
./install.sh status # one-screen view: which adapters, brain stats
152154
./install.sh doctor # read-only audit; green / yellow / red per adapter
@@ -155,12 +157,15 @@ verb-style subcommands (works with both `install.sh` and `install.ps1`):
155157
./install.sh remove cursor # confirm prompt + delete; no quarantine, no undo
156158
```
157159

160+
PowerShell uses the same verbs, for example `.\install.ps1 dashboard`.
161+
158162
Bare `./install.sh` (no arguments) opens a **multi-select wizard** on
159163
a fresh project — check every harness you actually use, hit enter,
160164
each one gets installed. The wizard auto-detects harnesses already on
161165
disk and pre-checks them. On a project that already has an
162-
`install.json`, bare `./install.sh` lists what's still installable.
163-
In non-TTY shells (CI), it prints usage and exits with code 2.
166+
`install.json`, bare interactive `./install.sh` opens the dashboard.
167+
In non-TTY shells (CI), it stays script-safe and prints the available
168+
subcommands instead of opening a TUI.
164169

165170
Upgrading from pre-v0.9? Run `./install.sh doctor` first — it
166171
synthesizes `install.json` from on-disk adapter signals so the new
@@ -364,6 +369,7 @@ harness_manager/ # v0.9.0 manifest-driven Python backend
364369
├── state.py # install.json read/write with fcntl/msvcrt locking
365370
├── doctor.py # read-only audit + pre-v0.9 migration synthesis
366371
├── remove.py # safe uninstall with shared-file detection + ownership handoff
372+
├── dashboard_tui.py # project dashboard for health/verify/memory/team/skills/instances
367373
├── post_install.py # named built-ins (openclaw_register_workspace)
368374
├── manage_tui.py # interactive menu loop for add/remove/audit
369375
├── transfer_tui.py # onboarding-style memory transfer wizard

harness_manager/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
"""harness_manager — manifest-driven adapter installer for agentic-stack.
22
33
This package is the implementation backend for `./install.sh` and `./install.ps1`.
4-
The user-facing surface is plain verbs: install, add, remove, doctor, status.
4+
The user-facing surface is plain verbs: install, add, remove, doctor, status,
5+
dashboard, manage, and transfer.
56
The "harness_manager" name is internal only and never appears in CLI help, docs,
67
or error messages users see.
78
"""
8-
__version__ = "0.13.0"
9+
__version__ = "0.15.0"

harness_manager/cli.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Argparse dispatcher. install.sh and install.ps1 invoke this.
22
3-
Verbs (subcommands): add, remove, doctor, status, manage, transfer.
3+
Verbs (subcommands): add, remove, doctor, status, manage, dashboard, transfer.
44
Anything else in first position → treated as an adapter name (existing
55
`./install.sh <adapter>` UX preserved).
66
"""
@@ -19,7 +19,7 @@
1919
from . import __version__
2020

2121

22-
VERBS = {"add", "remove", "doctor", "status", "manage", "transfer"}
22+
VERBS = {"add", "remove", "doctor", "status", "manage", "dashboard", "dash", "transfer"}
2323

2424

2525
def _stack_root() -> Path:
@@ -247,6 +247,17 @@ def cmd_manage(target: Path) -> int:
247247
return manage_tui.run(target_root=target, stack_root=_stack_root())
248248

249249

250+
def cmd_dashboard(target: Path, plain: bool = False) -> int:
251+
"""Open the project dashboard.
252+
253+
`plain` is primarily for non-TTY terminals and tests. The dashboard
254+
runner also falls back to plain output automatically when stdin/stdout
255+
are not interactive.
256+
"""
257+
from . import dashboard_tui
258+
return dashboard_tui.run(target_root=target, stack_root=_stack_root(), plain=plain)
259+
260+
250261
def cmd_transfer(args: list[str], target: Path) -> int:
251262
from . import transfer_tui
252263
return transfer_tui.run(args, target_root=target, stack_root=_stack_root())
@@ -263,6 +274,8 @@ def cmd_bare(target: Path, wizard_flags: list[str]) -> int:
263274
"""
264275
doc = state_mod.load(target)
265276
if doc is not None:
277+
if "--yes" not in wizard_flags and sys.stdin.isatty() and sys.stdout.isatty():
278+
return cmd_dashboard(target)
266279
installed = set(doc.get("adapters", {}).keys())
267280
available = set()
268281
root = _stack_root() / "adapters"
@@ -273,13 +286,15 @@ def cmd_bare(target: Path, wizard_flags: list[str]) -> int:
273286
not_installed = sorted(available - installed)
274287
if not not_installed:
275288
print(f"all available adapters already installed: {sorted(installed)}")
289+
print("open dashboard: ./install.sh dashboard")
276290
print("run `./install.sh status` for a summary.")
277291
return 0
278292
print(f"already installed: {sorted(installed)}")
279293
print(f"available to add: {not_installed}")
280294
print()
281295
print(f"to add one: ./install.sh add <name>")
282-
print(f"or interactively: ./install.sh manage")
296+
print(f"open dashboard: ./install.sh dashboard")
297+
print(f"or adapter manager only: ./install.sh manage")
283298
return 0
284299

285300
# No install.json. Pre-v0.9 migration gate: if this is a legacy
@@ -324,6 +339,7 @@ def cmd_bare(target: Path, wizard_flags: list[str]) -> int:
324339
print(" ./install.sh status # quick read-only view")
325340
print(" ./install.sh add <name> # install another adapter")
326341
print(" ./install.sh remove <name> # remove an adapter (with confirm)")
342+
print(" ./install.sh dashboard # interactive project dashboard")
327343
print(" ./install.sh manage # interactive TUI for adapter management")
328344
print(" ./install.sh transfer # onboarding-style memory transfer wizard")
329345
return 2
@@ -456,6 +472,19 @@ def main(argv: list[str] | None = None) -> int:
456472
if verb == "manage":
457473
target = Path(rest[1]) if len(rest) >= 2 else Path.cwd()
458474
return cmd_manage(target)
475+
if verb in ("dashboard", "dash"):
476+
plain = False
477+
target_args: list[str] = []
478+
for arg in rest[1:]:
479+
if arg == "--plain":
480+
plain = True
481+
else:
482+
target_args.append(arg)
483+
if len(target_args) > 1:
484+
print("usage: ./install.sh dashboard [target-dir] [--plain]", file=sys.stderr)
485+
return 2
486+
target = Path(target_args[0]) if target_args else Path.cwd()
487+
return cmd_dashboard(target, plain=plain)
459488
if verb == "transfer":
460489
return cmd_transfer(rest[1:], Path.cwd())
461490

0 commit comments

Comments
 (0)