公开记录
软件健康报告模式 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年6月在 GitHub 上查看 ↗

etamong-playground/ui 的健康指数为 100 分中的 58 分,处于「中等」区间。 其得分最高的类别是Vitality(75/100),最低的是Community & Adoption(34/100)。 最近一次更新在 3 天前。 近期的大部分工作由 1 位贡献者完成。

58
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

58
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

2 关注者13 个公开仓库始于 2026年6月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
npm@etamong-playground/ui0.41.02,204105 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

75良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 3 天前
4.2/36提交节奏 — 52 周中有 6 周有提交
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

发布纪律

100优秀
评分方式
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

社区健康

57中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
44.6/80月度下载量 — npm 合计每月 2,204 次下载
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议题解决 — 没有议题或无数据
37.2/38.3PR 接受 — 已裁定的 PR 中 35/36 已合并
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
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
3.4/25所有者影响力 — etamong-playground 有 2 位关注者
8.5/25既往记录 — 13 个公开仓库,账户约 0 年
所用输入
followers2
owner_typeOrganization
is_verified
owner_loginetamong-playground
public_repos13
account_age_days33
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 10 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@etamong-playground/ui
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

71良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
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

文档

75良好
评分方式
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
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:@etamong-playground/ui@0.41.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 27 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

56中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 71 次人类提交中有 67 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.944
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — showcase/tsconfig.json, tsconfig.json
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
8/8自动化维护 — 最近 100 次提交中有 2 次为自动依赖更新
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可控的文件大小 — 采样的 76 个源文件中有 0 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes18,376
source_files_sampled76
oversized_source_files0

关键数据

0GitHub 星标
1贡献者
158最近 12 个月提交数
3距最近推送天数
14发布版本数
1巴士系数(bus factor)
0开放议题
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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.