公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-26 10:09 UTC

sitespeedio / browsertime

Measure and Optimize Web Performance

JavaScriptApache-2.0★ 649 星标⑂ 141 复刻始于 2013年8月在 GitHub 上查看 ↗

sitespeedio/browsertime 的健康指数为 100 分中的 73 分,处于「良好」区间。 其得分最高的类别是Vitality(86/100),最低的是Security(54/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

73
总分 / 100
良好

软件健康指数

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

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

评分画像

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

所有权

112 关注者45 个公开仓库始于 2013年10月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
npmbrowsertime28.2.023,2337206 天前

按类别列示的指标

活力

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

86优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
19.4/36提交节奏 — 52 周中有 28 周有提交
18/18提交量 — 最近一年 271 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year271
human_commit_share0.96
days_since_last_push0
active_weeks_last_year28

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 100 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 8.5 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count100
latest_release_tagv28.2.0
releases_from_tags
days_since_latest_release6
mean_days_between_releases8.5

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

76良好 · 占总体的 18%
评分方式
45.6/60星标 — 649 个星标
17.9/25复刻 — 141 个复刻
7.1/15关注者 — 20 位关注者
所用输入
forks141
stars649
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

85优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
58.2/80月度下载量 — npm 合计每月 23,233 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesbrowsertime
dependents
ecosystemsnpm
total_downloads
monthly_downloads23,233
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

68中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.2/22.5提交分布 — 头号贡献者编写了 81% 的提交
13.5/13.5贡献者广度 — 54 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 9 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled54
top_contributor_share0.814
评分方式
44.1/46.8议题解决 — 94% 的议题已关闭
35.1/38.3PR 接受 — 已裁定的 PR 中 1,742/1,897 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs1,742
open_issues35
closed_issues594
issue_closed_ratio0.944
closed_unmerged_prs155
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
14.8/25所有者影响力 — sitespeedio 有 112 位关注者
24.1/25既往记录 — 45 个公开仓库,账户约 12 年
所用输入
followers112
owner_typeOrganization
is_verified
owner_loginsitespeedio
public_repos45
account_age_days4,666
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 720 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesbrowsertime
ecosystemsnpm
any_deprecated
min_days_since_publish6

工程质量

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

76良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 14 个工作流
24/24存在测试
16/16Linter 配置 — .eslintrc, .eslintrc.json, eslint.config.mjs
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

65中等
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://www.sitespeed.io/documentation/browsertime/
10/10仓库描述
10/10主题标签 — 7 个主题标签
0/10Wiki
所用输入
topicsjavascript, har, chrome, firefox, speedindex, video, safari
has_wiki
homepagehttps://www.sitespeed.io/documentation/browsertime/
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

54中等 · 占总体的 16%

安全态势

47存在风险
评分方式
5.2/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 22 out of 22 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/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 9 contributing companies or organizations
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
7.5/7.5Maintained — 30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
3.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.7
已排除计分(无数据或不适用):branch_protection。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
8.4/25间接依赖不含已知公告 — 2 个受影响:brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)
40/40没有长期未处理的公告 — 没有公告公开超过 90 天
所用输入
sourceosv
advisories7
affected_packages2
assessed_packages187
unassessed_packages0
affected_by_severityhigh 2
direct_affected_packages0
比对的是 npm:browsertime@28.2.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 187 个软件包。 未对可达性进行分析。

AI 就绪度

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

57中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 96 次人类提交中有 74 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.771
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — .eslintrc, .eslintrc.json, eslint.config.mjs
11/11静态类型检查 — tsconfig.json
10/10可复现环境 — Dockerfile, lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
7/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 7
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
27/45可类型检查的代码 — JavaScript,已配置类型检查(tsconfig.json)
54.7/55可控的文件大小 — 采样的 380 个源文件中有 2 个超过 60KB
所用输入
primary_languageJavaScript
largest_source_bytes84,345
source_files_sampled380
oversized_source_files2

关键数据

649GitHub 星标
54贡献者
271最近 12 个月提交数
0距最近推送天数
100发布版本数
1巴士系数(bus factor)
35开放议题
npm, PyPI软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

更多细节

Star 与 Fork 历史 0 ★ / 141 ⇿
0Star
141Fork
98发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

025507510012515013342015-012020-102026-07
主版本 10次版本 46修订 42

每个点涵盖 11 天。

OpenSSF Scorecard 4.7 / 10
4.7综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-26 10:08 UTC

7Binary-Artifactsbinaries present in source code
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests22 out of 22 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/30 approved changesets -- score normalized to 0
10Contributorsproject has 9 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
7Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 7
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
直接依赖 13
注册表软件包版本约束清单文件
npm@devicefarmer/adbkit3.3.8package.json
npm@sitespeed.io/chromedriver149.0.7827package.json
npm@sitespeed.io/edgedriver149.0.4022package.json
npm@sitespeed.io/geckodriver0.36.2package.json
npm@sitespeed.io/log2.0.0package.json
npm@sitespeed.io/throttle6.0.1package.json
npmchrome-har1.3.1package.json
npmchrome-remote-interface0.34.0package.json
npmexeca9.6.1package.json
npmfast-stats0.0.7package.json
npmff-test-bidi-har-export0.0.22package.json
npmselenium-webdriver4.44.0package.json
npmyargs18.0.0package.json
全部依赖 514

来自 GitHub 依赖图的完整解析依赖集合:15 个直接依赖与 499 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
npm@devicefarmer/adbkit3.3.8直接
npm@sitespeed.io/chromedriver149.0.7827直接
npm@sitespeed.io/edgedriver149.0.4022直接
npm@sitespeed.io/geckodriver0.36.2直接
npm@sitespeed.io/log2.0.0直接
npm@sitespeed.io/throttle6.0.1直接
npmchrome-har1.3.1直接
npmchrome-remote-interface0.34.0直接
npmexeca5.1.1直接
npmexeca9.6.1直接
npmfast-stats0.0.7直接
npmff-test-bidi-har-export0.0.22直接
npmselenium-webdriver4.44.0直接
npmyargs17.7.2直接
npmyargs18.0.0直接
npm@aashutoshrathi/word-wrap1.2.6间接
npm@babel/helper-validator-identifier7.28.5间接
npm@babel/parser7.23.6间接
npm@bazel/runfiles6.5.0间接
npm@borewit/text-codec0.2.2间接
npm@devicefarmer/adbkit-logcat2.1.3间接
npm@devicefarmer/adbkit-monkey1.2.1间接
npm@eslint-community/eslint-utils4.9.1间接
npm@eslint-community/regexpp4.12.2间接
npm@eslint/config-array0.23.5间接
npm@eslint/config-helpers0.6.0间接
npm@eslint/core1.2.1间接
npm@eslint/js10.0.1间接
npm@eslint/object-schema3.0.5间接
npm@eslint/plugin-kit0.7.1间接
npm@humanfs/core0.19.1间接
npm@humanfs/node0.16.6间接
npm@humanwhocodes/module-importer1.0.1间接
npm@humanwhocodes/retry0.3.1间接
npm@humanwhocodes/retry0.4.3间接
npm@isaacs/cliui8.0.2间接
npm@isaacs/fs-minipass4.0.1间接
npm@jimp/core1.6.1间接
npm@jimp/diff1.6.1间接
npm@jimp/file-ops1.6.1间接
npm@jimp/js-bmp1.6.1间接
npm@jimp/js-gif1.6.1间接
npm@jimp/js-jpeg1.6.1间接
npm@jimp/js-png1.6.1间接
npm@jimp/js-tiff1.6.1间接
npm@jimp/plugin-blit1.6.1间接
npm@jimp/plugin-blur1.6.1间接
npm@jimp/plugin-circle1.6.1间接
npm@jimp/plugin-color1.6.1间接
npm@jimp/plugin-contain1.6.1间接
npm@jimp/plugin-cover1.6.1间接
npm@jimp/plugin-crop1.6.1间接
npm@jimp/plugin-displace1.6.1间接
npm@jimp/plugin-dither1.6.1间接
npm@jimp/plugin-fisheye1.6.1间接
npm@jimp/plugin-flip1.6.1间接
npm@jimp/plugin-hash1.6.1间接
npm@jimp/plugin-mask1.6.1间接
npm@jimp/plugin-print1.6.1间接
npm@jimp/plugin-quantize1.6.1间接
npm@jimp/plugin-resize1.6.1间接
npm@jimp/plugin-rotate1.6.1间接
npm@jimp/plugin-threshold1.6.1间接
npm@jimp/types1.6.1间接
npm@jimp/utils1.6.1间接
npm@jridgewell/gen-mapping0.3.3间接
npm@jridgewell/resolve-uri3.1.1间接
npm@jridgewell/set-array1.1.2间接
npm@jridgewell/source-map0.3.5间接
npm@jridgewell/sourcemap-codec1.4.15间接
npm@jridgewell/trace-mapping0.3.20间接
npm@jsdoc/salty0.2.7间接
npm@mapbox/node-pre-gyp2.0.0间接
npm@nodelib/fs.scandir2.1.5间接
npm@nodelib/fs.stat2.0.5间接
npm@nodelib/fs.walk1.2.8间接
npm@pkgjs/parseargs0.11.0间接
npm@pkgr/core0.2.9间接
npm@rollup/pluginutils5.2.0间接
npm@sec-ant/readable-stream0.4.1间接
npm@serialport/binding-mock10.2.2间接
npm@serialport/bindings-cpp12.0.1间接
npm@serialport/bindings-interface1.2.2间接
npm@serialport/parser-byte-length12.0.0间接
npm@serialport/parser-cctalk12.0.0间接
npm@serialport/parser-delimiter11.0.0间接
npm@serialport/parser-delimiter12.0.0间接
npm@serialport/parser-inter-byte-timeout12.0.0间接
npm@serialport/parser-packet-length12.0.0间接
npm@serialport/parser-readline11.0.0间接
npm@serialport/parser-readline12.0.0间接
npm@serialport/parser-ready12.0.0间接
npm@serialport/parser-regex12.0.0间接
npm@serialport/parser-slip-encoder12.0.0间接
npm@serialport/parser-spacepacket12.0.0间接
npm@serialport/stream12.0.0间接
npm@sindresorhus/merge-streams2.3.0间接
npm@sindresorhus/merge-streams4.0.0间接
npm@tokenizer/inflate0.4.1间接
npm@tokenizer/token0.3.0间接
npm@types/esrecurse4.3.1间接
npm@types/estree1.0.9间接
npm@types/json-schema7.0.15间接
npm@types/linkify-it5.0.0间接
npm@types/markdown-it14.1.1间接
npm@types/mdurl2.0.0间接
npm@types/node16.9.1间接
npm@types/node20.10.6间接
npm@types/selenium-webdriver4.35.5间接
npm@types/w3c-web-usb1.0.10间接
npm@types/ws8.5.10间接
npm@vercel/nft0.29.4间接
npm@zeit/schemas2.36.0间接
npmabbrev3.0.1间接
npmacorn8.16.0间接
npmacorn-import-attributes1.9.5间接
npmacorn-jsx5.3.2间接
npmacorn-walk8.3.4间接
npmagent-base7.1.3间接
npmajv6.15.0间接
npmajv8.18.0间接
npmansi-align3.0.1间接
npmansi-regex5.0.1间接
npmansi-regex6.1.0间接
npmansi-styles4.3.0间接
npmansi-styles6.2.1间接
npmany-base1.1.0间接
npmarch2.2.0间接
npmarg5.0.2间接
npmargparse1.0.10间接
npmargparse2.0.1间接
npmarray-find-index1.0.2间接
npmarrgv1.0.2间接
npmarrify3.0.0间接
npmasync-sema3.1.1间接
npmava6.4.1间接
npmawait-to-js3.0.0间接
npmbalanced-match1.0.0间接
npmbalanced-match4.0.4间接
npmbaseline-browser-mapping2.10.31间接
npmbindings1.5.0间接
npmbluebird3.7.2间接
npmblueimp-md52.19.0间接
npmbmp-ts1.0.9间接
npmboxen7.0.0间接
npmbrace-expansion1.1.14间接
npmbrace-expansion2.1.0间接
npmbrace-expansion5.0.6间接
npmbraces3.0.3间接
npmbrowserslist4.28.2间接
npmbuffer-from1.1.2间接
npmbuiltin-modules5.0.0间接
npmbytes3.0.0间接
npmbytes3.1.2间接
npmcallsites4.2.0间接
npmcamel-case4.1.2间接
npmcamelcase7.0.0间接
npmcaniuse-lite1.0.30001793间接
npmcatharsis0.9.0间接
npmcbor10.0.11间接
npmchalk4.1.2间接
npmchalk5.0.1间接
npmchalk5.4.1间接
npmchalk-template0.4.0间接
npmchange-case5.4.4间接
npmchownr3.0.0间接
npmchunkd2.0.1间接
npmci-info4.4.0间接
npmci-parallel-vars1.0.1间接
npmclean-css5.3.3间接
npmclean-jsdoc-theme4.3.2间接
npmclean-regexp1.0.0间接
npmcli-boxes3.0.0间接
npmcli-truncate4.0.0间接
npmclipboardy3.0.0间接
npmcliui8.0.1间接
npmcliui9.0.1间接
npmcode-excerpt4.0.0间接
npmcolor-convert2.0.1间接
npmcolor-name1.1.4间接
npmcommander10.0.1间接
npmcommander2.11.0间接
npmcommander2.20.3间接
npmcommander9.5.0间接
npmcommon-path-prefix3.0.0间接
npmcompressible2.0.18间接
npmcompression1.8.1间接
npmconcat-map0.0.1间接
npmconcordance5.0.4间接
npmconsola3.4.2间接
npmcontent-disposition0.5.2间接
npmconvert-to-spaces2.0.1间接
npmcore-js-compat3.49.0间接
npmcore-util-is1.0.3间接
npmcrc-full1.1.0间接
npmcross-spawn7.0.6间接
npmcurrently-unhandled0.4.1间接
npmdate-time3.1.0间接
npmdebug2.6.9间接
npmdebug4.3.4间接
npmdebug4.4.3间接
npmdeep-extend0.6.0间接
npmdeep-is0.1.4间接
npmdetect-libc2.0.4间接
npmdot-case3.0.4间接
npmeastasianwidth0.2.0间接
npmelectron-to-chromium1.5.360间接
npmemittery1.2.0间接
npmemoji-regex10.3.0间接
npmemoji-regex10.4.0间接
npmemoji-regex8.0.0间接
npmemoji-regex9.2.2间接
npmentities4.5.0间接
npmescalade3.2.0间接
npmescape-string-regexp1.0.5间接
npmescape-string-regexp2.0.0间接
npmescape-string-regexp4.0.0间接
npmescape-string-regexp5.0.0间接
npmeslint10.4.0间接
npmeslint-config-prettier10.1.8间接
npmeslint-plugin-prettier5.5.5间接
npmeslint-plugin-unicorn64.0.0间接
npmeslint-scope9.1.2间接
npmeslint-visitor-keys3.4.3间接
npmeslint-visitor-keys5.0.1间接
npmespree11.2.0间接
npmesprima4.0.1间接
npmesquery1.7.0间接
npmesrecurse4.3.0间接
npmestraverse5.3.0间接
npmestree-walker2.0.2间接
npmesutils2.0.3间接
npmexif-parser0.1.12间接
npmfast-deep-equal3.1.3间接
npmfast-diff1.2.0间接
npmfast-glob3.3.3间接
npmfast-json-stable-stringify2.1.0间接
npmfast-levenshtein2.0.6间接
npmfast-uri3.1.2间接
npmfastq1.19.1间接
npmfigures6.1.0间接
npmfile-entry-cache8.0.0间接
npmfile-type21.3.4间接
npmfile-uri-to-path1.0.0间接
npmfill-range7.1.1间接
npmfind-up5.0.0间接
npmfind-up-simple1.0.1间接
npmflat-cache4.0.1间接
npmflatted3.4.2间接
npmforeground-child3.3.1间接
npmfs-extra10.1.0间接
npmget-caller-file2.0.5间接
npmget-east-asian-width1.2.0间接
npmget-stream6.0.1间接
npmget-stream9.0.1间接
npmgifwrap0.10.1间接
npmglob10.5.0间接
npmglob-parent5.1.2间接
npmglob-parent6.0.2间接
npmglobals17.6.0间接
npmglobby14.1.0间接
npmgraceful-fs4.2.11间接
npmhas-flag4.0.0间接
npmhtml-minifier-terser7.2.0间接
npmhttps-proxy-agent7.0.6间接
npmhuman-signals2.1.0间接
npmhuman-signals8.0.1间接
npmieee7541.2.1间接
npmignore5.3.2间接
npmignore7.0.4间接
npmignore-by-default2.1.0间接
npmimage-q4.0.0间接
npmimmediate3.0.6间接
npmimurmurhash0.1.4间接
npmindent-string5.0.0间接
npminherits2.0.4间接
npmini1.3.8间接
npmirregular-plurals3.3.0间接
npmis-builtin-module5.0.0间接
npmis-docker2.2.1间接
npmis-extglob2.1.1间接
npmis-fullwidth-code-point3.0.0间接
npmis-fullwidth-code-point4.0.0间接
npmis-glob4.0.3间接
npmis-number7.0.0间接
npmis-plain-obj4.1.0间接
npmis-plain-object5.0.0间接
npmis-port-reachable4.0.0间接
npmis-promise4.0.0间接
npmis-stream2.0.1间接
npmis-stream4.0.1间接
npmis-unicode-supported2.0.0间接
npmis-wsl2.2.0间接
npmisarray1.0.0间接
npmisexe2.0.0间接
npmjackspeak3.4.3间接
npmjimp1.6.1间接
npmjpeg-js0.4.4间接
npmjs-string-escape1.0.1间接
npmjs-yaml3.14.2间接
npmjs2xmlparser4.0.2间接
npmjsdoc4.0.5间接
npmjsesc3.1.0间接
npmjson-buffer3.0.1间接
npmjson-schema-traverse0.4.1间接
npmjson-schema-traverse1.0.0间接
npmjson-stable-stringify-without-jsonify1.0.1间接
npmjsonfile6.1.0间接
npmjszip3.10.1间接
npmkeyv4.5.4间接
npmklaw3.0.0间接
npmklaw-sync6.0.0间接
npmlevn0.4.1间接
npmlie3.3.0间接
npmlinkify-it5.0.0间接
npmload-json-file7.0.1间接
npmlocate-path6.0.0间接
npmlodash4.18.1间接
npmlower-case2.0.2间接
npmlru-cache10.4.3间接
npmmarkdown-it14.1.1间接
npmmarkdown-it-anchor8.6.7间接
npmmarked4.3.0间接
npmmatcher5.0.0间接
npmmd5-hex3.0.1间接
npmmdurl2.0.0间接
npmmemoize10.1.0间接
npmmerge-stream2.0.0间接
npmmerge21.4.1间接
npmmicromatch4.0.8间接
npmmime3.0.0间接
npmmime-db1.33.0间接
npmmime-db1.54.0间接
npmmime-types2.1.18间接
npmmimic-fn2.1.0间接
npmmimic-function5.0.1间接
npmminimatch10.2.5间接
npmminimatch3.1.5间接
npmminimatch9.0.9间接
npmminimist1.2.8间接
npmminipass7.1.3间接
npmminizlib3.1.0间接
npmmkdirp1.0.4间接
npmms2.0.0间接
npmms2.1.2间接
npmms2.1.3间接
npmnatural-compare1.4.0间接
npmnegotiator0.6.4间接
npmno-case3.0.4间接
npmnode-addon-api3.2.1间接
npmnode-addon-api7.0.0间接
npmnode-addon-api7.1.0间接
npmnode-fetch2.6.12间接
npmnode-forge1.4.0间接
npmnode-gyp-build4.6.0间接
npmnode-gyp-build4.8.0间接
npmnode-hid3.0.0间接
npmnode-releases2.0.44间接
npmnode-stream-zip1.15.0间接
npmnofilter3.1.0间接
npmnopt8.1.0间接
npmnpm-run-path4.0.1间接
npmnpm-run-path6.0.0间接
npmomggif1.0.10间接
npmon-headers1.1.0间接
npmonetime5.1.2间接
npmoptionator0.9.3间接
npmp-limit3.1.0间接
npmp-locate5.0.0间接
npmp-map7.0.3间接
npmpackage-config5.0.0间接
npmpackage-json-from-dist1.0.1间接
npmpako1.0.11间接
npmparam-case3.0.4间接
npmparse-bmfont-ascii1.0.6间接
npmparse-bmfont-binary1.0.6间接
npmparse-bmfont-xml1.1.6间接
npmparse-ms4.0.0间接
npmpascal-case3.1.2间接
npmpath-exists4.0.0间接
npmpath-is-inside1.0.2间接
npmpath-key3.1.1间接
npmpath-key4.0.0间接
npmpath-scurry1.11.1间接
npmpath-to-regexp3.3.0间接
npmpath-type6.0.0间接
npmpicocolors1.1.1间接
npmpicomatch2.3.2间接
npmpicomatch4.0.4间接
npmpixelmatch5.3.0间接
npmpkg-prebuilds0.2.1间接
npmplur5.1.0间接
npmpluralize8.0.0间接
npmpngjs6.0.0间接
npmpngjs7.0.0间接
npmprelude-ls1.2.1间接
npmprettier3.8.3间接
npmprettier-linter-helpers1.0.1间接
npmpretty-ms9.2.0间接
npmprocess-nextick-args2.0.1间接
npmpunycode2.3.1间接
npmpunycode.js2.3.1间接
npmqueue-microtask1.2.3间接
npmrange-parser1.2.0间接
npmrc1.2.8间接
npmreadable-stream2.3.8间接
npmregexp-tree0.1.27间接
npmregistry-auth-token3.3.2间接
npmregistry-url3.1.0间接
npmregjsparser0.13.1间接
npmrelateurl0.2.7间接
npmrequire-directory2.1.1间接
npmrequire-from-string2.0.2间接
npmrequizzle0.2.4间接
npmresolve-cwd3.0.0间接
npmresolve-from5.0.0间接
npmreusify1.1.0间接
npmrun-parallel1.2.0间接
npmsafe-buffer5.1.2间接
npmsafe-buffer5.2.1间接
npmsax1.6.0间接
npmsemver7.8.0间接
npmserialize-error7.0.1间接
npmserialport12.0.0间接
npmserve14.2.6间接
npmserve-handler6.1.7间接
npmsetimmediate1.0.5间接
npmshebang-command2.0.0间接
npmshebang-regex3.0.0间接
npmshowdown2.1.0间接
npmsignal-exit3.0.7间接
npmsignal-exit4.1.0间接
npmsimple-xml-to-json1.2.7间接
npmslash5.1.0间接
npmslice-ansi5.0.0间接
npmsource-map0.6.1间接
npmsource-map-support0.5.21间接
npmsplit1.0.1间接
npmsprintf-js1.0.3间接
npmstack-utils2.0.6间接
npmstring-width4.2.3间接
npmstring-width5.1.2间接
npmstring-width7.0.0间接
npmstring-width7.2.0间接
npmstring_decoder1.1.1间接
npmstrip-ansi6.0.1间接
npmstrip-ansi7.1.0间接
npmstrip-final-newline2.0.0间接
npmstrip-final-newline4.0.0间接
npmstrip-indent4.1.1间接
npmstrip-json-comments2.0.1间接
npmstrip-json-comments3.1.1间接
npmstrtok310.3.5间接
npmsupertap3.0.1间接
npmsupports-color7.2.0间接
npmsynckit0.11.12间接
npmtar7.5.15间接
npmtemp-dir3.0.0间接
npmterser5.26.0间接
npmthrough2.3.8间接
npmtime-zone1.0.0间接
npmtinycolor21.6.0间接
npmtldts6.1.86间接
npmtldts-core6.1.86间接
npmtmp0.2.5间接
npmto-regex-range5.0.1间接
npmtoken-types6.1.2间接
npmtough-cookie5.1.2间接
npmtr460.0.3间接
npmtslib2.6.2间接
npmtype-check0.4.0间接
npmtype-fest0.13.1间接
npmtype-fest2.19.0间接
npmtypescript5.9.3间接
npmuc.micro2.1.0间接
npmuint8array-extras1.5.0间接
npmunderscore1.13.8间接
npmundici-types5.26.5间接
npmunicorn-magic0.3.0间接
npmuniversalify2.0.1间接
npmupdate-browserslist-db1.2.3间接
npmupdate-check1.5.4间接
npmuri-js4.4.1间接
npmusb2.12.1间接
npmusb-power-profiling1.6.0间接
npmutif24.1.0间接
npmutil-deprecate1.0.2间接
npmvary1.1.2间接
npmwebidl-conversions3.0.1间接
npmwell-known-symbols2.0.0间接
npmwhatwg-url5.0.0间接
npmwhich2.0.2间接
npmwidest-line4.0.1间接
npmwrap-ansi7.0.0间接
npmwrap-ansi8.1.0间接
npmwrap-ansi9.0.0间接
npmwrite-file-atomic6.0.0间接
npmws7.5.10间接
npmws8.20.1间接
npmxml-parse-from-string1.0.1间接
npmxml2js0.5.0间接
npmxmlbuilder11.0.1间接
npmxmlcreate2.0.4间接
npmy18n5.0.8间接
npmyallist5.0.0间接
npmyargs-parser21.1.1间接
npmyargs-parser22.0.0间接
npmyocto-queue0.1.0间接
npmyoctocolors2.1.1间接
npmzod3.25.76间接
PyPInumpy间接
PyPIopencv-python间接
PyPIpillow间接
PyPIpyssim间接
依赖安全公告 2

安装 npm:browsertime@28.2.0 会引入 187 个包(直接与传递):其中 2 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
brace-expansion1.1.16间接15.0.8
tar7.5.15间接67.5.21

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "javascript",
        "har",
        "chrome",
        "firefox",
        "speedindex",
        "video",
        "safari"
      ],
      "is_fork": false,
      "size_kb": 139229,
      "has_wiki": false,
      "homepage": "https://www.sitespeed.io/documentation/browsertime/",
      "languages": {
        "CSS": 25,
        "HTML": 3029,
        "Shell": 6942,
        "Python": 84519,
        "Dockerfile": 1558,
        "JavaScript": 945530,
        "TypeScript": 950,
        "Objective-C": 11813
      },
      "pushed_at": "2026-07-26T05:53:11Z",
      "created_at": "2013-08-22T14:00:15Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T05:53:13Z",
      "description": "Measure and Optimize Web Performance",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "https://www.sitespeed.io/",
      "name": "sitespeed.io",
      "type": "Organization",
      "login": "sitespeedio",
      "company": null,
      "location": null,
      "followers": 112,
      "avatar_url": "https://avatars.githubusercontent.com/u/5693541?v=4",
      "created_at": "2013-10-15T17:38:27Z",
      "is_verified": null,
      "public_repos": 45,
      "account_age_days": 4666
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v28.2.0",
          "kind": "minor",
          "published_at": "2026-07-20T08:24:45Z"
        },
        {
          "tag": "v28.1.0",
          "kind": "minor",
          "published_at": "2026-07-17T15:41:16Z"
        },
        {
          "tag": "v27.5.0",
          "kind": "minor",
          "published_at": "2026-06-07T05:06:19Z"
        },
        {
          "tag": "v27.4.1",
          "kind": "patch",
          "published_at": "2026-05-25T13:19:40Z"
        },
        {
          "tag": "v27.4.0",
          "kind": "minor",
          "published_at": "2026-05-24T09:40:51Z"
        },
        {
          "tag": "v27.3.0",
          "kind": "minor",
          "published_at": "2026-05-20T12:08:51Z"
        },
        {
          "tag": "v27.2.0",
          "kind": "minor",
          "published_at": "2026-05-12T11:04:53Z"
        },
        {
          "tag": "v27.1.0",
          "kind": "minor",
          "published_at": "2026-05-06T14:51:49Z"
        },
        {
          "tag": "v27.0.4",
          "kind": "patch",
          "published_at": "2026-05-05T11:31:27Z"
        },
        {
          "tag": "v27.0.3",
          "kind": "patch",
          "published_at": "2026-05-04T09:49:39Z"
        },
        {
          "tag": "v27.0.2",
          "kind": "patch",
          "published_at": "2026-05-02T20:27:03Z"
        },
        {
          "tag": "v27.0.1",
          "kind": "patch",
          "published_at": "2026-05-02T09:12:55Z"
        },
        {
          "tag": "v27.0.0",
          "kind": "major",
          "published_at": "2026-05-01T17:37:38Z"
        },
        {
          "tag": "v26.3.2",
          "kind": "patch",
          "published_at": "2026-01-24T12:30:03Z"
        },
        {
          "tag": "v26.3.1",
          "kind": "patch",
          "published_at": "2026-01-11T14:12:37Z"
        },
        {
          "tag": "v26.3.0",
          "kind": "minor",
          "published_at": "2026-01-09T21:34:53Z"
        },
        {
          "tag": "v26.2.0",
          "kind": "minor",
          "published_at": "2025-12-18T08:58:39Z"
        },
        {
          "tag": "v26.1.0",
          "kind": "minor",
          "published_at": "2025-12-11T18:07:19Z"
        },
        {
          "tag": "v26.0.1",
          "kind": "patch",
          "published_at": "2025-12-10T18:22:45Z"
        },
        {
          "tag": "v26.0.0",
          "kind": "major",
          "published_at": "2025-12-10T17:55:20Z"
        },
        {
          "tag": "v25.4.0",
          "kind": "minor",
          "published_at": "2025-11-02T14:18:35Z"
        },
        {
          "tag": "v25.3.1",
          "kind": "patch",
          "published_at": "2025-10-24T13:54:27Z"
        },
        {
          "tag": "v25.3.0",
          "kind": "minor",
          "published_at": "2025-10-17T21:22:50Z"
        },
        {
          "tag": "v25.2.0",
          "kind": "minor",
          "published_at": "2025-10-12T14:00:34Z"
        },
        {
          "tag": "v25.1.0",
          "kind": "minor",
          "published_at": "2025-09-05T06:58:13Z"
        },
        {
          "tag": "v25.0.0",
          "kind": "major",
          "published_at": "2025-07-16T12:54:41Z"
        },
        {
          "tag": "v24.9.0",
          "kind": "minor",
          "published_at": "2025-06-30T08:51:36Z"
        },
        {
          "tag": "v24.8.1",
          "kind": "patch",
          "published_at": "2025-06-01T04:39:26Z"
        },
        {
          "tag": "v24.8.0",
          "kind": "minor",
          "published_at": "2025-05-30T15:16:12Z"
        },
        {
          "tag": "v24.7.0",
          "kind": "minor",
          "published_at": "2025-05-13T05:22:01Z"
        },
        {
          "tag": "v24.6.0",
          "kind": "minor",
          "published_at": "2025-05-05T05:05:14Z"
        },
        {
          "tag": "v24.5.3",
          "kind": "patch",
          "published_at": "2025-04-30T04:05:25Z"
        },
        {
          "tag": "v24.5.2",
          "kind": "patch",
          "published_at": "2025-03-20T22:13:36Z"
        },
        {
          "tag": "v24.5.1",
          "kind": "patch",
          "published_at": "2025-03-18T19:00:02Z"
        },
        {
          "tag": "v24.5.0",
          "kind": "minor",
          "published_at": "2025-03-13T15:13:03Z"
        },
        {
          "tag": "v24.4.0",
          "kind": "minor",
          "published_at": "2025-03-11T18:33:53Z"
        },
        {
          "tag": "v24.3.0",
          "kind": "minor",
          "published_at": "2025-03-03T18:02:06Z"
        },
        {
          "tag": "v24.2.0",
          "kind": "minor",
          "published_at": "2025-02-05T14:15:49Z"
        },
        {
          "tag": "v24.1.1",
          "kind": "patch",
          "published_at": "2025-01-29T06:22:20Z"
        },
        {
          "tag": "v24.1.0",
          "kind": "minor",
          "published_at": "2025-01-27T06:33:52Z"
        },
        {
          "tag": "v24.0.1",
          "kind": "patch",
          "published_at": "2025-01-21T13:45:22Z"
        },
        {
          "tag": "v24.0.0",
          "kind": "major",
          "published_at": "2025-01-20T19:01:15Z"
        },
        {
          "tag": "v23.5.0",
          "kind": "minor",
          "published_at": "2024-12-23T21:16:37Z"
        },
        {
          "tag": "v23.4.5",
          "kind": "patch",
          "published_at": "2024-12-20T08:09:14Z"
        },
        {
          "tag": "v23.4.4",
          "kind": "patch",
          "published_at": "2024-12-18T11:52:42Z"
        },
        {
          "tag": "v23.4.3",
          "kind": "patch",
          "published_at": "2024-12-11T16:07:08Z"
        },
        {
          "tag": "v23.4.2",
          "kind": "patch",
          "published_at": "2024-12-10T09:34:20Z"
        },
        {
          "tag": "v23.4.1",
          "kind": "patch",
          "published_at": "2024-11-23T06:14:49Z"
        },
        {
          "tag": "v23.4.0",
          "kind": "minor",
          "published_at": "2024-11-22T22:12:56Z"
        },
        {
          "tag": "v23.3.3",
          "kind": "patch",
          "published_at": "2024-11-22T12:32:32Z"
        },
        {
          "tag": "v23.3.2",
          "kind": "patch",
          "published_at": "2024-11-21T04:37:43Z"
        },
        {
          "tag": "v23.3.1",
          "kind": "patch",
          "published_at": "2024-11-14T07:23:06Z"
        },
        {
          "tag": "v23.3.0",
          "kind": "minor",
          "published_at": "2024-11-12T22:34:08Z"
        },
        {
          "tag": "v23.2.0",
          "kind": "minor",
          "published_at": "2024-10-19T22:40:46Z"
        },
        {
          "tag": "v23.1.2",
          "kind": "patch",
          "published_at": "2024-10-11T14:01:39Z"
        },
        {
          "tag": "v23.1.1",
          "kind": "patch",
          "published_at": "2024-10-08T18:22:17Z"
        },
        {
          "tag": "v23.1.0",
          "kind": "minor",
          "published_at": "2024-10-08T05:56:40Z"
        },
        {
          "tag": "v23.0.0",
          "kind": "major",
          "published_at": "2024-09-23T05:23:22Z"
        },
        {
          "tag": "v22.10.2",
          "kind": "patch",
          "published_at": "2024-09-13T05:59:13Z"
        },
        {
          "tag": "v22.10.1",
          "kind": "patch",
          "published_at": "2024-09-04T12:36:58Z"
        },
        {
          "tag": "v22.10.0",
          "kind": "minor",
          "published_at": "2024-09-03T05:42:52Z"
        },
        {
          "tag": "v22.9.0",
          "kind": "minor",
          "published_at": "2024-08-26T16:58:54Z"
        },
        {
          "tag": "v22.8.0",
          "kind": "minor",
          "published_at": "2024-07-30T03:33:14Z"
        },
        {
          "tag": "v22.7.0",
          "kind": "minor",
          "published_at": "2024-07-25T06:03:35Z"
        },
        {
          "tag": "v22.6.0",
          "kind": "minor",
          "published_at": "2024-07-15T04:23:49Z"
        },
        {
          "tag": "v22.5.5",
          "kind": "patch",
          "published_at": "2024-07-07T04:57:22Z"
        },
        {
          "tag": "v22.5.4",
          "kind": "patch",
          "published_at": "2024-07-06T07:26:57Z"
        },
        {
          "tag": "v22.5.3",
          "kind": "patch",
          "published_at": "2024-06-25T19:35:36Z"
        },
        {
          "tag": "v22.5.2",
          "kind": "patch",
          "published_at": "2024-06-24T09:48:30Z"
        },
        {
          "tag": "v22.5.1",
          "kind": "patch",
          "published_at": "2024-06-24T07:40:56Z"
        },
        {
          "tag": "v22.5.0",
          "kind": "minor",
          "published_at": "2024-06-14T05:53:55Z"
        },
        {
          "tag": "v22.4.1",
          "kind": "patch",
          "published_at": "2024-06-07T04:39:05Z"
        },
        {
          "tag": "v22.4.0",
          "kind": "minor",
          "published_at": "2024-06-06T04:27:47Z"
        },
        {
          "tag": "v22.3.0",
          "kind": "minor",
          "published_at": "2024-06-04T13:53:30Z"
        },
        {
          "tag": "v22.2.0",
          "kind": "minor",
          "published_at": "2024-05-24T14:05:00Z"
        },
        {
          "tag": "v22.1.0",
          "kind": "minor",
          "published_at": "2024-05-20T12:34:12Z"
        },
        {
          "tag": "v22.0.0",
          "kind": "major",
          "published_at": "2024-05-16T12:02:26Z"
        },
        {
          "tag": "v21.7.1",
          "kind": "patch",
          "published_at": "2024-05-05T09:47:23Z"
        },
        {
          "tag": "v21.7.0",
          "kind": "minor",
          "published_at": "2024-04-03T05:32:22Z"
        },
        {
          "tag": "v21.6.1",
          "kind": "patch",
          "published_at": "2024-03-22T14:13:02Z"
        },
        {
          "tag": "v21.6.0",
          "kind": "minor",
          "published_at": "2024-03-20T13:29:34Z"
        },
        {
          "tag": "v21.5.4",
          "kind": "patch",
          "published_at": "2024-03-13T14:06:45Z"
        },
        {
          "tag": "v21.5.3",
          "kind": "patch",
          "published_at": "2024-03-13T05:46:23Z"
        },
        {
          "tag": "v21.5.2",
          "kind": "patch",
          "published_at": "2024-03-12T15:16:03Z"
        },
        {
          "tag": "v21.5.1",
          "kind": "patch",
          "published_at": "2024-03-12T11:34:16Z"
        },
        {
          "tag": "v21.5.0",
          "kind": "minor",
          "published_at": "2024-03-12T05:42:56Z"
        },
        {
          "tag": "v21.4.0",
          "kind": "minor",
          "published_at": "2024-03-08T06:41:33Z"
        },
        {
          "tag": "v21.3.1",
          "kind": "patch",
          "published_at": "2024-02-26T13:27:05Z"
        },
        {
          "tag": "v21.3.0",
          "kind": "minor",
          "published_at": "2024-02-21T06:35:12Z"
        },
        {
          "tag": "v21.2.1",
          "kind": "patch",
          "published_at": "2024-02-11T10:19:32Z"
        },
        {
          "tag": "v21.2.0",
          "kind": "minor",
          "published_at": "2024-02-11T09:30:32Z"
        },
        {
          "tag": "v21.1.0",
          "kind": "minor",
          "published_at": "2024-01-24T05:01:38Z"
        },
        {
          "tag": "v21.0.0",
          "kind": "major",
          "published_at": "2024-01-07T14:16:46Z"
        },
        {
          "tag": "v20.0.0",
          "kind": "major",
          "published_at": "2023-12-22T04:46:02Z"
        },
        {
          "tag": "v19.3.1",
          "kind": "patch",
          "published_at": "2023-12-18T08:56:16Z"
        },
        {
          "tag": "v19.3.0",
          "kind": "minor",
          "published_at": "2023-12-18T05:30:08Z"
        },
        {
          "tag": "v19.2.0",
          "kind": "minor",
          "published_at": "2023-12-11T14:55:58Z"
        },
        {
          "tag": "v19.1.0",
          "kind": "minor",
          "published_at": "2023-11-27T11:27:57Z"
        },
        {
          "tag": "v19.0.0",
          "kind": "major",
          "published_at": "2023-11-15T15:27:26Z"
        },
        {
          "tag": "v18.0.0",
          "kind": "major",
          "published_at": "2023-11-07T12:17:03Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "1b7bde646c6c0ac4ca5bb7698b3eb9180f24717d",
          "body": "The proxy helpers were destructured from the string 'selenium-webdriver/proxy.js' instead of imported from it, so any Edge run using --proxy.* crashed with \"pac is not a function\".\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib964de21724a63db26852b9d7cd89c326fcb1959",
          "is_bot": false,
          "headline": "Fix broken proxy support for Edge (#2543)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-26T05:53:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb1789e18fd6f3ca635bd0d3243beaee2bf6fab1",
          "body": "Both options only took effect when --requestheader was also set: the BiDi header work in #2108 accidentally moved the previously independent blocks inside the requestheader branch. Chrome handles the same options independently, so Firefox runs silently blocked nothing.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I49ce3ee89010a998681b264ef39eafca1480f217",
          "is_bot": false,
          "headline": "ix Firefox --block and --appendToUserAgent being ignored (#2542)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-26T05:52:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b64bc498506b5daa701619830cfb9533b8dc5ad",
          "body": "Chrome 152 ships navigator.cpuPerformance, the browser's own coarse device rating (1 to 4, or 0 when unknown). It is a useful piece of test-environment context: the same page measured on a fast laptop and a slow CI runner is not really the same test, and recording the device tier alongside the exist\n[…]\n absent rather than zero, and nothing downstream has to change to stay correct.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com\nChange-Id: I37e3a965cb45a73b5bd4c82e03d706321a04d57f",
          "is_bot": false,
          "headline": "Collect the browser's CPU Performance API device rating (#2540)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-24T07:17:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4655ede4c6a4c0713cc7972b50da889e10336a58",
          "body": "Read the paint via the method when present and fall back to the old property\nso both current and older Chrome keep working.\n\nCo-authored-by: Claude Opus 4.8 (1M context) noreply@anthropic.com\nChange-Id: I6f0bfaac1646524e9dd52bfdfdce1dcce78f0c73",
          "is_bot": false,
          "headline": "Fix soft-navigation LCP for Chromium 151+ (#2538)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-22T05:43:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86c5a2f29867bc7bb165eb0d137e167575ed9544",
          "body": null,
          "is_bot": true,
          "headline": "new release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T08:24:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69bd401b54e8fdc089da3128f2fdd7223e2bebcc",
          "body": null,
          "is_bot": true,
          "headline": "28.2.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T08:24:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0cddc6ffaf858bddeeda62f95827a5a4ae186ab",
          "body": "Change-Id: Ifec55d00d4c70dd538ddba904ab6120912570e74",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T08:19:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e847277939d166b32b6ea84c03c3f665e7529f41",
          "body": "When the visual progress curve dips back below a threshold — a real\nbrowser behaviour where the page momentarily un-completes and repaints\n— the crossed milestones are meant to be invalidated and re-found at\nthe later time the page climbs back up. Two copy-paste typos reset\nVisualComplete95 twice in\n[…]\ny wrong for every dashboard and report that reads\nit. Adds the first unit test for this file.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I9038fe3147788dddafc0805cf661fc39b0c2c7fc",
          "is_bot": false,
          "headline": "Reset VisualComplete99 when the page repaints backward (#2537)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:28:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "045141954fffef8268d662550ccaf7b420b55695",
          "body": "compare() is the hot path of frame processing — every\nduplicate-elimination, render-start and orange-frame check runs\nthrough it for every frame pair. It only needs the number of\ndiffering pixels, but argwhere materializes an index array of every\nmatching pixel, which is most of the frame on every c\n[…]\nurns the same number with no\nallocation. Verified byte-identical metrics on a real recording.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I2e5f31ee03f7c556d14a13937a659c2ebba58fe9",
          "is_bot": false,
          "headline": "Count differing pixels without materializing them (#2536)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:06:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f610b8c76bf296605be347f75de76a94a8ab7ee2",
          "body": "Every visual metrics install has been pulling in OpenCV and pyssim,\nbut OpenCV is only used by --contentful and pyssim only by\n--perceptual — opt-in metrics most users never enable. The\ndependency check now fails on a missing module only when the flags\nthat need it are in play, so a default setup ru\n[…]\nDocker image keeps installing everything so --contentful\nand --perceptual keep working there.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I649a4e4beeed67a1bcd5ac3bded3ffed71c04cad",
          "is_bot": false,
          "headline": "Only require OpenCV and pyssim when their metrics are requested (#2535)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T07:06:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa21aab7cee149b13b30dbaa59128fdbe8f275b8",
          "body": "Per-frame diffs answer \"what changed in this frame\", but the question\nthat cost us days on a recent Last Visual Change hunt was \"which\nparts of the page keep changing\" — invisible re-rasterization noise\nlooks exactly like real churn until you see it accumulated. The diff\nloop already walks every adj\n[…]\ns track restlessness\nover time. Everything rides the existing videoParams.filmstripDiff\nflag.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I7022eb7f85d235adb8fff95838296f2107c2a520",
          "is_bot": false,
          "headline": "Add a visual instability heatmap to the frame diffs (#2533)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T06:21:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "747a00695b6cf0d450dda06be4ce60f6e0cd3774",
          "body": "The repo carried two visual metrics scripts, but only the portable\none is invoked or shipped in the npm package — the old\nImageMagick-based visualmetrics.py has been unreachable for years and\nits 2 600 lines kept showing up in searches and audits as if they\nwere live code. The portable script itself\n[…]\nuite and a full end-to-end run on\na recorded video produce identical output before and after.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3688b38c986644f4dacc7def8bc61b50e4cf84bb",
          "is_bot": false,
          "headline": "Remove dead code from visual metrics (#2534)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T06:21:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0241d7e926e0c7dfecf6232515f2616d26d3ba78",
          "body": "* Add opt-in noise tolerance to Visual Metrics frame elimination\n\nBrowsers can re-rasterize the whole page long after it is visually\ndone, leaving invisible sub-pixel noise on glyph edges. Duplicate\nframe elimination allows only a handful of differing pixels, so on a\npage-sized frame the noise count\n[…]\n entirely, so exist\ninstances that see the noise can opt ia\ncase while a real change as small as 2.\n\nCo-authored-by: Claude Fable 5 noreply\n\n* fix\n\nChange-Id: I1e97119695bddbda48df1c14218f26ccc21eb059",
          "is_bot": false,
          "headline": "Add opt-in noise tolerance to Visual Metrics frame elimination (#2528)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:51:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7838727818efec812b18a5e16a5c31816df42e8c",
          "body": "Report UIs cannot read frame pixels when a result is opened from\nfile:// — the canvas is tainted and fetch is blocked — so an exact\n\"what changed in this frame\" view was impossible exactly where people\ndebug local results. Visual metrics already walks every adjacent\nframe pair with Pillow in hand, s\n[…]\ne stored. PNG on purpose — mostly white\nplus sparse red compresses far below the frame JPEGs.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I469edacc66efa9386d20867d9d8cf08953337115",
          "is_bot": false,
          "headline": "Precompute filmstrip frame diffs in visual metrics (#2531)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:44:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f4fbdc1337051a07d4291d1a806faf1e6a703473",
          "body": "The Speed Index, visual progress and visual change math in\nvisualmetrics-portable.py had no test coverage at all: the existing\ntest file imported the mozilla-central Python packaging of the old\nscript, which does not exist in this repo, so it could never run.\nAny change to the metric calculations wo\n[…]\nin either order. A\nnew dedicated GitHub Action runs the suite; it finishes in under a\nsecond.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I625e90cf2b0edea9786ddf1d46bf7a69b240bc13",
          "is_bot": false,
          "headline": "Test the visual metrics calculations in CI (#2532)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-20T05:35:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3f3e529eabf381095507dba4d1c5d57348054b77",
          "body": "* Split style invalidations at first paint\n\nThe invalidation counts lump the page being built together with churn\non a page the user is already looking at, so consumers guess from\nreason categories — and guess wrong: post-paint \"Added to layout\"\nevents hide inside the construction-dominated totals.\n\n[…]\n\nthe output backward compatible.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I4f20f7ba702cbfcd9e5ef2ec9679e968724bbe0b\n\n* fix\n\nChange-Id: I5584a5a8b390f6f2b8287b61b0cd468c4730f78e",
          "is_bot": false,
          "headline": "Split style invalidations at first paint/lcp (#2530)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-19T18:02:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e03efec5ff1a7eb8734e7cbdec8bbe3879d2062",
          "body": null,
          "is_bot": true,
          "headline": "new release",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T15:40:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9566372c4e6711fb67e8e9b6049d59875612ab28",
          "body": null,
          "is_bot": true,
          "headline": "28.1.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-17T15:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6da7a856c9f06ba8cfe52a84ecff2b8f2cbde694",
          "body": "Change-Id: I186e9cd9f88dcef71ec58217214475c1f4c91d72",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T15:36:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64039c498e9507afd1b2777815b58d73f7e79941",
          "body": "labelForUrl assumed a page has one general bundle (no only= parameter) and gave it the bare load.php[scripts] label. Real pages lazy-load several general batches over time, so the bare label collides as soon as there is more than one — on en.wikipedia.org the page bundle and the popups batch became \n[…]\nformat now is safe: 28.1 is unreleased, so no time series depend on the bare batch label yet.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I8d4d30a7242b1914b88b6817de27a3892c1ae38d",
          "is_bot": false,
          "headline": "Label every multi-module load.php batch with its first module (#2527)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:59:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ec86283dd222e30764fd2bc43aebe39900df829a",
          "body": "On MediaWiki sites several frames can all blame the same giant load.php URL, which makes the culprit list unactionable — three identical rows with different numbers. The scripts now get the same label treatment as cpu.urls (load.php[startup] and friends), applied Node-side after each URL. Additive field only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5d11ea7936d9b61699539b0fe00b01fda200eb71",
          "is_bot": false,
          "headline": "Resolve LoAF script URLs to ResourceLoader module labels (#2525)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:39:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8ffacc41d1ccc91107ce0c938c1da49f4defaa5",
          "body": "executionStart reveals queue/compile delay before a script ran (executionStart - startTime), and pauseDuration separates a script that computed the whole time from one that sat in a synchronous pause like alert or sync XHR. With these the LoAF data carries every per-script field the API exposes, so \n[…]\nript diagnosis downstream never has to wait for another engine release. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5100834932fc443b9be7544ca80f44fcf0be2c6a",
          "is_bot": false,
          "headline": "Ship the remaining LoAF per-script fields (#2526)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:36:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a582e8ce98bcf012580febf705ae6057a5cffd97",
          "body": "The loaf pageinfo script deliberately ships only the 10 frames with the most blocking, so any total computed from it understates busy pages and users compare a lower bound against TBT without knowing it. The new pageinfo.loafSummary key carries frame count, total blocking and total duration over all frames, computed before the cut. A sibling key keeps the existing loaf array untouched.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0b9788a79d8b637d3e500c00151d5fc2d26ac93d",
          "is_bot": false,
          "headline": "Add a LoAF summary with totals over every long animation frame (#2524)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5c8a307777fb1101a5fb5c71c2d1e315cc02ae4",
          "body": "…ata (#2523)\n\nThe frames are sorted by blocking time, so without a timestamp there is no way to tell render-critical pre-LCP work from harmless post-load churn — the single biggest triage question. firstUIEventTimestamp also says whether an input was waiting during the frame, which is the INP connection the docs currently only assert in prose. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0c27f60b409f5e9b83a5c2f00bf881a781c8a2d8",
          "is_bot": false,
          "headline": "Ship frame startTime and firstUIEventTimestamp in the LoAF pageinfo d…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5856eabae849d183f91ebc920e38ae1ea196f4dd",
          "body": "Without them a frame's blocking time can only be credited to every script that ran in the frame, so downstream tools (the sitespeed.io report) show competing heuristics instead of an answer to \"which script do I fix\". With start and duration per script, blocking can be attributed proportionally to actual run time. Additive fields only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I42dd752ecc6c55f81f9703389eff20293a37a8b6",
          "is_bot": false,
          "headline": "Ship per-script startTime and duration in the LoAF pageinfo data (#2522)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T14:30:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e198409d6543825d69de3340165b6cfab4c0c73",
          "body": "Change-Id: I2cba34d0ed50de9803e760f8369d2da87d2380d9",
          "is_bot": false,
          "headline": "28.0.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T12:12:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db7666a3219d6bb64e6a76fa035ee5e7bd1e2dd9",
          "body": "Change-Id: Ic4a739dae4195af3e1b5789d8bd28c2fba3143d6",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T11:57:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3821eebb2a909ff9b410e2a9d0859c11c062a13f",
          "body": "The invalidation source list attributed DOM churn to URLs, which on bundled sites collapses into one giant load.php row — 1,680 invalidations from \"the big bundle\" names no owner. Sources are now aggregated per module when the coverage bundle resolvers are available, using the same position join as \n[…]\nl sites, so the row splits into the modules whose code actually invalidates style and layout.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ieec4807d1d7a37c9e96dc297f543ebf174b8666f",
          "is_bot": false,
          "headline": "Resolve invalidation sources to their ResourceLoader module (#2521)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T11:26:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f52c655df09010c0a0cd1c4d6fcde163b73f5c27",
          "body": "The new timer list identifies each timer by its install position, but on bundled sites a position like load.php[scripts]:418 says nothing about whose code it is. Install sites inside concatenated bundles are now resolved to the owning module via the coverage-path resolvers, the same join module and \n[…]\nurns out to be jquery's deferred machinery, an answer the line number alone could never give.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I25d76517408ac4b4c3206293ced65603a56d4f85",
          "is_bot": false,
          "headline": "Resolve timer install sites to their ResourceLoader module (#2520)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:53:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6615261f5d026b45763ebd1d5257b06aec6276bf",
          "body": "The timer pressure summary said a script installed 47 timers costing 70 ms but not which timers — and timer callbacks are usually anonymous, so the reader had nowhere to go next. cpu.timers now includes the timers themselves, grouped by install site (installer source position, timeout and kind), so \n[…]\nr with its install count, fire count and fire time instead of disappearing into an aggregate.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I6f5aa53c2e862b9a2bb2995d51ef382ea4f60830",
          "is_bot": false,
          "headline": "List the individual timers behind the per-script totals (#2519)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:17:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "516e182322354ba1d03059a4eb37661c276b5950",
          "body": "…2518)\n\nTimer callbacks are usually anonymous, so timer-heavy pages showed the cost under setTimeout with no owner. cpu.timers joins TimerInstall events with the cost of the TimerFire tasks — already chained back to the installer by the task tree — per script: installs, fires, main-thread fire time, plus timeout-0 and recurring counts that expose oversliced work and polling loops.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3d7d5765137615952dcfaed25a241f802c698ef5",
          "is_bot": false,
          "headline": "Attribute setTimeout/setInterval pressure to the installing script (#…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:03:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0469219ad001feb0bc4fcb174d36d759b58c48b9",
          "body": "Style and layout often dominates main-thread blocking but nothing said which selectors the recalc time went to. The profile run now also enables Chrome's SelectorStats category and the trace parser aggregates it into cpu.selectorStats: the slowest selectors by elapsed matching time, and the wasteful\n[…]\nvable cost. The extra category only runs on the profile run so measured runs stay unaffected.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ia849a4498e1fe85981b180148b6f01a536d8cc9d",
          "is_bot": false,
          "headline": "Surface CSS selector matching cost from the profile run (#2517)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T10:01:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2e0a149b9ab0b04287f38dd93a7a084a5b293895",
          "body": "The invalidation-tracking trace category has been collected with --chrome.timeline for years without being parsed, so the recalculate-style totals could say how much invalidation work happened but never why. cpu.styleInvalidations now aggregates those events by reason, by trigger (which class or att\n[…]\nng \"style is expensive\" into \"this script toggles this attribute hundreds of times per load\".\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I5fcde67f541b76745d2df3b13d0f7e65859af688",
          "is_bot": false,
          "headline": "Parse the style invalidation tracking already in every trace (#2516)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T09:57:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4162adf718047b88af26e666edcab011fa5276a4",
          "body": "The slowest-functions table could show that MediaWiki's runScript had a small self time but a huge total, and nothing more — the reader couldn't tell where the total went. Each cpu.functionCosts row now carries the top callees its non-self time was spent in, derived from the sampled call tree's edge\n[…]\nnScript → jquery, ext.wikimediaEvents, …), which is the answer the total alone couldn't give.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I1ef213cbb34ad36dd30c42b1675b67f6f9db7264",
          "is_bot": false,
          "headline": "Break orchestrator function totals down by callee (#2515)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T08:31:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e28480cc26996cd7768fb9623818295247c3650d",
          "body": "cpu.nonCompositedAnimations reported a raw compositeFailed bitmask, and Chrome often omits the unsupportedProperties list — so consumers could only say \"an animation failed\" with no way to tell a harmless case from a real problem. The bitmask is now decoded into failureReasons strings using Blink's \n[…]\n visible change\" — benign — which is exactly the distinction the raw number couldn't express.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ic1e405105610767cfb5c5483f5042fe25055d8df",
          "is_bot": false,
          "headline": "Decode why animations could not be composited (#2514)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T08:13:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5c5a6f8096aeb0341c83d0b5837441808a51f0e3",
          "body": "Almost a fifth of cpu.categories landed in 'other', which reads as mystery time. Measuring real Wikipedia traces showed 90% of it is Chrome's task-scheduling overhead (RunTask self time) and most of the rest is document body-loading and V8 interrupt events the classifier didn't know. Those now go to\n[…]\n so what remains in 'other' really is scheduling overhead and consumers can label it as such.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Iff3c9ea38bbce022b6b71d9eb67eb8421986828a",
          "is_bot": false,
          "headline": "Classify document-loading and V8 housekeeping out of 'other' (#2513)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T07:37:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eadbfb6c2b5e2be7255464a03f253da636217769",
          "body": "The per-script blocking attribution answered \"which script blocked\" but a page blocked by parsing its own large HTML or by style/layout showed up as an anonymous 'unknown' row — and the fix for parse or layout blocking is completely different from the fix for script blocking. Each blocking task's su\n[…]\ning-time.js only, keeping the main-thread task walker byte-equivalent for cpu.urls consumers.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I812e10a1369a127d1f22308cd7a6b57e0114c9f0",
          "is_bot": false,
          "headline": "Split blocking time by kind of work and name the HTML document (#2512)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T07:31:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9a5bcd4033bbe804a1245d81e6700aa5cb188604",
          "body": "The extra run made by --enableProfileRun has always collected V8 sampling-profiler data in the trace, but the only way to use it was to open the trace by hand in DevTools. Parsing it into cpu.functionCosts lets consumers like sitespeed.io answer the question the existing per-URL and per-module numbe\n[…]\nhp URLs; truncated URLs are recovered by unique prefix match so the output stays consistent weCosts.\n\nCo-authored-by: Fable 5 noreply@anthropic.com\nChange-Id: I290ea518d6ac295d5eb9ee5602c2dbce85a6b367",
          "is_bot": false,
          "headline": "Surface slow JS functions from the profile run (Chrome) (#2511)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-17T05:38:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d93607ea9260149c0080e9b84ca0475fa2716e67",
          "body": "Node 20 reaches end of life and the TypeScript scripting support already needs a newer runtime, so the floor moves to 22: the engines field, the CLI's runtime version check and the lockfile's root entry. CI already tests on 22 and 24, so the matrix is unchanged.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib345e8d4f532014d9122664a238dbe17ecc71e60",
          "is_bot": false,
          "headline": "Require Node.js 22 (#2510)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T15:27:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0eda1d273950adcb0f5c29e1b2452b4f90418e72",
          "body": "CSS coverage keyed inline stylesheets by whatever sourceURL Chrome reported: parser-inserted style tags carry the document's own URL and JS-injected ones an empty string, so on Wikipedia the report collapsed into two anonymous buckets and nobody could see which template ships the dead CSS. The ownin\n[…]\ne untouched. JS-injected ResourceLoader style batches carry no attributes and stay unlabeled.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Idaf1e42e222becf1ceaa19910457626d41a227ea",
          "is_bot": false,
          "headline": "Attribute inline CSS coverage to MediaWiki TemplateStyles (#2509)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T14:00:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "174a075f67b9364683e7066b3bdd3bf38d9048c9",
          "body": "To the CLI, enableProfileRun means \"make one extra profile run\", but inside the engine the same flag means \"this run IS the profile run\": it renames traces to trace-N-extra-run.json and suppresses the result log line. Because the flag leaked into the measured runs' engine, combining --cpu with --ena\n[…]\ne extra engine, so measured traces keep their names and both trace sets survive side by side.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I817c3a7b664cf08578560fa7379b14781a1cb67e",
          "is_bot": false,
          "headline": "Keep measured runs unaffected by --enableProfileRun (#2508)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T13:54:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "371df91110337a3fa2ab4873ba7abb0edcf9911f",
          "body": "Every other URL-keyed surface (cpu.urls, cpu.blocking, scriptCosts, coverage files) carries the deploy-stable ResourceLoader label, but the per-module CPU bundles did not, so consumers had to rebuild display names by cross-referencing cpu.urls for the same URL. The bundles now get the same additive label field from the same labeler.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Iced4e721c511c8fa7426589d636b285f2edb4202",
          "is_bot": false,
          "headline": "Stamp stable labels on cpu.moduleCosts bundles (#2507)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T13:46:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7597e49ffcdd97fb1b9b980f0c644bff4f8689c9",
          "body": "Jank and smoothness regressions are invisible in load metrics: a page can hold its LCP while starting to drop frames. The frame events were already in the trace (disabled-by-default-devtools.timeline.frame) but never parsed. The new cpu.frames key reports presented/partial/dropped frame counts, effe\n[…]\n dropped-frame counts are dominated by harmless no-damage frames. Additive, Chrome/Edge only.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I1908504c3b3253cdc4fb0e6dcdeb94741229e6bd",
          "is_bot": false,
          "headline": "Add frame stability metrics from the Chrome trace (#2506)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:42:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24acb17e022aa78281f1205c078eae76b195c67c",
          "body": "… modules (#2505)\n\ncpu.urls can say a load.php bundle used 267 ms of main thread, but a bundle concatenates dozens of modules owned by different teams, so nobody knows which module to fix. When both a Chrome trace and coverage are collected, the coverage path already has each bundle's source; the mo\n[…]\nhe analysis runs where trace and coverage meet and only detects bundle URLs and delegates.\n\n  Co-authored-by: Claude Fable 5 noreply@anthropic.com\n\nChange-Id: I55f4d39e50e4303e5762a080ac9e04bd0a056944",
          "is_bot": false,
          "headline": "Attribute main-thread CPU time to individual MediaWiki ResourceLoader…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:34:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcf103a208321917517ac87cf0a1c3a206bc5195",
          "body": "…ata (#2504)\n\nOn MediaWiki sites every URL-keyed metric (cpu.urls, cpu.blocking, scriptCosts, forcedReflows, coverage files) keys on load.php URLs that are over a thousand characters long and embed a version= parameter that changes on every deploy. A dashboard trending a per-bundle series gets a bra\n[…]\noutput. All MediaWiki-specific logic stays isolated in lib/chrome/mediawikiResourceLoader.js.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib655d37d9b11067d957024415d542a85c894af61",
          "is_bot": false,
          "headline": "Stable labels for MediaWiki ResourceLoader URLs in CPU and coverage d…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T11:23:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6a4c7dc8daf94626b316200abade9d9754ed7789",
          "body": "cpu.urls says which script uses the most main-thread time overall, but not which one blocks the page when it matters. The new cpu.blocking key answers \"which script should I fix first\" by attributing long-task blocking time (the over-50 ms portion) per URL, both for the whole trace and inside the na\n[…]\nkeys under result.cpu, Chrome/Edge only, derived from the trace already collected with --cpu.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: Ib308398c5c4d0286eee669983b8ec0e63860b9a0",
          "is_bot": false,
          "headline": "Attribute main-thread blocking time to scripts and domains (#2503)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:48:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3cb935404a3aad60e06742317f412fb359c99ad9",
          "body": "The beforeFCP/beforeLCP totals (elements affected, time spent) can't distinguish one massive style invalidation cascading through most of the DOM from thousands of small forced recalcs caused by JS interleaving style reads and writes — two problems with opposite fixes. The number of events, and the size of the largest one, tell you which regime you're in without opening the trace.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I7a486ec382bf155fe3865b5ffc6a481c6c34807f",
          "is_bot": false,
          "headline": "Add event count and largest event to recalculate style summary (#2496)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:31:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f19a925e96828b7bacdd5ba9a7f796185a89a62",
          "body": "MediaWiki sites serve tens of JS modules concatenated into single load.php responses, so V8 coverage keyed everything on one giant bundle URL and a dead-code or size regression could never be traced to the module that caused it. Each module in the bundle is delimited by an mw.loader.impl call carryi\n[…]\non the existing per-file entry, so non-MediaWiki sites and existing consumers are unaffected.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I0d14728a881e3fc15ac5058ad4fa4fbd893ce67f",
          "is_bot": false,
          "headline": "Per-module coverage for MediaWiki ResourceLoader bundles (#2502)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:24:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6cce2b99cc74c6240156fa43355dd8fe9d5b5ba2",
          "body": "…(#2501)\n\nWhen --enableProfileRun fills in coverage, the sample comes from one extra side iteration and is not tied to any measured run. Publishing it as a one-element array made it look keyed by iteration, and consumers indexing by run number (like the sitespeed.io coverage tab picking the median r\n[…]\nell the two cases apart. Per-iteration coverage from --chrome.coverage keeps its array shape.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I8c9ff3810895cd9ec2d5b374abb3b5e7f049e402",
          "is_bot": false,
          "headline": "Mark profile run coverage as a single sample, not an iteration array …",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:24:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "145086e60f3bd996cb3516a75f95c378b0eda126",
          "body": "When testing CDN-fronted sites, response headers of the main HTML document decide how to interpret every metric of the run: x-cache / x-cache-status tells you whether the run was a front-cache hit, age how warm the object was, and server-timing often carries A/B experiment enrollment. Until now they\n[…]\n two can never drift, which means there is no privacy footgun in enabling it unconditionally.\n\nCo-authored-by: Claude Fable 5 noreply@anthropic.com\nChange-Id: I3e090516b25bedf0fded49fb3ae4cf7c1aac97de",
          "is_bot": false,
          "headline": "Surface main document response headers in the result JSON (#2500)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T09:03:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1e4c8ce9e7940dc77d7494bd81a201a06fd01f2b",
          "body": "Change-Id: Id894d497757b928f1cf6a08abf0607f6f126d1bf",
          "is_bot": false,
          "headline": "Update to throttle 6.0.1 (#2499)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-07-16T07:55:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7cf37761a0d10cd7246dd25247e8050f8981204",
          "body": "Change-Id: I1a823ec33c8ac206147f225d31f7be1c05b78488",
          "is_bot": false,
          "headline": "Correct license in package.json",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-10T02:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9639d5e0d0c535b2abb2d07e95289b5471f24974",
          "body": "Change-Id: I7593bf275646b19b19a773733b4f458a2534f519",
          "is_bot": false,
          "headline": "Correct tags",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-10T02:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee9cefd40ec71fa1800d245dee054bfd613a146",
          "body": "Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I2fa553b3cb3141328cba8ca95dfb1e7318460089",
          "is_bot": false,
          "headline": "Run releases via GitHub Actions with npm provenance and SBOM (#2491)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-09T18:40:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d478bb8d0392b56b519c48132b2d5c8ff29a443b",
          "body": "Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I206631516b2e2749bc3655e02d24d8459d286b2b",
          "is_bot": false,
          "headline": "Bump step-security/harden-runner to v2.19.4 (#2490)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-09T18:20:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fb30078cc7b23d5cbc8fa765ea12dc5d9430602",
          "body": "Change-Id: Ib3dea5672ce6633d3f0b4ec8ead752a7d01ea932",
          "is_bot": false,
          "headline": "27.5.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:05:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "861ec275c496a8336ae783bd0437a21c88758727",
          "body": "Change-Id: I5ce3d2ce867daf5798946d719966cf89cb6779e9",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:05:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0445ebc976c05239b22431aaade426bf1624de5d",
          "body": "Change-Id: I339e53b17e6d29a6fdade4d154234bb2251a7ffd",
          "is_bot": false,
          "headline": "Include URL and iteration number in failure messages (#2489)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T05:02:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "038320521e97f044ad9780bd2dfae502f61cee63",
          "body": "Change-Id: Ifdbd3d8a40f89d19e4fea4d7297b29cf8f4c23e8",
          "is_bot": false,
          "headline": "Edge 149 (#2488)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "270107464a701557836ab4544d4eabbd14caf708",
          "body": "Change-Id: Ibbe67c193a568c7d8d32d0bd69a971044787a94b",
          "is_bot": false,
          "headline": "Update chrome and edgedriver to 149 (#2487)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:23:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4be879d06b59743376a923fb1c432cac7cedfee7",
          "body": "Change-Id: Iabe44e0d68429c8e03a89ee1f445dacca0b2a1f4",
          "is_bot": false,
          "headline": "It's been a while since we updated (#2486)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-06-07T04:06:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a3bc371fc195948ced3b058f53d101bbd3e8a86",
          "body": "Change-Id: I62e683809bb95306de6302479118ed756f515783",
          "is_bot": false,
          "headline": "27.4.1",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T13:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb273959c23aabcd30b9b86dd120dd58807b61e",
          "body": "Change-Id: I6ab0ae3030b336c5f159879e26a2e500dac27b22",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T13:18:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa94b4ccfacd0920d97a0ae4bdb7e1e19c223e7c",
          "body": "…484)\n\n--chrome.coverage ships V8's detailed (block-level) coverage data, but the JS used-bytes calculation took the union of every range whose count was\n  greater than zero. V8 returns nested ranges: an outer range over the function body and inner ranges over sub-blocks. If a function ran at all, i\n[…]\nrns flat, non-overlapping ranges and continues to use unionLength unchanged.\n\n  Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\n\nChange-Id: I847673d9859f0e2aec1164c045d7f0b47c4816b5",
          "is_bot": false,
          "headline": "coverage: count dead branches inside executed functions as unused (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-25T10:22:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "176fafc54d8304c25dfe2bf9acd2425d3b388b50",
          "body": "Change-Id: I296bddf42b955d4c03e08021b41cdca8afb27b01",
          "is_bot": false,
          "headline": "27.4.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:39:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72cd0903e573718d0ffb228ec126c26e309b9a25",
          "body": "Change-Id: Iee8299b48ce687aa825f6df0d58ea367536f7de2",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18a6e17db8fbd96fbd3cbf6a88bd60454ecab180",
          "body": "Coverage is exposed two ways. --chrome.coverage runs it on every\n  iteration for users who want the data and accept that detailed V8\n  coverage deoptimizes scripts and will skew their timing metrics.\n  --enableProfileRun also turns coverage on for Chrome, alongside the\n  existing trace, so users who\n[…]\nercent), so the\n  \"which file should I tree-shake\" question is answerable from the\n  main JSON alone.\n\nCo-authored-by: Claude noreply@anthropic.com\nChange-Id: I28526039a799d0efa5f1f4da81d6dfa66d1ec8c3",
          "is_bot": false,
          "headline": "Add JS/CSS coverage collection for Chrome (#2480)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T09:31:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33d17635b46f8209d2fd4d36a93fc6040a561ed2",
          "body": "Occasionally a HAR contains a page object whose pageref has no matching\n  entries — typically a navigation that didn't produce any requests, or\n  an extension-injected page. Three places in lib/support/har/index.js\n  treated this shape as impossible: getDocumentRequests dereferenced the\n  result of \n[…]\ntry/catch in\n  getMainDocumentTimings stays as a safety net; the existing unit tests\n  still pass.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I5c6f2d7445bfdf1159c883f7dfc8f70d10bd3b32",
          "is_bot": false,
          "headline": "har: skip pages with no matching entries instead of throwing (#2483)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T06:38:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d5108b4e3c12fe715dcd59670bc6b3b4d49e1182",
          "body": "Change-Id: Ib67c73badb7f9a265348170777b1e834a34da533",
          "is_bot": false,
          "headline": "Bump geckodriver with ARM-64 support (#2482)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-24T06:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c49464308380a56ae46c3ac19c7a3cd4d860d2d9",
          "body": "* Make the Safari CI workflow use the local test server and pin Mac OS",
          "is_bot": false,
          "headline": "Make the Safari CI workflow use the local test server (#2481)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-23T15:47:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06d5288d1066dd0b44d6a651f50a9907c3d11cea",
          "body": "Change-Id: If897909a2c75469050ee2d9b3bacd2d6cdc3eaeb",
          "is_bot": false,
          "headline": "27.3.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:08:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1823d8b95fcee8221908e0043add446fb951edad",
          "body": "Change-Id: I73d9ff4a93c2d4b774b598e13229d7771c5514c9",
          "is_bot": false,
          "headline": "types",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22390055536590654dab4870eeb49fcb7bf85224",
          "body": "Change-Id: I28df6067ed9f307bfb94b5207512332189262035",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa9672f9160610aad560a1f3769fdffada1a3523",
          "body": "Change-Id: I961434a74d427d79d3b7e91f8619110280fd1de5",
          "is_bot": false,
          "headline": "Audit fix",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T12:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3fcadeac22d561a113e5399304930d581f632fc",
          "body": "commands.mouse was an anonymous object literal, so every parameter\n  showed up as any in IntelliSense and hover. Replace the inline\n  @type {Object} placeholder with a real shape so selector is typed\n  as string and singleClick's options surface their waitForNavigation\n  flag instead of any.\n\n  meas\n[…]\n as Promise<unknown> so callers have to acknowledge the result\n  shape rather than inheriting any.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I176fd306ee24324f3792663341845b281d9087e0",
          "is_bot": false,
          "headline": "Tighten types on the mouse and measure surfaces (#2479)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T07:25:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f946c1392c14e7a88ceb6bd7c84e8a9c0ce193e4",
          "body": "The two arguments script authors always touch — context.options and\n  context.result — were typed as bare Object, so \"context.options.\"\n  returned no completions in any editor. Re-type them (and the taskData\n  scratch space) as Record<string, any>, which keeps the runtime behavior\n  unchanged but le\n[…]\nkes effect, and drop a couple of\n  @typedef blocks that had been parked inside a constructor body.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I079355e096d366c6cc328ee2c2cb23491f4250a6",
          "is_bot": false,
          "headline": "Give the Context script API meaningful types (#2478)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T06:33:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f86fd61700c81dd5fe0de5c5d8564498702cf5a",
          "body": "Move scripting.d.ts to the repo root so it sits next to package.json\n  instead of inside the tsc outDir, where a future include-glob change\n  could clobber it. Swap the order under exports so \"types\" comes before\n  \"import\", which matches TypeScript's documented resolution rules and\n  removes a haza\n[…]\nmmon package.json mistakes fail before a release\n  goes out instead of being discovered by a user.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I4bcc7cc7fdd604f6977b850dcfc9430bdf1daa92",
          "is_bot": false,
          "headline": "Tighten how Browsertime publishes its TypeScript types (#2477)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T06:31:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "132ee83a9d60b077d32522f9fcfea852e3a1aa23",
          "body": "The high-level helpers added to commands (navigate, find, getText,\n  fill, hover, press, getTitle, waitForUrl, …) were annotated with\n  @type {Function}, which overrode the JSDoc @param/@returns and\n  emitted Function — effectively any — in the generated .d.ts. As a\n  result, none of those very comm\n[…]\nth context and commands\n  typed in one line, without spelling out the two underlying type\n  names.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I1f6f7d9110e5caf695de063745b5d16bef25ab24",
          "is_bot": false,
          "headline": "Improve IntelliSense for commands and script entry point (#2476)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:48:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01599e06a3857d8f1d747442a2df7646c6f1b652",
          "body": "Routine dependency refresh to pick up upstream fixes and stay current\n  with Chrome DevTools Protocol and WebDriver releases.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Ib16dfeb9336a29ea74c261b61e503e02ed3023b4",
          "is_bot": false,
          "headline": "Bump chrome-remote-interface and selenium-webdriver (#2475)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:26:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51e736fd1d6bf6320dd4e8ea13e80a436e05e0ed",
          "body": "…… (#2474)\n\n* Use setup-ffmpeg action in Linux CI instead of fetching from johnvansickle\n\n  The static ffmpeg binary fetched from johnvansickle.com was a workaround\n  from when newer ffmpeg releases broke browsertime's video pipeline. That\n  compatibility issue is resolved now, and the third-party d\n[…]\nntained source for the ffmpeg binary.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Id1f5477ecb48b3e6133b971056a895ea99d109e9\n\n* fix\n\nChange-Id: I18e76fd71d870d8c1fca641942690ce24cf0fcea",
          "is_bot": false,
          "headline": "Use setup-ffmpeg action in Linux CI instead of fetching from johnvans…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:20:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7397d5a596f64dd4b38c76799a98ac4627555a52",
          "body": "The eslint 10 and unicorn 64 majors ship several new strict rules\n  (preserve-caught-error, no-useless-assignment, unicorn/no-immediate-mutation)\n  that flag long-standing patterns across the codebase. Disabling them in the\n  config keeps the upgrade narrow — fixing them properly is a separate clean\n[…]\n/ pragma in the Safari\n  inspector client is dropped now that WebSocket is a built-in Node global.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: Ic11598e9434169fd0662f0538dc9671b50b3e631",
          "is_bot": false,
          "headline": "Bump eslint to 10 and eslint-plugin-unicorn to 64 (#2473)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T04:03:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "57f21256162577358f4bb96697fe4febe4d6eae8",
          "body": "…472)\n\nChange-Id: Ia5c0bd45b74ed4d79a9ac6992aee77c742150354",
          "is_bot": false,
          "headline": "Bump chromedriver, edgedriver and updated package for geckodriver (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-20T03:43:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7b704b66d913f4c5bcb6c19cebf96d5d84d535f",
          "body": "Change-Id: I9e466f2eb74b5571e19c65fb3db4f51bcda34127",
          "is_bot": false,
          "headline": "Update to log 2.0 (#2471)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T20:37:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cb5f88263fac159745db263db69b00e7ac75f2f",
          "body": "Browsertime --help dumps every option from all 13 topic groups in one\n  screen, which is overwhelming for new users and slow to skim. Adopt\n  the curl/ffmpeg pattern: show a small curated subset by default, let\n  users drill into one topic at a time, and keep the full reference one\n  flag away for s\n[…]\nopic-to-keys map by wrapping yargs's .option()\n  call -- no changes to the 1400-line option chain.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I5d79c91617c5c9a06497b8306deff854c83ec5e2",
          "is_bot": false,
          "headline": "Make --help easier to navigate with topic-filtered views (#2467)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T19:11:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "959f0533a4a51af7c54e00bde1a8bb523c96c01d",
          "body": "Finishes the lodash unbundling here the same way sitespeed.io did\n  (soulgalore/sitespeed.io#4742): a 40-line merge() in\n  lib/support/util.js alongside the existing getProperty/setProperty\n  helpers, no new file. The helper matches lodash's actual semantics —\n  arrays merged by index, undefined sou\n[…]\ntime no longer pulls lodash.merge\n  itself; eslint still brings it in transitively, which is fine.\n\n  Co-authored-by: Claude noreply@anthropic.com\n\nChange-Id: I00e4737b05c626d56a5c90ae80fb544482141dad",
          "is_bot": false,
          "headline": "Replace lodash.merge with a small local helper (#2468)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T19:10:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "afde22c65a1c028267790b5da47eb761734bdab4",
          "body": "Change-Id: I4fdf23a1105b6b54ceb3dc806c98d067db64264e",
          "is_bot": false,
          "headline": "Chrome HAR 1.3.1 (#2469)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-19T13:57:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59dd64149c8a120160a1d80518ab808811256750",
          "body": "Change-Id: I24f92d1a8b63b165e14bb11f52d0bf607bd00260",
          "is_bot": false,
          "headline": "27.2.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T11:04:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d9399df7ad23d6f192fa8d6e7760749ecdc652f",
          "body": "Change-Id: If7e64f03cff03da24b7e313904bf919868d00099",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T11:03:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "055278486354b96726bbccee07e0225ca95de404",
          "body": "The recalculate-style summary that powers \"Elements that needed\n  recalculate style before FCP\" in the HTML report has been\n  trapped inside browsertime.json — every HAR-only consumer\n  (compare.sitespeed.io, third-party tooling) has had to either\n  crack open browsertime.json or do without. Per-req\n[…]\n-request map stays\n  where it already lives so the page payload stays small.\n\n  Co-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\n\nChange-Id: I35e1239c0912cbef42f1f5e3872869ae6ba8b784",
          "is_bot": false,
          "headline": "Surface page-level renderBlocking summary in the HAR (#2466)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-12T05:50:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3ac300f4b9dc4a97fdaa76d7332d14348055bf25",
          "body": "…2464)\n\nThe 14 scripting tutorials lived in jsdoc/tutorials/ and were rendered\nby clean-jsdoc-theme alongside the auto-generated class API docs. The\nsitespeed.io repo has now imported those markdown sources directly so\nthey render with the rest of the site's docs (default layout, native\nTOC, syntax \n[…]\neeps generating\nexactly as before, into the same path in the sitespeed.io repo.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I9a5a736e126ef33386e1610d939b2df2344ef091",
          "is_bot": false,
          "headline": "Drop tutorials from jsdoc — they live natively in sitespeed.io now (#…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-07T20:43:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "632f2a09c9f5bac71f0d9e5a2529cc88e0f02e8d",
          "body": "Change-Id: I1c95cd59ec1c7364d8b9c7ded2b47e87a6ac252e",
          "is_bot": false,
          "headline": "27.1.0",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:51:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aa8bb2553f993a6e3fca8f299bbde1cd0a906c5",
          "body": "Change-Id: I4f4fe468feddaa59fcc20b80bceff1526733d833",
          "is_bot": false,
          "headline": "fix",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:50:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1c9d731c7d7afed92b341726cb1f26f62009933",
          "body": "Change-Id: I5e9408bd492940461423891a29537db6edcbbc46",
          "is_bot": false,
          "headline": "new release",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:50:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a3889b1d11747c052e376a2a215d54f13afe9916",
          "body": "Change-Id: I4ab15e44f2a780aa7afce61c074bf109885e5add",
          "is_bot": false,
          "headline": "Throttle 6.0 (#2463)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1097674966afcbe4c00f828d45b5220eb9edb1f3",
          "body": "Change-Id: If371f2a503e57ccb292cb6fe3cb2bf6a1e281ebd",
          "is_bot": false,
          "headline": "Update to Chrome HAR 1.3.0 (#2462)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:23:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d34fa8c98d770c4f2bb3a32ef31c26d56057a54",
          "body": "…w analyses (#2461)\n\n- Replace the unmaintained @sitespeed.io/tracium dependency (extracted from Lighthouse circa 2017, last release 0.3.3) with an\nin-tree ESM port at lib/chrome/trace/. computeMainThreadTasks is byte-equivalent so existing result.cpu.{categories,events,urls}\nconsumers see no change\n[…]\nnts whose compositeFailed bitmask is non-zero, with the unsupported properties.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I085d3ef2bd32bcf663c6b764d1551c59a544a165",
          "is_bot": false,
          "headline": "Inline the trace parser, modernise the event classifier, add three ne…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T14:17:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d93a5dcff83c54c820ef9ab0c7d19f0b5ee9078",
          "body": "waterfall-tools and other downstream HAR consumers tint cross-origin request labels by comparing\neach entry's URL origin against the document URL of the page. The signal they read is\nentries[0]._documentURL, which the renderer needs in order to know what counts as same-origin in the\nfirst place. Unt\n[…]\n) with the URL the iteration was asked to load, which is what consumers expect.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I464b018cf5cf5be2e2e89c43437b3e32a8ebeb0c",
          "is_bot": false,
          "headline": "Add _documentURL to the first entry of each HAR page (#2460)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-06T11:50:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e6cbcc97dcbf8bde72926101528ce965e29a0be",
          "body": "Change-Id: I250c1667884b1be7267ebd5cc6c297496d2efb7a",
          "is_bot": false,
          "headline": "bump the year",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T16:50:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eb071813099bf0d23189ec7be625a46d700da6a",
          "body": "…459)\n\nThis reverts commit 362236d4ba98eb5d94600e5fdde9621ba2e5f467.",
          "is_bot": false,
          "headline": "Revert \"Only prime QuickTime once per Safari iOS session (#2458)\" (#2…",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T13:46:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362236d4ba98eb5d94600e5fdde9621ba2e5f467",
          "body": "The QuickTime \"wake the iPhone for cmiod\" step ran on every iteration\nand every page, which was noisy (\"Opening QuickTime Player to wake the\niPhone…\" once per iteration) and did unnecessary work — once cmiod\nhas enumerated the device it stays enumerated for the rest of the\nsession, so iterations 2+ \n[…]\ne), so multi-iteration and multi-page Safari iOS runs only open\nQuickTime once.\n\nCo-authored-by: Claude Opus 4.7 (1M context) noreply@anthropic.com\nChange-Id: I0734761484f157bf91b2ac94ad5143c6019ba44b",
          "is_bot": false,
          "headline": "Only prime QuickTime once per Safari iOS session (#2458)",
          "author_name": "Peter Hedenskog",
          "author_login": "soulgalore",
          "committed_at": "2026-05-05T13:41:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 271,
      "latest_release_at": "2026-07-20T08:24:45Z",
      "latest_release_tag": "v28.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 28,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 8.5
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "browsertime",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/browsertime",
          "is_deprecated": false,
          "latest_version": "28.2.0",
          "repository_url": "https://github.com/sitespeedio/browsertime",
          "versions_count": 720,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 4,
          "monthly_downloads": 23233,
          "first_published_at": "2014-10-28T19:15:22.290000Z",
          "latest_published_at": "2026-07-20T08:24:40.606000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 141,
      "stars": 649,
      "watchers": 20,
      "fork_history": {
        "days": [
          {
            "date": "2015-01-27",
            "count": 1
          },
          {
            "date": "2015-02-22",
            "count": 1
          },
          {
            "date": "2015-03-28",
            "count": 1
          },
          {
            "date": "2015-05-27",
            "count": 1
          },
          {
            "date": "2015-10-13",
            "count": 1
          },
          {
            "date": "2015-11-08",
            "count": 2
          },
          {
            "date": "2015-11-25",
            "count": 1
          },
          {
            "date": "2015-12-07",
            "count": 1
          },
          {
            "date": "2016-01-19",
            "count": 1
          },
          {
            "date": "2016-01-28",
            "count": 1
          },
          {
            "date": "2016-02-14",
            "count": 1
          },
          {
            "date": "2016-03-18",
            "count": 1
          },
          {
            "date": "2016-03-29",
            "count": 1
          },
          {
            "date": "2016-06-01",
            "count": 1
          },
          {
            "date": "2016-06-02",
            "count": 1
          },
          {
            "date": "2016-06-07",
            "count": 1
          },
          {
            "date": "2016-06-08",
            "count": 1
          },
          {
            "date": "2016-07-06",
            "count": 1
          },
          {
            "date": "2016-07-28",
            "count": 1
          },
          {
            "date": "2016-09-25",
            "count": 1
          },
          {
            "date": "2016-10-30",
            "count": 1
          },
          {
            "date": "2016-11-06",
            "count": 1
          },
          {
            "date": "2016-11-22",
            "count": 1
          },
          {
            "date": "2016-12-09",
            "count": 1
          },
          {
            "date": "2016-12-28",
            "count": 1
          },
          {
            "date": "2017-01-03",
            "count": 1
          },
          {
            "date": "2017-01-18",
            "count": 1
          },
          {
            "date": "2017-01-25",
            "count": 1
          },
          {
            "date": "2017-02-11",
            "count": 1
          },
          {
            "date": "2017-02-28",
            "count": 1
          },
          {
            "date": "2017-03-03",
            "count": 1
          },
          {
            "date": "2017-04-05",
            "count": 2
          },
          {
            "date": "2017-04-06",
            "count": 1
          },
          {
            "date": "2017-04-19",
            "count": 1
          },
          {
            "date": "2017-06-02",
            "count": 1
          },
          {
            "date": "2017-10-16",
            "count": 1
          },
          {
            "date": "2017-11-02",
            "count": 1
          },
          {
            "date": "2017-11-16",
            "count": 1
          },
          {
            "date": "2017-11-18",
            "count": 1
          },
          {
            "date": "2018-01-25",
            "count": 1
          },
          {
            "date": "2018-02-28",
            "count": 1
          },
          {
            "date": "2018-03-02",
            "count": 1
          },
          {
            "date": "2018-03-07",
            "count": 1
          },
          {
            "date": "2018-03-24",
            "count": 1
          },
          {
            "date": "2018-04-03",
            "count": 1
          },
          {
            "date": "2018-04-05",
            "count": 1
          },
          {
            "date": "2018-05-21",
            "count": 1
          },
          {
            "date": "2018-05-24",
            "count": 1
          },
          {
            "date": "2018-06-18",
            "count": 1
          },
          {
            "date": "2018-06-21",
            "count": 1
          },
          {
            "date": "2018-07-27",
            "count": 1
          },
          {
            "date": "2018-08-03",
            "count": 1
          },
          {
            "date": "2018-08-22",
            "count": 1
          },
          {
            "date": "2018-09-30",
            "count": 1
          },
          {
            "date": "2018-10-06",
            "count": 1
          },
          {
            "date": "2018-11-13",
            "count": 1
          },
          {
            "date": "2018-12-04",
            "count": 1
          },
          {
            "date": "2018-12-06",
            "count": 1
          },
          {
            "date": "2019-02-12",
            "count": 1
          },
          {
            "date": "2019-02-13",
            "count": 2
          },
          {
            "date": "2019-02-16",
            "count": 1
          },
          {
            "date": "2019-02-26",
            "count": 1
          },
          {
            "date": "2019-04-11",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 1
          },
          {
            "date": "2019-04-19",
            "count": 1
          },
          {
            "date": "2019-05-13",
            "count": 1
          },
          {
            "date": "2019-09-27",
            "count": 1
          },
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-10-19",
            "count": 1
          },
          {
            "date": "2020-01-16",
            "count": 1
          },
          {
            "date": "2020-02-07",
            "count": 1
          },
          {
            "date": "2020-03-26",
            "count": 1
          },
          {
            "date": "2020-04-20",
            "count": 1
          },
          {
            "date": "2020-04-21",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-06-15",
            "count": 1
          },
          {
            "date": "2020-06-30",
            "count": 1
          },
          {
            "date": "2020-07-03",
            "count": 1
          },
          {
            "date": "2020-07-10",
            "count": 1
          },
          {
            "date": "2020-07-28",
            "count": 1
          },
          {
            "date": "2020-08-27",
            "count": 1
          },
          {
            "date": "2020-09-16",
            "count": 1
          },
          {
            "date": "2020-10-24",
            "count": 1
          },
          {
            "date": "2020-11-03",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 1
          },
          {
            "date": "2020-12-17",
            "count": 1
          },
          {
            "date": "2021-02-17",
            "count": 1
          },
          {
            "date": "2021-02-22",
            "count": 1
          },
          {
            "date": "2021-03-06",
            "count": 1
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-05-11",
            "count": 1
          },
          {
            "date": "2021-05-14",
            "count": 1
          },
          {
            "date": "2021-05-25",
            "count": 1
          },
          {
            "date": "2021-07-16",
            "count": 1
          },
          {
            "date": "2021-07-30",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-25",
            "count": 1
          },
          {
            "date": "2021-10-16",
            "count": 1
          },
          {
            "date": "2021-12-17",
            "count": 1
          },
          {
            "date": "2022-02-14",
            "count": 1
          },
          {
            "date": "2022-03-31",
            "count": 1
          },
          {
            "date": "2022-05-06",
            "count": 1
          },
          {
            "date": "2022-08-03",
            "count": 1
          },
          {
            "date": "2022-09-20",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 1
          },
          {
            "date": "2023-01-24",
            "count": 1
          },
          {
            "date": "2023-02-17",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-03-11",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 1
          },
          {
            "date": "2023-03-21",
            "count": 1
          },
          {
            "date": "2023-03-30",
            "count": 1
          },
          {
            "date": "2023-05-19",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-06-23",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-04-25",
            "count": 1
          },
          {
            "date": "2024-05-25",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-06",
            "count": 1
          },
          {
            "date": "2025-04-03",
            "count": 1
          },
          {
            "date": "2025-05-28",
            "count": 1
          },
          {
            "date": "2025-07-16",
            "count": 1
          },
          {
            "date": "2025-11-16",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-03-03",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 133,
        "total_forks": 141
      },
      "star_history": null,
      "open_issues_and_prs": 54
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 84345,
      "source_files_sampled": 380,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.16",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-mh99-v99m-4gvg"
            ],
            "fixed_version": "5.0.8",
            "advisory_count": 1,
            "oldest_advisory_days": 1
          },
          {
            "name": "tar",
            "direct": false,
            "version": "7.5.15",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-23hp-3jrh-7fpw",
              "GHSA-8x88-c5mf-7j5w",
              "GHSA-gvwx-54wh-qm9j",
              "GHSA-r292-9mhp-454m",
              "GHSA-vmf3-w455-68vh",
              "GHSA-w8wr-v893-vjvp"
            ],
            "fixed_version": "7.5.21",
            "advisory_count": 6,
            "oldest_advisory_days": 40
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 2
        },
        "advisory_count": 7,
        "affected_count": 2,
        "assessed_count": 187,
        "malicious_count": 0,
        "assessed_package": "npm:browsertime@28.2.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "@devicefarmer/adbkit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "3.3.8"
        },
        {
          "name": "@sitespeed.io/chromedriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "149.0.7827"
        },
        {
          "name": "@sitespeed.io/edgedriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "149.0.4022"
        },
        {
          "name": "@sitespeed.io/geckodriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.36.2"
        },
        {
          "name": "@sitespeed.io/log",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "2.0.0"
        },
        {
          "name": "@sitespeed.io/throttle",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "6.0.1"
        },
        {
          "name": "chrome-har",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "1.3.1"
        },
        {
          "name": "chrome-remote-interface",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.34.0"
        },
        {
          "name": "execa",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "9.6.1"
        },
        {
          "name": "fast-stats",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.0.7"
        },
        {
          "name": "ff-test-bidi-har-export",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "0.0.22"
        },
        {
          "name": "selenium-webdriver",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "4.44.0"
        },
        {
          "name": "yargs",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "18.0.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@devicefarmer/adbkit",
            "direct": true,
            "version": "3.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/chromedriver",
            "direct": true,
            "version": "149.0.7827",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/edgedriver",
            "direct": true,
            "version": "149.0.4022",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/geckodriver",
            "direct": true,
            "version": "0.36.2",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/log",
            "direct": true,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sitespeed.io/throttle",
            "direct": true,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-har",
            "direct": true,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-remote-interface",
            "direct": true,
            "version": "0.34.0",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": true,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": true,
            "version": "9.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "fast-stats",
            "direct": true,
            "version": "0.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "ff-test-bidi-har-export",
            "direct": true,
            "version": "0.0.22",
            "ecosystem": "npm"
          },
          {
            "name": "selenium-webdriver",
            "direct": true,
            "version": "4.44.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": true,
            "version": "17.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": true,
            "version": "18.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@aashutoshrathi/word-wrap",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.23.6",
            "ecosystem": "npm"
          },
          {
            "name": "@bazel/runfiles",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@borewit/text-codec",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@devicefarmer/adbkit-logcat",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "@devicefarmer/adbkit-monkey",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.23.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.6",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/cliui",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/fs-minipass",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/core",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/diff",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/file-ops",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-bmp",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-gif",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-jpeg",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-png",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/js-tiff",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-blit",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-blur",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-circle",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-color",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-contain",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-cover",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-crop",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-displace",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-dither",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-fisheye",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-flip",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-hash",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-mask",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-print",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-quantize",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-resize",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-rotate",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/plugin-threshold",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/types",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jimp/utils",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/set-array",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/source-map",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.4.15",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.20",
            "ecosystem": "npm"
          },
          {
            "name": "@jsdoc/salty",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "@mapbox/node-pre-gyp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.scandir",
            "direct": false,
            "version": "2.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.stat",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@nodelib/fs.walk",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgjs/parseargs",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgr/core",
            "direct": false,
            "version": "0.2.9",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/pluginutils",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sec-ant/readable-stream",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/binding-mock",
            "direct": false,
            "version": "10.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/bindings-cpp",
            "direct": false,
            "version": "12.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/bindings-interface",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-byte-length",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-cctalk",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-delimiter",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-delimiter",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-inter-byte-timeout",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-packet-length",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-readline",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-readline",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-ready",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-regex",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-slip-encoder",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/parser-spacepacket",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@serialport/stream",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/merge-streams",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sindresorhus/merge-streams",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tokenizer/inflate",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@tokenizer/token",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/esrecurse",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/markdown-it",
            "direct": false,
            "version": "14.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "16.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "20.10.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/selenium-webdriver",
            "direct": false,
            "version": "4.35.5",
            "ecosystem": "npm"
          },
          {
            "name": "@types/w3c-web-usb",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@types/ws",
            "direct": false,
            "version": "8.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "@vercel/nft",
            "direct": false,
            "version": "0.29.4",
            "ecosystem": "npm"
          },
          {
            "name": "@zeit/schemas",
            "direct": false,
            "version": "2.36.0",
            "ecosystem": "npm"
          },
          {
            "name": "abbrev",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-import-attributes",
            "direct": false,
            "version": "1.9.5",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-walk",
            "direct": false,
            "version": "8.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "agent-base",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-align",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "6.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "any-base",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arch",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "arg",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "array-find-index",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arrgv",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arrify",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "async-sema",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ava",
            "direct": false,
            "version": "6.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "await-to-js",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.10.31",
            "ecosystem": "npm"
          },
          {
            "name": "bindings",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "bluebird",
            "direct": false,
            "version": "3.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "blueimp-md5",
            "direct": false,
            "version": "2.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "bmp-ts",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "boxen",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.14",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.2",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "builtin-modules",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "camel-case",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001793",
            "ecosystem": "npm"
          },
          {
            "name": "catharsis",
            "direct": false,
            "version": "0.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "cbor",
            "direct": false,
            "version": "10.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "5.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "chalk-template",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "change-case",
            "direct": false,
            "version": "5.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "chownr",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "chunkd",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ci-info",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "ci-parallel-vars",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "clean-css",
            "direct": false,
            "version": "5.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "clean-jsdoc-theme",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "clean-regexp",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-boxes",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-truncate",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "clipboardy",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "code-excerpt",
            "direct": false,
            "version": "4.0.0",
            "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": "commander",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.20.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "9.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "common-path-prefix",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "compressible",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "npm"
          },
          {
            "name": "compression",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "concordance",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "consola",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "content-disposition",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "convert-to-spaces",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "core-js-compat",
            "direct": false,
            "version": "3.49.0",
            "ecosystem": "npm"
          },
          {
            "name": "core-util-is",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "crc-full",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "currently-unhandled",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "date-time",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "2.6.9",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "deep-extend",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "dot-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "eastasianwidth",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.360",
            "ecosystem": "npm"
          },
          {
            "name": "emittery",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.4.0",
            "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": "4.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-config-prettier",
            "direct": false,
            "version": "10.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-prettier",
            "direct": false,
            "version": "5.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-unicorn",
            "direct": false,
            "version": "64.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "9.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "11.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "esprima",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "exif-parser",
            "direct": false,
            "version": "0.1.12",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-diff",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-glob",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "fastq",
            "direct": false,
            "version": "1.19.1",
            "ecosystem": "npm"
          },
          {
            "name": "figures",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-type",
            "direct": false,
            "version": "21.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "file-uri-to-path",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up-simple",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "foreground-child",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "fs-extra",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-east-asian-width",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "9.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "gifwrap",
            "direct": false,
            "version": "0.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "10.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "17.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "globby",
            "direct": false,
            "version": "14.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "html-minifier-terser",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "https-proxy-agent",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ieee754",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "7.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ignore-by-default",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "image-q",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "immediate",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "indent-string",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ini",
            "direct": false,
            "version": "1.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "irregular-plurals",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-builtin-module",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-docker",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-obj",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-port-reachable",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-promise",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-unicode-supported",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-wsl",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "isarray",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jackspeak",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "jimp",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "jpeg-js",
            "direct": false,
            "version": "0.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "js-string-escape",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "3.14.2",
            "ecosystem": "npm"
          },
          {
            "name": "js2xmlparser",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "jsdoc",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jsonfile",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "jszip",
            "direct": false,
            "version": "3.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "klaw",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "klaw-sync",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "lie",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "load-json-file",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lower-case",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "10.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-it",
            "direct": false,
            "version": "14.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "markdown-it-anchor",
            "direct": false,
            "version": "8.6.7",
            "ecosystem": "npm"
          },
          {
            "name": "marked",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "matcher",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "md5-hex",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "memoize",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "merge2",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "mime",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.33.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.54.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "2.1.18",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-fn",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-function",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "9.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "minimist",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "minipass",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "minizlib",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mkdirp",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "0.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "no-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-addon-api",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-fetch",
            "direct": false,
            "version": "2.6.12",
            "ecosystem": "npm"
          },
          {
            "name": "node-forge",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-gyp-build",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-gyp-build",
            "direct": false,
            "version": "4.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-hid",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.44",
            "ecosystem": "npm"
          },
          {
            "name": "node-stream-zip",
            "direct": false,
            "version": "1.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "nofilter",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "nopt",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "omggif",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "on-headers",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "onetime",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-map",
            "direct": false,
            "version": "7.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "package-config",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "package-json-from-dist",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pako",
            "direct": false,
            "version": "1.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "param-case",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-ascii",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-binary",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-bmfont-xml",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "parse-ms",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pascal-case",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-is-inside",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-type",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pixelmatch",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-prebuilds",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "plur",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "pluralize",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pngjs",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pngjs",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "prettier",
            "direct": false,
            "version": "3.8.3",
            "ecosystem": "npm"
          },
          {
            "name": "prettier-linter-helpers",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-ms",
            "direct": false,
            "version": "9.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "process-nextick-args",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode.js",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "queue-microtask",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "range-parser",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "rc",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "regexp-tree",
            "direct": false,
            "version": "0.1.27",
            "ecosystem": "npm"
          },
          {
            "name": "registry-auth-token",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "registry-url",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsparser",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "relateurl",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "requizzle",
            "direct": false,
            "version": "0.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-cwd",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "reusify",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "run-parallel",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "sax",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "serialize-error",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "serialport",
            "direct": false,
            "version": "12.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "serve",
            "direct": false,
            "version": "14.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "serve-handler",
            "direct": false,
            "version": "6.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "setimmediate",
            "direct": false,
            "version": "1.0.5",
            "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": "showdown",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "simple-xml-to-json",
            "direct": false,
            "version": "1.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "slash",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "slice-ansi",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.21",
            "ecosystem": "npm"
          },
          {
            "name": "split",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "sprintf-js",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "stack-utils",
            "direct": false,
            "version": "2.0.6",
            "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": "string-width",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "string_decoder",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-indent",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strtok3",
            "direct": false,
            "version": "10.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "supertap",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "synckit",
            "direct": false,
            "version": "0.11.12",
            "ecosystem": "npm"
          },
          {
            "name": "tar",
            "direct": false,
            "version": "7.5.15",
            "ecosystem": "npm"
          },
          {
            "name": "temp-dir",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "5.26.0",
            "ecosystem": "npm"
          },
          {
            "name": "through",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "time-zone",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinycolor2",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tmp",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "token-types",
            "direct": false,
            "version": "6.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "0.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "2.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "uc.micro",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "uint8array-extras",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "underscore",
            "direct": false,
            "version": "1.13.8",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "5.26.5",
            "ecosystem": "npm"
          },
          {
            "name": "unicorn-magic",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "universalify",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "update-check",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "usb",
            "direct": false,
            "version": "2.12.1",
            "ecosystem": "npm"
          },
          {
            "name": "usb-power-profiling",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "utif2",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "util-deprecate",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "vary",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "webidl-conversions",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "well-known-symbols",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-url",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "widest-line",
            "direct": false,
            "version": "4.0.1",
            "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": "wrap-ansi",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "write-file-atomic",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "7.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.20.1",
            "ecosystem": "npm"
          },
          {
            "name": "xml-parse-from-string",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "xml2js",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "xmlbuilder",
            "direct": false,
            "version": "11.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "xmlcreate",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "21.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "22.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "yoctocolors",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "zod",
            "direct": false,
            "version": "3.25.76",
            "ecosystem": "npm"
          },
          {
            "name": "numpy",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "opencv-python",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pillow",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyssim",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 514,
        "direct_count": 15,
        "indirect_count": 499
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 19,
        "merged_prs": 1742,
        "open_issues": 35,
        "closed_ratio": 0.944,
        "closed_issues": 594,
        "closed_unmerged_prs": 155
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "soulgalore",
          "commits": 4653,
          "avatar_url": "https://avatars.githubusercontent.com/u/540757?v=4"
        },
        {
          "type": "User",
          "login": "tobli",
          "commits": 833,
          "avatar_url": "https://avatars.githubusercontent.com/u/540266?v=4"
        },
        {
          "type": "User",
          "login": "gmierz",
          "commits": 47,
          "avatar_url": "https://avatars.githubusercontent.com/u/10966989?v=4"
        },
        {
          "type": "User",
          "login": "beenanner",
          "commits": 36,
          "avatar_url": "https://avatars.githubusercontent.com/u/723985?v=4"
        },
        {
          "type": "User",
          "login": "dpalmeiro",
          "commits": 27,
          "avatar_url": "https://avatars.githubusercontent.com/u/37376204?v=4"
        },
        {
          "type": "User",
          "login": "ncalexan",
          "commits": 23,
          "avatar_url": "https://avatars.githubusercontent.com/u/1097182?v=4"
        },
        {
          "type": "User",
          "login": "sefeng211",
          "commits": 13,
          "avatar_url": "https://avatars.githubusercontent.com/u/8703745?v=4"
        },
        {
          "type": "User",
          "login": "cliu55",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/25144627?v=4"
        },
        {
          "type": "User",
          "login": "acreskeyMoz",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/44072237?v=4"
        },
        {
          "type": "User",
          "login": "brennie",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/199381236?v=4"
        }
      ],
      "contributors_sampled": 54,
      "top_contributor_share": 0.814
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "browser-beta.yml",
        "browser-dev.yml",
        "building-docker.yml",
        "docker.yml",
        "lint.yml",
        "linux-chrome.yml",
        "linux-firefox.yml",
        "mac-m1.yml",
        "mac.yml",
        "release.yml",
        "safari.yml",
        "unittests.yml",
        "visualmetrics.yml",
        "windows.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".eslintrc",
        ".eslintrc.json",
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 7,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 9 contributing companies or organizations",
            "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": 10,
            "reason": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 7,
            "reason": "dependency not pinned by hash detected -- score normalized to 7",
            "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": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "1b7bde646c6c0ac4ca5bb7698b3eb9180f24717d",
        "ran_at": "2026-07-26T10:08:37Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T06:04:29Z",
      "oldest_open_prs": [
        {
          "number": 1794,
          "created_at": "2022-05-20T11:47:38Z",
          "last_comment_at": "2022-06-02T19:33:13Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2314,
          "created_at": "2025-07-17T20:08:15Z",
          "last_comment_at": "2025-07-31T08:32:02Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2485,
          "created_at": "2026-05-28T02:56:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2492,
          "created_at": "2026-06-12T17:23:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2493,
          "created_at": "2026-06-17T19:01:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2494,
          "created_at": "2026-06-22T06:36:40Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2539,
          "created_at": "2026-07-24T01:11:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2541,
          "created_at": "2026-07-25T09:50:49Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2544,
          "created_at": "2026-07-26T05:28:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2545,
          "created_at": "2026-07-26T05:28:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2546,
          "created_at": "2026-07-26T05:29:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2547,
          "created_at": "2026-07-26T05:30:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2548,
          "created_at": "2026-07-26T05:31:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2549,
          "created_at": "2026-07-26T05:32:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2550,
          "created_at": "2026-07-26T05:39:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2551,
          "created_at": "2026-07-26T05:40:33Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2552,
          "created_at": "2026-07-26T05:41:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2553,
          "created_at": "2026-07-26T05:42:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2554,
          "created_at": "2026-07-26T05:43:32Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-26T05:53:09Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 953,
          "created_at": "2019-10-03T09:40:55Z",
          "last_comment_at": "2023-12-17T04:57:39Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1222,
          "created_at": "2020-03-19T10:16:06Z",
          "last_comment_at": "2024-01-09T04:35:23Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1337,
          "created_at": "2020-08-18T08:47:29Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1487,
          "created_at": "2021-02-09T09:53:18Z",
          "last_comment_at": "2021-02-10T10:26:49Z",
          "last_comment_author": "eserte"
        },
        {
          "number": 1523,
          "created_at": "2021-03-26T14:24:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1566,
          "created_at": "2021-04-30T20:38:53Z",
          "last_comment_at": "2023-12-17T06:42:40Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1622,
          "created_at": "2021-08-12T13:26:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1637,
          "created_at": "2021-09-15T08:03:37Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1746,
          "created_at": "2022-03-31T14:29:06Z",
          "last_comment_at": "2022-06-07T17:43:47Z",
          "last_comment_author": "mstange"
        },
        {
          "number": 1756,
          "created_at": "2022-04-05T16:37:15Z",
          "last_comment_at": "2023-12-18T10:21:26Z",
          "last_comment_author": "julienw"
        },
        {
          "number": 1777,
          "created_at": "2022-04-28T14:17:04Z",
          "last_comment_at": "2026-04-29T21:32:18Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1820,
          "created_at": "2022-07-23T09:29:23Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1857,
          "created_at": "2022-10-17T18:21:03Z",
          "last_comment_at": "2022-10-18T10:02:06Z",
          "last_comment_author": "canova"
        },
        {
          "number": 1903,
          "created_at": "2023-02-15T14:17:04Z",
          "last_comment_at": "2023-02-17T20:32:24Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 1910,
          "created_at": "2023-03-08T14:42:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 1962,
          "created_at": "2023-06-20T13:22:36Z",
          "last_comment_at": "2023-06-21T12:00:02Z",
          "last_comment_author": "gmierz"
        },
        {
          "number": 1983,
          "created_at": "2023-08-18T20:35:14Z",
          "last_comment_at": "2023-12-18T14:53:05Z",
          "last_comment_author": "jordan-angold-sophos"
        },
        {
          "number": 1985,
          "created_at": "2023-09-02T07:33:38Z",
          "last_comment_at": "2023-12-17T13:12:46Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2000,
          "created_at": "2023-10-17T05:45:59Z",
          "last_comment_at": "2026-04-29T21:33:26Z",
          "last_comment_author": "soulgalore"
        },
        {
          "number": 2001,
          "created_at": "2023-10-17T05:47:42Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sitespeedio/browsertime",
    "host": "github.com",
    "name": "browsertime",
    "owner": "sitespeedio"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 73,
      "inputs": {
        "security": 54,
        "vitality": 86,
        "community": 76,
        "governance": 68,
        "engineering": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "commits_last_year": 271,
              "human_commit_share": 0.96,
              "days_since_last_push": 0,
              "active_weeks_last_year": 28
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "28/52 weeks with commits",
                "points": 19.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 28
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "271 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 271
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v28.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 8.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 6 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~8.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 8.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 76,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "forks": 141,
              "stars": 649,
              "watchers": 20,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "649 stars",
                "points": 45.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 649
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "141 forks",
                "points": 17.9,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 141
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "20 watchers",
                "points": 7.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "packages": [
                "browsertime"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 23233
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "23,233 downloads/month across npm",
                "points": 58.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 23233,
                      "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": 68,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 54,
              "top_contributor_share": 0.814
            },
            "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 81% of commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "54 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 54
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 1742,
              "open_issues": 35,
              "closed_issues": 594,
              "issue_closed_ratio": 0.944,
              "closed_unmerged_prs": 155
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 44.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1742/1897 decided PRs merged",
                "points": 35.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1742,
                      "decided": 1897
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "followers": 112,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "sitespeedio",
              "public_repos": 45,
              "account_age_days": 4666
            },
            "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": "112 followers of sitespeedio",
                "points": 14.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 112,
                      "login": "sitespeedio"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "45 public repos, account ~12 yr old",
                "points": 24.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 45
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "browsertime"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 6
            },
            "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 6 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 6
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "720 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 720
                    }
                  }
                ],
                "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": 76,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "14 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "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": ".eslintrc, .eslintrc.json, eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc, .eslintrc.json, eslint.config.mjs"
                    }
                  }
                ],
                "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": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [
                "javascript",
                "har",
                "chrome",
                "firefox",
                "speedindex",
                "video",
                "safari"
              ],
              "has_wiki": false,
              "homepage": "https://www.sitespeed.io/documentation/browsertime/",
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://www.sitespeed.io/documentation/browsertime/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": 54,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 9 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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": "30 commit(s) and 15 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 3.5,
                "status": "partial",
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:browsertime@28.2.0 runtime dependency closure — what installing the published package pulls in — 187 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:browsertime@28.2.0",
                  "assessed": 187
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 83,
            "inputs": {
              "source": "osv",
              "advisories": 7,
              "affected_packages": 2,
              "assessed_packages": 187,
              "unassessed_packages": 0,
              "affected_by_severity": "high 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "2 affected: brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)",
                "points": 8.4,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 2,
                      "packages": "brace-expansion 1.1.16 (high 7.5), tar 7.5.15 (high 7.5)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory has been public longer than 90 days",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "advisories_none_stale",
                    "params": {
                      "days": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 187,
              "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": 4
            },
            "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": 57,
        "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.771,
              "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": "74 of 96 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 74,
                      "sampled": 96
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".eslintrc, .eslintrc.json, eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".eslintrc, .eslintrc.json, eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 7",
                "points": 7,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 84345,
              "source_files_sampled": 380,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript with type-check config (tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "tsconfig.json",
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/380 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 380,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T10:09:05.558855Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sitespeedio/browsertime.svg",
  "full_name": "sitespeedio/browsertime",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.