Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-26 13:50 UTC

jcode-works / jcode-ragmir

Confidential local RAG for your coding agents.

TypeScript · JavaScriptAGPL-3.0★ 6 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

jcode-works/jcode-ragmir tiene un índice de salud de 65 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (90/100) y la más baja, Sustainability & Governance (52/100). Se actualizó por última vez hace 6 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

65
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

jCode WorksOrganización
8 seguidores3 repositorios públicosdesde ene 2022jCode Works

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

Métricas por categoría

Vitalidad

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

70Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 6 días
2.8/36Cadencia de commits — 4/52 semanas con commits
18/18Volumen de commits — 173 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_year173
human_commit_share1
days_since_last_push6
active_weeks_last_year4
Cómo se puntúa
27/27Publica versiones — 41 versiones publicadas
36/36Recencia de las versiones — última versión hace 6 días
27/27Cadencia de publicación — una versión cada ~0,2 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count41
latest_release_tagv4.0.0
releases_from_tagsno
days_since_latest_release6
mean_days_between_releases0,2

Comunidad y Adopción

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

54Moderado · 18% del índice global
Cómo se puntúa
11.3/60Estrellas — 6 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars6
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 (AGPL-3.0)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
has_pull_request_template
Cómo se puntúa
55.7/80Descargas mensuales — 15.111 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@jcode.labs/ragmir-tts, @jcode.labs/ragmir-chat, @jcode.labs/ragmir
dependents
ecosystemsnpm
total_downloads
monthly_downloads15.111
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/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
33.4/38.3Aceptación de PR — 137/157 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/23 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs137
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs20
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
6.9/25Alcance del propietario — 8 seguidores de jcode-works
13.4/25Trayectoria — 3 repos públicos, cuenta de ~4 años
Datos de entrada utilizados
followers8
owner_typeOrganization
is_verified
owner_loginjcode-works
public_repos3
account_age_days1640
Cómo se puntúa
25/25Publicado y resoluble — 3 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 6 días
20/20Historial de versiones — 37 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@jcode.labs/ragmir-tts, @jcode.labs/ragmir-chat, @jcode.labs/ragmir
ecosystemsnpm
any_deprecatedno
min_days_since_publish6

Calidad de Ingeniería

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

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

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://ragmir.com
10/10Descripción del repositorio
10/10Topics — 20 topics
10/10Wiki
Datos de entrada utilizados
topicsai-agents, local-first, mcp, rag, typescript, open-source, local-rag, ragmir, developer-tools, mcp-server, cli, coding-agents, document-retrieval, model-context-protocol, nodejs, offline-first, privacy-first, project-knowledge, cited-retrieval, confidential-rag
has_wiki
homepagehttps://ragmir.com
has_readme
has_docs_dir
has_description

Seguridad

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

58Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
3/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/23 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — 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
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 12 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5
Excluidos de la puntuación (sin datos o no aplicable): packaging. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
8.5/25Dependencias indirectas libres de avisos conocidos — 2 afectados: adm-zip 0.5.18 (high 7.5), sharp 0.34.5 (high 7.3)
40/40Sin avisos pendientes — ningún aviso lleva público más de 90 días
Datos de entrada utilizados
sourceosv
advisories2
affected_packages2
assessed_packages74
unassessed_packages0
affected_by_severityhigh 2
direct_affected_packages0
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@jcode.labs/ragmir-tts@4.0.0 —lo que arrastra la instalación del paquete publicado—: 74 paquetes. No se analiza la alcanzabilidad.

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.

83Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share0,99
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes10.169
Cómo se puntúa
18/18Arranque con un solo comando — mise.toml
22/22Pruebas automatizadas
11/11Configuración de lint / formato — biome.json
11/11Verificación estática de tipos — packages/ragmir-chat/tsconfig.json, packages/ragmir-core/tsconfig.json, packages/ragmir-landing/tsconfig.json, packages/ragmir-tts/tsconfig.json, tests/public-api-consumer/tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_filesmise.toml
has_devcontainerno
has_linter_config
typecheck_configspackages/ragmir-chat/tsconfig.json, packages/ragmir-core/tsconfig.json, packages/ragmir-landing/tsconfig.json, packages/ragmir-tts/tsconfig.json, tests/public-api-consumer/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
54.8/55Tamaños de archivo manejables — 1/223 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes101.417
source_files_sampled223
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 5.0 / 10
5.0agregado

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-26 13:50 UTC

10Binary-Artifactsno binaries found in the repo
4Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/23 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
10Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities12 existing vulnerabilities detected
Dependencias directas 33
RegistroPaqueteRestricción de versiónManifiesto
npmnode-llama-cpp3.19.0packages/ragmir-chat/package.json
npm@huggingface/transformers^4.2.0packages/ragmir-core/package.json
npm@lancedb/lancedb^0.30.0packages/ragmir-core/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/ragmir-core/package.json
npmcommander^14.0.2packages/ragmir-core/package.json
npmfast-glob^3.3.3packages/ragmir-core/package.json
npmfflate^0.8.3packages/ragmir-core/package.json
npmhtml-to-text^9.0.5packages/ragmir-core/package.json
npmmammoth^1.12.0packages/ragmir-core/package.json
npmpicocolors^1.1.1packages/ragmir-core/package.json
npmread-excel-file^9.2.0packages/ragmir-core/package.json
npmsafe-regex2^5.1.1packages/ragmir-core/package.json
npmunpdf^1.4.0packages/ragmir-core/package.json
npmyaml^2.9.0packages/ragmir-core/package.json
npmzod^4.1.13packages/ragmir-core/package.json
npm@radix-ui/react-slot^1.3.0packages/ragmir-landing/package.json
npm@radix-ui/react-tabs^1.1.15packages/ragmir-landing/package.json
npm@astrojs/check^0.9.9packages/ragmir-landing/package.json
npm@astrojs/react^6.0.0packages/ragmir-landing/package.json
npm@astrojs/sitemap^3.7.3packages/ragmir-landing/package.json
npm@lucide/astro^1.23.0packages/ragmir-landing/package.json
npm@tailwindcss/vite^4.3.1packages/ragmir-landing/package.json
npmastro^7.0.2packages/ragmir-landing/package.json
npmclass-variance-authority^0.7.1packages/ragmir-landing/package.json
npmclsx^2.1.1packages/ragmir-landing/package.json
npmlucide-react^1.21.0packages/ragmir-landing/package.json
npmreact19.2.7packages/ragmir-landing/package.json
npmreact-dom19.2.7packages/ragmir-landing/package.json
npmtailwind-merge^3.6.0packages/ragmir-landing/package.json
npmtailwindcss^4.3.1packages/ragmir-landing/package.json
npmtypescript^5.9.3packages/ragmir-landing/package.json
npmvite^8.0.13packages/ragmir-landing/package.json
npm@huggingface/transformers^4.2.0packages/ragmir-tts/package.json
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

Avisos de dependencias 2

Instalar npm:@jcode.labs/ragmir-tts@4.0.0 arrastra 74 paquetes, directos y transitivos: 2 tienen avisos conocidos, de los cuales 0 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
adm-zip0.5.18indirectaalta10.6.0
sharp0.34.5indirectaalta10.35.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "local-first",
        "mcp",
        "rag",
        "typescript",
        "open-source",
        "local-rag",
        "ragmir",
        "developer-tools",
        "mcp-server",
        "cli",
        "coding-agents",
        "document-retrieval",
        "model-context-protocol",
        "nodejs",
        "offline-first",
        "privacy-first",
        "project-knowledge",
        "cited-retrieval",
        "confidential-rag"
      ],
      "is_fork": false,
      "size_kb": 3308,
      "has_wiki": true,
      "homepage": "https://ragmir.com",
      "languages": {
        "CSS": 4526,
        "Astro": 48663,
        "Shell": 5411,
        "Python": 1735,
        "JavaScript": 452355,
        "TypeScript": 1626837
      },
      "pushed_at": "2026-07-20T11:09:55Z",
      "created_at": "2026-06-28T11:15:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T09:58:49Z",
      "description": "Confidential local RAG for your coding agents.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://ragmir.com",
      "name": "jCode Works",
      "type": "Organization",
      "login": "jcode-works",
      "company": "jCode Works",
      "location": "France · Remote",
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/98565144?v=4",
      "created_at": "2022-01-28T00:41:18Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 1640
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2026-07-20T10:02:56Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2026-07-19T08:28:45Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2026-07-18T21:45:39Z"
        },
        {
          "tag": "v2.20.0",
          "kind": "minor",
          "published_at": "2026-07-18T17:56:05Z"
        },
        {
          "tag": "v2.19.4",
          "kind": "patch",
          "published_at": "2026-07-18T15:01:46Z"
        },
        {
          "tag": "v2.19.3",
          "kind": "patch",
          "published_at": "2026-07-18T14:37:32Z"
        },
        {
          "tag": "v2.19.2",
          "kind": "patch",
          "published_at": "2026-07-18T13:57:02Z"
        },
        {
          "tag": "v2.19.1",
          "kind": "patch",
          "published_at": "2026-07-18T13:21:36Z"
        },
        {
          "tag": "v2.19.0",
          "kind": "minor",
          "published_at": "2026-07-18T12:26:35Z"
        },
        {
          "tag": "v2.18.1",
          "kind": "patch",
          "published_at": "2026-07-18T09:53:57Z"
        },
        {
          "tag": "v2.18.0",
          "kind": "minor",
          "published_at": "2026-07-18T07:48:31Z"
        },
        {
          "tag": "v2.17.2",
          "kind": "patch",
          "published_at": "2026-07-16T07:27:29Z"
        },
        {
          "tag": "v2.17.1",
          "kind": "patch",
          "published_at": "2026-07-16T05:53:38Z"
        },
        {
          "tag": "v2.17.0",
          "kind": "minor",
          "published_at": "2026-07-14T17:06:01Z"
        },
        {
          "tag": "v2.16.2",
          "kind": "patch",
          "published_at": "2026-07-14T14:47:22Z"
        },
        {
          "tag": "v2.16.1",
          "kind": "patch",
          "published_at": "2026-07-14T13:13:14Z"
        },
        {
          "tag": "v2.16.0",
          "kind": "minor",
          "published_at": "2026-07-14T11:26:14Z"
        },
        {
          "tag": "v2.15.0",
          "kind": "minor",
          "published_at": "2026-07-14T09:00:27Z"
        },
        {
          "tag": "v2.14.0",
          "kind": "minor",
          "published_at": "2026-07-14T08:50:24Z"
        },
        {
          "tag": "v2.13.1",
          "kind": "patch",
          "published_at": "2026-07-13T18:59:52Z"
        },
        {
          "tag": "v2.13.0",
          "kind": "minor",
          "published_at": "2026-07-13T17:14:18Z"
        },
        {
          "tag": "v2.12.0",
          "kind": "minor",
          "published_at": "2026-07-13T06:46:56Z"
        },
        {
          "tag": "v2.11.0",
          "kind": "minor",
          "published_at": "2026-07-12T20:26:11Z"
        },
        {
          "tag": "v2.10.0",
          "kind": "minor",
          "published_at": "2026-07-12T18:44:17Z"
        },
        {
          "tag": "v2.9.3",
          "kind": "patch",
          "published_at": "2026-07-12T12:17:46Z"
        },
        {
          "tag": "v2.9.2",
          "kind": "patch",
          "published_at": "2026-07-12T11:08:41Z"
        },
        {
          "tag": "v2.9.1",
          "kind": "patch",
          "published_at": "2026-07-12T10:54:28Z"
        },
        {
          "tag": "v2.8.0",
          "kind": "minor",
          "published_at": "2026-07-11T13:54:22Z"
        },
        {
          "tag": "v2.7.0",
          "kind": "minor",
          "published_at": "2026-07-09T11:10:39Z"
        },
        {
          "tag": "v2.6.0",
          "kind": "minor",
          "published_at": "2026-07-09T05:08:26Z"
        },
        {
          "tag": "v2.5.0",
          "kind": "minor",
          "published_at": "2026-07-06T08:00:24Z"
        },
        {
          "tag": "v2.4.0",
          "kind": "minor",
          "published_at": "2026-07-05T10:40:48Z"
        },
        {
          "tag": "v2.3.0",
          "kind": "minor",
          "published_at": "2026-07-04T08:15:51Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2026-07-03T20:22:39Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-07-03T17:51:20Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-07-03T10:35:43Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-07-02T21:32:30Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-07-02T11:14:18Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-07-02T05:27:29Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-07-01T19:23:51Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-07-01T17:42:56Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "1eda34632f5dcb76115eb4aee49a6c7734d4037f",
          "body": "…#156)\n\nRelease highlights:\n- export verified, relocatable knowledge-base folders for agents and automations\n- return compact MCP evidence by default to reduce agent context use\n\nRelease details:\n- **Portable bundles:** add export, verify, native, MCP, OpenClaw, and generic adapters\n- **Agent UX:** \n[…]\nacOS ARM64, Commitlint, and CodeQL checks\n\nBREAKING CHANGE: MCP search, ask, and research now return compact snippets by default.\nSet compact: false when a client needs the previous full-text payload.",
          "is_bot": false,
          "headline": "feat(core)!: ship portable knowledge bases and compact MCP defaults (…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-20T09:58:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17ca5de4851be292c75e5568b46c7042896ea09f",
          "body": "Release highlights:\n- make private team knowledge refresh understandable in one safe Git workflow\n\nRelease details:\n- Documentation: focus normal sync on reviewed upstream changes and one command\n- Documentation: move snapshots and MCP internals behind advanced disclosure\n- Reliability: give slow Git-and-index fixtures the existing 15-second test budget\n\nVerification:\n- pnpm validate\n- GitNexus detects low-risk documentation and test changes",
          "is_bot": false,
          "headline": "docs(team): simplify shared knowledge sync (#152) (#154)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-19T08:24:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3b071f7e0a227625b7e1bd47a8a2e028a9964ff",
          "body": "Release highlights:\n- protect Ragmir with AGPL-3.0-only and a commercial path for proprietary use\n- replace the normal snapshot exchange with one safe `rgr team sync` workflow\n- restore the compact landing hierarchy and align public product guidance\n\nRelease details:\n- **Licensing:** adopt AGPL-3.0-\n[…]\nCHANGE: Ragmir v3 source and packages use AGPL-3.0-only. Organizations that cannot meet\nthe AGPL obligations need a separate commercial agreement. Earlier published versions keep their\noriginal terms.",
          "is_bot": false,
          "headline": "feat(release)!: ship Ragmir v3 with safe team sync (#151)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T21:41:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ee27101527e30eb628e117c8b88d3f0b0477fcc",
          "body": "Release highlights:\n- protect Ragmir with AGPL-3.0-only and a commercial path for proprietary use\n- restore a crisp landing hierarchy with a three-line outlined headline and compact controls\n- describe the complete release from the newest validated promotion commit\n\nRelease details:\n- **Licensing:**\n[…]\n mobile without errors or overflow\n- confirm AGPL metadata and canonical licensing files inside every npm tarball\n\nBREAKING CHANGE: Ragmir source releases from v3.0.0 use AGPL-3.0-only instead of MIT.",
          "is_bot": false,
          "headline": "fix(release): select the newest curated release notes",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T20:01:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3bb31d43b6cc779bbae7951e340b0f3c8bc432f6",
          "body": "Release highlights:\n- keep Ragmir open under AGPL-3.0-only and offer commercial terms for proprietary use\n- give teams one clear licensing path across npm, documentation, the website, and the wiki\n\nRelease details:\n- **Licensing:** adopt AGPL-3.0-only from v3.0.0 while preserving earlier release ter\n[…]\n, CodeQL, and Commitlint\n- confirm AGPL metadata and canonical licensing files inside every generated npm tarball\n\nBREAKING CHANGE: Ragmir source releases from v3.0.0 use AGPL-3.0-only instead of MIT.",
          "is_bot": false,
          "headline": "feat(release)!: protect Ragmir with dual licensing",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T19:51:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e6800ecd091d98924dea7cf9a50e7faef1d32821",
          "body": "Release highlights:\n- Make the headline easier to scan with a purple outline and three stable localized lines.\n- Restore rounded calls to action and cards while keeping copyable fields compact.\n- Present five concise Ragmir workflows that match the current CLI and MCP contracts.\n\nRelease details:\n- \n[…]\nsts and 88.81% statements.\n- Pass 100 Ragmir golden queries with every quality threshold and zero false positives.\n- Verify desktop and mobile staging in English and French with no errors or overflow.",
          "is_bot": false,
          "headline": "fix(release): restore landing hero visual hierarchy",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T19:18:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "932425f0804a02477fd43aa69da8a3dbfcf09548",
          "body": "Release highlights:\n- configure Ragmir from one guided prompt adapted to the repository and local workflow\n\nRelease details:\n- **Core:** export a bounded setup prompt covering package managers, monorepos, privacy,\n  teams, semantic retrieval, Chat, TTS, and safe upgrades\n- **Landing:** make Prompt t\n[…]\nint, API smoke, release smoke, and artifacts\n- pass Linux x64 and macOS ARM64 portability plus CodeQL and Commitlint\n- verify exact prompt copy, desktop and mobile layout, both locales, and Lighthouse",
          "is_bot": false,
          "headline": "feat(release): add repository-aware guided setup",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T17:51:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6d1a4d008c4d88cd5450386d3c2d8e2886e7cd89",
          "body": "fix(release): preserve wrapped release notes",
          "is_bot": false,
          "headline": "Merge pull request #142 from jcode-works/release/2.19.4",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T14:56:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eea86254b57592260b1aeb5bfe9f5641701f79b3",
          "body": "Release highlights:\n- keep public release notes complete when Conventional Commit bullets wrap\n\nRelease details:\n- **Release automation:** join indented bullet continuations before generating\n  the curated GitHub release body\n- **Repository rules:** document the line-length-safe release note convention\n\nVerification:\n- pass pnpm validate after confirming the isolated retention test\n- prove wrapped detail and verification bullets remain complete in release notes",
          "is_bot": false,
          "headline": "fix(release): preserve wrapped release notes",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T14:52:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03dc6a7c5f67b8c599f0764b16c3e0813169f2ed",
          "body": "release: 2.19.3",
          "is_bot": false,
          "headline": "Merge pull request #140 from jcode-works/release/2.19.3",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T14:32:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "862628f48d35555cb95316a815c8bfef58db0a43",
          "body": "Release highlights:\n- keep team comparisons synchronized when operational indexes only have privacy advisories\n\nRelease details:\n- **Team DX:** surface per-side security advisory counts without blocking exact\n  drift analysis\n- **Compatibility:** interpret existing v2.19 snapshots by stored operational health\n  without changing the schema\n\nVerification:\n- pass pnpm validate\n- verify the PAC snapshot compares strictly against itself while preserving its\n  extractor advisory",
          "is_bot": false,
          "headline": "fix(core): separate team readiness from advisories",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T14:28:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1392a4e47462db520a9aa3b72d75db53619e2c7a",
          "body": "fix(core): distinguish upgrade readiness from advisories",
          "is_bot": false,
          "headline": "Merge pull request #138 from jcode-works/release/2.19.2",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:52:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc7819d22232c373ff994d3da43483647592e6ff",
          "body": "Release highlights:\n- keep retrieval ready after safe migrations when only privacy warnings remain\n\nRelease details:\n- **Upgrade DX:** report security follow-ups as non-blocking advisories\n- **Continuity:** preserve strict doctor checks while avoiding unnecessary reindex loops\n\nVerification:\n- pass pnpm validate\n- verify both PAC indexes report current and ready with their advisories",
          "is_bot": false,
          "headline": "fix(core): distinguish upgrade readiness from advisories",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:47:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17fe30d1107acd34a05bca9a5dea34263fceb460",
          "body": "fix(release): describe OCR continuity update",
          "is_bot": false,
          "headline": "Merge pull request #136 from jcode-works/release/2.19.1-notes",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d72094c4879ccc658c30094d5ec419857811a1e1",
          "body": "Release highlights:\n- keep existing projects reindexing when scanned PDFs contain blank pages\n\nRelease details:\n- **OCR:** accept valid empty Tesseract output while rejecting page-count mismatches\n- **Upgrade continuity:** preserve sources and atomic reindexing without a manual migration\n\nVerification:\n- pass pnpm validate with 497 Core tests plus Landing, Chat, and TTS suites\n- pass Linux x64, macOS ARM64, CodeQL, security, smoke, and packaging checks",
          "is_bot": false,
          "headline": "fix(release): describe OCR continuity update",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:13:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfe8ce0b0b9ab618e762fe468a859adbbc0ba653",
          "body": "fix(core): preserve OCR continuity for blank pages",
          "is_bot": false,
          "headline": "Merge pull request #135 from jcode-works/release/2.19.1",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:09:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "082aa64009432f7e201c3f32982c454d1a57d81b",
          "body": null,
          "is_bot": false,
          "headline": "fix(core): preserve OCR continuity for blank pages (#134)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T13:04:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a25a095adbd11d01b9ac325e4e2a03f9997aa2e2",
          "body": "feat(core): add team diagnostics and safe upgrades",
          "is_bot": false,
          "headline": "Merge pull request #133 from jcode-works/release/2.19.0-main",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T12:22:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04706313e4671a468045e8ffe981f2eed175cc50",
          "body": "Release highlights:\n- make team index differences explicit and actionable without exposing source text\n- keep the previous validated index until an incompatible replacement activates atomically\n- guide agents and developers through upgrades in the language they already use\n\nRelease details:\n- **Team\n[…]\n80 Chat/TTS tests, and 16 landing tests\n- pass Linux x64, macOS ARM64, CodeQL, Commitlint, and both quality gates\n- verify English desktop and French mobile metadata, FAQ parity, and Lighthouse scores",
          "is_bot": false,
          "headline": "feat(core): add team diagnostics and safe upgrades",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T12:18:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec486042ee5e1ae2989a6ae5c6d993e9a165ccfa",
          "body": "fix(release): improve public documentation and release communication",
          "is_bot": false,
          "headline": "Merge pull request #131 from jcode-works/release/v2.18.1-docs",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T09:49:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c484f1cdd6b98415430fa8ae28f01e920f6cf515",
          "body": "Release highlights:\n- make Ragmir easier to adopt without hiding its technical guarantees\n- restore a prominent white landing headline with clear local-first positioning\n\nRelease details:\n- **Documentation:** simplify every README and link advanced topics to focused guides\n- **Landing:** align conci\n[…]\n, smoke checks, publint, and artifacts\n- pass Linux x64, macOS ARM64, CodeQL, Commitlint, and the quality gate\n- verify EN/FR pages with 100 in SEO, accessibility, best practices, and agentic browsing",
          "is_bot": false,
          "headline": "fix(release): improve public documentation and release communication",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T09:39:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac242a4019c0e2bb819d1093524217ccca2d5e6c",
          "body": null,
          "is_bot": false,
          "headline": "feat(core): harden scalable local retrieval (#129)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-18T07:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5d4cfec0a222ec830999b6155d24b97842adb91",
          "body": null,
          "is_bot": false,
          "headline": "docs(addons): release TTS languages and Chat profile guidance",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-16T07:24:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a396258698dc6d75ec2c9f6586963a2dc97bfd2b",
          "body": "Promote the exact staging-validated tree for v2.17.1.",
          "is_bot": false,
          "headline": "fix(core): harden local reliability and MCP boundaries",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-16T05:47:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78e3009c05c82cd8760b1289092605eed58b9292",
          "body": null,
          "is_bot": false,
          "headline": "feat(core): make ingestion resumable (#122)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T17:02:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df790012b8d5c7fa625fd687f43975ef88ec8c79",
          "body": null,
          "is_bot": false,
          "headline": "docs(positioning): lead with confidential local RAG (#117) (#119)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T14:42:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0befe9e4fb50a414e899ac67cbb7aae4030550ff",
          "body": "…116)\n\n* fix(core): keep chat and tts truly optional\n\n* fix(landing): polish local rag workflows",
          "is_bot": false,
          "headline": "fix(core): keep local add-ons optional and polish workflows (#115) (#…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T13:06:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0838219cd86ad74aca52d67c3898c5d9f36decaa",
          "body": "* feat(core): add persistent Node.js client\n\n* docs: document persistent Node.js integrations\n\n* fix(landing): align npm version accessible label",
          "is_bot": false,
          "headline": "feat(core): add persistent Node.js client (#112) (#114)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T11:18:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7a2fcdd72d0d7eaedc6fae6ef831f14344228c8",
          "body": null,
          "is_bot": false,
          "headline": "feat: clarify local RAG workflows and package guides (#110) (#111)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T08:56:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f901a470b3432d43eeb82659befeb349529a3a6",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): remove deprecated baseUrl from API check (#108) (#109)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T08:12:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0cb6dd4eb36da36973bfd316db4dd9d5996e1433",
          "body": "* feat: polish landing workflows and public package guides (#104)\n\n* feat(landing): redesign use case workflows\n\n* fix(api): harden the public TypeScript surface\n\n* test(core): allow slower setup integration checks\n\n* docs: lead package guides with agent workflows\n\n* feat: ship realistic local workf\n[…]\n (#105)\n\n* fix(tts): resolve relative inputs from project cwd\n\n* feat(landing): present realistic local workflows\n\n* docs: lead with agent-first usage\n\n* feat: align Ragmir with coding-agent workflows",
          "is_bot": false,
          "headline": "feat: release coding-agent workflows and documentation (#107)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-14T07:50:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "053d78a2f61c2bc6b6918741b45ee9bed485cf98",
          "body": null,
          "is_bot": false,
          "headline": "docs: link project documentation wiki (#102) (#103)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-13T18:53:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fd77dff6c8d8f2e2b493e8168399b985defc2d0",
          "body": null,
          "is_bot": false,
          "headline": "feat: release evidence workflows and landing polish (#100)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-13T17:11:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32e3e29bd34b781285d56edd30a9e40998f75dff",
          "body": null,
          "is_bot": false,
          "headline": "feat(core): release native agent integration (#97)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-13T06:42:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5d65ea611d8b9eea1f90c0e367ec4b3886fdb25",
          "body": null,
          "is_bot": false,
          "headline": "docs: link project maintainer profiles (#95)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-13T05:26:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6897ef63f02d3fd6ab226cf9af6330cb188ff6e6",
          "body": "Preview structured chunks, explain hybrid retrieval, isolate nested monorepo knowledge bases, expose bounded MCP context resources, and harden generated server names.",
          "is_bot": false,
          "headline": "feat(core): release inspectable retrieval and monorepo routing (#92)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T20:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d673614c6c33bcf4d5f06fffebe01ef87e5f8c8",
          "body": "Preserve document structure for retrieval, bound MCP output, and add exact citation expansion.\nReport metadata-only output savings.",
          "is_bot": false,
          "headline": "feat(core): add context-efficient retrieval (#90)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T18:38:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30ded125ed1a8c05b6a8adda5e13ad6a5d1ecff9",
          "body": null,
          "is_bot": false,
          "headline": "fix(landing): align product positioning and metadata",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T16:23:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b29ce8b81fb8b0c60a19541e788f60ec3d925aee",
          "body": "Build optional add-ons before running the clean-checkout library demo.",
          "is_bot": false,
          "headline": "docs(readme): strengthen project and package showcases",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T12:14:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc00683a26adf479499e98c556f6ca04f1037254",
          "body": null,
          "is_bot": false,
          "headline": "docs(packages): expand npm package guides",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T11:05:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75d3934beb3df626edfe77e1806d7c786063a611",
          "body": null,
          "is_bot": false,
          "headline": "fix(workspace): remove leftover UI package",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T10:51:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e929efff4b05dc7d08dc8f412943f049adc2f68c",
          "body": null,
          "is_bot": false,
          "headline": "feat(core): add local OCR and simplify Ragmir",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-12T10:22:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b498c46f055f91d4c38a3918c9c7dd19af65ffdb",
          "body": "Add verified local Gemma runtime and hardened retrieval boundaries.",
          "is_bot": false,
          "headline": "feat(chat): release verified local Gemma runtime",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-11T13:50:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae019f66d153170dada1115cb919e2f6c8c44b96",
          "body": "Promote Ragmir retrieval evidence fidelity, MCP smoke coverage, query sanitizer hardening, and public documentation updates to production.",
          "is_bot": false,
          "headline": "feat(ragmir): improve retrieval evidence fidelity",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-09T10:52:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bef13dc91ceee696e68e31650737a5c87dc70621",
          "body": "release: promote commercial desktop app and multilingual TTS",
          "is_bot": false,
          "headline": "Merge pull request #70 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d5089280e3f02726fe8ca24b0ab1b28860850ff",
          "body": "feat: commercial desktop app, multilingual TTS, and setup AI prompt",
          "is_bot": false,
          "headline": "Merge pull request #69 from jcode-works/feature/desktop-commercial-v1",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:16:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3eb3ae91d793e833404b851f56a41aeb135ac0b",
          "body": "Cover ja/th/zh Edge voices and the offline-model caveat across the READMEs,\nCLI reference, offline TTS guide, and audio-summary skill, and document the\nnew setup configuration prompt and its API field.",
          "is_bot": false,
          "headline": "docs: document expanded tts languages and setup configuration prompt",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:11:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08b6dffc82681659590c278fc2dd094334f6f1fd",
          "body": "Add \"Modern army\" and \"Confidential dev\" scenarios to the hero demo, with\ntheir scenario icons and English/French copy, showing cited-only briefs\ngenerated locally without an external cloud RAG.",
          "is_bot": false,
          "headline": "feat(landing): add military and dev hero demo scenarios",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:11:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34a80119e1310de99ffbfda06dd2dcbde27110e2",
          "body": "Return a copy-paste English prompt from setupProject and print it at the end\nof `rgr setup` so an AI assistant or local chat can tune repository-specific\n`sources` entries while excluding secrets, generated files, and locale noise.",
          "is_bot": false,
          "headline": "feat(core): print ai configuration prompt after setup",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "357d294435498edd19a8c85911688271d09e69f2",
          "body": "Add ja, th, and zh to the supported TTS languages with native Edge neural\nvoices. Offline Transformers.js models stay limited to en, es, and fr; the\nnew languages require an explicit --model for offline rendering. Split\nOFFLINE_TTS_LANGUAGES from TTS_LANGUAGES and report both in doctor output.",
          "is_bot": false,
          "headline": "feat(tts): expand languages with japanese, thai, and chinese edge voices",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:11:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "511e9a90932aa18fc56e5fc1640a51555d625163",
          "body": "…loads",
          "is_bot": false,
          "headline": "fix(core): bound office archive text extraction against oversized pay…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:10:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b092511edf8d52e60f70da0cd32d35f01aca457f",
          "body": null,
          "is_bot": false,
          "headline": "ci: remove dependabot auto-merge workflow",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:10:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84c528b2e709e5e6076390c36da1e8579c9aec2b",
          "body": null,
          "is_bot": false,
          "headline": "ci: scope npm release workflow permissions to least privilege",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-08T21:10:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "155c561100fd444a23e65aa8cca4d42da8a05c91",
          "body": null,
          "is_bot": false,
          "headline": "feat(app): add commercial desktop workflow",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T19:57:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5f0c234cab2f29fd1eb85a6f4d141c8f3fdb29f",
          "body": "release: promote landing hero and npm defaults",
          "is_bot": false,
          "headline": "Merge pull request #68 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T08:30:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20f5ab43c5b5dc213b78a4ddb06971273787e691",
          "body": "fix(landing): keep hero title flowing inline",
          "is_bot": false,
          "headline": "Merge pull request #67 from jcode-works/feature/landing-hero-title-flow",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T08:26:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b40184ccd149cdfdedf9f1837e02834863145a2",
          "body": null,
          "is_bot": false,
          "headline": "fix(landing): default public commands to npm",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T08:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14f58b74e6b3323438635f1f2e7ba170f522c46b",
          "body": null,
          "is_bot": false,
          "headline": "fix(landing): keep hero title flowing inline",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T08:16:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbcf692ba66a10e52f5ed2d2eda49e87f65920be",
          "body": "release: promote Ragmir Chat and landing feature map",
          "is_bot": false,
          "headline": "Merge pull request #65 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:56:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c03320a6773c795ec59c8521fc2d4c425205aa0",
          "body": "feat: add Ragmir Chat and feature-map landing",
          "is_bot": false,
          "headline": "Merge pull request #64 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:50:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34ed59dd14c6fc31aacd116f0384fbd69e93fb36",
          "body": null,
          "is_bot": false,
          "headline": "feat(landing): showcase feature map and local chat",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:47:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3923f0a3c0b243fe121d82dc73261ce6c84b811",
          "body": null,
          "is_bot": false,
          "headline": "docs(ragmir): document chat and package boundaries",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "902148bb2d7dcba220d2a8508cfafa6da9de5cbc",
          "body": null,
          "is_bot": false,
          "headline": "build(release): include ragmir-chat in release artifacts",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:47:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8880d1d00527dd7cc54daaebcb274bfb8b439ab2",
          "body": null,
          "is_bot": false,
          "headline": "feat(ragmir-chat): add optional local cited chat",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-06T07:47:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a2e0f7d3b4c90dd4290cd73bde13145811c601d",
          "body": "release: promote landing social asset refresh",
          "is_bot": false,
          "headline": "Merge pull request #62 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T18:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c53199a6f2b4c74a1daddb928087598dfbe4a41",
          "body": "style: refresh landing social image and favicon",
          "is_bot": false,
          "headline": "Merge pull request #61 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T18:31:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cafb9f5900ad9dd26f83cc986ba80c3353a0a897",
          "body": null,
          "is_bot": false,
          "headline": "style(landing): refresh social image and favicon",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T18:28:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62d08277bdb3f92e0b07c442279883d9fab40532",
          "body": "release: promote landing version deploy fix",
          "is_bot": false,
          "headline": "Merge pull request #60 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:24:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc671b9c9fb9e402328348206225b2dd9d081e54",
          "body": "ci: fetch tags for landing version deploys",
          "is_bot": false,
          "headline": "Merge pull request #59 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:19:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "950ccca527ad35e5e13a600c6e015cdb033eb22d",
          "body": null,
          "is_bot": false,
          "headline": "ci(landing): fetch tags for versioned deploys",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:16:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eafb88998d81f2c28b1ece804edaf80b7b733f47",
          "body": "release: promote landing lighthouse accessibility fix",
          "is_bot": false,
          "headline": "Merge pull request #58 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:12:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d981222c237351fdaaa5662192d93cfa851bf1de",
          "body": "style: resolve landing lighthouse accessibility issues",
          "is_bot": false,
          "headline": "Merge pull request #57 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:06:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6d4b34d0bef8236921ed2bbd06e5b1976615c6b",
          "body": null,
          "is_bot": false,
          "headline": "style(landing): resolve lighthouse accessibility issues",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T11:03:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d328588e7bf75d7f48fc08dfbce77ec37f1e4a3d",
          "body": "release: promote release workflow permission fix",
          "is_bot": false,
          "headline": "Merge pull request #56 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:54:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f60aa563b771f9650431eb199ccf901519dd93a",
          "body": "ci: allow release workflow to dispatch landing deploy",
          "is_bot": false,
          "headline": "Merge pull request #55 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:48:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a161d518262d644ab6152ea0328415e21e0e05a",
          "body": null,
          "is_bot": false,
          "headline": "ci: allow release workflow to dispatch landing deploy",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:45:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3a55d7bdf5f5fa5ee447a34ab2e09e2caaa603c",
          "body": "release: promote develop to main for rgr CLI and ragmir.com",
          "is_bot": false,
          "headline": "Merge pull request #54 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:38:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66950bd4fc76828f7b6cbdd6af5e4be0d4220c50",
          "body": "feat: switch Ragmir CLI to rgr and refresh landing",
          "is_bot": false,
          "headline": "Merge pull request #53 from jcode-works/feature/landing-ragmir-domain",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:30:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdcc8daa40b31271f055bb20583c0eb2eab868a1",
          "body": "Parse the configured landing URL and compare the hostname exactly.\n\nThis prevents ragmir.com-prefixed arbitrary hosts from receiving production robots rules.",
          "is_bot": false,
          "headline": "fix(landing): harden production robots domain check",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:26:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edc7e087ccb905c037fd1983c1e46b3920dba34c",
          "body": "Update the canonical README, package READMEs, skills, and references.\n\nDocument the rgr command migration and deprecated compatibility bins.\n\nCover prompt routing, configuration, and the ragmir.com landing release path.",
          "is_bot": false,
          "headline": "docs: document rgr migration and release flow",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:23:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58186cd457ef188be13b32e3af59cd9c06ea116b",
          "body": "Add the build-time npm downloads counter.\n\nRefine the hero and use-case copy in both locales.\n\nKeep product branding as Ragmir while command examples use rgr.\n\nMove local Astro dev and preview to dedicated ports.",
          "is_bot": false,
          "headline": "feat(landing): refresh package-first Ragmir landing",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:23:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a763344033b693b12d6ae37749e9fd709652e091",
          "body": "Expose rgr and rgr-tts as the public command names.\n\nKeep ragmir, kb, and ragmir-tts as deprecated compatibility bins.\n\nThose aliases warn users to migrate to the new commands.\n\nAdd deterministic prompt routing through rgr route-prompt and MCP ragmir_route_prompt.",
          "is_bot": false,
          "headline": "feat(core): switch public cli to rgr",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-05T10:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00a40ececf7815b14358d260120c19b969b0759e",
          "body": "Move the public domain to ragmir.com and rebuild the landing around a\nsectioned architecture:\n\n- domain: wrangler routes and deploy URLs target ragmir.com (primary)\n  and www.ragmir.com, drop ragmir.jcode.works from production routes\n  (kept only for staging); astro.config and README links follow\n- \n[…]\n source types (confidential documents, repository files,\n  docs)\n- seo: add llms.txt, ai.txt, IndexNow key and submit script, dynamic\n  robots.txt, and structured-data organization/software/faq schema",
          "is_bot": false,
          "headline": "feat(landing): new section-based landing on ragmir.com",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-04T20:12:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76334cbb6ee61367951648b952aa662640a56860",
          "body": "release: stale index detection, vector index warnings, configurable BM25 scan",
          "is_bot": false,
          "headline": "Merge pull request #52 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-04T07:58:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "200058937f9ad9bbcfba5474300eed2add087982",
          "body": "* feat(core): detect stale index and surface vector index warnings\n\nAudit of all RAG library usage confirmed every dependency\n( @huggingface/transformers, @lancedb/lancedb, @modelcontextprotocol/sdk,\nzod, unpdf, mammoth, fast-glob ) is used according to its current API.\nNo library needed replacement\n[…]\nnot user input, so the manual backtick escaping was unnecessary\nand incomplete (did not escape backslashes). CodeQL flagged it as an\nincomplete string-escaping pattern; removing it resolves the alert.",
          "is_bot": false,
          "headline": "feat(core): detect stale index and surface vector index warnings (#51)",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-04T07:55:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e8b3b0e6fc68ea9fc2baf905873d14087e6c1c6e",
          "body": "…lease\n\nchore: backmerge main after release",
          "is_bot": false,
          "headline": "Merge pull request #50 from jcode-works/chore/backmerge-main-after-re…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:32:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "243983295031d16eca1804f6fa476a0345404b22",
          "body": "release: config-first sources, doc cleanup, audio skill, dist gitignore",
          "is_bot": false,
          "headline": "Merge pull request #49 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:19:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f13cf7241fb53f4318d98de77406d02ad7947f77",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into chore/backmerge-main-after-release",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:18:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4629e4b23f93369cf196c40b80c9bd0806d1fe50",
          "body": "…tion\n\nfix(sources): config-first sources, doc cleanup, audio skill",
          "is_bot": false,
          "headline": "Merge pull request #48 from jcode-works/feature/improve-text-tokeniza…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9af7691f17137af3e9e86f7fd6cf2d1ffa9d13f5",
          "body": "dist/ is now gitignored build output, so ragmir-core can no longer rely on\na committed ragmir-tts/dist to resolve the @jcode.labs/ragmir-tts import\nduring typecheck and tests. In CI the check step runs before build, so the\ntts dist does not exist yet and tsc --noEmit fails with 'Cannot find module'.\n\nMake the core check and test scripts build ragmir-tts first, so the tts\ndist exists before core resolves it. This mirrors how pnpm build already\norders tts before core.",
          "is_bot": false,
          "headline": "fix(core): build ragmir-tts before core check and test",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:13:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d6a6689739c1092e40b27ad770824f0ef343ba3",
          "body": "Clean up documentation that still presented the legacy kb binary and .kb/\npaths as current, and sync the sources guidance with the new config-first\nbehavior.\n\n- SECURITY-HARDENING.md: .kb/ to .ragmir/, kb destroy-index to ragmir\n  destroy-index, .kb/config.json to .ragmir/config.json.\n- SECURITY.md:\n[…]\n sources.txt legacy note now matches sources.ts. Add a Mermaid\n  diagram for the rawDir plus sources plus legacy merge flow.\n- AGENTS.md and docs/cli-reference.md: sources add/list target config.json.",
          "is_bot": false,
          "headline": "docs: remove dead kb references and sync sources.txt guidance",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:10:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27bde5210bcfad25a8308adebf37782e9dbc316b",
          "body": "ragmir sources add/list now read and write the sources array of\n.ragmir/config.json instead of the legacy .ragmir/sources.txt file. This\nmatches the config-first direction: ragmir init already stopped creating\nsources.txt, but sources add still wrote to it, leaving projects with an\nempty config sour\n[…]\n and merges a legacy sources.txt\n  read-only when present, so existing projects keep working.\n- Never create or write sources.txt anymore.\n- Remove the now-unused SOURCES_FILE_HEADER from defaults.ts.",
          "is_bot": false,
          "headline": "fix(sources): write source entries to config.json instead of sources.txt",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:09:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a413d20545b88116ac90a4f16922e0a4a31de9d1",
          "body": "The previous chore added packages/*/dist/ to .gitignore but did not run\ngit rm --cached, so 128 dist files (ragmir-core + ragmir-tts) inherited\nfrom the rebrand commit stayed tracked. .gitignore does not untrack\nalready-tracked files retroactively.\n\nUntrack them now so the index matches the gitignore policy. The files stay\non disk (rebuilt locally with pnpm build) and are no longer version\ncontrolled, consistent with the dist-as-build-output decision.",
          "is_bot": false,
          "headline": "chore: untrack dist/ build output from git index",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:09:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02683c1cbf90320853a99d73f4309b8b8770df04",
          "body": "…tion\n\nReplace the generic narration guidance with a deliberate, technique-based\npipeline that produces spoken summaries a listener can follow and retain,\ninstead of basic summaries read aloud.\n\nThe TTS rendering pipeline is untouched; all changes target the narration\nscript quality upstream.\n\nSKILL\n[…]\nded next to SKILL.md and bundled\nautomatically: listening-style.md (pacing, TTS punctuation, anti-patterns)\nand narration-templates.md (skeletons per format, signposting and\nactive-recall catalogues).",
          "is_bot": false,
          "headline": "feat(audio-summary): rewrite skill for intent-driven, memorable narra…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T20:09:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17e20a1981657a6f02dd42c194cf3a0174b95e13",
          "body": "release: RAG retrieval overhaul (RRF + IVF_PQ), redaction hardening, coverage",
          "is_bot": false,
          "headline": "Merge pull request #47 from jcode-works/develop",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:41:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6253d239a00debb506f167fb54adef788c99917",
          "body": "…y-overhaul\n\nfeat(core): RAG retrieval overhaul (RRF + IVF_PQ), redaction hardening, and test coverage",
          "is_bot": false,
          "headline": "Merge pull request #46 from jcode-works/feature/rag-retrieval-securit…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:37:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4e0a3b9adc88a882fcf06db72e817d594ae18cb",
          "body": "Close the test-coverage gaps the audit identified, raising the suite from 132\nto 151 cases across 23 files:\n\n- destroy.test.ts (new): destroyIndex removed flag and access-log entry.\n- query.test.ts: ask() empty-sources and populated cited-retrieval branches.\n- store.test.ts: empty-text-files manifes\n[…]\ncli.test.ts (new): all cli-options parsers incl. the MP3-without-engine\n  confidentiality guard and agent scope/mode validation.\n- text.test.ts (new): tokenize/normalizeForMatch (the BM25 foundation).",
          "is_bot": false,
          "headline": "test: cover retrieval, security, and CLI gaps surfaced by the audit",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:27:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "98d21d966561b2d0596fb44cabec44f288ec1a43",
          "body": "…d use\n\nSeveral additive robustness and observability improvements, plus extraction of\nthe CLI option parsers into a testable module:\n\n- config: make rawConfigSchema strict so unknown keys (typos) are rejected\n  instead of silently ignored; warn on stderr when an env override (e.g.\n  RAGMIR_TOP_K=ab\n[…]\nedicated module so\n  they can be unit-tested without importing commander. cli.ts imports them.\n  parsePositiveInt now rejects fractional input like \"1.5\" instead of silently\n  truncating via parseInt.",
          "is_bot": false,
          "headline": "feat(core): harden config, logging, and embedding cache for long-live…",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:26:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0014c959be3f748fbc1cc1aca4f17e30a2b0e9e4",
          "body": "Close two confidentiality gaps and broaden provider coverage in the built-in\nredaction patterns:\n\n- credit_card: add a match-then-verify Luhn check (new RedactionPattern.verify\n  field). Numeric runs that are not valid card numbers (version numbers,\n  account IDs, hex runs) are left untouched instea\n[…]\nrder the more specific patterns before the generic\n  api_token so they win on overlap.\n- Add an optional `verify: \"luhn\"` to the RedactionPattern type so custom\n  patterns can opt into the same check.",
          "is_bot": false,
          "headline": "fix(redaction): verify card numbers with Luhn and redact URL usernames",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:26:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a41bdb41d3919e64f7e801ef5b3d4c8ad31e25e",
          "body": "Above a 256-row threshold, automatically create an IVF_PQ index on the vector\ncolumn after writing the table. Below the threshold, LanceDB keeps using an\nexact flat scan, which is optimal for small corpora and avoids wasted index-\ntraining work.\n\n- numPartitions ≈ sqrt(rowCount), clamped to [8, 1024\n[…]\non edge-case dimensionality leaves the table usable via\n  flat scan rather than failing the ingest).\n\nThis unblocks query scalability beyond brute-force scan without changing the\noverwrite write path.",
          "is_bot": false,
          "headline": "feat(store): train an IVF_PQ vector index once a corpus is large enough",
          "author_name": "Jean-Baptiste THERY",
          "author_login": "jb-thery",
          "committed_at": "2026-07-03T17:26:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 41,
      "commits_last_year": 173,
      "latest_release_at": "2026-07-20T10:02:56Z",
      "latest_release_tag": "v4.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 6,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 0.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@jcode.labs/ragmir-tts",
          "exists": true,
          "license": "AGPL-3.0-only",
          "keywords": [
            "jcode",
            "ragmir",
            "coding-agents",
            "text-to-speech",
            "tts",
            "local-first",
            "edge-tts",
            "transformers",
            "onnx",
            "audio"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jcode.labs/ragmir-tts",
          "is_deprecated": false,
          "latest_version": "4.0.0",
          "repository_url": "https://github.com/jcode-works/jcode-ragmir",
          "versions_count": 37,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5567,
          "first_published_at": "2026-07-03T10:35:30.436000Z",
          "latest_published_at": "2026-07-20T10:02:41.200000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@jcode.labs/ragmir-chat",
          "exists": true,
          "license": "AGPL-3.0-only",
          "keywords": [
            "jcode",
            "ragmir",
            "local-chat",
            "offline-ai",
            "local-first",
            "gemma",
            "qwen",
            "local-llm",
            "llama-cpp",
            "confidential-rag",
            "coding-agents",
            "cited-retrieval",
            "rag"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jcode.labs/ragmir-chat",
          "is_deprecated": false,
          "latest_version": "4.0.0",
          "repository_url": "https://github.com/jcode-works/jcode-ragmir",
          "versions_count": 32,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 4165,
          "first_published_at": "2026-07-06T08:00:13.213000Z",
          "latest_published_at": "2026-07-20T10:02:44.802000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        },
        {
          "name": "@jcode.labs/ragmir",
          "exists": true,
          "license": "AGPL-3.0-only",
          "keywords": [
            "jcode",
            "ragmir",
            "open-source",
            "rag",
            "confidential-rag",
            "ai-agents",
            "coding-agents",
            "knowledge-base",
            "confidential-data",
            "offline-first",
            "cited-retrieval",
            "local-first",
            "mcp",
            "mcp-server",
            "nodejs",
            "typescript",
            "transformers",
            "semantic-search",
            "lancedb"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@jcode.labs/ragmir",
          "is_deprecated": false,
          "latest_version": "4.0.0",
          "repository_url": "https://github.com/jcode-works/jcode-ragmir",
          "versions_count": 37,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5379,
          "first_published_at": "2026-07-03T10:35:35.573000Z",
          "latest_published_at": "2026-07-20T10:02:48.748000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 6,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [
        "mise.toml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/ragmir-chat/tsconfig.json",
        "packages/ragmir-core/tsconfig.json",
        "packages/ragmir-landing/tsconfig.json",
        "packages/ragmir-tts/tsconfig.json",
        "tests/public-api-consumer/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 101417,
      "source_files_sampled": 223,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10169
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "adm-zip",
            "direct": false,
            "version": "0.5.18",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-xcpc-8h2w-3j85"
            ],
            "fixed_version": "0.6.0",
            "advisory_count": 1,
            "oldest_advisory_days": 15
          },
          {
            "name": "sharp",
            "direct": false,
            "version": "0.34.5",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-f88m-g3jw-g9cj"
            ],
            "fixed_version": "0.35.0",
            "advisory_count": 1,
            "oldest_advisory_days": 4
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 2
        },
        "advisory_count": 2,
        "affected_count": 2,
        "assessed_count": 74,
        "malicious_count": 0,
        "assessed_package": "npm:@jcode.labs/ragmir-tts@4.0.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "node-llama-cpp",
          "manifest": "packages/ragmir-chat/package.json",
          "ecosystem": "npm",
          "version_constraint": "3.19.0"
        },
        {
          "name": "@huggingface/transformers",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        },
        {
          "name": "@lancedb/lancedb",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.30.0"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "commander",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.2"
        },
        {
          "name": "fast-glob",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.3.3"
        },
        {
          "name": "fflate",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.3"
        },
        {
          "name": "html-to-text",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.0.5"
        },
        {
          "name": "mammoth",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.12.0"
        },
        {
          "name": "picocolors",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "read-excel-file",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^9.2.0"
        },
        {
          "name": "safe-regex2",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.1"
        },
        {
          "name": "unpdf",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.0"
        },
        {
          "name": "yaml",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.9.0"
        },
        {
          "name": "zod",
          "manifest": "packages/ragmir-core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.1.13"
        },
        {
          "name": "@radix-ui/react-slot",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.0"
        },
        {
          "name": "@radix-ui/react-tabs",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.15"
        },
        {
          "name": "@astrojs/check",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.9"
        },
        {
          "name": "@astrojs/react",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "@astrojs/sitemap",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.7.3"
        },
        {
          "name": "@lucide/astro",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.23.0"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.1"
        },
        {
          "name": "astro",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.2"
        },
        {
          "name": "class-variance-authority",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "lucide-react",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.21.0"
        },
        {
          "name": "react",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.7"
        },
        {
          "name": "react-dom",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.7"
        },
        {
          "name": "tailwind-merge",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.0"
        },
        {
          "name": "tailwindcss",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.1"
        },
        {
          "name": "typescript",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.9.3"
        },
        {
          "name": "vite",
          "manifest": "packages/ragmir-landing/package.json",
          "ecosystem": "npm",
          "version_constraint": "^8.0.13"
        },
        {
          "name": "@huggingface/transformers",
          "manifest": "packages/ragmir-tts/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.2.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 137,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 20
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "jb-thery",
          "commits": 172,
          "avatar_url": "https://avatars.githubusercontent.com/u/64416557?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codeql.yml",
        "npm-publish.yml",
        "performance-benchmark.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "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": 4,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "12 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "1eda34632f5dcb76115eb4aee49a6c7734d4037f",
        "ran_at": "2026-07-26T13:50:41Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T10:01:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T11:09:53Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/jcode-works/jcode-ragmir",
    "host": "github.com",
    "name": "jcode-ragmir",
    "owner": "jcode-works"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 65,
      "inputs": {
        "security": 58,
        "vitality": 70,
        "community": 54,
        "governance": 52,
        "engineering": 90
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "commits_last_year": 173,
              "human_commit_share": 1,
              "days_since_last_push": 6,
              "active_weeks_last_year": 4
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "173 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 173
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 41,
              "latest_release_tag": "v4.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 0.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "41 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 54,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 11,
            "inputs": {
              "forks": 0,
              "stars": 6,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "6 stars",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "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": 70,
            "inputs": {
              "packages": [
                "@jcode.labs/ragmir-tts",
                "@jcode.labs/ragmir-chat",
                "@jcode.labs/ragmir"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 15111
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "15,111 downloads/month across npm",
                "points": 55.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 15111,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "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": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "merged_prs": 137,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 20
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "137/157 decided PRs merged",
                "points": 33.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 137,
                      "decided": 157
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "followers": 8,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "jcode-works",
              "public_repos": 3,
              "account_age_days": 1640
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "8 followers of jcode-works",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "jcode-works"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~4 yr old",
                "points": 13.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 4
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@jcode.labs/ragmir-tts",
                "@jcode.labs/ragmir-chat",
                "@jcode.labs/ragmir"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "3 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 3,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "37 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai-agents",
                "local-first",
                "mcp",
                "rag",
                "typescript",
                "open-source",
                "local-rag",
                "ragmir",
                "developer-tools",
                "mcp-server",
                "cli",
                "coding-agents",
                "document-retrieval",
                "model-context-protocol",
                "nodejs",
                "offline-first",
                "privacy-first",
                "project-knowledge",
                "cited-retrieval",
                "confidential-rag"
              ],
              "has_wiki": true,
              "homepage": "https://ragmir.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://ragmir.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5
            },
            "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 is not maximal on development and all release branches",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "12 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:@jcode.labs/ragmir-tts@4.0.0 runtime dependency closure — what installing the published package pulls in — 74 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@jcode.labs/ragmir-tts@4.0.0",
                  "assessed": 74
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 84,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 2,
              "assessed_packages": 74,
              "unassessed_packages": 0,
              "affected_by_severity": "high 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "2 affected: adm-zip 0.5.18 (high 7.5), sharp 0.34.5 (high 7.3)",
                "points": 8.5,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 2,
                      "packages": "adm-zip 0.5.18 (high 7.5), sharp 0.34.5 (high 7.3)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 74,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 83,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10169
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "mise.toml"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/ragmir-chat/tsconfig.json",
                "packages/ragmir-core/tsconfig.json",
                "packages/ragmir-landing/tsconfig.json",
                "packages/ragmir-tts/tsconfig.json",
                "tests/public-api-consumer/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "mise.toml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mise.toml"
                    }
                  }
                ],
                "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": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/ragmir-chat/tsconfig.json, packages/ragmir-core/tsconfig.json, packages/ragmir-landing/tsconfig.json, packages/ragmir-tts/tsconfig.json, tests/public-api-consumer/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/ragmir-chat/tsconfig.json, packages/ragmir-core/tsconfig.json, packages/ragmir-landing/tsconfig.json, packages/ragmir-tts/tsconfig.json, tests/public-api-consumer/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 101417,
              "source_files_sampled": 223,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/223 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 223,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "moderate",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "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": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T13:50:56.949487Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/jcode-works/jcode-ragmir.svg",
  "full_name": "jcode-works/jcode-ragmir",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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

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

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