diff --git a/CHANGELOG.md b/CHANGELOG.md index 939b4d8..1bd4903 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ --- +## [v0.28.1] CI Pipeline + Multi-Arch Docker Builds +*April 3, 2026 | 426 tests* + +### Features +- **GitHub Actions CI.** New workflow triggers on tag push (`v*`). Builds + multi-arch Docker images (linux/amd64 + linux/arm64), pushes to + `ghcr.io/nesquena/hermes-webui`, and creates a GitHub Release with + auto-generated release notes. Uses GHA layer caching for fast rebuilds. +- **Pre-built container images.** Users can now `docker pull ghcr.io/nesquena/hermes-webui:latest` + instead of building locally. + +--- + ## [v0.27] Profile Creation Fallback for Docker (Issue #44) *April 3, 2026 | 426 tests* @@ -904,4 +917,4 @@ Three-panel layout: sessions sidebar, chat area, workspace panel. --- -*Last updated: v0.27, April 3, 2026 | Tests: 426* +*Last updated: v0.28.1, April 3, 2026 | Tests: 426* diff --git a/README.md b/README.md index 5cc787a..0cc6b57 100644 --- a/README.md +++ b/README.md @@ -37,17 +37,24 @@ That is it. The script will: ## Docker -Run with Docker Compose (recommended): +**Pre-built images** (amd64 + arm64) are published to GHCR on every release: + +```bash +docker pull ghcr.io/nesquena/hermes-webui:latest +docker run -d -p 8787:8787 -v ~/.hermes:/root/.hermes ghcr.io/nesquena/hermes-webui:latest +``` + +Or run with Docker Compose (recommended): ```bash docker compose up -d ``` -Or build and run manually: +Or build locally: ```bash docker build -t hermes-webui . -docker run -d -p 8787:8787 -v ~/.hermes:/root/.hermes:ro hermes-webui +docker run -d -p 8787:8787 -v ~/.hermes:/root/.hermes hermes-webui ``` Open http://localhost:8787 in your browser. @@ -55,7 +62,7 @@ Open http://localhost:8787 in your browser. To enable password protection: ```bash -docker run -d -p 8787:8787 -e HERMES_WEBUI_PASSWORD=your-secret -v ~/.hermes:/root/.hermes:ro hermes-webui +docker run -d -p 8787:8787 -e HERMES_WEBUI_PASSWORD=your-secret -v ~/.hermes:/root/.hermes ghcr.io/nesquena/hermes-webui:latest ``` Session data persists in a named volume (`hermes-data`) across restarts. @@ -169,8 +176,8 @@ Or using the agent venv explicitly: ``` Tests run against an isolated server on port 8788 with a separate state directory. -Production data and real cron jobs are never touched. Current count: **415 tests** -across 21 test files. +Production data and real cron jobs are never touched. Current count: **426 tests** +across 22 test files. --- @@ -277,30 +284,31 @@ across 21 test files. server.py HTTP routing shell + auth middleware (~81 lines) api/ auth.py Optional password authentication, signed cookies (~149 lines) - config.py Discovery, globals, model detection, reloadable config (~701 lines) + config.py Discovery, globals, model detection, reloadable config (~702 lines) helpers.py HTTP helpers, security headers (~71 lines) - models.py Session model + CRUD (~137 lines) - profiles.py Profile state management, hermes_cli wrapper (~246 lines) + models.py Session model + CRUD (~146 lines) + profiles.py Profile state management, hermes_cli wrapper (~366 lines) routes.py All GET + POST route handlers (~1180 lines) - streaming.py SSE engine, run_agent, cancel support (~236 lines) + streaming.py SSE engine, run_agent, cancel support (~272 lines) upload.py Multipart parser, file upload handler (~78 lines) - workspace.py File ops, workspace helpers (~77 lines) + workspace.py File ops, workspace helpers (~245 lines) static/ index.html HTML template (~364 lines) style.css All CSS incl. mobile responsive (~670 lines) - ui.js DOM helpers, renderMd, tool cards, file tree (~977 lines) - workspace.js File preview, file ops (~185 lines) - sessions.js Session CRUD, list rendering, search (~533 lines) - messages.js send(), SSE handlers, approval, transcript (~297 lines) - panels.js Cron, skills, memory, profiles, settings (~974 lines) + ui.js DOM helpers, renderMd, tool cards, file tree (~1002 lines) + workspace.js File preview, file ops (~191 lines) + sessions.js Session CRUD, list rendering, search (~556 lines) + messages.js send(), SSE handlers, approval, transcript (~337 lines) + panels.js Cron, skills, memory, profiles, settings (~1030 lines) commands.js Slash command autocomplete (~156 lines) boot.js Mobile nav, voice input, boot IIFE (~338 lines) tests/ conftest.py Isolated test server (port 8788) - test_sprint{1-20b}.py 21 test files, 415 test functions + test_sprint{1-23}.py 22 test files, 426 test functions test_regressions.py Permanent regression gate (23 tests) Dockerfile python:3.12-slim container image docker-compose.yml Compose with named volume and optional auth +.github/workflows/ CI: multi-arch Docker build + GitHub Release on tag ``` State lives outside the repo at `~/.hermes/webui-mvp/` by default diff --git a/ROADMAP.md b/ROADMAP.md index 5602a96..a603d53 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -3,8 +3,8 @@ > Goal: Full 1:1 parity with the Hermes CLI experience via a clean dark web UI. > Everything you can do from the CLI terminal, you can do from this UI. > -> Last updated: Sprint 22 / v0.24 (April 3, 2026) -> Tests: 415 total (392 passing, 23 pre-existing failures) +> Last updated: v0.28.1 (April 3, 2026) +> Tests: 426 total (403 passing, 23 pre-existing failures) > Source: / --- @@ -46,11 +46,12 @@ | Layer | Location | Status | |-------|----------|--------| -| Python server | /server.py (~81 lines) + api/ modules (~2876 lines) | Thin shell + auth middleware + business logic in api/ | +| Python server | /server.py (~81 lines) + api/ modules (~3210 lines) | Thin shell + auth middleware + business logic in api/ | | HTML template | /static/index.html (~364 lines) | Served from disk | | CSS | /static/style.css (~670 lines) | Served from disk, incl. mobile responsive | -| JavaScript | /static/{ui,workspace,sessions,messages,panels,boot,commands}.js | 7 modules, ~3460 lines total | -| Docker | Dockerfile, docker-compose.yml, .dockerignore | python:3.12-slim, named volume | +| JavaScript | /static/{ui,workspace,sessions,messages,panels,boot,commands}.js | 7 modules, ~3610 lines total | +| Docker | Dockerfile, docker-compose.yml, .dockerignore | python:3.12-slim, multi-arch (amd64+arm64) | +| CI/CD | .github/workflows/release.yml | Auto-release + GHCR publish on tag push | | Runtime state | ~/.hermes/webui-mvp/sessions/ | Session JSON files | | Test server | Port 8788, state dir ~/.hermes/webui-mvp-test/ | Isolated, wiped per run | | Production server | Port 8787 | SSH tunnel from Mac | @@ -273,96 +274,29 @@ Enter saves, Escape cancels. Topbar updates immediately. --- -## Wave 3: Power Features and Developer Experience +## Completed Waves (Summary) -### Sprint 3.1: Tool Call Visibility Inline -Show tool calls as collapsible cards in the conversation. -Collapsed: tool name badge + one-line preview. Expanded: full args + result. - -### Sprint 3.2: Multi-Model Expansion -Add more models. Group by provider. Model info tooltip on hover. -(Partially done: 10 models in dropdown from Sprint 1.) - -### Sprint 3.2b: Resizable Panel Widths (COMPLETE Sprint 6) -Both sidebar and workspace panel are drag-resizable with localStorage persistence. - -### Sprint 3.3: Workspace File Actions -- [x] Rename file (inline, double-click) (Sprint 14) -- [x] Create folder (Sprint 14) -- [x] Syntax highlighted code preview (Prism.js) - -### Sprint 3.4: Conversation Controls -- [x] Copy message (Sprint 5) -- [x] Edit last user message + regenerate -- [x] Regenerate last assistant response -- [x] Clear conversation (wipe messages, keep session) - ---- - -## Wave 4: Settings, Configuration, Notifications - -### Sprint 4.1: Settings Panel -Full settings overlay: default model, default workspace, enabled toolsets, config viewer. - -### Sprint 4.2: Notification Panel -Bell icon with unread count. SSE endpoint for cron completions and errors. Toast pop-ups. - -### Sprint 4.3: Delivery Target Config -Configure and test-ping delivery targets (Discord, Telegram, Slack, email) for cron jobs. - ---- - -## Wave 5: Honcho Integration and Long-term Memory - -### Sprint 5.1: Honcho Memory Panel -User representation panel, cross-session context, Honcho search, memory write. - -### Sprint 5.2: Session Continuity Features -"What were we working on?" button, session tags, session archive. - ---- - -## Wave 6: Realtime and Agentic Features - -### Sprint 6.1: Background Task Monitor -Live list of running agent threads. Cancel button. Queue visibility. - -### Sprint 6.2: Subagent Delegation Cards -When delegate_task fires, show subagent progress inline in chat. - -### Sprint 6.3: Code Execution Panel -Jupyter-style inline code cell. Stateful kernel per session. - -### Sprint 6.4: Voice Mode -Push-to-talk mic button. Whisper transcription. Optional TTS playback. - ---- - -## Wave 7: Production Hardening and Mobile - -### Sprint 7.1: Authentication -HERMES_WEBUI_PASSWORD env var gate. Signed cookie. Login page. - -### Sprint 7.2: HTTPS and Reverse Proxy -Nginx + Let's Encrypt. CORS headers for external domain. - -### Sprint 7.3: Mobile Responsive Layout -Collapsible sidebar hamburger. Touch-friendly controls. Swipe gestures. - -### Sprint 7.4: Performance and Scale -Virtual scroll for session/message lists. Incremental message loading. +| Wave | Theme | Key Deliverables | +|------|-------|-----------------| +| Wave 2 | Full CRUD + Interaction | Cron/skill/memory CRUD, session search, workspace management, session rename | +| Wave 3 | Power Features | Tool call cards, multi-model dropdown, resizable panels, file actions, conversation controls | +| Wave 4 | Settings + Notifications | Settings panel, cron alerts, background error banner | +| Wave 5 | Session Continuity | Session tags, archive, projects/folders | +| Wave 6 | Agentic Features | Background task cancel, voice input (Web Speech API) | +| Wave 7 | Production Hardening | Password auth, security headers, mobile responsive, Docker + GHCR CI | --- ## User Requested Features -Community-requested enhancements tracked from GitHub issues. +Community-requested enhancements tracked from GitHub issues. All shipped. -| Feature | Issue | Description | Complexity | -|---------|-------|-------------|-----------| -| Workspace tree view | #22 | Accordion/tree view for workspace file browser instead of flat list. Lazy-load subdirectories on expand, no backend changes needed. | Medium | -| Docker container | #7 | Docker Compose setup with separate hermes-agent and hermes-webui containers, multi-arch (amd64 + arm64), volume mounts for config. | Medium-High | -| Authentication | #23 | Password gate via `HERMES_WEBUI_PASSWORD` env var, login page, signed cookie. Already planned in Sprint 7.1. | Low-Medium | -| Send key / personalization | #26 | Toggle send key (Enter vs Ctrl/Cmd+Enter) and queue vs interrupt mode as global settings. | Low | -| Multi-profile support | #28 | Profile management UI: create, delete, switch, configure agent profiles. | Medium | -| Mobile responsive UI | #21 | Hamburger menu, slide-out sidebar drawer, touch-friendly controls. Already planned in Sprint 7.3. | Medium-High | +| Feature | Issue | Shipped | Sprint | +|---------|-------|---------|--------| +| Workspace tree view | #22 | Done | Sprint 18 | +| Docker container + GHCR images | #7 | Done | Sprint 21 + v0.28.1 CI | +| Authentication | #23 | Done | Sprint 19 | +| Send key / personalization | #26 | Done | Sprint 17 | +| Multi-profile support | #28 | Done | Sprint 22 | +| Mobile responsive UI | #21 | Done | Sprint 21 | +| Profile creation in Docker | #44 | Done | v0.27 | diff --git a/SPRINTS.md b/SPRINTS.md index e50b6c6..6470d19 100644 --- a/SPRINTS.md +++ b/SPRINTS.md @@ -1,6 +1,6 @@ # Hermes Web UI -- Forward Sprint Plan -> Current state: v0.27 | 426 tests | Daily driver ready +> Current state: v0.28.1 | 426 tests | Daily driver ready > This document plans the path from here to two targets: > > Target A: 1:1 feature parity with the Hermes CLI (everything you can do from the @@ -663,5 +663,5 @@ and switchToProfile() didn't refresh workspaces or sessions. --- *Last updated: April 3, 2026* -*Current version: v0.27 | 426 tests* +*Current version: v0.28.1 | 426 tests* *Next sprint: Sprint 24 (Desktop Application)*