Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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 зірок⑂ 0 форківз черв. 2026 р.Переглянути на GitHub ↗

etamong-playground/ui має індекс здоров’я 58 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (75/100), найнижчий — Community & Adoption (34/100). Останнє оновлення було 3 дні тому. Більшість нещодавньої роботи виконує один учасник.

58
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

58
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

etamong playgroundОрганізація
2 підписники13 публічних репозиторіївз черв. 2026 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
npm@etamong-playground/ui0.41.02 204105 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

75Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 3 дн. тому
4.2/36Ритм комітів — 6/52 тижнів із комітами
18/18Обсяг комітів — 158 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year158
human_commit_share0,71
days_since_last_push3
active_weeks_last_year6
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 14 релізів
36/36Свіжість релізів — останній реліз 5 дн. тому
27/27Ритм релізів — реліз кожні ~1,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count14
latest_release_tagv0.41.0
releases_from_tagsні
days_since_latest_release5
mean_days_between_releases1,3
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

34У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateтак
Як обчислюється оцінка
44.6/80Щомісячні завантаження — 2 204 завантажень/місяць у npm
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packages@etamong-playground/ui
dependents
ecosystemsnpm
total_downloads
monthly_downloads2 204
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

53Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
37.2/38.3Прийняття PR — злито 35/36 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/15 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs35
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.

Власність та опіка

42У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
3.4/25Охоплення власника — 2 підписників у etamong-playground
8.5/25Послужний список — 13 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers2
owner_typeOrganization
is_verified
owner_loginetamong-playground
public_repos13
account_age_days33

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у npm
35/35Свіжість публікацій — остання публікація 5 дн. тому
20/20Історія версій — 10 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packages@etamong-playground/ui
ecosystemsnpm
any_deprecatedні
min_days_since_publish5

Інженерна якість

Чи наявні базові інженерні практики та документація?

71Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-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
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
10/10Теми — 5 тем
0/10Wiki
Використані вхідні дані
topicsdesign-system, pwa, react, typescript, ui-components
has_wikiні
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

56Помірний · 16% загального індексу

Стан безпеки

45У зоні ризику
Як обчислюється оцінка
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.5Ліцензія — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — немає даних
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 — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,5
Виключено з оцінювання (немає даних або не застосовно): packaging, signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
25/25Непрямі залежності без відомих сповіщень — жодна непряма залежність не має відомих сповіщень
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages27
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено з runtime-замиканням залежностей npm:@etamong-playground/ui@0.41.0 — тим, що тягне за собою встановлення опублікованого пакета, — 27 пакетів. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

56Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 67 з 71 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,944
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — showcase/tsconfig.json, tsconfig.json
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
8/8Автоматизоване супроводження — 2 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilespnpm-lock.yaml
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configsshowcase/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0,02
Як обчислюється оцінка
45/45Типізований код — TypeScript (статично типізована)
55/55Керовані розміри файлів — 0/76 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypeScript
largest_source_bytes18 376
source_files_sampled76
oversized_source_files0

Ключові факти

0зірок GitHub
1контриб'юторів
158комітів за останні 12 місяців
3днів від останнього пушу
14релізів
1бас-фактор
0відкритих issue
npmпакетних екосистем

Докладніше

OpenSSF Scorecard 4.5 / 10
4.5сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
н/дPackagingpackaging 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
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Прямі залежності 5
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 439

Повний розв'язаний набір залежностей із графа залежностей GitHub: 6 прямих і 433 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

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

Встановлення npm:@etamong-playground/ui@0.41.0 тягне 27 пакетів, прямих і транзитивних: 0 мають відомі сповіщення, з них 0 — прямі залежності.

Жодне відоме сповіщення не стосується оцінених залежностей.

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаnpm.