Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-28 16:23 UTC

YoanWai / agent-manager

Terminal UI to manage AI coding-agent sessions (Claude Code, OpenCode, Codex, Grok Build) in tmux: live status, group tree, live pane preview, resource gauges.

GoMIT★ 9 Sterne⑂ 0 Forksseit Juli 2026Auf GitHub ansehen ↗

YoanWai/agent-manager erreicht einen Gesundheitsindex von 51 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (77/100) ab, am schwächsten bei Security (28/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

51
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

51
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Yoan WainmannPersönliches Konto
2 Follower20 öffentliche Reposseit Mai 2022Mreshet

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/YoanWai/agent-managerv0.10.1-19vor 2 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

69Mittel · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
1.4/36Commit-Rhythmus — 2/52 Wochen mit Commits
18/18Commit-Volumen — 180 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year180
human_commit_share1
days_since_last_push0
active_weeks_last_year2
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 19 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 2 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count19
latest_release_tagv0.10.1
releases_from_tagsnein
days_since_latest_release2
mean_days_between_releases0,6

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

31Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
14.6/60Stars — 9 Stars
0/25Forks — 0 Forks
0/15Watcher — 1 Watcher
Verwendete Eingangsdaten
forks0
stars9
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

45Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
3.9/46.8Issue-Lösungsquote — 8 % der Issues geschlossen
37.4/38.3PR-Annahme — 88/90 entschiedene PRs gemergt
3/15OpenSSF Scorecard: Code-Review — Found 3/12 approved changesets -- score normalized to 2
Verwendete Eingangsdaten
merged_prs88
open_issues11
closed_issues1
issue_closed_ratio0,083
closed_unmerged_prs2
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
3.4/25Reichweite des Inhabers — 2 Follower von YoanWai
17.9/25Kontohistorie — 20 öffentliche Repos, Kontoalter ca. 4 Jahre
Verwendete Eingangsdaten
followers2
owner_typeUser
is_verified
owner_loginYoanWai
public_repos20
account_age_days1.519
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 2 Tagen
20/20Versionshistorie — 19 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/YoanWai/agent-manager
ecosystemsgo
any_deprecatednein
min_days_since_publish2

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

77Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://github.com/YoanWai/agent-manager
10/10Repository-Beschreibung
10/10Topics — 15 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsagentic, ai-agents, bubbletea, claude-code, cli, coding-agent, developer-tools, golang, opencode, terminal, tmux, tui, code-review, codex, grok
has_wikinein
homepagehttps://github.com/YoanWai/agent-manager
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

28Kritisch · 16 % des Gesamtindex

Sicherheitslage

28Kritisch
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
2.5/2.5CI-Tests — 12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
1.5/7.5Code-Review — Found 3/12 approved changesets -- score normalized to 2
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate2,8
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, packaging. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

52Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
0/10Belegte Agentenpraxis — keine von Agenten verfassten Commits unter den letzten 100
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
54.2/55Handhabbare Dateigrößen — 1/73 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes73.920
source_files_sampled73
oversized_source_files1
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
20/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalja
api_schema_files

Eckdaten

9GitHub-Sterne
1Mitwirkende
180Commits, letzte 12 Monate
0Tage seit letztem Push
19Releases
1Bus-Faktor
11offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

OpenSSF Scorecard 2.8 / 10
2.8Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-28 16:22 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests12 out of 12 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
2Code-ReviewFound 3/12 approved changesets -- score normalized to 2
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
1Vulnerabilities9 existing vulnerabilities detected
Direkte Abhängigkeiten 13
RegistryPaketVersionsvorgabeManifest
Gogithub.com/BurntSushi/tomlv1.6.0go.mod
Gogithub.com/alecthomas/chroma/v2v2.27.0go.mod
Gogithub.com/aymanbagabas/go-udiffv0.4.1go.mod
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.6go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/modelcontextprotocol/go-sdkv1.6.1go.mod
Gogithub.com/sergi/go-diffv1.4.0go.mod
Gogithub.com/shirou/gopsutil/v4v4.26.6go.mod
Gogolang.design/x/clipboardv0.8.0go.mod
Gomodernc.org/sqlitev1.53.0go.mod
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "agentic",
        "ai-agents",
        "bubbletea",
        "claude-code",
        "cli",
        "coding-agent",
        "developer-tools",
        "golang",
        "opencode",
        "terminal",
        "tmux",
        "tui",
        "code-review",
        "codex",
        "grok"
      ],
      "is_fork": false,
      "size_kb": 10027,
      "has_wiki": false,
      "homepage": "https://github.com/YoanWai/agent-manager",
      "languages": {
        "Go": 701639
      },
      "pushed_at": "2026-07-28T16:04:09Z",
      "created_at": "2026-07-15T16:27:33Z",
      "owner_type": "User",
      "updated_at": "2026-07-28T15:42:18Z",
      "description": "Terminal UI to manage AI coding-agent sessions (Claude Code, OpenCode, Codex, Grok Build) in tmux: live status, group tree, live pane preview, resource gauges.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "yoanwai.com",
      "name": "Yoan Wainmann",
      "type": "User",
      "login": "YoanWai",
      "company": "Mreshet",
      "location": "Israel Tel Aviv",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/106609173?v=4",
      "created_at": "2022-05-31T14:52:21Z",
      "is_verified": null,
      "public_repos": 20,
      "account_age_days": 1519
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.10.1",
          "kind": "patch",
          "published_at": "2026-07-26T10:09:45Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-26T00:33:00Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-07-25T13:41:21Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-23T16:58:09Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-23T13:49:47Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-23T13:23:59Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-07-22T18:38:01Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-07-20T21:13:55Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-20T20:21:37Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-07-20T17:23:45Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-20T17:18:02Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-20T16:49:12Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-20T15:04:36Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-07-19T16:00:14Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-19T15:50:47Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-19T08:21:00Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-18T15:05:34Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-17T09:37:15Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-16T16:59:13Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2c3e384ae6506426fb775f0cf76d2e8faf38eefc",
          "body": "The archived view read the same as the active one: its only marker was\na grey \"· archived\" tucked into the header's right edge, easy to miss\nafter pressing t. Paint the scope as an inverted badge and repeat it\ndirectly above the session tree with the key that returns to active.",
          "is_bot": false,
          "headline": "feat(ui): flag the archived view with a bold badge (#102)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-28T15:33:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84ffc2c92186ea4b387098cf59661098a08ddb52",
          "body": "* fix Codex quick prompt submission\n\n* fix chooser navigation",
          "is_bot": false,
          "headline": "Fix chooser navigation and Codex quick-prompt submission (#99)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T19:57:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "105ecd010907e2df3936df484f52a40efabb317d",
          "body": null,
          "is_bot": false,
          "headline": "docs: remove vanity badges (#98)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T19:55:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "138ecab3ad28ab407de2d688debd5f0d78b76869",
          "body": "* docs: refresh project badges\n\n* docs: remove superpowers records",
          "is_bot": false,
          "headline": "docs: refresh project badges (#96)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T19:38:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67dfe2e51c08fdfacc6854ed9249f8ef620b77c2",
          "body": null,
          "is_bot": false,
          "headline": "feat(theme): make waiting purple in classic (#95)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T17:23:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6427986d9c376b95dcb65dc90889aa4801c85434",
          "body": "The list footer carried 10 of the 19 list-mode keys, so reorder, move,\nrename, revive, archive, delete, archived view and resize were only\ndiscoverable through the help card. Review hid repo, branch, remove and\nsend behind state conditions.\n\nBoth footers now name every key their mode handles. The wrap in\nfooterLine already spends the extra rows the layout budgets for it, so\nthe frame still paints exactly the terminal it was given.",
          "is_bot": false,
          "headline": "feat(ui): list every shortcut in the list and review footers (#94)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T17:20:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0f4b28fa020bc3ca9e37956dc1faea47ee32fa7",
          "body": "…#93)\n\n* fix(status): keep a session working while its background agents run\n\nClaude fires Stop when the main agent stops responding, so a turn that\nleaves background agents running reports finished while they work. No\nhook fires when they drain, so the session stayed finished for the whole\nrun.\n\nTh\n[…]\nd\nas finished again. Anchor on the newest wait line and require only chrome\nand trailing notes below it, matching how turnState certifies a turn end.\n\n* docs(config): describe how busy_line is matched",
          "is_bot": false,
          "headline": "fix(status): keep a session working while its background agents run (…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T12:30:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6cc4459214783597b035ce8b7cda69d7ab0af23",
          "body": "…s status (#92)\n\n* fix(ui): clear the pane hash on attach so entering a session keeps its status\n\nAttach flips the window back to auto-sizing, which reflows the pane to the\nfull terminal width. The poller keeps running while the TUI is suspended\ninside the attach, so it captured that reflowed pane a\n[…]\nhash entry is gone tested the mechanism rather\nthan the result. Derive the status across the reflow instead: the pane\nreads working while a stale hash is in place, and idle once attach\nrebaselines it.",
          "is_bot": false,
          "headline": "fix(ui): clear the pane hash on attach so entering a session keeps it…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T11:35:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f49d23407138df6a076f36b343e8becc2aec7ffd",
          "body": "docs: re-record demos on the current TUI, add stills, document themes",
          "is_bot": false,
          "headline": "Merge pull request #91 from YoanWai/worktree-tui-redesign",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T10:42:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3de67096f95a59f6e419a4c741015d998cc8d362",
          "body": "… (#89)\n\nThe demo GIFs still showed the pre-redesign interface and a footer legend\nbinding review to `D`, a key the build no longer has. Both are re-recorded\nagainst the current UI, so they teach `ctrl+r` and show the one-line rows:\ndemo.gif walks the tree and sends a prompt into an agent's pane wit\n[…]\nlds it edits, review documents `g`/`G` and the `tab`/`shift+tab`\naliases for file switching, and a Themes section covers the nine palettes,\nthe live preview while stepping, and that the pick persists.",
          "is_bot": false,
          "headline": "docs: re-record demos on the current TUI, add stills, document themes…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T10:36:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca811aa7d5d616bd9f61bd3ebc20ee24b90da13b",
          "body": "One line per rail entry, flush preview",
          "is_bot": false,
          "headline": "Merge pull request #90 from YoanWai/worktree-tui-redesign",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T10:08:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91e9998fe8b7ae4f6a5cd8265e444fd4e1b99517",
          "body": "The rail's entries drop to a single row each. A session states its tool\nand how long since it last moved beside its name, a group rolls its\nsubtree up into tinted dots, and the second line each of them used to\ncarry is gone: at a glance the list is a list of names, and the detail\npane already spells\n[…]\nthe column's gutters and spans it edge to edge,\nso an agent's own CLI draws to the same boundary it would in its own\nwindow rather than inside a margin we added. Sessions are sized to that\nfull width.",
          "is_bot": false,
          "headline": "feat(tui): one line per entry, preview flush in its column",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T10:05:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c366c02825dfd36735a35aba1525ff30f2dbf40",
          "body": "Redesign the TUI on painted surfaces",
          "is_bot": false,
          "headline": "Merge pull request #88 from YoanWai/worktree-tui-redesign",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T00:23:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f34aa1cf7fe352a38727381e5c498d9bc139f21",
          "body": "The old layout's helpers with no remaining callers — the subgroup\ncounter, glyph rollups, paneTail and its test, the kv formatter, the\nearly header joiner — and the Focus theme token nothing reads.",
          "is_bot": false,
          "headline": "refactor(ui): drop what the redesign orphaned",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T00:15:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b37077c5c83a2d3035c9e1fa0e15deb4ea6643a",
          "body": "Plain guide bars become real branches: ├─ hangs each child off its\ngroup, ╰─ rounds off the last one, and the meta line under an entry\ncontinues the guide so the branch reads unbroken. A slot goes quiet once\nits level has no further siblings, so closed branches stop instead of\nrunning to the bottom of the list.",
          "is_bot": false,
          "headline": "feat(tui): branch connectors on the tree guides",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T00:08:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81d736806f06e948e1be220505d1716e32a97177",
          "body": "Nested entries trade their bare two-space indent for the legacy tree's\nguide lines: one quiet │ per ancestor level, a third of a cell wider, so\na group's children read as a branch instead of a loose list. The guides\nrun through both lines of an entry and across the selected band.",
          "is_bot": false,
          "headline": "feat(tui): indent group children behind tree guide lines",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-26T00:04:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20352e95106653e9314b96b57fd1de22cb636406",
          "body": "The edge rows painted their end cells at full size: the first cell's\nbackground bled into the window margin at full cell height, poking pane\ntone past the top-left and bottom-left corners, and the last cell painted\nits full width over the bleed column, jutting half a cell right at the\ntop-right and \n[…]\nerits the default color and the\nfill's left edge lands exactly on the cell grid — and the edge rows close\nwith quadrant blocks over the bleed column, so the fill stops at the\ncorner on all four sides.",
          "is_bot": false,
          "headline": "fix(tui): square the pane's four corners",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:55:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82d9c3760726a2ca7e5446f89c5d75c513d712d5",
          "body": "Fonts give block glyphs a hair of side bearing, and whatever shows\nthrough that bearing is the cell's background. The edge cells drew the\npane half as the glyph on an unfilled cell, so the leak was backdrop — a\nvery thin gap along the fill's edge rows. Inverted, the cell background\ncarries the pane \n[…]\n the\ntheme's backdrop color, which the terminal background sync keeps equal\nto the terminal's default: a bearing leak now shows pane tone and fuses\nwith the fill, and the edge reads solid in any font.",
          "is_bot": false,
          "headline": "fix(tui): draw the pane's half-cell edges inverted",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:20:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35f641f59e35a67727445e6171452ed880c3b716",
          "body": "The soft-edge commit's rewrite of seamCell silently never applied — the\nediting script's search text did not match and str.replace reports\nnothing — so the binary drew the line era's seam, junction glyphs on a\nbackdrop column, wedged between the pane's fill and the new half-block\nedge: a dark strip \n[…]\ncolumn assertion that fails on the old glyphs,\nso a stale seam renderer cannot ship quietly again, and the fill was\nre-measured from a rendered frame: seam and bleed columns both carry the\npanel tone.",
          "is_bot": false,
          "headline": "fix(tui): the seam renderer the soft-edge pass thought it shipped",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:16:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2d5ab9e86dbdd4fa3b86b6da1bb07dc81052589",
          "body": "\"A little more\" than a cell boundary cannot be drawn with fills, so the\npane's edges are drawn with half blocks: the opening row bleeds ▄ down\ninto itself, the closing row ▀ up, and a ▌ column carries the right edge\nhalf a cell past the seam, which outside resize mode is the fill's own\nedge rather than a drawn line. The resize grip still takes the seam over\nwith its accent bar while the divider is being moved. Same treatment for\nreview's files panel.",
          "is_bot": false,
          "headline": "feat(tui): soft half-cell edges for the pane",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:09:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf0facb4698d3af4675e2c9f273c275adc60251e",
          "body": "One refinement over the last pass: the horizontal rules above and below\nthe body read as frame, not as part of the pane, so their pane-side\nsegments go back on the backdrop. The fill still claims the seam column,\nending flush on its right line.",
          "is_bot": false,
          "headline": "fix(tui): rule rows return to the backdrop, fill keeps the seam column",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:03:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae01f603a268f325e0203f106b7548f63bde4d85",
          "body": "The fill stopped one cell short of the lines that bound it: the rules\nabove and below it sat on the backdrop, and the seam column between the\npanes did too, leaving a dark outline around the filled box. The rule\nrows' pane-side segments, their junctions, and the seam column now carry\nthe pane's fill\n[…]\nnd in review, so the box\nextends exactly to its own lines. Verified per-column against a rendered\nframe: the seam cells and rule segments measure the panel tone, the far\nside of the seam the backdrop.",
          "is_bot": false,
          "headline": "fix(tui): the pane's fill owns its boundary lines",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T23:01:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "226d04ccaa627d75ef0eb062e9a7edd07471b3c3",
          "body": "The floating card read the request backwards: the pane's background was\nmeant to fill its box completely, not shrink from it. The fill runs flush\nagain — header rule to footer rule, window edge to seam — in the list and\nin review's files panel, with the computer block's rule teeing back into\nthe sea\n[…]\nne: with the\nterminal background sync in place the padding carries the backdrop tone\n(measured identical on a live screenshot), so the pane meets the window\nedge with nothing between them to mismatch.",
          "is_bot": false,
          "headline": "fix(tui): run the rail's fill flush to its pane",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T22:56:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4aec6e3009f270ffec56a02cb0953d11b0c6bcab",
          "body": "The card's fill still terminated flush against the header's rule, the\nseam and the footer's rule — three more edges where a filled rectangle\njust stopped against something that is not part of it. The margin the\nwindow edge got now runs around all four sides, in the list and in\nreview's files panel: \n[…]\n background above and\nbelow the fill, one column on either side. The card's internal rules end\nat the card's edge, so the seam keeps a junction only where the content\ncolumn's rule genuinely meets it.",
          "is_bot": false,
          "headline": "fix(tui): float the rail card clear of every edge, not just the window's",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T22:51:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "372f1b26036a08d4eb4b1f3c4b1361cde5a80790",
          "body": "Removing the fill was the wrong answer to the padding mismatch — the\nsections were asked for; the accident was only that the fill ran flush to\nthe window edge, where it sat beside the terminal's blended padding as an\nobviously different tone. The fill is back with one unpainted column\nbetween it and\n[…]\na margin of the terminal's own background the same fill reads as a\ncard, and since painted color no longer touches a window edge, there is\nno seam left where opaque paint and blended padding can meet.",
          "is_bot": false,
          "headline": "feat(tui): the rail fill returns as an inset card",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T22:45:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7907efa0bd8868460095bc14a9dec0e865ebe3b",
          "body": "With the backdrop inherited, the rail was the one large opaque rectangle\nleft on screen, spanning the window's whole left edge. Beside translucent\nwindow padding it read as exactly what it was: a child element carrying a\nbackground its container never had. Same physics as the backdrop — a big\npainte\n[…]\nliberate highlights and sit clear of the\nwindow's edges. Structure comes from the seams, their junctions, and type\nweight — which is also how herdr, the reference for this redesign, draws\nits sidebar.",
          "is_bot": false,
          "headline": "fix(tui): drop the rail fill — no painted region may touch a window edge",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T21:54:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "77550182c628ef6f0595b609b02f0c4011ca50bc",
          "body": "Pixel-measuring a live screenshot against iTerm's reported colors showed\nthe padding around the cell grid rendering lighter than the very color it\nwas set to: the window is translucent, so the terminal blends its default\nbackground with whatever is behind the window, while cells painted with an\nexpl\n[…]\nut only through the passthrough\nenvelope: a plain OSC 11 would recolor the pane's default background into\nan explicit color, recreating the opaque-on-translucent ring the whole\nscheme exists to avoid.",
          "is_bot": false,
          "headline": "fix(tui): inherit the terminal's background instead of painting one",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T19:00:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1d0b096013338658d1362a0c09d9e0dfd292fb8d",
          "body": "The backdrop sync stopped at the multiplexer: run inside tmux, the OSC 11\nthat matches the terminal's own background to the theme never reached the\nterminal drawing the window, so the window padding kept its profile color\nand ringed the frame in the wrong tone — the seams looked short of the\nwindow \n[…]\n carry\nstale colors, and the reset on exit travels the same two roads.\n\nVerified inside a real nested tmux: the pane comes up with\nallow-passthrough on and the frame renders with its junctions intact.",
          "is_bot": false,
          "headline": "fix(tui): carry the backdrop sync through a hosting tmux",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T18:36:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eeb24f24a1b14bf2ac702d824a5ce60c0fb981d2",
          "body": "The frame can only paint its cell grid. A terminal that draws window\npadding around that grid keeps its own background there, so the frame's\nrules looked like they stopped short of the window and the rail's fill\nlooked inset by a border of the wrong color — the padding was never ours\nto paint. The m\n[…]\n,\nand restores the terminal's own color on exit (OSC 111). Terminals\nwithout OSC 11 ignore both.\n\nShort frames pad with backdrop-filled rows too, instead of bare lines the\nterminal would show through.",
          "is_bot": false,
          "headline": "fix(tui): match the terminal's own background to the theme",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T18:19:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "087911996f4e4e783d6b77a14bd2ed987420d2be",
          "body": null,
          "is_bot": false,
          "headline": "test(tui): assert the seam's junctions from the rendered frame",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T17:05:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cd0d5d87d932c2651818420ff10d1b139a1da0c",
          "body": "Rules and the column seam used to butt against each other: the machine\nblock's rule stopped at a bare │, the preview's started after one, and\nreview's opening and closing rules ran straight through the files/code\nseam with no junction at all. The seam is now drawn cell by cell, and a\nrule arriving f\n[…]\n, which now share one frame language.\n\nThe junction placement is asserted from the rendered frame itself: every\nseam cell must be one of the six joint glyphs, at the exact column the\nheader's ┬ names.",
          "is_bot": false,
          "headline": "fix(tui): tee every rule into the seam it crosses",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T17:03:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "71ce979deb1d6106838b59b6b265c522413c62dc",
          "body": "The wordmark had moved into the rail and the fleet readings into the\ncontent column, which dissolved the header into the body: nothing read as\n\"the top of the application\" any more. The header is one full-width band\nagain, the wordmark on the left and the richest fleet reading that fits\nagainst the right edge, closed by a rule. The seam between the rail and\nthe content tees into that rule and runs down to meet the footer's, so\nthe two surfaces hang from the band instead of floating beside it.",
          "is_bot": false,
          "headline": "feat(tui): restore the full-width header band",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T16:57:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9645fa0d2f8edf9d69f5f4581b873b42a63aa5f9",
          "body": "…n screen\n\nA long line soft-wraps onto several painted rows, and a comment adds rows\nbelow its line, but the scroll window was sized purely in logical lines.\nEvery wrapped line on screen therefore pushed one more line of the file\npast the bottom of the frame: the cursor could select the end of a wra\n[…]\nbecause their files\nhad short lines; the new one reviews a file whose every line wraps, jumps\nto the end, and walks the cursor down the whole file asserting the line\nunder it is painted at every step.",
          "is_bot": false,
          "headline": "fix(review): count painted rows, not lines, when keeping the cursor o…",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T16:25:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "724e215c5878e2e4c3f1bf34f7c731b321d0ffc9",
          "body": "…rminal\n\nThree properties now have tests, because \"the cursor landed there but the\nscreen did not\" is invisible to a test that only asks whether a line exists\nsomewhere in the model:\n\n- review's frame paints exactly the rows the terminal has and no line\n  exceeds its width, across thirteen sizes, un\n[…]\ne sizes\n- the rail's selected session and review's selected file are painted at\n  every size and every cursor position, including the last row, where an\n  overflow indicator competes for the same line",
          "is_bot": false,
          "headline": "test(tui): pin review's frame, and the cursor's visibility, to the te…",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T16:17:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "972815cb2f4770786bfcdcca287bda964a3e9bfc",
          "body": "The preview refreshed on the poll cadence, which defaults to two seconds\nand also carries pane listing, per-process sampling and store writes. A\nlive agent rendered through that reads as a still image, so the selected\npane now has its own timer: 300ms while the agent is working or starting,\n1.2s onc\n[…]\nges step in fives under a minute; a column of seconds ticking is motion\nwithout information. Adds a frame benchmark (0.36ms, 143KB per frame at\n200x50) so a future layout cannot quietly get expensive.",
          "is_bot": false,
          "headline": "fix(tui): live preview, one-row wordmark, header counts that add up",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T15:38:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33628bcec2decbbecdc1a193c28a9edeb2125e6d",
          "body": "The content column's seam was drawn at the width of the text inset, so it\nstarted and stopped a couple of columns inside the frame while the header,\nfooter and rail seams ran the full width. Seams are now rendered by the\npainter at the column's own width, which is the only place that knows it.",
          "is_bot": false,
          "headline": "fix(tui): seams span their column edge to edge",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T15:22:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68eecf98a3ec4bead8d1e4b1b9df3d6fb925e85f",
          "body": "The wordmark drops to two rows: three was a banner, not a header. Its E\ncarries a filled lower cell because in a two-row block font the middle bar\nlands exactly on the boundary between cells, which otherwise renders an E\nthat reads as a C.\n\nThe captured pane is no longer painted. An agent's CLI draw\n[…]\nody was sized one row short of\nthe frame, so the clamp padded a blank line and ate the footer's tail. The\nframe test now measures the raw frame, since View pads and clamps and would\nhide exactly this.",
          "is_bot": false,
          "headline": "feat(tui): shorter wordmark, unpainted preview, labelled stats",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T15:20:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f17fc188ab78bfd03bd7628e929c760a5f3d9a9",
          "body": "The header now carries a three-row wordmark drawn from half-block glyphs,\nlit by a highlight that sweeps across it on launch and then rests. The\nsweep stops after a couple of seconds on purpose: a header that animates\nforever repaints the frame forever, and a repainting frame cannot be\nselected with\n[…]\n actual\nheight, so the divider stays grabbable in both header forms. The frame\ntest now asserts the row count as well as the width: an extra row silently\ncost the footer a line when the seams went in.",
          "is_bot": false,
          "headline": "feat(tui): wordmark header with an intro sweep, activity worded as ago",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T15:07:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9fbad1e623ce74d1370b08ac6878b0b7f627adc",
          "body": "Hairlines mark every seam where two surfaces meet: under the header, above\nthe footer, between the rail and the content, above the machine block, and\nbetween a session's facts and its live pane. The seam column between the\ntwo panes doubles as the resize grip, so dragging no longer steals a\ncolumn f\n[…]\nnt the file's last line, unified and side by side. Verified\nthey fail when the code viewport is mutated to overrun its painted rows.\n\nDrops the panel, badge and grip renderers the boxed layout needed.",
          "is_bot": false,
          "headline": "feat(tui): seams, even entry heights, classic palettes, activity times",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T14:59:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b37633588ac7633ebcccbe2057b15ce0a44250c",
          "body": "The layout no longer draws boxes. The app fills a backdrop, the sessions\nrail sits on a slightly lifted panel tone, section blocks and the modal\ncard lift again, and the cursor's entry lifts once more. Separation comes\nfrom tone, so nothing needs a border to read as a column.\n\nSessions became two-li\n[…]\nfixes geometry for sessions left over from a previous run: the first\nrefresh after startup now clears the pane cache before re-asserting size,\ninstead of trusting a cache that never saw those windows.",
          "is_bot": false,
          "headline": "feat(tui): rebuild the list and review views on painted surfaces",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T14:41:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c277b827460382e71848f8a1291757299ac30e8e",
          "body": "Every color now resolves through a Theme token set instead of hardcoded\n256-color indexes, with seven built-in palettes (Catppuccin Mocha default,\nTokyo Night, Gruvbox, Nord, Dracula, Rose Pine, Monochrome) picked from\nsettings and persisted in the store. The picker applies as it steps, so it\ndouble\n[…]\nsion is driven with; ? holds the rest\n- empty states, modals and section dividers restyled to match\n\nAdds a frame-width regression test and a skipped screenshot renderer used\nto review frames offline.",
          "is_bot": false,
          "headline": "feat(tui): themed truecolor redesign",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T13:57:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a80927a29ffe7471796df9c0fafd8499028d411",
          "body": "…crolling away (#87)\n\n* fix(sh): smol doge fix scrollback bleed & text selection in TUI\n\nIssue 1: Scrolling inside tmux session shows previous session content\n- Add  to tmux session options so tmux handles per-session\n  scrollback instead of terminal emulator's native buffer.\n\nIssue 2: Cannot select\n[…]\neys on wheel while the\nalt screen is up, so the wheel navigates the list instead of scrolling the\nhost's scrollback over the manager.\n\ntmux attach/detach leaves 1007 untouched, so no re-arm on detach.",
          "is_bot": false,
          "headline": "fix(tui): native text selection and wheel that navigates instead of s…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-25T13:40:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "197dc378f7012b010a7d61cf13f0b64d1418ee48",
          "body": "docs: add static launch demo image",
          "is_bot": false,
          "headline": "Merge pull request #86 from YoanWai/launch-demo-png",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-24T17:23:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8eb6b0e9aa1f4d18302b0b07732b705e3e1ae2d",
          "body": "chore(ci): coverage upload + status badges",
          "is_bot": false,
          "headline": "Merge pull request #85 from YoanWai/chore/coverage",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-24T17:22:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b9c4a1ed1ab9c53d7609ecf639935f85b8559e5",
          "body": null,
          "is_bot": false,
          "headline": "chore(ci): emit coverage profile, upload to Codecov, add status badges",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-24T13:08:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c37d88e692c32e6adf9ce3479cd0d491caf94c3",
          "body": "The settings card now shows the running version, with a\n'↑ vX.Y.Z available' suffix when the daily release check has found a\nnewer build.",
          "is_bot": false,
          "headline": "feat(settings): show build version and update status (#84)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T16:43:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3928853b045fa33617d2727d1976e3fea8ffe1ae",
          "body": "fix(review): reset reviewed mark when file content changes",
          "is_bot": false,
          "headline": "Merge pull request #83 from YoanWai/fix/reset-reviewed-on-change",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T15:27:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "166149da3bdacb8d77a663f6f51a56d52e24ea69",
          "body": "Store content hash with each reviewed mark so the UI can detect when\nthe agent edits a previously-reviewed file. On every diff load (silent\nrefresh, scope cycle, reopen), marks whose content hash differs from\nthe current file or whose file no longer exists are cleared.",
          "is_bot": false,
          "headline": "fix(review): reset reviewed mark when file content changes",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T15:26:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e1a01ecda07c2202a67bdf7f0aaa1f2e4d199d7",
          "body": null,
          "is_bot": false,
          "headline": "fix: gofmt internal/ui/form.go",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T14:58:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2aa12bb66a4f947e6c33211589325b122a1cb8a",
          "body": "fileSides consulted baseRef for the old side, but baseRef is only set for\nbranch scope. In last-commit scope it stayed empty, so the old ref\nresolved to git's index (\":path\") instead of HEAD's parent. On a clean\ntree the index equals HEAD, so both sides were identical and every line\nrendered as unch\n[…]\n diff, and next-change navigation had\nnothing to find. Resolve HEAD's parent (or the empty-tree object for a\nroot commit) and use it as the old ref, sharing one LastCommitParent\nhelper with diffRange.",
          "is_bot": false,
          "headline": "fix(review): show real diff in last-commit scope",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T13:38:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8942b663c7cd280ace491c485d01e293193a56e",
          "body": "Long source comments wrap across visual rows. wrapTinted re-emitted only\nthe background tint on each new row, so continuation rows dropped the\nchroma foreground color and rendered in the terminal default, producing a\nzebra look. Track the active foreground SGR and re-emit it alongside the\nbackground on every fresh row.",
          "is_bot": false,
          "headline": "fix(review): keep comment color on wrapped rows",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T13:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ad998796d31e645a2d1882da541711f4f5065e7",
          "body": "The manager checks GitHub Releases once a day (cached, 4s timeout,\nerrors ignored) and shows a \"↑ vX.Y.Z available\" badge in the header\nwhen a newer tag than the running build is out. It never self-replaces\nthe binary: Homebrew and go install own the upgrade, so the badge just\npoints users at them.",
          "is_bot": false,
          "headline": "feat(update): daily release check with in-app update badge (#82)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T13:22:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a83c3a38b7fe83b1060be298991362e776c572c4",
          "body": "- Main menu footer: add V (revive all dead)\n- Review mode footer: add ctrl+d/ctrl+u (half-page), g/G (top/bottom),\n  tab/J/K/shift+tab (file switch), esc/q (close), ctrl+c (quit)\n- Clarify arrow labels: scroll line vs file switch\n- Add shift+n, shift+v, shift+f fallbacks for terminals that send\n  shift+key instead of uppercase letters",
          "is_bot": false,
          "headline": "fix: add missing keyboard shortcuts to footers",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T12:58:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6024fb2c67032c3f255a8d4249423deef81a5704",
          "body": "… (#81)\n\nDiff add/del backgrounds dropped to dim truecolor tints so they stop\noverwhelming the code. Monokai's comment token lifted from #75715e to\n#b0af99 so source comments stay legible over the tint. Reviewer\nannotations moved off muted gray onto a bright accent band.",
          "is_bot": false,
          "headline": "fix(review): dim diff tints, brighten source comments and annotations…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T12:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2388e9280451b7cbe89a7a42afcb3872fc5190e",
          "body": "Replace the single dense description with a top-fold that states the\ncross-provider, one-terminal pitch first, then how status, grouping,\nanswering without attaching, revive, and ctrl+r diff review fit together.",
          "is_bot": false,
          "headline": "docs: lead the README with what agent-manager does (#80)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T12:25:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b713952b6a494db39f3d13f63d97bb2147ba22f0",
          "body": "…ting-state\n\nfix(ui): unblock refresh from id capture + show launch state instantly",
          "is_bot": false,
          "headline": "Merge pull request #73 from YoanWai/fix/quick-prompt-latency-and-star…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T11:51:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ea1877d8436e5a8d35ea912e03f8e31857f7623",
          "body": "New sessions appeared only after the next poll, and that poll had started\nshelling out to opencode's CLI to capture conversation ids, which held the\nrefresh lock for seconds and stalled every update, including a freshly\nsubmitted session's first appearance.\n\nMove id capture off the poll lock: it run\n[…]\na submitted session is inserted into the list\nat once with a transient \"starting up\" state, which the poll holds until the\nagent first paints its pane (grace-capped) and then flips to the real status.",
          "is_bot": false,
          "headline": "fix(ui): unblock refresh from id capture + show launch state instantly",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T11:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f727e5858bf4c786e9e92309ddb6af5c0b8b993",
          "body": "…e-all\n\nfix(revive): capture opencode ids via CLI + revive-all on V",
          "is_bot": false,
          "headline": "Merge pull request #72 from YoanWai/fix/opencode-id-capture-and-reviv…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T11:24:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94b361d12343b295be14cb76f727e3c92ac2187b",
          "body": "Conversation-id capture read opencode's private on-disk store at a path\nopencode 1.18 no longer writes, so every capture silently failed and\nrevive fell back to `--continue`, which resumes the working directory's\nmost recent conversation, the wrong one whenever sessions share a repo.\n\nCapture ids fr\n[…]\nvives every dead session in the current view at once.\n- Revive surfaces when it had to fall back to --continue for a session\n  with no captured id, instead of silently resuming the wrong conversation.",
          "is_bot": false,
          "headline": "fix(revive): capture opencode ids via CLI + revive-all on V",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T11:21:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88b0deb127217e22f759fcc7806a6af3318e17f4",
          "body": "fix(tmux): run agents on a private -L socket",
          "is_bot": false,
          "headline": "Merge pull request #71 from YoanWai/fix/tmux-private-socket",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T10:49:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0b2ac16755dd53f76e16078290e4b97fc4887f8",
          "body": "Every agent session ran on the ambient default tmux socket, shared with\nthe user's shell tmux and with `go test`, which spawns real am_* sessions\non that same server. Anything that reset that server (a stray kill-server,\na test teardown) took every live agent down at once.\n\nBind the driver to a dedi\n[…]\nocation sites. Tests get their own isolated sockets (amtmuxtest,\namuitest) with a TestMain that tears them down, so a test run can never\nreach the production socket or the user's default socket again.",
          "is_bot": false,
          "headline": "fix(tmux): run agents on a private -L socket",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T10:41:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a1821e169d8a26fb8cf55d5e0ddc6d0f825822e9",
          "body": "perf(ui): parallelize git ops and skip repo discovery on scope cycle",
          "is_bot": false,
          "headline": "Merge pull request #70 from YoanWai/perf/review-menu-speed",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T09:45:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e717fc997591e32c21ba6b3c7201684dc9dfb601",
          "body": "Parallelize ChangedFiles+NumStat and Fingerprint+Worktrees in diff load.\nSkip ResolveRepos on scope/base switches via diffReloadCmd fast path.\nCache ResolveRepos result per CWD in diffLoadCmd closure.\nReuse BaseRef from BuildSet in diffLoadCmd and EnsureFile.\nClear diff set immediately on scope/repo/base switch for instant loading UI.",
          "is_bot": false,
          "headline": "perf(ui): parallelize git ops and skip repo discovery on scope cycle",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T09:45:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42c6a95b96631c9439b5f28e636572166bdd05a3",
          "body": "…low indicators\n\nwrapTinted now prefers space boundaries when wrapping, avoiding mid-\nidentifier breaks in narrow side-by-side columns. Words wider than the\nline width fall back to character-level splitting. Rewritten as two-pass\ntokenize-then-flow for correctness.\n\ndiffCodeHeight reserves 2 rows for overflow indicators (up/down N more)\nso the cursor never lands outside the visible code viewport.",
          "is_bot": false,
          "headline": "fix(ui): word-boundary wrap in split diff and scroll height for overf…",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-23T08:54:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20fb9816765b4c55369a1fa88897da510018cf4b",
          "body": "fix(ui): re-arm mouse capture after tmux attach/detach",
          "is_bot": false,
          "headline": "Merge pull request #69 from YoanWai/fix/mouse-rearm-on-detach",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-22T18:36:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2a96d176f3aad998342cbedd50db03173975d55",
          "body": "Bubbletea's RestoreTerminal (v1.3.10) runs after every tea.ExecProcess\nand restores altscreen, bracketed paste, and focus reporting but not\nmouse mode. Each session attach/detach therefore left mouse reporting\noff, so the wheel belonged to the host terminal or outer tmux and\nscrolled the manager off\n[…]\n every attachDoneMsg return path\n(normal detach, attach error, review jump, review-clear error) so wheel\ncapture survives every attach. A regression test asserts detach emits\nthe mouse-enable command.",
          "is_bot": false,
          "headline": "fix(ui): re-arm mouse capture after tmux attach/detach",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-22T18:36:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2519e16b1194c8f90e663500396fd6ab2188aaae",
          "body": "Terminal Trove and similar directories require a PNG preview URL.",
          "is_bot": false,
          "headline": "Add static PNG frame of demo for launch listings.",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T16:46:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c77ae08d8b327f48f0520b7877bdcb3aab343d47",
          "body": "fix(ui): capture mouse so the host cannot scroll the TUI away",
          "is_bot": false,
          "headline": "Merge pull request #68 from YoanWai/fix/tui-scroll-lock",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T15:44:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dc11dbf5a54d8ef5a9bd3e0cfb0dca3c038fb0e",
          "body": "Mouse reporting stayed off outside resize mode so trackpad/wheel\nbelonged to the terminal (or outer tmux) and scrolled scrollback past\nthe manager. Keep cell-motion on, map the wheel to list/diff navigation,\nand leave divider drag as a mode flag only. Shift+drag still selects text.",
          "is_bot": false,
          "headline": "fix(ui): capture mouse so the host cannot scroll the TUI away",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T15:44:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7ca14244d86b329c3708dac4eb3b03eac3580e8",
          "body": "send-keys silently truncates around 1024 bytes, so a rename directive\nplus a long first prompt died mid-path and left sessions on a broken\nshell. Write a launch script and run it as the window command instead.\n\nCustom-named sessions no longer get a force-rename directive; they only\nlearn that rename is available later if the user asks. Soften the MCP\nrename tool description to match.",
          "is_bot": false,
          "headline": "fix(tmux): launch long prompts via script, not send-keys (#67)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T15:32:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7529f6d008ba75d4dbaa2c0e3c2c2f394f2f52df",
          "body": "Live subagent lines print \"Worked for 1m20s\" without stop; treating them\nas turn_end made Match flip finished while a spinner still ran. Require\nstop on the turn summary, treat scrollbar blocks as chrome, and debounce\nmarker-less quiet ends for one second so brief inter-tool pauses stay working.",
          "is_bot": false,
          "headline": "fix(status): stop Grok working/finished status flapping (#66)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T10:08:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d719a8b9c0d6452e864834b83d9b9dce85fd8a1",
          "body": "* feat(ui): edit session tool from rename (r)\n\nWhen the process in a pane is swapped (e.g. quit opencode, run grok),\nthe stored tool label stays wrong and status rules miss the pane. On\nsession r, tab cycles the configured tools; save updates the tool and\nclears the agent conversation id so revive d\n[…]\nng CLI.\n\n* fix(ui): keep agent session id on name-only rename\n\nUpdateTool only runs when the tool actually changes, and the store\nno-ops same-tool writes so resume ids are not wiped by a plain rename.",
          "is_bot": false,
          "headline": "feat(ui): edit session tool from rename (r) (#65)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T10:06:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "52e339bed203970abd7e1c57d708f8bacb6c6ef0",
          "body": "* feat(review): rename vs base to vs target and key header pills\n\nMake the review header read as a key legend (s/u/r/B), drop the noisy\n@hash from the target label, mark auto-detected targets with (auto),\nand use \"target\" wording consistently in UI and docs.\n\n* fix(review): strip only the trailing @hash from target labels\n\nBaseDesc is candidate@shortsha; LastIndexByte keeps branch names that\nthemselves contain @ intact.",
          "is_bot": false,
          "headline": "feat(review): rename vs base to vs target and key header pills (#64)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-21T09:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75550dafa013cf8ba2e21072d0075a59daaf3bd2",
          "body": "Resize reflows every session pane and changed activity-region hashes were\ntreated as streaming work, so finished sessions all flashed working for one\npoll. Clear hashes under the poller lock during resize and rebaseline without\ninventing working or collapsing finished/waiting.",
          "is_bot": false,
          "headline": "fix(ui): stop fleet-wide working flash after pane reflow (#61)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T21:30:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78713f94124967a0581e30100753e7d27fef6c12",
          "body": "subtleStyle (fg 240) on selected bg (239) made tool/age meta, group\ncounts, and tree guides nearly invisible. Leave secondary text unstyled\nwhen selected so renderSelectedRow's bright reapply (231) carries it.",
          "is_bot": false,
          "headline": "fix(ui): keep selected-row stats readable on highlight bg (#60)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T21:25:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27ae0388eeb630ba7c78634fede67e0ddceb0878",
          "body": "Stop forking osascript on every Ctrl+V. Darwin/Linux use\ngolang.design/x/clipboard (purego NSPasteboard / X11/Wayland) so a\ntypical screenshot lands in ~0.1–1ms instead of ~60ms+. Shell tools and\nJXA remain as fallbacks; WSL still uses powershell for the Windows host.",
          "is_bot": false,
          "headline": "fix(clipboard): in-process pasteboard for instant image paste (#59)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:56:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0d5a17824fe87632e60e83e580a81cd3bdc4743",
          "body": "Holding j/k was queueing a tmux capture per keystroke, so work kept\nrunning after release. Settle 50ms after the last move, tag captures\nwith a generation, and drop stale work. Size pins stay off the look path.",
          "is_bot": false,
          "headline": "fix(ui): debounce preview capture on cursor key-repeat (#58)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94efa4fcc358fc6e504a2ffbd2e519ca72ef3e09",
          "body": "Agents were re-renaming mid-session on every subtask. The launch\ndirective and MCP rename tool now say call once only unless the user\nasks, and prefer the overall feature over a narrow step.",
          "is_bot": false,
          "headline": "fix: rename once with a broad feature name (#57)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:47:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b5fcf6e575e4fec93414372c7e07e8368022413",
          "body": "Stream wl-paste/xclip straight into the pastes file. On WSL, when native\ntools miss (or are absent), read the Windows host clipboard via\npowershell.exe so Ctrl+V image paste works from Win apps too.",
          "is_bot": false,
          "headline": "fix(clipboard): Linux single-write paste and WSL Windows clipboard (#56)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "812c381eea113caf9b80dc47d79001597ca0f523",
          "body": "* feat(mcp): agent-manager mcp stdio server exposing session tools\n\nrename, review_repo and review_base become MCP tools backed by the same\nmailbox logic as the CLI subcommands, extracted into internal/sessioncmd\nso both stay identical. Session identity comes from\nAGENT_MANAGER_SESSION_ID in the ser\n[…]\n gets an\nOPENCODE_CONFIG merge file, grok gets a one-time user-scope grok mcp add.\nGenerated configs point at the running binary via os.Executable.\n\n* docs(mcp): note the benign grok registration race",
          "is_bot": false,
          "headline": "feat: MCP server for session commands, auto-registered per tool (#53)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:21:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51de9fcb92b399d0028e806f241b889863324ac0",
          "body": "Replace AppleScript \"clipboard as PNGf\" (often ~1s+) with JXA that\nreads NSPasteboard PNG directly (~50-100ms). SaveImage writes once\ninto the pastes directory; the quick bar uses that path API.",
          "is_bot": false,
          "headline": "fix(clipboard): speed up macOS image paste via AppKit JXA (#55)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec568d72cbe0e466a296d4797d290c1294ba4ed8",
          "body": "Main called imageChip helpers that never shipped. Add soft pill styles\nwith Image N labels, a pasting state, and matching tests so the quick\nprompt chips look like quiet Claude-style tokens.",
          "is_bot": false,
          "headline": "fix(ui): pretty inline image chips and restore build",
          "author_name": "Yoan Wai",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:17:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cda2fb7820a49fd7d4328ac188b6e670c4aa4cc",
          "body": "Cursor moves no longer sync-resize on the key path; size pins run in\npreviewCmd only when geometry changed. Arrow nudges update the split\ninstantly and defer pane reflow to commit. Fleet resizes skip no-ops\nand run in parallel.",
          "is_bot": false,
          "headline": "fix(ui): stop blocking the TUI on tmux resize (#54)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:17:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "202098e742ac639cb3eead63e82fac84e796bba3",
          "body": "Render pasted images as chips in the textarea prompt (same line as the\ntext), not raw paths and not a strip under the bar. Backspace at the\ntext start removes the nearest chip. Clipboard reads stay async so the\nTUI does not freeze on macOS osascript.",
          "is_bot": false,
          "headline": "fix(ui): Claude-style inline deletable image chips in quick prompt (#52)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T20:06:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b32226557a257b651f8225c4e06f4af0a801488f",
          "body": "* fix(ui): insert pasted image paths into the quick prompt\n\nChips could not be deleted. Drop the attachment list and put the temp\npath into the textarea as editable text, matching Claude-style paste.\n\n* fix(ui): refuse image paste when the quick prompt is full\n\nCheck CharLimit before inserting the path, restore prior text if the\npath still did not land, and delete the temp file. Strengthen the pad\ntest and cover the full-prompt error path.",
          "is_bot": false,
          "headline": "fix(ui): insert pasted image paths into the quick prompt (#49)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T19:51:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70fa8298bb559c5bdd6dd2f9ea0fd62afd66c3e3",
          "body": "Resize mode accepts ←→/hl, | commits and esc cancels. Size detached\npanes to the preview box so captures match the panel, strip scroll\nANSI from previews, and clamp every frame to the terminal height.",
          "is_bot": false,
          "headline": "feat(ui): arrow resize, 1:1 preview fit, lock TUI frame height (#51)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T19:46:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee5039776c3ebb7bbb9e4e43867142155da7ffb1",
          "body": "* feat(ui): mouse-resizable sessions/sidebar split\n\nGate mouse reporting behind | so terminal text selection stays intact.\nDrag the divider, release to persist split_ratio and resize panes once.\n\n* fix(ui): address resizable-split review\n\nRoute mouse release through exitResizeMode(true), share list body\ngeometry with hit-testing, and cover resize-on-release plus enter gates.\n\n* fix(ui): disable mouse before quit from resize mode",
          "is_bot": false,
          "headline": "feat(ui): mouse-resizable sessions/sidebar split (#48)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T19:31:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "335263ce45dcb16a61bcb173f8d4e29f60ffd44c",
          "body": "Three helpers in review_regression_test.go called plain `git init`,\nleaving the initial branch to whatever git's init.defaultBranch says.\nOn CI runners that resolves to master, but the header regression\nassertions expect main, so TestReviewHeaderShowsRepoBranchAndBase\nfailed whenever the runner's git config differed from the author's.\n\nPass -b main explicitly so the branch is deterministic.",
          "is_bot": false,
          "headline": "test: pin git init branch to main in review regression helpers (#50)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T17:23:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c67de0bbe524c83478355d72d0bdac8675e8d43",
          "body": "selectedRowStyle.Render wraps pre-styled content with the selected bg\nand fg, but every per-segment lipgloss.Render call appends its own SGR\nreset, which clears the outer background. Result: the bg only applied\nto the first segment (the accent left-bar) and the rest of the row\nrendered with the terminal default bg.\n\nrenderSelectedRow replaces each inner reset with reset+reapply of the\nselected bg+fg, so the tint holds end-to-end across tree rows, diff\nview entries, and the rename editor row.",
          "is_bot": false,
          "headline": "fix(ui): make selected row background span the full row (#47)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T17:11:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72844e4afce0d830fea559143a7dde3d370aabef",
          "body": "* feat(review): always show repo, branch and base in header; repo picker always on\n\nThe review header now names the selected repo and its branch in every\nscope, and shows base → branch in branch scope. The r picker and footer\nentry appear whenever a repo is resolved, and a single-repo session's\nroots include the repo's linked worktrees so r can retarget them.\n\n* test(review): header regression for repo, branch and base display\n\n* fix(review): guard empty branch in base → branch header",
          "is_bot": false,
          "headline": "feat(review): repo, branch and base always visible in header (#46)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T16:58:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "340eda9dadf28ba08858fc6c6b1c2914433842b9",
          "body": "* chore: ignore .worktrees\n\n* feat(ui): highlight selected row with subtle grey background\n\nBump colorSelBg from 238 to 239 so the selected row's background is\nvisible alongside the existing accent left-bar, not just the bar alone.\n\n238 was indistinguishable from the surrounding terminal background on\nmost terminals, leaving only the left bar to mark the cursor.",
          "is_bot": false,
          "headline": "feat(ui): subtle grey row highlight for selected session (#45)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T16:04:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8308971b973dd4235645e32629a4a4388cd6b8c",
          "body": null,
          "is_bot": false,
          "headline": "fix: one review key, ctrl+r everywhere (#44)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T15:48:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3a29f1213a686a5f6ee83b33ff62e7cd35ee106",
          "body": "…ch (#43)\n\nUmbrella sessions host agents that work in worktrees living outside the\nsession directory, where discovery could not see them, so review opened\non the wrong repo unless the agent declared one. Discovered repos now\nexpand to their linked worktrees before ranking.\n\nRanking cost is kept flat\n[…]\nts the\nwhole list, only the freshest few pay a status probe, and both passes\nfan out over a small worker pool. 55 candidates rank in under half a\nsecond where the old serial status sweep took seconds.",
          "is_bot": false,
          "headline": "feat: rank each repo's worktrees so review auto-picks the active bran…",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T15:32:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f254ec31a77859dae60db135eed6db5b8eb7176",
          "body": "* chore: ignore .worktrees\n\n* feat: confirm before archive/restore sessions\n\nReplace immediate archiveSelected/restoreSelected with same\nconfirmation pattern used for delete. Adds action field to\nconfirmTarget struct to dispatch archive, restore, or delete\nactions in handleConfirmKey.\n\n* fix: abort \n[…]\ne\n\nInject a failing snapshot writer through a constructor seam so the\nabort path can be exercised without a broken store, and assert the\nsession stays unarchived when the pane capture cannot be saved.",
          "is_bot": false,
          "headline": "feat: confirm before archive/restore sessions (#41)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T15:24:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "49a58b9a9b9b4c598a0e6151e559663e0f268001",
          "body": "* docs: implementation plan for the review repo target\n\n* feat: store the repo a session declares for review\n\n* feat: mailbox for a session's declared review repo\n\n* feat: agent-manager review-repo declares a session's repo\n\n* feat: poller applies a session's declared review repo\n\n* feat: review ope\n[…]\neads/writes by the raw umbrella-discovered path. In an umbrella cwd the\nagent's review-base wrote a row the load never read. Resolve symlinks at the\nfour base-key sites so both sides agree on the key.",
          "is_bot": false,
          "headline": "feat: let the agent declare the repo under review (#39)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T15:03:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "78a0d1b79be357d911d20cdeabd5d291c9a439d0",
          "body": "* fix: a session deleted mid-poll no longer errors the poll pass\n\nA poll pass lists the sessions, then walks them writing status, pane\nsnapshots and captured conversation ids. Deleting a session in between\nleft the pass writing to a row that was gone, and the resulting \"session\n<id> not found\" surfa\n[…]\ning left to do: the row went away on purpose, so the pass\nskips that write and carries on. Any other store failure still surfaces.\n\n* test: pin that an unchanged write is not read as a deleted session",
          "is_bot": false,
          "headline": "fix: a session deleted mid-poll no longer errors the poll pass (#40)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T11:32:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3fbae557ee1611225531a184e6210b8ce00a6f91",
          "body": "Delete acts on what the view shows. The archived view lists a group\nbecause archived sessions live under it, so deleting the group row there\nnow removes those archived sessions and leaves the live ones, and the\ngroup itself, to the active view. The group row goes away only once\nnothing is left benea\n[…]\nan archived empty group\ndeletable from the one view that still shows it.\n\nThe active view keeps its old reach: the group ceases to exist, so the\nwhole subtree goes with it, archived sessions included.",
          "is_bot": false,
          "headline": "fix: deleting a group in the archived view only clears its archive (#38)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T09:36:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "10810bc5342f4806d9968c823e0eb4c6965cf365",
          "body": "* docs: design for review target and diff noise\n\n* docs: pin the branch picker key and base validation target\n\n* docs: implementation plan for diff noise\n\n* fix: drop untracked directories from the review file list\n\n* fix: count lines for untracked files instead of showing zero\n\n* fix: label binary \n[…]\n the working tree is the wrong side for the staged, last-commit\nand branch scopes.\n\nLower the counting budget to 8 MiB so a large untracked log degrades to ? rather\nthan being rescanned on every poll.",
          "is_bot": false,
          "headline": "fix: stop review listing entries it cannot diff (#37)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T09:35:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9ba871fbcabd008ffeba03d5f570838df803f7dc",
          "body": "* docs: cross-session messaging design spec\n\n* docs: cross-session messaging implementation plan\n\n* fix: keep archived session preview as a persisted pane snapshot\n\nSelecting an archived session flashed its pane for one tick, then the\npoller (which skips archived sessions) shipped an empty preview a\n[…]\nve that snapshot for archived sessions, so\nthe preview survives poll ticks, tmux windows dying, and reboots.\nSessions archived before snapshots existed backfill from a still-live\nwindow on first view.",
          "is_bot": false,
          "headline": "fix: keep archived session preview as a persisted pane snapshot (#36)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-20T08:27:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d143e74b845e8f47c86b7b3d2e2dda8484f12951",
          "body": "Ctrl+V now records the image as an attachment shown under the prompt as\na muted \"📎 name.png\" chip, keeping the raw temp path out of the input.\nThe path is appended to the message only on submit, so the agent still\nopens the file. Submitting with only an image and no text is allowed;\nattachments clear after send.",
          "is_bot": false,
          "headline": "feat: show pasted images as a name chip, not a raw path (#35)",
          "author_name": "Yoan Wainmann",
          "author_login": "YoanWai",
          "committed_at": "2026-07-19T15:59:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 19,
      "commits_last_year": 180,
      "latest_release_at": "2026-07-26T10:09:45Z",
      "latest_release_tag": "v0.10.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 0.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/YoanWai/agent-manager",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/YoanWai/agent-manager",
          "is_deprecated": false,
          "latest_version": "v0.10.1",
          "repository_url": "https://github.com/YoanWai/agent-manager",
          "versions_count": 19,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-26T10:08:20Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 9,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 12
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 73920,
      "source_files_sampled": 73,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/BurntSushi/toml",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/alecthomas/chroma/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.27.0"
        },
        {
          "name": "github.com/aymanbagabas/go-udiff",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.4.1"
        },
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.6"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/modelcontextprotocol/go-sdk",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.1"
        },
        {
          "name": "github.com/sergi/go-diff",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.0"
        },
        {
          "name": "github.com/shirou/gopsutil/v4",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v4.26.6"
        },
        {
          "name": "golang.design/x/clipboard",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.8.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 88,
        "open_issues": 11,
        "closed_ratio": 0.083,
        "closed_issues": 1,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "YoanWai",
          "commits": 181,
          "avatar_url": "https://avatars.githubusercontent.com/u/106609173?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "cla.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 2,
            "reason": "Found 3/12 approved changesets -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "2c3e384ae6506426fb775f0cf76d2e8faf38eefc",
        "ran_at": "2026-07-28T16:22:58Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T16:04:45Z",
      "oldest_open_prs": [
        {
          "number": 103,
          "created_at": "2026-07-28T16:04:17Z",
          "last_comment_at": "2026-07-28T16:04:27Z",
          "last_comment_author": "coderabbitai"
        }
      ],
      "last_merged_pr_at": "2026-07-28T15:33:39Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 29,
          "created_at": "2026-07-19T07:23:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 62,
          "created_at": "2026-07-20T21:32:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 63,
          "created_at": "2026-07-20T22:33:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 74,
          "created_at": "2026-07-23T11:52:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 75,
          "created_at": "2026-07-23T11:56:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 76,
          "created_at": "2026-07-23T11:56:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 77,
          "created_at": "2026-07-23T12:06:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 78,
          "created_at": "2026-07-23T12:07:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 79,
          "created_at": "2026-07-23T12:13:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 100,
          "created_at": "2026-07-28T07:49:30Z",
          "last_comment_at": "2026-07-28T08:50:58Z",
          "last_comment_author": "YoanWai"
        },
        {
          "number": 101,
          "created_at": "2026-07-28T09:14:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/YoanWai/agent-manager",
    "host": "github.com",
    "name": "agent-manager",
    "owner": "YoanWai"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 51,
      "inputs": {
        "security": 28,
        "vitality": 69,
        "community": 31,
        "governance": 45,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 180,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "180 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 180
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 19,
              "latest_release_tag": "v0.10.1",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 0.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "19 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 31,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "forks": 0,
              "stars": 9,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "9 stars",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 45,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "merged_prs": 88,
              "open_issues": 11,
              "closed_issues": 1,
              "issue_closed_ratio": 0.083,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "8% of issues closed",
                "points": 3.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 8
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "88/90 decided PRs merged",
                "points": 37.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 88,
                      "decided": 90
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 3/12 approved changesets -- score normalized to 2",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "YoanWai",
              "public_repos": 20,
              "account_age_days": 1519
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "2 followers of YoanWai",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "YoanWai"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "20 public repos, account ~4 yr old",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 20
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/YoanWai/agent-manager"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "19 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 77,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "agentic",
                "ai-agents",
                "bubbletea",
                "claude-code",
                "cli",
                "coding-agent",
                "developer-tools",
                "golang",
                "opencode",
                "terminal",
                "tmux",
                "tui",
                "code-review",
                "codex",
                "grok"
              ],
              "has_wiki": false,
              "homepage": "https://github.com/YoanWai/agent-manager",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://github.com/YoanWai/agent-manager",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "15 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 28,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "12 out of 12 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 3/12 approved changesets -- score normalized to 2",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 52,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 73920,
              "source_files_sampled": 73,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/73 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 73,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T16:23:13.526689Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/YoanWai/agent-manager.svg",
  "full_name": "YoanWai/agent-manager",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.