Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 15:10 UTC

gobha-me / venice-cli

Unofficial Python CLI for the Venice.ai API — image, video, audio, TTS, chat, and embeddings from the terminal.

PythonMIT★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

gobha-me/venice-cli tiene un índice de salud de 54 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (73/100) y la más baja, Community & Adoption (39/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

54
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.

54
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

Jeffrey SmithCuenta personal
0 seguidores9 repositorios públicosdesde abr 2019

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ónEtiquetas
PyPIvenice-cli0.50.1259635hace 0 díascliembeddingsllmtext-to-imagetext-to-videottsvenicevenice-ai

Métricas por categoría

Vitalidad

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

73Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
1.4/36Cadencia de commits — 2/52 semanas con commits
18/18Volumen de commits — 106 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year106
human_commit_share1
days_since_last_push0
active_weeks_last_year2
Cómo se puntúa
27/27Publica versiones — 35 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count35
latest_release_tagv0.50.1
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases0,1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

39En 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 (MIT)
18/18Guía CONTRIBUTING
0/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_conductno
has_pull_request_templateno
Cómo se puntúa
45.5/80Descargas mensuales — 2596 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesvenice-cli
dependents
ecosystemspypi
total_downloads
monthly_downloads2596
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

52Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.2/22.5Distribución de commits — el principal contribuyente firma el 99% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,991
Cómo se puntúa
38.2/46.8Resolución de issues — 82% de issues cerradas
38.2/38.3Aceptación de PR — 2/2 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs2
open_issues13
closed_issues58
issue_closed_ratio0,817
closed_unmerged_prs0
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de gobha-me
19.3/25Trayectoria — 9 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_logingobha-me
public_repos9
account_age_days2660
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 pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 35 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesvenice-cli
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

56Moderado · 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
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
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?

48En 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
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,8
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, signed_releases. Los pesos restantes se han renormalizado.

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.

57Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 77 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,77
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes2308
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 51 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,51
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
55/55Tamaños de archivo manejables — 0/83 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes43.082
source_files_sampled83
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signal
api_schema_files

Datos clave

0estrellas de GitHub
2contribuidores
106commits en los últimos 12 meses
0días desde el último push
35versiones publicadas
1factor bus
13issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:venice-cli@0.50.1; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.8 / 10
4.8agregado

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-22 15:10 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
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": [],
      "is_fork": false,
      "size_kb": 920,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 2972,
        "Python": 933715,
        "Makefile": 538
      },
      "pushed_at": "2026-07-22T15:01:21Z",
      "created_at": "2026-07-17T12:54:13Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T15:04:01Z",
      "description": "Unofficial Python CLI for the Venice.ai API — image, video, audio, TTS, chat, and embeddings from the terminal.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Jeffrey Smith",
      "type": "User",
      "login": "gobha-me",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/49483793?v=4",
      "created_at": "2019-04-10T12:33:54Z",
      "is_verified": null,
      "public_repos": 9,
      "account_age_days": 2660
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.50.1",
          "kind": "patch",
          "published_at": "2026-07-22T15:01:21Z"
        },
        {
          "tag": "v0.50.0",
          "kind": "minor",
          "published_at": "2026-07-22T11:31:34Z"
        },
        {
          "tag": "v0.49.1",
          "kind": "patch",
          "published_at": "2026-07-22T11:26:24Z"
        },
        {
          "tag": "v0.49.0",
          "kind": "minor",
          "published_at": "2026-07-22T10:53:30Z"
        },
        {
          "tag": "v0.48.0",
          "kind": "minor",
          "published_at": "2026-07-22T00:21:06Z"
        },
        {
          "tag": "v0.47.0",
          "kind": "minor",
          "published_at": "2026-07-21T22:50:52Z"
        },
        {
          "tag": "v0.46.0",
          "kind": "minor",
          "published_at": "2026-07-21T20:15:22Z"
        },
        {
          "tag": "v0.45.0",
          "kind": "minor",
          "published_at": "2026-07-21T19:04:39Z"
        },
        {
          "tag": "v0.44.0",
          "kind": "minor",
          "published_at": "2026-07-21T18:04:21Z"
        },
        {
          "tag": "v0.43.0",
          "kind": "minor",
          "published_at": "2026-07-21T17:19:21Z"
        },
        {
          "tag": "v0.42.0",
          "kind": "minor",
          "published_at": "2026-07-21T16:41:04Z"
        },
        {
          "tag": "v0.41.0",
          "kind": "minor",
          "published_at": "2026-07-21T15:15:12Z"
        },
        {
          "tag": "v0.40.0",
          "kind": "minor",
          "published_at": "2026-07-21T12:17:57Z"
        },
        {
          "tag": "v0.39.0",
          "kind": "minor",
          "published_at": "2026-07-21T10:46:22Z"
        },
        {
          "tag": "v0.38.0",
          "kind": "minor",
          "published_at": "2026-07-21T09:43:22Z"
        },
        {
          "tag": "v0.37.0",
          "kind": "minor",
          "published_at": "2026-07-21T09:28:56Z"
        },
        {
          "tag": "v0.36.0",
          "kind": "minor",
          "published_at": "2026-07-21T09:25:02Z"
        },
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-07-21T09:12:32Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-07-21T00:22:21Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-07-21T00:09:32Z"
        },
        {
          "tag": "v0.32.0",
          "kind": "minor",
          "published_at": "2026-07-20T23:41:37Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-07-20T23:30:52Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-07-20T22:37:39Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-07-20T22:15:13Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-07-20T20:39:03Z"
        },
        {
          "tag": "v0.27.0",
          "kind": "minor",
          "published_at": "2026-07-20T19:36:41Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-07-20T18:48:35Z"
        },
        {
          "tag": "v0.25.1",
          "kind": "patch",
          "published_at": "2026-07-20T18:08:11Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-07-20T16:38:36Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-07-20T14:31:00Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-07-20T11:43:51Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-07-20T09:32:26Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-19T11:04:10Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-18T19:15:38Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-17T18:00:24Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b692a797454dee9e2e181fffd591b3091b17eda6",
          "body": "…ction>.* (#58) (v0.50.1)",
          "is_bot": false,
          "headline": "Merge fix/mcp-serve-config-defaults-58: mcp-serve honors defaults.<se…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T14:50:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91e1c0e2df8dc836613f073167a19b38d17dedc3",
          "body": "`defaults.<command>.*` config was honored on the standalone CLI and on the\n`chat --tools` / `code --assets` agent paths, but NOT on `venice mcp-serve`:\nits FastMCP wrappers forwarded args verbatim to the `_mcp.*_tool` impls, so a\nhost (e.g. claude.ai) calling `venice_image` always got the hardcoded \n[…]\ntConfigDefaultsWiring` in test_mcp_serve.py\n  (injection, host-override, no-config) driving the registered `Tool.fn`.\n\nBumps version to 0.50.1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mcp): mcp-serve honors defaults.<section>.* in exposed tools (#58)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T14:50:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "214a86f1904564f821d42661ca4dc372cd326a7a",
          "body": "…#70) (v0.50.0)",
          "is_bot": false,
          "headline": "Merge feat/mcp-secret-refs-70: reference MCP server secrets by name (…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T11:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cb17f7025e0343c28cb8d7e56c66c58f11ae322",
          "body": "Follow-up to #43 (named-secret store). MCP-server auth tokens were the store's\nintended second consumer but were still kept plaintext in config.json. An --env\nor --header value may now contain `@secret:<name>`, resolved from the 0600\nsecret store at attach time instead of being stored in the clear, \n[…]\nests (inline/multi/passthrough/none/missing) in\ntest_mcp_client, and a config-add round-trip storing the literal ref in\ntest_config. 696 green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): reference MCP server secrets by name via @secret:<name> (#70)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T11:30:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1484aee932524c174ce3e6f5e1ac6f45a6f3cc1a",
          "body": "…gs (#69) (v0.49.1)",
          "is_bot": false,
          "headline": "Merge fix/git-dup-subcommand-69: reject repeated git subcommand in ar…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T11:25:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23c43c2cfae99c48795e19115e445ed54b727082",
          "body": "The read-only `git` tool built `[\"git\", <subcommand>] + args`, so a caller\nthat mirrored a CLI invocation and put the subcommand in args too (e.g.\nsubcommand=\"remote\", args=[\"remote\",\"-v\"]) got `git remote remote -v` and a\nconfusing \"unknown subcommand\" error from git itself.\n\nReject `args[0] == sub\n[…]\n message before exec,\nand note in the schema that args must not repeat the subcommand. Normal\nusage (args without the subcommand) is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(vcoder): reject a repeated subcommand in the git tool's args (#69)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T11:25:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b21ef5a1a4e87695335bf34e60e9722ad65be12b",
          "body": "…9.0)\n\n`venice secret set/ls/rm` + `login --embed` back a structured 0600 secrets.json\nfor named secrets (embed key first), separate from the credentials file and\nconfig.json. Values are never printed (ls = lengths only; no `get`); the embed\nkey now resolves env > secrets.json > None. 688 tests green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge feat/secret-store-43: local 0600 named-secret store (#43) (v0.4…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T10:49:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "898e987ab3a53bbf79487041072132ea91323689",
          "body": "…mbed (#43)\n\nAdds a structured 0600 secrets.json mapping name -> secret, alongside the\nsingle-key credentials file (untouched), so the embed-backend key and future\nMCP/cluster tokens stop leaking into ~/.bashrc or plaintext config.json.\n\nauth.py (secret I/O stays in the credential module): save_secr\n[…]\ner-leak, no `get`) and test_login.py (first login/getpass coverage),\ntest_embed store-key-reaches-SDK. 688 green (667 + 21). README documented.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(auth): local 0600 named-secret store + venice secret / login --e…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T10:49:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1b875f4238375e5a422cd0b38d200a6c7e3c5db",
          "body": "…#33) (v0.48.0)\n\nvenice chat --shell adds a confirm-gated shell tool sharing venice code's exec rail\n(commands/_exec.py), scoped by a single top-level `shell` allow/deny config policy\nthat both surfaces honor. simple-command+glob matching, loud-unrestricted guard for\n--yes, never exposed over mcp-serve. 667 tests green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge feat/shell-tool-33: gated shell/exec tool + shared exec rails (…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T00:17:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "11b3a8b7e4a4d97c05953d1e6ea949ba31a9852e",
          "body": "…policy (#33)\n\n`venice chat --shell` (alias --exec, default OFF) adds a gated `shell` tool so the\nagent can run gh/git/curl/build/test — the same /bin/sh -c rail `venice code`'s\n`run` uses (cwd-forced, timeout, size-capped output, VENICE_API_KEY scrubbed from\nthe child). paid=True routes it through \n[…]\nuard, so autonomous runs stay non-breaking. Not exposed over\nmcp-serve by construction. README + _code docstring updated. 667 tests (632 + 35).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(chat): gated shell/exec tool + shared exec rails and allow/deny …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-22T00:17:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9e4f6b1e4a84f4f61110659475aa911997c2101",
          "body": "…) (v0.47.0)",
          "is_bot": false,
          "headline": "Merge feat/persona-68: /persona local file-backed system prompts (#68…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T22:49:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61523bcf9f4e3eaa286091556e3b1df712661d26",
          "body": "…chat.persona (#68)\n\nAdd a local persona store for `venice chat`: plaintext/markdown files under\n~/.config/venice/personas/ that become the session system prompt -- the\nfile-backed sibling of inline /system, complementary to Venice --character slugs.\n\n- /persona (no arg) lists personas (name + first\n[…]\n/test_persona.py (list/load/traversal/symlink-escape) plus REPL,\nchat startup, and config-default coverage. 632 green, lint clean. Bump 0.47.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(chat): /persona file-backed system prompts + --persona/defaults.…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T22:49:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f13b9c9cf6a7801f775a3381c2bd8c6a69a22b98",
          "body": "… + dry-run preview (#67) (v0.46.0)",
          "is_bot": false,
          "headline": "Merge feat/apply-patch-atomicity-67: apply_patch cross-file atomicity…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T20:14:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab51378e2fa78af8ce1a67ad5fdc44cc3c8b7276",
          "body": "Make apply_patch all-or-nothing across files, and add an opt-in preview.\n\n- Cross-file atomicity: split _atomic_write into _stage_write (tmp + fsync,\n  returns the temp path) + an os.replace commit. apply_patch now stages every\n  file's new text first and only commits (os.replace) once all stages\n  \n[…]\nthe\ndry-run preview, dry-run validation errors, and cross-file write-failure\natomicity (both files unchanged, no temp litter). 607 tests green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(code): apply_patch cross-file atomicity + dry-run preview (#67)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T20:11:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6193caaf3af342a8497102d80b6f678161c661b8",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/multiline-repl-65: multi-line REPL input (#65) (v0.45.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T19:04:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b43e826c4171247592f079df96b0ad133e45c15c",
          "body": "The chat/code REPL read one input() line per turn, so a pasted multi-line\nprompt was submitted at the first Enter and everything after the first\nnewline was lost. Add two composition commands to the shared _repl.run()\nloop (covers both venice chat and venice code):\n\n- /paste ... /end   block mode; a\n[…]\nenai/chat refs _do_turn needs) so a composed multi-line string submits as\na normal turn. No CLI flags or config surface. Bump 0.44.0 -> 0.45.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): multi-line input via /paste and /edit (#65)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T18:49:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ff6897ce218961a304bb3057ea3cb5ef1fe3d70",
          "body": "…renders (#62) (v0.44.0)",
          "is_bot": false,
          "headline": "Merge feat/async-jobs-62: async job status/result tools + background …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T18:02:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bce1edd1e916f8be04be439f49089c353b648894",
          "body": "… (#62)\n\nClose the last open sub of epic #59 (kimi-k3 agent-toolset). The agent\nmedia tools (venice_sfx/venice_music/venice_video) blocked with a capped\nwait; there was no way to kick off a long render and keep working.\n\n- background=true opt-in on venice_sfx/music/video: still gate + queue\n  (charg\n[…]\nvenice code's free set; mcp-serve exposure deferred (vision precedent).\n\n593 tests green (make test + make lint). Agent-only; stateless handle.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): async job status/result tools + background media renders…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T18:02:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be38ccc596499c6da5c373c76e28a02b953812ef",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge feat/vision-60: venice_vision image-understanding tool (v0.43.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T17:19:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f1bdaab639c2bfe407bfefeb2c3882c76258a72",
          "body": "The agent could generate images but never see them (kimi-k3's #1 gap in\nepic #59): no way to verify watermarks, character consistency across\nstages, or glitches without a human. venice_vision closes that: a free\nin-process tool that sends a local image (base64 data: URL) or an\nimage_url through a mu\n[…]\nposed in mcp-serve (precedent: models/model_details aren't either).\n\nTests: 576 green (TestVisionTool x10, TestSupportsCapability, count bumps).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): venice_vision image-understanding tool (#60)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T17:17:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f8dc424931e0ebcb8f34b4f3bea3c2593ef07e1",
          "body": "Closes #66",
          "is_bot": false,
          "headline": "Merge feat/session-spend-cap-66: session spend cap + /cost (v0.42.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T16:40:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "662f59d64e56b435af3b35e089d3d36ba19969e7",
          "body": null,
          "is_bot": false,
          "headline": "feat(agent): session spend cap for chat/code completions + /cost (#66)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T16:40:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1ac2e4816a28845482aa44b89312f1ea6060128",
          "body": "Closes #63",
          "is_bot": false,
          "headline": "Merge feat/apply-patch-63: apply_patch multi-edit tool (v0.41.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T15:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5109c7190df65397baf7bf3644d94b17b203ad7b",
          "body": null,
          "is_bot": false,
          "headline": "feat(code): apply_patch multi-edit tool for venice code (#63)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T15:14:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd6299a1c3384680f28c9a6f1c2b494e4b2651ce",
          "body": "…ons (v0.40.0)\n\nCloses #48",
          "is_bot": false,
          "headline": "Merge feat/compaction-48: context compaction for long chat/code sessi…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T12:09:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0a1f19494948f17a9b62c8c15a215ea138697f5",
          "body": null,
          "is_bot": false,
          "headline": "feat(agent): context compaction for long chat/code sessions (#48)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T12:09:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1133f73d0072f11a69593536e2ea47713823f51",
          "body": "… + TTS voices (v0.39.0)\n\nCloses #61 (safe_mode/hide_watermark on venice_image schema).\nCloses #64 (voices in venice_model_details).",
          "is_bot": false,
          "headline": "Merge feat/agent-image-safety-and-voices: per-call image safety flags…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T10:45:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b746b0bf2ecc719583d152b61c4c79ce2fdb7fc",
          "body": "…s (#61, #64)\n\n#61: expose safe_mode/hide_watermark on the venice_image tool schema so an\nagent can toggle them per generation (parity with venice_image_edit's\nno_safe_mode). image_tool already accepts both and _clean() passes them\nthrough; #58's config layer still applies underneath, with an explic\n[…]\n to 0.39.0. New tests: image-schema shape (test_chat), per-call\noverride precedence (test_agent), TTS voices + non-voice null (test_mcp_tools).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): per-call image safety flags + TTS voices in model_detail…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T10:43:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "596a974f2c672d6cb57b5b7e56a549a024542778",
          "body": "…nts (v0.38.0)",
          "is_bot": false,
          "headline": "Merge feat/model-details-constraints: model_details surfaces constrai…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:43:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d11bcacb339798bd7b4fe1737be1c80c4121e92",
          "body": "…ec (#59)\n\nkimi-k3 field feedback: venice_model_details returned capabilities/prompt_\ncharacter_limit as always-null for image models. Root cause (confirmed vs the\nopenapi model_spec schema):\n- promptCharacterLimit is nested at model_spec.constraints.promptCharacterLimit,\n  not top-level -> the cura\n[…]\nconstraints + nested prompt limit +\nfull spec), text (capabilities + context), top-level fallback. 500 tests green.\nREADME + version -> 0.38.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): venice_model_details surfaces constraints + full model_sp…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:43:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5c2e386acf500fe76df5c1e475527be1e09f6896",
          "body": "…7.0)",
          "is_bot": false,
          "headline": "Merge feat/agent-model-details: venice_model_details agent tool (v0.3…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:28:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eee296dc39ff3da13e73c00cb79201da54124179",
          "body": "…abilities)\n\nCompanion to venice_models: a free read-only tool with a single `model` arg that\nreturns one model's pricing (cost), input context/prompt-length limits (the input\nbudget), and capabilities -- so the agent can budget its input and confirm a model\nfits before using it, instead of guessing\n[…]\nnce\n+ test_chat count pins 9->10 / 10->11. Verified LLM-facing schema is one required\n`model` arg. 498 tests green. README + version -> 0.37.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add venice_model_details tool (cost, context limits, cap…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:28:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a36fc8a639549014840d148358d6eeb8da8ae82",
          "body": "…ls (v0.36.0)",
          "is_bot": false,
          "headline": "Merge feat/agent-config-defaults: #58 config defaults reach agent too…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:24:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42d267fa26d64b699b49177678c947a35fa32a19",
          "body": "Config defaults were resolved only in the CLI argparse path (apply_defaults), so\n`venice code`/`venice chat --tools` ignored e.g. defaults.image.{safe_mode,\nhide_watermark} when the model called venice_image. Fix: builtin_tools gains a\n`config` doc param and layers per-tool config defaults UNDER the\n[…]\nlSection in test_agent.py (inject, model-wins, no-config\nno-op, allow-list+signature filter, string coercion). 496 tests green. Version 0.36.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(agent): apply defaults.<cmd>.* config to in-process tools (#58)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:24:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "66419bf5789bf587037b2810de0eaf2dabad9899",
          "body": "…35.0)",
          "is_bot": false,
          "headline": "Merge feat/agent-models-tool: read-only venice_models agent tool (v0.…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:12:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08f718301298ee1577cfca3b6da79abd07875e26",
          "body": "The agent had no way to discover valid model ids, so it had to guess the `model`\nfor venice_image/tts/etc. Add a free `venice_models` tool with a single `type`\narg (text/code/image/video/music/tts/embedding/upscale, or 'all') that wraps the\nfree /models catalog GET (_models.catalog) and returns the \n[…]\nerified\nthe LLM-facing schema is exactly one required arg `type`; base-install imports\nstay clean. 491 tests green. README + version -> 0.35.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): add read-only venice_models tool for chat --tools + code",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T09:12:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "982d07275151f7512146535b298c719ba232c9d0",
          "body": "…able (v0.34.0)",
          "is_bot": false,
          "headline": "Merge feat/config-parity-safe-mode: #57 Class B safe_mode config-back…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T00:22:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "483da9b6d7758208b919f39fa07be0a6293c7a68",
          "body": "…lass B)\n\nFirst #57 Class B slice. `--no-safe-mode` was a store_false with default True,\nso config could never reach it (apply_defaults fills only None dests). Tri-state\nit via argparse.BooleanOptionalAction (--safe-mode/--no-safe-mode, default None),\nadd the _COMMAND_MAP[\"image\"] row, and normalize\n[…]\n_image.py (tri-state parse, None->True body,\nconfig disables, explicit CLI wins, string coercion). 486 tests green. README +\nversion -> 0.34.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(image): make safe_mode config-backable via defaults.image (#57 C…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T00:22:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9ff5201a42f0f59045c71bc5216b226741f95a4",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/config-parity-class-a: #57 Class A config parity (v0.33.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T00:08:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4f91d2a68ee3d4ba73e9e926687ac31c562b7e9",
          "body": "Advance the \"config is config\" principle: make every persistent-preference\nflag whose argparse default is already None config-backable by adding rows to\nuserconfig._COMMAND_MAP -- a pure additive change, no argparse behavior change.\n\nNewly config-backable:\n- defaults.image.{width,height,aspect_ratio\n[…]\nser and asserts config\nfills None dests + explicit CLI wins + scalar->list coercion. README documents\nthe per-command knobs. Version -> 0.33.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(config): config-back Class A preference flags via defaults.* (#57)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-21T00:08:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55c64dcfd99876650f685bc5ff99f115ae6c00e0",
          "body": "…2.0)",
          "is_bot": false,
          "headline": "Merge feat/watermark-config: #56 config-backable hide_watermark (v0.3…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T23:40:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "385e50879cccf2533c65a21b06ed0a08619c4f03",
          "body": "…#56)\n\nDisable the Venice watermark by default without passing --hide-watermark every\ntime. `image._run` already runs through `apply_defaults(\"image\")`, but there was\nno `image` section in `_COMMAND_MAP` and `--hide-watermark` was a `store_true`\n(default False) that `apply_defaults` (fills only None\n[…]\nefault overrode a sidecar's hide_watermark on --from-json replay.\n\nNon-breaking. +5 tests (473->478). README + `--hide-watermark` help updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(image): make hide_watermark config-backable via defaults.image (…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T23:40:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "163b59645bbc718ec28758f24a064955d49b6840",
          "body": "…ive progress + mid-run auto-accept (v0.31.0)",
          "is_bot": false,
          "headline": "Merge feat/agent-ergonomics: #53/#54/#55 run-to-completion budget + l…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T23:21:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e647f9404af35bc79fbe5fb2ded5d9061511be6d",
          "body": "…cept (#53, #54, #55)\n\nErgonomics for long `venice code`/`venice chat --tools` runs, from field feedback.\n\n#53 — `--max-tool-calls 0` (or any <=0) now means UNLIMITED: run_loop runs until\nthe model stops on its own (bounded in practice by context), instead of forcing a\nfinal answer and making the us\n[…]\nng); no new dep. +21 tests (452->473), incl. a new\ntests/test_agent.py covering budget/gate/progress. README + `--max-tool-calls`\nhelp updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(agent): run-to-completion budget, live progress, mid-run auto-ac…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T23:21:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8973c092b3a5d1d14dd720d865634bd4d4b79793",
          "body": "…on (v0.30.0)",
          "is_bot": false,
          "headline": "Merge feat/repl-completion: #39/#40 REPL model listing + tab-completi…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T22:35:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b1d403601bf85c5015958f5e9a089b4a7d25b90",
          "body": "#39: `/models` lists the text catalog (marking the current model with `*` and\nthe default-trait model with `(default)`); bare `/model` now prints the current\nmodel AND the list instead of only the current one. Reuses the already-fetched\n`models` catalog and `_models.default_model` — no extra GET.\n\n#\n[…]\n`venice chat -i` and `venice code -i`) get this for free via the\nshared `_repl.run`. Stdlib-only, no new dependency. Adds 10 tests (452 total).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(repl): list models + tab-completion in chat/code REPL (#39, #40)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T22:35:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fabc1a1a8219f8cd9645ebb9c0bb629d3cf8b61",
          "body": "… (v0.29.0)",
          "is_bot": false,
          "headline": "Merge feat/code-video-asset: #46 venice_video in venice code --assets…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T22:09:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a9cff2fd50027a8653f50da3c3becc2acc952c7",
          "body": "Folds the async video generator into the `venice code --assets` set,\ncompleting the deferred piece from #45. `_mcp.video_tool` already existed\nand matches the `_make_paid` calling convention, so this is pure wiring:\n\n- _agent.py: curated `_VIDEO_SCHEMA` (text-to-video subset: prompt, model,\n  durati\n[…]\nat 8/9, mcp-serve 9)\n  untouched. 442 tests green; lint clean.\n\nImplemented by dogfooding `venice code --auto`; reviewed and finalized by hand.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(code): add venice_video to venice code --assets (#46)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T22:09:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df05c4c793715bef720ea78d4c45413cdb764ff7",
          "body": "…ls (v0.28.0)",
          "is_bot": false,
          "headline": "Merge feat/code-assets: #45 venice code --assets asset-generation too…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T20:34:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42f22d0504d386fecf72d32be473ab3437370288",
          "body": "…de (#45)\n\n`venice code` could edit/run files but not generate assets; the only\nworkaround was shelling `run(\"venice image -o …\")` — one subprocess per\nasset, undiscoverable to the model. Add an opt-in `--assets` flag that\nfolds the 7 still-image/audio generators into the coding agent's toolset\nso o\n[…]\ne_command, test_chat;\ntest_chat (8) and test_mcp_serve (9) unchanged. README documents the\ntool set, `--assets`, and the `--auto` spend caveat.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(code): --assets flag folds asset-generation tools into venice co…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T20:34:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "debddf64008573df9e78fe2df6448b502f5aa83a",
          "body": null,
          "is_bot": false,
          "headline": "Merge chore/publish-artifact-actions: #38 artifact actions off Node 20",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T19:18:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51242bf8c5c325be95e2533a35c70649d3b01730",
          "body": "#32 bumped these only to @v5, which still declares Node 20, so every\npublish run kept emitting the Node-20 deprecation annotation (upload-\nartifact@v5 forced to Node 24). Bump to current majors, both of which\ndefault to the Node 24 runtime:\n\n  actions/upload-artifact   @v5 -> @v7\n  actions/download-\n[…]\n-only, no version bump. publish.yml never runs on PR, so the real proof\n(annotation gone) is a manual workflow_dispatch -> TestPyPI after push.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(ci): bump publish.yml artifact actions off Node 20 (#38)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T19:18:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7fb33e399542d2e8cd5e195fc7daa7ac90a8b7e",
          "body": "… (v0.27.0)",
          "is_bot": false,
          "headline": "Merge feat/index-search-tls: #42 index/search TLS escape-hatch parity…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T19:17:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c205955d4e8d895b06b154b7cdedd6d589652f18",
          "body": "Thread the #28 embed TLS overrides through `venice index` and\n`venice search`: --embed-ca-bundle PATH / $VENICE_EMBED_CA_BUNDLE /\ndefaults.{index,search}.embed_ca_bundle, plus --embed-insecure. Both\nresolvers in _index.py (build via _resolve_backend, search via\n_backend_from_meta) now pass verify= i\n[…]\npath only, so a\nglobally-set env var never breaks searching a Venice index.\n\nBump to v0.27.0. 428 tests (was 410); README documents the parity.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(index,search): TLS escape hatch parity with embed (#42)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T19:17:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1fc75e8a1c34c9c5d5b9f965ad50c1280ba78c4",
          "body": null,
          "is_bot": false,
          "headline": "Merge release/v0.26.0: #28 embed TLS escape hatch (v0.26.0)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:48:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "084b37b455c115890608afa5d2fd3f5b3da1abd1",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v0.26.0 (#28 embed TLS escape hatch)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:48:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d2ff596f4bdf8e9248ecac9697fe0b013fb51764",
          "body": "…f-signed alt backends",
          "is_bot": false,
          "headline": "Merge feat/embed-tls-escape-hatch: #28 embed TLS escape hatch for sel…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d09b69b63da515d124ddcf43a7b4a1f71f6a4a72",
          "body": "`venice embed --embed-base-url` targets any OpenAI-compatible endpoint, but\nthe openai SDK verifies TLS via httpx and offered no way to trust a private\nCA or skip verification, so local embedders behind a self-signed cert\n(Traefik/Caddy default) failed with `connection error` (exit 8).\n\nAdd two opt-\n[…]\n build_openai verify seam (CA path / insecure / none) and embed's\nalt-path TLS resolution, env/config precedence, gating, and mutual exclusion.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(embed): TLS escape hatch for self-signed alt backends (#28)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:34:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3d19db807aba9d896a83e1d5c53b9cec133cceb9",
          "body": "… exit 10 (v0.25.1)",
          "is_bot": false,
          "headline": "Merge feat/code-acceptance-verdict: #37 tolerant acceptance verdict +…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab078f1e8e213c470953023791e5d70d1f2b31cc",
          "body": "`venice code` decided its exit code by a strict `\"ACCEPTANCE: PASS\" in\nreport.upper()` substring match. A model that did correct, complete work but\nphrased its verdict differently (e.g. \"All acceptance criteria are met.\")\nscored as failure and the command exited 1 on flawless work — a false failure\n\n[…]\nting explicit-sentinel behavior is unchanged (PASS -> 0, FAIL -> 1).\nAdds 4 tests (loose parse, re-prompt recovery, persist->10, json unknown).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(code): tolerant acceptance-verdict parse + re-prompt + exit 10 (#37)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T18:04:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc92fc134353812f2f8a9c4483d5f7bf98f859ad",
          "body": "ci: bump GitHub Actions off deprecated Node 20 (#32)",
          "is_bot": false,
          "headline": "Merge feat/ci-node20: bump Actions off deprecated Node 20 (#32)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T17:29:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0f3065d6372f280bd88fd531efb4b91cca19267",
          "body": "checkout@v4->v5, setup-python@v5->v6, upload-artifact@v4->v5,\ndownload-artifact@v4->v5 across test.yml and publish.yml; the Docker\npypa/gh-action-pypi-publish action is unaffected and left as-is.\n\nProduced by a supervised `venice code` drive on the kimi-k3 model; diff\nreviewed (all 9 pins bumped, no old pins remain, matching artifact majors).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: bump GitHub Actions off deprecated Node 20 (#32)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T17:27:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1bdf3c89ea386748d11b9e87a3fa1cdd9e2907d4",
          "body": "The \"## MCP server\" section still claimed `venice image-edit` and the video\ntools were not exposed over MCP; #35 (v0.25.0) added `venice_video` and\n`venice_image_edit`. This fixes the paragraph to match the 9-tool table above.\n\nProduced by a supervised `venice code` drive on the kimi-k3 model, reviewed\nbefore commit. Docs-only; no version bump.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct stale MCP-exposure note in README",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T17:21:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e7f642c26181c1da3bc9342a75375c9452e1feee",
          "body": "…ols (#35)",
          "is_bot": false,
          "headline": "Merge feat/video-mcp: v0.25.0 venice_video + venice_image_edit MCP to…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T16:29:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "316a540a0540e24054caea5e074fa70cea7efcd4",
          "body": "`venice mcp-serve` now exposes 9 tools (was 7): the two deferred commands\n`venice video` and `venice image-edit` join as `venice_video` /\n`venice_image_edit`.\n\n- video.py: extract a print-free `retrieve_bytes` (the `_audio.retrieve_bytes`\n  analog) — the bare `poll_retrieve` plus the VPS `download_u\n[…]\n path,\n  VPS download_url, spend gate blocks before queue, multi-edit layers,\n  stdout-empty guard). README mcp-serve table updated to 9 tools.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.25.0: expose `venice video` + `image-edit` over MCP (#35)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T16:29:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c4fea7901438b7af7d09c737eb833c3b6927114",
          "body": "…to _shared (#34)",
          "is_bot": false,
          "headline": "Merge feat/shared-image-rails: v0.24.1 DRY image base64+size rails in…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T16:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7013eeb1f38f1376d803e786a6de80f7bea29d4f",
          "body": "The upscale/bg-remove/image-edit commands each carried a byte-identical copy\nof the raw base64-encode + exists/empty/size gate. Lift both into `_shared`:\n\n- `encode_base64(path)` — raw base64 (no `data:` prefix), the form these three\n  send in an `image`/`images` field (distinct from `encode_data_ur\n[…]\nge renders \"< 25 MB\" for the default cap). New tests/test_shared.py\ncovers both helpers directly; the three command test suites pass untouched.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.24.1: DRY image base64 + size-check rails into `_shared` (#34)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T16:18:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f69ecb8611302b7d078f27987ee66268a2ea3737",
          "body": "…reference inputs (#18)",
          "is_bot": false,
          "headline": "Merge feat/video-media-inputs: v0.24.0 venice video image-to-video & …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T14:07:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97271054ab708204301231fdb5f94cfe688dd7b9",
          "body": "Extends the text-to-video command (shipped v0.12) with the media-conditioned\n`/video/queue` (`QueueVideoRequest`) modes deferred from the first cut:\n\n- Single-value inputs: --image (start frame), --end-image (transition),\n  --video (video-to-video/upscale), --audio (background music).\n- Repeatable a\n[…]\nration -> quote only.\n\nNo MCP surface (there is no venice_video MCP tool yet). README documents the\nnew inputs; 8 new tests (suite 373 -> 381).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.24.0: `venice video` image-to-video & reference inputs (#18)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T14:07:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc9576bbd92f40a794004359d872eb272bdcfd4f",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/image-edit: v0.23.0 venice image-edit (#11)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T11:35:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8c7823ac67f8578d23307a83d1757e6053a501b",
          "body": "…age/multi-edit (#11)\n\nAdd a `venice image-edit` subcommand so generated card art can be iterated on\nwithout regenerating. A base image + `--prompt` goes to `/image/edit`; adding\none or two `--layer` images (masks/overlays) routes to `/image/multi-edit`\n(base first, up to 3 images total). Mirrors th\n[…]\n.py.\n- New tests/test_image_edit.py (19 cases); full suite 354 -> 373, lint clean.\n- README: new \"Edit images\" section; version bump to 0.23.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.23.0: `venice image-edit` — edit/inpaint art via /image/edit + /im…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T11:35:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64a31b52fc892f9287e1d1b3c43a09b58a42118a",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/vcoder-code: v0.22.0 venice code coding agent (#29, #30)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T09:11:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ee283ea880ac512c8305ae124e158e94c4ccd6d",
          "body": "…run harness\n\nCompletes the vcoder epic (#25): a self-contained coding agent built on the #15\ntool loop. `venice code` proposes a plan, waits for acceptance, then reads/edits\nfiles and runs commands using built-in, path-sandboxed tools.\n\n- New `commands/_code.py`: print-free, mcp-free, stdlib-only c\n[…]\n tools stay out of `venice chat --tools` (still 8) and `mcp-serve` (still\n7) — built-in, not MCP, per the epic decision.\n\nCloses #29\nCloses #30\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.22.0: `venice code` coding agent — built-in toolset + plan/accept/…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-20T09:11:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4286d946732c3b631df140f51f66517541e8362a",
          "body": "CI failed on Python 3.9 and 3.10 (passed 3.11-3.13). The `--mcp` wiring\ntests mocked `_mcp_client.attach` but not the `_mcp.import_mcp` probe, so:\n- on 3.9 the `[mcp]` extra resolves to nothing -> `import_mcp` returns None\n  -> `_tools_session` exited 2 before reaching the fake attach (5 test_chat\n \n[…]\ns.\n\nTest-only; no behavior change. 321 tests green locally; verified the wiring\ntests pass with the real `mcp` module blocked (simulating 3.9).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix #21 MCP wiring tests to be SDK-independent (green CI on 3.9/3.10)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T23:02:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3393f286f63f252b0364382742b4a106930c2866",
          "body": "…(#21)",
          "is_bot": false,
          "headline": "Merge feat/mcp-client: v0.21.0 venice chat --mcp external MCP client …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T22:37:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e254cdd5248691ccb57dcc2841829edaae7c836a",
          "body": "Adds an MCP *client* so `venice chat --mcp NAME` attaches third-party MCP\nservers (filesystem, git, shell, ...) as an additional tool provider behind\nthe existing #15 agent loop -- the loop is unchanged; MCP tools are just more\n`_agent.Tool`s concatenated with the built-ins. Last vcoder-substrate pi\n[…]\nsubprocess (round-trip + teardown), and\n  chat/REPL wiring tests patching the attach seam. 296 -> 321 tests.\n- README + version bump to 0.21.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.21.0: `venice chat --mcp` external MCP client (#21)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T22:37:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97eacf724a2f83f4d31c970c57677766fb1ac35c",
          "body": "…earch (#24)\n\n`venice index` / `venice search` + the `project_search` agent tool: chunk a\nproject tree, embed via Venice or a local backend (#23), store base64 float32\nvectors in a project-local .venice/index/, and cosine-rank queries. Incremental\n(sha256-keyed), zero new deps, stdout-clean engine. Closes #24.",
          "is_bot": false,
          "headline": "Merge feat/semantic-search: v0.20.0 venice project semantic index + s…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T12:16:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3955ffdc5fb015d265efa51968e0ba21248085b6",
          "body": "Adds semantic search over a project tree: `venice index` chunks text files,\nembeds them (Venice or a local/pluggable backend, #23), and persists vectors\nto a project-local on-disk store; `venice search` embeds a query with the\nindex's own model and cosine-ranks the chunks. Also exposed to the chat a\n[…]\nlure, discovery walk-up, CLI text/JSON, agent tool). test_chat built-in count\n7 -> 8. 295 tests green; base import graph stays openai/mcp-free.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.20.0: `venice index` / `venice search` project semantic search (#24)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T12:16:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05d7d816b320d05b0a1770e729f409915831e5b5",
          "body": "…ing backend (#23)",
          "is_bot": false,
          "headline": "Merge feat/embed-backend: v0.19.0 venice embed pluggable/local embedd…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T00:50:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "655efeb5a089744dc2e037283f3e5636ac44ce5c",
          "body": "Let `venice embed` target any OpenAI-compatible embeddings endpoint --\nincluding a local one (llama.cpp / Ollama / text-embeddings-inference) --\nvia `--embed-base-url URL` + `--embed-model NAME`. When set, the alternate\npath skips Venice auth and the `/models` catalog GET entirely (the local\nserver \n[…]\nmodel required,\n  env + config precedence; build_openai override cases.\n\nUnblocks #24 (project semantic index) at tree scale. Part of epic #25.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.19.0: `venice embed` pluggable/local embedding backend (#23)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-19T00:50:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b1548259d1d622f0ea561e5467c3bf1750a49d89",
          "body": "…nversation state (#22)\n\nInteractive multi-turn `venice chat` REPL with in-memory conversation state, slash-commands, and resumable transcripts. Closes #22.",
          "is_bot": false,
          "headline": "Merge claude/memory-github-review: v0.18.0 chat interactive REPL + co…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T20:24:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "899a1bf7bbdf3279ebdbc60d8167c0e1a97295c2",
          "body": "…te (#22)\n\nTurn the one-shot `venice chat` into an interactive REPL that holds the\nconversation in memory across turns, composing with the v0.17.0 agent loop.\n\n- New `commands/_repl.py`: the loop + state layer. Seeds history from\n  `--resume`/`--system`, runs one turn per line (streamed by default; \n[…]\ners-REPL behavior.\n- README: document interactive mode; bump to 0.18.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Jc16njCvXmetoj8gf4ndRS",
          "is_bot": false,
          "headline": "v0.18.0: `venice chat` interactive multi-turn REPL + conversation sta…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:05:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "930c63450d7d7aa4d49e6af6d7c389d72052ffa7",
          "body": "…(#15)",
          "is_bot": false,
          "headline": "Merge feat/chat-agent-loop: v0.17.0 chat function-calling agent loop …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T18:26:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bd7ff6280f428c8e66c9fa3f97f4e2716d1e4a5",
          "body": "Add `venice chat --tools` (alias --agent): an in-process function-calling\nloop where the model can invoke venice's own endpoints as tools, powered by\nthe [openai] extra alone -- no mcp SDK, no subprocess. Foundation of the\nvcoder epic (#25).\n\nNew commands/_agent.py: a Tool registry (builtin_tools) b\n[…]\n spend gate x3,\ntool error surfaced, OpenAIError fatal, unknown-tool subset, tools-off\nregression). README: new \"Agent / tool calling\" section.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.17.0: chat function-calling agent loop (#15)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T18:26:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f3c72040faf0c53dad95da5c2273a30ac481132d",
          "body": "…ag loader (#13, #17)",
          "is_bot": false,
          "headline": "Merge feat/config: v0.16.0 venice config -- MCP registry + default-fl…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T17:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee57f5215e3b418a01076cfd221731ed5560810e",
          "body": "…#17)\n\nAdd a `venice config` subcommand backed by a new non-secret config file\n`~/.config/venice/config.json` (mode 0600), closing two issues in one branch:\n\n- #13: an MCP server registry (`config add/list/remove/show`) modeled on\n  `claude mcp add` -- stdio (command/args/env) and http/sse (url/head\n[…]\nic\n  against the real config file; +chat/music config-default cases. 228 pass.\n- README: new Config section, command-table rows, security note.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.16.0: `venice config` -- MCP registry + default-flag loader (#13, …",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T16:47:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9b124b78cf5f3474e09a72b8c2a04e02fa01369b",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/mcp-serve: v0.15.0 MCP server (venice mcp-serve) (#14)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T12:12:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3dc9978b80e04c2048043e757bb3789ee7d5507",
          "body": "Direction A of the MCP epic (#16): venice as the MCP *callee*. `venice mcp-serve`\nspeaks MCP over stdio and exposes seven tools -- venice_image, venice_tts,\nvenice_sfx, venice_music, venice_upscale, venice_bg_remove, venice_chat -- that a\nhost (Claude Code, or the future #15 host) calls instead of s\n[…]\ngate over/under cap, retrieve_bytes parity, missing-extra rc, build_server wiring).\nVerified end-to-end with a real MCP stdio client handshake.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.15.0: `venice mcp-serve` -- MCP server exposing venice tools (#14)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-18T12:12:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6520607274524af392e87aff719a5f55bbdef9f0",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/packaging: v0.14.0 packaging + PyPI (#12)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T13:32:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09fbb845572aceab4c9af04f4391235928b636de",
          "body": "Make venice pip-installable as `venice-cli` and add a release workflow.\nPrepare-only: nothing is tagged or uploaded here.\n\n- pyproject.toml: hatchling, PEP 621, dist name `venice-cli` (import package\n  stays `venice`), version single-sourced from venice.__version__,\n  [project.scripts] venice = \"ven\n[…]\nextra prints the hint and exits 2; with the extra the failure mode\nshifts to \"no API key\". 175 tests + lint green. No live API calls.\n\nRefs #12\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.14.0: packaging + PyPI publish workflow (#12)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T13:32:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09bcbff577bfc5360918c4f7a11b35471706bff8",
          "body": null,
          "is_bot": false,
          "headline": "Merge chore/oss-prep: MIT license, CI, and public-ready docs",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T12:22:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c48ce1d06170f8ca080705af4398a1da4e4c2fe4",
          "body": "Groundwork before going public on GitHub and doing #12 (PyPI). PyPI's\nTrusted Publishing (OIDC) only supports GitHub/GitLab.com/GCP/ActiveState\n-- self-managed forges are excluded -- so publishing from Gitea would mean\na long-lived PyPI token in CI. Moving to GitHub keeps that credential from\never e\n[…]\nk-fantasy`, which describes what it\n  does. History keeps the codename.\n- CLAUDE.md: soften pod-specific framing; the convention itself stands.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Prepare repo for public release (MIT, CI, docs)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T12:22:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "416cce6e68ffa6bc05e17fd4f3bb9aaa4cc06b89",
          "body": null,
          "is_bot": false,
          "headline": "Merge feat/openai-dry: v0.13.1 DRY the openai SDK plumbing (#19)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T11:29:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d104eb1195c2419f79d8523ec02d67ea81fb9fec",
          "body": "chat (#8) and embed (#9) each landed their own copy of the same openai\nplumbing. Extract it into two shared modules, split along the real seam:\n\n- commands/_openai.py -- strictly SDK: the lazy import probe, client\n  construction, and the exception -> exit-code ladder. Used by chat and\n  embed (and #\n[…]\n out not to pin the model-resolution\nmessages at all.\n\nAlso drops a dead `config` import in chat.py and now-unused typing\nimports in all three.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13.1: DRY the openai SDK plumbing (#19)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-17T11:29:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2910fd2a6515cabf7546699741208e88043b1bd",
          "body": "…AI SDK (#9)",
          "is_bot": false,
          "headline": "Merge feat/venice-embed: v0.13 `venice embed` -- /embeddings via Open…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T17:27:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8ef14470c109899b2c3607ccf27c310b2da6fa0",
          "body": "Replace the embed stub with a real command backed by Venice's\nOpenAI-compatible /embeddings endpoint (openai SDK, lazy-imported).\nSingle text, stdin, or --from-file batch; default model resolved via\nthe free /models?type=embedding catalog GET (mirrors `venice chat`).\nOutput is newline-delimited JSON vectors, or the full response with\n--json; --dimensions/--encoding-format pass through when set.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.13: `venice embed` -- /embeddings via OpenAI SDK (#9)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T17:27:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "369aec807faa962eb2c561c68da574b0e76f0d76",
          "body": "…eo (#10)",
          "is_bot": false,
          "headline": "Merge feat/venice-video: v0.12 `venice video` async-queue text-to-vid…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T12:17:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f03f38167e28035e0aefc5875bb95a6222898ca3",
          "body": "New `venice video` / `venice video-status` on the /video quote->queue->\nretrieve->complete flow. Generalizes the audio queue engine into a shared\n`_queue.py` (build_client, status_to_exit, progress_tick, resolve_output_path,\next_for); `_audio.py`, `sfx`, and `music` now sit on it.\n\nHandles video's t\n[…]\nhandling,\nand `get_url_bytes` for the presigned download. Text-to-video only; image-to-\nvideo & reference inputs deferred to a follow-up issue.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.12: `venice video` -- async-queue text-to-video (#10)",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T12:17:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a7d754060a0b3958702fff57729a13d0afddcd6",
          "body": "…AI SDK (#8)",
          "is_bot": false,
          "headline": "Merge feat/venice-chat: v0.11 `venice chat` chat completions via Open…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T11:32:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "092974f1600b3f7d3ce3aa3257b3c82ec569e009",
          "body": "…enice extensions (#8)\n\nReplace the v0.1 stub with a real one-shot chat command built on the official\nOpenAI SDK (Venice is OpenAI-compatible; lazy-imported so the rest of the CLI\nstays stdlib-only). Surfaces Venice's `venice_parameters` extensions as flags\n(--web-search/--web-citations/--web-scrapi\n[…]\nvia extra_body, streams by\ndefault, supports stdin and --json, and validates --model against\n/models?type=text (free GET) before the paid call.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.11: `venice chat` -- one-shot /chat/completions via OpenAI SDK + V…",
          "author_name": "Jeffrey Smith",
          "author_login": "gobha-me",
          "committed_at": "2026-07-16T11:32:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 35,
      "commits_last_year": 106,
      "latest_release_at": "2026-07-22T15:01:21Z",
      "latest_release_tag": "v0.50.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "venice-cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "cli",
            "embeddings",
            "llm",
            "text-to-image",
            "text-to-video",
            "tts",
            "venice",
            "venice-ai",
            "Development Status :: 4 - Beta",
            "Environment :: Console",
            "Intended Audience :: Developers",
            "Intended Audience :: End Users/Desktop",
            "Operating System :: MacOS",
            "Operating System :: POSIX",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3 :: Only",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Programming Language :: Python :: 3.9",
            "Topic :: Multimedia :: Graphics",
            "Topic :: Multimedia :: Sound/Audio",
            "Topic :: Utilities"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/venice-cli/",
          "is_deprecated": false,
          "latest_version": "0.50.1",
          "repository_url": "https://github.com/gobha-me/venice-cli",
          "versions_count": 35,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2596,
          "first_published_at": "2026-07-17T18:01:23.591807Z",
          "latest_published_at": "2026-07-22T15:02:05.211225Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "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
      },
      "open_issues_and_prs": 13
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 43082,
      "source_files_sampled": 83,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 2308
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "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": [
        "pypi"
      ],
      "dependencies": [],
      "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": 2,
        "open_issues": 13,
        "closed_ratio": 0.817,
        "closed_issues": 58,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "gobha-me",
          "commits": 115,
          "avatar_url": "https://avatars.githubusercontent.com/u/49483793?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.991
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "publish.yml",
        "test.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "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": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b692a797454dee9e2e181fffd591b3091b17eda6",
        "ran_at": "2026-07-22T15:10:04Z",
        "aggregate_score": 4.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T15:02:09Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T17:29:20Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 20,
          "created_at": "2026-07-17T13:36:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 27,
          "created_at": "2026-07-19T01:28:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 31,
          "created_at": "2026-07-20T09:38:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 41,
          "created_at": "2026-07-20T18:24:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 44,
          "created_at": "2026-07-20T18:53:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 47,
          "created_at": "2026-07-20T21:15:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 49,
          "created_at": "2026-07-20T21:15:48Z",
          "last_comment_at": "2026-07-22T12:22:21Z",
          "last_comment_author": "gobha-me"
        },
        {
          "number": 50,
          "created_at": "2026-07-20T21:15:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 51,
          "created_at": "2026-07-20T21:15:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 52,
          "created_at": "2026-07-20T21:16:09Z",
          "last_comment_at": "2026-07-22T12:46:02Z",
          "last_comment_author": "gobha-me"
        },
        {
          "number": 57,
          "created_at": "2026-07-20T23:45:36Z",
          "last_comment_at": "2026-07-21T00:23:20Z",
          "last_comment_author": "gobha-me"
        },
        {
          "number": 71,
          "created_at": "2026-07-22T11:52:28Z",
          "last_comment_at": "2026-07-22T12:22:37Z",
          "last_comment_author": "gobha-me"
        },
        {
          "number": 72,
          "created_at": "2026-07-22T12:16:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/gobha-me/venice-cli",
    "host": "github.com",
    "name": "venice-cli",
    "owner": "gobha-me"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 48,
        "vitality": 73,
        "community": 39,
        "governance": 52,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 106,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "106 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 106
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 35,
              "latest_release_tag": "v0.50.1",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "35 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 35
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 39,
        "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "venice-cli"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 2596
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,596 downloads/month across pypi",
                "points": 45.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2596,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 12,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.991
            },
            "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 99% of commits",
                "points": 0.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 13,
              "closed_issues": 58,
              "issue_closed_ratio": 0.817,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "82% of issues closed",
                "points": 38.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/2 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "gobha-me",
              "public_repos": 9,
              "account_age_days": 2660
            },
            "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": "0 followers of gobha-me",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "gobha-me"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "9 public repos, account ~7 yr old",
                "points": 19.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 9
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "venice-cli"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "35 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 35
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow 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 1",
                "points": 0.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.77,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 2308
            },
            "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "77 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 77,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.51,
              "toolchain_manifests": [],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "51 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 51,
                      "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 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 43082,
              "source_files_sampled": 83,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/83 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 83,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:venice-cli@0.50.1; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T15:10:11.213265Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/gobha-me/venice-cli.svg",
  "full_name": "gobha-me/venice-cli",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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.26.0 — metodología completa · wiki de métricas.

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