Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 01:49 UTC

gh-myio / myio-js-library

JavaScript · TypeScript · HTMLMIT★ 0 estrellas⑂ 0 forksdesde ago 2025Ver en GitHub ↗

gh-myio/myio-js-library tiene un índice de salud de 51 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (69/100) y la más baja, Security (28/100). Se actualizó por última vez hace 1 día. Una sola persona concentra la mayor parte del trabajo reciente.

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

51
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

myioOrganización
1 seguidor4 repositorios públicosdesde sept 2024

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
npmmyio-js-library0.1.5278091589hace 5 días

Métricas por categoría

Vitalidad

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

64Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 1 días
18.7/36Cadencia de commits — 27/52 semanas con commits
18/18Volumen de commits — 1727 commits en el último año
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year1727
human_commit_share1
days_since_last_push1
active_weeks_last_year27
Cómo se puntúa
16.2/27Publica versiones — 1 etiquetas de versión (sin releases de GitHub)
16.2/36Recencia de las versiones — última versión hace 329 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv0.1.1
releases_from_tags
days_since_latest_release329
mean_days_between_releases
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

41En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
52.1/80Descargas mensuales — 8091 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesmyio-js-library
dependents
ecosystemsnpm
total_downloads
monthly_downloads8091
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?

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
1/22.5Distribución de commits — el principal contribuyente firma el 96% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,955
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
35.2/38.3Aceptación de PR — 92/100 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs92
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs8
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
2.2/25Alcance del propietario — 1 seguidores de gh-myio
8.8/25Trayectoria — 4 repos públicos, cuenta de ~1 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_logingh-myio
public_repos4
account_age_days682
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 589 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesmyio-js-library
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

64Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.js
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

40En riesgo
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_descriptionno

Seguridad

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

28Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
3.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — sin datos
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 30 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate2,8
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

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

69Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — .claude/CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
35.7/40Historial de commits legible — 67 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,67
agent_instruction_files.claude/CLAUDE.md
agent_instruction_max_bytes11.182
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.js
11/11Verificación estática de tipos — src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 39 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configssrc/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json
agent_commit_share0,39
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — JavaScript con configuración de verificación de tipos (src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json)
50.7/55Tamaños de archivo manejables — 50/640 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageJavaScript
largest_source_bytes352.171
source_files_sampled640
oversized_source_files50
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — demos, examples, sample
Datos de entrada utilizados
example_dirsdemos, examples, sample
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:myio-js-library@0.1.527; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 2.8 / 10
2.8agregado

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

10Binary-Artifactsno binaries found in the repo
5Branch-Protectionbranch protection is not maximal on development and all release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
n/dPackagingpackaging workflow not detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities30 existing vulnerabilities detected
Todas las dependencias no recopilado

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 89646,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "CSS": 782806,
        "HTML": 2261562,
        "Shell": 29484,
        "Batchfile": 29929,
        "JavaScript": 7008639,
        "PowerShell": 47200,
        "TypeScript": 4700909
      },
      "pushed_at": "2026-07-21T18:14:25Z",
      "created_at": "2025-08-08T16:57:49Z",
      "owner_type": "Organization",
      "updated_at": "2026-02-27T18:25:53Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript",
        "TypeScript",
        "HTML"
      ]
    },
    "owner": {
      "blog": "https://myio.com.br/",
      "name": "myio",
      "type": "Organization",
      "login": "gh-myio",
      "company": null,
      "location": "Brazil",
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/180892842?v=4",
      "created_at": "2024-09-09T00:32:42Z",
      "is_verified": null,
      "public_repos": 4,
      "account_age_days": 682
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2025-08-27T04:16:43Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "535836099e145657750823f592d38a0a7ae39deb",
          "body": null,
          "is_bot": false,
          "headline": "fix modal annotations",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T18:24:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b5f8bf68451ad35a3826e495735023408555692",
          "body": null,
          "is_bot": false,
          "headline": "fix panel smart hospital",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T18:23:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c50d57da14dfe83b845aaaad67ec21fdc7e7b43e",
          "body": null,
          "is_bot": false,
          "headline": "update v3 smart hospital",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:36:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b398116bb482637837503cde7ea427c03b63af9f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.414",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:33:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5969eff6417e336a859caf25509a0bed00fb2295",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.413",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:32:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7c8bc98d7137f7945ce9200be7c98b60d46a55e",
          "body": "…ibrary into fix/rfc-0152-real-data",
          "is_bot": false,
          "headline": "Merge branch 'bas-components' of https://github.com/gh-myio/myio-js-l…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67718eca869bda43830b00ebc49abb566a9071b5",
          "body": null,
          "is_bot": false,
          "headline": "update alarms",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:31:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f37bb67d8acbe533db8ad8af74f334a1d25001a4",
          "body": null,
          "is_bot": false,
          "headline": "update attr sync",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:31:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "287a14ddfafdd059f225e37a60da6b3694e0a0e6",
          "body": null,
          "is_bot": false,
          "headline": "update upsell modal",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:31:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9215d54682dde7899efb42bfe9cc709c0e5583d",
          "body": null,
          "is_bot": false,
          "headline": "widgets smart hospital",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-27T17:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1470746c7b039494c69b9b13c4fdd90ed3bae462",
          "body": null,
          "is_bot": false,
          "headline": "fix exibição por Shopping",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-26T21:21:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d41272eca4716f29452aa467b63803bf5206d08",
          "body": null,
          "is_bot": false,
          "headline": "ajuste agendamento solenóide",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-26T21:07:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3ba698dd3885ed6f5048a21e9dae81318c3faca",
          "body": "…update ONBOARDING\n\n- RFC-0183-AlarmServiceOrchestrator-AlarmBadge.md: documenta AlarmServiceOrchestrator,\n  alarm badge nos device cards, migração AlarmsTab para batchX(), filtro API-driven\n  AllReportModal (RFC-0182 fix), e correção da cadeia gcdrDeviceId (3 pontos:\n  buildMetadataMapFromCtxData, \n[…]\no AlarmServiceOrchestrator, AlarmBadge, AlarmsTab, AllReportModal filter,\n  globals relevantes e RFCs 0180-0183; adiciona Fase 7 no checklist\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(rfc-0183): add RFC-0183 AlarmServiceOrchestrator + AlarmBadge + …",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-26T17:08:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9198cd854ab82b1e3bfff4b96ec81a37b21d7ed8",
          "body": "… grid UX v1.3.0\n\n- Add new dedicated widget GCDR-Upsell-Setup/v.1.0.0 (controller, template, styles)\n  with customer search, preselectedCustomer support, and local lib pre-load\n- Add Pre-Setup-Constructor/v.2.0.0: clean version without upsell/gcdr buttons\n- Add preselectedCustomer? param to UpsellM\n[…]\npsell-setup/ (port 3340) with ghost auth, fetch proxy, local UMD pre-load\n- Update RFC-0109 with v1.3.0 section documenting all changes above\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(rfc-0109): GCDR-Upsell-Setup widget v1.0.0, preselectedCustomer,…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-26T16:59:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9c90560878a4e1f02fc305f0aa5b356f45b98bef",
          "body": null,
          "is_bot": false,
          "headline": "ajuste telemetria",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-26T16:46:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "637b883b15863b16075b4f21ba7d13048dacadb8",
          "body": null,
          "is_bot": false,
          "headline": "fix status",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-26T16:10:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5fdc9bbed76d69101ffe37434d4576b28644039",
          "body": null,
          "is_bot": false,
          "headline": "fix modal",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-26T16:08:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1c4bb71ea2432b1f3ad158d78aa72f7a53cbf10",
          "body": null,
          "is_bot": false,
          "headline": "update myio dashboard",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-26T13:50:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a83499930e97c48f573b28ed464ad142afacb75",
          "body": "…ibrary into fix/rfc-0152-real-data",
          "is_bot": false,
          "headline": "Merge branch 'bas-components' of https://github.com/gh-myio/myio-js-l…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T19:17:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3d8c8cd37d8ba2c2d9c799bdd80325a17bd5557",
          "body": null,
          "is_bot": false,
          "headline": "fix bas",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-25T19:11:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ff85db0abfdf5d68a3e969b2e2377ce29b6b768",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.413",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T19:10:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a22cf3d078b6f58689f79dbdb87443f7654592ce",
          "body": null,
          "is_bot": false,
          "headline": "new fix at modal report",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T19:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51ac680eae1d2d82bf722e35b55d6662efe45bcd",
          "body": null,
          "is_bot": false,
          "headline": "fix myio bas water volume",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T17:54:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7da28ea56d7948456ad2eb1521ef102e32bfc43",
          "body": null,
          "is_bot": false,
          "headline": "fix showcase myiobas",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T16:51:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1738f0a2d620d7bee740e73373770ff13a140072",
          "body": "… AlarmsTab\n\n- AlarmCardParams: add onSnooze and onEscalate callback fields\n- AlarmCard.ts: call params.onSnooze/onEscalate when provided (fallback to\n  custom events for backward compat) — eliminates unreliable CustomEvent path\n- AlarmsTab: wire onSnooze, onEscalate, onDetails via params callbacks \n[…]\nener('alarm-snooze/escalate') — same pattern as onAcknowledge\n- Includes energy/water categorizeItemsByGroup fixes (deviceProfile-only rules)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rfc-0180): alarm card buttons snooze/escalate/details now work in…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T16:03:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4637af381799c244200a60c73b44fae0b14d958f",
          "body": "When itemsList is explicitly passed but empty (group has no devices),\nreturn [] instead of mapping all API devices. Only undefined/null itemsList\ntriggers direct API mapping (no-group mode).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rfc-0182): empty itemsList no longer falls back to full API mapping",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T15:45:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29dc260c28701f0bc10468b5a47b2dca4861399c",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.412",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T15:41:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81346258a421cb7897c46d6d1cc268148995ac97",
          "body": "- type Domain: add 'temperature'\n- DOMAIN_CONFIG: add temperature entry (endpoint, unit °C, label, totalLabel)\n- fixes crash 'Cannot read properties of undefined (reading endpoint)'\n  when opening temperature report modal\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rfc-0182): add temperature domain config to AllReportModal",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T15:19:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4f4d5ecf10ab7b2368ae7ac4bf62c61b25ec7d4",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.411",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T14:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14b45b0c9ed28ea4089a70f9e09635b94604010e",
          "body": "…eport sub-items\n\n- settingsSchema.json: add alarms_por_dispositivo, alarms_dispositivo_x_alarme,\n  alarms_por_tipo booleans (default false) + form entries\n- MAIN_VIEW: include alarms keys in REPORT_ITEM_DEFAULTS; expose via window.MyIOUtils\n- MENU: replace all hardcoded enabled:true/false with ei() lookup from enabledReportItems,\n  including alarms tab; disabled cards show 🔒 badge instead of 'Em breve'\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(rfc-0182): enabledReportItems — dynamic lock/unlock for all 14 r…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T14:04:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b78390be08feb368b25bee44dc9de1c2a82cc2a",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.410",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T13:39:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1faa4d5b704823a8d64f1c6f1f45e7c36332bf0b",
          "body": "…ble rows, collapsed menu width\n\n- AllReportModal: resolveTitle() maps domain+group to correct Portuguese title\n- AllReportModal: table rows now use fmtPt() instead of toFixed(2) for BR number format\n- types: OpenAllReportParams.group optional field\n- MENU: pass group param to openDashboardPopupAllReport\n- MENU styles: collapsed width 20px → 35px\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rfc-0181/0182): dynamic report title by domain+group, fmtPt on ta…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T13:37:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a88553dc96dcf477b83e197bee7a46d9a852de9",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.409",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T13:00:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28b55aad796fb1c7767b81711e6f2a8ddbea3ae9",
          "body": "…ll report groups enabled\n\n- MENU: replace addReportsButton with changeDashboardState intercept for Relatórios link\n- MENU: openReportsPickerModal now reads credentials from orch.getCredentials() and tokenManager\n- MENU: _openGroupReport replaces _openLojasReport — all cards enabled (energia/água/te\n[…]\ntemsList is absent\n- DateRangePickerJQ: remove empty helpText div that caused vertical misalignment in toolbar\n- RFC-0182 documentation added\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(rfc-0181/0182): reports menu item — group classification API + a…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T12:59:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0e06e9863d5e1488064645da5495c2462a0eb350",
          "body": null,
          "is_bot": false,
          "headline": "update display none btn reportt",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T07:34:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d93d60ee0b9f003e4bc1b3289780aeda5c68a6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.408",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T07:26:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f8d9473db5938be959dda60784fff3e50ef0ba3",
          "body": null,
          "is_bot": false,
          "headline": "fix enable button",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T07:25:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1d62622921bf33cff865ca298ee40bc3c7037a6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.407",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T06:49:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c00bbf76105c47e57ad935ea97ecb9091dae9677",
          "body": null,
          "is_bot": false,
          "headline": "fix settings modal",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T06:49:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "750bf0b06105d8c31ffed109dd38a010b69fc990",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.406",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T06:24:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44b167f8423493317cc0d826a7a118b14b3ec362",
          "body": null,
          "is_bot": false,
          "headline": "update modal settings",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T06:24:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a702f765930c10cf8bf36018d577cc3f31a619f",
          "body": null,
          "is_bot": false,
          "headline": "update widgets",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T06:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3dc3fcb837068be21f38dbfa1b7c07695959d57",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.405",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T05:20:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1be884274951451ee98006580190a032326d4fb2",
          "body": null,
          "is_bot": false,
          "headline": "new features rfc 180",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-25T05:20:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4f5ee23deaf5bfe224ae0df85991f5087bb17cf",
          "body": "- Grid 3 colunas: minmax(350px) | 1fr | minmax(350px)\n- Divisores entre col1/col2 e col2/col3 (border-right/left)\n- Showcase: seed {label, floor, identifier} para pré-popular form sem fetch TB\n- Showcase: timestamps createdTime/lastActivityTime fixos por device mock\n- Showcase: _RFC180_TEST_DEVICES com floor, identifier e timestamps reais\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rfc-0180): identity card layout + showcase seed mock data",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T22:07:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "698a018ad67b168096a721f6a59ffebf74f8a9dd",
          "body": "…yio-js-library into fix/rfc-0152-real-data",
          "is_bot": false,
          "headline": "Merge branch 'fix/rfc-0152-real-data' of https://github.com/gh-myio/m…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T21:44:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63ef3de4060c6440a5c44ecf122e15f49983a761",
          "body": null,
          "is_bot": false,
          "headline": "new features tab alarms",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T21:44:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d610c34cddd81a3aa54063e0c83748f581dcaee8",
          "body": "…yio-js-library into fix/rfc-0152-real-data",
          "is_bot": false,
          "headline": "Merge branch 'fix/rfc-0152-real-data' of https://github.com/gh-myio/m…",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-24T21:19:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c3356096330b08ce2c4415403bdc71a156c92ce",
          "body": null,
          "is_bot": false,
          "headline": "fix aba relatório",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-24T21:19:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "275b1b8d3ddf8cbff91ed06df4e6dfe25d608ad1",
          "body": "…yio-js-library into fix/rfc-0152-real-data",
          "is_bot": false,
          "headline": "Merge branch 'fix/rfc-0152-real-data' of https://github.com/gh-myio/m…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T19:24:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f304ac8ea75d59f8f498cb9d672bb0627bcd8c6e",
          "body": null,
          "is_bot": false,
          "headline": "rfc 180",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T19:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bc81c63d936a012e1112684d39e7578b600ea33",
          "body": null,
          "is_bot": false,
          "headline": "ajuste tabela",
          "author_name": "victorhjoe",
          "author_login": "victorhjoe",
          "committed_at": "2026-02-24T18:52:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07a65bc102d2e5d38a1c8eeabd0ab348abbeac04",
          "body": null,
          "is_bot": false,
          "headline": "fix zindex annotations",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T16:52:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3db1954bacc3cb243649e43da4e4a971a46b30ec",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.404",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T14:16:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "026dc8639299b47bdfeb7e94133ba5da84848ff9",
          "body": "…summary\n\n- Remove HORA/DIA/SEMANA/MÊS period buttons from report toolbar\n- Show each interpolated occurrence as individual row (#N | date | trigger)\n- Trigger value shown only on latest/single occurrence row\n- consolidado/porDispositivo: add summary table per device (total, first, last)\n- separado:\n[…]\ncorrências × dispositivos\" section in Dispositivos tab\n- Add CSS: adm-rpt-section-title, adm-rpt-device-header, adm-rpt-cell--idx + dark mode\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): redesign report tab — real occurrences grid + per-device …",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T13:41:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a0fac78805edb251fd6dba939ec11f85ca6a6bd",
          "body": "- buildTimeline now accepts groupMode param (consolidado/separado/porDispositivo)\n- consolidado: device label on every row, rotates for multi-device alarms\n- separado: no device label in timeline rows\n- porDispositivo: grouped sections per alarm type using _alarmTypeGroups virtual field\n- Add _alarm\n[…]\n-count, --sep)\n- Increase .alarm-card min-height from 162px to 165px\n- Update showcase with multi-device/multi-type pinned alarms for testing\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): context-aware timeline per group mode + card min-height",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T13:23:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab76a219cd2c0af05bb68902b8742cb2a7c561b6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.403",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T03:32:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9390fd1b4b58dd89dd5f2c82ec8bc637be07468b",
          "body": "…er value\n\n- AlarmDetailsModal: replace SVG chart renderers (buildBarChartHtml, buildLineChartHtml, buildDowChart, buildHodChart) with Chart.js createMainChart/createDowChart/createHodChart; smooth lines via tension:0.4; tooltips on all charts including DOW/HOD; charts init on tab click for correct \n[…]\n in table + CSV export\n- styles: canvas wrapper heights (210px main, 148px DOW, 120px HOD); .adm-matrix-trigger; .adm-timeline-num black/bold\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): migrate charts to Chart.js + fix timeline format + trigg…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T03:32:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c141ad00d33ee3209e4ddc65aad066a66d1e8464",
          "body": "- AlarmsNotificationsPanelView: add sortCol/sortDir state; click handler on [data-sort-col] toggles asc/desc; renderAlarmsTable applies sort (localeCompare for text, semantic order for severity/state, numeric for count, Date diff for timestamps); th() helper generates sortable headers with ⇅/▲/▼ ico\n[…]\ntimeline-sep style\n- showcase: updated with gcdrDeviceNameMap, entityNameToLabelMap, centralId/triggerValue in alarms, reinit on theme toggle\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): sortable columns in alarmsGrid + inline timeline items",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T02:31:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e1efd3b9159ed255c15171c62403e39153c4e28",
          "body": "…lumn in separado list view\n\n- AlarmDetailsModal: add maximize/restore button (expand/compress icons, toggle\n  adm-drawer--maximized class for fullscreen); add themeMode param propagated to\n  overlay data-theme attribute; unify header buttons under adm-header-btn\n- AlarmsNotificationsPanelView: pass\n[…]\nons; ~220 lines dark mode via .adm-overlay[data-theme=\"dark\"]\n  covering all modal components; atbl-th--device / atbl-cell--device column CSS\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): maximize button + dark mode for details modal; device co…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T02:19:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c29fa79ec67eb6af9c838c1309343bfcf6d48bdf",
          "body": "…IN_VIEW\n\n- ALARM controller: add 4th enrich layer nameMap.get(source) to resolve TB\n  entityNames like \"3F SCMOXUARAAC_EL1_L2\" → \"Elevador 1 L2\"\n- MAIN_VIEW: fix gcdrDeviceNameMap to use entityLabel||entityName (was reversed),\n  add short code \"gcdr:<first8>\" indexing for old alarm sources,\n  build new entityNameToLabelMap from ALL datasource rows (entityName→entityLabel)\n- Log line now shows nameMap size for debugging\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): four-layer source enrichment + entityNameToLabelMap in MA…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:59:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa79e1c3a82eab50dd7113fe7a1dae4fcc8f44a2",
          "body": "… centralId\n\nTimeline:\n- Value pill now inline inside adm-timeline-num span (not flex row) — avoids\n  ThingsBoard div CSS override breaking layout\n- Pill shown only on most-recent occurrence; synthetic occurrences don't have\n  individual values so showing it on every line was misleading\n\nEnrich (RFC\n[…]\n datakey config needed.\n  Priority: gcdrMap(source) → gcdrMap(centralId) → stateMap(centralId)\n- Remove adm-timeline-row CSS (no longer used)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarms): timeline value pill inline+once, enrich via window.STATE…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:44:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0acb454d27862c5c78eb8d85c9b9046f56299d9e",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.402",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:27:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c44401f0eee11bb61bfe7022620bb9b4da0aa7b",
          "body": "…eNameMap\n\nEach alarm device has a unique centralId UUID that matches keys already in\ngcdrDeviceNameMap. When alarm.source is a numeric localId (e.g. \"188\") with\nno deviceName from the API, fall back to gcdrMap.get(alarm.centralId) to\nresolve the TB device name.\n\n- Alarm type: add centralId field\n- AlarmService: map api.centralId into alarm object\n- ALARM controller: enrich with gcdrMap.get(source) || (numeric? gcdrMap.get(centralId))\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarms): enrich numeric localId source via centralId in gcdrDevic…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:26:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f894550bce638f166979c16d2a271f1976ec2bc5",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.401",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:01:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc6498ba4b7c5690fbc6d8ef19633fb8dcc44243",
          "body": "…h2→div\n\n- AlarmDetailsModal: h2 → div.adm-title to avoid ThingsBoard CSS override\n- AlarmDetailsModal: timeline value as inline pill next to occurrence number; device label only shown for single-device alarms\n- AlarmDashboard: rewrite renderTrendChart with dual series (total blue + critical red), s\n[…]\nine-row, adm-timeline-value-pill, alarms-trend-wrap, alarms-trend-legend\n- clean-log.ps1: add pattern to remove \"@ unknown\" stack trace lines\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarms): timeline inline layout, dual-series trend chart, header …",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T01:00:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f5a8803f6f5ed22ed484fa9765874fbe6f53ed84",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.400",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T00:14:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "632f36a21f26de9ff19cdacffe94a1ecfd8a9bd4",
          "body": "- AlarmService: prefer api.deviceId (full UUID) over api.deviceName as alarm.source so gcdrDeviceNameMap lookup matches correctly (was using short \"gcdr:xxxx\" form)\n- Alarm type: add triggerValue field mapped from api.metadata.value\n- AlarmDetailsModal: show originating device and trigger value in e\n[…]\ne occurrence\n- AlarmDetailsModal: remove Tags section (alarmType/deviceType)\n- styles: add CSS for adm-timeline-device and adm-timeline-value\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarms): fix gcdrId match + add device/value to timeline",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-24T00:13:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "511d9cea126250e485f66a46ce50d3a4bd40d0ca",
          "body": "types.ts:\n- CreateDeviceDto: add optional slaveId, centralId, identifier fields\n- TBServerScopeAttrs: explicitly type slaveId, centralId, identifier\n\nentityMappers.ts:\n- mapDeviceToGCDR: populate slaveId, centralId, identifier from TB\n  SERVER_SCOPE attrs when present; no-op when absent\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(gcdr-sync): include slaveId, centralId, identifier in device DTO",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T21:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "09bc43cabaa80cad3428345897a0bcb9e32bf4aa",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.399",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T20:10:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9998d70ca446f8a9fadd38305aeeec9571b4f14b",
          "body": "…trator\n\nMAIN_VIEW/controller.js:\n- onDataUpdated scans all datasource rows for 'gcdrDeviceId' attribute key\n- Builds/updates Map<gcdrDeviceId → TB entityName> on MyIOOrchestrator.gcdrDeviceNameMap\n- Zero extra API calls — uses device attributes already in the TB datasource\n\nALARM/controller.js:\n- _\n[…]\nreates new alarm objects (spread) to avoid mutating AlarmService cache\n- Graceful fallback: if map is empty, rawAlarms pass through unchanged\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): RFC-0179 device name enrich via gcdrDeviceNameMap orches…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T20:09:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b94ce4b952540edf1008ab91674eefbdbe83fae6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.398",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:43:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6edae6c0ebbcd3f262e9e24b20d74b8b0dbd154f",
          "body": "… label\n\n- ALARM/styles.css: flex: 1 1 0% on alarm-panel-container (was 1 1 auto) so\n  height is flex-allocated rather than content-based, enabling scroll in separado mode\n- styles.ts: afm-overlay position: fixed (was absolute) so filter modal is no\n  longer clipped by overflow:hidden on the panel w\n[…]\nkeeping element for JS compat\n- AlarmDetailsModal: rename matrix header \"Ocorrência\" → \"ID\"\n- responseAlarmsApi.json: updated real API sample\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm-panel): scroll, filter modal clipping, badge hidden, matrix…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:43:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c4748d09254fa419ccb4468096343af5f57cfa7",
          "body": "…raw records\n\nPreviously explodeAlarmsByDevice was a passthrough for single-device alarms,\nshowing one card per raw API record. Now groups by (source, title) pair,\naggregating occurrenceCount, firstOccurrence, lastOccurrence, severity and\nstate — same pattern as groupAlarmsByTitle but keyed on device+title.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm-panel): separado mode groups by (device, title) instead of …",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:18:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eff3e9b0b1e85d1eece9e98c42fcf8ccfb08b58b",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.397",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:06:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c8b8ee5bbd2b0eb40322c4ff146b5f0e185db0d",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.396",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:05:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ed5aa9bbd5d562686e4b605ee06e305e725c7e3",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm-bundle-map): increase modal width by 25% (620px → 775px)",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:04:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "722f813331bdb18a5b5b2a1467fc6ec24db027c8",
          "body": "…t RFC\n\n- AlarmService: map lastUpdatedAt, silencedUntil, dispatchCount, deviceName from real API fields; normalize empty strings to undefined\n- types.ts: add real API field aliases (lastUpdatedAt, silencedUntil, dispatchCount, deviceName)\n- AlarmsNotificationsPanelView: groupAlarmsByTitle source us\n[…]\n responseAlarmsApi.json (real API response sample for reference)\n- Add RFC-0179: Alarm Device Name Enrichment (GCDR vs TB enrichment options)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): real API field mapping, modal bugs, device name enrichmen…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T19:02:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b16bfe39dc36cfa03d1b89a6e6c62b4ccb65c9b0",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.395",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:23:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4382720278e74ab5dc84e69718ca5f80d4bddaf",
          "body": "…o ALARM widget\n\n- ALARM/settingsSchema.json: remove alarmsApiBaseUrl and alarmsApiKey\n- MAIN_VIEW/settingsSchema.json: add alarmsApiKey with default value\n- MAIN_VIEW/controller.js: expose alarmsApiKey via window.MyIOOrchestrator\n- ALARM/controller.js: read both credentials from window.MyIOOrchestrator only\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): move API credentials to MAIN_VIEW — orchestrator passes t…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:22:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1ba1f19ba5850889bfd971bf5129a7e6ec054bf0",
          "body": "MAIN_VIEW controller now exposes alarmsApiKey on window.MyIOOrchestrator\nso ALARM widget receives it before _fetchAndUpdate runs.\nAdds alarmsApiKey to MAIN_VIEW settingsSchema with default value.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): pass alarmsApiKey via MAIN_VIEW orchestrator to fix 401",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:14:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "879af86b207df176c873a63ca4a505b126a297b4",
          "body": "…onent\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(showcase): pass alarmsApiBaseUrl and alarmsApiKey to panel comp…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:04:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e1bf054706db26c87e24efc60ce2760952c29d0f",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.394",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e66e240b3d9a8576e0e53b634be78aad4e1795ab",
          "body": "… component params\n\n- AlarmApiClient: remove hardcoded ALARMS_BASE_URL and API_KEY constants\n- AlarmService.configure(): accepts apiKey as third param, passes to client\n- AlarmsNotificationsPanelParams: add alarmsApiBaseUrl and alarmsApiKey fields\n- AlarmsNotificationsPanelController: calls AlarmSer\n[…]\ns: passes alarmsApiBaseUrl/Key to createAlarmsNotificationsPanelComponent\n- ALARM settingsSchema.json: add alarmsApiBaseUrl/Key with defaults\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): remove hardcoded API credentials — flow from settings via…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T18:02:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fbb2ecca65a12d7f962332a0619c5be382d2210f",
          "body": "Prevents infinite requests if API always returns hasMore:true.\nLoop now runs exactly totalPages times (e.g. 3 pages for 257 records).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): use totalPages instead of hasMore for pagination loop",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:49:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4e93c93937bef831541f643d0889a1f57e8ae2a",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.393",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:40:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a473882180d5cb32a5262cda0f6f903ed5d463e",
          "body": "…he TTL)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): align refreshIntervalSeconds default to 180s (matches cac…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:40:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "473d02e136af7346c844f68b5c3f505e07f4d764",
          "body": "…gurable from settings\n\n- Add _debouncedFetchAndUpdate() to collapse rapid consecutive fetch triggers\n- alarm-filter-change and alarm-content-activated handlers now debounce (300-400ms)\n- AlarmService.configure() accepts optional cacheTtlMs; always called on onInit\n- Cache TTL default 3 min (class) and settable via settings.cacheIntervalSeconds (default 180s)\n- Add cacheIntervalSeconds to settingsSchema.json\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): debounce event-triggered fetches and make cache TTL confi…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:39:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6f44aa00debd70428152683f0ff7489664e5b7da",
          "body": "…ture list\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(showcase): update alarm panel demo with batch callbacks and fea…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:30:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8a8f742dbc2099f0fd2fcb91f3ddc769e04a43b6",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.392",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4740a9228464d60c918faf2cac5455ab3123b85",
          "body": "…lag, card title wrap, badge fix\n\n- AlarmService.getAlarms: auto-paginate until hasMore=false (page loop)\n- AlarmApiClient: send page param, default limit 100\n- types: AlarmListParams adds page?; AlarmBatchResult/Failure types\n- settingsSchema: maxAlarmsVisible default 100, title clarified as page s\n[…]\nfrom state.allAlarms directly (no API summary dependency)\n- btnAlarmBundleMap + badge: margin-left auto→16px (shifted left, adjacent to tabs)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): auto-pagination, separado device badge, table customer f…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T17:24:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd65f19207ac0a317eea2fb043a86d7980b1b9c0",
          "body": "…uard\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): set maxAlarmsVisible default to 100 and remove Math.max g…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T16:55:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "484af2d31a888edca5690761471d6ca443c5e7bc",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.391",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T16:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3721562da8419be30683a9d0c0128f1c5a654a03",
          "body": "…limit fix\n\n- RFC-0152: add Consolidado/Separado group mode toggle to alarms list header\n  - Consolidado (default): groups same-title alarms into one card/row\n  - Separado: explodes alarms by device (compound ID uuid__DEVICE per pair)\n  - stripSeparadoId() strips suffix before backend calls\n- Batch \n[…]\nh (+5%)\n- Limit fix: Math.max(maxAlarmsVisible ?? 500, 500) — enforces minimum 500\n  even when TB widget settings still holds old value of 50\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): consolidado/separado toggle, batch actions, modal size, …",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T16:45:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f36ff5b4f10de4d1acddeede219525a8235672c0",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.390",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T16:14:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9754b0a6de7a8ece31efe77cbe7083c313093d5b",
          "body": "…ation response\n\nAlarmDetailsModal: remove ellipsis \"X ocorrências intermediárias\" da\ntimeline e da matrix; exibe até 30 itens com scroll interno.\nstyles: max-height + overflow-y auto em .adm-timeline, .adm-devices-list\ne .adm-matrix; sticky header na matrix.\n\nAlarmApiClient: limit default 500, remo\n[…]\nstApiResponse.pagination recebe total+totalPages+hasMore;\nremove cursor de AlarmListParams.\nALARM widget e MAIN_UNIQUE_DATASOURCE: limit 500.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): scroll interno nas seções de detalhes + limit 500 + pagin…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T16:13:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd6e93d8b51274146f846f38dc7580cd657b66a4",
          "body": "…ck bug)\n\nModal overlay: align-items/justify-content center instead of flex-end.\nChips: replaced <label>+<input> with <div> — clicking a label wrapping a\nhidden checkbox fired two click events (label + browser-activated input),\ncausing classList.toggle to run twice and cancel the selection.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(alarm): center filter modal and fix chip toggle (label double-cli…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T15:56:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "07171998bd9c2d5ce066d40884d5290248feaa27",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.389",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T15:52:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39064e1d9ad1ee67109a6bcdf6721d251a8a9b3a",
          "body": "…/type/device)\n\nReplace inline severity/state selects with a Filtros button that opens a\nchip-style multiselect modal. Adds alarmType and devices filter fields to\nAlarmFilters; extracts devices from alarm.source. Also fixes generateBuckets\nNaN guard on invalid dates.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(alarm): RFC-0152 — filter modal with multiselect (severity/state…",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T15:51:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6ad94f625b74376a4bd3e4a5b772a13b06d63f87",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.1.388",
          "author_name": "Rodrigo Lago",
          "author_login": "rplago",
          "committed_at": "2026-02-23T14:42:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 1,
      "commits_last_year": 1727,
      "latest_release_at": "2025-08-27T04:16:43Z",
      "latest_release_tag": "v0.1.1",
      "releases_from_tags": true,
      "days_since_last_push": 1,
      "active_weeks_last_year": 27,
      "days_since_latest_release": 329,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": true,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "myio-js-library",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/myio-js-library",
          "is_deprecated": false,
          "latest_version": "0.1.527",
          "repository_url": "https://github.com/gh-myio/myio-js-library",
          "versions_count": 589,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 8091,
          "first_published_at": "2025-08-27T01:24:15.953000Z",
          "latest_published_at": "2026-07-17T19:28:10.954000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 7
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "demos",
        "examples",
        "sample"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 352171,
      "source_files_sampled": 640,
      "oversized_source_files": 50,
      "agent_instruction_files": [
        ".claude/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 11182
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 7,
        "merged_prs": 92,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 8
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "rplago",
          "commits": 1647,
          "avatar_url": "https://avatars.githubusercontent.com/u/63605757?v=4"
        },
        {
          "type": "User",
          "login": "victorhjoe",
          "commits": 73,
          "avatar_url": "https://avatars.githubusercontent.com/u/43349527?v=4"
        },
        {
          "type": "User",
          "login": "BrunoCardeman",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/167805790?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.955
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 5,
            "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": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "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": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "30 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "535836099e145657750823f592d38a0a7ae39deb",
        "ran_at": "2026-07-23T01:49:39Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-02-27T18:24:21Z",
      "oldest_open_prs": [
        {
          "number": 36,
          "created_at": "2026-01-23T13:40:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 85,
          "created_at": "2026-06-08T21:12:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 101,
          "created_at": "2026-06-30T21:22:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 103,
          "created_at": "2026-07-03T17:29:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 104,
          "created_at": "2026-07-08T20:07:53Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 105,
          "created_at": "2026-07-10T18:23:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 107,
          "created_at": "2026-07-16T20:36:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-14T19:46:13Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/gh-myio/myio-js-library",
    "host": "github.com",
    "name": "myio-js-library",
    "owner": "gh-myio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 51,
      "inputs": {
        "security": 28,
        "vitality": 64,
        "community": 41,
        "governance": 51,
        "engineering": 64
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 64,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "commits_last_year": 1727,
              "human_commit_share": 1,
              "days_since_last_push": 1,
              "active_weeks_last_year": 27
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "27/52 weeks with commits",
                "points": 18.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 27
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1727 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1727
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v0.1.1",
              "releases_from_tags": true,
              "days_since_latest_release": 329,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 329 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 329
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 145,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 145 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 145
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 41,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 65,
            "inputs": {
              "packages": [
                "myio-js-library"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 8091
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "8,091 downloads/month across npm",
                "points": 52.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 8091,
                      "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": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 14,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.955
            },
            "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 96% of commits",
                "points": 1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "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": 66,
            "inputs": {
              "merged_prs": 92,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 8
            },
            "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": "92/100 decided PRs merged",
                "points": 35.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 92,
                      "decided": 100
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "gh-myio",
              "public_repos": 4,
              "account_age_days": 682
            },
            "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": "1 followers of gh-myio",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "gh-myio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "4 public repos, account ~1 yr old",
                "points": 8.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 4
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "myio-js-library"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "589 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 589
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 64,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 28,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "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 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "30 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 69,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.67,
              "agent_instruction_files": [
                ".claude/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 11182
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".claude/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".claude/CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 35.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.39,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, 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": "39 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 39,
                      "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 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 352171,
              "source_files_sampled": 640,
              "oversized_source_files": 50
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript with type-check config (src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "src/myio-report-ui-seed/original/myio-report-ui/tsconfig.json, tsconfig.json",
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "50/640 source files over 60KB",
                "points": 50.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 640,
                      "oversized": 50
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "demos",
                "examples",
                "sample"
              ],
              "has_mcp_signal": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "demos, examples, sample",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "demos, examples, sample"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:myio-js-library@0.1.527; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T01:49:46.786876Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/gh-myio/myio-js-library.svg",
  "full_name": "gh-myio/myio-js-library",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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