公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-25 22:33 UTC

metonym / svelte-highlight

Syntax Highlighting for Svelte using highlight.js

TypeScript · JavaScript · SvelteMIT★ 335 星标⑂ 14 复刻始于 2019年11月在 GitHub 上查看 ↗

metonym/svelte-highlight 的健康指数为 100 分中的 72 分,处于「良好」区间。 其得分最高的类别是Vitality(95/100),最低的是AI Readiness(55/100)。 最近一次更新在 2 天前。 近期的大部分工作由 1 位贡献者完成。

72
总分 / 100
良好

软件健康指数

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

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

评分画像

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

所有权

Eric Liu个人账户
294 关注者161 个公开仓库始于 2015年1月@renderinc

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmsvelte-highlight7.16.0188,536896 天前sveltesvelte-componentshighlight.jssyntax-highlight

按类别列示的指标

活力

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

95优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 2 天前
28.4/36提交节奏 — 52 周中有 41 周有提交
18/18提交量 — 最近一年 447 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year447
human_commit_share1
days_since_last_push2
active_weeks_last_year41

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 69 个发布版本
36/36发布时效 — 最近一次发布版本于 6 天前
27/27发布节奏 — 约每 30.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count69
latest_release_tagv7.16.0
releases_from_tags
days_since_latest_release6
mean_days_between_releases30.1
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

60中等 · 占总体的 18%
评分方式
40.9/60星标 — 335 个星标
9.3/25复刻 — 14 个复刻
0/15关注者 — 2 位关注者
所用输入
forks14
stars335
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/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
评分方式
70.3/80月度下载量 — npm 合计每月 188,536 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagessvelte-highlight
dependents
ecosystemsnpm
total_downloads
monthly_downloads188,536
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

62中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.1/22.5提交分布 — 头号贡献者编写了 100% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
6/10OpenSSF Scorecard:Contributors — project has 2 contributing companies or organizations -- score normalized to 6
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.997
评分方式
46.2/46.8议题解决 — 99% 的议题已关闭
33.2/38.3PR 接受 — 已裁定的 PR 中 334/385 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/7 approved changesets -- score normalized to 0
所用输入
merged_prs334
open_issues1
closed_issues81
issue_closed_ratio0.988
closed_unmerged_prs51
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
17.8/25所有者影响力 — metonym 有 294 位关注者
25/25既往记录 — 161 个公开仓库,账户约 11 年
所用输入
followers294
owner_typeUser
is_verified
owner_loginmetonym
public_repos161
account_age_days4,197
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 6 天前
20/20版本历史 — 89 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagessvelte-highlight
ecosystemsnpm
any_deprecated
min_days_since_publish6

工程质量

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

76良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — biome.json
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 3 out of 3 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://svhe.onrender.com
10/10仓库描述
10/10主题标签 — 8 个主题标签
0/10Wiki
所用输入
topicssvelte, highlight-js, highlight, code, syntax, syntax-highlighting, svelte-component, typescript
has_wiki
homepagehttps://svhe.onrender.com
has_readme
has_docs_dir
has_description

安全

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

66中等 · 占总体的 16%

安全态势

57中等
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 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/7 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
5/5Pinned-Dependencies — all dependencies are pinned
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 — 无数据
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 49 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.7
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages2
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:svelte-highlight@7.16.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 2 个软件包。 未对可达性进行分析。

AI 就绪度

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

55中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 96 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.96
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — biome.json
11/11静态类型检查 — examples/rollup/tsconfig.json, examples/routify/tsconfig.json, examples/sveltekit/tsconfig.json, examples/vite/tsconfig.json, examples/vite@svelte-4/tsconfig.json, examples/webpack/tsconfig.json, tsconfig.json
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
10/10OpenSSF Scorecard:Pinned-Dependencies — all dependencies are pinned
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsexamples/rollup/tsconfig.json, examples/routify/tsconfig.json, examples/sveltekit/tsconfig.json, examples/vite/tsconfig.json, examples/vite@svelte-4/tsconfig.json, examples/webpack/tsconfig.json, tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.8/55可控的文件大小 — 采样的 321 个源文件中有 1 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes60,316
source_files_sampled321
oversized_source_files1

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

335GitHub 星标
3贡献者
447最近 12 个月提交数
2距最近推送天数
69发布版本数
1巴士系数(bus factor)
1开放议题
npm软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 14 ⇿
0Star
14Fork
59发布

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

03581013151412020-042023-012025-10
主版本 7次版本 18修订 32

每个点涵盖 5 天。

OpenSSF Scorecard 5.7 / 10
5.7综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 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/7 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
10Pinned-Dependenciesall dependencies are pinned
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities49 existing vulnerabilities detected
直接依赖 1
注册表软件包版本约束清单文件
npmmagic-string^0.30.17package.json
全部依赖 50

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

注册表软件包版本关系
npmmagic-string^0.30.17直接
npm@astrojs/svelte^8.1.2间接
npm@biomejs/biome2.5.5间接
npm@playwright/experimental-ct-svelte1.58.2间接
npm@playwright/test1.61.1间接
npm@rollup/plugin-commonjslatest间接
npm@rollup/plugin-node-resolvelatest间接
npm@roxi/routify^3.6.4间接
npm@sveltejs/adapter-nodelatest间接
npm@sveltejs/kitlatest间接
npm@sveltejs/vite-plugin-svelte^3.1.2间接
npm@sveltejs/vite-plugin-svelte^5.1.1间接
npm@sveltejs/vite-plugin-svelte^7.1.2间接
npm@sveltejs/vite-plugin-sveltelatest间接
npm@tsconfig/sveltelatest间接
npm@types/bun^1.3.14间接
npm@types/jest^30.0.0间接
npm@types/node^25.9.5间接
npm@typescript/native-preview^7.0.0-dev.20260707.2间接
npmastro^6.4.8间接
npmcarbon-components-svelte^0.110.1间接
npmcarbon-preprocess-svelte^0.11.37间接
npmcss-loaderlatest间接
npmcssnano^7.1.9间接
npmcssnano-preset-lite^4.0.6间接
npmhighlight.js11.11.1间接
npmhtml-webpack-pluginlatest间接
npmmini-css-extract-pluginlatest间接
npmpostcss^8.5.19间接
npmpostcss-discard-duplicates^7.0.4间接
npmpostcss-inline-css-vars^0.1.0间接
npmpostcss-merge-rules^7.0.11间接
npmrolluplatest间接
npmrollup-plugin-sveltelatest间接
npmrollup-plugin-terserlatest间接
npmsvelte^4.2.20间接
npmsvelte^5.56.3间接
npmsvelte^5.56.6间接
npmsveltelatest间接
npmsvelte-highlight^7.16.0间接
npmsvelte-loaderlatest间接
npmsvelte-preprocesslatest间接
npmtypescriptlatest间接
npmvite^5.4.21间接
npmvite^7.3.6间接
npmvite^8.1.2间接
npmvitelatest间接
npmwebpacklatest间接
npmwebpack-clilatest间接
npmwebpack-dev-serverlatest间接
依赖安全公告 0

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

没有已知公告影响已评估的依赖。

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "svelte",
        "highlight-js",
        "highlight",
        "code",
        "syntax",
        "syntax-highlighting",
        "svelte-component",
        "typescript"
      ],
      "is_fork": false,
      "size_kb": 9610,
      "has_wiki": false,
      "homepage": "https://svhe.onrender.com",
      "languages": {
        "CSS": 2164,
        "HTML": 2038,
        "Astro": 14118,
        "Svelte": 253790,
        "JavaScript": 295552,
        "TypeScript": 561046
      },
      "pushed_at": "2026-07-23T14:47:19Z",
      "created_at": "2019-11-09T22:15:10Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T14:49:03Z",
      "description": "Syntax Highlighting for Svelte using highlight.js",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript",
        "Svelte"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Eric Liu",
      "type": "User",
      "login": "metonym",
      "company": "@renderinc ",
      "location": "San Francisco, CA",
      "followers": 294,
      "avatar_url": "https://avatars.githubusercontent.com/u/10718366?v=4",
      "created_at": "2015-01-27T02:09:21Z",
      "is_verified": null,
      "public_repos": 161,
      "account_age_days": 4197
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v7.16.0",
          "kind": "minor",
          "published_at": "2026-07-19T22:24:49Z"
        },
        {
          "tag": "v7.15.0",
          "kind": "minor",
          "published_at": "2026-07-11T04:16:19Z"
        },
        {
          "tag": "v7.14.1",
          "kind": "patch",
          "published_at": "2026-07-07T02:11:55Z"
        },
        {
          "tag": "v7.14.0",
          "kind": "minor",
          "published_at": "2026-07-03T00:16:17Z"
        },
        {
          "tag": "v7.13.0",
          "kind": "minor",
          "published_at": "2026-06-27T04:05:00Z"
        },
        {
          "tag": "v7.12.0",
          "kind": "minor",
          "published_at": "2026-06-23T16:12:10Z"
        },
        {
          "tag": "v7.11.0",
          "kind": "minor",
          "published_at": "2026-06-07T21:29:06Z"
        },
        {
          "tag": "v7.10.1",
          "kind": "patch",
          "published_at": "2026-06-03T01:47:40Z"
        },
        {
          "tag": "v7.10.0",
          "kind": "minor",
          "published_at": "2026-06-02T17:38:13Z"
        },
        {
          "tag": "v7.9.0",
          "kind": "minor",
          "published_at": "2025-10-22T02:56:08Z"
        },
        {
          "tag": "v7.8.4",
          "kind": "patch",
          "published_at": "2025-08-31T18:55:10Z"
        },
        {
          "tag": "v7.8.3",
          "kind": "patch",
          "published_at": "2025-04-01T20:05:46Z"
        },
        {
          "tag": "v7.8.2",
          "kind": "patch",
          "published_at": "2024-12-28T02:44:15Z"
        },
        {
          "tag": "v7.8.1",
          "kind": "patch",
          "published_at": "2024-12-25T21:23:57Z"
        },
        {
          "tag": "v7.8.0",
          "kind": "minor",
          "published_at": "2024-12-15T21:35:55Z"
        },
        {
          "tag": "v7.7.0",
          "kind": "minor",
          "published_at": "2024-07-15T15:52:28Z"
        },
        {
          "tag": "v7.6.1",
          "kind": "patch",
          "published_at": "2024-05-16T02:49:43Z"
        },
        {
          "tag": "v7.6.0",
          "kind": "minor",
          "published_at": "2024-02-06T06:07:10Z"
        },
        {
          "tag": "v7.5.0",
          "kind": "minor",
          "published_at": "2024-02-02T04:56:29Z"
        },
        {
          "tag": "v7.4.8",
          "kind": "patch",
          "published_at": "2024-01-05T05:20:07Z"
        },
        {
          "tag": "v7.4.7",
          "kind": "patch",
          "published_at": "2023-12-28T18:10:36Z"
        },
        {
          "tag": "v7.4.6",
          "kind": "patch",
          "published_at": "2023-12-17T00:57:41Z"
        },
        {
          "tag": "v7.4.5",
          "kind": "patch",
          "published_at": "2023-12-17T00:43:53Z"
        },
        {
          "tag": "v7.4.4",
          "kind": "patch",
          "published_at": "2023-12-17T00:43:42Z"
        },
        {
          "tag": "v7.4.3",
          "kind": "patch",
          "published_at": "2023-12-16T19:00:46Z"
        },
        {
          "tag": "v7.4.2",
          "kind": "patch",
          "published_at": "2023-11-25T16:46:59Z"
        },
        {
          "tag": "v7.4.1",
          "kind": "patch",
          "published_at": "2023-10-13T15:51:20Z"
        },
        {
          "tag": "v7.4.0",
          "kind": "minor",
          "published_at": "2023-10-13T15:47:14Z"
        },
        {
          "tag": "v7.3.0",
          "kind": "minor",
          "published_at": "2023-05-13T17:40:42Z"
        },
        {
          "tag": "v7.2.1",
          "kind": "patch",
          "published_at": "2023-04-01T17:43:54Z"
        },
        {
          "tag": "v7.2.0",
          "kind": "minor",
          "published_at": "2023-02-14T23:11:52Z"
        },
        {
          "tag": "v7.1.2",
          "kind": "patch",
          "published_at": "2023-01-01T20:05:02Z"
        },
        {
          "tag": "v7.1.1",
          "kind": "patch",
          "published_at": "2023-01-01T02:52:15Z"
        },
        {
          "tag": "v7.0.1",
          "kind": "patch",
          "published_at": "2022-12-30T21:27:31Z"
        },
        {
          "tag": "v7.0.0",
          "kind": "major",
          "published_at": "2022-12-30T21:27:07Z"
        },
        {
          "tag": "v6.2.1",
          "kind": "patch",
          "published_at": "2022-08-07T17:01:27Z"
        },
        {
          "tag": "v6.2.0",
          "kind": "minor",
          "published_at": "2022-07-13T15:35:06Z"
        },
        {
          "tag": "v6.1.2",
          "kind": "patch",
          "published_at": "2022-07-02T15:54:20Z"
        },
        {
          "tag": "v6.1.1",
          "kind": "patch",
          "published_at": "2022-06-27T12:22:04Z"
        },
        {
          "tag": "v6.1.0",
          "kind": "minor",
          "published_at": "2022-06-10T14:44:12Z"
        },
        {
          "tag": "v6.0.1",
          "kind": "patch",
          "published_at": "2022-03-26T17:23:19Z"
        },
        {
          "tag": "v6.0.0",
          "kind": "major",
          "published_at": "2022-03-26T17:23:01Z"
        },
        {
          "tag": "v5.3.2",
          "kind": "patch",
          "published_at": "2022-03-17T03:05:49Z"
        },
        {
          "tag": "v5.3.1",
          "kind": "patch",
          "published_at": "2022-03-17T02:40:15Z"
        },
        {
          "tag": "v5.3.0",
          "kind": "minor",
          "published_at": "2022-03-12T17:05:23Z"
        },
        {
          "tag": "v5.2.2",
          "kind": "patch",
          "published_at": "2022-02-25T15:20:35Z"
        },
        {
          "tag": "v5.2.1",
          "kind": "patch",
          "published_at": "2022-02-12T00:38:21Z"
        },
        {
          "tag": "v5.2.0",
          "kind": "minor",
          "published_at": "2022-01-06T16:12:11Z"
        },
        {
          "tag": "v5.1.4",
          "kind": "patch",
          "published_at": "2021-12-18T15:12:57Z"
        },
        {
          "tag": "v5.1.3",
          "kind": "patch",
          "published_at": "2021-11-13T23:14:36Z"
        },
        {
          "tag": "v5.1.2",
          "kind": "patch",
          "published_at": "2021-10-19T16:01:32Z"
        },
        {
          "tag": "v5.1.1",
          "kind": "patch",
          "published_at": "2021-10-19T15:48:39Z"
        },
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2021-10-17T14:30:49Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2021-10-08T23:05:09Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2021-09-16T19:08:54Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2021-09-12T22:35:37Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2021-09-01T16:17:17Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2021-09-01T16:17:42Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2021-08-02T13:23:58Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2021-07-08T15:21:28Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2021-05-30T12:51:56Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2021-05-21T22:09:27Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2021-04-30T21:28:35Z"
        },
        {
          "tag": "v2.0.0-rc.1",
          "kind": "prerelease",
          "published_at": "2021-04-30T21:28:52Z"
        },
        {
          "tag": "v2.0.0-rc.0",
          "kind": "prerelease",
          "published_at": "2021-04-30T21:29:04Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2021-04-23T22:12:32Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2021-04-23T21:12:16Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2021-02-13T22:54:57Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2021-02-13T22:24:56Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e4f6958d0fdff1aeb0c2f42b5b28c80e64e4d18b",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps-dev): patch Biome to 2.5.5 (#472)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-23T14:47:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "673a5ba7ac86e676eef645b593ef8165f768bf3a",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix example formatting",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:37:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "654cf50c8ede26e5bf65019e60d9871de0a77c3a",
          "body": null,
          "is_bot": false,
          "headline": "chore(examples): bump deps",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:29:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6bda2e385b7a257acc0adefc98b69e6313d6687b",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps-dev): bump deps",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:28:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "768e2ecf7014ff2a127573dca880ca547f64177f",
          "body": null,
          "is_bot": false,
          "headline": "v7.16.0",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:23:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4d697e0cb15e521694c248640a1315ba7467c15",
          "body": null,
          "is_bot": false,
          "headline": "test(languages): bump supported language count to 247",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9deea5ca5043e432edaff87fb80a85e1e887e33e",
          "body": null,
          "is_bot": false,
          "headline": "docs(preview): add sparql language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26e4225ddc9968e7140b6fc38efca7eb9865336f",
          "body": null,
          "is_bot": false,
          "headline": "feat(languages): add custom `sparql` language",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b669b5c54ef0a50cb55936b7dc71263eb844614",
          "body": null,
          "is_bot": false,
          "headline": "docs(preview): add heex language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79c40801af1dc40176ca33d2027d792de9b35112",
          "body": null,
          "is_bot": false,
          "headline": "feat(languages): add custom `heex` language",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc113b3719617c46563d8f9eca10cf461a76d82e",
          "body": null,
          "is_bot": false,
          "headline": "docs(preview): add gdscript language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8aa6b1e4eb157e13f473e895e4a730e728b63008",
          "body": null,
          "is_bot": false,
          "headline": "feat(languages): add custom `gdscript` language",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T22:06:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "357039484c7184a7ff40f2040e481b162cd31b16",
          "body": "…tion\n\nThe top-level declaration matcher (model/enum/type/view/datasource/\ngenerator + name) had no line-start anchor, so an ordinary field named\n\"type\" (a common discriminator/field name) followed by its own type,\ne.g. `type   String` inside a model body, matched the exact same\nshape as a real `typ\n[…]\ne\nsynthetic keyword-list sample puts every keyword on one line with no\nindentation, so only the first pair still triggers the anchored\nmatcher; the rest correctly fall back to plain keyword coloring).",
          "is_bot": false,
          "headline": "fix(languages): don't mistake a prisma field named type for a declara…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "882f6b3ea39dcd4f4afc24234f6a17f723aaf538",
          "body": "The inline JSX tag's end pattern matched the first > anywhere,\nincluding one from a JS comparison inside a brace attribute\nexpression (highlight={value > threshold}), closing the tag\nmid-attribute and leaving the real closing /> to fall outside it.\n\nNarrowly scoped fix: only intervene for a {...} th\n[…]\ng/attr/string styling. An earlier\nattempt that intercepted every {...} unconditionally fixed the bug but\nregressed that common case by fragmenting the surrounding tag into\ndisconnected HTML fragments.",
          "is_bot": false,
          "headline": "fix(languages): keep mdx JSX tags open through a > inside {...}",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5e9cd7c430a415aa8e60c2ee7f36d62ad19db2c",
          "body": "DURATION only allowed a single number+unit segment, so compound\nPrometheus-style durations like [1h30m] in\nrate({job=\"x\"}[1h30m]) didn't match as a duration token at all.\nRepeat the number+unit segment to allow more than one.",
          "is_bot": false,
          "headline": "fix(languages): highlight compound logql durations",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e50e7e62877c2ec9785a0677f213860af0a88df",
          "body": "beginKeywords listed \"def\" before \"def-env\"; regex alternation tries\nalternatives in order and isn't longest-match, so \"def-env myFunction\"\nmatched only \"def\", leaving \"-env\" unconsumed to be swallowed by the\nnested title regex (which allows hyphens) as if it were part of the\nfunction name. List the longer alternative first.",
          "is_bot": false,
          "headline": "fix(languages): stop nushell def-env from corrupting the title match",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ddfe89394bbe7a4cece29ab943c2808c4792413",
          "body": "SITE_ADDRESS required the whole line to be a single address token\nfollowed by `{`, so common multi-address headers like\n`example.com www.example.com {` got no attr styling at all -- the\nlookahead failed right after the first address. Repeat the address\ntoken to allow more than one.\n\nAnchored the who\n[…]\n\nunindented) to avoid a regression: the address-token class allows\nbare words, so without that anchor the repeating group also matched\nan indented directive-with-argument line like `transport http {`.",
          "is_bot": false,
          "headline": "fix(languages): highlight caddy multi-address site headers",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "88acf74a8573ab4dd1cba12d22eda6117093e213",
          "body": "The \"meta\" rule for the closing --- fence could never fire: the\nfrontmatter mode's own end (with excludeEnd: true) already consumed\nthat line to close the TypeScript sub-block, advancing past it before\nthe sibling rule ever got a chance to see it -- dead code. Switch to\nreturnEnd so the fence text i\n[…]\nof-document alternative, mirroring the frontmatter\nmode's own end pattern.\n\nGraduates astro out of the auto-detection KNOWN_AUTO_DETECT_GAPS list:\nthe added relevance now wins full-corpus auto-detect.",
          "is_bot": false,
          "headline": "fix(languages): style astro's closing frontmatter fence",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be19bf3783574be1050ea382dfcc98574eab30c8",
          "body": "RECIPE_HEADER's default-value alternation only allowed a quoted\nstring or a bare identifier, not a function call, e.g.\nserve port=env_var_or_default(\"PORT\", \"8080\"):. The whole header\nlookahead failed at the unhandled `(`, so the recipe name and every\nparameter lost their title/params styling entirely.",
          "is_bot": false,
          "headline": "fix(languages): recognize just recipe params with function-call defaults",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e663d9f99f40a45ddd3796aa10d9202367978b06",
          "body": "SCRIPT_BLOCK's body had a bare `end: /\\}/` with no brace balancing, so\nany nested `{}` in the JS body (e.g. an if statement) closed the mode\nat the inner block's own closing brace, leaving the true closing\nbrace and anything after it to fall through to top-level parsing.\nAdd a nested balancer -- repeating `subLanguage: \"javascript\"` on it,\nsince a nested `contains` mode doesn't inherit the parent's\nsubLanguage.",
          "is_bot": false,
          "headline": "fix(languages): balance nested braces in templ legacy script blocks",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcf10d587c53014ccf7b4958a0e834990317559f",
          "body": "CODE_MODE's lookahead required a letter/underscore right after `#`,\nso the common bare code-block idiom #{ let x = 5 } (no leading\nkeyword or function call before the brace) was never recognized as\ncode at all -- everything inside stayed unhighlighted. Also allow a\nbare `{`/`(`/`[` to follow `#`.",
          "is_bot": false,
          "headline": "fix(languages): recognize bare typst #{ } code blocks",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5dbb0098c5d3e5f7231e581d04c226e03cb6a64",
          "body": "STRONG/EMPHASIS's `end` patterns were `(?!\\s)\\*` / `(?!\\s)_` -- a\nno-op, since the lookahead and the literal both anchor to the same\nposition and the delimiter itself is never whitespace, so it always\npassed regardless of what preceded it. Typst's actual rule (\"word*\"\ncloses, \"word *\" doesn't) depends on the preceding character, which\nlookbehind can't check here, so require that character as part of the\nmatch itself instead.",
          "is_bot": false,
          "headline": "fix(languages): make typst strong/emphasis respect the whitespace rule",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4199e036a26875243f62328d7237c4f3756c9ec",
          "body": "SEMANTIC fired on any `: identifier`, misfiring on ternary\nexpressions (`cond ? a : b`) and switch/case labels. Without deeper\nparsing there's no structural way to tell those colons apart from a\nreal semantic, so lean on an actual HLSL convention instead: semantics\nare always ALL_CAPS (POSITION, TEXCOORD0, SV_TARGET, ...), while\nternary/case values are ordinary identifiers.",
          "is_bot": false,
          "headline": "fix(languages): stop hlsl semantics matching ternary/switch colons",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd46ac0c332ed84fc719871e8573be01a869bae8",
          "body": "ATTRIBUTE required a parenthesized argument list, so parameterless\nattributes -- [unroll], [loop], [branch], [flatten],\n[earlydepthstencil] -- never matched at all. Make the arg list\noptional.",
          "is_bot": false,
          "headline": "fix(languages): highlight parameterless hlsl attributes",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63a5ee56c34cfef0ac1eeaa3ffd02897d509d20d",
          "body": "storeSubscriptionPattern's identifier class was [\\w-]*, but JS/TS\nidentifiers can't contain a hyphen. {$count-1} (no surrounding spaces)\nmatched \"$count-1\" as a single variable token instead of $count, -, 1.\nUse \\w* for the name, matching real identifier syntax.",
          "is_bot": false,
          "headline": "fix(languages): don't swallow a trailing hyphen into svelte stores",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e0cb729b6ca1f22cc99dc92059239dc37ee6464",
          "body": "NUMBER's hex variant lacked `_` in its digit class, so a digit-\nseparated hex literal like 0x1234_5678 only matched up through\n\"0x1234\" -- and even that partial match failed the trailing \\b\n(underscore is a word character, so there's no boundary), leaving the\nwhole literal unhighlighted.",
          "is_bot": false,
          "headline": "fix(languages): highlight solidity hex literals with underscores",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "972e7f1c38cd75a58fecf4e11bc8c92a714dc917",
          "body": "The contract/interface/library header's nested `title` matcher had no\nrestriction, so it kept re-firing for every identifier in\n`contract Foo is Ownable, ReentrancyGuard {` -- tagging `is` and every\ninherited contract name as `title` too. Bound the match to just the\ndeclaration's own name (keyword +\n[…]\n\nsnapshot for the resulting soft-gate diff (the synthetic keyword-list\nsample has no `{` at all, so the mode never closes there either, but\nthe blast radius is now just the one word after \"contract\").",
          "is_bot": false,
          "headline": "fix(languages): don't tag solidity inheritance lists as titles",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "87870034171d8dfec964a0b0f3c4d12b24e3c6f3",
          "body": "LABEL's bare `:identifier` pattern collides with map-literal syntax\nwhenever a value is itself an identifier expression, e.g.\n`{name: n.name}` -- `:n` got misdetected as a node label. Give map\nliterals their own scoped mode (keyed by a new MAP_KEY for the\n`key:` side) instead of trying to exclude this with LABEL's own\npattern, since LABEL is legitimately reused for node-label chains\n(`(n:Person:Employee)`) where the same \"preceded by a word char\"\nheuristic can't distinguish the two cases.",
          "is_bot": false,
          "headline": "fix(languages): don't mistake cypher map values for node labels",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78dc9a3712cba2aacf70ebe60fba36078dd8196b",
          "body": "RECORD_FIELD fires on any `identifier = value` sequence, which is\nidentical surface syntax to a `let` binding -- `let x = 5 in x + 1`\nrendered `x` as an attr (record-field) exactly as if it were `{ x = 5 }`.\nAdd a LET_BINDING mode that matches `let` together with the bound\nname; since its match star\n[…]\nical as real Nickel, which\nalways names a binding), so LET_BINDING's bounded match captures \"in\"\nas if it were the bound name there -- harmless for real code, but a\nsoft-gate diff worth acknowledging.",
          "is_bot": false,
          "headline": "fix(languages): don't mistag nickel let-bound names as record fields",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b41bb10bf1c49b592597687141b466970ef1a9bb",
          "body": "METRIC's negative lookahead only excludes recognized keywords/\naggregators/functions, so bare identifiers inside a by(...)/\nwithout(...) grouping clause (e.g. `sum by (job, instance) (up)`)\nfell through to METRIC and got tagged as metric names instead of\ngrouping labels. Add a dedicated GROUPING_LAB\n[…]\ns duration variant stopped at the range part.\nExtend that variant to consume the optional `:resolution` (which may\nitself be a bare `:` with the resolution omitted) as part of the same\nduration token.",
          "is_bot": false,
          "headline": "fix(languages): fix promql grouping labels and subquery resolution",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86c6df672cc1c681f4c7ba7371b2409306f1c8b6",
          "body": "Two related bugs: BUILT_IN_CALL matched any call-like identifier\nfollowed by \"(\", so user-defined rules like is_valid_user(u) got\ntagged as built_in both at their definition and every call site,\nmisleadingly implying they're language builtins. Restrict it to an\nalternation of the actual REGO_BUILTIN\n[…]\n (function-style rules), so\nis_valid_user(u) { was never recognized as a rule definition at all --\nit fell through entirely to the now-fixed BUILT_IN_CALL. Extend the\nlookahead to also accept `(...)`.",
          "is_bot": false,
          "headline": "fix(languages): recognize rego function-style rule heads",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efab4e9b91bf517cc2803a496106f2601506f4ed",
          "body": "STRING's variants had no contains at all, so an escaped quote inside\nan echo (e.g. {{ \"Say \\\"hi\\\" to me\" }}) matched the string's own end\npattern and terminated it early -- splitting one string into two\nmismatched spans around the stray backslashes. Add\nhljs.BACKSLASH_ESCAPE, matching what hljs.QUOTE_STRING_MODE already\ndoes (this was a from-scratch reimplementation that dropped it).",
          "is_bot": false,
          "headline": "fix(languages): handle escaped quotes in blade strings",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b239a858c6b819f34168f14bee0e46717cf5bc7e",
          "body": "DIRECTIVE's regex (@[a-zA-Z]\\w*) had no boundary check, so any\nword@word sequence -- most commonly an email address in markup text,\ne.g. foo@example.com -- got its domain misdetected as a directive.\nLookbehind isn't an option, so the preceding character is captured\nand consumed (left unstyled) inste\n[…]\nently disabling the PHP subLanguage\nembedding. Refreshes the golden snapshot for blade's now-cosmetically\ndifferent (but equally correct) span boundary around the sample's\n\"#hashtag @annotation\" case.",
          "is_bot": false,
          "headline": "fix(languages): don't mistake email addresses for blade directives",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ffa164c717aa39336d337a8365d8c86b67c5ff7d",
          "body": "markoControlFlow matched \"else if\" (space), but Marko's actual tag is\nelse-if (hyphen). The regex still fired on the \"else\" prefix (\\b holds\nat the hyphen), leaving \"-if(...)\" outside the keyword span -- a\npartial-match bug, not a total miss.",
          "is_bot": false,
          "headline": "fix(languages): recognize marko's else-if hyphen form",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71696e4a2b940e1ab309b37f4ed80e23a944658c",
          "body": "The concise-tag lookahead's tag-name char class had no room for `.`\nor `#`, so a line like `div.container` -- Marko's class/id shorthand,\nused constantly in concise mode -- never matched the lookahead at all\nand got no tag/name highlighting whatsoever. Share a single\nMARKO_TAG_NAME pattern (base name + repeated .class/#id segments)\nbetween the outer lookahead and the inner name matcher.",
          "is_bot": false,
          "headline": "fix(languages): recognize marko concise class/id shorthand on tags",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0e67c543e8d1da6d17750ba7ca395692936128e",
          "body": "Only the explicit @{ }/@code { }/@functions { } forms were wired up to\nC# tokenization. Implicit blocks -- @if (...) { }, @foreach (...) { },\n@for, @while, @switch, @else -- are Razor's single most common way to\nmix control flow with markup, but got zero C# handling: the keyword,\ncondition, and body\n[…]\nan implicit block's body mixes HTML tags and @expressions with\nC#, so it needs TAG/EXPRESSION handling, not just CSHARP_BODY_CONTAINS).\nAlso add `in` to the C# keyword list, used by every foreach/for.",
          "is_bot": false,
          "headline": "fix(languages): recognize razor implicit control-flow blocks",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00b228223741e4acbbf0fc3584a2d173c86cc7c6",
          "body": "The previous fix (993f8e2) changed the fn mode's `end` to `/\\(/`, but\nan open-ended forward search for `(` risks scanning to the end of the\ndocument if a `(` never follows (e.g. malformed/partial input) --\ncaught by the golden-snapshot test, which feeds each grammar's own\nkeyword list back as a sing\n[…]\no\nopen-ended scan at all.\n\nAlso refreshes the golden snapshot for pug (98f4a7e's control-flow\nkeyword fix changed its output but the snapshot wasn't updated) and\nzig (this commit's own output change).",
          "is_bot": false,
          "headline": "fix(languages): bound zig fn-name match to avoid runaway scan",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "66554d11961ee9110a9e92a9d3139be730a86762",
          "body": "The generic line-start tag-shorthand rule matched any line beginning\nwith a letter, including if/else/each/case/when/etc, before the\ntop-level keyword scanner got a chance -- so Pug's core control-flow\nkeywords rendered as selector-tag (as if they were HTML tag names).\nAdd a dedicated keyword rule for PUG_KEYWORDS ahead of the tag rule so\nit wins the tie at line start.",
          "is_bot": false,
          "headline": "fix(languages): don't shadow pug control-flow keywords with tag rule",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a4ed905500a11f83a75b14531fd969291fd419c0",
          "body": "NUMBER's decimal variants used a [ifh]? suffix class, omitting `u`.\nSince a digit immediately followed by `u` has no word boundary to\nsatisfy the trailing \\b, the whole match failed -- WGSL's ubiquitous\nunsigned-int suffix (42u, 0u) never highlighted as a number at all.",
          "is_bot": false,
          "headline": "fix(languages): highlight wgsl unsigned-integer number suffix",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25da324b0d8238efa29cac33e0cd3749d448686d",
          "body": "The `fn` mode ended on `end: /[(\\s]/`, which matched the space right\nafter `fn` (Zig always writes `fn add(...)` with a space before the\nname) before the nested title-matcher ever got to run. Function names\nwere never highlighted in any real Zig code. Wait for the opening\nparen instead so the name in between gets a chance to match.",
          "is_bot": false,
          "headline": "fix(languages): highlight zig function names",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d77d902e378586be9204ce50b51d72923546d74",
          "body": "vueDirective's lookahead required =, whitespace, or > immediately after\nthe directive name, so longhand directives with an explicit argument\n(v-bind:href, v-on:click, v-slot:name) never matched at all -- the\ncolon broke the lookahead before it could succeed. Extend the regex to\noptionally consume :arg or the dynamic-argument form :[key].",
          "is_bot": false,
          "headline": "fix(languages): recognize vue longhand directive arguments",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a48a978c8948bcb28c7844fa7e2f1bb58aac5e96",
          "body": "hcl, nickel, nushell, pkl, and jq all close their `${...}`/`%{...}`/`\\(...)`\ninterpolation modes on the first matching `}`/`)`, so any interpolation\ncontaining a nested call or bare object/record literal with the same\nclosing character ends prematurely (e.g. hcl's\n`${merge(local.tags, { Name = \"x\" }\n[…]\ned the\ngeneric `hljs.BACKSLASH_ESCAPE` (`\\<anything>`) before the more specific\n`\\(` interpolation start, so the escape mode always won the tie and\ninterpolation never fired at all in either language.",
          "is_bot": false,
          "headline": "fix(languages): balance nested delimiters in string interpolation",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T21:35:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "071f402cacbd1e66dfc7a14ae01621a2ae2a4f2f",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps-dev): upgrade @biomejs/biome to 2.5.4 (#469)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-19T19:31:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a7ae87e1b0cb318816cd16cd4c22ba1c0d0f4f4",
          "body": "Interactive showcase at /preview-define-theme: role-color swatches\ndrive a live defineTheme() palette, a toggle switches to an\nextendTheme(atomOneDark, ...) variant, and both render through\nHighlightStyle. Not linked from the top nav or any listing page\n(mirrors every other /preview-* route in this \n[…]\n only registered\nin Header's hiddenRoutes so it gets a proper page heading.\n\nAlso runs the project's import-ordering assist (fix:imports) over a\nfew theme-related files whose import order had drifted.",
          "is_bot": false,
          "headline": "docs(www): add an unlisted defineTheme/extendTheme preview page",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25a6ab17f7e1119f593e15e5c5f0430d98213df1",
          "body": "Programmatic theme authoring on top of the ThemePalette format:\n\n- defineTheme(): build a complete palette from ~14 semantic roles\n  (comment, keyword, string, function, type, ...) plus optional\n  per-scope overrides; roles expand to hljs scope variables via a\n  documented mapping table\n- extendThem\n[…]\nanged)\n- a build-time report measures how much of each shipped theme the\n  role layer alone reconstructs, keeping the mapping honest\n\nAdditive only: no changes to components, shipped palettes, or CSS.",
          "is_bot": false,
          "headline": "feat(theme): add defineTheme, extendTheme, and a TextMate importer",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8f9c95c247881fbb9269025033016edb80e85537",
          "body": "Both failures on PR #466's e2e-tests job were races in the test\nassertions themselves, not in the components under test:\n\n- The HighlightStream chunk-growth check read `stream`'s text once\n  after `highlightCount` had already updated, assuming both DOM\n  regions land in the same paint. Under CI's sl\n[…]\n new scroll\n  position.\n\nNeither reproduced locally after ~250 runs across full-suite and\ntargeted repeat-each invocations, consistent with CI-only timing\npressure rather than a functional regression.",
          "is_bot": false,
          "headline": "test(e2e): fix two flaky webkit-only assertions in CI",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "761b68a98091f806730ece0568f5eeb5c88f4d4e",
          "body": "Adds a \"Large Documents\" section to the homepage covering\nHighlightVirtual and headless svelte-highlight/tokenized-document,\nplus an unlisted /preview-virtual kitchen sink (bounded-DOM-node\ncounter, overscan/checkpointInterval/jump-to-line controls, several\nlanguages, document swapping, CodeWindow composition, and a live\nheadless lineRange demo), following the site's existing preview-*\nconvention.",
          "is_bot": false,
          "headline": "docs(www): document HighlightVirtual and add a preview-virtual page",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "588c332bbc27a4790487b2868ccce368c2272aa1",
          "body": "Two bugs in the just-shipped HighlightVirtual: a static\nclass=\"shl-virtual\" attribute combined with class:hljs and\n{...$$restProps} was silently dropped whenever a consumer also\npassed class (the normal way to theme or size the component),\nlosing all of the component's own layout CSS. And the hidden\n[…]\nlass: directive instead of a static class\nattribute, and by giving the component's <pre> position: relative\nso absolutely positioned descendants anchor to it. Both are covered\nby new regression tests.",
          "is_bot": false,
          "headline": "fix(components): stop HighlightVirtual's class and sizer from leaking",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d452e293f698dc4d76a5674286a0ee2e840d9a8",
          "body": "Make rendering cost independent of document length by exploiting the\nengine's serializable parse checkpoints:\n\n- new svelte-highlight/tokenized-document: a TokenizedDocument that\n  snapshots the tokenizer every N lines and produces highlighted\n  HTML for any line range in O(window + interval); token\n[…]\ne differentially tested against a straight-\n  through parse across the corpus: checkpointing never changes\n  output\n\nAdditive: one new component, one new module, no API changes to\nexisting components.",
          "is_bot": false,
          "headline": "feat(components): windowed rendering via a checkpointed document index",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-12T03:20:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1bfe1328d1bab99a053d54cd2cc19d0266eed130",
          "body": "Promote the engine's token surface from internal modules to\ndocumented, semver-stable exports so highlighting can be consumed\nheadlessly and future features (transformers, windowing, alternate\nrender targets) build on a stable seam:\n\n- new svelte-highlight/engine subpath: ScopeEvent stream and\n  TEX\n[…]\n is\n  generated data versioned with the library; Snapshot is a\n  serializable format within a version\n- README: headless and server-side usage\n\nNo behavioral changes to existing components or exports.",
          "is_bot": false,
          "headline": "feat(engine): expose the scope-event stream as public API (#464)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T17:23:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca0c0f57b6bfb8539713f0c00a3239ee276c8b02",
          "body": "Tokenizer.subContinuations carried an embedded sub-language's leftover\nparse frames forward by name alone, for the outer tokenizer's whole\nlifetime. That's correct for resuming the *same* embedding across\nsegments (streaming edits, snapshot()/restore()), but nothing stopped\na later, textually unrela\n[…]\nn the heading/emphasis case, which turned out to be a different,\nseparate, still-open markdown grammar-conversion gap - the real-file\nallowlist entry for README.md is updated to describe that instead.",
          "is_bot": false,
          "headline": "fix(engine): scope sub-language continuation state to its own occurrence",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T17:01:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "956cf17459b60495dd9a8bb38f85f5e7aa262c11",
          "body": "Compile every highlight.js theme into a structured ThemePalette at\nbuild time and ship a CSS-variable theming architecture alongside\nthe existing stylesheet strings:\n\n- themes/base.css: one shared structural stylesheet mapping .hljs\n  classes to --shl-* custom properties, with fallback chains that\n \n[…]\ndropped declaration\n\nThe legacy string exports (svelte-highlight/styles/*) and the\nscoped-CSS HighlightStyle path are unchanged and fully supported.\nCustom classPrefix users remain on the legacy path.",
          "is_bot": false,
          "headline": "feat(styles): compile themes to palettes with CSS-variable theming",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T17:01:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f5f2c888f43757916bc855d7cf831e1420806f0",
          "body": "…nt markdown embeds (#462)\n\nTokenizer.subContinuations (src/engine.js) is keyed only by\nsub-language name and scoped to the outer tokenizer's whole\nlifetime. It exists so one embedded region can resume across\nseparate flush() calls - e.g. streaming edits via HighlightStream/\nHighlightEditable, resto\n[…]\nthe correct fix\nneeds to scope continuation by embedding occurrence (not just\nsub-language name) while preserving it across snapshot()/restore().\nThat's a deliberate, separate change from this report.",
          "is_bot": false,
          "headline": "test(engine): document a subContinuations state leak across independe…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T16:20:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85a0706d48d01ba332a84052ae8e2a67eb54a310",
          "body": null,
          "is_bot": false,
          "headline": "feat: replace highlight.js runtime with an original engine (#461)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T05:03:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fe263d652bd3213659ee93e935df70be29e6dcb",
          "body": null,
          "is_bot": false,
          "headline": "v7.15.0",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-11T04:15:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20e280bd2f06d46c2a986c8181756fc8e41a047e",
          "body": "…innerText\n\ninnerText forces a synchronous layout on every keystroke and, on\nFirefox, can return a stale value right after editing a text node\nlast written via textContent -- the exact bug the css-highlights\nengine had to special-case around.\n\nVerified natively (execCommand insertText, the primitive\n[…]\noth engines can read textContent\nunconditionally, dropping the per-engine branch and the layout cost.\n\nConfirmed no behavior change against the full Playwright suite across\nall three browser projects.",
          "is_bot": false,
          "headline": "perf(components): read HighlightEditable's code via textContent, not …",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T23:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08334942a7e497da656c447e456073012b31e213",
          "body": "… unmounts\n\nDedup picked the first-mounted instance sharing a theme+scope key to\nrender the shared <style> tag and froze that choice for its lifetime.\nIf that instance unmounted while sibling instances with the same key\nwere still mounted, the tag disappeared and every surviving instance\nlost its th\n[…]\nace the plain ref count with a store holding an ordered queue of\nowner tokens per key: siblings reactively promote the next-in-line\ninstance when the current owner releases, instead of losing the tag.",
          "is_bot": false,
          "headline": "fix(components): hand off HighlightStyle's <style> tag when its owner…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T23:50:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ed5775297ba7bffe28fb157c3e530157331cd8b",
          "body": "Opt-in engine=\"css-highlights\" keeps the editable DOM as plain text\nand paints tokens as CSS.highlights ranges via a custom hljs emitter,\nso repaints never replace nodes on unaffected lines. Theme colors come\nfrom a converter that rewrites .hljs-* class rules into ::highlight()\nrules (colors only — the API's cross-browser envelope). Falls back to\nthe DOM engine where CSS.highlights is unavailable. Experimental;\nbrowser floor Chrome 105 / Safari 17.2 / Firefox 140.",
          "is_bot": false,
          "headline": "feat(components): experimental CSS Custom Highlight engine for editable",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T23:50:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64509e188c887e624def519bb22e7f83e808bd19",
          "body": "Adds a \"Streaming\" section to the docs homepage with a basic demo and\na speed/auto-scroll control panel, plus an unlisted /preview-highlight-stream\nroute exercising chunk-by-chunk streaming, multi-line re-tokenization,\nauto-scroll detach, and caret theming. All examples simulate streaming\nclient-side since the docs site has no real streaming backend.",
          "is_bot": false,
          "headline": "docs(www): document HighlightStream and add a kitchen-sink preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:29:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51754f65c5f020882da558285b78eb6af676a3c1",
          "body": "Rendering LLM output is the dominant new highlighting use case and no\nSvelte-native solution exists. HighlightStream re-highlights the\ngrowing buffer per animation frame (hljs is fast synchronously) but\nrenders through the span-safe line splitter with keyed per-line DOM,\nso unchanged lines are never\n[…]\nix, typically one line per frame. Handles arbitrary chunk\nboundaries, re-tokenizes earlier lines when a multi-line construct\ncloses, sticks to bottom unless the user scrolls up, and finalizes on\ndone.",
          "is_bot": false,
          "headline": "feat(components): add HighlightStream for incrementally streamed code",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:29:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "212b880d26e3d22035e8f3fe17ce998924df1ade",
          "body": "…ightEditable\n\nCover the line-repaint optimization directly: an edit on a large\ndocument must leave unrelated line elements connected and stay within\na generous time budget, catching a regression to whole-document\ninnerHTML rebuilds.",
          "is_bot": false,
          "headline": "test(components): add DOM-stability and perf-smoke coverage for Highl…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c094a180a2564efe0001af5c235b7c5fb77cbfab",
          "body": "The undo stack retained up to historyLimit full copies of the\ndocument. Entries are now prefix/suffix-trimmed splices, bounding\nmemory by edit size rather than document size, with burst\ncoalescing and event shape preserved.",
          "is_bot": false,
          "headline": "perf(components): store HighlightEditable history as slice diffs",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51615d6b9e3b7ca69f705cc88f046192a766c120",
          "body": "…used\n\nA document-level selectionchange listener stringified the entire\neditor content on every selection change anywhere on the page.",
          "is_bot": false,
          "headline": "perf(components): track selection only while HighlightEditable is foc…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bff41efdc1cbc2cd772f34555f138e1cfb60177",
          "body": "Every keystroke rebuilt the whole highlighted DOM via innerHTML and\nre-walked it to restore the caret, making large documents jank.\nPainting now diffs span-safe line fragments and replaces only changed\nline elements — typically one per edit.",
          "is_bot": false,
          "headline": "perf(components): repaint only changed lines in HighlightEditable",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T16:13:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4475d08571fc470ed7a25e3e4a41a40b687f7789",
          "body": "…455)\n\nUpdates re-highlighted the element's own highlighted output when code\nwas omitted, grammar errors escaped the action, and destroy left the\nmutated DOM behind. Snapshot source text on init, highlight from the\nsnapshot, guard hljs errors, and restore original content on destroy.",
          "is_bot": false,
          "headline": "fix(action): make the `highlight` action idempotent and reversible (#…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T15:55:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3319f17e27aaa8e6f3374066c42d9efe642339ff",
          "body": "hljs.highlight/highlightAuto throw value.replace-is-not-a-function on\nnon-string input, crashing render — including SSR. Coerce defensively\nin Highlight, HighlightAuto, and HighlightSvelte before highlighting.",
          "is_bot": false,
          "headline": "fix(components): coerce non-string code before highlighting (#456)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T15:45:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "719a29781e5a413c77d865118d08d72c579029f9",
          "body": "…ge (#454)\n\nThe scope class was hashed from the theme once at init while the\ninjected CSS recomputed reactively, so two blocks that mounted with\nthe same theme and later diverged shared one scope class with\nconflicting stylesheets: both themes applied to both blocks.\n\nAlso dedupes head injection (one <style> per scope class, refcounted\nin the browser) and renders nothing with a dev warning when no theme\nis provided instead of injecting the literal string \"undefined\".",
          "is_bot": false,
          "headline": "fix(components): recompute `HighlightStyle` scope class on theme chan…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ca043a859cc620934d76839a397e19e3e3b91e0",
          "body": "…es (#451)\n\nThe language prop reactively re-registered the grammar but nothing\nrepainted, so highlighting stayed stale until the next keystroke.",
          "is_bot": false,
          "headline": "fix(components): re-highlight `HighlightEditable` when language chang…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:43:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d27dcd4fbed20c94b8683b22752d43314029400e",
          "body": "Displayed code often carries decoration that should not survive a\ncopy: shell prompts, REPL markers, diff signs. A transform prop now\nruns before the copy function (and is what `on:copy` reports), with\nexported `stripPrompts` and `stripDiffMarkers` helpers.",
          "is_bot": false,
          "headline": "feat(components): add transform hook to CopyButton (#447)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:25:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09dc9802ce54340189e4b8738fa33047f4033b40",
          "body": "…Ansi (#449)\n\nReal CLI output broke the parser three ways: OSC sequences (npm/cargo\nhyperlinks, title sets) leaked as visible garbage, \\r progress-bar\nframes rendered concatenated instead of overwritten, and SGR 7/9/8\n(reverse, strikethrough, conceal) were ignored. OSC 8 links now\nsurface as a link field that AnsiOutput renders as an anchor; reverse\nvideo swaps fg/bg before autoContrast runs.",
          "is_bot": false,
          "headline": "feat(components): handle OSC, carriage returns, and more SGR in parse…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:24:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0db821705e345d1d40dd6dc5f1bab25cba6f222a",
          "body": "…tion (#450)\n\nEvery tick re-split the tokenized HTML and replaced the whole\nrevealed head via `{@html}`: O(n^2) with full DOM teardown per\ncharacter, stuttering on long snippets. The markup now renders\nonce with per-unit visibility toggling, so a tick is one classList\nmutation; tokenization runs only when highlighted changes.",
          "is_bot": false,
          "headline": "perf(components): reveal Typewriter units without per-tick retokeniza…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:23:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee2ebe0f48c9bc538281162932bf6c0b62b9c11f",
          "body": "…wgsl preview\n\nAdd a fragment-shader snippet exercising vec2f/vec4f and\ntextureSample to make the modernized grammar's coverage visible in\nthe language preview.",
          "is_bot": false,
          "headline": "docs(preview): showcase short vector aliases and texture builtins in …",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:15:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f1d164b0dd6e1f329ebd33ad3dccd921381d21f",
          "body": "The grammar predated several spec changes: predeclared short type\naliases (vec4f, mat4x4f, ...) were missing, no builtin functions were\nclassified at all (textureSample, dpdx, bitcast, atomics), and\naddress-space keywords were only recognized inside var<...> so\nptr<storage, f32> got nothing. Real-world shaders rendered largely\nunhighlighted.\n\nBuiltin functions require a following \"(\" to avoid over-highlighting\nidentifiers like select. Golden snapshot updated accordingly.",
          "is_bot": false,
          "headline": "fix(languages): modernize WGSL grammar for the current spec",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:15:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "67e18c2ad4dbeda18794ca8f4cca8f3d7b35cb42",
          "body": null,
          "is_bot": false,
          "headline": "v7.14.1",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:10:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "892f2d391fd96039a1926bdf88a4dc8ec96a60c1",
          "body": "…431)\" (#452)\n\nThis reverts commit 62a97114ee84204ae9ca793b5291dadd97cd5148.\n\nPR #431 was billed as an internal refactor but converted Highlight,\nHighlightAuto, and HighlightSvelte to Svelte 5 runes ($props), which\nbreaks consumers on Svelte 3/4. Reverting to restore cross-version\ncompatibility ahead of an emergency patch release.",
          "is_bot": false,
          "headline": "Revert \"refactor(components): extract shared highlighter primitive (#…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-07T02:05:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcca65cab6fd9ecc78f83e96ab735848f35ca98b",
          "body": "Showcases a heredoc body containing standalone words like `true`\nnow that the region only closes at the exact matching delimiter.",
          "is_bot": false,
          "headline": "docs(preview): add bare-word heredoc example to HCL language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b384ee7b83bed17bede72963e9ea5acdcdd974",
          "body": "Showcases anyopaque, the 0.10+ replacement for c_void, now that it\nhighlights as a type.",
          "is_bot": false,
          "headline": "docs(preview): add anyopaque example to Zig language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5675899e3cb96b5cd9c622f02c8ae1793949b59a",
          "body": "Showcases hint.strategy and hint.shufflekey now that dotted\nkeywords highlight correctly.",
          "is_bot": false,
          "headline": "docs(preview): add join hint example to KQL language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fccc52b0c4539553fc94c756a8f36f2d963c7b17",
          "body": "Showcases addmod and mulmod now that the mulmod builtin typo is\nfixed.",
          "is_bot": false,
          "headline": "docs(preview): add mulmod example to Solidity language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dec39b5c92efce2128e754f80fab7da222af49cd",
          "body": "Showcases $state<number>(...) and $derived<Item[]>(...) now that\ntyped rune calls highlight correctly as keywords.",
          "is_bot": false,
          "headline": "docs(preview): add typed rune call example to Svelte language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca8ace1c64924b4b06092580aa425d642eb9c357",
          "body": "end: /^\\s*\\w+\\s*$/ closed the heredoc at the first bare word on its\nown line rather than the matching delimiter, so a lone `true` inside\na heredoc body terminated the string early. Use\nhljs.END_SAME_AS_BEGIN with a captured delimiter on both begin and\nend so the region only closes on the exact matching word.",
          "is_bot": false,
          "headline": "fix(languages): match heredoc delimiters exactly in HCL grammar",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cffa146d1987f2e0a278940f43369b0aec7620b",
          "body": "hljs compiles all begin patterns with the m flag, so ^---\\s*\\n\nmatched at any line start and a stray --- mid-document (e.g. a\nmarkdown hr) opened a bogus TypeScript frontmatter region. Add an\non:begin callback that ignores the match unless it starts at index 0.",
          "is_bot": false,
          "headline": "fix(languages): anchor Astro frontmatter to document start",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00e5ec86bf06144b38719f5ebc499c8ef5687647",
          "body": "className: \"meta-keyword\" is a v10 class; v11 themes style\n.hljs-meta .hljs-keyword instead, so directives like [private]\nrendered unstyled. Nest a plain \"keyword\" scope inside the existing\n\"meta\" mode so the emitted spans are theme-styled.",
          "is_bot": false,
          "headline": "fix(languages): emit v11 scopes for just directives",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea1b6344982f455859b9737d531393a8cfceb0f8",
          "body": null,
          "is_bot": false,
          "headline": "fix(languages): add anyopaque and dedupe fn in Zig grammar",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0aac6468c3ef290851ff555c42306bfbf1d00368",
          "body": "Default $pattern is \\w+ (no dot), so hint.strategy/hint.shufflekey\ncould never match the keyword list. Add a $pattern admitting dots,\nmatching the dhall/clarity/d2 convention.",
          "is_bot": false,
          "headline": "fix(languages): match dotted hint keywords in KQL grammar",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ebc45cd99536588760d2aa1df42f3d2f0030b4b",
          "body": null,
          "is_bot": false,
          "headline": "fix(languages): correct mulmod builtin in Solidity grammar",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7687177db766a3b2f6d8865b7ee29a8a10f11b83",
          "body": "Lookahead omitted `<` so `$state<T>(...)` fell through to the TS\nsub-grammar. Also drop the dead `g` flag on the script-tag begin\nregexes; hljs recompiles from `.source` so it was misleading noise.",
          "is_bot": false,
          "headline": "fix(languages): highlight typed rune calls in Svelte grammar",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T23:03:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89eef0b7f8da8260a8955fc785338f0d7a86c488",
          "body": "…ity (#444)\n\njq, rescript, and hlsl used (?<=)/(?<!) patterns, which throw a\nSyntaxError at RegExp compile time on Safari < 16.4 — registering any\nof these grammars crashed the page rather than degrading gracefully.\nhighlight.js core avoids lookbehind for the same reason.\n\nRewritten with hljs multi-match begin arrays and beginScope so the\nleading context is consumed but unscoped. Adds a lint-style test that\nfails if any custom grammar reintroduces lookbehind.",
          "is_bot": false,
          "headline": "fix(languages): remove lookbehind regexes for older-engine compatibil…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:54:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6579e215d71512141418974fa24816b7bc466b98",
          "body": "…#445)\n\nStyle modules are written to disk by hljs name (styles/a11y-dark.js)\nbut the doc generator interpolated the camelCase binding name into\nthe module specifier, documenting imports like\n\"svelte-highlight/styles/a11yDark\" that do not resolve. Every\ndash-cased or digit-prefixed theme had broken instructions.",
          "is_bot": false,
          "headline": "build(scripts): emit dash-cased import paths in SUPPORTED_STYLES.md (…",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:48:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee46213486183ce268b6a5a7770959d7aaea0319",
          "body": "Digit width was computed from the line count alone, so a block with\nstartingLineNumber=100 rendered 3-digit numbers in a gutter sized\nfor one digit.",
          "is_bot": false,
          "headline": "fix(components): size LineNumbers gutter by the final line number",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:20:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f91d158c8c6e5a0e2a1c1870d6227ada0e7a10b",
          "body": "LineNumbers split highlighted HTML on \\n, cutting through spans that\nhljs emits across lines (block comments, template literals). The\nfirst line was left with an unclosed <span> and continuation lines\nlost their styling entirely.\n\nAdds a splitLines helper that closes the open span stack at each\nline break and re-opens it on the next line, the same strategy\nPrism and Shiki use for line-level transforms.",
          "is_bot": false,
          "headline": "fix(components): preserve multi-line highlight spans in LineNumbers",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:20:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edba8563da033a4174f6ace7699e6cb513ae0bb9",
          "body": "parseAnsi, loadLanguage, and the scoped-style helpers have no Svelte\ndependency but were only reachable through the svelte-conditioned\nroot export, so plain Node ESM could not resolve them. scoped.js\nships a hand-written .d.ts yet had no exports entry at all.\n\nAdds ./ansi, ./load-language, and ./scoped subpaths with types +\ndefault conditions and re-exports the scoped helpers from the root\nindex for component consumers.",
          "is_bot": false,
          "headline": "build(scripts): export pure-JS modules with a default condition",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:20:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35b4669059f258ee03d547c8b6ec97a076e0d958",
          "body": "npm-package.ts copies src/ contents to the package root, so the\npublished files are styles/*.css and langtag.css — the configured\n\"src/\"-prefixed globs matched nothing. Bundlers that respect\nsideEffects (webpack) could tree-shake style imports like\n\"svelte-highlight/styles/github.css\" out of user builds entirely.\n\nAdds a package-shape test that resolves every exports entry and\nasserts each sideEffects glob matches at least one published file.",
          "is_bot": false,
          "headline": "build(scripts): fix sideEffects globs to match published layout",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-06T22:20:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "750f00a53be161a5eee534b218e08950461ad030",
          "body": "Drops the noStaticElementInteractions override for www/**/*.{svelte,astro},\nfixed upstream in 2.5.2 (biomejs/biome#10759) for svelte:window/document/body.\n\nAlso works around a Biome cross-script-scope bug where a postfix increment\n(uid++) read from a <script context=\"module\"> binding isn't tracked as a\nuse, and removes a genuinely unused _3024 style import that 2.5.2 now\ncorrectly flags.",
          "is_bot": false,
          "headline": "chore(deps-dev): bump @biomejs/biome to 2.5.2",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-05T02:31:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83caeeee9c49859a14bc63cafb951702752e5a33",
          "body": "Showcases $state.raw, $derived.by, $effect.pre, $effect.tracking,\nand $props.id now that they highlight correctly as keywords.",
          "is_bot": false,
          "headline": "docs(preview): add dotted rune suffix example to Svelte language preview",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T18:31:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9b08be202e275f60a9b5e71a98743cb9e74cd71",
          "body": "$effect.pre, $effect.tracking, $effect.pending, $effect.root,\n$props.id, and $inspect.trace fell through to the TypeScript\nsub-grammar because RUNE_SUFFIXES only listed raw|snapshot|by|eager.",
          "is_bot": false,
          "headline": "fix(languages): highlight dotted Svelte 5 rune suffixes as keywords",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T18:31:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3d09d92e34ec40e36909bea2b547e0f5647fdc8",
          "body": "@playwright/experimental-ct-svelte stays at 1.58.2, its latest\npublished release; the two packages aren't version-locked.",
          "is_bot": false,
          "headline": "chore(deps-dev): bump @playwright/test to 1.61.1",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T04:38:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2dee05e3b0e2dfe1e2028d2da33f54bd4faf99f",
          "body": "Root-level playwright/ duplicated the tests/ directory that\nalready holds testDir. Relocating to tests/e2e/playwright and\npointing ctTemplateDir there keeps all Playwright assets in one\nplace.",
          "is_bot": false,
          "headline": "test(playwright): move component-testing template under tests/",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T04:38:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecbe46ad25829666fc76e2cc4d363a38b4b79dee",
          "body": "SUPPORTED_LANGUAGES.md claimed all languages were \"exported\nfrom highlight.js,\" but 52 are custom svelte-highlight grammars.\nSplit the header count so the source of each language is accurate.",
          "is_bot": false,
          "headline": "docs(languages): clarify highlight.js vs custom language counts (#438)",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T00:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c07118867f278da77af15929ea314e49ef37f521",
          "body": null,
          "is_bot": false,
          "headline": "v7.14.0",
          "author_name": "Eric Liu",
          "author_login": "metonym",
          "committed_at": "2026-07-03T00:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 69,
      "commits_last_year": 447,
      "latest_release_at": "2026-07-19T22:24:49Z",
      "latest_release_tag": "v7.16.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 41,
      "days_since_latest_release": 6,
      "mean_days_between_releases": 30.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "svelte-highlight",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "svelte",
            "svelte components",
            "highlight.js",
            "syntax highlight"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/svelte-highlight",
          "is_deprecated": false,
          "latest_version": "7.16.0",
          "repository_url": "https://github.com/metonym/svelte-highlight",
          "versions_count": 89,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 188536,
          "first_published_at": "2019-11-09T22:14:49.291000Z",
          "latest_published_at": "2026-07-19T22:24:29.533000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 6
        }
      ]
    },
    "popularity": {
      "forks": 14,
      "stars": 335,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2020-04-26",
            "count": 1
          },
          {
            "date": "2021-06-08",
            "count": 1
          },
          {
            "date": "2022-02-20",
            "count": 1
          },
          {
            "date": "2022-02-25",
            "count": 1
          },
          {
            "date": "2022-05-14",
            "count": 1
          },
          {
            "date": "2022-06-04",
            "count": 1
          },
          {
            "date": "2022-12-31",
            "count": 1
          },
          {
            "date": "2023-05-27",
            "count": 1
          },
          {
            "date": "2023-09-30",
            "count": 1
          },
          {
            "date": "2023-11-05",
            "count": 1
          },
          {
            "date": "2023-12-16",
            "count": 1
          },
          {
            "date": "2024-07-20",
            "count": 1
          },
          {
            "date": "2024-10-05",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 14,
        "total_forks": 14
      },
      "star_history": null,
      "open_issues_and_prs": 5
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "examples/rollup/tsconfig.json",
        "examples/routify/tsconfig.json",
        "examples/sveltekit/tsconfig.json",
        "examples/vite/tsconfig.json",
        "examples/vite@svelte-4/tsconfig.json",
        "examples/webpack/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 60316,
      "source_files_sampled": 321,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 2,
        "malicious_count": 0,
        "assessed_package": "npm:svelte-highlight@7.16.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "magic-string",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.30.17"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "magic-string",
            "direct": true,
            "version": "^0.30.17",
            "ecosystem": "npm"
          },
          {
            "name": "@astrojs/svelte",
            "direct": false,
            "version": "^8.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@biomejs/biome",
            "direct": false,
            "version": "2.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@playwright/experimental-ct-svelte",
            "direct": false,
            "version": "1.58.2",
            "ecosystem": "npm"
          },
          {
            "name": "@playwright/test",
            "direct": false,
            "version": "1.61.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-commonjs",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-node-resolve",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@roxi/routify",
            "direct": false,
            "version": "^3.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/adapter-node",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/kit",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/vite-plugin-svelte",
            "direct": false,
            "version": "^3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/vite-plugin-svelte",
            "direct": false,
            "version": "^5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/vite-plugin-svelte",
            "direct": false,
            "version": "^7.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/vite-plugin-svelte",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@tsconfig/svelte",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "@types/bun",
            "direct": false,
            "version": "^1.3.14",
            "ecosystem": "npm"
          },
          {
            "name": "@types/jest",
            "direct": false,
            "version": "^30.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "^25.9.5",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/native-preview",
            "direct": false,
            "version": "^7.0.0-dev.20260707.2",
            "ecosystem": "npm"
          },
          {
            "name": "astro",
            "direct": false,
            "version": "^6.4.8",
            "ecosystem": "npm"
          },
          {
            "name": "carbon-components-svelte",
            "direct": false,
            "version": "^0.110.1",
            "ecosystem": "npm"
          },
          {
            "name": "carbon-preprocess-svelte",
            "direct": false,
            "version": "^0.11.37",
            "ecosystem": "npm"
          },
          {
            "name": "css-loader",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "cssnano",
            "direct": false,
            "version": "^7.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "cssnano-preset-lite",
            "direct": false,
            "version": "^4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "highlight.js",
            "direct": false,
            "version": "11.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "html-webpack-plugin",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "mini-css-extract-plugin",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "^8.5.19",
            "ecosystem": "npm"
          },
          {
            "name": "postcss-discard-duplicates",
            "direct": false,
            "version": "^7.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "postcss-inline-css-vars",
            "direct": false,
            "version": "^0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "postcss-merge-rules",
            "direct": false,
            "version": "^7.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-svelte",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "rollup-plugin-terser",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "svelte",
            "direct": false,
            "version": "^4.2.20",
            "ecosystem": "npm"
          },
          {
            "name": "svelte",
            "direct": false,
            "version": "^5.56.3",
            "ecosystem": "npm"
          },
          {
            "name": "svelte",
            "direct": false,
            "version": "^5.56.6",
            "ecosystem": "npm"
          },
          {
            "name": "svelte",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "svelte-highlight",
            "direct": false,
            "version": "^7.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "svelte-loader",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "svelte-preprocess",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^5.4.21",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^7.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "^8.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "webpack",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-cli",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-dev-server",
            "direct": false,
            "version": "latest",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 50,
        "direct_count": 1,
        "indirect_count": 49
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 4,
        "merged_prs": 334,
        "open_issues": 1,
        "closed_ratio": 0.988,
        "closed_issues": 81,
        "closed_unmerged_prs": 51
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "metonym",
          "commits": 1184,
          "avatar_url": "https://avatars.githubusercontent.com/u/10718366?v=4"
        },
        {
          "type": "User",
          "login": "WillsterJohnson",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/85991558?v=4"
        },
        {
          "type": "User",
          "login": "pjebs",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/5377970?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.997
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "biome.json"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 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/7 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 4 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": 10,
            "reason": "all dependencies are pinned",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "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": "49 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e4f6958d0fdff1aeb0c2f42b5b28c80e64e4d18b",
        "ran_at": "2026-07-25T22:33:09Z",
        "aggregate_score": 5.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-23T14:49:59Z",
      "oldest_open_prs": [
        {
          "number": 382,
          "created_at": "2025-10-12T22:13:15Z",
          "last_comment_at": "2025-10-23T14:58:15Z",
          "last_comment_author": "Konixy"
        },
        {
          "number": 457,
          "created_at": "2026-07-07T15:45:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 467,
          "created_at": "2026-07-12T16:12:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 468,
          "created_at": "2026-07-12T16:14:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-23T14:47:17Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 380,
          "created_at": "2025-10-08T11:57:01Z",
          "last_comment_at": "2025-10-12T22:13:39Z",
          "last_comment_author": "metonym"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/metonym/svelte-highlight",
    "host": "github.com",
    "name": "svelte-highlight",
    "owner": "metonym"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 72,
      "inputs": {
        "security": 66,
        "vitality": 95,
        "community": 60,
        "governance": 62,
        "engineering": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 95,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "commits_last_year": 447,
              "human_commit_share": 1,
              "days_since_last_push": 2,
              "active_weeks_last_year": 41
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "41/52 weeks with commits",
                "points": 28.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 41
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "447 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 447
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 4 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 69,
              "latest_release_tag": "v7.16.0",
              "releases_from_tags": false,
              "days_since_latest_release": 6,
              "mean_days_between_releases": 30.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "69 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 69
                    }
                  }
                ],
                "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 ~30.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 30.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 60,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "forks": 14,
              "stars": 335,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "335 stars",
                "points": 40.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 335
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "14 forks",
                "points": 9.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "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": 88,
            "inputs": {
              "packages": [
                "svelte-highlight"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 188536
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "188,536 downloads/month across npm",
                "points": 70.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 188536,
                      "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": 62,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.997
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "merged_prs": 334,
              "open_issues": 1,
              "closed_issues": 81,
              "issue_closed_ratio": 0.988,
              "closed_unmerged_prs": 51
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "99% of issues closed",
                "points": 46.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "334/385 decided PRs merged",
                "points": 33.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 334,
                      "decided": 385
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/7 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 66,
            "inputs": {
              "followers": 294,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "metonym",
              "public_repos": 161,
              "account_age_days": 4197
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "294 followers of metonym",
                "points": 17.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 294,
                      "login": "metonym"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "161 public repos, account ~11 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 161
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "svelte-highlight"
              ],
              "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": "89 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 89
                    }
                  }
                ],
                "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "biome.json",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "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": "3 out of 3 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": [
                "svelte",
                "highlight-js",
                "highlight",
                "code",
                "syntax",
                "syntax-highlighting",
                "svelte-component",
                "typescript"
              ],
              "has_wiki": false,
              "homepage": "https://svhe.onrender.com",
              "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://svhe.onrender.com",
                "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": 66,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 3 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/7 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 4 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": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "49 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:svelte-highlight@7.16.0 runtime dependency closure — what installing the published package pulls in — 2 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:svelte-highlight@7.16.0",
                  "assessed": 2
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 2,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 2,
              "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": 5
            },
            "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": 55,
        "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.96,
              "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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "examples/rollup/tsconfig.json",
                "examples/routify/tsconfig.json",
                "examples/sveltekit/tsconfig.json",
                "examples/vite/tsconfig.json",
                "examples/vite@svelte-4/tsconfig.json",
                "examples/webpack/tsconfig.json",
                "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": "biome.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "biome.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "examples/rollup/tsconfig.json, examples/routify/tsconfig.json, examples/sveltekit/tsconfig.json, examples/vite/tsconfig.json, examples/vite@svelte-4/tsconfig.json, examples/webpack/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples/rollup/tsconfig.json, examples/routify/tsconfig.json, examples/sveltekit/tsconfig.json, examples/vite/tsconfig.json, examples/vite@svelte-4/tsconfig.json, examples/webpack/tsconfig.json, tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 60316,
              "source_files_sampled": 321,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/321 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 321,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T22:33:25.006025Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/metonym/svelte-highlight.svg",
  "full_name": "metonym/svelte-highlight",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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