公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-24 03:54 UTC

krmanik / Anki-xiehanzi

Learn, read, write and practice Mandarin by drawing strokes in Anki Desktop, AnkiDroid and AnkiMobile with audio of HSK 2.0 (HSK1-6) and HSK 3.0 (HSK 1-9), BCT and YCT words.

HTML · TypeScript · Svelte自定义许可证★ 392 星标⑂ 32 复刻始于 2020年3月在 GitHub 上查看 ↗

krmanik/Anki-xiehanzi 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(67/100),最低的是Security(46/100)。 最近一次更新在 37 天前。 近期的大部分工作由 1 位贡献者完成。

55
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Mani个人账户
127 关注者73 个公开仓库始于 2015年6月

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

按类别列示的指标

活力

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

52中等 · 占总体的 22%
评分方式
18/36推送新近度 — 最近一次推送于 37 天前
3.5/36提交节奏 — 52 周中有 5 周有提交
18/18提交量 — 最近一年 120 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year120
human_commit_share1
days_since_last_push37
active_weeks_last_year5

发布纪律

56中等
评分方式
27/27有发布版本 — 已发布 18 个发布版本
16.2/36发布时效 — 最近一次发布版本于 215 天前
12.6/27发布节奏 — 约每 171.4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count18
latest_release_tagv2.3
releases_from_tags
days_since_latest_release215
mean_days_between_releases171.4

社区与采用

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

60中等 · 占总体的 18%
评分方式
42/60星标 — 392 个星标
12.4/25复刻 — 32 个复刻
1.7/15关注者 — 3 位关注者
所用输入
forks32
stars392
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

64中等
评分方式
22.5/22.5README
16.9/22.5许可证 — 存在许可证文件,但不是可识别的许可证
18/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

可持续性与治理

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

48存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.1/22.5提交分布 — 头号贡献者编写了 99% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.994
评分方式
42.4/46.8议题解决 — 91% 的议题已关闭
30.6/38.3PR 接受 — 已裁定的 PR 中 8/10 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/16 approved changesets -- score normalized to 0
所用输入
merged_prs8
open_issues6
closed_issues59
issue_closed_ratio0.908
closed_unmerged_prs2
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
15.1/25所有者影响力 — krmanik 有 127 位关注者
25/25既往记录 — 73 个公开仓库,账户约 11 年
所用输入
followers127
owner_typeUser
is_verified
owner_loginkrmanik
public_repos73
account_age_days4,060
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。

工程质量

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

67中等 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 1 out of 1 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://krmanik.github.io/Anki-xiehanzi
10/10仓库描述
10/10主题标签 — 16 个主题标签
0/10Wiki
所用输入
topicsanki, ankidroid, mandarin, chinese-language, practice-mandarin, drawing-strokes, hanzi, hanzi-writer, anki-xiehanzi, anki-decks, chinese-characters, mandarin-chinese, hacktoberfest, hsk, hsk3, new-hsk
has_wiki
homepagehttps://krmanik.github.io/Anki-xiehanzi
has_readme
has_docs_dir
has_description

安全

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

46存在风险 · 占总体的 16%

安全态势

32存在风险
评分方式
6/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 1 out of 1 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/16 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
2.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 22 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3.1
已排除计分(无数据或不适用):packaging。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories23
affected_packages13
assessed_packages691
unassessed_packages0
affected_by_severitycritical 1, high 6, moderate 4, low 2
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 691 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

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

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

机器可读接口

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

关键数据

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

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 32 ⇿
0Star
32Fork
18发布

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

01325383222020-032023-052026-06
主版本 1次版本 2修订 9

每个点涵盖 6 天。

OpenSSF Scorecard 3.1 / 10
3.1综合

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

8Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 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/16 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
5Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 5
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities22 existing vulnerabilities detected
直接依赖 10
注册表软件包版本约束清单文件
npm@hiseb/confetti^2.1.0package.json
npm@kingdanx/edge-tts-browser^1.0.0package.json
npmchinese-s2t^1.0.0package.json
npmchinese-to-pinyin^1.3.1package.json
npmgenanki-js^2.0.0package.json
npmhanzi-writer^3.6.1package.json
npmjieba-wasm^2.0.0package.json
npmsegmentit^2.0.3package.json
npmsql.js^1.10.3package.json
npmunzipit^1.4.3package.json
全部依赖 691

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

注册表软件包版本关系
npm@hiseb/confetti2.1.0直接
npm@kingdanx/edge-tts-browser1.0.0直接
npmchinese-s2t1.0.0直接
npmchinese-to-pinyin1.3.1直接
npmgenanki-js2.0.0直接
npmhanzi-writer3.6.1直接
npmjieba-wasm2.0.0直接
npmsegmentit2.0.3直接
npmsql.js1.10.3直接
npmunzipit1.4.3直接
npm@adobe/css-tools4.5.0间接
npm@asamuzakjp/css-color5.1.11间接
npm@asamuzakjp/dom-selector7.1.1间接
npm@asamuzakjp/generational-cache1.0.1间接
npm@asamuzakjp/nwsapi2.3.9间接
npm@babel/code-frame7.23.5间接
npm@babel/helper-validator-identifier7.22.20间接
npm@babel/highlight7.23.4间接
npm@babel/runtime7.23.9间接
npm@bramus/specificity2.4.2间接
npm@csstools/color-helpers6.0.2间接
npm@csstools/css-calc3.2.1间接
npm@csstools/css-color-parser4.1.1间接
npm@csstools/css-parser-algorithms4.0.0间接
npm@csstools/css-syntax-patches-for-csstree1.1.5间接
npm@csstools/css-tokenizer4.0.0间接
npm@emnapi/core1.10.0间接
npm@emnapi/runtime1.10.0间接
npm@emnapi/wasi-threads1.2.1间接
npm@exodus/bytes1.15.1间接
npm@floating-ui/core1.7.5间接
npm@floating-ui/dom1.7.6间接
npm@floating-ui/utils0.2.11间接
npm@jridgewell/gen-mapping0.3.13间接
npm@jridgewell/remapping2.3.5间接
npm@jridgewell/resolve-uri3.1.1间接
npm@jridgewell/source-map0.3.5间接
npm@jridgewell/sourcemap-codec1.5.5间接
npm@jridgewell/trace-mapping0.3.31间接
npm@lucide/svelte1.17.0间接
npm@napi-rs/wasm-runtime1.1.4间接
npm@oxc-project/types0.133.0间接
npm@polka/url1.0.0-next.24间接
npm@popperjs/core2.11.8间接
npm@rolldown/binding-android-arm641.0.3间接
npm@rolldown/binding-darwin-arm641.0.3间接
npm@rolldown/binding-darwin-x641.0.3间接
npm@rolldown/binding-freebsd-x641.0.3间接
npm@rolldown/binding-linux-arm-gnueabihf1.0.3间接
npm@rolldown/binding-linux-arm64-gnu1.0.3间接
npm@rolldown/binding-linux-arm64-musl1.0.3间接
npm@rolldown/binding-linux-ppc64-gnu1.0.3间接
npm@rolldown/binding-linux-s390x-gnu1.0.3间接
npm@rolldown/binding-linux-x64-gnu1.0.3间接
npm@rolldown/binding-linux-x64-musl1.0.3间接
npm@rolldown/binding-openharmony-arm641.0.3间接
npm@rolldown/binding-wasm32-wasi1.0.3间接
npm@rolldown/binding-win32-arm64-msvc1.0.3间接
npm@rolldown/binding-win32-x64-msvc1.0.3间接
npm@rolldown/pluginutils1.0.1间接
npm@rollup/plugin-inject5.0.5间接
npm@rollup/plugin-node-resolve15.3.1间接
npm@rollup/pluginutils5.4.0间接
npm@standard-schema/spec1.1.0间接
npm@sveltejs/acorn-typescript1.0.10间接
npm@sveltejs/adapter-static3.0.10间接
npm@sveltejs/kit2.63.0间接
npm@sveltejs/load-config0.1.1间接
npm@sveltejs/vite-plugin-svelte7.1.2间接
npm@tailwindcss/node4.3.0间接
npm@tailwindcss/oxide4.3.0间接
npm@tailwindcss/oxide-android-arm644.3.0间接
npm@tailwindcss/oxide-darwin-arm644.3.0间接
npm@tailwindcss/oxide-darwin-x644.3.0间接
npm@tailwindcss/oxide-freebsd-x644.3.0间接
npm@tailwindcss/oxide-linux-arm-gnueabihf4.3.0间接
npm@tailwindcss/oxide-linux-arm64-gnu4.3.0间接
npm@tailwindcss/oxide-linux-arm64-musl4.3.0间接
npm@tailwindcss/oxide-linux-x64-gnu4.3.0间接
npm@tailwindcss/oxide-linux-x64-musl4.3.0间接
npm@tailwindcss/oxide-wasm32-wasi4.3.0间接
npm@tailwindcss/oxide-win32-arm64-msvc4.3.0间接
npm@tailwindcss/oxide-win32-x64-msvc4.3.0间接
npm@tailwindcss/vite4.3.0间接
npm@testing-library/dom10.4.1间接
npm@testing-library/jest-dom6.9.1间接
npm@testing-library/svelte5.3.1间接
npm@testing-library/svelte-core1.0.0间接
npm@testing-library/user-event14.6.1间接
npm@tybys/wasm-util0.10.2间接
npm@types/aria-query5.0.4间接
npm@types/chai5.2.3间接
npm@types/cookie0.6.0间接
npm@types/deep-eql4.0.2间接
npm@types/estree1.0.9间接
npm@types/mdast4.0.4间接
npm@types/node25.9.2间接
npm@types/parse-json4.0.2间接
npm@types/resolve1.20.2间接
npm@types/trusted-types2.0.7间接
npm@types/unist2.0.11间接
npm@vitest/expect4.1.8间接
npm@vitest/mocker4.1.8间接
npm@vitest/pretty-format4.1.8间接
npm@vitest/runner4.1.8间接
npm@vitest/snapshot4.1.8间接
npm@vitest/spy4.1.8间接
npm@vitest/utils4.1.8间接
npmacorn8.16.0间接
npmansi-colors1.1.0间接
npmansi-cyan0.1.1间接
npmansi-gray0.1.1间接
npmansi-red0.1.1间接
npmansi-regex2.1.1间接
npmansi-regex5.0.1间接
npmansi-styles3.2.1间接
npmansi-styles5.2.0间接
npmansi-wrap0.1.0间接
npmanymatch2.0.0间接
npmapexcharts5.14.0间接
npmappend-buffer1.0.2间接
npmarchy1.0.0间接
npmaria-query5.3.0间接
npmaria-query5.3.1间接
npmarr-diff1.1.0间接
npmarr-diff4.0.0间接
npmarr-filter1.1.2间接
npmarr-flatten1.1.0间接
npmarr-map2.0.2间接
npmarr-union2.1.0间接
npmarr-union3.1.0间接
npmarray-each1.0.1间接
npmarray-initial1.1.0间接
npmarray-last1.3.0间接
npmarray-slice0.2.3间接
npmarray-slice1.1.0间接
npmarray-sort1.0.0间接
npmarray-unique0.3.2间接
npmasn1.js4.10.1间接
npmassert2.1.0间接
npmassertion-error2.0.1间接
npmassign-symbols1.0.0间接
npmasync-done1.3.2间接
npmasync-each1.0.6间接
npmasync-settle1.0.0间接
npmatob2.1.2间接
npmavailable-typed-arrays1.0.7间接
npmaxobject-query4.1.0间接
npmbabel-plugin-macros2.8.0间接
npmbabel-plugin-preval4.0.0间接
npmbach1.2.0间接
npmbalanced-match1.0.2间接
npmbase0.11.2间接
npmbase64-js1.5.1间接
npmbidi-js1.0.3间接
npmbig-integer1.6.52间接
npmbinary-extensions1.13.1间接
npmbindings1.5.0间接
npmbn.js4.12.0间接
npmbn.js5.2.1间接
npmbn.js5.2.3间接
npmbrace-expansion1.1.11间接
npmbraces2.3.2间接
npmbrorand1.1.0间接
npmbrowser-resolve2.0.0间接
npmbrowserify-aes1.2.0间接
npmbrowserify-cipher1.0.1间接
npmbrowserify-des1.0.2间接
npmbrowserify-rsa4.1.1间接
npmbrowserify-sign4.2.6间接
npmbrowserify-zlib0.2.0间接
npmbuffer5.7.1间接
npmbuffer-equal1.0.1间接
npmbuffer-from1.1.2间接
npmbuffer-xor1.0.3间接
npmbuiltin-status-codes3.0.0间接
npmcache-base1.0.1间接
npmcall-bind1.0.9间接
npmcall-bind-apply-helpers1.0.2间接
npmcall-bound1.0.4间接
npmcallsites3.1.0间接
npmcamelcase3.0.0间接
npmchai6.2.2间接
npmchalk2.4.2间接
npmchokidar2.1.8间接
npmchokidar4.0.3间接
npmcipher-base1.0.4间接
npmclass-utils0.3.6间接
npmcliui3.2.0间接
npmclone2.1.2间接
npmclone-buffer1.0.0间接
npmclone-stats1.0.0间接
npmcloneable-readable1.1.3间接
npmclsx2.1.1间接
npmcode-point-at1.1.0间接
npmcollection-map1.0.0间接
npmcollection-visit1.0.0间接
npmcolor-convert1.9.3间接
npmcolor-name1.1.3间接
npmcolor-support1.1.3间接
npmcommander2.20.3间接
npmcomponent-emitter1.3.1间接
npmconcat-map0.0.1间接
npmconcat-stream1.6.2间接
npmconcat-with-sourcemaps1.1.0间接
npmconsole-browserify1.2.0间接
npmconstants-browserify1.0.0间接
npmconvert-source-map1.9.0间接
npmconvert-source-map2.0.0间接
npmcookie0.6.0间接
npmcopy-descriptor0.1.1间接
npmcopy-props2.0.5间接
npmcore-util-is1.0.3间接
npmcosmiconfig6.0.0间接
npmcreate-ecdh4.0.4间接
npmcreate-hash1.2.0间接
npmcreate-hmac1.1.7间接
npmcreate-require1.1.1间接
npmcrypto-browserify3.12.1间接
npmcrypto-js4.2.0间接
npmcss-tree3.2.1间接
npmcss.escape1.5.1间接
npmd1.0.1间接
npmdata-urls7.0.0间接
npmdate-fns4.4.0间接
npmdebug2.6.9间接
npmdecamelize1.2.0间接
npmdecimal.js10.6.0间接
npmdecode-uri-component0.2.2间接
npmdeepmerge4.3.1间接
npmdefault-compare1.0.0间接
npmdefault-resolution2.0.0间接
npmdefine-data-property1.1.4间接
npmdefine-properties1.2.1间接
npmdefine-property0.2.5间接
npmdefine-property1.0.0间接
npmdefine-property2.0.2间接
npmdequal2.0.3间接
npmdes.js1.1.0间接
npmdetect-file1.0.0间接
npmdetect-libc2.1.2间接
npmdevalue5.8.1间接
npmdiffie-hellman5.0.3间接
npmdom-accessibility-api0.5.16间接
npmdom-accessibility-api0.6.3间接
npmdomain-browser4.22.0间接
npmdunder-proto1.0.1间接
npmduplexify3.7.1间接
npmeach-props1.3.2间接
npmelliptic6.6.1间接
npmend-of-stream1.4.4间接
npmenhanced-resolve5.23.0间接
npmentities8.0.0间接
npmerror-ex1.3.2间接
npmes-define-property1.0.1间接
npmes-errors1.3.0间接
npmes-module-lexer2.1.0间接
npmes-object-atoms1.1.2间接
npmes5-ext0.10.62间接
npmes6-iterator2.0.3间接
npmes6-symbol3.1.3间接
npmes6-weak-map2.0.3间接
npmescape-string-regexp1.0.5间接
npmesm-env1.2.2间接
npmesrap2.2.11间接
npmestree-walker2.0.2间接
npmestree-walker3.0.3间接
npmevents3.3.0间接
npmevp_bytestokey1.0.3间接
npmexpand-brackets2.1.4间接
npmexpand-tilde2.0.2间接
npmexpect-type1.3.0间接
npmext1.7.0间接
npmextend3.0.2间接
npmextend-shallow1.1.4间接
npmextend-shallow2.0.1间接
npmextend-shallow3.0.2间接
npmextglob2.0.4间接
npmfancy-log1.3.3间接
npmfast-levenshtein1.1.4间接
npmfdir6.5.0间接
npmfile-saver2.0.5间接
npmfile-uri-to-path1.0.0间接
npmfill-range4.0.0间接
npmfind-up1.1.2间接
npmfind-up5.0.0间接
npmfindup-sync2.0.0间接
npmfindup-sync3.0.0间接
npmfined1.2.0间接
npmflagged-respawn1.0.1间接
npmflowbite2.5.2间接
npmflowbite3.1.2间接
npmflowbite-datepicker1.3.2间接
npmflowbite-svelte1.33.1间接
npmflush-write-stream1.1.1间接
npmfor-each0.3.5间接
npmfor-in1.0.2间接
npmfor-own1.0.0间接
npmfragment-cache0.2.1间接
npmfs-mkdirp-stream1.0.0间接
npmfs.realpath1.0.0间接
npmfsevents1.2.13间接
npmfsevents2.3.3间接
npmfunction-bind1.1.2间接
npmgenerator-function2.0.1间接
npmget-caller-file1.0.3间接
npmget-intrinsic1.3.0间接
npmget-proto1.0.1间接
npmget-value2.0.6间接
npmglob7.2.3间接
npmglob-parent3.1.0间接
npmglob-stream6.1.0间接
npmglob-watcher5.0.5间接
npmglobal-modules1.0.0间接
npmglobal-prefix1.0.2间接
npmglogg1.0.2间接
npmgopd1.2.0间接
npmgraceful-fs4.2.11间接
npmgulp4.0.2间接
npmgulp-cli2.3.0间接
npmgulp-concat2.6.1间接
npmgulp-minify3.1.0间接
npmgulplog1.0.0间接
npmhas-flag3.0.0间接
npmhas-property-descriptors1.0.2间接
npmhas-symbols1.1.0间接
npmhas-tostringtag1.0.2间接
npmhas-value0.3.1间接
npmhas-value1.0.0间接
npmhas-values0.1.4间接
npmhas-values1.0.0间接
npmhash-base3.0.5间接
npmhash-base3.1.2间接
npmhash.js1.1.7间接
npmhasown2.0.4间接
npmhmac-drbg1.0.1间接
npmhomedir-polyfill1.0.3间接
npmhosted-git-info2.8.9间接
npmhtml-encoding-sniffer6.0.0间接
npmhttps-browserify1.0.0间接
npmieee7541.2.1间接
npmimmediate3.0.6间接
npmimport-fresh3.3.0间接
npmindent-string4.0.0间接
npminflight1.0.6间接
npminherits2.0.4间接
npmini1.3.8间接
npminterpret1.4.0间接
npminvert-kv1.0.0间接
npmis-absolute1.0.0间接
npmis-accessor-descriptor1.0.1间接
npmis-arguments1.2.0间接
npmis-arrayish0.2.1间接
npmis-binary-path1.0.1间接
npmis-buffer1.1.6间接
npmis-callable1.2.7间接
npmis-core-module2.13.1间接
npmis-data-descriptor1.0.1间接
npmis-descriptor0.1.7间接
npmis-descriptor1.0.3间接
npmis-extendable0.1.1间接
npmis-extendable1.0.1间接
npmis-extglob2.1.1间接
npmis-fullwidth-code-point1.0.0间接
npmis-generator-function1.1.2间接
npmis-glob3.1.0间接
npmis-glob4.0.3间接
npmis-module1.0.0间接
npmis-nan1.3.2间接
npmis-negated-glob1.0.0间接
npmis-number3.0.0间接
npmis-number4.0.0间接
npmis-plain-object2.0.4间接
npmis-plain-object5.0.0间接
npmis-potential-custom-element-name1.0.1间接
npmis-reference3.0.3间接
npmis-regex1.2.1间接
npmis-relative1.0.0间接
npmis-typed-array1.1.15间接
npmis-unc-path1.0.0间接
npmis-utf80.2.1间接
npmis-valid-glob1.0.0间接
npmis-windows1.0.2间接
npmisarray1.0.0间接
npmisarray2.0.5间接
npmisexe2.0.0间接
npmisobject2.1.0间接
npmisobject3.0.1间接
npmisomorphic-timers-promises1.0.1间接
npmjiti1.21.0间接
npmjiti2.7.0间接
npmjs-sha2560.9.0间接
npmjs-tokens4.0.0间接
npmjsdom29.1.1间接
npmjson-parse-even-better-errors2.3.1间接
npmjson-stable-stringify-without-jsonify1.0.1间接
npmjszip3.10.1间接
npmjust-debounce1.1.0间接
npmkind-of1.1.0间接
npmkind-of3.2.2间接
npmkind-of4.0.0间接
npmkind-of5.1.0间接
npmkind-of6.0.3间接
npmkleur4.1.5间接
npmlast-run1.1.1间接
npmlazystream1.0.1间接
npmlcid1.0.0间接
npmlead1.0.0间接
npmlie3.3.0间接
npmliftoff3.1.0间接
npmlightningcss1.32.0间接
npmlightningcss-android-arm641.32.0间接
npmlightningcss-darwin-arm641.32.0间接
npmlightningcss-darwin-x641.32.0间接
npmlightningcss-freebsd-x641.32.0间接
npmlightningcss-linux-arm-gnueabihf1.32.0间接
npmlightningcss-linux-arm64-gnu1.32.0间接
npmlightningcss-linux-arm64-musl1.32.0间接
npmlightningcss-linux-x64-gnu1.32.0间接
npmlightningcss-linux-x64-musl1.32.0间接
npmlightningcss-win32-arm64-msvc1.32.0间接
npmlightningcss-win32-x64-msvc1.32.0间接
npmlines-and-columns1.2.4间接
npmload-json-file1.1.0间接
npmlocate-character3.0.0间接
npmlocate-path6.0.0间接
npmlru-cache11.5.1间接
npmlz-string1.5.0间接
npmmagic-string0.30.21间接
npmmake-iterator1.0.1间接
npmmap-cache0.2.2间接
npmmap-visit1.0.0间接
npmmatchdep2.0.0间接
npmmath-intrinsics1.1.0间接
npmmd5.js1.3.5间接
npmmdn-data2.27.1间接
npmmdsvex0.12.7间接
npmmicromatch3.1.10间接
npmmiller-rabin4.0.1间接
npmmin-indent1.0.1间接
npmmini-svg-data-uri1.4.4间接
npmminimalistic-assert1.0.1间接
npmminimalistic-crypto-utils1.0.1间接
npmminimatch3.1.2间接
npmmixin-deep1.3.2间接
npmmri1.2.0间接
npmmrmime2.0.0间接
npmms2.0.0间接
npmmute-stdout1.0.1间接
npmnan2.25.0间接
npmnanoid3.3.12间接
npmnanomatch1.2.13间接
npmnext-tick1.1.0间接
npmnode-stdlib-browser1.3.1间接
npmnormalize-package-data2.5.0间接
npmnormalize-path2.1.1间接
npmnormalize-path3.0.0间接
npmnow-and-later2.0.1间接
npmnumber-is-nan1.0.1间接
npmobject-copy0.1.0间接
npmobject-inspect1.13.4间接
npmobject-is1.1.6间接
npmobject-keys1.1.1间接
npmobject-visit1.0.1间接
npmobject.assign4.1.5间接
npmobject.defaults1.1.0间接
npmobject.map1.0.1间接
npmobject.pick1.3.0间接
npmobject.reduce1.0.1间接
npmobug2.1.2间接
npmonce1.4.0间接
npmordered-read-streams1.0.1间接
npmos-browserify0.3.0间接
npmos-locale1.4.0间接
npmp-limit3.1.0间接
npmp-locate5.0.0间接
npmpako1.0.11间接
npmparent-module1.0.1间接
npmparse-asn15.1.9间接
npmparse-filepath1.0.2间接
npmparse-json2.2.0间接
npmparse-json5.2.0间接
npmparse-node-version1.0.1间接
npmparse-passwd1.0.0间接
npmparse58.0.1间接
npmpascalcase0.1.1间接
npmpath-browserify1.0.1间接
npmpath-dirname1.0.2间接
npmpath-exists2.1.0间接
npmpath-exists4.0.0间接
npmpath-is-absolute1.0.1间接
npmpath-parse1.0.7间接
npmpath-root0.1.1间接
npmpath-root-regex0.1.2间接
npmpath-type1.1.0间接
npmpath-type4.0.0间接
npmpathe2.0.3间接
npmpbkdf23.1.6间接
npmpicocolors1.1.1间接
npmpicomatch4.0.4间接
npmpify2.3.0间接
npmpinkie2.0.4间接
npmpinkie-promise2.0.1间接
npmpkg-dir5.0.0间接
npmplugin-error0.1.2间接
npmposix-character-classes0.1.1间接
npmpossible-typed-array-names1.1.0间接
npmpostcss8.5.15间接
npmpretty-format27.5.1间接
npmpretty-hrtime1.0.3间接
npmpreval.macro4.0.0间接
npmprism-svelte0.4.7间接
npmprismjs1.30.0间接
npmprocess0.11.10间接
npmprocess-nextick-args2.0.1间接
npmpublic-encrypt4.0.3间接
npmpump2.0.1间接
npmpumpify1.5.1间接
npmpunycode1.4.1间接
npmpunycode2.3.1间接
npmqs6.15.2间接
npmquerystring-es30.2.1间接
npmrandombytes2.1.0间接
npmrandomfill1.0.4间接
npmreact-is17.0.2间接
npmread-pkg1.1.0间接
npmread-pkg-up1.0.1间接
npmreadable-stream2.3.8间接
npmreadable-stream3.6.2间接
npmreaddirp2.2.1间接
npmreaddirp4.1.2间接
npmrechoir0.6.2间接
npmredent3.0.0间接
npmregenerator-runtime0.14.1间接
npmregex-not1.0.2间接
npmremove-bom-buffer3.0.0间接
npmremove-bom-stream1.2.0间接
npmremove-trailing-separator1.1.0间接
npmrepeat-element1.1.4间接
npmrepeat-string1.6.1间接
npmreplace-ext1.0.1间接
npmreplace-homedir1.0.0间接
npmrequire-directory2.1.1间接
npmrequire-from-string2.0.2间接
npmrequire-main-filename1.0.1间接
npmresolve1.22.8间接
npmresolve-dir1.0.1间接
npmresolve-from4.0.0间接
npmresolve-options1.1.0间接
npmresolve-url0.2.1间接
npmret0.1.15间接
npmripemd1602.0.3间接
npmrolldown1.0.3间接
npmsade1.8.1间接
npmsafe-buffer5.1.2间接
npmsafe-buffer5.2.1间接
npmsafe-regex1.1.0间接
npmsafe-regex-test1.1.0间接
npmsaxes6.0.0间接
npmsemver5.7.2间接
npmsemver-greatest-satisfied-range1.1.0间接
npmset-blocking2.0.0间接
npmset-cookie-parser3.1.0间接
npmset-function-length1.2.2间接
npmset-value2.0.1间接
npmsetimmediate1.0.5间接
npmsha.js2.4.12间接
npmside-channel1.1.0间接
npmside-channel-list1.0.1间接
npmside-channel-map1.0.1间接
npmside-channel-weakmap1.0.2间接
npmsiginfo2.0.0间接
npmsirv3.0.2间接
npmsnapdragon0.8.2间接
npmsnapdragon-node2.1.1间接
npmsnapdragon-util3.0.1间接
npmsource-map0.5.7间接
npmsource-map0.6.1间接
npmsource-map-js1.2.1间接
npmsource-map-resolve0.5.3间接
npmsource-map-support0.5.21间接
npmsource-map-url0.4.1间接
npmsparkles1.0.1间接
npmspdx-correct3.2.0间接
npmspdx-exceptions2.4.0间接
npmspdx-expression-parse3.0.1间接
npmspdx-license-ids3.0.17间接
npmsplit-string3.1.0间接
npmstack-trace0.0.10间接
npmstackback0.0.2间接
npmstatic-extend0.1.2间接
npmstd-env4.1.0间接
npmstream-browserify3.0.0间接
npmstream-exhaust1.0.2间接
npmstream-http3.2.0间接
npmstream-shift1.0.3间接
npmstring-width1.0.2间接
npmstring_decoder1.1.1间接
npmstring_decoder1.3.0间接
npmstrip-ansi3.0.1间接
npmstrip-bom2.0.0间接
npmstrip-indent3.0.0间接
npmsupports-color5.5.0间接
npmsupports-preserve-symlinks-flag1.0.0间接
npmsvelte5.56.2间接
npmsvelte-check4.6.0间接
npmsver-compat1.5.0间接
npmsymbol-tree3.2.4间接
npmtailwind-merge3.6.0间接
npmtailwind-variants3.2.2间接
npmtailwindcss4.3.0间接
npmtapable2.3.3间接
npmterser3.17.0间接
npmterser5.27.0间接
npmthrough22.0.5间接
npmthrough2-filter3.0.0间接
npmtime-stamp1.1.0间接
npmtimers-browserify2.0.12间接
npmtinybench2.9.0间接
npmtinyexec1.2.4间接
npmtinyglobby0.2.17间接
npmtinyrainbow3.1.0间接
npmtldts7.4.2间接
npmtldts-core7.4.2间接
npmto-absolute-glob2.0.2间接
npmto-buffer1.2.2间接
npmto-object-path0.3.0间接
npmto-regex3.0.2间接
npmto-regex-range2.1.1间接
npmto-through2.0.0间接
npmtotalist3.0.1间接
npmtough-cookie6.0.1间接
npmtr466.0.0间接
npmtslib2.6.2间接
npmtty-browserify0.0.1间接
npmtype1.2.0间接
npmtype2.7.2间接
npmtyped-array-buffer1.0.3间接
npmtypedarray0.0.6间接
npmtypescript5.9.3间接
npmunc-path-regex0.1.2间接
npmundertaker1.3.0间接
npmundertaker-registry1.0.1间接
npmundici7.27.2间接
npmundici-types7.24.6间接
npmunion-value1.0.1间接
npmunique-stream2.3.1间接
npmunist-util-is4.1.0间接
npmunist-util-stringify-position2.0.3间接
npmunist-util-visit2.0.3间接
npmunist-util-visit-parents3.1.1间接
npmunset-value1.0.0间接
npmupath1.2.0间接
npmurix0.1.0间接
npmurl0.11.4间接
npmuse3.1.1间接
npmutil0.12.5间接
npmutil-deprecate1.0.2间接
npmuzip-module1.0.3间接
npmv8flags3.2.0间接
npmvalidate-npm-package-license3.0.4间接
npmvalue-or-function3.0.0间接
npmvfile-message2.0.4间接
npmvinyl2.2.1间接
npmvinyl-fs3.0.3间接
npmvinyl-sourcemap1.1.0间接
npmvite8.0.16间接
npmvite-plugin-node-polyfills0.28.0间接
npmvitefu1.1.3间接
npmvitest4.1.8间接
npmvm-browserify1.1.2间接
npmw3c-xmlserializer5.0.0间接
npmwebidl-conversions8.0.1间接
npmwhatwg-mimetype5.0.0间接
npmwhatwg-url16.0.1间接
npmwhich1.3.1间接
npmwhich-module1.0.0间接
npmwhich-typed-array1.1.22间接
npmwhy-is-node-running2.3.0间接
npmwrap-ansi2.1.0间接
npmwrappy1.0.2间接
npmxml-name-validator5.0.0间接
npmxmlchars2.2.0间接
npmxtend4.0.2间接
npmy18n3.2.2间接
npmyaml1.10.3间接
npmyaml2.9.0间接
npmyargs7.1.2间接
npmyargs-parser5.0.1间接
npmyocto-queue0.1.0间接
npmzimmerframe1.1.4间接
依赖安全公告 13

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 691 个包,其中也包含从不交付的开发与测试版本固定:13 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
cipher-base1.0.4间接严重11.0.5
brace-expansion1.1.11间接35.0.7
braces2.3.2间接13.0.3
elliptic6.6.1间接1
minimatch3.1.2间接310.2.3
terser3.17.0间接15.14.2
undici7.27.2间接78.5.0
@babel/runtime7.23.9间接18.0.0-alpha.17
bn.js4.12.0间接15.2.3
bn.js5.2.1间接15.2.3
micromatch3.1.10间接14.0.8
cookie0.6.0间接10.7.0
es5-ext0.10.62间接10.10.63

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "anki",
        "ankidroid",
        "mandarin",
        "chinese-language",
        "practice-mandarin",
        "drawing-strokes",
        "hanzi",
        "hanzi-writer",
        "anki-xiehanzi",
        "anki-decks",
        "chinese-characters",
        "mandarin-chinese",
        "hacktoberfest",
        "hsk",
        "hsk3",
        "new-hsk"
      ],
      "is_fork": false,
      "size_kb": 229969,
      "has_wiki": false,
      "homepage": "https://krmanik.github.io/Anki-xiehanzi",
      "languages": {
        "CSS": 39611,
        "HTML": 348007,
        "Svelte": 185763,
        "JavaScript": 834,
        "TypeScript": 334545,
        "Jupyter Notebook": 74450
      },
      "pushed_at": "2026-06-16T04:44:16Z",
      "created_at": "2020-03-12T16:44:59Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T08:28:55Z",
      "description": "Learn, read, write and practice Mandarin by drawing strokes in Anki Desktop, AnkiDroid and AnkiMobile with audio of HSK 2.0 (HSK1-6) and HSK 3.0 (HSK 1-9), BCT and YCT words.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "HTML",
      "significant_languages": [
        "HTML",
        "TypeScript",
        "Svelte"
      ]
    },
    "owner": {
      "blog": "krmanik.github.io",
      "name": "Mani",
      "type": "User",
      "login": "krmanik",
      "company": null,
      "location": null,
      "followers": 127,
      "avatar_url": "https://avatars.githubusercontent.com/u/12841290?v=4",
      "created_at": "2015-06-11T06:49:58Z",
      "is_verified": null,
      "public_repos": 73,
      "account_age_days": 4060
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.3",
          "kind": "other",
          "published_at": "2025-12-20T10:28:51Z"
        },
        {
          "tag": "v2.2.1",
          "kind": "patch",
          "published_at": "2024-02-19T14:55:08Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2023-03-19T05:54:59Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2022-10-08T17:16:37Z"
        },
        {
          "tag": "v2.0.3",
          "kind": "patch",
          "published_at": "2022-10-05T12:36:30Z"
        },
        {
          "tag": "v2.0.2",
          "kind": "patch",
          "published_at": "2022-10-04T14:34:39Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2022-10-02T14:00:33Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2022-09-30T16:04:04Z"
        },
        {
          "tag": "v1.7.9",
          "kind": "patch",
          "published_at": "2022-04-14T15:05:00Z"
        },
        {
          "tag": "v1.7.5",
          "kind": "patch",
          "published_at": "2021-09-29T15:06:36Z"
        },
        {
          "tag": "v1.7.4",
          "kind": "patch",
          "published_at": "2021-09-27T11:40:38Z"
        },
        {
          "tag": "v1.7.3-hsk7-9",
          "kind": "prerelease",
          "published_at": "2021-05-09T05:13:22Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2021-04-14T21:31:13Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2021-04-14T08:44:58Z"
        },
        {
          "tag": "v1.7",
          "kind": "other",
          "published_at": "2020-08-17T18:34:15Z"
        },
        {
          "tag": "v1.6",
          "kind": "other",
          "published_at": "2020-07-12T17:30:51Z"
        },
        {
          "tag": "v1.5",
          "kind": "other",
          "published_at": "2020-07-04T19:07:39Z"
        },
        {
          "tag": "v1.4",
          "kind": "other",
          "published_at": "2020-06-30T22:15:08Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "91a69cfe05625740601b392f8ba2193de2baac75",
          "body": "HTML5 drag-and-drop never fires from a touch, so the card-type field\nreorder only worked with a mouse. Replace it with Pointer Events on the\ngrip handle (mouse + touch + pen), using setPointerCapture and\ntouch-action:none so the drag isn't stolen by page scroll.",
          "is_bot": false,
          "headline": "fix(create): make field reorder work on touch screens",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-16T04:41:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2103ad15f30c0c6e02f4e7f8c72d9153993aec57",
          "body": "…iter\n\nThe dictionary (Definitions) card always embeds the reading's sim/trad/\npinyin/zhuyin; whether each shows is gated at runtime by the sidebar\n`defaultOff` list. That list was only seeded on the back template, so a\ndeselected field (e.g. Zhuyin) still showed inside the dictionary card on\ntwo te\n[…]\nach side's selection so a field\nnot selected on a side starts hidden, including the dictionary card's\nembedded readings. The plain (chrome-less) front has no such var, so the\nreplace is a no-op there.",
          "is_bot": false,
          "headline": "fix(create): hide deselected dictionary-card readings on front and wr…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T12:15:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "29921897830e1d71842a40d3792cde4816e67328",
          "body": "…nt used\n\nThe writing-component template hardcodes {{Simplified}}/{{Traditional}}/\n{{Pinyin}}/{{Zhuyin}} and the {{Definitions}} dictionary card regardless of\nthe front/back selection. buildNoteTemplates prunes any field no card\nselects, so a deck with the writer + Zhuyin shown on neither side dropp\n[…]\nn'\".\n\nKeep the writer-builtin fields in the model whenever any card uses the\nwriter (covers both deselection and removal from the layout). Display logic\nis unchanged; non-writer decks still ship lean.",
          "is_bot": false,
          "headline": "fix(create): keep writer-builtin fields in model when writing compone…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T11:52:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e46a26df9da5322edab2a2b19e513d6a852fa372",
          "body": "Drop the redundant numbered Tones legend (the palette trigger already\nshows the swatches) and align Palette / Apply to / Custom colors rows.",
          "is_bot": false,
          "headline": "feat(create): tidy Colors section into aligned label/control grid",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T07:09:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5c2236487aacc4b4cd0122776e18cd786d0f42f",
          "body": "Themes, tone palettes, and card-type presets each showed every option\ninline. Now each shows only the current selection as a trigger button;\nclicking opens a PickerModal with the full list. Field grid unchanged.",
          "is_bot": false,
          "headline": "feat(create): replace inline theme/tone/preset walls with pickers",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T06:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8b83b165e3060a4f4b208f767242c5fc9c788f1",
          "body": null,
          "is_bot": false,
          "headline": "feat(create): add drag-to-reorder hint in card type editor",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T06:39:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b76931c4236794dddc2ad7aa60571cdfe43ce1bc",
          "body": "text-grid was registered as a draw toggle but applyField had no case for\nit, so toggling Grid did nothing and the dashed guides always showed. Tag\nthe guide-line group with .char-grid and hide it via a body .no-grid\nclass wired through applyField (covers both init and live toggle).",
          "is_bot": false,
          "headline": "fix(writer): make Grid sidebar toggle actually hide the grid",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T06:28:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10f60b66ef5dc82669f077f3597c7479eec091db",
          "body": "Finished hanzi quiz glyphs now render as one centered row instead of a\nleft-aligned block. During writing, completed mini-chars stack in a\ncolumn hugging the grid's left edge rather than the window edge or\noverlapping the grid. Guard generateHanziOnFinishQuiz against a missing\nonfinish target div to avoid a null innerHTML crash.",
          "is_bot": false,
          "headline": "fix(writer): center single/finished glyphs, stack progress left of grid",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-15T06:16:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35f20e5a2acf2f7c5d69a3ce9bdda07a02cf4588",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump HSK-3.0-words-list submodule to c00a585",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T06:19:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f6fe3ae287f7df383171162f278947e9018748d",
          "body": "Git tracked the file lowercase, so the canonical GitHub URL\n(/blob/main/CONTRIBUTING.md) and the README/docs links to it 404'd.\nUppercase also triggers GitHub's contributor-guidelines banner.",
          "is_bot": false,
          "headline": "docs: rename contributing.md to CONTRIBUTING.md",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T06:13:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0d79f691c7a94688ec2239e967585555a3e3bb7",
          "body": "Replace the generic GitHub boilerplate in CONTRIBUTING.md with\nproject-specific guidance: the three-part layout, where word-data\nfixes go (HSK-3.0-words-list submodule), Node 20 setup, real npm/\nvitest commands, deck-generator layering, and the byte-pinned card\ntemplate warning.\n\nAdd a matching /docs/contributing page (wired into the docs nav) and\nfix the README Contribute link, which pointed at the wrong filename\nand branch.",
          "is_bot": false,
          "headline": "docs: rewrite CONTRIBUTING and add contributing docs page",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T06:12:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "087a36c6ba42f9a2b990edb762be7580607f4561",
          "body": null,
          "is_bot": false,
          "headline": "docs: restructure README around download + Create tool",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T04:31:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6892453bf776f5e17fcfa64e36d33c5a69a855ea",
          "body": "The writing-practice card template only emitted a bare \"Examples\" on/off\ntoggle; the dedicated \"Example sentences\" section and per-example colour\ntoggles were missing (they existed only on the standard front/back cards).\nBring the writer template to parity: register the ex-colour ids, build the\ntitled section, and apply the no-ex-*-color body classes.",
          "is_bot": false,
          "headline": "fix(create): show example-sentence config in sidebar on writing cards",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T04:21:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2341023ce06c6bada99a15d83e8bf6df698c79a2",
          "body": null,
          "is_bot": false,
          "headline": "ci: re-trigger deploy after legacy link fix",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T04:02:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13f00fc8dbe720f0d49b3e50a26f60353bfe246f",
          "body": null,
          "is_bot": false,
          "headline": "ci(deploy): build from main, serve legacy at /v1, redirect /dev",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:58:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95662a61e9af2614c45addf81eac4b4373f2a374",
          "body": "Port vite svelte",
          "is_bot": false,
          "headline": "Merge pull request #77 from krmanik/port-vite-svelte",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:51:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f74efdbb1faa698c339deb4f6c1158db1fbc3894",
          "body": "CSV read field display-names off Word props that didn't exist\n(Examples/Breakdown/Radical/HskLevel/Frequency), leaving those\ncolumns blank. Map each field to plain text and fetch example\nsentences (simplified + pinyin + translation) per word.",
          "is_bot": false,
          "headline": "fix(create): populate all fields in CSV export",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:49:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ffe0a0260dcd9106a7345619e903597dcdce60c",
          "body": "Words missing from cedict.db fall back to Google Translate. Without a\ncache, regenerating decks (HSK 1 … 7-9) refetched the same words every\nrun. Add a 3-layer lookup: committed seed JSON → localStorage → network,\nwith in-flight dedup for concurrent requests in a single run. Seed the\nknown fallback words in static/data/gt_glosses.json so they never hit\nthe network.",
          "is_bot": false,
          "headline": "perf(create): cache google translate fallback lookups",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:42:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87e642d6886e9c0481380397ebd415904a19b4ac",
          "body": "The hanzi-writer quiz grid was injected only after the async stroke-data\nfetch resolved, so the empty target div stayed 0px until then — the grid\npopped in white->gray late and shoved the layout.\n\n- prefillGrid() paints the gray grid synchronously at the writer's exact\n  size before the fetch, so th\n[…]\n~12px taller than the writer's final SVG.\n- reveal ch_load_status during prefill so its margin-top:-36px (net -12px)\n  no longer pulls the layout up when doPractice runs.\n- fade the grid in on appear.",
          "is_bot": false,
          "headline": "fix(writer): prefill grid sync to kill load flicker",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:29:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d177906579ee3bb797b3fec11ff950179f3296f8",
          "body": "Generating large decks (5k+ words) was slow/froze the UI. Three fixes:\n\n- cedict lookups filter WHERE simplified but only cedict.word is indexed,\n  so every word full-scanned 120k rows. Build idx_cedict_simplified once at\n  load (in-memory). HSK 5.6k-word add: ~69s -> ~5s.\n- getSentences used senten\n[…]\nr tokens.\n- Cache compiled SQL statements (reset/reuse vs prepare+free), cache\n  per-character breakdown info, throttle batch progress writes, and replace\n  the paragraph dedup O(n^2) scan with a Set.",
          "is_bot": false,
          "headline": "perf(create): index dict + sentence lookups for large decks",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T03:09:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e75cf8ada84004a926df329df8aed59989a0cc46",
          "body": "Wrap per-word lookups in the File / HSK / BCT / YCT add loops in\ntry/catch so one failed lookup is skipped rather than aborting the whole\nbatch, matching the paragraph flow.",
          "is_bot": false,
          "headline": "fix(create): skip failed lookups instead of aborting batch",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T02:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0413db2c70fca0c1992862774a29fdd9639e7174",
          "body": "Tokens with no tone digit / vowel (already-toned pinyin, punctuation,\njunk) make parse() return null; dereferencing it crashed conversion.\nEmit the raw syllable instead. Adds test coverage.",
          "is_bot": false,
          "headline": "fix(pinyinzhuyin): guard null parse() to avoid crash on untoned tokens",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T02:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43d7da6aee547c3030c78d6fd8545169531bda2b",
          "body": "Seed each note's guid on word identity (Simplified+Traditional+model)\nvia FNV-1a instead of genanki's default field-hash, so styling/preset\ntweaks no longer shift guids — re-importing an updated deck updates\nexisting notes rather than duplicating them.\n\nAdd noteTags(): emit Xiehanzi + HSK::n / POS::x / Frequency::band\n(underscore-joined, space-free) so users can filter and build custom\nstudy in Anki. Wire both into generateDeck's addNote. Covered by tests.",
          "is_bot": false,
          "headline": "feat(deck): stable note GUIDs + hierarchical HSK/POS/frequency tags",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-14T02:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f45a2b1240a762c141b65eb77330a6dbfbbf20e",
          "body": "+page.svelte was split from ~1600 lines into focused components; note\nthe orchestrator size and where the UI now lives.",
          "is_bot": false,
          "headline": "docs: refresh create page description after component split",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T14:07:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1432ae329710a68ad0ee5ff4535a98da782c1f22",
          "body": "ExportSuccess mounts @hiseb/confetti, which calls element.animate and\nneeds a canvas 2d context jsdom provides neither of, throwing two\nuncaught errors during the create-page tests. Stub element.animate and\nmock the confetti module so the burst is a no-op under test.",
          "is_bot": false,
          "headline": "test: silence confetti jsdom errors in test setup",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T14:07:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "045e47520dbaebeff38319fbbf64cda05d7736b6",
          "body": "Break src/routes/create/+page.svelte (~1585 lines) into composable\nparts; the page is now ~390 lines of orchestration only (state, derived\npreviews, persistence effects, export logic, layout).\n\nNew components: AppearancePanel, CardTypeEditor, PresetConfirmModal,\nLivePreview, WordSourceInput, BreakWo\n[…]\nia $bindable props (words, template, tabs/tabContent/order/\nincludeAudio, page); cross-cutting actions via callbacks. Card model IDs,\ntemplates and .apkg output untouched. check clean, 154 tests pass.",
          "is_bot": false,
          "headline": "refactor(create): split 1.6k-line page into focused components",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T13:45:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "58dd80b836dac7806a089329d394f03acb5fb27e",
          "body": null,
          "is_bot": false,
          "headline": "docs: add CLAUDE.md for Claude Code guidance",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T13:25:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de01780394c834df117ae5ab6feab55e8db9844d",
          "body": "…sets",
          "is_bot": false,
          "headline": "feat(create): default separator + control buttons to back side of pre…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T07:43:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "86e24a6fef73d9e8a084effd16d5b03c32ce3584",
          "body": "Show a modal after each deck export: confetti, a GitHub\nstar prompt, and social share buttons (X, Facebook, WhatsApp, Telegram,\nReddit, LinkedIn) that open native share intents.\n\nAdd 'Do not show again' — persists to localStorage; when set, the popup\nis suppressed and a Share entry appears in the nav menu (opening the\nsame share dialog). Share data/logic extracted to share.svelte.ts and a\nreusable ShareButtons component.",
          "is_bot": false,
          "headline": "feat(create): export-success popup with confetti, star & share",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T07:30:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f433c689f9656575b12c4f5bdf3e28dfbb10102f",
          "body": null,
          "is_bot": false,
          "headline": "docs: note AI-generated code (Claude Opus 4.8) in README",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T06:30:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "474fdf05d7fe976eb214c94b3dc9b0242ccc3290",
          "body": "Add 'Export a Deck' and 'Studying cards' doc pages, wire both into the\ndocs sidebar nav. Expand Introduction, Features and FAQ with word\nsources (HSK/BCT/YCT), tone palettes, card themes and example sentences.\nAdd table styling to MarkdownLayout.",
          "is_bot": false,
          "headline": "docs: add export & studying guides, expand intro/features/faq",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-13T06:29:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54c36b88c88cea57d039477856a5c6ef3d16d92a",
          "body": null,
          "is_bot": false,
          "headline": "feat(create): default deck name to 'Anki xiehanzi {date} {unix}'",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T11:19:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d9e4a4ee6d6c47677ec617acdcde345edb6189f",
          "body": "Add YCT levels 1–4 as a word source on the create page. YCT entries\ncarry their own meanings; words missing from CEDICT use the bundled\nmeaning directly instead of calling Google Translate.\n\n- wordsByYct() returns {word, meaning}[] for offline fallback\n- lookupWordWithFallback() tries CEDICT, falls back to supplied meaning\n- loadYctMeanings() feeds yct_words.json into simpleMeaningOf()\n- loadDict() loads YCT meanings eagerly alongside HSK",
          "is_bot": false,
          "headline": "feat(yct): add YCT level word source to create page",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T11:09:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1f76357b0c364f70fed5403b13bef0b892d4ae9",
          "body": "- BCT_words.json: 600 (A) + 4000 (B) words converted from txt lists\n- BCT_missing_glosses.json: Google Translate glosses for 69 words absent from cedict\n- cedict.ts: wordsByBct() loads BCT_words.json; lookup() falls back to BCT glosses on cedict miss\n- create page: BCT Level option in source selector with A/B toggle + progress bar",
          "is_bot": false,
          "headline": "feat(bct): add BCT A/B word source to create page",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T09:03:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ae2ebf5b23e4f2344e360ba56eb97ade95d34a2",
          "body": "Erhua entries (e.g. 面条儿) only carried the gloss \"erhua variant of\n麵條|面条[mian4 tiao2]\" with no actual meaning. resolveErhua() now parses\nthe trad|simp[pinyin] reference, looks the base word up in the already-loaded\ncedict.db and appends its real definition. Pinyin-keyed pick for multi-reading\nbases, recursion guard, no DB writes. Covers all 267 erhua refs.",
          "is_bot": false,
          "headline": "feat(dict): resolve erhua variant glosses to base definition at runtime",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T04:10:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c55522148a42a6593cd6fcf8a96190f49e05239d",
          "body": "Unify --pos-chip-pad to 5px 11px across all 20 themes so POS chips match\nthe meta-badge box (same font-size, line-height) and stop misaligning on\nthe POS row. Give every theme real POS chip bg + theme-context border,\na distinct dominant-sense fill, accent-tinted HSK chips, and warm freq\nchips so the three chip kinds are visually separable. Add --chip-border\nso dominant chips can carry a border (brutalist/editorial).",
          "is_bot": false,
          "headline": "fix(themes): align meta-cluster chips, distinct POS/HSK/freq fills",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T04:00:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd71c895af6af1fa1bbe3ef167758c8e2ae0d534",
          "body": "Sidebar buttons placed dark --chip-fg text on an --accent background;\nin dark themes --chip-fg is near-black, so the active Front/Back toggle,\nclose button and 简/繁 select rendered dark-on-accent (unreadable).\n\n- Add --on-accent (text that contrasts --accent) to all 20 theme\n  variants, plus a fallba\n[…]\n give the\n  inactive .front-back toggle an explicit color + visible border.\n- Preview POS chip now uses the real --pos-chip-* tokens (incl.\n  --pos-chip-border) instead of mimicking the dominant chip.",
          "is_bot": false,
          "headline": "fix(themes): readable accent-fg via --on-accent token",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T03:46:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "014f24745a9acf29427cfefcec60bd4a97d27fa9",
          "body": "…colors\n\nRebuild all 20 theme variants with exact colors from reference HTML. Add\n~35 new CSS vars (--panel-border, --panel-bg, --panel-title-bg,\n--section-title-*, --tile-*, --radical-chip-*, --pos-chip-*, --hsk-*,\n--freq-*, --def-num-*, --example-item-*, --body-bg-image) consumed by\ndeckTemplate.t\n[…]\nhardcoded values.\n\nHanziWriter stroke color reads live --tone-1..5 CSS vars at runtime so\nstrokes follow the active tone palette; outline/drawing colors follow\n--stroke/--outline/--drawing theme vars.",
          "is_bot": false,
          "headline": "fix(themes): full theme fidelity — panels, sidebar, hanziwriter tone …",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-12T03:00:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3383d51a25bfe4c025aa46002fdc095b7e31522e",
          "body": "…tine card\n\nShow a dialog asking whether to replace the active card type or add a new\none when clicking a quick-start preset after the default card has been\nmodified. Pristine-default case still silently replaces as before.\n\nFix pre-existing test failures: update ICON selector from removed static\nbg class to inline-style attribute, fix Example Sentences preset count\nand text-case mismatch in test assertions.",
          "is_bot": false,
          "headline": "feat(presets): prompt replace-or-add when clicking preset on non-pris…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T10:14:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99c3137a91ecb0f373a7241ffd61be5ec0701a11",
          "body": "…ircle-button themes",
          "is_bot": false,
          "headline": "fix(themes): remove accent btn-next-bg from 4 themes, add border to c…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T08:37:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce969c222b9c9ba20adf6972d8a839a88cc0f0bd",
          "body": "- Group audio, theme, colors, typography into labeled cards\n- Move Mode (auto/light/dark) to Card Theme header row\n- Add colorPinyin prop to CardPreview; pinyinHtml() applies tone colors\n- Add Preview button on settings page (loads 写/汉字/的/比如/好)\n- Hide Back/Generate footer in ExportPreview when no onGenerate passed\n- Fix select min-width (palette 9rem, font 10rem) to stop arrow overlap\n- Add pt-9 to sticky right preview column",
          "is_bot": false,
          "headline": "feat(settings): regroup appearance UI and add pinyin color preview",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T07:31:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0707f6175724e7bd6b39ada9c305b0df13be87f",
          "body": "…ector\n\nIntroduce CARD_THEME_GROUPS with 10 light/dark pairs (minimal, ink-paper,\noled-dark, soft-pastel, editorial, modern-app, bold-brutalist,\nvintage-dictionary, frosted-aurora, zen-muji). Each theme adapts button\nshapes, container radii, chip styling, and colors to match design spec.\n\nresolveTheme() picks the correct variant based on auto/light/dark mode;\nbuildGlobalCss() emits .card.night_mode{} overrides for Anki auto-mode.\nMode selector lives above the live previewer in CardCustomizer.",
          "is_bot": false,
          "headline": "feat(themes): add 10 paired card themes with auto/light/dark mode sel…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T07:08:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29ee93fc55534e0af95a54fe1c471b56effa3d37",
          "body": null,
          "is_bot": false,
          "headline": "feat(presets): add Example Sentences card type",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T01:18:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee12904e72be37d16a7b870a3b68a53eab5a8d2a",
          "body": "- Convert all input (paragraph, word, file) to Simplified via Chinese.t2s\n  before CEDICT lookup and jieba segmentation, so Traditional-form words\n  (e.g. 英語→英语) are found in the dictionary\n- Track per-word progress in generateFromParagraph (N/total status + bar)\n- Catch per-word Google Translate CO\n[…]\nfailed word — tries longest substring first,\n  silently skips single characters\n- Modal shows matched sub-words with checkboxes (all pre-selected); user\n  can multi-select / deselect-all before adding",
          "is_bot": false,
          "headline": "feat(input): paragraph progress, CORS-fail toast, and t2s normalization",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T01:08:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d4cd68bdd49e13d340362b6a328b13bf5bfa0a3e",
          "body": "Meta layout:\n- POS, HSK level and frequency now share a single wrapping row via a\n  synthesized `meta-row` cluster (withMetaCluster), threaded through the\n  existing group machinery so the export, the export preview and the\n  designer live preview all match. Distinct pill styles per chip; chips are\n\n[…]\nve in the field value so the wrapper self-hides when empty.\n- Add a divider between successive readings in the definitions block.\n\nTests cover the cluster, the titled cards and the definition divider.",
          "is_bot": false,
          "headline": "feat(card): one-row meta chips + titled info cards",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T00:42:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "283184967260f78aec5bf506f887b9935a0bd8f3",
          "body": "The writer card never colored its big simplified/traditional hanzi because\nthe stroke engine read char_sim/char_trad via innerHTML — injecting tone\nspans would have broken the character parser. Read the character list with\ntextContent instead, then call colorChars() in initWriterCard so the\ndisplayed hanzi is tinted like every other card. Also add the missing\n.char-tone5 rule so neutral-tone syllables aren't left black.",
          "is_bot": false,
          "headline": "fix(writer): tone-color the big hanzi on writer cards",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-11T00:42:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b47dd959f3b7cce1a942ee397f9667e12938fd7b",
          "body": "When Writing Component was ticked, the export switched to the legacy writer\ntemplate which hardcodes only Simplified/Traditional/Pinyin/Zhuyin/Definitions.\nAll other selected fields (PoS, Simple Meaning, Breakdown, Radical, HSK,\nFrequency, Examples) were silently dropped from both the exported deck \n[…]\nwriter template in field order, split around the dictionary card so vertical\nposition relative to Definitions is preserved.\n\nAdd deckTemplate.test.ts with 5 cases covering the regression and ordering.",
          "is_bot": false,
          "headline": "fix(export): inject all selected fields into writer card templates",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-10T23:54:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "82778186d48b5ff588957572218c8f6fa8ebbeb6",
          "body": "Preview opens the export preview modal; Generate runs deck export directly\nwithout opening the modal. Modal retains its own Generate deck button.",
          "is_bot": false,
          "headline": "feat(create): split Preview & Generate into separate buttons",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-10T23:54:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6765d975fa8a7a45e80209fec5fafe9c75e95e2",
          "body": "srcdoc iframes resolve relative URLs against the parent page (about:srcdoc),\ncausing _hanzi-writer.min.js and _hanzi-writer-data.json to 404. Rewrite\nboth to absolute app-served paths instead of stripping the script tag.",
          "is_bot": false,
          "headline": "fix(preview): rewrite writer/data paths for srcdoc iframe",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-10T23:53:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "569e9f0edafec03a8e61734e56ad5c0a2a9144d3",
          "body": null,
          "is_bot": false,
          "headline": "update example sentences",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "816d85d25c5bb4451abd6833ae56a904a0df7e47",
          "body": "The toolbar play button is now added/removed by the Audio field's front/back\ncheckbox per card type (master 'Include Audio' still gates TTS media). barFor()\nkeeps the play button + hidden [sound:] data div only on the side(s) that select\nAudio; otherwise the bar shows menu/more only. No standalone audio button. New\ncards default Audio on the back. Control bar + separator remain per-side\nselectable, reorderable, and functional on both sides.",
          "is_bot": false,
          "headline": "feat(create): per-card, per-side audio play button in the toolbar",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73c2e04b4392de5a94a65b721e2c7e1f9fc9f6f7",
          "body": "Flex order was always computed from the fixed DEFAULT_BODY_ORDER, so moving a\nfield up/down only changed DOM order (overridden by CSS order) with no visible\neffect. elementOrder/groupOrder/buildCardCss now take the user's field sequence\n(bodyOrder, derived from the ordered fields list) so reordering reflects in both\nthe live preview and the exported card.",
          "is_bot": false,
          "headline": "fix(create): field reorder now drives card order",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b4fd66fa7d1e7fbcbaf2d9f30a6c1345732406a",
          "body": "CardPreview renders members inside their group container (snippet-based) with\nthe group's flex/block + row/column layout and box style; group containers are\nselectable. CardCustomizer gains a Groups section: pick 2+ on-card fields and\ngroup them, select a group to edit its layout/background/border/radius/\npadding/margin, or ungroup. Groups flow through the live previews and persist\nin the card's tabContent (reset clears them).",
          "is_bot": false,
          "headline": "feat(create): group/ungroup designer UI + grouped preview",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3d2ea773cf049e87d36c58bbeec0c210349eab9",
          "body": "Add CardGroup (members + display flex/block + row/column direction + box\nstyle) to a card's tabContent. buildNoteTemplates wraps grouped members into a\nsingle .gN container on both sides via wrapGroups; buildCardCss emits the\ncontainer's flex layout, box style and flex order. Re-add borderStyle/boxShadow\nto ElementStyle so group containers can have a visible border/shadow.",
          "is_bot": false,
          "headline": "feat(create): element group data model + export rendering",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71f57dbecca3dbb2b512caa319af87395a398a58",
          "body": "Exact preview: extract per-note field HTML into shared buildNoteFields (single\nsource of truth, no drift) and add renderCardHtml, which substitutes real field\nvalues into the actual compiled template + DECK_CSS. ExportPreview renders each\nside in a sandboxed iframe (allow-scripts allow-same-origin);\n[…]\nexample sentences are no longer\nfetched/embedded (nor is their sidebar section shown), instead of shipping\nhidden. buildNoteTemplates filters via fieldUsedByAnyCard; Audio stays gated by\nincludeAudio.",
          "is_bot": false,
          "headline": "feat(create): pixel-exact export preview + drop unused fields",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "386d1ccd5f9ef4354a975e77d7fec418318990ae",
          "body": "Add a commonPinyinOnly template option that shows only a multi-reading\ncharacter's most common reading (longest definition) in the standalone\nPinyin/Zhuyin fields — the Definitions block is never touched and keeps every\nreading. commonReadingIndex/displayReadings in deck.ts drive the export field\nbuilder and the live preview; surfaced as a global toggle.",
          "is_bot": false,
          "headline": "feat(create): show-most-common-pinyin option",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6df200099430934098940d5c55518c99a0aaaa40",
          "body": "SUBTLEX has duplicate rows per homograph; the original cedict.db build picked\na wrong low-frequency row for ~327 common single-char words, tagging them\nNoun (.n.) — 了 showed Noun instead of Particle, 个 instead of Classifier,\n来 instead of Verb. Repopulated all_PoS/dominant_PoS from each word's\nhighest-frequency SUBTLEX row (327 words corrected toward the authoritative\nsource). Reproducible via HSK-3.0-words-list/Scripts and data/fix_cedict_pos.py.",
          "is_bot": false,
          "headline": "fix(data): correct part-of-speech from highest-frequency SUBTLEX row",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34c6c348a919978af9dfe5003ab3ce0a91756466",
          "body": "Render the Examples field as a collapsible card reusing the Definitions\nchrome (meaning-bar + toggleMeaning), generalising toggleMeaning/initMeaning\nto drive both cards with separate persistence keys.\n\nDecouple example-sentence colour from the main card: example hanzi/pinyin now\nuse dedicated ex-ton\n[…]\nences' sidebar section that groups the Examples show/hide toggle\nwith independent Color hanzi / Color pinyin toggles (no-ex-hanzi-color /\nno-ex-pinyin-color), defaults seeded from the example options.",
          "is_bot": false,
          "headline": "feat(create): collapsible examples + separate example colour controls",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9f828ea62cac3b180d3ae55697691131b2931ac",
          "body": "Make each example-sentence line its own customizable element in the\nAdvanced Card Designer — exampleSimplified / exampleTraditional /\nexamplePinyin / exampleTranslation — each with independent color, size,\nalignment, spacing and show/hide, scoped via the .example-* classes.\nPreview rows are individually selectable/styleable. Customiser test.",
          "is_bot": false,
          "headline": "feat(create): per-sub-part styling for example sentences",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72f78e082c8acfad8b82248b0660dea074141410",
          "body": "…n, traditional, length, color)\n\nUse the new sentence-db columns (pinyin, translation, n_chars):\n- getSentences gains a length filter (n_chars); getSmartSentences returns\n  {simplified, traditional, pinyin, translation}, traditional via chinese-s2t,\n  ranked by difficulty+length.\n- Deck-wide Example\n[…]\nen the field is used. Card previewer fetches and renders the real ranked\n  sentences for the previewed word, honoring the options.\nPure tone + rank helpers, unit tests, export round-trip + page tests.",
          "is_bot": false,
          "headline": "feat(create): full example-sentence customisation (pinyin, translatio…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa1f816a20f0316204b48c723addca0b1d7b334b",
          "body": "Add an Examples field sourced from hsk_sentences.db, ranked by a composite\nscore (difficulty + length) so easy, concise sentences surface first.\nSentences are fetched lazily at export and only when the field is used (the\nsentences db is a separate ~5MB download); generateDeck takes an injectable\nget\n[…]\nes for testability. Wired end-to-end: FIELD_DIV/TOGGLE, scoped\nelement + body order, sidebar toggles, CSS, preview + customiser element.\nPure rankSentences module + unit tests, export round-trip test.",
          "is_bot": false,
          "headline": "feat(create): smart example sentences field",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5d9dc17ea6381e6b1343835684708603f6d3f501",
          "body": "Generate now opens an Export Preview modal: per-card-type front/back\npreviews rendering the ACTUAL deck words (prev/next pager) with the chosen\nstyling + palette, alongside deck stats (counts, audio flag, HSK-level and\nfrequency-band breakdowns). CardPreview gains an optional `word` prop and\nfalls back to the 中国 example when none is given. Generation runs from\ninside the modal. Pure deckStats module + tests, component + page tests.",
          "is_bot": false,
          "headline": "feat(create): export preview with deck stats + real-word paging",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "061d9b890ddae61a4d4ab7341021b991cf2dba49",
          "body": "Move tone colors / palette / font / collapse-definitions under a\n'Customize appearance' accordion (open by default, collapsible) so the\nstyling controls are grouped and dismissable. Add a helper line\nclarifying the front/back field ticks. Page test covers the accordion.",
          "is_bot": false,
          "headline": "feat(create): group styling under a 'Customize appearance' accordion",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c714d8f6a46a06b89c19e94e7ae724bb4577282b",
          "body": "Add a reusable UnitInput (number box + unit dropdown, px default, em/rem/%)\nand use it across the Card Designer for spacing above/below, padding, hr\nmargin and custom font sizes — replacing free-text CSS-length fields.\nComponent unit tests.",
          "is_bot": false,
          "headline": "feat(create): unit-selector inputs for spacing, padding + font size",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d7e3fca2c0dde62504aeb5fe88894d7f64bc07a",
          "body": "…edit\n\nRework the customiser as the Advanced Card Designer:\n- Edit template + tabContent live (snapshot-based Cancel) so the page stays\n  in sync; add a card-type tab switcher when more than one type exists.\n- Surface the tone palette + custom colors inside the designer.\n- Remove the card-level text-alignment control; add a card-wide text color.\nUpdate + extend component tests (switcher, alignment removal).",
          "is_bot": false,
          "headline": "feat(create): Advanced Card Designer — card-type tabs, palette, live …",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03d845ffc8710e2abc37bdded94f9a7219297f5f",
          "body": "Add a tone-palette selector: Standard (current), Pleco (red/green/blue/\npurple/gray), MDBG Type 1/2/3 (published hex), and Custom with a per-tone\ncolor picker. The deck-wide template — including a custom palette — now\npersists to localStorage and is restored on refresh. Export honors the\npalette via buildGlobalCss (--tone-N vars + .toneN classes, below the\ncolour-toggle specificity); card + word-list previews reflect it inline.\nPure tonePresets module + unit tests.",
          "is_bot": false,
          "headline": "feat(create): tone-color palette presets + custom colors",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd04f90c6a102d47e24447bcb78bd52011b368e2",
          "body": "New 'HSK Level' word source on step 2: pick one or more levels (1–6, 7+)\nand populate the list with every word at those levels, most-common first\n(rank-ordered). Backed by cedict.wordsByLevel with boundary-safe matching\nover comma-joined level tokens. Progress bar + page interaction test.",
          "is_bot": false,
          "headline": "feat(create): add words by HSK level",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3baa7edf0da3b1965123649207aec4f181f13212",
          "body": "Add Beginner / Intermediate / Reading / Writing / HSK Exam presets as a\nquick-start row above the card-type tabs. Clicking a preset drops in a\nready-made front/back (replacing the pristine default card the first\ntime, appending thereafter) and auto-enables audio when the preset uses\nthe Audio field. Pure cardPresets module + unit tests + page interaction\ntests.",
          "is_bot": false,
          "headline": "feat(create): one-click card-type presets",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aaa86ca60adf4bcefb91d1cfc8077f754810b9ce",
          "body": "WordCard already surfaced an HSK badge; add a frequency-band badge\n(frequencyBand(rank)) beside it so learners can prioritise common words.\nAdd a component test covering both badges.",
          "is_bot": false,
          "headline": "feat(create): show frequency band badge in the word list",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ecbb455188cb24e94c4bede19d1fa45d29324ba",
          "body": "…elds\n\nAdd four new selectable card fields sourced from cedict.db:\n- Character Breakdown (中→middle, 国→country)\n- Radical chips (国→囗)\n- HSK Level badge\n- Frequency band badge (Top 500)\n\nWired end-to-end: Word.breakdown via characterBreakdown(), note-value\ngeneration, FIELD_DIV/TOGGLE, scoped element styles + body order, sidebar\ntoggles on both back and writer templates, deck CSS, live preview and\ncustomiser element list. Default card type unchanged (new fields off).",
          "is_bot": false,
          "headline": "feat(create): exportable HSK level, frequency, breakdown + radical fi…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "939a5d0970e16cf0b7b4f03650f9dfa2c6576db8",
          "body": "Add pure meta helpers (frequencyBand, hskLevels, hskLevelLabel) plus\nDB-backed lookupCharacters/characterBreakdown over the cedict.db\ncharacter table (definition, pinyin, decomposition, radical). Foundation\nfor exportable HSK/frequency/breakdown/radical card fields.",
          "is_bot": false,
          "headline": "feat(dict): character breakdown, radical + frequency/HSK helpers",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e37f7955fdd24d570276a7f67391180383e7c38",
          "body": "- cardTemplates.test.ts: field-marker checks of the 5 reference designs.\n- deckTemplate: alignment->align-self, visible hr, measure-word pills, spaced\n  pos chips.\n- CardPreview: alignment->align-self.\n- CardCustomizer: inline field toggles, collapsible Fields block, in-card\n  alignment control.\n- create page: Export CSV pos column; Generate disabled until a word exists\n  and creates a fresh db per export.",
          "is_bot": false,
          "headline": "test: cover UI/export fixes + 5 reference card designs (71 tests)",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0907e91b0e5ced9562d035e5d76f84b40d98aa9a",
          "body": "- hr visible in export (var(--surface4), not white-on-white); preview hr darker.\n- Measure-word pills, no divider; spaced part-of-speech chips (gap 8px).\n- Export CSV fills PartOfSpeech from word.pos (was blank).\n- Alignment positions an element within the card window via flex align-self\n  (left/cen\n[…]\nral system.\n- Advanced customisation moved into the Create Card Types header.\n- Customiser: single scrollable sidebar, responsive mobile layout, inline\n  collapsible Fields block (front/back toggles).",
          "is_bot": false,
          "headline": "fix(create): export/UI polish, double-generate crash, customiser UX",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "28abcf8ef2bbf350e93f0e96da5e1aa8b634bf22",
          "body": "…-> zip)\n\nRuns the real generateDeck against a node sql.js DB, captures the zip\ngenanki hands to file-saver, unzips it, and reads the embedded\ncollection.anki2 to assert the exported note type carries the per-card\n.ctN-scoped CSS (colour override + flex order), the card-body wrapper in\nboth templates, and the requested field list. Browser-only deps\n(edge-tts, jieba-wasm, file-saver) are stubbed for node.",
          "is_bot": false,
          "headline": "test: end-to-end .apkg round-trip (generateDeck -> genanki -> SQLite …",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09546bc25cf596cd379360578d1adcc3b096aac1",
          "body": "…e page)\n\n- vitest.config.ts with two projects: 'node' (pure logic) and 'dom'\n  (jsdom + compiled Svelte via vite-plugin-svelte).\n- npm test / test:watch scripts; add @testing-library/svelte, jsdom,\n  user-event, jest-dom as dev deps.\n- 50 tests: deckTemplate export generation (field assembly, audio\n[…]\ns, fields, customiser open/close, nav,\n  generate).\n- src/test/setup.ts polyfills matchMedia (flowbite) and cleans up DOM.\n- create-page test lives under src/test/ since +page.* is SvelteKit-reserved.",
          "is_bot": false,
          "headline": "test: add vitest node + jsdom suites (export logic, components, creat…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df2589cb1b7889ed09242a65fd42e72ad090df3a",
          "body": "…l repositioning, colorized-hanzi export fix\n\n- Extract pure template/CSS generation into src/lib/deckTemplate.ts (no\n  genanki/sql/edge-tts/$app deps) so the exporter logic is unit-testable;\n  deck.ts now calls buildNoteTemplates.\n- Per-card-type element styles: each card type styles its elements\n \n[…]\nAdvanced customiser edits the active tab's styles and syncs back to the\n  page previews on save; legacy global styles migrate onto the first card.\n- a11y: keyboardable card-type tabs / add-tab button.",
          "is_bot": false,
          "headline": "feat(create): per-card-type customisation, merged controls, hr/contro…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "86cc4613629fcba1f2f14bff261077634c973327",
          "body": "Replace flat global style overrides with a fully per-element\ncustomisation system. Every visible region of an Anki card can be\nindividually selected and styled; changes mirror exactly in the export.\n\nNew types in deck.ts:\n  ElementStyle — 14 CSS properties (fontSize, fontFamily, fontWeight,\n    colo\n[…]\ntyles: {}\n  localStorage restored on mount (merges with DEFAULT_TEMPLATE)\n  Advanced customisation button beside Card Template heading\n  CardPreview receives elementStyles instead of former flat props",
          "is_bot": false,
          "headline": "feat: per-element WYSIWYG card customiser with localStorage persistence",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5b0fb5367c4f17c016b12da156b4e07c876bc4c4",
          "body": "… CJK filter\n\n- formatDefinition(): CL:Trad|Simp[pin] -> measure word chips; semicolon\n  senses numbered 1./2./3. when multiple; CSS for chips and numbered defs\n- playAudio(): null guard on getElementById('audio') null when no audio\n- HanziWriter loops: skip non-CJK chars so entries with no stroke data skip\n- meaning-container: fix stray closing </span> in char block template",
          "is_bot": false,
          "headline": "Definitions: CL chips, numbered senses, audio null guard, HanziWriter…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca9f59b117af3561713a0a39c104da62bc7be14f",
          "body": "- Ship persistence, hanzi-writer engine and full stroke data as .apkg\n  media (_anki-persistence.js, _hanzi-writer.min.js, _hanzi-writer-data.json)\n  so cards work without any network or CDN after initial install\n- Back template rebuilt entirely from field order via <!--FIELDS--> slot;\n  deselected \n[…]\n static CSS, so the sidebar can toggle them live\n- buildHanziDataSubset simplified: return full JSON text, skip subset build\n- fetchFile refactored to fetchFrom(dir) to serve both /img and /data media",
          "is_bot": false,
          "headline": "Deck export: offline-first refactor + field-order back rebuild",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f94ac5cb606816cf5bd815e0fa75ebbeeb4966fa",
          "body": "… nav buttons, wider font picker",
          "is_bot": false,
          "headline": "Redesign: Docs section (sidebar, mobile collapsible, prev/next), step…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a65ab7bbcfb38a8797314fc3c349cf6f06fd7195",
          "body": null,
          "is_bot": false,
          "headline": "Redesign: add labels to FAQ/Features via MarkdownLayout",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfabecc462f908a490a4a6ccc95cb2f44975a27d",
          "body": "- Sticky responsive header with mono nav + active state and a mobile hamburger\n  menu; refined multi-column footer.\n- Homepage rebuilt: hero with animated 写汉字 logo, bordered\n  feature grid, dark create banner, hover get-started cards.\n- Create page header restyled to match.",
          "is_bot": false,
          "headline": "Redesign: modern-minimal-mono layout, homepage, mobile nav",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d39303c2aa8eb3f64598216923ea91c8cf6e8ef9",
          "body": "- Add Part of Speech field: renders PoS as chips (dominant PoS emphasized),\n  selectable front/back, with order, preview and apkg support; pull dominant_PoS\n  from cedict.db.\n- When a note's Simplified and Traditional are identical, hide the redundant\n  traditional display via a runtime script in the Anki template (front + back).",
          "is_bot": false,
          "headline": "Create page: Part of Speech chip field + simplified/traditional dedupe",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "687bece3b4282f5c5937c0a0d53c12ae8cb63aa8",
          "body": "- Preview and deck render fields in the user's drag order instead of a fixed\n  order. CardPreview iterates an ordered items list (fields + writing); the\n  front QFMT is built in field order and the back's top fields are reordered to\n  match.\n- Writer card: inject Simple Meaning below the controls and above the (now\n  collapsible) dictionary; preview shows the writer control buttons.",
          "is_bot": false,
          "headline": "Create page: field order now drives card layout (front, back, writer)",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa399bad87b66c0657e7d34cfdc7c25229343fa0",
          "body": "…t writing sides, visible buttons\n\n- Add Simple Meaning field (clean HSK gloss from hsk_words.json) shown above\n  the renamed Dictionary Definitions (cedict); deduped when identical.\n- Card Template: collapse dictionary definitions inside a <details>; preview\n  reflects it.\n- Writing Component has i\n[…]\nles; generateDeck\n  places the writer per side and the preview shows the writer alongside the\n  selected fields.\n- Fix invisible flowbite primary buttons by defining the Tailwind v4 primary\n  palette.",
          "is_bot": false,
          "headline": "Create page: Simple Meaning field, collapsible dictionary, independen…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5a1fb1a81e83dd1946868fd425d9372c2d04d4a0",
          "body": "…dering, live writer preview\n\n- Replace the input-type dropdown (which had an empty placeholder option that\n  could hide the action button) with a Word/Paragraph/File segmented control;\n  add Enter-to-add, disabled-state Generate, full-width textarea.\n- Per-word audio play button on each WordCard (HSK CDN then Edge TTS).\n- Writing Component is now a draggable row in the field list; preview renders\n  a live hanzi-writer animation on front and back when it is enabled.",
          "is_bot": false,
          "headline": "Create page: input mode buttons, per-word audio, writing-component or…",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14cef327102d82f07613d4ca6afb620393642f00",
          "body": "Add a Card Template panel: tone colors vs black & white, toggle hanzi/pinyin\ncoloring, and pick the hanzi font (default / Kaiti / Songti). Settings drive\na CSS override appended to DECK_CSS (default = no-op, apkg unchanged) and are\nmirrored in the live preview",
          "is_bot": false,
          "headline": "Create page: card template customization (colors, B&W, fonts)",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c67f96848559398d3112edc67452823ba7c3746a",
          "body": "Merge Fields/Order and Front/Back into one per-card-type editor: each field\nrow has drag + up/down ordering and Front and Back checkboxes. Add a live\nCardPreview (front and back) rendered from a dummy word so users see what is\nshown or hidden. New card types default to Simplified on front and all\ndisplay fields on back.\n\ngenerateDeck now honours back-side selection by dropping the div for any\ndisplay field deselected on the back (default keeps all -> apkg unchanged)",
          "is_bot": false,
          "headline": "Create page: unified field editor with front/back toggles + live preview",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75122b8d7272f82358876c98df0e95084c803ed6",
          "body": "Replace the flat table with WordCard: tone-colored hanzi (simplified +\ntraditional), per-reading pinyin/zhuyin, chips for HSK level, parts of\nspeech and classifiers, the common meaning shown first, and a collapsible\nper-reading dictionary block. Add tone-color utilities (app.css, tone.ts)\nand a single-word delete. apkg export unchanged.",
          "is_bot": false,
          "headline": "Create page: rich word cards with chips and collapsible meaning",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7abf94651bd3c246c7a841b1ce50487b33015e3d",
          "body": "New src/lib/dict/cedict.ts loads cedict.db + hsk_sentences.db (sql.js +\nunzipit) and returns per-reading pinyin/zhuyin/definitions plus common\nmeaning, parts of speech, classifiers, HSK level, frequency rank and example\nsentences. lookupWord now uses it (Google Translate fallback kept) and the\nWord \n[…]\ne rich metadata for the UI; apkg fields unchanged.\n\nRemove the superseded binary dictionary (dict.ts, cedict_ts.*, cedict.idx,\ngrammar/vocab keyword json, sql-wasm.js). Clear the word input after Add.",
          "is_bot": false,
          "headline": "Replace dictionary with cedict.db (rich data via sql.js)",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4a10a696d3085bc9b19bcdb5acd6d3b55e4042b",
          "body": "- mdsvex set up with an absolute-path shared MarkdownLayout; new /faq and\n  /features routes reuse the old docs content, /decks lists the prebuilt\n  HSK .apkg downloads (modern minimal style). Navbar/footer + homepage\n  links repointed to these pages.\n- Fix Vite build hang: Tailwind v4 source(none) \n[…]\n scanning the\n  multi-MB binaries in static/data; deep-import lucide icons to avoid the\n  ~1600-module barrel.\n\nVerified: all 5 routes render with no console errors; production build\ncompletes in ~3s.",
          "is_bot": false,
          "headline": "Add FAQ/Features (mdsvex) + Decks pages; fix build hang",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aa72602ef25e1de2c951e1296dde4a86e3904640",
          "body": "Delete Docusaurus config, plugin, docs, blog and the old React src\n(pages, components, css). Workflows now use npm ci + npm run build\n(adapter-static -> ./build; peaceiris adds .nojekyll for the _app dir).\nRepoint contributing.md to releases and document the npm dev workflow.\nIgnore the unzipped runtime DBs (cedict.db, hsk_sentences.db).",
          "is_bot": false,
          "headline": "Remove Docusaurus; switch GitHub Pages deploy to npm + SvelteKit",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:38:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2de52408b817073c6be3e0796bde049b31f0709",
          "body": "Port Docusaurus homepage to Svelte: hanzi-writer 写汉字 logo animation,\nhero, Features grid, create-deck banner and getting-started cards\n(react-icons -> @lucide/svelte). Add shared navbar/footer in +layout.\nDropped docs/blog links repointed to the GitHub repo and releases.",
          "is_bot": false,
          "headline": "Add homepage + layout (navbar/footer)",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:36:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dabd21d4ae0c90a86c034c2aa6defd8b1fa5f161",
          "body": "Two-page wizard (deck/card-type config + character input) rebuilt with\nflowbite-svelte (Input, Select, Checkbox, Fileupload, Textarea, Progressbar,\nTable, Alert). React hooks -> Svelte 5 runes; wires src/lib/deck.ts for word\nlookup, paragraph segmentation and .apkg generation. Verified end-to-end:\ndict/sql/jieba/HSK init, word lookup, and apkg export produce the same model\nIDs, fields, templates and media as the original.",
          "is_bot": false,
          "headline": "Add /create route — Svelte port of the deck generator",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:36:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ab30ecd337608946ee521782c9a3614ab5b32a0",
          "body": "Move dict.ts, pinyinzhuyin.ts, contants.ts to src/lib/dict (Anki templates\nunchanged). Add src/lib/deck.ts: pure-function port of create.tsx generation\nlogic (lookupWord, cutParagraph, generateDeck, init helpers) with identical\nmodel IDs, templates and media list. Runtime data fetched from local base\n(static/data) instead of the github.io host.",
          "is_bot": false,
          "headline": "Extract deck logic + dict to framework-agnostic src/lib",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:36:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "754aabcddaa8667b8de64180754305a1077f2587",
          "body": "Replace Docusaurus build tooling with SvelteKit (adapter-static, base\n/Anki-xiehanzi), Vite 8, Tailwind 4 + flowbite-svelte. Node polyfills wired\nfor genanki-js/sql.js. Placeholder homepage route; Docusaurus source files\nstill present, removed in a later commit.",
          "is_bot": false,
          "headline": "Scaffold SvelteKit + Vite + Tailwind/Flowbite",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T17:36:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51a510541c8ae2f998844568e5b289c71b5cb9f0",
          "body": null,
          "is_bot": false,
          "headline": "feat: add dev site alert on homepage",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T03:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f6924d9a88ac82f1120dfb6e1ed22a01212437d",
          "body": null,
          "is_bot": false,
          "headline": "ci: build both Docusaurus + SvelteKit, deploy to root + /dev",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-08T02:55:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13b72f6152b65231836d063cdd65c80180522a12",
          "body": null,
          "is_bot": false,
          "headline": "show use ms edge info",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-06T07:18:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcbf0afedd202a8b54918c7fe61a0f954f483663",
          "body": null,
          "is_bot": false,
          "headline": "fix if audio not included",
          "author_name": "Mani",
          "author_login": "krmanik",
          "committed_at": "2026-06-06T06:45:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 18,
      "commits_last_year": 120,
      "latest_release_at": "2025-12-20T10:28:51Z",
      "latest_release_tag": "v2.3",
      "releases_from_tags": false,
      "days_since_last_push": 37,
      "active_weeks_last_year": 5,
      "days_since_latest_release": 215,
      "mean_days_between_releases": 171.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 32,
      "stars": 392,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2020-03-14",
            "count": 1
          },
          {
            "date": "2020-03-15",
            "count": 1
          },
          {
            "date": "2020-04-24",
            "count": 1
          },
          {
            "date": "2020-06-30",
            "count": 1
          },
          {
            "date": "2021-02-09",
            "count": 1
          },
          {
            "date": "2021-08-12",
            "count": 1
          },
          {
            "date": "2022-03-25",
            "count": 1
          },
          {
            "date": "2022-04-04",
            "count": 1
          },
          {
            "date": "2022-04-18",
            "count": 1
          },
          {
            "date": "2022-12-01",
            "count": 1
          },
          {
            "date": "2023-07-31",
            "count": 1
          },
          {
            "date": "2023-08-19",
            "count": 1
          },
          {
            "date": "2023-10-08",
            "count": 1
          },
          {
            "date": "2023-11-03",
            "count": 1
          },
          {
            "date": "2024-03-11",
            "count": 1
          },
          {
            "date": "2024-04-14",
            "count": 1
          },
          {
            "date": "2024-09-13",
            "count": 1
          },
          {
            "date": "2024-09-22",
            "count": 1
          },
          {
            "date": "2024-10-28",
            "count": 1
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2025-01-12",
            "count": 1
          },
          {
            "date": "2025-05-06",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 1
          },
          {
            "date": "2025-12-10",
            "count": 1
          },
          {
            "date": "2026-01-24",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 32,
        "total_forks": 32
      },
      "star_history": null,
      "open_issues_and_prs": 6
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "notebooks"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 57978,
      "source_files_sampled": 40,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5826
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "cipher-base",
            "direct": false,
            "version": "1.0.4",
            "severity": "critical",
            "ecosystem": "npm",
            "cvss_score": 9.1,
            "advisory_ids": [
              "GHSA-cpq7-6gpm-g9rc"
            ],
            "fixed_version": "1.0.5",
            "advisory_count": 1,
            "oldest_advisory_days": 336
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.11",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-3jxr-9vmj-r5cp",
              "GHSA-f886-m6hf-6m8v",
              "GHSA-v6h2-p8h4-qcjw"
            ],
            "fixed_version": "5.0.7",
            "advisory_count": 3,
            "oldest_advisory_days": 409
          },
          {
            "name": "braces",
            "direct": false,
            "version": "2.3.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-grv7-fg5c-xmjg"
            ],
            "fixed_version": "3.0.3",
            "advisory_count": 1,
            "oldest_advisory_days": 800
          },
          {
            "name": "elliptic",
            "direct": false,
            "version": "6.6.1",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-848j-6mx2-7j84"
            ],
            "fixed_version": null,
            "advisory_count": 1,
            "oldest_advisory_days": 196
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-23c5-xmqv-rm74",
              "GHSA-3ppc-4f35-3m26",
              "GHSA-7r86-cg39-jmmj"
            ],
            "fixed_version": "10.2.3",
            "advisory_count": 3,
            "oldest_advisory_days": 155
          },
          {
            "name": "terser",
            "direct": false,
            "version": "3.17.0",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-4wf5-vphf-c2xc"
            ],
            "fixed_version": "5.14.2",
            "advisory_count": 1,
            "oldest_advisory_days": 1469
          },
          {
            "name": "undici",
            "direct": false,
            "version": "7.27.2",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-35p6-xmwp-9g52",
              "GHSA-g8m3-5g58-fq7m",
              "GHSA-hm92-r4w5-c3mj",
              "GHSA-p88m-4jfj-68fv",
              "GHSA-pr7r-676h-xcf6",
              "GHSA-vmh5-mc38-953g",
              "GHSA-vxpw-j846-p89q"
            ],
            "fixed_version": "8.5.0",
            "advisory_count": 7,
            "oldest_advisory_days": 35
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.23.9",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 6.2,
            "advisory_ids": [
              "GHSA-968p-4wvh-cqc8"
            ],
            "fixed_version": "8.0.0-alpha.17",
            "advisory_count": 1,
            "oldest_advisory_days": 499
          },
          {
            "name": "bn.js",
            "direct": false,
            "version": "4.12.0",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-378v-28hj-76wf"
            ],
            "fixed_version": "5.2.3",
            "advisory_count": 1,
            "oldest_advisory_days": 153
          },
          {
            "name": "bn.js",
            "direct": false,
            "version": "5.2.1",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-378v-28hj-76wf"
            ],
            "fixed_version": "5.2.3",
            "advisory_count": 1,
            "oldest_advisory_days": 153
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "3.1.10",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-952p-6rrq-rcjv"
            ],
            "fixed_version": "4.0.8",
            "advisory_count": 1,
            "oldest_advisory_days": 800
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "0.6.0",
            "severity": "low",
            "ecosystem": "npm",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-pxg6-pf52-xh8x"
            ],
            "fixed_version": "0.7.0",
            "advisory_count": 1,
            "oldest_advisory_days": 657
          },
          {
            "name": "es5-ext",
            "direct": false,
            "version": "0.10.62",
            "severity": "low",
            "ecosystem": "npm",
            "cvss_score": null,
            "advisory_ids": [
              "GHSA-4gmj-3p3h-gm8h"
            ],
            "fixed_version": "0.10.63",
            "advisory_count": 1,
            "oldest_advisory_days": 878
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "low": 2,
          "high": 6,
          "critical": 1,
          "moderate": 4
        },
        "advisory_count": 23,
        "affected_count": 13,
        "assessed_count": 691,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@hiseb/confetti",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.0"
        },
        {
          "name": "@kingdanx/edge-tts-browser",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "chinese-s2t",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.0.0"
        },
        {
          "name": "chinese-to-pinyin",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.1"
        },
        {
          "name": "genanki-js",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "hanzi-writer",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.6.1"
        },
        {
          "name": "jieba-wasm",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.0"
        },
        {
          "name": "segmentit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.0.3"
        },
        {
          "name": "sql.js",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.10.3"
        },
        {
          "name": "unzipit",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.4.3"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@hiseb/confetti",
            "direct": true,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@kingdanx/edge-tts-browser",
            "direct": true,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "chinese-s2t",
            "direct": true,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "chinese-to-pinyin",
            "direct": true,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "genanki-js",
            "direct": true,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hanzi-writer",
            "direct": true,
            "version": "3.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "jieba-wasm",
            "direct": true,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "segmentit",
            "direct": true,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "sql.js",
            "direct": true,
            "version": "1.10.3",
            "ecosystem": "npm"
          },
          {
            "name": "unzipit",
            "direct": true,
            "version": "1.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@adobe/css-tools",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/css-color",
            "direct": false,
            "version": "5.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/dom-selector",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/generational-cache",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@asamuzakjp/nwsapi",
            "direct": false,
            "version": "2.3.9",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.23.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.22.20",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/highlight",
            "direct": false,
            "version": "7.23.4",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/runtime",
            "direct": false,
            "version": "7.23.9",
            "ecosystem": "npm"
          },
          {
            "name": "@bramus/specificity",
            "direct": false,
            "version": "2.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/color-helpers",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-calc",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-color-parser",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-parser-algorithms",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-syntax-patches-for-csstree",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "@csstools/css-tokenizer",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/core",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/runtime",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "@emnapi/wasi-threads",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "@exodus/bytes",
            "direct": false,
            "version": "1.15.1",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/core",
            "direct": false,
            "version": "1.7.5",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/dom",
            "direct": false,
            "version": "1.7.6",
            "ecosystem": "npm"
          },
          {
            "name": "@floating-ui/utils",
            "direct": false,
            "version": "0.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.13",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/remapping",
            "direct": false,
            "version": "2.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/source-map",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.31",
            "ecosystem": "npm"
          },
          {
            "name": "@lucide/svelte",
            "direct": false,
            "version": "1.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "@napi-rs/wasm-runtime",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "@oxc-project/types",
            "direct": false,
            "version": "0.133.0",
            "ecosystem": "npm"
          },
          {
            "name": "@polka/url",
            "direct": false,
            "version": "1.0.0-next.24",
            "ecosystem": "npm"
          },
          {
            "name": "@popperjs/core",
            "direct": false,
            "version": "2.11.8",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-android-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-darwin-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-freebsd-x64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-arm64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-ppc64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-s390x-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-gnu",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-linux-x64-musl",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-openharmony-arm64",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-wasm32-wasi",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-arm64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/binding-win32-x64-msvc",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@rolldown/pluginutils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-inject",
            "direct": false,
            "version": "5.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/plugin-node-resolve",
            "direct": false,
            "version": "15.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/pluginutils",
            "direct": false,
            "version": "5.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "@standard-schema/spec",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/acorn-typescript",
            "direct": false,
            "version": "1.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/adapter-static",
            "direct": false,
            "version": "3.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/kit",
            "direct": false,
            "version": "2.63.0",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/load-config",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@sveltejs/vite-plugin-svelte",
            "direct": false,
            "version": "7.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/node",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-android-arm64",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-darwin-arm64",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-darwin-x64",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-freebsd-x64",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-linux-arm64-gnu",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-linux-arm64-musl",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-linux-x64-gnu",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-linux-x64-musl",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-wasm32-wasi",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-win32-arm64-msvc",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/oxide-win32-x64-msvc",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@tailwindcss/vite",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/dom",
            "direct": false,
            "version": "10.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/jest-dom",
            "direct": false,
            "version": "6.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/svelte",
            "direct": false,
            "version": "5.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/svelte-core",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@testing-library/user-event",
            "direct": false,
            "version": "14.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "@tybys/wasm-util",
            "direct": false,
            "version": "0.10.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/aria-query",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/chai",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/cookie",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/deep-eql",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdast",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "25.9.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/parse-json",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/resolve",
            "direct": false,
            "version": "1.20.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/trusted-types",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/unist",
            "direct": false,
            "version": "2.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/expect",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/mocker",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/pretty-format",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/runner",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/snapshot",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/spy",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "@vitest/utils",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-colors",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-cyan",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-gray",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-red",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-wrap",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "anymatch",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "apexcharts",
            "direct": false,
            "version": "5.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "append-buffer",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "archy",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "aria-query",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "aria-query",
            "direct": false,
            "version": "5.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "arr-diff",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arr-diff",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "arr-filter",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "arr-flatten",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arr-map",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "arr-union",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "arr-union",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "array-each",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "array-initial",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "array-last",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "array-slice",
            "direct": false,
            "version": "0.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "array-slice",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "array-sort",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "array-unique",
            "direct": false,
            "version": "0.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "asn1.js",
            "direct": false,
            "version": "4.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "assert",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "assertion-error",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "assign-symbols",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "async-done",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "async-each",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "async-settle",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "atob",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "available-typed-arrays",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "axobject-query",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-macros",
            "direct": false,
            "version": "2.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-preval",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "bach",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "base",
            "direct": false,
            "version": "0.11.2",
            "ecosystem": "npm"
          },
          {
            "name": "base64-js",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "bidi-js",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "big-integer",
            "direct": false,
            "version": "1.6.52",
            "ecosystem": "npm"
          },
          {
            "name": "binary-extensions",
            "direct": false,
            "version": "1.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "bindings",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "bn.js",
            "direct": false,
            "version": "4.12.0",
            "ecosystem": "npm"
          },
          {
            "name": "bn.js",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "bn.js",
            "direct": false,
            "version": "5.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.11",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "brorand",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "browser-resolve",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-aes",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-cipher",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-des",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-rsa",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-sign",
            "direct": false,
            "version": "4.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "browserify-zlib",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "buffer",
            "direct": false,
            "version": "5.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-equal",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-xor",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "builtin-status-codes",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cache-base",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bound",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "2.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "2.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "cipher-base",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "class-utils",
            "direct": false,
            "version": "0.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "clone",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "clone-buffer",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "clone-stats",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cloneable-readable",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "clsx",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "code-point-at",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "collection-map",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "collection-visit",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "1.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "color-support",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.20.3",
            "ecosystem": "npm"
          },
          {
            "name": "component-emitter",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-stream",
            "direct": false,
            "version": "1.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "concat-with-sourcemaps",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "console-browserify",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "constants-browserify",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "1.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "copy-descriptor",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "copy-props",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "core-util-is",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "cosmiconfig",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "create-ecdh",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "create-hash",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "create-hmac",
            "direct": false,
            "version": "1.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "create-require",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "crypto-browserify",
            "direct": false,
            "version": "3.12.1",
            "ecosystem": "npm"
          },
          {
            "name": "crypto-js",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "css-tree",
            "direct": false,
            "version": "3.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "css.escape",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "d",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "data-urls",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "date-fns",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "2.6.9",
            "ecosystem": "npm"
          },
          {
            "name": "decamelize",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "decimal.js",
            "direct": false,
            "version": "10.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "decode-uri-component",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "deepmerge",
            "direct": false,
            "version": "4.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "default-compare",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "default-resolution",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "define-data-property",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "define-properties",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "define-property",
            "direct": false,
            "version": "0.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "define-property",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "define-property",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "dequal",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "des.js",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "detect-file",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "detect-libc",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "devalue",
            "direct": false,
            "version": "5.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "diffie-hellman",
            "direct": false,
            "version": "5.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "dom-accessibility-api",
            "direct": false,
            "version": "0.5.16",
            "ecosystem": "npm"
          },
          {
            "name": "dom-accessibility-api",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "domain-browser",
            "direct": false,
            "version": "4.22.0",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "duplexify",
            "direct": false,
            "version": "3.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "each-props",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "elliptic",
            "direct": false,
            "version": "6.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "end-of-stream",
            "direct": false,
            "version": "1.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "enhanced-resolve",
            "direct": false,
            "version": "5.23.0",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "error-ex",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "es5-ext",
            "direct": false,
            "version": "0.10.62",
            "ecosystem": "npm"
          },
          {
            "name": "es6-iterator",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "es6-symbol",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "es6-weak-map",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "esm-env",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "esrap",
            "direct": false,
            "version": "2.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "events",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "evp_bytestokey",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "expand-brackets",
            "direct": false,
            "version": "2.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "expand-tilde",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "expect-type",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ext",
            "direct": false,
            "version": "1.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "extend",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "extend-shallow",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "extend-shallow",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "extend-shallow",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "extglob",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "fancy-log",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "fdir",
            "direct": false,
            "version": "6.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "file-saver",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "file-uri-to-path",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "findup-sync",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "findup-sync",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fined",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "flagged-respawn",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flowbite",
            "direct": false,
            "version": "2.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "flowbite",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "flowbite-datepicker",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "flowbite-svelte",
            "direct": false,
            "version": "1.33.1",
            "ecosystem": "npm"
          },
          {
            "name": "flush-write-stream",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "for-each",
            "direct": false,
            "version": "0.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "for-in",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "for-own",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fragment-cache",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "fs-mkdirp-stream",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fs.realpath",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "1.2.13",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "generator-function",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-value",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "7.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob-stream",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob-watcher",
            "direct": false,
            "version": "5.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "global-modules",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "global-prefix",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "glogg",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "gulp",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-cli",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-concat",
            "direct": false,
            "version": "2.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "gulp-minify",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "gulplog",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-property-descriptors",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-tostringtag",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "has-value",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "has-value",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-values",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "has-values",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hash-base",
            "direct": false,
            "version": "3.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "hash-base",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "hash.js",
            "direct": false,
            "version": "1.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "hmac-drbg",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "homedir-polyfill",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "hosted-git-info",
            "direct": false,
            "version": "2.8.9",
            "ecosystem": "npm"
          },
          {
            "name": "html-encoding-sniffer",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "https-browserify",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ieee754",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "immediate",
            "direct": false,
            "version": "3.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "import-fresh",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "indent-string",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "inflight",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ini",
            "direct": false,
            "version": "1.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "interpret",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "invert-kv",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-absolute",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-accessor-descriptor",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-arguments",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-arrayish",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-binary-path",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-buffer",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "is-callable",
            "direct": false,
            "version": "1.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "is-core-module",
            "direct": false,
            "version": "2.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-data-descriptor",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-descriptor",
            "direct": false,
            "version": "0.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "is-descriptor",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-extendable",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extendable",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-generator-function",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-module",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-nan",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "is-negated-glob",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-potential-custom-element-name",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-reference",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-regex",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-relative",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-typed-array",
            "direct": false,
            "version": "1.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "is-unc-path",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-utf8",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-valid-glob",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-windows",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "isarray",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isarray",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isobject",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "isobject",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "isomorphic-timers-promises",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jiti",
            "direct": false,
            "version": "1.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "jiti",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-sha256",
            "direct": false,
            "version": "0.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsdom",
            "direct": false,
            "version": "29.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-parse-even-better-errors",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "jszip",
            "direct": false,
            "version": "3.10.1",
            "ecosystem": "npm"
          },
          {
            "name": "just-debounce",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "kleur",
            "direct": false,
            "version": "4.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "last-run",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "lazystream",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "lcid",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lead",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lie",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "liftoff",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-android-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-arm64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-darwin-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-freebsd-x64",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm-gnueabihf",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-arm64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-gnu",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-linux-x64-musl",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-arm64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lightningcss-win32-x64-msvc",
            "direct": false,
            "version": "1.32.0",
            "ecosystem": "npm"
          },
          {
            "name": "lines-and-columns",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "load-json-file",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-character",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "11.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "lz-string",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "make-iterator",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "map-cache",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "map-visit",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "matchdep",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "md5.js",
            "direct": false,
            "version": "1.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "mdn-data",
            "direct": false,
            "version": "2.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdsvex",
            "direct": false,
            "version": "0.12.7",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "3.1.10",
            "ecosystem": "npm"
          },
          {
            "name": "miller-rabin",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "min-indent",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "mini-svg-data-uri",
            "direct": false,
            "version": "1.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "minimalistic-assert",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimalistic-crypto-utils",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "mixin-deep",
            "direct": false,
            "version": "1.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "mri",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "mrmime",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "mute-stdout",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "nan",
            "direct": false,
            "version": "2.25.0",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.12",
            "ecosystem": "npm"
          },
          {
            "name": "nanomatch",
            "direct": false,
            "version": "1.2.13",
            "ecosystem": "npm"
          },
          {
            "name": "next-tick",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "node-stdlib-browser",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-package-data",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-path",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-path",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "now-and-later",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "number-is-nan",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-copy",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "object-inspect",
            "direct": false,
            "version": "1.13.4",
            "ecosystem": "npm"
          },
          {
            "name": "object-is",
            "direct": false,
            "version": "1.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "object-keys",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-visit",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "object.assign",
            "direct": false,
            "version": "4.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "object.defaults",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "object.map",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "object.pick",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "object.reduce",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "obug",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "ordered-read-streams",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "os-browserify",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "os-locale",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pako",
            "direct": false,
            "version": "1.0.11",
            "ecosystem": "npm"
          },
          {
            "name": "parent-module",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parse-asn1",
            "direct": false,
            "version": "5.1.9",
            "ecosystem": "npm"
          },
          {
            "name": "parse-filepath",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "parse-json",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse-json",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse-node-version",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parse-passwd",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "parse5",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pascalcase",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-browserify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-dirname",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-is-absolute",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-parse",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "path-root",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-root-regex",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-type",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-type",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pathe",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "pbkdf2",
            "direct": false,
            "version": "3.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pify",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pinkie",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pinkie-promise",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "plugin-error",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "posix-character-classes",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "possible-typed-array-names",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.15",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-format",
            "direct": false,
            "version": "27.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-hrtime",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "preval.macro",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "prism-svelte",
            "direct": false,
            "version": "0.4.7",
            "ecosystem": "npm"
          },
          {
            "name": "prismjs",
            "direct": false,
            "version": "1.30.0",
            "ecosystem": "npm"
          },
          {
            "name": "process",
            "direct": false,
            "version": "0.11.10",
            "ecosystem": "npm"
          },
          {
            "name": "process-nextick-args",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "public-encrypt",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "pump",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "pumpify",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "qs",
            "direct": false,
            "version": "6.15.2",
            "ecosystem": "npm"
          },
          {
            "name": "querystring-es3",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "randombytes",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "randomfill",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "react-is",
            "direct": false,
            "version": "17.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "read-pkg",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "read-pkg-up",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "rechoir",
            "direct": false,
            "version": "0.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "redent",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "regenerator-runtime",
            "direct": false,
            "version": "0.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "regex-not",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "remove-bom-buffer",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "remove-bom-stream",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "remove-trailing-separator",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "repeat-element",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "repeat-string",
            "direct": false,
            "version": "1.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "replace-ext",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "replace-homedir",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "require-main-filename",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "resolve",
            "direct": false,
            "version": "1.22.8",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-dir",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-options",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-url",
            "direct": false,
            "version": "0.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ret",
            "direct": false,
            "version": "0.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "ripemd160",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "rolldown",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "sade",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "safe-regex",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "safe-regex-test",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "saxes",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "5.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "semver-greatest-satisfied-range",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "set-blocking",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "set-cookie-parser",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "set-function-length",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "set-value",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "setimmediate",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "sha.js",
            "direct": false,
            "version": "2.4.12",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-list",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-map",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-weakmap",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "siginfo",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "sirv",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "snapdragon",
            "direct": false,
            "version": "0.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "snapdragon-node",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "snapdragon-util",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.5.7",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-resolve",
            "direct": false,
            "version": "0.5.3",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.21",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-url",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "sparkles",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "spdx-correct",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "spdx-exceptions",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "spdx-expression-parse",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "spdx-license-ids",
            "direct": false,
            "version": "3.0.17",
            "ecosystem": "npm"
          },
          {
            "name": "split-string",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "stack-trace",
            "direct": false,
            "version": "0.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "stackback",
            "direct": false,
            "version": "0.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "static-extend",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "std-env",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "stream-browserify",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "stream-exhaust",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "stream-http",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "stream-shift",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "string_decoder",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "string_decoder",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-bom",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-indent",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "5.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-preserve-symlinks-flag",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "svelte",
            "direct": false,
            "version": "5.56.2",
            "ecosystem": "npm"
          },
          {
            "name": "svelte-check",
            "direct": false,
            "version": "4.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "sver-compat",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "symbol-tree",
            "direct": false,
            "version": "3.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tailwind-merge",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tailwind-variants",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "tailwindcss",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "tapable",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "3.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "5.27.0",
            "ecosystem": "npm"
          },
          {
            "name": "through2",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "through2-filter",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "time-stamp",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "timers-browserify",
            "direct": false,
            "version": "2.0.12",
            "ecosystem": "npm"
          },
          {
            "name": "tinybench",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "tinyexec",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "tinyglobby",
            "direct": false,
            "version": "0.2.17",
            "ecosystem": "npm"
          },
          {
            "name": "tinyrainbow",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "7.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "7.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "to-absolute-glob",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "to-buffer",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "to-object-path",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "to-through",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "totalist",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tr46",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "tty-browserify",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "type",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "type",
            "direct": false,
            "version": "2.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "typed-array-buffer",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "typedarray",
            "direct": false,
            "version": "0.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "5.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "unc-path-regex",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "undertaker",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "undertaker-registry",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "undici",
            "direct": false,
            "version": "7.27.2",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "7.24.6",
            "ecosystem": "npm"
          },
          {
            "name": "union-value",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "unique-stream",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-is",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-stringify-position",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit-parents",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "unset-value",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "upath",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "urix",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "url",
            "direct": false,
            "version": "0.11.4",
            "ecosystem": "npm"
          },
          {
            "name": "use",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "util",
            "direct": false,
            "version": "0.12.5",
            "ecosystem": "npm"
          },
          {
            "name": "util-deprecate",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "uzip-module",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "v8flags",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "validate-npm-package-license",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "value-or-function",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "vfile-message",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "vinyl",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "vinyl-fs",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vinyl-sourcemap",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "8.0.16",
            "ecosystem": "npm"
          },
          {
            "name": "vite-plugin-node-polyfills",
            "direct": false,
            "version": "0.28.0",
            "ecosystem": "npm"
          },
          {
            "name": "vitefu",
            "direct": false,
            "version": "1.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "vitest",
            "direct": false,
            "version": "4.1.8",
            "ecosystem": "npm"
          },
          {
            "name": "vm-browserify",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "w3c-xmlserializer",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "webidl-conversions",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-mimetype",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "whatwg-url",
            "direct": false,
            "version": "16.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "which-module",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "which-typed-array",
            "direct": false,
            "version": "1.1.22",
            "ecosystem": "npm"
          },
          {
            "name": "why-is-node-running",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "xml-name-validator",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "xmlchars",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "xtend",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": false,
            "version": "1.10.3",
            "ecosystem": "npm"
          },
          {
            "name": "yaml",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": false,
            "version": "7.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "zimmerframe",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 691,
        "direct_count": 10,
        "indirect_count": 681
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 8,
        "open_issues": 6,
        "closed_ratio": 0.908,
        "closed_issues": 59,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "krmanik",
          "commits": 513,
          "avatar_url": "https://avatars.githubusercontent.com/u/12841290?v=4"
        },
        {
          "type": "User",
          "login": "koynoyno",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/46102189?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.994
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "deploy.yml",
        "test-deploy.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 8,
            "reason": "binaries present in source code",
            "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": "1 out of 1 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/16 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 0,
            "reason": "no 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": 9,
            "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 21 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 5,
            "reason": "dependency not pinned by hash detected -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "22 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "91a69cfe05625740601b392f8ba2193de2baac75",
        "ran_at": "2026-07-24T03:54:23Z",
        "aggregate_score": 3.1,
        "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-06-16T04:44:20Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-06-14T03:51:37Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 58,
          "created_at": "2024-09-18T10:43:43Z",
          "last_comment_at": "2026-06-13T06:40:08Z",
          "last_comment_author": "krmanik"
        },
        {
          "number": 62,
          "created_at": "2025-01-21T13:55:47Z",
          "last_comment_at": "2025-01-24T00:59:20Z",
          "last_comment_author": "krmanik"
        },
        {
          "number": 68,
          "created_at": "2025-11-27T19:56:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 70,
          "created_at": "2026-01-03T11:58:37Z",
          "last_comment_at": "2026-01-29T00:11:20Z",
          "last_comment_author": "krmanik"
        },
        {
          "number": 71,
          "created_at": "2026-01-21T12:16:07Z",
          "last_comment_at": "2026-06-14T06:23:19Z",
          "last_comment_author": "krmanik"
        },
        {
          "number": 78,
          "created_at": "2026-06-13T10:28:10Z",
          "last_comment_at": "2026-06-14T04:14:03Z",
          "last_comment_author": "krmanik"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/krmanik/Anki-xiehanzi",
    "host": "github.com",
    "name": "Anki-xiehanzi",
    "owner": "krmanik"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 46,
        "vitality": 52,
        "community": 60,
        "governance": 48,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 52,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "commits_last_year": 120,
              "human_commit_share": 1,
              "days_since_last_push": 37,
              "active_weeks_last_year": 5
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 37 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 37
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "5/52 weeks with commits",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "120 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 120
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 21 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v2.3",
              "releases_from_tags": false,
              "days_since_latest_release": 215,
              "mean_days_between_releases": 171.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 215 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 215
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~171.4 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 171.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 37,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 37 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 37
                    }
                  }
                ],
                "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": 56,
            "inputs": {
              "forks": 32,
              "stars": 392,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "392 stars",
                "points": 42,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 392
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "32 forks",
                "points": 12.4,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 32
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 48,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.994
            },
            "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 99% of commits",
                "points": 0.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "merged_prs": 8,
              "open_issues": 6,
              "closed_issues": 59,
              "issue_closed_ratio": 0.908,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "91% of issues closed",
                "points": 42.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 91
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "8/10 decided PRs merged",
                "points": 30.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 8,
                      "decided": 10
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/16 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": 63,
            "inputs": {
              "followers": 127,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "krmanik",
              "public_repos": 73,
              "account_age_days": 4060
            },
            "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": "127 followers of krmanik",
                "points": 15.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 127,
                      "login": "krmanik"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "73 public repos, account ~11 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 73
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "1 out of 1 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": [
                "anki",
                "ankidroid",
                "mandarin",
                "chinese-language",
                "practice-mandarin",
                "drawing-strokes",
                "hanzi",
                "hanzi-writer",
                "anki-xiehanzi",
                "anki-decks",
                "chinese-characters",
                "mandarin-chinese",
                "hacktoberfest",
                "hsk",
                "hsk3",
                "new-hsk"
              ],
              "has_wiki": false,
              "homepage": "https://krmanik.github.io/Anki-xiehanzi",
              "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://krmanik.github.io/Anki-xiehanzi",
                "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": "16 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Security",
        "value": 46,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6,
                "status": "partial",
                "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": "1 out of 1 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/16 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "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.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 21 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 5",
                "points": 2.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "22 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): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 691 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 691
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 23,
              "affected_packages": 13,
              "assessed_packages": 691,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 1, high 6, moderate 4, low 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "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": 691,
              "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": 1
            },
            "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": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.95,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5826
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "95 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 5",
                "points": 5,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "HTML",
              "largest_source_bytes": 57978,
              "source_files_sampled": 40,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "HTML with type-check config (tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "tsconfig.json",
                      "language": "HTML"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/40 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 40,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "notebooks"
              ],
              "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": "notebooks",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "notebooks"
                    }
                  }
                ],
                "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-24T03:54:42.120879Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/krmanik/Anki-xiehanzi.svg",
  "full_name": "krmanik/Anki-xiehanzi",
  "license_state": "custom",
  "license_spdx": null
}

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

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

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