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

etamong-playground / ui

Shared React UI toolkit — design tokens, cmdk command palette, responsive viewport, theming, PWA shell.

TypeScript · CSSMIT★ 0 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

etamong-playground/ui tiene un índice de salud de 58 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (75/100) y la más baja, Community & Adoption (34/100). Se actualizó por última vez hace 3 días. Una sola persona concentra la mayor parte del trabajo reciente.

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

58
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

etamong playgroundOrganización
2 seguidores13 repositorios públicosdesde jun 2026

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
npm@etamong-playground/ui0.41.0220410hace 5 días

Métricas por categoría

Vitalidad

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

75Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 3 días
4.2/36Cadencia de commits — 6/52 semanas con commits
18/18Volumen de commits — 158 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year158
human_commit_share0,71
days_since_last_push3
active_weeks_last_year6
Cómo se puntúa
27/27Publica versiones — 14 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~1,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count14
latest_release_tagv0.41.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases1,3
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?

34En 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)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
44.6/80Descargas mensuales — 2204 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@etamong-playground/ui
dependents
ecosystemsnpm
total_downloads
monthly_downloads2204
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?

53Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
37.2/38.3Aceptación de PR — 35/36 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/15 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs35
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
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
3.4/25Alcance del propietario — 2 seguidores de etamong-playground
8.5/25Trayectoria — 13 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers2
owner_typeOrganization
is_verified
owner_loginetamong-playground
public_repos13
account_age_days33
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 — 10 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@etamong-playground/ui
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 28 out of 28 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 5 topics
0/10Wiki
Datos de entrada utilizados
topicsdesign-system, pwa, react, typescript, ui-components
has_wikino
homepage
has_readme
has_docs_dir
has_description

Seguridad

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

56Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 28 out of 28 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/15 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,5
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages27
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@etamong-playground/ui@0.41.0 —lo que arrastra la instalación del paquete publicado—: 27 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

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

56Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 67 de 71 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,944
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — showcase/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
8/8Mantenimiento automatizado — 2 de los últimos 100 commits son actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilespnpm-lock.yaml
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configsshowcase/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,02
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/76 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes18.376
source_files_sampled76
oversized_source_files0

Datos clave

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

Más detalle

OpenSSF Scorecard 4.5 / 10
4.5agregado

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 22:55 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests28 out of 28 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/15 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
4Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 5
RegistroPaqueteRestricción de versiónManifiesto
npmcmdk^1.1.1package.json
npmes-hangul2.4.0package.json
npm@etamong-playground/uiworkspace:*showcase/package.json
npmreact^18.3.1showcase/package.json
npmreact-dom^18.3.1showcase/package.json
Todas las dependencias 439

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 6 paquetes directos y 433 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
npmcmdk1.1.1directa
npmes-hangul2.4.0directa
npmreact18.3.1directa
npmreact^18.3.1directa
npmreact-dom18.3.1directa
npmreact-dom^18.3.1directa
npm@ampproject/remapping2.3.0indirecta
npm@asamuzakjp/css-color3.2.0indirecta
npm@babel/code-frame7.29.7indirecta
npm@babel/compat-data7.29.7indirecta
npm@babel/core7.29.7indirecta
npm@babel/generator7.29.7indirecta
npm@babel/helper-compilation-targets7.29.7indirecta
npm@babel/helper-globals7.29.7indirecta
npm@babel/helper-module-imports7.29.7indirecta
npm@babel/helper-module-transforms7.29.7indirecta
npm@babel/helper-plugin-utils7.29.7indirecta
npm@babel/helper-string-parser7.29.7indirecta
npm@babel/helper-validator-identifier7.29.7indirecta
npm@babel/helper-validator-option7.29.7indirecta
npm@babel/helpers7.29.7indirecta
npm@babel/parser7.29.7indirecta
npm@babel/plugin-transform-react-jsx-self7.29.7indirecta
npm@babel/plugin-transform-react-jsx-source7.29.7indirecta
npm@babel/runtime7.29.7indirecta
npm@babel/template7.29.7indirecta
npm@babel/traverse7.29.7indirecta
npm@babel/types7.29.7indirecta
npm@bcoe/v8-coverage0.2.3indirecta
npm@csstools/color-helpers5.1.0indirecta
npm@csstools/css-calc2.1.4indirecta
npm@csstools/css-color-parser3.1.0indirecta
npm@csstools/css-parser-algorithms3.0.5indirecta
npm@csstools/css-tokenizer3.0.4indirecta
npm@esbuild/aix-ppc640.25.12indirecta
npm@esbuild/aix-ppc640.27.7indirecta
npm@esbuild/android-arm0.25.12indirecta
npm@esbuild/android-arm0.27.7indirecta
npm@esbuild/android-arm640.25.12indirecta
npm@esbuild/android-arm640.27.7indirecta
npm@esbuild/android-x640.25.12indirecta
npm@esbuild/android-x640.27.7indirecta
npm@esbuild/darwin-arm640.25.12indirecta
npm@esbuild/darwin-arm640.27.7indirecta
npm@esbuild/darwin-x640.25.12indirecta
npm@esbuild/darwin-x640.27.7indirecta
npm@esbuild/freebsd-arm640.25.12indirecta
npm@esbuild/freebsd-arm640.27.7indirecta
npm@esbuild/freebsd-x640.25.12indirecta
npm@esbuild/freebsd-x640.27.7indirecta
npm@esbuild/linux-arm0.25.12indirecta
npm@esbuild/linux-arm0.27.7indirecta
npm@esbuild/linux-arm640.25.12indirecta
npm@esbuild/linux-arm640.27.7indirecta
npm@esbuild/linux-ia320.25.12indirecta
npm@esbuild/linux-ia320.27.7indirecta
npm@esbuild/linux-loong640.25.12indirecta
npm@esbuild/linux-loong640.27.7indirecta
npm@esbuild/linux-mips64el0.25.12indirecta
npm@esbuild/linux-mips64el0.27.7indirecta
npm@esbuild/linux-ppc640.25.12indirecta
npm@esbuild/linux-ppc640.27.7indirecta
npm@esbuild/linux-riscv640.25.12indirecta
npm@esbuild/linux-riscv640.27.7indirecta
npm@esbuild/linux-s390x0.25.12indirecta
npm@esbuild/linux-s390x0.27.7indirecta
npm@esbuild/linux-x640.25.12indirecta
npm@esbuild/linux-x640.27.7indirecta
npm@esbuild/netbsd-arm640.25.12indirecta
npm@esbuild/netbsd-arm640.27.7indirecta
npm@esbuild/netbsd-x640.25.12indirecta
npm@esbuild/netbsd-x640.27.7indirecta
npm@esbuild/openbsd-arm640.25.12indirecta
npm@esbuild/openbsd-arm640.27.7indirecta
npm@esbuild/openbsd-x640.25.12indirecta
npm@esbuild/openbsd-x640.27.7indirecta
npm@esbuild/openharmony-arm640.25.12indirecta
npm@esbuild/openharmony-arm640.27.7indirecta
npm@esbuild/sunos-x640.25.12indirecta
npm@esbuild/sunos-x640.27.7indirecta
npm@esbuild/win32-arm640.25.12indirecta
npm@esbuild/win32-arm640.27.7indirecta
npm@esbuild/win32-ia320.25.12indirecta
npm@esbuild/win32-ia320.27.7indirecta
npm@esbuild/win32-x640.25.12indirecta
npm@esbuild/win32-x640.27.7indirecta
npm@inquirer/ansi2.0.7indirecta
npm@inquirer/confirm6.1.1indirecta
npm@inquirer/core11.2.1indirecta
npm@inquirer/figures2.0.7indirecta
npm@inquirer/type4.0.7indirecta
npm@isaacs/cliui8.0.2indirecta
npm@istanbuljs/schema0.1.6indirecta
npm@jridgewell/gen-mapping0.3.13indirecta
npm@jridgewell/remapping2.3.5indirecta
npm@jridgewell/resolve-uri3.1.2indirecta
npm@jridgewell/sourcemap-codec1.5.5indirecta
npm@jridgewell/trace-mapping0.3.31indirecta
npm@mswjs/interceptors0.41.9indirecta
npm@open-draft/deferred-promise2.2.0indirecta
npm@open-draft/deferred-promise3.0.0indirecta
npm@open-draft/logger0.3.0indirecta
npm@open-draft/until2.1.0indirecta
npm@pkgjs/parseargs0.11.0indirecta
npm@playwright/test1.60.0indirecta
npm@radix-ui/primitive1.1.4indirecta
npm@radix-ui/react-compose-refs1.1.3indirecta
npm@radix-ui/react-context1.1.4indirecta
npm@radix-ui/react-dialog1.1.16indirecta
npm@radix-ui/react-dismissable-layer1.1.12indirecta
npm@radix-ui/react-focus-guards1.1.4indirecta
npm@radix-ui/react-focus-scope1.1.9indirecta
npm@radix-ui/react-id1.1.2indirecta
npm@radix-ui/react-portal1.1.11indirecta
npm@radix-ui/react-presence1.1.6indirecta
npm@radix-ui/react-primitive2.1.5indirecta
npm@radix-ui/react-slot1.2.5indirecta
npm@radix-ui/react-use-callback-ref1.1.2indirecta
npm@radix-ui/react-use-controllable-state1.2.3indirecta
npm@radix-ui/react-use-effect-event0.0.3indirecta
npm@radix-ui/react-use-escape-keydown1.1.2indirecta
npm@radix-ui/react-use-layout-effect1.1.2indirecta
npm@rolldown/pluginutils1.0.0-beta.27indirecta
npm@rollup/rollup-android-arm-eabi4.61.1indirecta
npm@rollup/rollup-android-arm-eabi4.62.2indirecta
npm@rollup/rollup-android-arm644.61.1indirecta
npm@rollup/rollup-android-arm644.62.2indirecta
npm@rollup/rollup-darwin-arm644.61.1indirecta
npm@rollup/rollup-darwin-arm644.62.2indirecta
npm@rollup/rollup-darwin-x644.61.1indirecta
npm@rollup/rollup-darwin-x644.62.2indirecta
npm@rollup/rollup-freebsd-arm644.61.1indirecta
npm@rollup/rollup-freebsd-arm644.62.2indirecta
npm@rollup/rollup-freebsd-x644.61.1indirecta
npm@rollup/rollup-freebsd-x644.62.2indirecta
npm@rollup/rollup-linux-arm-gnueabihf4.61.1indirecta
npm@rollup/rollup-linux-arm-gnueabihf4.62.2indirecta
npm@rollup/rollup-linux-arm-musleabihf4.61.1indirecta
npm@rollup/rollup-linux-arm-musleabihf4.62.2indirecta
npm@rollup/rollup-linux-arm64-gnu4.61.1indirecta
npm@rollup/rollup-linux-arm64-gnu4.62.2indirecta
npm@rollup/rollup-linux-arm64-musl4.61.1indirecta
npm@rollup/rollup-linux-arm64-musl4.62.2indirecta
npm@rollup/rollup-linux-loong64-gnu4.61.1indirecta
npm@rollup/rollup-linux-loong64-gnu4.62.2indirecta
npm@rollup/rollup-linux-loong64-musl4.61.1indirecta
npm@rollup/rollup-linux-loong64-musl4.62.2indirecta
npm@rollup/rollup-linux-ppc64-gnu4.61.1indirecta
npm@rollup/rollup-linux-ppc64-gnu4.62.2indirecta
npm@rollup/rollup-linux-ppc64-musl4.61.1indirecta
npm@rollup/rollup-linux-ppc64-musl4.62.2indirecta
npm@rollup/rollup-linux-riscv64-gnu4.61.1indirecta
npm@rollup/rollup-linux-riscv64-gnu4.62.2indirecta
npm@rollup/rollup-linux-riscv64-musl4.61.1indirecta
npm@rollup/rollup-linux-riscv64-musl4.62.2indirecta
npm@rollup/rollup-linux-s390x-gnu4.61.1indirecta
npm@rollup/rollup-linux-s390x-gnu4.62.2indirecta
npm@rollup/rollup-linux-x64-gnu4.61.1indirecta
npm@rollup/rollup-linux-x64-gnu4.62.2indirecta
npm@rollup/rollup-linux-x64-musl4.61.1indirecta
npm@rollup/rollup-linux-x64-musl4.62.2indirecta
npm@rollup/rollup-openbsd-x644.61.1indirecta
npm@rollup/rollup-openbsd-x644.62.2indirecta
npm@rollup/rollup-openharmony-arm644.61.1indirecta
npm@rollup/rollup-openharmony-arm644.62.2indirecta
npm@rollup/rollup-win32-arm64-msvc4.61.1indirecta
npm@rollup/rollup-win32-arm64-msvc4.62.2indirecta
npm@rollup/rollup-win32-ia32-msvc4.61.1indirecta
npm@rollup/rollup-win32-ia32-msvc4.62.2indirecta
npm@rollup/rollup-win32-x64-gnu4.61.1indirecta
npm@rollup/rollup-win32-x64-gnu4.62.2indirecta
npm@rollup/rollup-win32-x64-msvc4.61.1indirecta
npm@rollup/rollup-win32-x64-msvc4.62.2indirecta
npm@testing-library/dom10.4.1indirecta
npm@testing-library/react16.3.2indirecta
npm@types/aria-query5.0.4indirecta
npm@types/babel__core7.20.5indirecta
npm@types/babel__generator7.27.0indirecta
npm@types/babel__template7.4.4indirecta
npm@types/babel__traverse7.28.0indirecta
npm@types/chai5.2.3indirecta
npm@types/deep-eql4.0.2indirecta
npm@types/estree1.0.9indirecta
npm@types/node25.9.3indirecta
npm@types/prop-types15.7.15indirecta
npm@types/react18.3.31indirecta
npm@types/react^18.3.12indirecta
npm@types/react-dom18.3.7indirecta
npm@types/react-dom^18.3.0indirecta
npm@types/set-cookie-parser2.4.10indirecta
npm@types/statuses2.0.6indirecta
npm@vitejs/plugin-react4.7.0indirecta
npm@vitejs/plugin-react^4.3.4indirecta
npm@vitest/coverage-v82.1.9indirecta
npm@vitest/expect3.2.6indirecta
npm@vitest/mocker3.2.6indirecta
npm@vitest/pretty-format3.2.6indirecta
npm@vitest/runner3.2.6indirecta
npm@vitest/snapshot3.2.6indirecta
npm@vitest/spy3.2.6indirecta
npm@vitest/utils3.2.6indirecta
npmacorn8.16.0indirecta
npmagent-base7.1.4indirecta
npmansi-regex5.0.1indirecta
npmansi-regex6.2.2indirecta
npmansi-styles4.3.0indirecta
npmansi-styles5.2.0indirecta
npmansi-styles6.2.3indirecta
npmany-promise1.3.0indirecta
npmaria-hidden1.2.6indirecta
npmaria-query5.3.0indirecta
npmassertion-error2.0.1indirecta
npmasynckit0.4.0indirecta
npmbalanced-match1.0.2indirecta
npmbalanced-match4.0.4indirecta
npmbaseline-browser-mapping2.10.41indirecta
npmbrace-expansion2.1.1indirecta
npmbrace-expansion5.0.6indirecta
npmbrowserslist4.28.4indirecta
npmbundle-require5.1.0indirecta
npmcac6.7.14indirecta
npmcall-bind-apply-helpers1.0.2indirecta
npmcaniuse-lite1.0.30001800indirecta
npmchai5.3.3indirecta
npmcheck-error2.1.3indirecta
npmchokidar4.0.3indirecta
npmcli-width4.1.0indirecta
npmcliui8.0.1indirecta
npmcolor-convert2.0.1indirecta
npmcolor-name1.1.4indirecta
npmcombined-stream1.0.8indirecta
npmcommander4.1.1indirecta
npmconfbox0.1.8indirecta
npmconsola3.4.2indirecta
npmconvert-source-map2.0.0indirecta
npmcookie1.1.1indirecta
npmcross-spawn7.0.6indirecta
npmcssstyle4.6.0indirecta
npmcsstype3.2.3indirecta
npmdata-urls5.0.0indirecta
npmdebug4.4.3indirecta
npmdecimal.js10.6.0indirecta
npmdeep-eql5.0.2indirecta
npmdelayed-stream1.0.0indirecta
npmdequal2.0.3indirecta
npmdetect-node-es1.1.0indirecta
npmdom-accessibility-api0.5.16indirecta
npmdunder-proto1.0.1indirecta
npmeastasianwidth0.2.0indirecta
npmelectron-to-chromium1.5.386indirecta
npmemoji-regex8.0.0indirecta
npmemoji-regex9.2.2indirecta
npmentities6.0.1indirecta
npmes-define-property1.0.1indirecta
npmes-errors1.3.0indirecta
npmes-module-lexer1.7.0indirecta
npmes-object-atoms1.1.2indirecta
npmes-set-tostringtag2.1.0indirecta
npmesbuild0.25.12indirecta
npmesbuild0.27.7indirecta
npmescalade3.2.0indirecta
npmestree-walker3.0.3indirecta
npmexpect-type1.4.0indirecta
npmfast-string-truncated-width3.0.3indirecta
npmfast-string-width3.0.2indirecta
npmfast-wrap-ansi0.2.2indirecta
npmfdir6.5.0indirecta
npmfix-dts-default-cjs-exports1.0.1indirecta
npmforeground-child3.3.1indirecta
npmform-data4.0.6indirecta
npmfsevents2.3.2indirecta
npmfsevents2.3.3indirecta
npmfunction-bind1.1.2indirecta
npmgensync1.0.0-beta.2indirecta
npmget-caller-file2.0.5indirecta
npmget-intrinsic1.3.0indirecta
npmget-nonce1.0.1indirecta
npmget-proto1.0.1indirecta
npmglob10.5.0indirecta
npmgopd1.2.0indirecta
npmgraphql16.14.2indirecta
npmhas-flag4.0.0indirecta
npmhas-symbols1.1.0indirecta
npmhas-tostringtag1.0.2indirecta
npmhasown2.0.4indirecta
npmheaders-polyfill5.0.1indirecta
npmhtml-encoding-sniffer4.0.0indirecta
npmhtml-escaper2.0.2indirecta
npmhttp-proxy-agent7.0.2indirecta
npmhttps-proxy-agent7.0.6indirecta
npmiconv-lite0.6.3indirecta
npmis-fullwidth-code-point3.0.0indirecta
npmis-node-process1.2.0indirecta
npmis-potential-custom-element-name1.0.1indirecta
npmisexe2.0.0indirecta
npmistanbul-lib-coverage3.2.2indirecta
npmistanbul-lib-report3.0.1indirecta
npmistanbul-lib-source-maps5.0.6indirecta
npmistanbul-reports3.2.0indirecta
npmjackspeak3.4.3indirecta
npmjoycon3.1.1indirecta
npmjs-tokens4.0.0indirecta
npmjs-tokens9.0.1indirecta
npmjsdom25.0.1indirecta
npmjsesc3.1.0indirecta
npmjson52.2.3indirecta
npmlilconfig3.1.3indirecta
npmlines-and-columns1.2.4indirecta
npmload-tsconfig0.2.5indirecta
npmloose-envify1.4.0indirecta
npmloupe3.2.1indirecta
npmlru-cache10.4.3indirecta
npmlru-cache5.1.1indirecta
npmlz-string1.5.0indirecta
npmmagic-string0.30.21indirecta
npmmagicast0.3.5indirecta
npmmake-dir4.0.0indirecta
npmmath-intrinsics1.1.0indirecta
npmmime-db1.52.0indirecta
npmmime-types2.1.35indirecta
npmminimatch10.2.5indirecta
npmminimatch9.0.9indirecta
npmminipass7.1.3indirecta
npmmlly1.8.2indirecta
npmms2.1.3indirecta
npmmsw2.14.6indirecta
npmmute-stream3.0.0indirecta
npmmz2.7.0indirecta
npmnanoid3.3.15indirecta
npmnode-releases2.0.50indirecta
npmnwsapi2.2.24indirecta
npmobject-assign4.1.1indirecta
npmoutvariant1.4.3indirecta
npmpackage-json-from-dist1.0.1indirecta
npmparse57.3.0indirecta
npmpath-key3.1.1indirecta
npmpath-scurry1.11.1indirecta
npmpath-to-regexp6.3.0indirecta
npmpathe2.0.3indirecta
npmpathval2.0.1indirecta
npmpicocolors1.1.1indirecta
npmpicomatch4.0.4indirecta
npmpicomatch4.0.5indirecta
npmpirates4.0.7indirecta
npmpkg-types1.3.1indirecta
npmplaywright1.60.0indirecta
npmplaywright-core1.60.0indirecta
npmpostcss8.5.16indirecta
npmpostcss-load-config6.0.1indirecta
npmpretty-format27.5.1indirecta
npmpunycode2.3.1indirecta
npmreact-is17.0.2indirecta
npmreact-refresh0.17.0indirecta
npmreact-remove-scroll2.7.2indirecta
npmreact-remove-scroll-bar2.3.8indirecta
npmreact-style-singleton2.2.3indirecta
npmreaddirp4.1.2indirecta
npmrequire-directory2.1.1indirecta
npmresolve-from5.0.0indirecta
npmrettime0.11.11indirecta
npmrollup4.61.1indirecta
npmrollup4.62.2indirecta
npmrrweb-cssom0.7.1indirecta
npmrrweb-cssom0.8.0indirecta
npmsafer-buffer2.1.2indirecta
npmsaxes6.0.0indirecta
npmscheduler0.23.2indirecta
npmsemver6.3.1indirecta
npmsemver7.8.4indirecta
npmset-cookie-parser3.1.0indirecta
npmshebang-command2.0.0indirecta
npmshebang-regex3.0.0indirecta
npmsiginfo2.0.0indirecta
npmsignal-exit4.1.0indirecta
npmsource-map0.7.6indirecta
npmsource-map-js1.2.1indirecta
npmstackback0.0.2indirecta
npmstatuses2.0.2indirecta
npmstd-env3.10.0indirecta
npmstrict-event-emitter0.5.1indirecta
npmstring-width4.2.3indirecta
npmstring-width5.1.2indirecta
npmstrip-ansi6.0.1indirecta
npmstrip-ansi7.2.0indirecta
npmstrip-literal3.1.0indirecta
npmsucrase3.35.1indirecta
npmsupports-color7.2.0indirecta
npmsymbol-tree3.2.4indirecta
npmtagged-tag1.0.0indirecta
npmtest-exclude7.0.2indirecta
npmthenify3.3.1indirecta
npmthenify-all1.6.0indirecta
npmtinybench2.9.0indirecta
npmtinyexec0.3.2indirecta
npmtinyglobby0.2.17indirecta
npmtinypool1.1.1indirecta
npmtinyrainbow1.2.0indirecta
npmtinyrainbow2.0.0indirecta
npmtinyspy4.0.4indirecta
npmtldts6.1.86indirecta
npmtldts7.4.2indirecta
npmtldts-core6.1.86indirecta
npmtldts-core7.4.2indirecta
npmtough-cookie5.1.2indirecta
npmtough-cookie6.0.1indirecta
npmtr465.1.1indirecta
npmtree-kill1.2.2indirecta
npmts-interface-checker0.1.13indirecta
npmtslib2.8.1indirecta
npmtsup8.5.1indirecta
npmtype-fest5.7.0indirecta
npmtypescript5.9.3indirecta
npmtypescript^5.6.3indirecta
npmufo1.6.4indirecta
npmundici-types7.24.6indirecta
npmuntil-async3.0.2indirecta
npmupdate-browserslist-db1.2.3indirecta
npmuse-callback-ref1.3.3indirecta
npmuse-sidecar1.1.3indirecta
npmvite6.4.3indirecta
npmvite^6.4.3indirecta
npmvite-node3.2.4indirecta
npmvitest3.2.6indirecta
npmw3c-xmlserializer5.0.0indirecta
npmwebidl-conversions7.0.0indirecta
npmwhatwg-encoding3.1.1indirecta
npmwhatwg-mimetype4.0.0indirecta
npmwhatwg-url14.2.0indirecta
npmwhich2.0.2indirecta
npmwhy-is-node-running2.3.0indirecta
npmwrap-ansi7.0.0indirecta
npmwrap-ansi8.1.0indirecta
npmws8.21.0indirecta
npmxml-name-validator5.0.0indirecta
npmxmlchars2.2.0indirecta
npmy18n5.0.8indirecta
npmyallist3.1.1indirecta
npmyargs17.7.2indirecta
npmyargs-parser21.1.1indirecta
Avisos de dependencias 0

Instalar npm:@etamong-playground/ui@0.41.0 arrastra 27 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

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

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "design-system",
        "pwa",
        "react",
        "typescript",
        "ui-components"
      ],
      "is_fork": false,
      "size_kb": 431,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "CSS": 70848,
        "HTML": 1453,
        "TypeScript": 356717
      },
      "pushed_at": "2026-07-20T11:46:32Z",
      "created_at": "2026-06-20T11:17:13Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-20T11:40:35Z",
      "description": "Shared React UI toolkit — design tokens, cmdk command palette, responsive viewport, theming, PWA shell.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "CSS"
      ]
    },
    "owner": {
      "blog": "https://catalog.m.etamong.com",
      "name": "etamong playground",
      "type": "Organization",
      "login": "etamong-playground",
      "company": null,
      "location": "Korea, South",
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/295270411?v=4",
      "created_at": "2026-06-20T02:18:00Z",
      "is_verified": null,
      "public_repos": 13,
      "account_age_days": 33
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.41.0",
          "kind": "minor",
          "published_at": "2026-07-18T15:10:40Z"
        },
        {
          "tag": "v0.39.0",
          "kind": "minor",
          "published_at": "2026-07-13T06:41:11Z"
        },
        {
          "tag": "v0.38.2",
          "kind": "patch",
          "published_at": "2026-07-08T00:28:17Z"
        },
        {
          "tag": "v0.38.1",
          "kind": "patch",
          "published_at": "2026-07-06T13:49:28Z"
        },
        {
          "tag": "v0.38.0",
          "kind": "minor",
          "published_at": "2026-07-06T13:49:26Z"
        },
        {
          "tag": "v0.37.0",
          "kind": "minor",
          "published_at": "2026-07-06T13:49:25Z"
        },
        {
          "tag": "v0.36.0",
          "kind": "minor",
          "published_at": "2026-07-06T13:49:23Z"
        },
        {
          "tag": "v0.35.1",
          "kind": "patch",
          "published_at": "2026-07-06T13:49:22Z"
        },
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-07-06T13:49:20Z"
        },
        {
          "tag": "v0.34.3",
          "kind": "patch",
          "published_at": "2026-07-06T13:49:19Z"
        },
        {
          "tag": "v0.34.2",
          "kind": "patch",
          "published_at": "2026-06-26T23:57:38Z"
        },
        {
          "tag": "v0.34.1",
          "kind": "patch",
          "published_at": "2026-06-26T23:57:24Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-06-26T23:57:09Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-07-06T13:49:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "80aef6fd77d6fb733334e8b87c57bb2aaf6cacf4",
          "body": null,
          "is_bot": true,
          "headline": "docs(adr): add ADR link-stub pointing to planning",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-20T11:39:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecd991787dccff20fc9a664957e670eb514c6b5c",
          "body": "… docs/adr)",
          "is_bot": true,
          "headline": "chore: set @etamong-playground/admin as codeowner (planning=all, else…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-19T12:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d92dfeb3b8113fe51c8c6478e91c99d43cc791a3",
          "body": "styles.css deliberately paints only the library's own --etu-* components\nso it stays safe to import into any app; the flip side is every app must\nhand-wire the page shell, and forgetting it renders dark-mode text\ninvisible on the browser's default white body (ui#21). body.etu-page\ngives apps the sam\n[…]\n/color/font-family rule as a scoped\nopt-in class instead of a bare body {} rule.\n\nCloses etamong-playground/planning#835\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat: opt-in body.etu-page class for the page shell (v0.41.0) (#36)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-18T15:05:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b67774b5cecf905955e33457a20bebaa111758d",
          "body": "…k (#35)\n\nPlaywright ≥1.38 rejects a non-destructured first parameter (\"First argument\nmust use the object destructuring pattern\"), so the helper's `async (args) =>`\nthrew at registration — unusable by any consumer (they call assertViewportFit\ndirectly instead). Destructure `{ page }` (the only fixt\n[…]\nge }`. Adds e2e/viewport-fit-helper.spec.ts\nwhich registers + runs the helper as a regression guard. Fixes planning#970.\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix(testing): defineViewportFitTests uses a destructured test callbac…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-18T10:02:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9a096d28a948c73a408946d03281eac4aaee93e",
          "body": "…point (#34)\n\n- DialogHost: catch Escape/Enter on a document keydown listener while a\n  dialog is open, matching NotificationBell/Sidebar/UserMenu. uiConfirm()\n  never focuses the overlay, so the old div-scoped handler never fired;\n  drop it as dead. Adds dialog keyboard regression tests.\n- Toaster:\n[…]\nllapse breakpoint 768px -> 719px, aligning with the fleet\n  720px mobile/tablet boundary (sidebar/tab-bar/viewportCore).\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: dialog Escape/Enter, toaster safe-area lift, DocsHub 720px break…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-18T06:41:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fd700fab06ec7bd32a274863e9b56215645603a6",
          "body": "Add es-hangul (MIT, zero-dep) and layer choseong (initial-consonant)\nmatching onto the cmdk palette: typing \"ㅍㄹㅈㅌ\" finds \"프로젝트\".\n\n- koreanMatch() in keywords.ts: choseong-only queries match against\n  getChoseong(content); other queries stay plain substring, so a full\n  word (\"알림\") matches by text an\n[…]\nuntToHangul is\n  deprecated upstream, omitted).\n- vitest matcher + paletteFilter tests, Playwright choseong palette e2e.\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat: Korean choseong command-palette search + es-hangul josa (#33)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-18T05:19:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2b6978e259f04e38cffbef5d7f836bbe307015f",
          "body": "…n (#32)\n\nEmbedded WebViews (KakaoTalk / Instagram / Facebook / LINE / Naver) get\n403 disallowed_useragent from Google. fleetSignIn() (thus AuthGate,\nLoginButton, useIdentity().signIn) now tries to reopen the /auth/login\nURL in the system browser first — scheme redirect for KakaoTalk/LINE,\nChrome in\n[…]\n\nSFSafariViewController are valid OAuth surfaces). Also exported from\n/helpers for non-React callers.\n\nRefs planning#925\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat: inAppBreakout() — bounce in-app browsers out before Google logi…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-13T06:38:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e55cf2f08638a288185f2dd27eff5099e8978694",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: release v0.38.2 — refresh npm package description (#31)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-08T00:25:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3af5b769e66b3803248e9e84bc230074dd04d1fb",
          "body": "The description field rendered as a 967-char run-on on the GitHub\nPackages page. The full component inventory lives in the README's\n\"What's in the box\" section; the package description is now a concise\none-liner matching the sibling libs.\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "package.json: trim overlong npm description to a one-liner (#30)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-07T14:35:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ceb2f24d5b4aef8f15d4bdb408cdbe562f2bab7",
          "body": "Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.4.21 to 6.4.3.\n- [Release notes](https://github.com/vitejs/vite/releases)\n- [Changelog](https://github.com/vitejs/vite/blob/v6.4.3/packages/vite/CHANGELOG.md)\n- [Commits](https://github.com/vitejs/vite/commits/v6.4.3/package\n[…]\nndency-version: 6.4.3\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump vite from 5.4.21 to 6.4.3 (#23)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-06T12:28:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ba928a451971d8b89b547fb79e36549c6d62b35",
          "body": "…eploys (#29)\n\nThe hosting platform now watches main, builds the showcase in a sandboxed\njob, and deploys automatically (auto-sync) — no PAGES_TOKEN secret needed.\nci.yml keeps building the showcase on PRs.\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: drop the showcase deploy workflow — pages build-on-sync owns d…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T23:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f27ed27fcae40a2841e8485e882f9a829986b4a",
          "body": "- registry.ts: 21 showcased features with git-verified since-versions\n  and primary source paths\n- FeatureTag badge on every demo card: since vX.Y.Z (npmjs version page\n  when >=0.34.2, GitHub tag otherwise) + src (GitHub blob) + npm links\n- #/versions route: features grouped by introducing release, desc, with\n  demo jump links; sidebar/palette/g+v entries\n- e2e: versions view renders groups; since badge links out\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(showcase): per-feature version metadata + versions view (#28)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T11:03:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb308ad88405c8503f574b8919e06b6161f053b9",
          "body": "* fix: command palette not dismissed by overlay click (v0.36.1)\n\n.etu-cmdk-content was a full-screen inset-0 wrapper, so Radix saw every\nclick as inside the dialog and onPointerDownOutside never fired. The\nContent is now the centered panel itself; the overlay owns the backdrop.\n\n* test: Playwright e\n[…]\nnput overflow, toast, theme persistence, mobile tab bar.\nRuns in CI as a separate job via vite dev webServer.\n\n---------\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: palette overlay dismiss + Playwright e2e suite (v0.38.1) (#26)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T10:44:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6c4210602bcebf0d7a8002e53914560b141aa735",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(sidebar): ⌘/Ctrl+B toggles the rail (v0.38.0) (#27)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T03:12:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c5c18f3cf72682d22263bdb499e63737d88b89f",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: bump version to 0.37.0 (inline-collapsible rail) (#25)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T03:04:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76b5a2b262c902f81bc9c990f7d55df4a787423c",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(sidebar): rail becomes inline-collapsible at tablet+desktop (#22)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T02:56:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee180aaed2bdea0acef00416a5b4477d9d35ea8f",
          "body": "…t lib dist (#24)\n\n* fix: locale-aware dialog default labels; showcase typecheck without lib dist\n\n- uiConfirm/uiPrompt default buttons were hardcoded Cancel/OK — a Korean\n  dialog rendered mixed-language actions; defaults now follow <html lang>\n  (취소/확인 under ko), which I18nProvider/setLocale keep \n[…]\n passed\n  because pnpm build runs first\n\n* fix: dialog prompt input overflowed the modal (missing box-sizing)\n\n---------\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix: dialog i18n defaults + input overflow; showcase typecheck withou…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T02:27:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f46b63b38e16eb9caefb71309b59052b71cd1ac1",
          "body": "* feat: add component showcase app + pages deploy workflow\n\n- showcase/: Vite app dogfooding the library as its own shell\n  (Sidebar, NavigationBar, MobileTabBar, CommandPalette, theme, i18n)\n- deploys to the ui-showcase static site on push to main\n  (guarded: skips green until PAGES_TOKEN secret is\n[…]\nts-based classification), values re-read on theme toggle\n- README: document the app-side body wiring contract\n\n---------\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat: add component showcase app + pages deploy workflow (#21)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T01:44:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "113c0ed06655725952addb2f13dd6f3ee889575a",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(i18n): add LanguageSwitcher + legacy storageKey migration (#20)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-05T01:04:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04516091ac24a7bcf207e5c2359b5d9b620bb726",
          "body": "…ets npmjs (v0.35.1) (#19)\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix(publish): drop publishConfig.registry so the npmjs OIDC step targ…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-04T15:28:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc166398a3ecbf4fa7bd2a2c9d1765089d50a2ff",
          "body": "….0) (#18)\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(sidebar): rail expand toggle + icon labels at tablet tier (v0.35…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-04T14:51:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93995629678a893b0db9f0c4dd97de613948591b",
          "body": "…d gitlab registry) (#17)\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: rename package @etamong-playground/ui (drop @etamong-lab + dea…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-04T14:03:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8f87e9451d911b99126b7a5a8621ec771df7c74",
          "body": "GitLab is decommissioned (planning#757 verification sweep); CI is GitHub Actions.\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(ci): remove dead GitLab CI include snippet (#16)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-07-04T01:05:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52904c5fe117219c76b3f98d766056b56fe7c8e5",
          "body": "Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 2.1.9 to 3.2.6.\n- [Release notes](https://github.com/vitest-dev/vitest/releases)\n- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)\n- [Commits](https://github.com/vitest-dev/vitest/commits\n[…]\nndency-version: 3.2.6\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps-dev): bump vitest from 2.1.9 to 3.2.6 (#15)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-01T08:01:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c577aba694932810f749d7af2e3e9a7099c581b",
          "body": "…34.3 (#14)\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(publish): npmjs OIDC trusted publishing + repository field + v0.…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-06-27T00:01:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7642cd267ae8df660a2604a3d15f4686144e9c96",
          "body": "* fix(publish): isolate npmjs .npmrc so the GitHub Packages scope mapping doesn't redirect the npmjs publish\n\n* chore: release v0.34.2 (bootstrap publish to npmjs)\n\n---------\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "fix(publish): isolate npmjs .npmrc + release v0.34.2 (bootstrap) (#13)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-06-25T11:16:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adaa06d0eaa8dd0debe3a1454dbe809d068a32c2",
          "body": "Co-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: release v0.34.1 (bootstrap publish to npmjs) (#12)",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-06-25T10:56:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7eb7261980b6bd4c6c6fc9a30c5a4c54b424f1d9",
          "body": "…ages); drop dead Forgejo (#11)\n\nCo-authored-by: ditto-m[bot] <296158794+ditto-m[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "feat(publish): publish @etamong-playground/ui to npmjs (+ GitHub Pack…",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-06-25T10:43:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3708d9950c7a39f7edb8b71f26113f3bd1a0416a",
          "body": "feat: PolicyChangeBanner — shared hub-driven legal change banner",
          "is_bot": false,
          "headline": "Merge pull request #10 from etamong-playground/policy-change-banner",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-24T01:26:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d94f101ecec3bd194bbeeeab54f09ec07972718",
          "body": "Generalizes the upcoming-policy-change banner that apps were duplicating\nlocally (shortener's LegalNotice, schedule-manager's local banner). Fetches\nthe legal hub status.json, filters to the app's serviceId, and renders a\ndismissible amber strip during the advance-notice window. KO/EN, adverse-aware,\nrouter-agnostic link, hydration-safe (useSyncExternalStore gate). v0.34.0.",
          "is_bot": false,
          "headline": "feat: PolicyChangeBanner — shared hub-driven legal change banner",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-24T01:26:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2668dc9eda11cee4eaa9cd2cfe73d7d835a0b61",
          "body": null,
          "is_bot": true,
          "headline": "chore: set @etamong-playground/admin as default codeowner",
          "author_name": "ditto-m[bot]",
          "author_login": "ditto-m[bot]",
          "committed_at": "2026-06-23T14:25:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac371fc9ad365d791256e8a6e957b0aca6ff956f",
          "body": "… can't publish packages) (#9)",
          "is_bot": false,
          "headline": "ci: Forgejo publishes with the npm-publish org secret (built-in token…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-22T15:33:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d762f270709e5d21290cb11658fcc92fec8e067f",
          "body": "…ernal svc url) (#8)",
          "is_bot": false,
          "headline": "ci: detect host by github.com (Forgejo's GITHUB_SERVER_URL is the int…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-22T15:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bf3d25c38f075e6a1a8604a97732a90aecbf8ec",
          "body": "…es on forgejo) (#7)",
          "is_bot": false,
          "headline": "ci: platform-aware publish (GitHub Packages on github, Forgejo Packag…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-22T15:21:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "283c6ea81928e886f7efce714ea2b246b483bd33",
          "body": "…ayground) (#5)",
          "is_bot": false,
          "headline": "ci: publish to GitHub Packages on version tag (rescope to @etamong-pl…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-22T11:55:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a85a57afcb75181995ca1a3f21e5a8cc727a93e4",
          "body": null,
          "is_bot": false,
          "headline": "ci: run on GitHub-hosted runners; drop internal publish workflow",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T19:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "194e2705bc4b738aa143f8a4e58e1b22f87c09e0",
          "body": null,
          "is_bot": false,
          "headline": "docs: add issue templates",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T19:57:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12d39e94296067266e22aeaa0388cbfcf11a2b07",
          "body": null,
          "is_bot": false,
          "headline": "docs: reword About",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T19:44:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d52f94b360dd4a324badc1b96f9b439f00f014a0",
          "body": null,
          "is_bot": false,
          "headline": "chore: prep repo for public release",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T19:28:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98f006805a962451ec91aae0e0634d51fb6618cc",
          "body": null,
          "is_bot": false,
          "headline": "docs: tidy README",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T19:15:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "532175d4af8051533cc5d28e344c1adc3a64dab6",
          "body": "* ci: switch publish to arc-etamong-playground runner + Kubernetes Vault auth\n\n* fix: add data/ segment to vault KV v2 secret paths\n\nvault-action@v3 requires the full KV v2 path including data/;\nomitting it caused 403 from Vault policy check.",
          "is_bot": false,
          "headline": "ci: publish to GitHub Packages + Forgejo via ARC runner + Vault auth",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T17:30:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2cd77af97db867b00b696121ff2648c4a00755c",
          "body": "…nt with infra)",
          "is_bot": false,
          "headline": "ci: use https://vault.m.etamong.com (reachable from cluster; consiste…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T13:24:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c177aa35faf5eee856d03420333df90b54688d60",
          "body": "…dow)",
          "is_bot": false,
          "headline": "ci: set kubernetesTokenPath=/vault/sa/token (bypass dind /var/run sha…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T13:22:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b52e4be7f63c131f8043bafa95f65d72d0badeb4",
          "body": "…role)",
          "is_bot": false,
          "headline": "ci: switch vault-action to kubernetes auth (arc-runner-workflows k8s …",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T13:17:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "381cdf64ba1cdbbf0e88e91d45475333e4e1eb6d",
          "body": null,
          "is_bot": false,
          "headline": "ci: use self-hosted ARC runner + internal Vault URL (planning#259)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T13:07:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1bf679a91f1d6715942bbe3dadd1c286c4a83821",
          "body": null,
          "is_bot": false,
          "headline": "ci: add workflow_dispatch + Vault JWT auth for npm publish",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T12:42:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2b6a8ec1ffb113bba7837b51d5e1e5ebff8e6cb",
          "body": null,
          "is_bot": false,
          "headline": "ci: fetch Forgejo npm token from Vault JWT (no GitHub secrets)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T12:28:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4823719f5a78b80c905ddce21e9d1f74c426ff48",
          "body": null,
          "is_bot": false,
          "headline": "ci: add GHA CI + dual-publish (planning#259 Wave 2)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T11:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22f06282acd57935f5b3d554afe8ba172d2a9715",
          "body": "ci: add GitHub Actions CI (planning#259 Wave 2)",
          "is_bot": false,
          "headline": "Merge pull request #1 from etamong-playground/wave2-gha-ci",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T11:28:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f1cf9aa4f9e2fc46118f2856a732ae580ca42bd",
          "body": null,
          "is_bot": false,
          "headline": "ci: add GitHub Actions CI (planning#259 Wave 2)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-20T11:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "186542a82541f54884d02e948759aa17a1765774",
          "body": "feat(v0.33.0): LegalMenuItem + LegalPage + useLegalAvailability\n\nSee merge request etamong-lab/shared/libs/ui!47",
          "is_bot": false,
          "headline": "Merge branch 'legal-section-components' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:46:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e15b96d55c71f81cab6da0e28722e032fe003a9",
          "body": "# Conflicts:\n#\tpackage.json",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into legal-section-components",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:44:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5fa32925d76764cc8073d36adc17494e7bcd12cb",
          "body": "fix(sidebar): keep visible on long pages (v0.32.1)\n\nSee merge request etamong-lab/shared/libs/ui!48",
          "is_bot": false,
          "headline": "Merge branch 'sidebar-sticky' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:19:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79972c5cd3ae04f185f22e94b18c8218c68182a8",
          "body": null,
          "is_bot": false,
          "headline": "fix(sidebar): keep visible on long pages (v0.32.1)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:19:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8f01662e222af98150c5c56d130c264c484cb6f",
          "body": "Operator decision in the planning#255 kickoff thread: 'etamong 식별/SSO 안내'\nwas too jargony for a user-facing menu row. '로그인 정책' is the plainer\nsynonym (still consistent with the L1 hub doc topic) and matches how\noperators describe authentik in support channels.\n\nApps still override per-locale via the identityLabel prop.",
          "is_bot": false,
          "headline": "ui(legalSection): rename default identity label to '로그인 정책'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:15:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cdf3019d32df1dbe8212b30e816526e52a789a81",
          "body": "… for sibling composition\n\nThe 더보기 → 법률 정보 grouping convention (planning concepts/mobile-more-page)\nshows '법률 정보 ›' and '문의하기 ↗' as TWO rows inside a single card.\nLegalMenuItem wrapping its own .etu-legal-card forces apps to either drop\nto two adjacent cards or hand-roll their own row primitive.\n\n  \n[…]\n so the\n    common case of [identity / settings rows above] reads cleanly.\n\nLegalPage continues to wrap in .etu-legal-card — it owns the entire\nsub-page surface and there's no sibling to compose with.",
          "is_bot": false,
          "headline": "ui(legalSection): LegalMenuItem renders just the row; export LegalRow…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:10:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cb1b89770464aa88b92be593efcb2c1114047889",
          "body": "Three legal-section primitives that group the per-app /more menu's\n이용약관 / 개인정보처리방침 rows into a single 법률 정보 ›' row that\nopens an in-app /more/legal sub-page (3-level nav). The sub-page is\ndriven by the legal hub's new /api/public-manifest endpoint so docless\ninternal apps (alert-ops, draw, minccino,\n[…]\nlegal.m.etamong.com#<anchor>.\n\n11 vitest cases cover kind ordering, identity filtering, soft-TTL\ncache hit, refresh(), error path, and the empty/loading rendering.\n\nRelates to etamong-lab/planning#255",
          "is_bot": false,
          "headline": "feat(v0.33.0): LegalMenuItem + LegalPage + useLegalAvailability",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-17T00:03:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c0f1692fa334786ff7159b40a1acf3fe514cadec",
          "body": "feat(v0.32.0): NotificationBell — fleet inbox-on-bell primitive\n\nSee merge request etamong-lab/shared/libs/ui!46",
          "is_bot": false,
          "headline": "Merge branch 'notification-bell' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T22:24:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e190a50fbed369a6a8b89c9a5dc5b1332799bced",
          "body": "… inbox surfaces\n\nBell trigger with unread badge, desktop popover (UserMenu placement\ncontract, auto-flip) and mobile bottom sheet (backdrop, safe-area inset,\nslide-up, body-scroll lock). Content-agnostic items so consumers render\ntheir own row body + inline actions.\n\nFirst consumer: pages access-request inbox — replaces a primary-nav\ntab + dedicated route with a header bell, per planning concept that\nincoming notifications belong on a global surface, not in primary nav.",
          "is_bot": false,
          "headline": "feat(v0.32.0): NotificationBell — bell icon + popover/sheet for fleet…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T22:22:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06bcf0234350c0876b0c731903d70b97716ff5e4",
          "body": "feat(v0.31.0): OpenInBrowserButton — PWA escape hatch\n\nSee merge request etamong-lab/shared/libs/ui!45",
          "is_bot": false,
          "headline": "Merge branch 'feat/open-in-browser-button' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T21:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd2c9c2fd3ebb25392d0a516f69d0c04d5e0718a",
          "body": null,
          "is_bot": false,
          "headline": "feat(v0.31.0): OpenInBrowserButton — PWA escape hatch",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T21:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d4cdb5fe00ff3e1b447a570a2d2e757a53a1931",
          "body": "feat(auth): fleet-auth primitives + isShareCrawler (v0.30.0)\n\nSee merge request etamong-lab/shared/libs/ui!44",
          "is_bot": false,
          "headline": "Merge branch 'ui-fleet-auth' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T16:23:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a5ce3e78bfaa13a59969844b78609750aa604b6",
          "body": "Implements the route contract documented at\nplanning/wiki/concepts/fleet-auth.md (planning#252). New surface for\napps to standardise on instead of hand-rolling login/logout/expired-\nsession UI per app and to retire the oauth2-proxy-vs-in-app-OIDC split.\n\n- AuthGate, useIdentity, LoginButton, LogoutB\n[…]\ndispatchers\n\nLegacy useMe/signInUrl/signOutUrl (oauth2-proxy paths) remain exported\nunchanged — apps still on the sidecar keep working.\n\nTests: 9 new cases in tests/auth.test.tsx (full suite 28 pass).",
          "is_bot": false,
          "headline": "feat(auth): fleet-auth primitives + isShareCrawler (v0.30.0)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-15T16:09:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28f64af9fd737c11787e786356b51bea0c2e3d00",
          "body": "fix(v0.29.1): ship root entry as a Next.js client module (RSC barrel fix)\n\nSee merge request etamong-lab/shared-old/libs/ui!43",
          "is_bot": false,
          "headline": "Merge branch 'fix/v0.29.1-rsc-use-client' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T23:57:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "870d100e667e132fcfe262d6ff2a8762bcba6e6e",
          "body": "…fix)\n\nImporting anything from `@etamong-lab/ui` (root entry) inside a Next.js\nserver component crashed at build time with `g.createContext is not a\nfunction`. The bundled `dist/index.{js,cjs}` evaluates every sub-module\n(tsup bundles via the barrel re-exports), and several of them call\n`createConte\n[…]\ned\nend-to-end by pointing res-train at a locally-packed 0.29.1 tarball and\nrunning `pnpm build` — `/me` now collects cleanly.\n\nRelates to etamong-lab/planning#0 (release_ops noise observed 2026-06-15)",
          "is_bot": false,
          "headline": "fix(v0.29.1): ship root entry as a Next.js client module (RSC barrel …",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T23:52:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c36f9f72f8a323d710864ad7463e42cd7ff5de23",
          "body": "feat(testing): MSW + ko-KR Playwright fixture + viewport-fit barrel (v0.29.0)\n\nSee merge request etamong-lab/shared/libs/ui!42",
          "is_bot": false,
          "headline": "Merge branch 'feat/testing-msw' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T19:11:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38fd3a80e33ce6c10598a39e146b58948afeee05",
          "body": "…v0.29.0)",
          "is_bot": false,
          "headline": "feat(testing): MSW + ko-KR Playwright fixture + viewport-fit barrel (…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T19:11:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14dd0184abff8578e0c7d503f3526ce4052adb97",
          "body": "v0.28.2 — registerServiceWorker currentBuild dev-warn (iOS PWA staleness)\n\nSee merge request etamong-lab/shared/libs/ui!41",
          "is_bot": false,
          "headline": "Merge branch 'feat/v0.28.2-sw-staleness' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T18:53:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af74adcdddc8eff2391115bd1c413e6393f490f4",
          "body": "…A staleness\n\nDetects the 'SW byte-identical across deploys' failure mode (the\ncanonical iPhone PWA 'updates very slowly' trigger): when an app passes\nits deploy SHA via { currentBuild }, the helper hashes the SW body on\nmount and persists with the build SHA. On the next reload, if the SHA\nchanged b\n[…]\nertions: dev-only,\nproduction dead-code via NODE_ENV check, one warning per session per\nevent.\n\nWiki cross-ref: planning concepts/pwa-cache-and-ios-shell +\nviewport-fit-assertions (companion pattern).",
          "is_bot": false,
          "headline": "feat(v0.28.2): registerServiceWorker currentBuild dev-warn for iOS PW…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T18:51:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "48936d4cdd929ec5a7297531910801ff3caf959e",
          "body": "v0.28.1 — NavigationBar safeAreaTop + 17px title + viewport-fit dev assertions + CI gate\n\nSee merge request etamong-lab/shared/libs/ui!40",
          "is_bot": false,
          "headline": "Merge branch 'fix/v0.28.1-navbar-font' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T18:41:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "812d436005acbc75954349d342617862225060d3",
          "body": "Lifts the dev-mode console.warn signal into a CI failure:\n- src/testing.ts: assertViewportFit / defineViewportFitTests /\n  FLEET_VIEWPORT_PROFILES (iphone-17-pro-pwa / ipad-mini-portrait /\n  desktop-1280 / android-narrow).\n- ci/viewport-fit.gitlab-ci.yml: .etu-viewport-fit job — apps\n  include: { project: .../ui, file: ci/viewport-fit.gitlab-ci.yml } and\n  extend.\n- @playwright/test as optional peer; apps without e2e unaffected.\n\nWiki: planning concepts/viewport-fit-assertions.md (separate MR).",
          "is_bot": false,
          "headline": "0.28.1: ship @etamong-lab/ui/testing + CI snippet for viewport-fit gate",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T18:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07836a35a733fca7cfcdec7c479efa2a61474cc3",
          "body": "… viewport-fit assertions\n\nThree layers preventing the iOS PWA title-row regression:\n\n1. <NavigationBar safeAreaTop> — explicit opt-out for apps that already\n   have a global top-chrome bar above the per-page nav. Avoids stacking\n   env(safe-area-inset-top) twice.\n2. .etu-navbar-title font-size: 17p\n[…]\nd, title < 16px, or a sticky/\n   fixed ancestor is also eating safe-area-top. Production dead-code-\n   eliminated via NODE_ENV check.\n\nWiki: planning concepts/viewport-fit-assertions.md (separate MR).",
          "is_bot": false,
          "headline": "feat(v0.28.1): NavigationBar safeAreaTop prop + 17px title + dev-mode…",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T18:34:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8328567f30097d4da8f8384708777250d9ae294e",
          "body": "v0.28.0 — i18n + responsive 3-tier + theme fallback dark\n\nSee merge request etamong-lab/shared/libs/ui!39",
          "is_bot": false,
          "headline": "Merge branch 'feat/v0.28-i18n-responsive' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T17:05:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fc8309c88818e76315da21e36faea3ba0d1b2e2",
          "body": "- I18nProvider/useT/useLocale (KO+EN, system default, EN fallback)\n- ViewportProvider/useViewport + 3-tier breakpoints (mobile<720/tablet 720-1023/desktop≥1024)\n- Sidebar tabletMode prop (rail default, drawer, full) + SidebarToggle + useSidebarDrawer\n- noFlashLocaleScript + noFlashViewportScript\n- Theme fallback light→dark\n\nDefault Sidebar tabletMode='rail' is a visible behavior change at 720-1023px;\napps wanting v0.27 look pass tabletMode='full'.",
          "is_bot": false,
          "headline": "feat(v0.28.0): i18n + responsive 3-tier + theme fallback dark",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T16:58:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9ea58b9aac2f67064a74e85b5a17280931a48ae",
          "body": "v0.27.0 — BackButton fallback (canonical one-liner)\n\nSee merge request etamong-lab/shared/libs/ui!38",
          "is_bot": false,
          "headline": "Merge branch 'v0.27.0' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T16:07:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a205ca8ff703b51f056dc7ce57163a979f306556",
          "body": null,
          "is_bot": false,
          "headline": "trigger MR creation",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T16:03:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d037dbbdf6982acbcab5edc039bb96c30351fd3",
          "body": "Adoption-first refinement to the in-app back primitives shipped in\nv0.8.0. The hook/component pair is correct but uptake across the fleet\nwas zero — apps were rolling their own `history.back()` instead. v0.27.0\nmakes the right thing one prop:\n\n  <BackButton fallback=\"/more\" />                     //\n[…]\nton.test.tsx\ncovers 12 cases across the new one-liner + back-compat paths.\n\nWiki: planning/wiki/concepts/spa-navigation-state.md gets updated as\nadoption rolls out across the fleet (separate session).",
          "is_bot": false,
          "headline": "v0.27.0 — BackButton fallback (canonical one-liner)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T16:02:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "46b6ec41cdf8a9f36efbe9e1c4ef8c08a67cddf4",
          "body": "feat: DocsHubSkill.publicUrl + install one-liner UI (v0.26.0)\n\nSee merge request etamong-lab/shared/libs/ui!37",
          "is_bot": false,
          "headline": "Merge branch 'docs-skill-public-url' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T03:40:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43a93869b116799fd040f702234684e2105edc58",
          "body": "Adds an optional `publicUrl` to `DocsHubSkill` pointing at a stable\npublic endpoint serving the same skill markdown bytes as the download\nbutton. Convention: `https://<app>.m.etamong.com/skill.md`.\n\nWhen set, the default Claude-skill usage section leads with\n\n  curl -fsSL <publicUrl> -o ~/.claude/sk\n[…]\nunauthenticated, `text/markdown`,\npublic-shaped (no tokens / user-specific routes).\n\nAdds `.etu-docs-hub-skill-install{,-cmd,-note}` styles.\n\nRelates to etamong-lab/planning#222 (public-URL contract).",
          "is_bot": false,
          "headline": "feat: DocsHubSkill.publicUrl + install one-liner UI (v0.26.0)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:59:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09d502d191c21f2c97880926f0c65c196452cc28",
          "body": "v0.25.0 — DataTable + Sidebar secondarySections\n\nSee merge request etamong-lab/shared/libs/ui!36",
          "is_bot": false,
          "headline": "Merge branch 'v0.25.0' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:26:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb40276dd0ad33c3a139b8649278991a9ea3051c",
          "body": null,
          "is_bot": false,
          "headline": "v0.25.0 — DataTable + Sidebar secondarySections",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:19:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60c631f6de01bfdea3a39c6f3edede8889004840",
          "body": "feat: <Sidebar> secondarySections (folded into v0.24.0)\n\nSee merge request etamong-lab/shared/libs/ui!35",
          "is_bot": false,
          "headline": "Merge branch 'sidebar-v0.24.0' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:15:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0901d31dfd148dfa62c296d29653c31a8fcad165",
          "body": null,
          "is_bot": false,
          "headline": "feat: <Sidebar> secondarySections (folded into v0.24.0)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:15:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "325710a618c267a571d2da87e89d777eab94be43",
          "body": "v0.24.0 — DataTable (wide table / narrow row-per-field cards)\n\nSee merge request etamong-lab/shared/libs/ui!34",
          "is_bot": false,
          "headline": "Merge branch 'feat/data-table' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:09:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be2b090df468a76bf3dfb8ec6fb0c3e6eca3b0df",
          "body": null,
          "is_bot": false,
          "headline": "v0.24.0 — DataTable (wide table / narrow row-per-field cards)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-14T02:08:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bf3fe7f411607588d6ed9e8b13de5096db8e8ee9",
          "body": "v0.23.0 — NavigationBar + floating tab bar (iOS 26 Liquid Glass)\n\nSee merge request etamong-lab/shared/libs/ui!33",
          "is_bot": false,
          "headline": "Merge branch 'v0.23.0-liquid-glass' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T18:45:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "372d737f278e830665c5e7e2b0bec3a80548a5f0",
          "body": "- New <NavigationBar>: iOS-style small inline title, single 48px row\n  (Android Material 3 hit floor), sticky safe-area-inset-top, fade-on-scroll\n  opacity + shadow ramp, generic Unicode chevron (no SF Symbols).\n  back prop accepts function | string (history.pushState + popstate) | true\n  (history.b\n[…]\npaired with an @supports not solid-surface fallback for\n  Android Chrome / Samsung Internet.\n- README documents the new component, Android compatibility floor, and\n  the retired global avatar top bar.",
          "is_bot": false,
          "headline": "v0.23.0 — NavigationBar + floating tab bar (iOS 26 Liquid Glass)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T18:41:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c22826d14fd68adf52c4a816fb9c1b08d1fc988",
          "body": "feat: iOS PWA shell helper + safe text-size-adjust reset (v0.22.0)\n\nSee merge request etamong-lab/shared/libs/ui!32",
          "is_bot": false,
          "headline": "Merge branch 'v0.22.0-ios-cache-fix' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T18:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7a2384d3bc1739254d26dda6dc4eacd59b15c2fc",
          "body": null,
          "is_bot": false,
          "headline": "feat: iOS PWA shell helper + safe text-size-adjust reset (v0.22.0)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T18:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f16c11e6dbc72045e5e7f177a41685761a15d9cc",
          "body": "feat: <Sidebar> — desktop nav shell (counterpart to MobileTabBar)\n\nSee merge request etamong-lab/shared/libs/ui!31",
          "is_bot": false,
          "headline": "Merge branch 'feat/sidebar' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T15:32:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9a179958ecc47f8b05bb6980caf9f76116de347",
          "body": "Implements the etamong-lab/planning fleet contract from\nwiki/concepts/sidebar-composition.md.\n\n- src/sidebar.tsx — <Sidebar> with AppHeader / PrimaryNavList /\n  SecondaryNavList / SidebarFooter composition. Router-agnostic\n  SidebarItem (same shape as MobileTabBarItem). No userMenu prop —\n  identity\n[…]\n; description updated.\n\nDrive primary and secondary from the same arrays you feed\n<MobileTabBar items={primary.slice(0, 4).concat([moreTab])} /> and the\n/more page; one source of truth, two renderers.",
          "is_bot": false,
          "headline": "feat: <Sidebar> — desktop nav shell (counterpart to MobileTabBar)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T15:30:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4c4cd18ee379e08d830de30ea714a5f5c92dd51",
          "body": "release: 0.20.0 — DocsHub stable\n\nSee merge request etamong-lab/shared/libs/ui!28",
          "is_bot": false,
          "headline": "Merge branch 'release/0.20.0' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T09:19:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97313159771d6f4541002f2ee3cdf9deadd49d4c",
          "body": "Graduates DocsHub from alpha (0.20.0-alpha.*) to stable per the\nui-alpha-pilot-pattern: cherry-picked the alpha base (eff5eb3) and\nthe skill-usage section (246cb0a) onto the latest stable main; bumps\nversion to 0.20.0 so the tag publishes to the 'latest' dist-tag and\nconsumers can move from exact-pin to ^0.20.0.",
          "is_bot": false,
          "headline": "release: 0.20.0 stable",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T09:17:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46fcdf312b9326bdfd75d5f25e2d6d9ed2eeb5a9",
          "body": "When a DocsHub consumer passes `skill`, DocsHub now appends a built-in\n'Claude skill 사용법' nav section explaining where to drop the downloaded\n`<name>.md` for Claude Code (`~/.claude/skills/<name>/SKILL.md`),\nCodex / other coding agents, and plain LLMs (paste body into context).\n\nSingle source of tru\n[…]\nadopts DocsHub gets the same\nskill-usage guidance without each writing its own. Override via\n`skill.usageSection` (custom node) or `null` (skip).\n\nBumps to 0.20.0-alpha.1 — pilot (pages) re-pins next.",
          "is_bot": false,
          "headline": "feat: DocsHub auto-appends 'Claude skill 사용법' section (alpha.1)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T09:17:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82ae85f2ab3cb5c04ca9305027a3995419dd6f82",
          "body": "`<DocsHub>` renders a sectioned in-app docs page (left section nav +\ncontent) with an optional top-right '📥 Claude skill 받기' button that\ndownloads a one-file Markdown skill (`<name>.md` with name+description\nfrontmatter + body) consumers can drop into Claude Code or another LLM.\n\nRouter-agnostic — s\n[…]\nto-\npublish to a non-`latest` dist-tag (the slug before the first dot —\n\"alpha\", \"rc\", …) so a stray `npm install @etamong-lab/ui` can't\ngrab them. Stable versions keep the existing `latest` behavior.",
          "is_bot": false,
          "headline": "feat: DocsHub (alpha) — in-app docs surface + Claude-skill download",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T09:16:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "054c2cf596c84426905bf542b99529c49ef1bbaf",
          "body": "release: v0.19.1 (UserMenu auto-flip + InstallBanner above tab bar) + revert DocsHub alphas\n\nSee merge request etamong-lab/shared/libs/ui!25",
          "is_bot": false,
          "headline": "Merge branch 'release/0.19.1' into 'main'",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T08:57:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f43a02bd80c9d95e005747a4585a080e65bd3ff",
          "body": "An app that renders both has the install banner sitting at `bottom: 0.75rem`\nand the tab bar at `bottom: 0` — the banner's higher z-index then covers the\ntab bar's nav items. Use `body:has(.etu-mobile-tab-bar)` to add the tab bar's\nheight (+ safe-area inset) to the banner's offset. Bar height is a CSS\nvariable (`--etu-mobile-tab-bar-h`, default 56px) so apps with custom\nicon/label sizing can override.",
          "is_bot": false,
          "headline": "fix(InstallBanner): lift above <MobileTabBar> when both are mounted",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T08:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b01f6cca30d01ca46a9efb1e62c96a9ce6dacc4",
          "body": "`<UserMenu placement=\"top-left\">` was sized for a vertical sidebar where the\ntrigger sits at the bottom. On the same layout's mobile breakpoint the sidebar\ncollapses into a horizontal topbar and the trigger ends up near the viewport\ntop — the dropdown then opens upward into nothing and gets clipped.\n\nMeasure the trigger's rect on open and flip each axis when the requested side\ndoesn't have room. `placement` is now a preferred hint rather than a hard\nchoice.",
          "is_bot": false,
          "headline": "fix(UserMenu): auto-flip placement when off-viewport (v0.20.0-alpha.1)",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T08:56:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d474f92b502f0ebbc4274e32c87005890220fb83",
          "body": "This reverts commit 7b19c0c020e33c938f4308f7b110cb3111c37dda, reversing\nchanges made to f2fa28861ab97e54897d6514f826f9ec2f97001f.",
          "is_bot": false,
          "headline": "Revert \"Merge branch 'feat/docs-hub-alpha' into 'main'\"",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T08:55:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5fbaae3bca3a15736124a1c3f437fbbd6581bed",
          "body": "This reverts commit 38c53a496bb94667c9cb2fc720173becb6ca8cdd, reversing\nchanges made to 7b19c0c020e33c938f4308f7b110cb3111c37dda.",
          "is_bot": false,
          "headline": "Revert \"Merge branch 'feat/docs-hub-skill-usage' into 'main'\"",
          "author_name": "Jooho Lee",
          "author_login": "etamong",
          "committed_at": "2026-06-13T08:55:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 14,
      "commits_last_year": 158,
      "latest_release_at": "2026-07-18T15:10:40Z",
      "latest_release_tag": "v0.41.0",
      "releases_from_tags": false,
      "days_since_last_push": 3,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 1.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@etamong-playground/ui",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@etamong-playground/ui",
          "is_deprecated": false,
          "latest_version": "0.41.0",
          "repository_url": "https://github.com/etamong-playground/ui",
          "versions_count": 10,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 2204,
          "first_published_at": "2026-06-25T11:17:03.967000Z",
          "latest_published_at": "2026-07-18T15:06:29.308000Z",
          "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": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "showcase/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 18376,
      "source_files_sampled": 76,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "showcase/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 27,
        "malicious_count": 0,
        "assessed_package": "npm:@etamong-playground/ui@0.41.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "cmdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "es-hangul",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "2.4.0"
        },
        {
          "name": "@etamong-playground/ui",
          "manifest": "showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "react",
          "manifest": "showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        },
        {
          "name": "react-dom",
          "manifest": "showcase/package.json",
          "ecosystem": "npm",
          "version_constraint": "^18.3.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "cmdk",
            "direct": true,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-hangul",
            "direct": true,
            "version": "2.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": true,
            "version": "18.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "react",
            "direct": true,
            "version": "^18.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": true,
            "version": "18.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-dom",
            "direct": true,
            "version": "^18.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@ampproject/remapping",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/css-color",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/compat-data",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-compilation-targets",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-globals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-imports",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-transforms",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-plugin-utils",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-option",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helpers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-jsx-self",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-react-jsx-source",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@bcoe/v8-coverage",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/color-helpers",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-calc",
            "direct": false,
            "version": "2.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-color-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-parser-algorithms",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-tokenizer",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openharmony-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/ansi",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/confirm",
            "direct": false,
            "version": "6.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/core",
            "direct": false,
            "version": "11.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/figures",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@inquirer/type",
            "direct": false,
            "version": "4.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/cliui",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@istanbuljs/schema",
            "direct": false,
            "version": "0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.13",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/remapping",
            "direct": false,
            "version": "2.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@mswjs/interceptors",
            "direct": false,
            "version": "0.41.9",
            "ecosystem": "npm"
          },
          {
            "name": "@open-draft/deferred-promise",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@open-draft/deferred-promise",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@open-draft/logger",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@open-draft/until",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgjs/parseargs",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "@playwright/test",
            "direct": false,
            "version": "1.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/primitive",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-compose-refs",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-context",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-dialog",
            "direct": false,
            "version": "1.1.16",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-dismissable-layer",
            "direct": false,
            "version": "1.1.12",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-focus-guards",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-focus-scope",
            "direct": false,
            "version": "1.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-id",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-portal",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-presence",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-primitive",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-slot",
            "direct": false,
            "version": "1.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-callback-ref",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-controllable-state",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-effect-event",
            "direct": false,
            "version": "0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-escape-keydown",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@radix-ui/react-use-layout-effect",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.0-beta.27",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm-eabi",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm-eabi",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-arm64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-arm64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-x64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-x64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-arm64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-arm64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-x64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-x64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-musleabihf",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-musleabihf",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-musl",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-musl",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-musl",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-musl",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-musl",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-musl",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-musl",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-musl",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-s390x-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-s390x-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-musl",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-musl",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openbsd-x64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openbsd-x64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openharmony-arm64",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openharmony-arm64",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-arm64-msvc",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-arm64-msvc",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-ia32-msvc",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-ia32-msvc",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-gnu",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-gnu",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-msvc",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-msvc",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/dom",
            "direct": false,
            "version": "10.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/react",
            "direct": false,
            "version": "16.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/aria-query",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__core",
            "direct": false,
            "version": "7.20.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__generator",
            "direct": false,
            "version": "7.27.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__template",
            "direct": false,
            "version": "7.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/babel__traverse",
            "direct": false,
            "version": "7.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "25.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/prop-types",
            "direct": false,
            "version": "15.7.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react",
            "direct": false,
            "version": "18.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react",
            "direct": false,
            "version": "^18.3.12",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react-dom",
            "direct": false,
            "version": "18.3.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/react-dom",
            "direct": false,
            "version": "^18.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/set-cookie-parser",
            "direct": false,
            "version": "2.4.10",
            "ecosystem": "npm"
          },
          {
            "name": "@types/statuses",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitejs/plugin-react",
            "direct": false,
            "version": "4.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "@vitejs/plugin-react",
            "direct": false,
            "version": "^4.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/coverage-v8",
            "direct": false,
            "version": "2.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "agent-base",
            "direct": false,
            "version": "7.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "6.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "any-promise",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "aria-hidden",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "aria-query",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "asynckit",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.10.41",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.4",
            "ecosystem": "npm"
          },
          {
            "name": "bundle-require",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cac",
            "direct": false,
            "version": "6.7.14",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001800",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "5.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "check-error",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "cli-width",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "combined-stream",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "confbox",
            "direct": false,
            "version": "0.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "consola",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "cssstyle",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "csstype",
            "direct": false,
            "version": "3.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "data-urls",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "decimal.js",
            "direct": false,
            "version": "10.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "deep-eql",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "delayed-stream",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "dequal",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "detect-node-es",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "dom-accessibility-api",
            "direct": false,
            "version": "0.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "eastasianwidth",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.386",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "9.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "es-set-tostringtag",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.25.12",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.27.7",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-string-truncated-width",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-string-width",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "fast-wrap-ansi",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "fix-dts-default-cjs-exports",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "foreground-child",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "form-data",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "gensync",
            "direct": false,
            "version": "1.0.0-beta.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-nonce",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "10.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "graphql",
            "direct": false,
            "version": "16.14.2",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-tostringtag",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "headers-polyfill",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "html-encoding-sniffer",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "html-escaper",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "http-proxy-agent",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "https-proxy-agent",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "iconv-lite",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-node-process",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-potential-custom-element-name",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-coverage",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-report",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-source-maps",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-reports",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "jackspeak",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "joycon",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jsdom",
            "direct": false,
            "version": "25.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "lilconfig",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "lines-and-columns",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "load-tsconfig",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "loose-envify",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "loupe",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "10.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "lz-string",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "magicast",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "make-dir",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "2.1.35",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "9.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "minipass",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "mlly",
            "direct": false,
            "version": "1.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "msw",
            "direct": false,
            "version": "2.14.6",
            "ecosystem": "npm"
          },
          {
            "name": "mute-stream",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mz",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.15",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.50",
            "ecosystem": "npm"
          },
          {
            "name": "nwsapi",
            "direct": false,
            "version": "2.2.24",
            "ecosystem": "npm"
          },
          {
            "name": "object-assign",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "outvariant",
            "direct": false,
            "version": "1.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "package-json-from-dist",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parse5",
            "direct": false,
            "version": "7.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "6.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "pathval",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "pirates",
            "direct": false,
            "version": "4.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-types",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "playwright",
            "direct": false,
            "version": "1.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "playwright-core",
            "direct": false,
            "version": "1.60.0",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "postcss-load-config",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-format",
            "direct": false,
            "version": "27.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "react-is",
            "direct": false,
            "version": "17.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "react-refresh",
            "direct": false,
            "version": "0.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "react-remove-scroll",
            "direct": false,
            "version": "2.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "react-remove-scroll-bar",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "react-style-singleton",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "rettime",
            "direct": false,
            "version": "0.11.11",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "4.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "4.62.2",
            "ecosystem": "npm"
          },
          {
            "name": "rrweb-cssom",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "rrweb-cssom",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "safer-buffer",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "saxes",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "scheduler",
            "direct": false,
            "version": "0.23.2",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.4",
            "ecosystem": "npm"
          },
          {
            "name": "set-cookie-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.7.6",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "3.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "strict-event-emitter",
            "direct": false,
            "version": "0.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-literal",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "sucrase",
            "direct": false,
            "version": "3.35.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "symbol-tree",
            "direct": false,
            "version": "3.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tagged-tag",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "test-exclude",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "thenify",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "thenify-all",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "0.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinypool",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyspy",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "7.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "7.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "tree-kill",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "ts-interface-checker",
            "direct": false,
            "version": "0.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsup",
            "direct": false,
            "version": "8.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "5.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "^5.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "ufo",
            "direct": false,
            "version": "1.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "7.24.6",
            "ecosystem": "npm"
          },
          {
            "name": "until-async",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "use-callback-ref",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "use-sidecar",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "6.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^6.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite-node",
            "direct": false,
            "version": "3.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "3.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "w3c-xmlserializer",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "webidl-conversions",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-encoding",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-mimetype",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-url",
            "direct": false,
            "version": "14.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "xml-name-validator",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "xmlchars",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": false,
            "version": "17.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "21.1.1",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 439,
        "direct_count": 6,
        "indirect_count": 433
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 35,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "etamong",
          "commits": 129,
          "avatar_url": "https://avatars.githubusercontent.com/u/23713607?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/15 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 4,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "80aef6fd77d6fb733334e8b87c57bb2aaf6cacf4",
        "ran_at": "2026-07-23T22:55:08Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-21T19:38:29Z",
      "oldest_open_prs": [
        {
          "number": 3,
          "created_at": "2026-06-20T12:36:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-20T11:39:43Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/etamong-playground/ui",
    "host": "github.com",
    "name": "ui",
    "owner": "etamong-playground"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 56,
        "vitality": 75,
        "community": 34,
        "governance": 53,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 75,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 158,
              "human_commit_share": 0.71,
              "days_since_last_push": 3,
              "active_weeks_last_year": 6
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 3 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 3
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "158 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 158
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 14,
              "latest_release_tag": "v0.41.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 1.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "14 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 34,
        "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "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": 56,
            "inputs": {
              "packages": [
                "@etamong-playground/ui"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 2204
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,204 downloads/month across npm",
                "points": 44.6,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2204,
                      "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": 53,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "merged_prs": 35,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "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": "35/36 decided PRs merged",
                "points": 37.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 35,
                      "decided": 36
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/15 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": 42,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "etamong-playground",
              "public_repos": 13,
              "account_age_days": 33
            },
            "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": "2 followers of etamong-playground",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "etamong-playground"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "13 public repos, account ~0 yr old",
                "points": 8.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 13
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@etamong-playground/ui"
              ],
              "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": "10 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "design-system",
                "pwa",
                "react",
                "typescript",
                "ui-components"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 56,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "28 out of 28 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/15 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@etamong-playground/ui@0.41.0 runtime dependency closure — what installing the published package pulls in — 27 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@etamong-playground/ui@0.41.0",
                  "assessed": 27
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 27,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 27,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 56,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.944,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 71 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 71
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "showcase/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.02
            },
            "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "showcase/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "showcase/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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 18376,
              "source_files_sampled": 76,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/76 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 76,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:55:24.993045Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/etamong-playground/ui.svg",
  "full_name": "etamong-playground/ui",
  "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.