Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-25 00:52 UTC

DojoGenesis / cli

Dojo CLI — a Claude Code-inspired terminal for the AgenticGateway. Interactive REPL with slash commands, plugin system, hook runner, and SSE streaming.

GoApache-2.0★ 0 estrellas⑂ 0 forksdesde abr 2026Ver en GitHub ↗

DojoGenesis/cli tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (86/100) y la más baja, Security (34/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

57
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

2 seguidores16 repositorios públicosdesde abr 2026TresPies

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/DojoGenesis/cliv1.1.0-4hace 6 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

79Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
6.9/36Cadencia de commits — 10/52 semanas con commits
18/18Volumen de commits — 104 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year104
human_commit_share1
days_since_last_push6
active_weeks_last_year10
Cómo se puntúa
27/27Publica versiones — 4 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~33,4 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count4
latest_release_tagv1.1.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases33,4

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

40En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

48En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1.1/22.5Distribución de commits — el principal contribuyente firma el 95% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,952
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
38.2/38.3Aceptación de PR — 4/4 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/4 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs4
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
3.4/25Alcance del propietario — 2 seguidores de DojoGenesis
9.6/25Trayectoria — 16 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers2
owner_typeUser
is_verified
owner_loginDojoGenesis
public_repos16
account_age_days109
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 6 días
12/20Historial de versiones — 4 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/DojoGenesis/cli
ecosystemsgo
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

75Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 3 out of 3 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 11 topics
10/10Wiki
Datos de entrada utilizados
topicsagentic-ai, ai-agent, cli, cobra, go, golang, plugin-system, repl, slash-commands, sse, terminal
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

34En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 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
0/7.5Code-Review — Found 0/4 approved changesets -- score normalized to 0
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.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
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/7.5Vulnerabilities — 44 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,4

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

86Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes6627
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — desktop/frontend/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 92 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum, package-lock.json
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configsdesktop/frontend/tsconfig.json
agent_commit_share0,92
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/122 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes54.759
source_files_sampled122
oversized_source_files0

Datos clave

0estrellas de GitHub
2contribuidores
104commits en los últimos 12 meses
6días desde el último push
4versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 3.4 / 10
3.4agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-25 00:52 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/4 approved changesets -- score normalized to 0
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
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow 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
0Vulnerabilities44 existing vulnerabilities detected
Dependencias directas 7
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/glamourv1.0.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/chzyer/readlinev1.5.1go.mod
Gogithub.com/gookit/colorv1.6.0go.mod
Gogithub.com/wailsapp/wails/v2v2.12.0go.mod
Gogolang.org/x/termv0.36.0go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "agentic-ai",
        "ai-agent",
        "cli",
        "cobra",
        "go",
        "golang",
        "plugin-system",
        "repl",
        "slash-commands",
        "sse",
        "terminal"
      ],
      "is_fork": false,
      "size_kb": 9183,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1413587,
        "CSS": 1310,
        "HTML": 286,
        "Shell": 1181,
        "Svelte": 12905,
        "Makefile": 659,
        "JavaScript": 8769,
        "TypeScript": 9819
      },
      "pushed_at": "2026-07-18T15:55:37Z",
      "created_at": "2026-04-09T06:35:58Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T15:54:30Z",
      "description": "Dojo CLI — a Claude Code-inspired terminal for the AgenticGateway. Interactive REPL with slash commands, plugin system, hook runner, and SSE streaming.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "dojogenesis.com",
      "name": "Cruz Morales (TresPies)",
      "type": "User",
      "login": "DojoGenesis",
      "company": "TresPies",
      "location": "Madison, Wisconsin, USA",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/273886418?v=4",
      "created_at": "2026-04-06T01:11:04Z",
      "is_verified": null,
      "public_repos": 16,
      "account_age_days": 109
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-18T15:57:40Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-04-12T02:09:53Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-04-12T01:34:07Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-04-09T08:56:51Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c0c3091d0fb9af99832dab2d788dce9fb4c4aba5",
          "body": "…heck)\n\nPre-existing errcheck failures in two test files (unchecked Dispatch/Close) that\nblocked the release milestone gate. Mechanical _ = discards; no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(lint): check error returns in guardrail/permissions tests (errc…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:53:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8ca9dee2c59f827e58047fd4f6313821f998c752",
          "body": "dojo CLI v1.1 — fully agent-navigable + headless",
          "is_bot": false,
          "headline": "Merge pull request #4 from DojoGenesis/dojo-cli-v1.1-headless-20260718",
          "author_name": "Cruz Morales (TresPies)",
          "author_login": "DojoGenesis",
          "committed_at": "2026-07-18T15:43:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fec5d843e936b54977ea44c47e7c5f87cfa66da",
          "body": "…ng tree)\n\n/code undo reverts all unstaged changes — destructive enough that a broad\nper-run --yes should not fire it. New headlessRefuseStrict requires --yolo (or\nthe REPL); --yes alone is refused. Other confirm-gated commands keep the\nnarrower --yes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): /code undo requires --yolo, not --yes (it reverts the worki…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:40:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dadc6b76af3b12ecf46a100d6538b4ffec3f73ba",
          "body": "…ang)\n\nThe y/N gate only skipped on the per-command noConfirm, so a headless run with\nglobal --yes passed headlessRefuse and then hung on the stdin read. Gate it on\n!autoConfirmed() too, matching the /craft and /code undo pattern.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): /protocol install honors --yes consent headless (no stdin h…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:32:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4757dc6a4dbb7f09f843c16473e339972ba8f87d",
          "body": "/bloom's animation has no terminal headless, but it visualizes real spirit\nstate, so a headless dispatch now emits belt/xp/streak/sessions/next-belt/koan\n(structured data in --json, a plain summary otherwise) rather than refusing. The\ninteractive animated TUI is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): /bloom headless — emit spirit state instead of refusing",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:29:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfa6e1d2d657fa4c1e61e0840a83dea45b83fc70",
          "body": "…ript envelope\n\nReplaces the 'interactive-only, unsupported in headless' refusal with a real\nheadless debate. New tui.RunWarRoomHeadless runs the same two agent streams the\nTUI uses (Scout 'measured' + Challenger 'adversarial' via streamAgentToChannel),\nserializing onChunk so NDJSON lines never inte\n[…]\narroom,agent,content} per chunk then a {topic,scout,challenger}\nenvelope; plain headless prints a linear transcript. Interactive TUI unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): /warroom headless — Scout vs Challenger as NDJSON + transc…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:26:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60361ebfd8681613f04481a100820fc9ac7977c0",
          "body": "…EDITOR\n\nAdds --content <text> / --content=<text> / --content - (stdin) so the protocol\noverlay is editable non-interactively. Explicit opt-in only — never auto-reads\nstdin (which would hang a headless caller). No --content falls through to the\nunchanged interactive $EDITOR flow; protocolEdit stays byte-identical so its\nexisting tests are unaffected.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): /protocol edit --content — edit the overlay headless, no $…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:21:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f9b98e321cd15f5fd55b6daea8e43b3e481b0ae",
          "body": "…eam fidelity\n\nWires r.autoConfirmed() into the confirmation gates so a consented headless run\nproceeds instead of dying at the permission gate / hanging on a y/N read:\n- /code undo, /craft adr, /craft claude-md, /craft scaffold: permissionGate now\n  receives autoConfirmed() instead of a hardcoded f\n[…]\nt had streamed — a partial-then-error run now reports ok=false too\n\nSafe default preserved: without --yes/--yolo these still refuse headlessly.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): honor --yes consent in /craft and /code undo; fix craftStr…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:19:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a61b5927dcf1043dc538e0c45f491d3284a7829",
          "body": "Mirrors the /run fix: a mid-stream SSE error event is captured and the command\nreturns non-nil, so the headless envelope reports ok=false / exit 1 instead of a\nfalse ok=true, while still emitting the NDJSON error line. (/pilot stays a live\nmonitor — error events are content, not a command failure.)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): propagate mid-stream gateway errors in /agent and /workflow",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:14:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4acc4ebaa0cb7b1268ecb1e31ab5755206395cc4",
          "body": "A plain --one-shot \"/cmd\" (without --json) called Dispatch directly and never\nmarked the registry headless, so /warroom, /bloom and other alt-screen commands\ntried to open a TTY (and failed) instead of using their plain-text headless\nbranch. RunHeadless already sets this for --json; the plain path now does too.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): plain one-shot dispatch is headless too (SetHeadless)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T15:10:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2294579ccf61151f790740048d12f743bf0ed532",
          "body": "…ithout --yolo\n\nFoundation for the headless-maximization pass. headlessRefuse is now consent-aware:\na command reaches its y/N prompt in headless mode only after headlessRefuse lets it\npast, which now requires explicit consent (--yes, this run only; narrower than the\nblunt --yolo which also skips the\n[…]\nfault preserved: headless WITHOUT --yes/--yolo still refuses. Wiring\nautoConfirmed() into each interactive command's gate is a follow-on track.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): --yes consent flag — confirm-gated commands run headless w…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T14:28:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "196338a8ef270e2f8ae26c22eb85b8fc5102d364",
          "body": "…ers, integrity\n\nWave 2 of the v1.1 agent-navigable cut (DGS-77): every command now emits the\n{ok,command,data,error} envelope in --json mode (NDJSON for streamers), plus the\ncapability + hygiene riders. Built by 4 parallel tracks against the Wave-1 seam,\nintegrated + verified together (make all gre\n[…]\n_test.go)\n- docs: /help table + CHANGELOG for the new modes\n- tests: internal/output envelope/NDJSON tests, headless dispatch + discovery tests\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): headless JSON across all commands — envelope + NDJSON, rid…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T14:15:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "134927dc0d0de769fc4c585f57d7addf96145123",
          "body": "…nt injection\n\nThe `prompt` and `agent` hook types were parsed but no-op'd (warn + return nil).\nThey now execute against the Gateway: `prompt` buffers a ChatStream, `agent` does\nCreateAgent + AgentChatStream. Advisory-only by design — they run and log but\ncannot veto the caller; only `command` hooks\n[…]\nal)\n\nPart of the v1.1 agent-navigable cut (DGS-77). Advisory-only leaves the\nveto-semantics decision for a future pass; noted in the follow-up.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): native prompt/agent hook types (advisory) + Gateway clie…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T14:14:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b3e657eff53d6546a552191ab6af9da4c1dab7c",
          "body": "… JSON envelope + discovery\n\nWave 1 foundation for the v1.1 agent-drivability cut (DGS-74 stream). The CLI's\n35-command surface was unreachable to any non-interactive caller: --one-shot sent\nits string straight to the chat stream, so `dojo --one-shot \"/health\"` chatted the\nliteral text \"/health\" ins\n[…]\nte-unchanged; live against\ngateway 3.2.2 — /health --json returns a structured envelope, unknown → exit 2,\n--commands --json lists 36 commands.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): headless agent-navigable spine — one-shot slash dispatch +…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-18T13:28:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c195ae7e1ad01964b6dc7610be5050f47fb33e5",
          "body": "dojo CLI advancement wave 2 — blocking hooks, permissions, model routing, guardrails, external skills",
          "is_bot": false,
          "headline": "Merge pull request #3 from DojoGenesis/dojo-cli-advance-20260717",
          "author_name": "Cruz Morales (TresPies)",
          "author_login": "DojoGenesis",
          "committed_at": "2026-07-17T18:28:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5efaa73993941296e112cbc77114f48f0a423a4",
          "body": "…ayout\n\nREADME tree showed 5 of ~25 internal packages, singular plugin/skill dirs, and a Cobra claim (the CLI uses its own command Registry, no Cobra). Both trees now enumerate the real packages with roles from their package doc comments.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct Directory Structure + CLAUDE.md map to actual package l…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T18:22:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ff86ac1c509f9becb19e9b3e47946f9621f1ce9",
          "body": "…e hooks example\n\nREADME gains Craft Workbench, Permissions, and Guardrails sections plus config/env additions; Plugin System example corrected to the real hooks/hooks.json format (the old inline plugin.json form never matched a rule). CHANGELOG dated section for the wave with inspiration lineage.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document /craft suite + advancement-wave capabilities; fix stal…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:41:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e445b78f2c4874b6378b4ea7e1a0195a31ad2da",
          "body": "/agent dispatch and /agent chat accept --model (both forms, any position); precedence flag > delegation.model > Gateway default; resolved model printed before streaming; /model ls shows the delegation default. Model field is forward-compat (Gateway may ignore today). Operationalizes the Sonnet-80/Opus-20 lane doctrine at the point of dispatch. Inspired by Claude Code per-Task model + Hermes delegation split.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): per-dispatch --model routing with delegation.model default",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c56e5234baddba37aaeaa91ebadb46baeec1074c",
          "body": "skills.external_dirs (default .claude/skills) is scanned read-only for Agent-Skills-convention SKILL.md files; /skill ls appends an External (read-only) section, /skill get ext:<name> forces external, plain get falls back on Gateway miss. /skill extracted verbatim from cmd_workflow.go into cmd_skill.go. package-all never sweeps external dirs. Inspired by Crush Agent Skills + Hermes external_dirs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): read-only external SKILL.md interop (ext: namespace)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb218dba01dba4efe92617005827745f6f74a79f",
          "body": "permissions.mode = default (confirm per action, refuses when non-TTY) | allowlist (permissions.allowed dot-path globs) | yolo (--yolo, loud). Gated: code.undo, plugin.install, plugin.rm, craft.adr, craft.claude-md --fix, craft.scaffold. Replaces the ad-hoc craftConfirm/InstallConfirmed prompts at those sites (single prompt, allowlist deny not overridable by --yes). Inspired by Claude Code permission modes + Crush allowed_tools/--yolo.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(permissions): three-tier permission gates on risky commands",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7b7e56460cfe54af69212da801f9cef1d58fe9e",
          "body": "…m guard\n\nPreCommand blocks now abort before Dispatch with [hooks] blocked message; free-text chat fires UserPromptSubmit before anything reaches the Gateway (a block returns to the prompt); StreamGuard observes the chat event stream. Carries the REPL wiring for both the hooks and guardrail tracks.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): honor blocking hooks, fire UserPromptSubmit, attach strea…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a35eff26c28994971c682fdd166c2dec8c3c91e6",
          "body": "… agent streams\n\ninternal/guardrail Tracker counts consecutive identical failures per key; Dispatch prints escalating advisories (warn at 3, hard at 5, config guardrails.*), StreamGuard in the renderer flags repeated same-signature tool failures via the Warning path. Advisory-only, never blocks. Inspired by Hermes tool_loop_guardrails.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(guardrail): advisory stuck-loop circuit breaker for commands and…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91b822a14e4555d912bc26fb5e06e17d93c3f1f3",
          "body": "…event\n\nFire() stays signature-stable for existing callers; FireChecked returns FireResult distinguishing clean / non-blocking failure / blocked. Only command-type hooks in rules marked blocking:true can block. UserPromptSubmit command hooks receive the prompt via DOJO_PROMPT env (4096-byte cap, nev\n[…]\nterpolated). prompt/agent hook types now warn once per plugin instead of silently no-oping. Inspired by Claude Code PreToolUse/UserPromptSubmit.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): blocking hook contract (FireChecked) + UserPromptSubmit …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T17:32:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a23136dc091bc340a862eeb64175e35cf30d88d",
          "body": "…nt wave\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(contracts): config + client + hook-event contracts for advanceme…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-17T16:50:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e4db7d972f9f444f7cda9ae466f77c85dd7a3a3f",
          "body": "dojo CLI overnight fest — genius-protocol-by-default + correctness/security hardening",
          "is_bot": false,
          "headline": "Merge pull request #2 from DojoGenesis/dojo-cli-fest-20260716",
          "author_name": "Cruz Morales (TresPies)",
          "author_login": "DojoGenesis",
          "committed_at": "2026-07-16T17:29:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e74d524e85524d5b95cdc744298b6b478053e00",
          "body": "/protocol show prints the currently-effective protocol doc (project ./DOJO.md > ~/.dojo/DOJO.md > embedded default) glamour-rendered, with a WARN when the protocol is disabled. /protocol edit opens the writable overlay in $EDITOR/$VISUAL (creating it from the default if absent, never clobbering; safe argv handling; guidance fallback when no editor is set).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): add /protocol show and /protocol edit",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T14:35:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "103cad14d22fb6ab21ed3c7575e86dc171a47619",
          "body": "…build/test failures\n\nTellFor now also maps build/test/panic/compile signatures to the debugging gate (state the causal chain + cheapest on/off experiment), with stable per-gate keys so wiring and debugging de-dupe independently; wiring wins on ties. The REPL tracks a normalized error signature and, after the same failure recurs 3x, surfaces the debugging gate once. Suppression under --plain and when protocol is disabled still holds.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): escalate JIT nudge to the debugging gate on repeated/…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T14:35:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b39c6dc7905f221dd2440e858142698f0b9121ba",
          "body": "…nudge\n\nVerify.AfterAgent (opt-in, env-transient) runs go build + go test after a successful /agent dispatch or /run and prints [verify] PASS/FAIL. On a gateway error whose text matches a wiring/boundary signature (connection refused, 401/403, 404, dial tcp, model-not-found), the REPL surfaces the s\n[…]\nrelevant config-vs-code gate as a dim [protocol] nudge — once per gate per session, suppressed under --plain and when the protocol is disabled.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): auto verify-loop + JIT tell-triggered config-vs-code …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T14:16:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f67c0a1b7fd99d656172ddf437401b3850837f5b",
          "body": "…l completions\n\n/help gains a Protocol section + the new commands; README documents them plus genius-protocol-by-default behavior; zsh/bash/fish completions include /doctor and /protocol.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(cli): document /doctor, /protocol, /session ls, /code undo; shel…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T14:16:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2859ffaf679fdbcd2927c2d1ef8b31e00dea95c5",
          "body": "…l get and /doc\n\nMoves RenderMarkdown out of package repl into a new internal/mdrender package (gated on gcolor.Enable, no plain param) so package commands can use it without an import cycle. /skill get and /doc now glamour-render fetched markdown when color is enabled, raw under --plain/--no-color.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(render): extract internal/mdrender; render markdown in /skil…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T14:16:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "66019191606e0c3197a8851523e6b34c274b52d1",
          "body": "/protocol status shows protocol + kata-harness state; /protocol harnesses lists the KE catalog (portable: KE_CATALOG_PATH -> home-relative -> embedded snapshot); /protocol install <name> copies a ratified, locally-available harness plugin into ~/.dojo/plugins with confirmation. Never runs operator-gated ke promote/publish.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): add /protocol command for harness discovery + install",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e717943cdb1e66309d925f9de0b7ad6d35b3e489",
          "body": "git restore of unstaged changes to tracked files within the project root, after showing the diff and confirming. Staged content, history, and untracked files are structurally untouched; clean errors when git is missing or not a repo.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(code): add /code undo to revert uncommitted working-tree changes",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "233e5d953ec940918319da0b2bae9982dc3da06f",
          "body": "Completer now covers /craft, all guide IDs (from guide.All so it can't drift), /doctor, /protocol, /session ls, /code undo, /model direct, /settings effective|profile, /skill search|package-all, /home plain; removed stale /garden harvest and /projects ls. Adds a dim interactive-only per-turn token/latency footer that reads usage in three shapes — a graceful no-op until the gateway attaches usage data.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): complete tab-completion + per-turn token readout",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "432ec973cd7ec8de56c5499922e8967e9e2975bb",
          "body": "…ssion\n\nstate keeps a bounded (20) de-duplicated session history recorded transparently on Save(). /session ls lists recent sessions (active marked); /session resume <id> switches to a specific id (warn-but-allow); new --session <id> launch flag resumes via the existing resume path with no repl.New signature change.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(session): real resume — history, /session ls, resume-by-id, --se…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5f1b54885c5191e89d8261f221b593bd6d73164",
          "body": "RenderMarkdown(full, plain) styles assistant markdown (code fences, lists, headings) width-aware when interactive, raw passthrough under --plain/--json. Live streaming and Render/RenderJSON/ClassifyChunk are unchanged; end-of-turn wiring follows separately.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): add glamour markdown renderer (RenderMarkdown)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T13:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a7cd64a826996c5b06641268999e83a57651792",
          "body": "…s.json\n\nA package TestMain now points HOME at a temp dir. Several commands call cfg.Save() (e.g. /disposition set); unisolated tests were overwriting the developer's real settings.json on every 'go test ./...' — writing gateway.url=http://test:7340 and protocol.enabled=false, the source of the spurious 'lookup test: no such host' failures seen while dogfooding. Fixed at the package level so any future Save-triggering test is safe.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(commands): isolate HOME so tests stop clobbering ~/.dojo/setting…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T10:09:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8728b77048dbae2bc721a02fe31ed929606bc622",
          "body": "Add PROTOCOL (enabled + source; WARN when silenced) and HARNESSES (kata-harness installed?) sections so a disabled protocol or missing harness is visible rather than silent.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(doctor): surface protocol + harness state in /doctor",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T10:00:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b89b9c5c45533cb2bb411eb06d3317f546529475",
          "body": "…ition discipline\n\nEnv overrides (DOJO_PROTOCOL_DISABLED, DOJO_GATEWAY_URL, etc.) were applied to the same fields Save() serializes, so a later Save() (/model set, /disposition set) baked the transient value in — this silently disabled the protocol on disk during testing. Load() now records env over\n[…]\nkeeping fields the user explicitly changed. Adds a 5th DispositionPreset field (Discipline). Regression-tested against a reverted naive Save().\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(config): stop env overrides persisting into settings.json; dispos…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T10:00:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aae8dbc3ce2b3a006b8423a797b4a8d93d429e11",
          "body": "…s fire\n\ndojo had no session-start hook event, so an installed harness's SessionStart hook (e.g. kata-harness) parsed but could never fire. Add EventSessionStart, fire it at REPL start with SessionEnd deferred across all exit paths, and map Claude-Code SessionStart to it in the plugin scanner. One-s\n[…]\n to protect the --json contract. Also gate the --plain 'Last session:' hint. Verified live: a real kata-shaped plugin's hooks execute on a run.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): add SessionStart lifecycle event so harness startup hook…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T10:00:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86d0f6e96366e6f71d85c52b794f5e862bb9baea",
          "body": "Read-only diagnostic printing OK/WARN for gateway reachability, per-provider status (surfacing the 'gateway healthy but a provider is 429/404' blind spot), config basics, and plugin/hook counts.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(commands): add /doctor for gateway/provider/config visibility",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:40:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7534fc9aebfa4e1c8beb2fd2f9f5be78dfdbc810",
          "body": "A hooks.json using the Claude-Code wrapper shape ({hooks:{...}}) — e.g. kata-harness — previously threw a swallowed unmarshal error and loaded zero rules. Now both wrapper and flat schemas parse; CC event names map to dojo's five (PreToolUse->PreCommand, PostToolUse->PostCommand, SubagentStop->PostAgent, SessionEnd->SessionEnd); events with no dojo equivalent are skipped with a logged note, not guessed to the wrong lifecycle point.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(plugins): parse Claude-Code hook schema so harness hooks load",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:40:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a22902f0cdb506279302662c0e1c861d3418b48b",
          "body": "… at init\n\nNew internal/protocol package embeds an L0 operating-discipline doc (the workspace's 8 gates as tells) and injects it once per session into chat and one-shot requests: inline-prepend for immediate effect plus a new ChatRequest.system_prompt field for when the gateway supports it. On by de\n[…]\n DOJO_PROTOCOL_PATH. /init installs kata-harness (ratified) + bring-loop/community-skills/dojo-craft and writes an overridable ~/.dojo/DOJO.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): inject genius protocol by default + ship kata-harness…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:40:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c22b3bc63e7190f400efc422a23c69444f22a541",
          "body": "…shell\n\n/disposition set validates against the same merged preset source /disposition ls shows; config.Load degrades an invalid disposition to the default (with a warning) instead of refusing to start (a typo or file-preset name previously bricked every launch). Gateway wiring errors still hard-fail\n[…]\nelemetry sink, which now discloses its endpoint once. Hook exec uses cmd /C on Windows; invalid matcher globs are logged, not silently dropped.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): un-brick /disposition set, telemetry opt-out, Windows hook …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:18:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40b9ed8187c58c92facb5caadd399f05e97d7a79",
          "body": "…panic\n\nMove the Gemini API key from the URL query string to the x-goog-api-key header so it cannot leak into Go's url.Error text on network failures. Contain /project artifact filenames within the artifacts root (a traversal also created intermediate dirs via AtomicWriteFile's MkdirAll). Guard ref[:12] against short refs that panicked /skill package-all. Dedup the /run DAG poll loop with a clean cancel message.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): Gemini key leak, artifact path traversal, package-all …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:18:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e848be4fe668391e89e519a1aabaf67f3021906",
          "body": "/craft adr and claude-md --fix capture the streamed content and write files (with confirmation); memory prune actually deletes; seed elevate stores to memory; scaffold confirms before writing; harvest is honest about being a list. craftStream now surfaces gateway event:error instead of silently producing nothing.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(craft): make /craft stubs real (write/prune/elevate)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:18:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "79ec839de107aba8eb254342fcae3415f00708ba",
          "body": "…hygiene\n\n/help rebuilt into 13 grouped sections covering all 34 commands (previously omitted /craft, /guide, /tools and many subcommands). /health and /home label 401/403 as auth-failed and 5xx as gateway-error instead of always 'unreachable'. Removed stale --trace guidance, the dead bloom 'garden' alias, and the phantom /garden harvest verb; /projects documents its no-arg behavior; /session <id> no longer overclaims.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(commands): complete /help, correct gateway error labels, command …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:18:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c2f27d6ca67de6bb7be9a4c07773b979e72ddaac",
          "body": "P0: gateway error events were swallowed (blank output, exit 0); EventError now renders visibly and one-shot exits non-zero in both text and --json. REPL prints the real stream error, not a canned string. Ctrl+C mid-response cancels only that turn (per-turn context) and returns to the prompt instead \n[…]\nithout --one-shot. Added a per-chunk stream stall watchdog and FriendlyError for connection/auth failures. Bare 'dojo version'/'help' now work.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): surface gateway errors, two-tier interrupt, pipeline hygiene",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T09:18:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "649d3cbb0f395d7f54f4a86030c9ac152c0eff35",
          "body": "Fix all golangci-lint findings (errcheck/staticcheck/unused) across the module so the milestone-gate lint layer passes and the CLI can be release-tagged. Behavior-preserving. Uncapped total exceeded the capped default view; final sweep closed client/repl/spirit/skills stragglers the per-package pass could not see.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(lint): green the golangci-lint gate",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-16T08:39:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "850721faa59d112c4c0f6007ac657f21cb304c17",
          "body": "…pagation surfaces (kata-orchestrator)\n\nrandomHex length/hex/non-determinism/zero, NewRoundTripper nil-default\nwiring (DefaultTransport + LogSink), RoundTrip always-on X-Trace-ID\npropagation (generate-when-absent + clone-not-mutate + passthrough), and\nLogSink.Emit no-panic. Span-recording path left untested (traceEnabled is\ninit-gated on DOJO_TRACE, not flippable mid-run). Test-only, no source change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(trace): hermetic unit tests for internal/trace pure + header-pro…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-14T07:08:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84e242facf51ac2537fd61c4a7198edf38a38ba6",
          "body": "…(kata-orchestrator)\n\nCover the previously zero-test internal/project package: slugify edge cases\n(via Create), in-memory mutation helpers (SetPhase/AddTrack/AddDecision/\nAddArtifact/SuggestNext), the 50-entry appendActivity cap, and the\nfilesystem lifecycle (Create/Load/GetProject/Switch/ListAll/Archive/Save)\nunder an isolated HOME. 15 tests, all hermetic and deterministic.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(project): hermetic unit coverage for internal/project lifecycle …",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-07-07T07:09:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "71afb58f58ab95a41a2d720525406c7ce543c4ce",
          "body": "…ear (kata-orchestrator)\n\ninternal/activity had zero test coverage. New log_test.go (11 tests) covers the\nNDJSON activity log: Append->Recent round-trip in newest-first order, Recent(n)\ntruncation, the not-exist->(nil,nil) branch, malformed- and blank-line skipping,\nzero-Timestamp fill, Clear trunca\n[…]\njoDir. Every test isolates $HOME to a temp dir\n(t.Setenv) so nothing touches the real ~/.dojo. Built by a Sonnet agent,\norchestrator-verified (go build + vet + go test ./... green, -count=2 no flake).",
          "is_bot": false,
          "headline": "test(activity): hermetic unit tests for activity log Append/Recent/Cl…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-23T07:08:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5b29ae0e2df3f899f250807d282ec9b719ee226",
          "body": null,
          "is_bot": false,
          "headline": "chore: verify autopush retry (DojoGenesis active, polled)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-15T19:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7739d6c25c47c652a82b18621f792eebe869813c",
          "body": "…y-multiremote-autopush)",
          "is_bot": false,
          "headline": "chore: verify multi-remote autopush hook (closes 2026-06-14_mac-verif…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-15T19:55:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea2cd43c0a70e621e5c8bb4aa3e7857a1382cc2a",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add nexus CLAUDE.md front door for the DojoGenesis CLI",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-11T18:01:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7932549771bf597635f40f5dfd8dba22bb57ec9",
          "body": "…hestrator)\n\n15 table-driven tests covering ensureMDExt, Dir path composition, and the\nSave/Read/Delete/List/ListAll cycle. Hermetic via t.Setenv(HOME, t.TempDir());\nno network, no external processes, no real ~/.dojo mutation. go build + full\nsuite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(artifacts): add hermetic unit tests for store.go (OA2) (kata-orc…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-09T07:11:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f6da844f6245ea557199acfe27100152b123168c",
          "body": "Add Opus 4.7 + 4.8 aliases (4.8 = most capable), newest-first. Frontier\nMythos-class capability ships in a future public Opus; Mythos Preview itself\nis Glasswing-gated with no public API ID. See AgenticStackOrchestration ADR 028.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(providers): bring Claude catalog current to Opus 4.8 (ADR 028)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-06-07T01:37:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88d6712d2af37f55dfa15fe37afa4b35a6ee3702",
          "body": "Adds FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true at workflow level across both\nCLI workflows to suppress Node.js 20 deprecation warnings ahead of the\nJune 2, 2026 forced migration.\n\nCo-authored-by: TresPies-source <cruz@trespiesdesign.com>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: opt into Node.js 24 for all workflow actions (bridge) (#1)",
          "author_name": "Cruz Morales (TresPies)",
          "author_login": "DojoGenesis",
          "committed_at": "2026-05-27T23:18:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "732d4f9623cbde51969c556c2838cb8ff466abff",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: CHANGELOG — add Unreleased section summarizing recent CLI work",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-23T09:13:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e58945f9ff9c75dc462cd7d5600bd7bf95a1aee3",
          "body": "Previously every settings-like file was written with os.WriteFile\n(truncate + write). A SIGKILL or concurrent invocation mid-write left\na truncated/partial file that failed to parse on next load, bricking\nthe CLI until manual repair.\n\nIntroduces internal/ioutilx.AtomicWriteFile — writes to a temp fi\n[…]\nsts for roundtrip, parent-dir creation,\nperm preservation, no-temp-file residue, and 10-goroutine concurrent\nwrite with torn-write detection.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(persistence): atomic writes for all config/state JSON files",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-23T03:38:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a965ac407aad9de20a9f1c23044dac445455a831",
          "body": "Dispatch was writing /settings set <provider> <api-key> verbatim to\n~/.dojo/activity.log, persisting API keys in plaintext on disk. File\nis 0600 but backups, sync tools, and log scrapers can still read it.\n\nFix: introduce secretArgPositions map (single source of truth — add\none entry per new secret-\n[…]\natch, empty,\nbounds-safe, non-mutation) plus activity-log integration tests that\nread the written file and assert the fake key never appears.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): redact secret positional args in activity log",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-23T03:12:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abeb0716ef8975a326f1592a608575031bcfbe83",
          "body": "codeRead joined user input with cwd via filepath.Join, which calls\nfilepath.Clean — ../ segments were resolved but never boundary-checked.\nA /code read ../../../etc/passwd returned arbitrary filesystem content.\n\nFix: after joining, call filepath.EvalSymlinks on both path and cwd\n(handles symlink esc\n[…]\ne paths.\n\nScope: only codeRead had this pattern. codeDiff delegates to git,\ncodeTest/codeBuild/codeVet/codeGate invoke go with no user paths.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): enforce project-root boundary in /code read",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-23T03:12:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af08841214a81021ff8c38981c90cb59a80dba72",
          "body": "desktop/main.go uses `//go:embed all:frontend/dist`, which fails on\nfresh CI checkouts because the dist dir is gitignored. CI broke with\n\"pattern all:frontend/dist: no matching files found\".\n\nFix: allow `desktop/frontend/dist/.gitkeep` through the gitignore so\nthe embed compiles even before the SPA is built. Build outputs stay\nignored.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): commit embed anchor for desktop/frontend/dist",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-22T16:41:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a2a1aca79f19a2cbaf4bf944e942dc55978253e",
          "body": "Document the Dojo CLI milestone from the Phase 7 initial tag (v0.1.0)\nthrough v1.0.0 shipped Apr 12, 2026. Format per Keep-a-Changelog v1.1.0.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CHANGELOG covering v0.1.0 through v1.0.0",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-20T16:24:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "956b9700a7b475dfa398596a5912720122a674d3",
          "body": "/craft commands are REPL slash commands, not Gateway prompts.\nFixed to pipe via stdin. 9/9 tests pass offline.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): smoke-craft.sh — use REPL stdin pipe, not --one-shot",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-16T01:25:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad4ece257b56f510189587eeb8cc40ef92464730",
          "body": "Tests all 8 subcommands: view, scaffold, converge (offline), plus\nmemory, seed, adr, scout, claude-md (Gateway-dependent with --offline skip).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add /craft smoke test script — 15 offline + online test cases",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-16T01:16:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "103687545d9b5e0a062523cd4e0e81dfc4ba309f",
          "body": "8 subcommands: adr, scout, claude-md, memory, seed, view, scaffold, converge.\nGateway-connected with SSE streaming. Fixes seed search (was calling wrong\nendpoint) and JSON delta parser (now uses encoding/json).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add /craft command group — DojoCraft practitioner workbench",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-16T01:08:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "190e24e07adffc8d2725cfd7abe5900843d4f50d",
          "body": null,
          "is_bot": false,
          "headline": "docs: improve README — fill gaps",
          "author_name": "Cruz Morales (TresPies)",
          "author_login": "DojoGenesis",
          "committed_at": "2026-04-13T20:45:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6995170652adb843dbd442f152ac627781da5f39",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: goreleaser brew token for cross-repo homebrew-tap push",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:10:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6114dd5c7d62605f41a51801a37092e133492a21",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark TODO.md fully resolved — all phases complete, CLI shippable",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:06:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10a1648cb08f0a5341a07090eb7cf39cd61848e3",
          "body": "Client-side NL parser decomposes task descriptions into ExecutionPlans:\n- Sentence splitting (periods, semicolons, conjunctions)\n- Sequential/parallel dependency inference\n- 12 verb-to-tool mappings with word-boundary matching\n- --dag flag on /run forces DAG mode; submits + polls live status\n- 6 test groups, 42 sub-cases, all passing\n\nThis closes the last item in TODO.md — CLI is fully shippable.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: NL-to-DAG construction — /run <task> --dag (TODO 3.4)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:06:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c491e0e254db0cd3250c0276fe6d953df852a1d",
          "body": "os.Getwd() replaces \".\" in cmd_agent.go and client.go so the gateway\nreceives the actual CWD, not a relative path that resolves to the\ngateway's own working directory.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve WorkspaceRoot to absolute path instead of hardcoded \".\"",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:00:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "723e958989bfd863fe49a0ec60ca56a089082f94",
          "body": "All 33 registered commands now have completions across all three shell\nformats and the readline REPL tab-completer.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: shell completions — add 13 missing commands to zsh/bash/fish + REPL",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:00:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9d4325cfc44508bb0b3c3ccd1b6d6f13d8b9098b",
          "body": "Triggers on v* tags. Uses goreleaser-action@v6 with --clean.\nThreads HOMEBREW_TAP_GITHUB_TOKEN for DojoGenesis/homebrew-tap push.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: goreleaser release workflow — auto-build on tag push",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T02:00:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e3b704403cee9ec18c4427e5c5ea8f541ba4b742",
          "body": "Required for public release. Matches Gateway license.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add Apache 2.0 LICENSE file",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4b5eb7c34e04a33ea6b001cb8793e0e8de4761f5",
          "body": "Strategic scout concluded desktop feature development is premature.\nRevival requires: CLI shipped, Gateway API stable, user demand signal.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: hibernate cli/desktop/ — feature dev gated behind CLI v1.0.0 ship",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a473d3c4c4bc0bda8977c458c639d2f903a34c7",
          "body": "…t runner updates\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: commit hygiene — stop tracking binaries, stage providers + tes…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8f456a203ea3830c50508ccf699f813ed21e1df1",
          "body": "- .github/workflows/ci.yml: Go build + test CI\n- desktop/: Wails v2 scaffold (app.go, Svelte 5 frontend chat wedge)\n- docs/audits/2026-04-10_health_audit.md, docs/testing-loop/\n- .gitignore: exclude desktop build/node_modules/dist/.svelte-kit\n- .goreleaser.yaml, Makefile, scripts/install.sh: minor updates\n- TODO.md, README.md: current state sync\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: CI workflow, desktop scaffold, docs, build scripts, gitignore",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "27082aeb40fc9bda9ad97ba6f71269c6cb1d1fb9",
          "body": "…ests\n\ninternal/skills: ClusterCategory infers category from name (3x weight) and\ndescription tokens using a weighted keyword taxonomy; falls back to \"general\"\nbelow minScore=3.  Covers 20+ categories from the full Dojo corpus.\n\nTests: telemetry sink integration test against httptest server; providers\ntable-driven tests covering key validation and provider resolution.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: skills semantic clustering package + telemetry sink/providers t…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7e973096b41155929d5bc74bb2461b31cb295b43",
          "body": "…ofile subcommand\n\nDispositionCreate now writes to both the legacy file and settings.json so\nprofiles survive without the YAML file.  MergeConfigProfiles combines both\nsources on every list/show/set call.  /settings profile ls|set|show|create\ndelegates to the same handlers so both surfaces stay in sync.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: persist disposition profiles to settings.json; add /settings pr…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7f521c27c4ebd5ba1e3218ce2243874d0d35272",
          "body": "All Go modules build and test clean (go build ./... && go test ./... pass).\nCommits modified .go files and go.mod from nightly sweep.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(nightly-ci): cli — post-sweep cleanup",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "009208a664b180fc89e997424c9ca8aba11ba940",
          "body": "…tion\n\nThe gateway's file tools resolve relative paths against the CLI's working\ndirectory, but only when workspace_root is included in the chat request.\nThis was missing from the one-shot (-e) code path.\n\nChanges:\n- internal/client/client.go: add WorkspaceRoot field to ChatRequest\n  (json:\"workspac\n[…]\nr improvements\n- internal/plugins/installer.go: plugin install improvements\n- internal/providers/providers.go: provider handling improvements\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: send workspace_root with every chat request for file tool resolu…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-12T01:31:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49b893fd19e03f22b71e9aeae8e714897435637b",
          "body": null,
          "is_bot": false,
          "headline": "docs: add llms.txt for LLM/Context7 discoverability",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-11T00:09:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9718d694ccc1337ff7bdf97986cb37dccd86f99",
          "body": "…ction\n\n- cmd_agent.go: append explicit completion requirements to every dispatched\n  agent message so sub-agents don't self-terminate after a single tool call\n- cmd_workflow.go: guard /run against task names that match registered\n  commands; /run pilot now returns a helpful error instead of sending\n[…]\nits cleanly when REPL context is canceled; also\n  add defense-in-depth guard that prevents slash-prefixed input from ever\n  reaching r.chat()\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: agent dispatch guard, /run command routing, persistent SSE conne…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T02:12:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f81909fee18994c76359dd51380bd33cedad1599",
          "body": "- Add /bloom command (TUI animated experience)\n- Add /code command\n- Add /guide command with walkthrough system\n- Add internal/guide package for guide state management\n- Add particle and stage art animations (internal/art)\n- Update warroom TUI, renderer, spirit, state, config, client, bootstrap\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add bloom/code/guide commands, art animations, warroom updates",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T02:12:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f37f8efa046b5869c130a31325dd904bd3e4cf30",
          "body": "Wave 3 pilot upgrade:\n- specialist_map.go: client-side intent→specialist mapping (7 specialists).\n  LookupSpecialist() populates context panel with name/disposition/plugin/skills.\n- dag_panel.go: live DAG orchestration panel. Tracks nodes as\n  pending→running→success/failed. Renders compact TUI with\n[…]\nilot.go: wires all three — specialist on intent_classified, DAG on\n  orchestration_* events, garden on startup + memory_retrieved.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pilot): specialist awareness + DAG panel + garden context",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T00:21:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "14ec816df4daeb9e9217f2e5c092612c26136855",
          "body": "Wave 2 pilot upgrade:\n- panels.go: 3-panel layout (event log 60%, context panel, stats panel).\n  Tab/Shift+Tab cycles focus. Lipgloss borders with focus highlighting.\n- pilot.go: PilotContext tracks specialist/disposition/provider/project.\n  PilotStats accumulates per-category event counts. View() r\n[…]\ngests events from pilot,\n  flushes to D1 via POST /api/telemetry/ingest every 5s. Best-effort,\n  never crashes on network failure.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pilot): multi-panel layout + telemetry sink",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T00:15:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5081c97df748b0238289c63366402f4800513ee8",
          "body": "Wave 1 pilot upgrade:\n- event_parser.go: ParsedEvent with category/severity/summary for all 22\n  gateway event types. Color-coded: errors red, warnings yellow, success green.\n- pilot.go: replaces opaque eventEntry with ParsedEvent throughout.\n  Status bar now shows running cost ($X.XXXX), token count (K/M suffix),\n  and provider/model. Cost rates auto-adjust per model tier (haiku/sonnet/opus).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(pilot): typed event parser + real-time cost tracking",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T00:10:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a274808881d07732cd9dfda2b36b804038f340e",
          "body": "/warroom command (aliases: war, debate) with Bubbletea split-panel layout.\nScout agent (measured disposition, strategic-scout skill) on the left,\nChallenger agent (adversarial disposition, adversarial-reviewer skill) on\nthe right. Single input bar, both agents respond via concurrent SSE\nstreams. Tab cycles focus, j/k scrolls panels.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: War Room TUI mode — split-panel Scout vs Challenger debate",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-10T00:05:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "89dd205e3713e98ef2f2de36bc562be0c865c28f",
          "body": "Default was dojo-telemetry.dojo.workers.dev (nonexistent) — all CLI\ntelemetry commands returned 404. Fixed to trespiesdesign.workers.dev.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct telemetry API default URL (dojo→trespiesdesign workers.dev)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T23:55:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "216ab92d52c3944775940828b25e756832cb84bf",
          "body": "… card\n\nBelt ladder: White→Yellow→Orange→Green→Blue→Purple→Brown→Black\nwith XP thresholds from 0 to 50,000.\n\nXP awarded for sessions, commands, chats, agent dispatches, skills,\nplugins, practice, seeds, and projects. Streak bonus (days * 5, max 150).\n\n10 achievements: First Steps, Green Thumb, Comma\n[…]\n achievements\n\nSpirit state persisted in ~/.dojo/state.json alongside existing state.\n21 unit tests in spirit_test.go, race-clean.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Dojo Spirit — belt ranks, achievements, streaks, koans, profile…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T23:46:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adfd19c6b175691e5378090020edf40d07814d11",
          "body": "Queries the dojo-telemetry CF Worker API for observability data:\n- /telemetry sessions — session list with relative timestamps\n- /telemetry costs — cost breakdown + ASCII trend chart\n- /telemetry tools — tool stats with success rates\n- /telemetry summary — combined overview (top 5 each)\n\nConfigurable via DOJO_TELEMETRY_URL env var. Aliases: telem, obs.\nAll JSON response shapes match the actual API contract (sweep-verified).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add /telemetry CLI commands (sessions, costs, tools, summary)",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T23:43:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3270d3dd9814340d4b47d0a54267907412d188ab",
          "body": "Phase 1 (Foundation):\n- Split monolithic commands.go (2026 lines) into feature-slice cmd_*.go files\n- Unify color library to gookit/color, remove fatih/color\n- Add config validation with Validate() on load\n- Thread Auth.UserID through to ChatRequest\n\nPhase 2 (Enhancement):\n- Typed SSE renderer with \n[…]\nfor /run orchestration\n\n36 files changed, 6409 insertions(+), 2022 deletions(-)\nAll gates passing: go build, go vet, go test -race\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: comprehensive CLI improvements — Phases 1-3",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T23:27:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba393c04fb18d84679f7b021a372d0f0bf6a0df8",
          "body": "Bootstrap engine (internal/bootstrap/):\n- /init creates settings.json, copies 8 first-party plugins, writes 4\n  disposition presets (focused/balanced/exploratory/deliberate), generates\n  mcp.json with 7 MCP server definitions, plants 5 starter seeds\n- Idempotent: skip existing files, /init twice is \n[…]\nerg, safety_switch, harness_trace,\ncollaborative_calibration, sanctuary_architecture\n\n16 bootstrap tests, all passing. 8 test packages green.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: /init command — populate empty workspace with ecosystem assets",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T09:17:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "815026c9db372d870af67049ba9a48954394cd3a",
          "body": "Spec 7.1 — MCP App Management:\n- /apps ls|launch|close|status|call commands\n- LaunchApp, CloseApp, ListApps, AppStatus, ProxyToolCall client methods\n\nSpec 7.2 + 7.6 — Agent Channels + Detail:\n- /agent info|channels|bind|unbind commands\n- BindAgentChannels, ListAgentChannels, UnbindAgentChannel, GetA\n[…]\nlient methods, 5 new commands, 8 new subcommands\nTotal: 46 client methods, 30+ commands/subcommands\nBuild clean, vet clean, all tests passing\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Phase 7 — MCP apps, agent channels, workflows, CAS, documents",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T08:44:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "371dae94ab7f4a81be033cf270ecb275ea72528b",
          "body": "Spec 6.1 — Memory Management:\n- StoreMemory, UpdateMemory, DeleteMemory, SearchMemories, DeleteSeed client methods\n- /garden search <query>, /garden rm <id>\n- /trail add <text>, /trail rm <id>, /trail search <query>\n\nSpec 6.2 — Snapshots:\n- ListSnapshots, CreateSnapshot, RestoreSnapshot, DeleteSnaps\n[…]\ns, /settings set <provider> <key>\n\nNew HTTP helpers: put, delete, getRaw\n12 new client methods, 6 new hook tests, all 7 test packages passing\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Phase 6 — memory CRUD, snapshots, traces, hooks, error recovery",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T08:24:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aeead9bc88e20b79badce9fcbd21ced263fc7183",
          "body": "- /run: replaced broken orchestration tool_name with direct ChatStream call\n- /home: defaults to Bubbletea TUI panel, /home plain for text fallback\n- /home plain: shows error states for agents/seeds instead of silent zeros\n- /pilot plain: available as text fallback alongside TUI default\n- Color #1a3a4a -> #64748b for visibility on dark terminal backgrounds\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: /run uses ChatStream MVP, /home wired to TUI, dark-screen color fix",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T08:20:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dea0bfc3bfd54d3dcb3ed7eb6c0a834ccb3f8e0",
          "body": "Gateway default changed to 7340 instead. Reverting the CLI-side\nport change from the previous commit.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "revert: restore default gateway port to 7340",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T07:53:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "34643885976b59664a71d4a0b70b49baf56bfe76",
          "body": "The AgenticGateway listens on :8080 (PORT env, default 8080).\nThe CLI was hardcoded to 7340. Fixed in config default, tests,\nmain.go flag help text, and README.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: default gateway port 7340 -> 8080 to match AgenticGateway",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T07:52:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06a5ef9aecc444e85163291d0727918257edded0",
          "body": "Rewrites README using product copy, surface descriptions, and vocabulary\nfrom the Dojo Genesis v0.25 shell homepage. Maps all 8 surfaces (Garden,\nPractice, Trail, Partnership, Projects, Pipelines, Piloting, Home) to their\nCLI command equivalents. References ADA disposition presets, sunset gradient\npalette, and the self-hosted/own-your-infrastructure positioning.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: README rewrite with Dojo Genesis v0.25 brand voice",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T07:44:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59e427b757e3c21a4123a96c946ae4324865316e",
          "body": "…ce, full test coverage\n\nBuild & distribution:\n- Makefile: build, install, test, vet, clean, fmt, lint targets\n- .goreleaser.yaml: cross-platform binaries (linux/darwin/windows, amd64/arm64)\n- scripts/install.sh: curl-pipe installer for pre-built releases\n- Version now overridable via ldflags (const\n[…]\n4+ tests across 7 packages, all passing\n\nDocumentation:\n- README.md: quickstart, installation, configuration, commands reference, development\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Phase 5 — ship-ready CLI with Makefile, README, state persisten…",
          "author_name": "TresPies-source",
          "author_login": "TresPies-source",
          "committed_at": "2026-04-09T07:43:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 4,
      "commits_last_year": 104,
      "latest_release_at": "2026-07-18T15:57:40Z",
      "latest_release_tag": "v1.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 33.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/DojoGenesis/cli",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/DojoGenesis/cli",
          "is_deprecated": false,
          "latest_version": "v1.1.0",
          "repository_url": "https://github.com/DojoGenesis/cli",
          "versions_count": 4,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T15:53:44Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "desktop/frontend/tsconfig.json"
      ],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 54759,
      "source_files_sampled": 122,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6627
    },
    "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/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/chzyer/readline",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.1"
        },
        {
          "name": "github.com/gookit/color",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/wailsapp/wails/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.12.0"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.36.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": 0,
        "merged_prs": 4,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "TresPies-source",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/223790330?v=4"
        },
        {
          "type": "User",
          "login": "DojoGenesis",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/273886418?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.952
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 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": 0,
            "reason": "Found 0/4 approved changesets -- score normalized to 0",
            "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": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow 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": 0,
            "reason": "44 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c0c3091d0fb9af99832dab2d788dce9fb4c4aba5",
        "ran_at": "2026-07-25T00:52:37Z",
        "aggregate_score": 3.4,
        "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-18T15:57:46Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-18T15:43:43Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/DojoGenesis/cli",
    "host": "github.com",
    "name": "cli",
    "owner": "DojoGenesis"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 34,
        "vitality": 79,
        "community": 40,
        "governance": 48,
        "engineering": 75
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "commits_last_year": 104,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 10
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "104 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 104
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 4,
              "latest_release_tag": "v1.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 33.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~33.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 33.4
                    }
                  }
                ],
                "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": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "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": 48,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.952
            },
            "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 95% of commits",
                "points": 1.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 4,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "4/4 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 4,
                      "decided": 4
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/4 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "critical",
            "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": 29,
            "inputs": {
              "followers": 2,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "DojoGenesis",
              "public_repos": 16,
              "account_age_days": 109
            },
            "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 DojoGenesis",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "DojoGenesis"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "16 public repos, account ~0 yr old",
                "points": 9.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 16
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/DojoGenesis/cli"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "4 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": 75,
        "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": "3 out of 3 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": 85,
            "inputs": {
              "topics": [
                "agentic-ai",
                "ai-agent",
                "cli",
                "cobra",
                "go",
                "golang",
                "plugin-system",
                "repl",
                "slash-commands",
                "sse",
                "terminal"
              ],
              "has_wiki": true,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "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": "11 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 34,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.4
            },
            "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": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 3 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 0/4 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "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": "44 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6627
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "desktop/frontend/tsconfig.json"
              ],
              "agent_commit_share": 0.92,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "desktop/frontend/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "desktop/frontend/tsconfig.json"
                    }
                  }
                ],
                "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": "92 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 92,
                      "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": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 54759,
              "source_files_sampled": 122,
              "oversized_source_files": 0
            },
            "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": "0/122 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 122,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T00:52:52.025030Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/DojoGenesis/cli.svg",
  "full_name": "DojoGenesis/cli",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.