mirror of
https://github.com/awizemann/scarf.git
synced 2026-05-10 10:36:35 +00:00
docs: v2.7.5 release — Kanban v3, sidebar Manage→Monitor, per-project tenants, LocalTransport PATH enrichment
+10
@@ -18,6 +18,16 @@ In v2.5 most service code moved out of the Mac target into the shared **ScarfCor
|
||||
| [`ProjectDashboardService`](https://github.com/awizemann/scarf/blob/main/scarf/scarf/Core/Services/ProjectDashboardService.swift) | `Sendable struct` | ~71 | Loads/saves the project registry and per-project `.scarf/dashboard.json`. |
|
||||
| [`UpdaterService`](https://github.com/awizemann/scarf/blob/main/scarf/scarf/Core/Services/UpdaterService.swift) | `@MainActor @Observable` | ~41 | Thin Sparkle wrapper exposing the auto-check toggle, last-check date, and a "check now" trigger. |
|
||||
|
||||
## v2.7.5 additions (Kanban v3)
|
||||
|
||||
| Service | Isolation | Purpose |
|
||||
|---|---|---|
|
||||
| [`KanbanService`](https://github.com/awizemann/scarf/blob/main/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/KanbanService.swift) | `actor` (Sendable) in ScarfCore | Async wrapper around every Hermes v0.12 `kanban` verb — `list / show / runs / stats / assignees / log / create / assign / claim / comment / complete / block / unblock / archive / dispatch / link / unlink`. Each method dispatches its CLI invocation through `Task.detached(priority: .utility)` matching the existing concurrency conventions. Errors land in [`KanbanError`](https://github.com/awizemann/scarf/blob/main/scarf/Packages/ScarfCore/Sources/ScarfCore/Models/KanbanError.swift) and surface as inline banners (not modal alerts) since the board is high-frequency. The `"no matching tasks"` stdout sentinel is normalized to `[]` rather than thrown. Carries a pure `static func plan(for: KanbanTransition) throws -> KanbanTransitionPlan` that maps a `(from, to)` column pair to the right verb sequence — used by drag-drop in the board view and the "Start" button in the inspector. |
|
||||
| [`KanbanTenantResolver`](https://github.com/awizemann/scarf/blob/main/scarf/scarf/Core/Services/KanbanTenantResolver.swift) | `Sendable struct` (Mac target) | Mints `scarf:<slug>` tenants on first kanban interaction inside a project and persists to `<project>/.scarf/manifest.json`'s new optional `kanbanTenant` field. Slug is lowercased / hyphenated / ≤48 chars; `scarf:` prefix prevents collision with hand-typed tenants. Once minted, the tenant is **immutable across rename** so existing tasks stay attributable to the project. Bare projects (no template manifest) get a sentinel manifest with `id: scarf/<project-id>` + `version: 0.0.0` — `ProjectAgentContextService` recognizes the sentinel and refuses to surface it as a "Template" line. |
|
||||
| [`KanbanTenantReader`](https://github.com/awizemann/scarf/blob/main/scarf/Packages/ScarfCore/Sources/ScarfCore/Services/KanbanTenantReader.swift) | `Sendable struct` in ScarfCore | Cross-platform read-only projection over `<project>/.scarf/manifest.json`'s `kanbanTenant` field. The full `ProjectTemplateManifest` Codable type lives in the Mac target; this lightweight reader gives iOS a way to filter the per-project board by tenant without linking the full manifest model. |
|
||||
|
||||
`LocalTransport` (in ScarfCore) also gains an `environmentEnricher: (() -> [String: String])?` static in v2.7.5, mirroring `SSHTransport.environmentEnricher`. Wired by `scarfApp.swift` at launch to the same `HermesFileService.enrichedEnvironment()` login-shell probe (`zsh -l -i` → `zsh -l` fallback) the SSH transport already uses. Without this, GUI-launched Scarf inherits macOS's launch-services PATH (`/usr/bin:/bin:/usr/sbin:/sbin`) and child processes invoking `hermes` by bare name — notably the kanban dispatcher's worker spawn — fail with `executable not found on PATH` and record `outcome=spawn_failed`. Defense-in-depth: `LocalTransport.subprocessEnvironment(forExecutable:)` always prepends the executable's own directory to PATH if missing.
|
||||
|
||||
## v2.5.2 additions (in ScarfCore)
|
||||
|
||||
| Service | Isolation | Purpose |
|
||||
|
||||
@@ -4,7 +4,7 @@ Scarf reads Hermes's SQLite database directly and parses CLI output from `hermes
|
||||
|
||||
## Currently targeted
|
||||
|
||||
**Scarf 2.6.x targets Hermes v0.12.0 (v2026.4.30)**, bumped from Scarf 2.5's v0.11.0 target. v0.12.0 is the recommended minimum to get every v2.6 feature lit up: the autonomous **Curator** (sidebar / panel) needs `hermes curator`, **multimodal image input** in chat needs ACP's `prompt_capabilities.image`, the **5 new inference providers** (GMI Cloud, Azure AI Foundry, LM Studio first-class, MiniMax OAuth, Tencent TokenHub) need their entries in the v0.12 `HERMES_OVERLAYS` map, the **read-only Kanban** needs `hermes kanban list --json`, the **Skills v0.12 surface** (URL install, reload, OFF pill) needs `hermes skills install <url>` / `audit` and `skills.disabled` in config.yaml, cron `--workdir` needs the v0.12 cron schema, and `auxiliary.curator` is a new aux task that replaces the removed `flush_memories` task. Every one of these surfaces is **capability-gated** through `HermesCapabilities` (parses semver + `YYYY.M.D` from `hermes --version` once per server) — on a v0.11 host, Scarf 2.6 looks identical to Scarf 2.5.2 and the new affordances are hidden. `auxiliary.flush_memories` is preserved on v0.11 hosts (inverse gate via `hasFlushMemoriesAux`).
|
||||
**Scarf 2.6+ targets Hermes v0.12.0 (v2026.4.30)**, bumped from Scarf 2.5's v0.11.0 target. v0.12.0 is the recommended minimum to get every v2.6+ feature lit up: the autonomous **Curator** (sidebar / panel) needs `hermes curator`, **multimodal image input** in chat needs ACP's `prompt_capabilities.image`, the **5 new inference providers** (GMI Cloud, Azure AI Foundry, LM Studio first-class, MiniMax OAuth, Tencent TokenHub) need their entries in the v0.12 `HERMES_OVERLAYS` map, the **Kanban board** needs the full 27-verb `hermes kanban` surface (read-only `list` in v2.6, full read/write incl. `dispatch` / `claim` / `assign` / `complete` / `block` / `unblock` / `archive` / `comment` / `link` / `show` / `runs` / `stats` / `log` / `assignees` in v2.7.5), the **Skills v0.12 surface** (URL install, reload, OFF pill) needs `hermes skills install <url>` / `audit` and `skills.disabled` in config.yaml, cron `--workdir` needs the v0.12 cron schema, and `auxiliary.curator` is a new aux task that replaces the removed `flush_memories` task. Every one of these surfaces is **capability-gated** through `HermesCapabilities` (parses semver + `YYYY.M.D` from `hermes --version` once per server) — on a v0.11 host, Scarf 2.7.x looks identical to Scarf 2.5.2 plus the v2.7 perf work, and the v0.12 affordances are hidden. `auxiliary.flush_memories` is preserved on v0.11 hosts (inverse gate via `hasFlushMemoriesAux`).
|
||||
|
||||
The v2.5 baseline still applies: `/steer`, `messages.reasoning_content` / `sessions.api_call_count` columns, SKILL.md frontmatter chips, and `hermes memory reset` all require v0.11+. On earlier Hermes releases, Scarf 2.6 still runs — `/steer` is harmless on older agents (treated as an unknown command), v0.11 DB columns silently degrade to nil/0 via `HermesDataService.hasV011Schema`, and the new skills (`design-md`, `spotify`) only appear if installed.
|
||||
|
||||
@@ -18,7 +18,7 @@ The v2.5 baseline still applies: `/steer`, `messages.reasoning_content` / `sessi
|
||||
| v0.9.0 | 2026-04-13 | Verified |
|
||||
| v0.10.0 | 2026-04-16 | Verified (Tool Gateway introduced) |
|
||||
| v0.11.0 | 2026-04-23 | Verified |
|
||||
| v0.12.0 | 2026-04-30 | **Verified — current target** (Curator, multimodal ACP, 5 new providers, Teams + Yuanbao, Kanban, Skills URL install / disable / curator pin, cron --workdir, auxiliary.curator, prompt_caching.cache_ttl, redaction toggle, runtime metadata footer, Piper TTS, Vercel terminal) |
|
||||
| v0.12.0 | 2026-04-30 | **Verified — current target** (Curator, multimodal ACP, 5 new providers, Teams + Yuanbao, Kanban — read-only list in v2.6, full read/write board with per-project tenants in v2.7.5, Skills URL install / disable / curator pin, cron --workdir, auxiliary.curator, prompt_caching.cache_ttl, redaction toggle, runtime metadata footer, Piper TTS, Vercel terminal) |
|
||||
|
||||
## How compatibility is maintained
|
||||
|
||||
|
||||
+2
-2
@@ -2,7 +2,7 @@
|
||||
|
||||
A native macOS companion app for the [Hermes AI agent](https://github.com/hermes-ai/hermes-agent). Full visibility into what Hermes is doing, when, and what it creates — across one local install or many remote ones.
|
||||
|
||||
**Latest release:** [v2.7.1](https://github.com/awizemann/scarf/releases/tag/v2.7.1) — patch release fixing three bugs filed against 2.7.0 ([#77](https://github.com/awizemann/scarf/issues/77) Sessions screen empty, [#78](https://github.com/awizemann/scarf/issues/78) Skills "What's New" pill schizophrenia, [#79](https://github.com/awizemann/scarf/issues/79) hub search misses skills visible in Browse) plus follow-up cleanups in the same neighborhood: tighter `pgrep` for the gateway probe, port-anchored stop-dashboard (no more `pkill -f`), and a new `scripts/local-build.sh` + `BUILDING.md` for unsigned Debug builds without an Apple Developer account. See [v2.7.1 release notes](https://github.com/awizemann/scarf/blob/main/releases/v2.7.1/RELEASE_NOTES.md). 2.7.0 highlights are still the headline story — **skeleton-then-hydrate chat + Activity loaders**, **SSH cancellation propagation** (no more "third chat hangs / dashboard spins"), **in-flight coalescing**, **New Project from Scratch wizard**, **Cron + Keychain** mirroring, **five new dashboard widgets**, **OAuth keepalive cron**, and the **ScarfMon** perf harness. Full vocabulary in [Performance-Monitoring](Performance-Monitoring).
|
||||
**Latest release:** [v2.7.5](https://github.com/awizemann/scarf/releases/tag/v2.7.5) — feature release lifting Kanban from a read-only list to a full **drag-and-drop board** with the complete Hermes v0.12 mutation surface wired up, plus **per-project Kanban tabs** bound to a Scarf-minted `scarf:<slug>` tenant slug, a **read-only board on iOS**, and a new `kanban_summary` dashboard widget. Inspector pane streams worker stdout from `hermes kanban log <id>` every 2s while running, surfaces a health banner for unassigned tasks and last-failed-run states, and lets you reassign profiles inline without touching a terminal. Sidebar moves Kanban from *Manage* → *Monitor* (it's runtime work-in-progress, not config). Pre-v0.12 hosts gracefully hide the surface end-to-end. See [v2.7.5 release notes](https://github.com/awizemann/scarf/blob/main/releases/v2.7.5/RELEASE_NOTES.md). 2.7.0 / 2.7.1 highlights are still in play — **skeleton-then-hydrate chat + Activity loaders**, **SSH cancellation propagation**, **in-flight coalescing**, **New Project from Scratch wizard**, **Cron + Keychain** mirroring, **five new dashboard widgets**, the **ScarfMon** perf harness, and the 2.7.1 bug-fix round (#77 Sessions empty, #78 Skills pill, #79 hub search). Full vocabulary in [Performance-Monitoring](Performance-Monitoring).
|
||||
**Latest mobile:** [Join the public TestFlight](https://testflight.apple.com/join/qCrRpcTz). The link is live now but only accepts new beta testers once Apple's Beta Review approves the first build — see [ScarfGo](ScarfGo) for the full feature tour.
|
||||
**Targets Hermes:** v0.12.0 (v2026.4.30) — autonomous Curator, multimodal ACP image content blocks, 5 new providers, Microsoft Teams + Yuanbao gateways, Kanban CLI, Skills URL install / reload / disable, cron `--workdir`, `auxiliary.curator`, prompt-cache TTL, Piper TTS, Vercel terminal. v0.11.0 / v0.10.0 still work for everything that didn't change — Scarf detects the host's Hermes version and hides v0.12-only surfaces gracefully.
|
||||
**Available in:** English, Simplified Chinese (zh-Hans), German (de), French (fr), Spanish (es), Japanese (ja), Brazilian Portuguese (pt-BR). See [Localization](Localization). _ScarfGo is English-only in v1._
|
||||
@@ -41,4 +41,4 @@ Scarf 2.0 is a multi-window app — one window per Hermes server, local or remot
|
||||
Open-source (MIT), 160+ stars, actively maintained. See [Roadmap](Roadmap) for what's coming.
|
||||
|
||||
---
|
||||
_Last updated: 2026-05-07 — Scarf v2.7.1 (patch: Sessions empty fix #77, Skills pill schizophrenia #78, hub search misses #79, narrower gateway pgrep, port-anchored stop-dashboard, contributor `local-build.sh` + `BUILDING.md`)_
|
||||
_Last updated: 2026-05-08 — Scarf v2.7.5 (Kanban v3: drag-and-drop board, per-project tenants, inline assignee picker + auto-dispatch, worker log streaming, iOS read-only board, kanban_summary widget, sidebar Manage → Monitor; LocalTransport PATH enrichment fixes spawn_failed in GUI-launched Scarf)_
|
||||
|
||||
+10
-2
@@ -192,7 +192,15 @@ Scarf v2.7 added five new widget types — `markdown_file`, `log_tail`, `cron_st
|
||||
- Bundles that adopt new widget types still validate against the existing manifest schema — only the catalog validator's vocabulary list ([`tools/widget-schema.json`](https://github.com/awizemann/scarf/blob/main/tools/widget-schema.json)) was extended.
|
||||
- A v2.7-authored dashboard installed into a pre-v2.7 Scarf renders unknown widgets as a clearly-labeled error card (not a crash), so forward-incompatibility degrades gracefully.
|
||||
|
||||
See [Projects](Projects-and-Profiles) for the full widget catalog and the typed status badge synonyms.
|
||||
### v2.7.5 — `kanban_summary` widget + new `kanbanTenant` manifest field
|
||||
|
||||
v2.7.5 adds a sixth additive widget kind — **`kanban_summary`** — and a new optional `kanbanTenant` field on the manifest. Same forward-compatibility rules apply:
|
||||
|
||||
- **`kanban_summary`** renders the top three `running` / `blocked` / `todo` tasks for the current project's tenant by priority, plus a glance footer (`"12 todo · 3 running · 5 blocked"`) sourced from `hermes kanban stats`. Polls every 10s while the dashboard is foregrounded. Drop `{ kind: kanban_summary, max_rows: 3 }` into a dashboard.json section to include it. Catalog validator ([`tools/build-catalog.py`](https://github.com/awizemann/scarf/blob/main/tools/build-catalog.py)) and site renderer ([`site/widgets.js`](https://github.com/awizemann/scarf/blob/main/site/widgets.js)) recognize it; bundles using it keep validating against the existing schema.
|
||||
- **`kanbanTenant`** is a Scarf-minted `scarf:<slug>` string written to `<project>/.scarf/manifest.json` on first kanban interaction inside a project, so per-project boards filter by it automatically. **Templates do not ship `kanbanTenant`** — it's user-machine-scoped state. The exporter strips it out of bundles so two installs of the same template don't collide on tenants. Catalog validator skips the field entirely.
|
||||
- The widget is **only useful when Hermes ≥ v0.12** (the `kanban` CLI surface). On a pre-v0.12 host, `KanbanSummaryWidgetView` renders its empty/error state and the rest of the dashboard keeps working.
|
||||
|
||||
See [Projects](Projects-and-Profiles) for the full widget catalog, the per-project Kanban board surface, and the typed status badge synonyms.
|
||||
|
||||
### `AGENTS.md` contract
|
||||
|
||||
@@ -295,4 +303,4 @@ Use `{{PROJECT_DIR}}` in the cron prompt. Hermes doesn't set a CWD for cron runs
|
||||
- [Release Notes Index](Release-Notes-Index) — v2.2.0 for the full launch notes.
|
||||
|
||||
---
|
||||
_Last updated: 2026-05-04 — Scarf v2.7 (5 new widget types; no manifest schema bump required)_
|
||||
_Last updated: 2026-05-08 — Scarf v2.7.5 (`kanban_summary` widget + per-project `kanbanTenant` manifest field; templates never ship the tenant — exporter strips it)_
|
||||
|
||||
+3
-1
@@ -33,7 +33,9 @@ The full schema is documented in [`scarf/docs/DASHBOARD_SCHEMA.md`](https://gith
|
||||
|
||||
**Adding a project:** click + in the Projects sidebar, pick a directory. The project is registered in `~/.hermes/scarf/projects.json`; the dashboard JSON lives in `<project>/.scarf/dashboard.json` (which you should add to your project's `.gitignore` if it's user-specific).
|
||||
|
||||
**Per-project tabs** _(v2.3+, v2.5)_: clicking a project row reveals a tabbed detail view — **Dashboard**, **Sessions**, **Site** (when the dashboard has a webview widget), and **Slash Commands** (v2.5). The Sessions tab lists chats attributed to the project; **New Chat** spawns `hermes acp` with the project's directory as the session cwd and writes a Scarf-managed block into `<project>/AGENTS.md` so the agent boots with project context. Attribution survives across Mac and ScarfGo via the shared `SessionAttributionService`. See [Slash Commands](Slash-Commands) for the per-project authoring tab.
|
||||
**Per-project tabs** _(v2.3+, v2.5, v2.7.5)_: clicking a project row reveals a tabbed detail view — **Dashboard**, **Sessions**, **Site** (when the dashboard has a webview widget), **Kanban** (v2.7.5+, Hermes v0.12+ only), and **Slash Commands** (v2.5). The Sessions tab lists chats attributed to the project; **New Chat** spawns `hermes acp` with the project's directory as the session cwd and writes a Scarf-managed block into `<project>/AGENTS.md` so the agent boots with project context. Attribution survives across Mac and ScarfGo via the shared `SessionAttributionService`. See [Slash Commands](Slash-Commands) for the per-project authoring tab.
|
||||
|
||||
**Per-project Kanban** _(v2.7.5)_: each project gets its own Kanban board scoped to a Scarf-minted `scarf:<slug>` tenant. The slug is derived from the project name (lowercased, hyphenated, ≤48 chars), persisted to `<project>/.scarf/manifest.json`'s new optional `kanbanTenant` field on first kanban interaction, and **immutable across rename** so existing tasks stay attributable. `ProjectAgentContextService` adds a `Kanban tenant: scarf:<slug>` line inside the AGENTS.md scarf-managed block at every chat-start, instructing the agent to pass `--tenant <slug>` on `hermes kanban create` so agent-spawned tasks land on the right project board automatically. Bare projects (no template manifest) get a sentinel manifest written with `id: scarf/<project-id>` + `version: 0.0.0` + just the `kanbanTenant` set — `ProjectAgentContextService` recognizes the sentinel and refuses to surface it as a "Template" line, so a project that's never been template-installed doesn't suddenly start advertising a fake template to the agent. iOS gets a read-only board on the same project tab as a horizontally-paged segmented `Picker` of single-column lists. The new `kanban_summary` dashboard widget shows the top three `running` / `blocked` / `todo` tasks plus a glance footer (`"12 todo · 3 running · 5 blocked"`); add `{ kind: kanban_summary, max_rows: 3 }` to `dashboard.json` to include it. See [Sidebar and Navigation](Sidebar-and-Navigation) for the global Kanban surface.
|
||||
|
||||
**Sharing a project:** as of v2.2.0, projects can be packaged into `.scarftemplate` bundles and shared with anyone — see [Project Templates](Project-Templates). Export turns a live project into a redistributable bundle; install unpacks one and sets up the dashboard, skills, cron jobs, configuration schema, and (in v2.5+) project-scoped slash commands in a single preview-and-confirm step. The public catalog lives at [awizemann.github.io/scarf/templates/](https://awizemann.github.io/scarf/templates/).
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ Every Scarf release in chronological order. The notes themselves live in `releas
|
||||
|
||||
| Version | Date | GitHub release | Notes file |
|
||||
|---|---|---|---|
|
||||
| **v2.7.5** | 2026-05-08 | [v2.7.5](https://github.com/awizemann/scarf/releases/tag/v2.7.5) | [`releases/v2.7.5/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.5/RELEASE_NOTES.md) |
|
||||
| **v2.7.1** | 2026-05-07 | [v2.7.1](https://github.com/awizemann/scarf/releases/tag/v2.7.1) | [`releases/v2.7.1/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.1/RELEASE_NOTES.md) |
|
||||
| **v2.7.0** | 2026-05-05 | [v2.7.0](https://github.com/awizemann/scarf/releases/tag/v2.7.0) | [`releases/v2.7.0/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.0/RELEASE_NOTES.md) |
|
||||
| **v2.6.5** | 2026-05-03 | [v2.6.5](https://github.com/awizemann/scarf/releases/tag/v2.6.5) | [`releases/v2.6.5/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.6.5/RELEASE_NOTES.md) |
|
||||
@@ -25,6 +26,8 @@ Every Scarf release in chronological order. The notes themselves live in `releas
|
||||
|
||||
## Highlights by major
|
||||
|
||||
**2.7.5** — Feature release that lifts Kanban from a read-only list (the v2.6 placeholder shipped while upstream Kanban was still mid-rework) to a full **drag-and-drop board** with the complete Hermes v0.12 mutation surface wired up. Five visible columns (Triage / Up Next / Running / Blocked / Done) collapsing the seven Hermes statuses into a layout that doesn't waste space on `ready`. Drop-on-Running fires `kanban dispatch`, drop-on-Blocked / drop-on-Done open optional reason / result sheets and call the matching verb, blocked → running chains `unblock` + `dispatch`; forbidden transitions reject with red-stroke feedback (Done is terminal; Triage is promoted by a specifier worker). **Side-pane inspector** with Comments / Events / Runs / Log tabs — Log streams worker stdout via `hermes kanban log <id>` polled every 2s while the task is running with auto-scroll and a `● streaming` indicator. Inline assignee picker on the inspector header (yellow chip when unassigned to catch the eye); selecting a profile fires `kanban assign` + `kanban dispatch`. Health banner surfaces unassigned-and-stuck (`skipped_unassigned`) and last-failed-run (`stale_lock` / `crashed` / etc.) states; suppressed during an active fresh attempt so the Log tab is the live signal. **Per-project Kanban tabs** bound to a Scarf-minted `scarf:<slug>` tenant slug persisted to `<project>/.scarf/manifest.json` (immutable across rename); `ProjectAgentContextService` injects a `Kanban tenant: …` line into the AGENTS.md scarf-managed block so agents pass `--tenant <slug>` automatically. New `kanban_summary` dashboard widget. **iOS read-only board** as a horizontally-paged segmented `Picker` of single-column lists; tap a card → modal Comments / Events / Runs sheet. **Sidebar moves Kanban from Manage → Monitor** — runtime work-in-progress, not configuration. **`Board | List` toggle** preserves the v2.6 list view as a fallback. **Critical fix in the same release: GUI-launched Scarf was handing every local subprocess macOS's stripped launch-services PATH (`/usr/bin:/bin:/usr/sbin:/sbin`)**, which meant the kanban dispatcher's worker spawn couldn't find `hermes` by name and recorded `outcome=spawn_failed`. `LocalTransport` now mirrors `SSHTransport.environmentEnricher` and is wired by `scarfApp.swift` to the same `HermesFileService.enrichedEnvironment()` login-shell probe. 19 new ScarfCore tests cover decoding (incl. Unix integer timestamps from SQLite columns), the transition planner's verb mapping, argv assembly, glance string formatting, the `(no` parser-leak fix from `kanban assignees`'s empty-state sentinel, and the env-enrichment fallback. Pre-v0.12 hosts gracefully hide the surface end-to-end.
|
||||
|
||||
**2.7.1** — Patch bundling three bug reports filed against 2.7.0 plus follow-up cleanups in the same neighborhood. **[#77](https://github.com/awizemann/scarf/issues/77) Sessions screen empty** — pipe-buffer deadlock in `SSHScriptRunner` (v2.7's batched `sessionListSnapshot` payload finally crossed macOS's 16–64 KB pipe-buffer threshold for any user with ~150+ sessions); fixed by draining stdout/stderr concurrently via `readabilityHandler`. **[#78](https://github.com/awizemann/scarf/issues/78) Skills "What's New" pill schizophrenia** — pill (local file deltas) and Updates tab (upstream version availability) both said "update"; pill scoped to Installed sub-tab and reworded "updated" → "changed". **[#79](https://github.com/awizemann/scarf/issues/79) hub search returns nothing visible in Browse** — Hermes's "all sources" search routes through the centralized index and skips API sources; "All Sources" search now filters the cached Browse list client-side. Plus narrower `pgrep` for the gateway probe and port-anchored stop-dashboard (replacing broad `pkill -f`). New `scripts/local-build.sh` + `BUILDING.md` for unsigned Debug builds without an Apple Developer account. Doc fix: `BUILDING.md` and `CONTRIBUTING.md` runtime min restored to **macOS 14.6 (Sonoma)** / **Xcode 16.0**. Cherry-picked from [#76](https://github.com/awizemann/scarf/pull/76) — thanks to [@unixwzrd](https://github.com/unixwzrd) and [@bricelb](https://github.com/bricelb).
|
||||
|
||||
**2.7** — The largest perf-focused release since 2.6 (36 commits, no schema bump, no Hermes capability bump). **Skeleton-then-hydrate chat + Activity loaders** make slow-remote contexts usable: a `fetchSkeletonMessages` / `fetchRecentToolCallSkeleton` pair selects only the columns needed to render placeholder rows (NULLs the heavy ones at SQL level), then paged background hydration fills tool calls in 5-id batches; tool-result CONTENT is opt-in via Settings → Display, with per-card lazy-fetch in the inspector pane. **L1 single-id whale recovery** when a 5-id batch trips the 30s timeout. **SSH cancellation propagation** through `SSHScriptRunner.run` + `RemoteSQLiteBackend.query` via `withTaskCancellationHandler` — kills abandoned ssh subprocesses within 100ms instead of pinning them to the 30s deadline (fixes "third chat hangs" / "dashboard spins" after rapid switching). **In-flight coalescing** for `loadRecentSessions` drops the 2-3× contention seen during file-watcher streams. **Loading-state UX hardening**: synchronous greying of the chat sidebar on click; phase-typed status ("Spawning hermes acp…" → "Authenticating…" → "Loading session…" → "Loading history…" → "Ready"). **Partial-result + mismatch + pinned-model banners** replace silent empty-states. **New Project from Scratch wizard** scaffolds a Scarf-standard skeleton + AGENTS.md marker block, registers it, and hands off to a chat session that auto-activates the bundled `scarf-template-author` skill. **Cron + Keychain** mirrors resolved Keychain values into `~/.hermes/.env` under marker-bounded `$SCARF_<UPPER_SLUG>_<UPPER_FIELD>` env vars (cron prompts can finally use secret-typed config fields without the literal `keychain://` URI surfacing). **Five new dashboard widgets** (`markdown_file`, `log_tail`, `cron_status`, `image`, `status_grid`) with project-wide auto-refresh; **`stat` gains inline sparklines**; typed status enum with lenient decode; structured widget error card. **OAuth keepalive cron** prevents weeks-of-inactivity expiry; **remote OAuth re-auth** unblocked; **OAuth remove button**; `resolve_provider_client` errors classified into a clear hint. **ScarfMon** — perf instrumentation harness: 4096-entry in-memory ring buffer + os.Logger backend + signpost-only mode; new measure points across chat / transport / sqlite / sessionLoad / diskIO with payload bytes recorded. **In-app release notes** via inline `<description>` HTML in the Sparkle appcast (rendered from `releases/v<ver>/RELEASE_NOTES.md` by `tools/render-release-notes.py`).
|
||||
|
||||
@@ -16,9 +16,9 @@ Each Scarf window has its **own** `AppCoordinator` — selection in one window d
|
||||
|
||||
## SidebarSection
|
||||
|
||||
`SidebarSection` ([`AppCoordinator.swift`](https://github.com/awizemann/scarf/blob/main/scarf/scarf/Navigation/AppCoordinator.swift)) is the source of truth for every sidebar item. Each case has a `rawValue` (display name) and an `icon` (SF Symbol name). **24 cases** grouped into **5 sidebar headers** (the order is hardcoded in `SidebarView.swift`). Two new items in v2.6: **Curator** (under Interact) and **Kanban** (under Manage), both capability-gated on Hermes v0.12 and hidden on older hosts.
|
||||
`SidebarSection` ([`AppCoordinator.swift`](https://github.com/awizemann/scarf/blob/main/scarf/scarf/Navigation/AppCoordinator.swift)) is the source of truth for every sidebar item. Each case has a `rawValue` (display name) and an `icon` (SF Symbol name). **24 cases** grouped into **5 sidebar headers** (the order is hardcoded in `SidebarView.swift`). v2.6 introduced two capability-gated items: **Curator** (under Interact) and **Kanban**. v2.7.5 **moved Kanban from Manage → Monitor** to reflect that the board surfaces runtime work-in-progress, not configuration — it now sits at the bottom of the Monitor group alongside Dashboard / Insights / Sessions / Activity.
|
||||
|
||||
### Monitor (4)
|
||||
### Monitor (5 — Hermes v0.12+ shows Kanban)
|
||||
|
||||
| Section | Icon |
|
||||
|---|---|
|
||||
@@ -26,6 +26,7 @@ Each Scarf window has its **own** `AppCoordinator` — selection in one window d
|
||||
| Insights | `chart.bar` |
|
||||
| Sessions | `bubble.left.and.bubble.right` |
|
||||
| Activity | `bolt.horizontal` |
|
||||
| Kanban (v0.12+) | `rectangle.split.3x1` |
|
||||
|
||||
### Projects (1)
|
||||
|
||||
@@ -58,20 +59,19 @@ Projects has its own header — not a Manage sub-item — because per-project wo
|
||||
| Webhooks | `arrow.up.right.square` |
|
||||
| Profiles | `person.2.crop.square.stack` |
|
||||
|
||||
### Manage (8)
|
||||
### Manage (7)
|
||||
|
||||
| Section | Icon |
|
||||
|---|---|
|
||||
| Tools | `wrench.and.screwdriver` |
|
||||
| MCP Servers | `puzzlepiece.extension` |
|
||||
| Messaging Gateway | `antenna.radiowaves.left.and.right` |
|
||||
| Kanban | `rectangle.stack` |
|
||||
| Cron | `clock.arrow.2.circlepath` |
|
||||
| Health | `stethoscope` |
|
||||
| Logs | `doc.text` |
|
||||
| Settings | `gearshape` |
|
||||
|
||||
**Kanban** (v2.6, Hermes v0.12+ only) is a read-only view over `hermes kanban list --json` — paginated table filtered by status, status badges, meta chips (id / assignee / workspace / skills), 5s polling while foregrounded. Capability-gated on `HermesCapabilities.hasKanban`; the create / claim / dispatch UI is deferred until upstream stabilizes the multi-profile collab layer (which was reverted in v0.12).
|
||||
**Kanban** (v2.6 introduced read-only; v2.7.5 lifted to full read/write) is the Mac board view over `hermes kanban`. Capability-gated on `HermesCapabilities.hasKanban` — pre-v0.12 hosts hide the row entirely. v2.7.5 ships a `Board | List` toggle: the **Board** mode renders a five-column drag-and-drop layout (Triage / Up Next / Running / Blocked / Done; archived hides behind a header toggle) with optimistic-merge state, a side-pane inspector (Comments / Events / Runs / Log tabs), inline assignee picker, health banners for unassigned + last-failed-run states, and a New Task sheet that defaults assignee to the active local profile and auto-fires `kanban dispatch` after create. The **List** mode preserves the v2.6 read-only flat table for narrow windows and accessibility. Drag-drop maps to verbs through a pure `KanbanService.plan(for:)` transition planner: `(.upNext, .running) → [.dispatch]`, `(.blocked, .running) → [.unblock, .dispatch]`, etc. — `dispatch` (not `claim`) is the right verb for a GUI client because Scarf doesn't host workers; the gateway-running dispatcher does. See [Architecture Overview](Architecture-Overview) for the tenant-as-project-key strategy and [Hermes Version Compatibility](Hermes-Version-Compatibility) for the version gate.
|
||||
|
||||
The Gateway item's `displayName` is **"Messaging Gateway"** — disambiguates from the v2.3 Tool Gateway (Nous Portal subscription routing) which is a Health-tab surface, not its own sidebar item. The enum case is still `.gateway` and the persisted state file path (`~/.hermes/gateway_state.json`) is unchanged.
|
||||
|
||||
@@ -81,9 +81,9 @@ The Gateway item's `displayName` is **"Messaging Gateway"** — disambiguates fr
|
||||
|
||||
```swift
|
||||
List(selection: $coordinator.selectedSection) {
|
||||
Section("Monitor") { … }
|
||||
Section("Projects") { … }
|
||||
Section("Interact") { … }
|
||||
Section("Monitor") { …, kanban (v0.12+) }
|
||||
Section("Interact") { …, curator (v0.12+) }
|
||||
Section("Configure") { … }
|
||||
Section("Manage") { … }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user