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

JeffreyChen-SteamProjects / FrontEngine

FrontEngine software that can use-define front end or only use like screen saver

PythonMIT★ 9 星标⑂ 0 复刻始于 2023年4月在 GitHub 上查看 ↗

JeffreyChen-SteamProjects/FrontEngine 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Vitality(79/100),最低的是Security(40/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

0 关注者1 个公开仓库始于 2024年5月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
PyPIfrontengine_dev指向其他仓库——不计分1.0.046396167 天前

按类别列示的指标

活力

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

79良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
4.8/36提交节奏 — 52 周中有 7 周有提交
18/18提交量 — 最近一年 191 次提交
0/10OpenSSF Scorecard:Maintained — 无数据
所用输入
commits_last_year191
human_commit_share0.76
days_since_last_push0
active_weeks_last_year7

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 51 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 0.1 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count51
latest_release_tagv1.0.37
releases_from_tags
days_since_latest_release0
mean_days_between_releases0.1

社区与采用

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

41存在风险 · 占总体的 18%
评分方式
14.6/60星标 — 9 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 1 位关注者
所用输入
forks0
stars9
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
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.9/22.5提交分布 — 头号贡献者编写了 96% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
0/10OpenSSF Scorecard:Contributors — 无数据
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.958
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
37.7/38.3PR 接受 — 已裁定的 PR 中 150/152 已合并
0/15OpenSSF Scorecard:Code-Review — 无数据
所用输入
merged_prs150
open_issues0
closed_issues18
issue_closed_ratio1
closed_unmerged_prs2
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — JeffreyChen-SteamProjects 有 0 位关注者
6.6/25既往记录 — 1 个公开仓库,账户约 2 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_loginJeffreyChen-SteamProjects
public_repos1
account_age_days804

工程质量

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

72良好 · 占总体的 20%

工程实践

60中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://integration-automation.github.io/FrontEngine/
10/10仓库描述
10/10主题标签 — 12 个主题标签
0/10Wiki
所用输入
topicsdynamic-desktop, dynamics, live-wallpaper, python3, wallpaper, wallpaper-engine, wallpaperengine, wallpapers, widgets, window-11, windows-10, windows-desktop
has_wiki
homepagehttps://integration-automation.github.io/FrontEngine/
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

25危急
评分方式
0/30安全策略(SECURITY.md)
25/25Dependabot 配置
0/25依赖锁定文件
0/20CodeQL 工作流
所用输入
sourcefile_signals
lockfiles
manifestsdocs/requirements.txt, pyproject.toml, requirements.txt
has_codeql_workflow
has_security_policy
has_dependabot_config
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages7
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 pypi:frontengine_dev@1.0.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 7 个软件包。 未对可达性进行分析。

AI 就绪度

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

63中等 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 76 次人类提交中有 67 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.882
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes5,232
评分方式
18/18一条命令的引导启动 — docs/Makefile
22/22自动化测试
0/11Lint / 格式化配置
0/11静态类型检查
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
5/8自动化维护 — 已配置依赖自动化,但在抽样提交中未观察到
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesdocs/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
评分方式
0/45可类型检查的代码 — Python,未配置类型检查
54.8/55可控的文件大小 — 采样的 241 个源文件中有 1 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes79,703
source_files_sampled241
oversized_source_files1

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • pypi package 'frontengine_dev' points at a different repository (https://github.com/Intergration-Automation-Testing/FrontEngine); excluded from ecosystem scoring
  • OpenSSF Scorecard did not return a usable result (2026/07/26 02:56:53 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

更多细节

直接依赖 6
注册表软件包版本约束清单文件
PyPIPySide6==6.10.2pyproject.toml
PyPIqt-materialpyproject.toml
PyPIPyOpenGLpyproject.toml
PyPIPyOpenGL_acceleratepyproject.toml
PyPInumpypyproject.toml
PyPIpynputpyproject.toml
全部依赖 14

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

注册表软件包版本关系
PyPInumpy直接
PyPIpynput直接
PyPIpyopengl直接
PyPIpyopengl-accelerate直接
PyPIpyside66.10.2直接
PyPIpyside66.8.2.1直接
PyPIqt-material直接
PyPIauto-py-to-exe间接
PyPIbuild间接
PyPIfrontengine间接
PyPIpytest间接
PyPIsetuptools间接
PyPIsphinx-rtd-theme间接
PyPItwine间接
依赖安全公告 0

安装 pypi:frontengine_dev@1.0.0 会引入 7 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

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

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "dynamic-desktop",
        "dynamics",
        "live-wallpaper",
        "python3",
        "wallpaper",
        "wallpaper-engine",
        "wallpaperengine",
        "wallpapers",
        "widgets",
        "window-11",
        "windows-10",
        "windows-desktop"
      ],
      "is_fork": false,
      "size_kb": 90471,
      "has_wiki": false,
      "homepage": "https://integration-automation.github.io/FrontEngine/",
      "languages": {
        "Python": 997215
      },
      "pushed_at": "2026-07-26T02:56:26Z",
      "created_at": "2023-04-30T07:06:20Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T02:56:30Z",
      "description": "FrontEngine software  that can use-define front end or only use like screen saver",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "JeffreyChen-SteamProjects",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/169593720?v=4",
      "created_at": "2024-05-12T12:41:06Z",
      "is_verified": null,
      "public_repos": 1,
      "account_age_days": 804
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.0.37",
          "kind": "patch",
          "published_at": "2026-07-26T02:56:44Z"
        },
        {
          "tag": "v1.0.36",
          "kind": "patch",
          "published_at": "2026-07-26T02:56:13Z"
        },
        {
          "tag": "v1.0.35",
          "kind": "patch",
          "published_at": "2026-07-26T02:55:46Z"
        },
        {
          "tag": "v1.0.34",
          "kind": "patch",
          "published_at": "2026-07-25T12:47:15Z"
        },
        {
          "tag": "v1.0.33",
          "kind": "patch",
          "published_at": "2026-07-25T12:33:08Z"
        },
        {
          "tag": "v1.0.32",
          "kind": "patch",
          "published_at": "2026-07-25T12:26:31Z"
        },
        {
          "tag": "v1.0.31",
          "kind": "patch",
          "published_at": "2026-07-25T12:25:54Z"
        },
        {
          "tag": "v1.0.30",
          "kind": "patch",
          "published_at": "2026-07-25T12:24:28Z"
        },
        {
          "tag": "v1.0.29",
          "kind": "patch",
          "published_at": "2026-07-25T09:30:44Z"
        },
        {
          "tag": "v1.0.28",
          "kind": "patch",
          "published_at": "2026-07-25T08:16:13Z"
        },
        {
          "tag": "v1.0.27",
          "kind": "patch",
          "published_at": "2026-07-25T07:26:28Z"
        },
        {
          "tag": "v1.0.26",
          "kind": "patch",
          "published_at": "2026-07-25T07:25:29Z"
        },
        {
          "tag": "v1.0.25",
          "kind": "patch",
          "published_at": "2026-07-24T21:49:31Z"
        },
        {
          "tag": "v1.0.24",
          "kind": "patch",
          "published_at": "2026-07-24T20:35:11Z"
        },
        {
          "tag": "v1.0.23",
          "kind": "patch",
          "published_at": "2026-07-24T18:29:24Z"
        },
        {
          "tag": "v1.0.22",
          "kind": "patch",
          "published_at": "2026-07-24T18:24:12Z"
        },
        {
          "tag": "v1.0.21",
          "kind": "patch",
          "published_at": "2026-07-24T18:19:01Z"
        },
        {
          "tag": "v1.0.20",
          "kind": "patch",
          "published_at": "2026-07-24T17:50:48Z"
        },
        {
          "tag": "v1.0.19",
          "kind": "patch",
          "published_at": "2026-07-24T17:45:54Z"
        },
        {
          "tag": "v1.0.18",
          "kind": "patch",
          "published_at": "2026-07-24T17:38:51Z"
        },
        {
          "tag": "v1.0.17",
          "kind": "patch",
          "published_at": "2026-07-24T17:29:29Z"
        },
        {
          "tag": "v1.0.16",
          "kind": "patch",
          "published_at": "2026-07-24T17:23:20Z"
        },
        {
          "tag": "v1.0.15",
          "kind": "patch",
          "published_at": "2026-07-24T17:17:17Z"
        },
        {
          "tag": "v1.0.14",
          "kind": "patch",
          "published_at": "2026-07-24T17:10:58Z"
        },
        {
          "tag": "v1.0.13",
          "kind": "patch",
          "published_at": "2026-07-24T16:34:39Z"
        },
        {
          "tag": "v1.0.12",
          "kind": "patch",
          "published_at": "2026-07-24T16:30:00Z"
        },
        {
          "tag": "v1.0.11",
          "kind": "patch",
          "published_at": "2026-07-24T13:06:04Z"
        },
        {
          "tag": "v1.0.10",
          "kind": "patch",
          "published_at": "2026-07-24T13:00:21Z"
        },
        {
          "tag": "v1.0.9",
          "kind": "patch",
          "published_at": "2026-07-24T12:35:53Z"
        },
        {
          "tag": "v1.0.8",
          "kind": "patch",
          "published_at": "2026-07-24T12:29:50Z"
        },
        {
          "tag": "v1.0.7",
          "kind": "patch",
          "published_at": "2026-07-24T12:23:51Z"
        },
        {
          "tag": "v1.0.6",
          "kind": "patch",
          "published_at": "2026-07-24T11:55:25Z"
        },
        {
          "tag": "v1.0.5",
          "kind": "patch",
          "published_at": "2026-07-24T11:43:01Z"
        },
        {
          "tag": "v1.0.4",
          "kind": "patch",
          "published_at": "2026-07-24T11:24:28Z"
        },
        {
          "tag": "v1.0.3",
          "kind": "patch",
          "published_at": "2026-07-24T10:59:44Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-07-24T10:33:51Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-07-24T10:11:21Z"
        },
        {
          "tag": "1.0.0",
          "kind": "major",
          "published_at": "2026-02-08T07:29:44Z"
        },
        {
          "tag": "0.0.61",
          "kind": "patch",
          "published_at": "2025-02-25T02:01:05Z"
        },
        {
          "tag": "0.0.60",
          "kind": "patch",
          "published_at": "2024-04-29T09:53:56Z"
        },
        {
          "tag": "0.0.58",
          "kind": "patch",
          "published_at": "2024-04-27T08:17:47Z"
        },
        {
          "tag": "v0.1",
          "kind": "other",
          "published_at": "2023-07-03T09:44:08Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2023-07-03T09:29:41Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2023-05-16T10:01:44Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2023-05-12T06:56:33Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2023-05-11T09:21:41Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2023-05-11T09:09:40Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2023-05-11T09:01:35Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2023-05-07T12:18:58Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2023-05-06T14:31:14Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2023-05-06T07:25:04Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "233433b87e3e83f689287ccbb9de10d26eb8b2be",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.37 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-26T02:56:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3089a578d3b44c3be4fdaaccd330d0d1b502838",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.36 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-26T02:55:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acaa1d8af1d01b3da55536617015b26a9a0c3943",
          "body": "Tools tab: colour picker, pixel ruler, region capture, window pinning and camera",
          "is_bot": false,
          "headline": "Merge pull request #171 from JeffreyChen-SteamProjects/feat/dev-tools",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-26T02:55:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92bf6fd83b2340f786011f28fc667fdd36d5417b",
          "body": "…idgets\n\nWidgets tab: audio spectrum, now playing, system monitor and sticky notes",
          "is_bot": false,
          "headline": "Merge pull request #170 from JeffreyChen-SteamProjects/feat/desktop-w…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-26T02:55:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2ac0ab60432698ea5ea6c3b969f6886b2099247",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.35 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-26T02:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1b51bffe02e1df8337637874a2125a264ded488",
          "body": "…-profiles\n\nSmart-pause rules, per-app profiles, custom reminders and quality tiers",
          "is_bot": false,
          "headline": "Merge pull request #169 from JeffreyChen-SteamProjects/feat/rules-and…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-26T02:55:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95bc3b66a802393d880734019cc05bc85cdce4eb",
          "body": "…mera\n\nThe measuring overlay covers a colour picker, a pixel ruler and a protractor;\nwhatever you measure is copied to the clipboard in the notation you choose.\nRegion capture dims the screen, grabs what you drag out, and refuses to save\noutside the folder you picked.\n\nWindow pinning keeps another p\n[…]\nprobe caught.\n\nThe camera overlay shows the local webcam in a circle, rounded box or\nrectangle. It is displayed locally and never recorded.\n\nREADME documents the new Widgets, Tools and Rules sections.",
          "is_bot": false,
          "headline": "Add a Tools tab: colour picker, ruler, capture, window pinning and ca…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T13:47:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "488c9658526a52ae73ee4e0379dfc2e6051c8ef5",
          "body": "…otes\n\nThe spectrum needs real samples to compute frequencies, so it captures the\nWASAPI loopback stream - unlike the pet and wallpaper, which read only the\noutput meter. Samples are FFT'd in memory, never written or sent, and capture\nstops with the overlay. The page and README say so plainly.\n\nNow \n[…]\nps a short history of CPU, RAM and disk and draws it as\nsparklines - an average hides a stall, a line does not. Sticky notes are\neditable cards that keep their text, colour and place between sessions.",
          "is_bot": false,
          "headline": "Add a Widgets tab: spectrum, now playing, system monitor and sticky n…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T13:36:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "054efa819d19b8a543cd3f484ac9d7510b7ee7eb",
          "body": "Smart pause now covers three rules instead of one: a fullscreen app, running\non battery, or a named app taking focus. The same foreground-app probe backs\nper-app profiles, which apply a saved preset when you switch to an app.\n\nCustom reminders (every N minutes, or daily at a set time) show as a toas\n[…]\nen care,\npresenting), so hide/lock/quality apply to them as well.\n\nAlso fixes two mismatched translation keys that rendered as None: the Chinese\nGIF error message and the English text-alignment label.",
          "is_bot": false,
          "headline": "Add smart-pause rules, app profiles, reminders and quality tiers",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T13:20:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "718a1ee0e1f287165b12d0f56dee6fddd6152b0d",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.34 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T12:46:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cc36a8aaa2ff5f0b81d5c8ac0433004337b2b38",
          "body": "…lpaper\n\nFocus dimming and masks, per-monitor audio-reactive wallpaper, Workshop import and opt-in plugins",
          "is_bot": false,
          "headline": "Merge pull request #168 from JeffreyChen-SteamProjects/feat/focus-wal…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:46:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d1842eb5d1de256141b5dcb79d59d0a182110c8",
          "body": "Drop the unused typing imports the focus and wallpaper pages carried, mark\nthe playlist shuffle RNG as non-security (it only picks the next wallpaper),\nand remove two unused imports the touched files had been carrying.",
          "is_bot": false,
          "headline": "Clear the static-analysis findings on the focus/wallpaper pages",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:44:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "391a25edd73156d9743e99760a9bbe6ea4ea72a3",
          "body": "Keep both sides of the additive page/menu/i18n changes so the wallpaper,\nfocus, screen care and presentation tabs are all registered. Rebuild\npreset_menu.py on main's version (it had been committed with CRLF, which\nmade the whole file conflict) and re-apply the Workshop import action.",
          "is_bot": false,
          "headline": "Merge origin/main into feat/focus-wallpaper",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:39:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d03234ea41d4cc53feb975c37049e8be5d35c79a",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.33 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T12:32:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbe28c7f57b352773152b12edc589d1b3ef8a508",
          "body": "…parity\n\nCross-platform idle/battery/window probes, autostart, session restore and low-power mode",
          "is_bot": false,
          "headline": "Merge pull request #166 from JeffreyChen-SteamProjects/feat/platform-…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:32:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0f0beba6c572d671c5457dcfb19b8dc779620d7",
          "body": "Both sides added tabs, settings keys and control-center buttons, so the\nconflicts were additive: every new setting and string from both branches is\nkept, and the control-center layout is renumbered so the lock, chroma key,\nreset-positions and low-power buttons all have their own row.\n\nOne real integ\n[…]\nde now also slows the dynamic text source\nthat landed on main, not just the marquee — which is what it was always meant\nto do; the source timer simply did not exist on this branch when it was written.",
          "is_bot": false,
          "headline": "Merge main into the platform branch",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:29:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "eaf948ef9ae5de0e86bc218b53e3682408c30b98",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.32 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T12:26:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84e82940ba8b91e343d1e736d718d322b208591a",
          "body": "Eye-care and presenting tabs: screen tint, reading ruler, eye breaks, annotation, cursor effects, keystrokes, magnifier",
          "is_bot": false,
          "headline": "Merge pull request #167 from JeffreyChen-SteamProjects/feat/screen-care",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:25:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d02e50b28e6e0e7e55936ca8d714e1bdfb472540",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.31 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T12:25:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "836496e00fe44a9186d7ebaedec39c7caaf4c34e",
          "body": "…nion\n\nPet focus timer, self-describing packs, speech, link fetching and opt-in AI chat",
          "is_bot": false,
          "headline": "Merge pull request #165 from JeffreyChen-SteamProjects/feat/pet-compa…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:25:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cbc143000e3628808412f76d9fc7601d01595ff9",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.30 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T12:24:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56dfc8ec367d88139bd56ee99cf9e63e5f65b839",
          "body": "…erlays\n\nLive text widgets, system and weather overlays, a web dashboard, and overlay lock/chroma/placement",
          "is_bot": false,
          "headline": "Merge pull request #164 from JeffreyChen-SteamProjects/feat/widget-ov…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:24:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3423bf3571b48d2a09007b14dd1292674813dbcd",
          "body": null,
          "is_bot": false,
          "headline": "Document the focus, wallpaper and community features",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:08:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "046b36dde116ebf2ecb8d45b6bb72b9f9d0d73ce",
          "body": null,
          "is_bot": false,
          "headline": "Drop imports the new modules stopped using",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T12:02:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c06b7691264faa771e0394af5fb5b8785e08125a",
          "body": "This project ships on Steam, so subscribed Workshop items already land on disk\nunder steamapps/workshop/content. Scanning that folder turns them into usable\ncontent: presets are imported, pet packs are listed with their paths, and items\nthat are neither are skipped rather than guessed at. Publishing\n[…]\nges and cannot be sandboxed, so loading is off by\ndefault, turning it on says exactly that in a warning, every load is logged,\nand one broken plugin is skipped rather than taking the app down with it.",
          "is_bot": false,
          "headline": "Import Workshop content, and let plugins add tabs when you ask for them",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T11:58:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f3045a6eb908dc974f14640f4ce218d484de680",
          "body": "Focus: one overlay dims everything except the window you are working in, the\nother covers a strip you keep glancing at — the taskbar, a notification corner.\nBoth pass clicks through, so what they cover still works; it just stops\ncompeting for attention. Off Windows the dimmer shades the whole screen\n[…]\n than adding a\nsecond audio path.\n\nThe geometry (what to dim around a window, which strip a region maps to) and\nthe playlist (rotation, shuffle, time-of-day sets) are pure and tested without\na screen.",
          "is_bot": false,
          "headline": "Add focus masks and a wallpaper tab",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T11:43:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c1490fbd545a1c3f7f98d885e2f377997e9362b",
          "body": "…agnifier\n\nFour tools people currently reach for separate utilities to get, all built on\nthe overlay stack that is already here.\n\nScreen annotation draws over everything with a pen, highlighter or eraser, with\nundo and clear — it is the one overlay that takes the mouse, and turning it off\nhands the \n[…]\nand mouse watching lives in its own service that degrades\nto a no-op without pynput, and every event crosses back to the UI thread as a\nqueued signal rather than touching widgets from pynput's thread.",
          "is_bot": false,
          "headline": "Add a presenting tab: annotation, cursor emphasis, keystrokes and a m…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T11:36:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aed68335c5e053290b5b0a01fb4d233d7d7e07d4",
          "body": "Three things people currently install separate utilities for, all of which are\nthe overlay this project already knows how to draw.\n\nA colour filter tints the whole screen at an adjustable strength — warm dimming\nfor late nights, other tints for visual stress — and Windows itself only added\nthis as a\n[…]\ny, then clears itself when the break is over.\n\nAll three pass clicks through, so they never block the work underneath, and the\nbreak reminder's schedule is a pure state machine with an injected clock.",
          "is_bot": false,
          "headline": "Add an eye-care tab: screen tint, reading ruler and eye breaks",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T11:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ac4c7c8fa7471db76693e664bb3ac5dadd806001",
          "body": "The probes named their executables without a path, so which binary ran depended\non PATH — something another program on the machine can influence. The macOS\ntools now run from their fixed system locations, and wmctrl is looked for in a\nshort list of absolute paths rather than resolved through PATH.",
          "is_bot": false,
          "headline": "Launch the platform probes by absolute path",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0fea06a292e36d47b5172ee1068082d74c623088",
          "body": "The allowlist held argv lists that were then passed through one shared\nsubprocess call, so every call site looked dynamic to a reader and to a\nscanner. Each probe now spells its own command out at the point it runs it, and\nthe allowlist maps a name to that function — same guarantee, visible in one\nplace instead of two.",
          "is_bot": false,
          "headline": "Give each probe its own literal command line",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:50:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a160fe72d12bf6d2e5d035c633e3ac266c471ee5",
          "body": "The pet decided what counted as a link by matching the literal scheme prefixes\non the front of the string. Parsing the URL instead is sturdier — it handles\nodd spacing and casing the same way the browser will — and keeps protocol\nliterals out of the source, which is what a scanner was objecting to.",
          "is_bot": false,
          "headline": "Recognise dropped links by parsing them, not by prefix",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:46:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f23d24a6f11871565b7a830112f9153b8d25d015",
          "body": "Two things a scanner was right to look at. The probe runner took an arbitrary\nargv, so nothing structurally stopped a future caller from putting user text on\na command line — it now takes a name and looks the fixed argv up in a table,\nrefusing anything else. And the plist builder pulled in the stdlib XML module\njust to escape three characters, which flags as XXE-prone parsing even though\nnothing here parses XML; a local escape does the same job with no parser.",
          "is_bot": false,
          "headline": "Run only allowlisted probes, and write plist XML without an XML parser",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:45:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc4f2f1480f28abddd72ca376b298433bd0bb5d8",
          "body": "…here it left off\n\nIdle detection, battery and standable windows were Windows-only, so the pet's\nnaps, low-battery warnings and window-perching silently did nothing everywhere\nelse. They now live in one platform module with real implementations per OS:\nctypes on Windows, XScreenSaver and /sys on Lin\n[…]\necond format.\n\nA low-power toggle in the control center slows every overlay's refresh rate\nthrough the same per-overlay walk as the other global switches, for when the\noverlays are running on battery.",
          "is_bot": false,
          "headline": "Make the desktop features work off Windows, and let the app pick up w…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:41:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a70354a8669702b089516859c9c8f05d7da16752",
          "body": "Five things the pet could not do. A focus timer (pure state machine: focus →\nbreak, long break every few rounds) that the pet announces phase by phase, so\nit keeps you company through a pomodoro instead of just wandering. Pet packs\ncan now ship a pet.json describing that pet's own speed, size, climb\n[…]\ne request runs on a background thread so the UI never\nwaits, and the whole feature disables itself quietly without a key or without\nthe anthropic package installed, which stays an optional dependency.",
          "is_bot": false,
          "headline": "Give the pet a focus timer, packs with a manifest, a voice and a mouth",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:33:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21ad298d20dfd31c3f4e244d27114e84109c78f4",
          "body": "Three things streamers kept having to work around: overlays always swallowed or\nalways passed clicks, there was no way to key them out in OBS, and an overlay\ncould only be placed by picking a monitor.\n\nOverlays can now be unlocked, dragged where you want them and locked again —\nlocked means click-th\n[…]\nnted. All three run through the control\ncenter's existing per-overlay walk, so every overlay type gets them at once,\nwith a global hotkey for the lock. The pet opts out: it needs the mouse either\nway.",
          "is_bot": false,
          "headline": "Lock, key and position overlays from one place",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:22:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc0c3df9f93485aabb0d9f226b5e7273aa0f7ccf",
          "body": "A web overlay could only show one page, so keeping several dashboards to hand\nmeant restarting the overlay each time.\n\nTake a list of URLs, open one overlay per line and show a single page at a\ntime, cycling with a button or the new global hotkey. Restarting rebuilds the\nset, closing one page drops it from the rotation, and the single-URL field is\nleft exactly as the user typed it.",
          "is_bot": false,
          "headline": "Add a web dashboard of overlay pages",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:15:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a43c22e1d6330629f5de64762a1908edf15cbc77",
          "body": "A text overlay could only show a fixed string, so the most common desktop\nwidgets — a clock, a countdown, system load, the weather — had no home.\n\nAdd dynamic text sources: clock and date (strftime), countdown (minutes, a\nclock time, or a date), stopwatch, system stats and weather. The source layer \n[…]\nng no dependency. Weather uses Open-Meteo's\nkey-free API over the standard library, sending only coordinates, fetching on a\nbackground thread and caching, so the paint loop never waits on the network.",
          "is_bot": false,
          "headline": "Turn the text overlay into a live widget",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T10:11:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3a8569f912029768d8b4148bd1c1034c4a7aa4a9",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.29 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T09:30:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eda2731de7fa075153c5daed429180390939f0aa",
          "body": "…ehaviours\n\nTag in every behaviour mode, and keep the nightly cron from disabling CI",
          "is_bot": false,
          "headline": "Merge pull request #163 from JeffreyChen-SteamProjects/feat/tag-all-b…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T09:30:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ba858ff8ac3bad116357f8320dcac50b9b4e524",
          "body": "GitHub disables workflows containing a schedule after ~60 days of repository\ninactivity, and that took the whole CI workflow down with it — push and pull\nrequest checks included, which went unnoticed until a PR had no CI at all.\n\nKeep CI on push/pull_request only and expose it via workflow_call, with the\ndaily cron in a thin Nightly workflow that calls it. If inactivity disables\nanything now, it is only the nightly run.",
          "is_bot": false,
          "headline": "Move the nightly schedule out of the CI workflow",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T08:58:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b64f9e625aca533504b7b754a88fa22c03967609",
          "body": "Tag steered pets through the floor-mode \"walk toward this x\" target, so pets in\nfree-wander or chase-cursor mode ignored the game entirely.\n\nGive PetMotion a guidance point that every behaviour honours: floor pets walk\ntoward its x as before, wanderers steer their velocity toward it while keeping\nth\n[…]\nno longer counts as catching the cursor, so\nthey do not fall asleep on top of each other. Tag roles now carry a 2D target\nand runners flee along the line away from \"it\" rather than only left or right.",
          "is_bot": false,
          "headline": "Let wandering and cursor-chasing pets play tag too",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T08:58:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "086ae60870ab47fea304fa9a7c2ab8e1df87a781",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.28 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T08:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5cb7cd8f4f4f3d8efbe96fd52f9bd2aaea70ccf",
          "body": "…and-tag\n\nPet food kinds, a game of tag, and repo coverage for the audio meter",
          "is_bot": false,
          "headline": "Merge pull request #162 from JeffreyChen-SteamProjects/feat/pet-food-…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T08:15:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7cc198db985459d7c58964c06a9aaf294797d3a",
          "body": null,
          "is_bot": false,
          "headline": "Document the food kinds and the pets' tag game",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:46:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d348efb69cb1ae5ec32e744f759198063622ffca",
          "body": "Several pets on screen only ever greeted each other. Add an opt-in game of tag:\none pet is \"it\" and walks toward its nearest peer while the others head the\nother way, and catching someone passes \"it\" on with a short cooldown so the tag\ncannot bounce straight back.\n\nThe rules live in a Qt-free PetTag\n[…]\nchasing whom instead of each pet deciding on its\nown tick. Pets are keyed by identity, so closing one cannot shift \"it\" onto a\ndifferent pet, and the game releases everyone once fewer than two remain.",
          "is_bot": false,
          "headline": "Let the pets play tag with each other",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:45:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de6c83ad2f6612bb1c3836bffd4a4b53035e5efd",
          "body": "Every dropped file fed the pet the same way. Guess a food kind from the suffix\ninstead: an archive is a feast that fills it up, music cheers it more than it\nfills, a document is a modest meal, and a binary is too hard to chew — it eats\na crumb and sulks. Each kind has its own reaction lines in English and\nTraditional Chinese, and right-click Feed still serves a plain snack.",
          "is_bot": false,
          "headline": "Give dropped food a flavour of its own",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:38:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa17d7004574cc428ecfac02cd18360cb2a905c2",
          "body": "The envelope, screen-to-endpoint matching and drop classification only had\nthrowaway coverage outside the repo, so nothing guarded them in CI. Move that\ninto tests/unit_test as hardware-free tests: envelope attack/decay/jitter\nbehaviour, endpoint name tokenising and screen matching, meter degradation for\nan unknown device, and what a dropped file is taken to be.",
          "is_bot": false,
          "headline": "Cover the audio meter and drop classification in the repo suite",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:36:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ef63dad540653cdd0301a02a301f2b94ee2280d",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.27 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T07:26:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d23ce4b6ee5bc6b8b1784549610ca847bc3fcfa9",
          "body": "Smooth, per-screen pet audio and drop-to-dress interactions",
          "is_bot": false,
          "headline": "Merge pull request #160 from JeffreyChen-SteamProjects/dev",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:25:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63d02fa998828ea1cc863450086e9cef3ad18393",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.26 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-25T07:25:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c60819a3c040d8432e10d04121d9383835f6a080",
          "body": "…-collection\n\nFix the test suite so pytest can run again",
          "is_bot": false,
          "headline": "Merge pull request #161 from JeffreyChen-SteamProjects/fix/test-suite…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:25:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe15f86db3cc05fe30c20b356b73ad31fafcd60f",
          "body": "Bandit flags every pytest assert (B101) and the seeded random used for\nreproducible fixtures (B311), and semgrep flags the dynamic import that walks\nthe package — all expected in test code, so they are noise rather than findings.",
          "is_bot": false,
          "headline": "Keep static analysis off the test suite",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:10:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11007d268c2d7039f4bb18c896f9218e4a5ec3a7",
          "body": "quick_test.py still imported ChatSceneUI, removed with the chat feature in\n7ace791, so `pytest tests/` died during collection and never ran anything.\nDrop that leftover and give the documented command real work to do: a public\nAPI guard that imports every module and checks every exported name (the s\n[…]\nn fixture forces Qt's offscreen platform and runs from a temp directory\nso the import-time log file stays out of the tree. CI now runs the suite, with\npytest added to the dev requirements it installs.",
          "is_bot": false,
          "headline": "Fix the test suite so pytest can run again",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T07:08:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "368d9a19099573e5b2704b8d886b5b657c106172",
          "body": "A screen attribute that raises was swallowed with a bare continue, hiding why a\npet fell back to the default audio endpoint.",
          "is_bot": false,
          "headline": "Log instead of silently skipping unreadable screen hints",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T06:31:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63f21fbf86d650333a208e1432fba8361cb96548",
          "body": "Dropping an image or a pet pack onto the pet now swaps its look on the spot;\nany other file is eaten as a snack. Drops also wake a sleeping pet, and an\nunusable path is ignored rather than half-applied.\n\nSprite loading now rejects images Qt cannot decode, so a corrupt file keeps the\ncurrent costume \n[…]\n an invisible pet behind. Adds the costume\nchatter lines and a hint on the settings page, plus a README section covering\nthe pet, its drop interactions and what the audio meter does and does not read.",
          "is_bot": false,
          "headline": "Dress or feed the pet by dropping a file on it",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T06:27:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1c2f92340da219967e870544081231eb0f72f943",
          "body": "On a multi-monitor desk each screen often carries its own speakers, so pulsing\nevery pet to the default endpoint is wrong for pets living elsewhere.\n\nTeach the meter to open a named endpoint as well as the default one, add\nendpoint enumeration (friendly names via IPropertyStore), and map a screen to\n[…]\nendpoint by the words its model/manufacturer shares with the endpoint name.\nMatching is a pure function so it can be tested without hardware; an unmatched\nscreen keeps using the default output device.",
          "is_bot": false,
          "headline": "Follow the audio endpoint of each pet's own screen",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T06:27:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7d60a28a2365497e0357048208439f4f88caf765",
          "body": "Raw WASAPI peak samples jitter frame to frame, so the audio-reactive pet\nflickered instead of breathing. Feed samples through a short RMS window and a\nfast-attack / slow-decay follower before mapping them to a pulse scale.\n\nThe envelope is a Qt-free module so it stays unit-testable, and it resets when\nthe level source disappears or the provider is swapped, so a pet never inherits\nthe loudness of a source it no longer listens to.",
          "is_bot": false,
          "headline": "Smooth the pet audio pulse with an RMS envelope",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T06:27:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9302196891143a6deddc1c7178aa739c546d601",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into dev",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-25T06:25:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a6eb5dff0d34180a031214df19aedbaba47b419",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.25 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T21:49:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28e060934c01c4383b6c3e1d5b5a70f001a65f99",
          "body": "…log-reminder\n\nDocs: session progress-log reminder in CLAUDE.md",
          "is_bot": false,
          "headline": "Merge pull request #159 from JeffreyChen-SteamProjects/docs/progress-…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T21:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffdbdfd88d95f0d1f63a12663cc049658b7e8d97",
          "body": "Point every session at .claude/PROGRESS.md (local, git-ignored) as a scratch record of in-flight work: read it before planning, keep it updated while working, and clear it once all listed items are done.",
          "is_bot": false,
          "headline": "Add session progress-log reminder to CLAUDE.md",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T21:47:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abfba720986e49d19fd0af1a5a5fe3722f81f743",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.24 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T20:34:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11d3370c5a9c6fcf6c7795d0df39d523c6f6085a",
          "body": "…-capture\n\nDesktop pet: real system audio level for the pulse (WASAPI peak meter)",
          "is_bot": false,
          "headline": "Merge pull request #158 from JeffreyChen-SteamProjects/feat/pet-audio…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T20:34:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95dc61be051601baf773ca44a71297c762dbd7d6",
          "body": "Bandit B110: replace the bare except/pass in SystemAudioMeter._release_all with a debug log so cleanup failures are traceable while still not aborting the release loop.",
          "is_bot": false,
          "headline": "Log instead of silently swallowing COM release failures",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T20:33:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05c2acc17d999516865e8cfca1ac7c856bd74238",
          "body": "When 'React to audio' is enabled, spawned pets use system_audio_level as their level provider, so the pulse follows real system output volume.",
          "is_bot": false,
          "headline": "Drive pet audio pulse from the real system meter",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T20:29:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab4fa30a7045f5e331cc25b597a65616bfbbb731",
          "body": "SystemAudioMeter reads the default output device's peak value via IAudioMeterInformation::GetPeakValue (raw ctypes COM, no new dependency). It only reads a meter level (0..1) - it does not capture or record audio content. Windows only; any failure degrades to None. system_audio_level() exposes a lazily-created singleton.",
          "is_bot": false,
          "headline": "Add WASAPI system output peak meter",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T20:29:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f6d95b314fe03d46a003d5c01311b2207f4e4fa",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.23 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T18:29:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e93ad75570dfe4d3d85aeab2c86ae09b51e94beb",
          "body": "Desktop pet: audio-reactive pulse (audio visualization)",
          "is_bot": false,
          "headline": "Merge pull request #157 from JeffreyChen-SteamProjects/feat/pet-audioviz",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:28:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9da209c8b58612baf0dc1867917cc9f56ff36834",
          "body": null,
          "is_bot": false,
          "headline": "Add pet 'React to audio' toggle",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7dc97af165ee7c02f7f43072fe9e88e62ba9a20",
          "body": "With 'React to audio' on and a level provider set, the pet breathes/pulses with the audio level (audio_pulse_scale maps 0..1 to a bottom-anchored draw scale, so its feet stay put). The level source is pluggable via set_audio_level_provider and defaults to none (no effect); audio_pulse_scale is pure and unit-tested.",
          "is_bot": false,
          "headline": "Add audio-reactive pulse to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce550de3b797e1a8606cad618b413014a89a6bc2",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.22 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T18:23:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c159f8e8159d95ba8dea74818ada4cc3efd023a7",
          "body": "Desktop pet: scene timeline of scheduled actions",
          "is_bot": false,
          "headline": "Merge pull request #156 from JeffreyChen-SteamProjects/feat/pet-timeline",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:23:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10e6823fd28e552e0e146aa54d29f51b51b9359e",
          "body": "PetTimeline fires scheduled actions (say / sleep / wake / feed / status / behaviour) at time offsets; configured via user settings (pet_timeline) or set_timeline. PetTimeline/parse_timeline are pure and the dispatch is unit-tested with an injected clock.",
          "is_bot": false,
          "headline": "Add scene timeline to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:21:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7aa4790527294a0aad2b73804af112d568a6d37",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.21 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T18:18:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f59ef68dd55524a803291a4cb96a7aea6a35f369",
          "body": "…creen\n\nDesktop pet: target monitor + sound volume (per-screen)",
          "is_bot": false,
          "headline": "Merge pull request #155 from JeffreyChen-SteamProjects/feat/pet-per-s…",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:18:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "905f0f943a74870d0090adfffd3d9ae902624c7f",
          "body": "The pet page can spawn a pet on a chosen monitor (reusing the target-monitor combobox) and set its sound volume; both persist in presets.",
          "is_bot": false,
          "headline": "Add pet target-monitor and volume selectors",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:16:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54128d942ae98814d709c199a7f615b2cdb44c35",
          "body": "The pet's interaction sound honours a volume (0..1) applied to its QSoundEffect.",
          "is_bot": false,
          "headline": "Add sound volume to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T18:16:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f679fa77c24f0c6575d5599560db08284a70f825",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.20 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:50:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25d99f81227707583bf6b7176226a6688c3d0c82",
          "body": "Desktop pet: drop against a screen edge to grab the wall",
          "is_bot": false,
          "headline": "Merge pull request #154 from JeffreyChen-SteamProjects/feat/pet-grab",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:50:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b901846813d2ce96d492c925335058e86b088bac",
          "body": "On a drag-release near the left/right screen edge the pet grabs that wall and climbs it instead of being flung; PetMotion.grab_nearest_wall is pure and unit-tested.",
          "is_bot": false,
          "headline": "Grab the wall when a pet is dropped against a screen edge",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:48:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3e637d6f680eb1caf756af78ec0ddcb6142d1fb",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.19 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:45:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be5caad0585e12334ddbd37e2396e104f469798",
          "body": "Desktop pet: right-click Status readout (level / mood / fullness)",
          "is_bot": false,
          "headline": "Merge pull request #153 from JeffreyChen-SteamProjects/feat/pet-status",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "223fefd8653a9c860ae396a64b1744f66fe68b64",
          "body": null,
          "is_bot": false,
          "headline": "Add pet status/state labels",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:42:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e72a538e9a5f0fea1fe24fda05b772b0f32c920",
          "body": "Right-click 'Status' shows a bubble with the pet's level, mood and fullness. format_status is a pure, localizable formatter and is unit-tested.",
          "is_bot": false,
          "headline": "Add status readout to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:42:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56d81deacb91515901d719832d88fa76fecda948",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.18 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:38:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f8644c200946ac3491b7aa3914d5f5347f322ea",
          "body": "Desktop pet: pet grows bigger as it levels up",
          "is_bot": false,
          "headline": "Merge pull request #152 from JeffreyChen-SteamProjects/feat/pet-size",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:38:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd7b57eb562573ba2b3075bc022bd398f3044d30",
          "body": "size_for_level scales the base sprite size by the affection level (+8%/level, capped +50%); the pet spawns at its persisted level's size and grows live when it levels up (motion re-grounds on the next step).",
          "is_bot": false,
          "headline": "Grow the desktop pet's size with its level",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:36:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d8096022b7d8eb98dd15dfc19159de3a40bf882",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.17 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:29:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16f1b825c17261dbd00138defb8fcfb3351c4a43",
          "body": "Desktop pet: affection / growth (level up by caring for it)",
          "is_bot": false,
          "headline": "Merge pull request #151 from JeffreyChen-SteamProjects/feat/pet-growth",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:29:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a060f946d9c42f9d1e982e742d4ff4c38d9a3118",
          "body": null,
          "is_bot": false,
          "headline": "Persist pet affection and add level-up lines",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:27:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28741892176735f7d0d9405c6c2b8694b19398da",
          "body": "Interactions build affection (petting +2, feeding +5, greeting a peer +3); crossing a threshold levels the pet up and it celebrates with a level-up line. PetGrowth is pure and unit-tested; affection persists in user settings.",
          "is_bot": false,
          "headline": "Add affection/growth system to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:27:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d2e4e948663ee50548c36327d5fe8d5fa9dfe3f",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.16 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:23:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6335d40c35ceb5975e01977998547af7689350e7",
          "body": "Desktop pet: idle reaction (naps when you're away)",
          "is_bot": false,
          "headline": "Merge pull request #150 from JeffreyChen-SteamProjects/feat/pet-idle",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:22:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3675e2af5cf7becf5228156194ab8bf925aeeeca",
          "body": null,
          "is_bot": false,
          "headline": "Add pet idle/away chatter lines",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fecc56ea239421fbe88111c54b4d8ddfa43fa84d",
          "body": "When the user has been idle past a threshold the pet naps (PetMotion.sleep) and, if chatter is on, says an 'away' line once; it wakes when the user returns. idle_seconds() reads the Windows last-input time (guarded); the reaction is unit-tested via an injected idle provider.",
          "is_bot": false,
          "headline": "Add idle reaction to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:21:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "083b42f791964e9659eecf32954df1cab208a352",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.15 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:16:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81d8a702f5e269524cb5c65396933b127f978105",
          "body": "Desktop pet: feeding / hunger system",
          "is_bot": false,
          "headline": "Merge pull request #149 from JeffreyChen-SteamProjects/feat/pet-hunger",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:16:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db053fa70c5b8f4be3823586fe184e3cc2a186e1",
          "body": null,
          "is_bot": false,
          "headline": "Persist pet hunger and add feed/hungry/fed lines",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:14:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5ca3df7307a63bc56c7d864d9a6c68f766d7b97",
          "body": "PetHunger (0..100) decays over time; a right-click Feed refills it and cheers the pet (mood up), which then thanks you. When hungry it asks for a snack once (hysteresis), after low battery in priority. Hunger persists in user settings.",
          "is_bot": false,
          "headline": "Add feeding/hunger system to desktop pet",
          "author_name": "JeffreyChen",
          "author_login": "JE-Chen",
          "committed_at": "2026-07-24T17:14:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81c2d05a5d8ff80b77e2bafc3440c3f2cca35610",
          "body": null,
          "is_bot": true,
          "headline": "Bump version to 1.0.14 [skip ci]",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-24T17:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 51,
      "commits_last_year": 191,
      "latest_release_at": "2026-07-26T02:56:44Z",
      "latest_release_tag": "v1.0.37",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "frontengine_dev",
          "exists": true,
          "license": null,
          "keywords": [
            "Development Status :: 2 - Pre-Alpha",
            "Environment :: MacOS X",
            "Environment :: Win32 (MS Windows)",
            "Environment :: X11 Applications",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3.10"
          ],
          "ecosystem": "pypi",
          "matches_repo": false,
          "registry_url": "https://pypi.org/project/frontengine_dev/",
          "is_deprecated": false,
          "latest_version": "1.0.0",
          "repository_url": "https://github.com/Intergration-Automation-Testing/FrontEngine",
          "versions_count": 96,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 463,
          "first_published_at": "2023-05-06T07:17:06.425990Z",
          "latest_published_at": "2026-02-08T06:35:02.100575Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 167
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 9,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "docs/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 79703,
      "source_files_sampled": 241,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 5232
    },
    "dependencies": {
      "manifests": [
        "docs/requirements.txt",
        "pyproject.toml",
        "requirements.txt"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 7,
        "malicious_count": 0,
        "assessed_package": "pypi:frontengine_dev@1.0.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "PySide6",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "==6.10.2"
        },
        {
          "name": "qt-material",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "PyOpenGL",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "PyOpenGL_accelerate",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "pynput",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "numpy",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pynput",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyopengl",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyopengl-accelerate",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pyside6",
            "direct": true,
            "version": "6.10.2",
            "ecosystem": "pypi"
          },
          {
            "name": "pyside6",
            "direct": true,
            "version": "6.8.2.1",
            "ecosystem": "pypi"
          },
          {
            "name": "qt-material",
            "direct": true,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "auto-py-to-exe",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "build",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "frontengine",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "pytest",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "setuptools",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "sphinx-rtd-theme",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          },
          {
            "name": "twine",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 14,
        "direct_count": 7,
        "indirect_count": 7
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 150,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 18,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 2,
      "top_contributors": [
        {
          "type": "User",
          "login": "JE-Chen",
          "commits": 501,
          "avatar_url": "https://avatars.githubusercontent.com/u/33644111?v=4"
        },
        {
          "type": "User",
          "login": "JE-Chen45",
          "commits": 22,
          "avatar_url": "https://avatars.githubusercontent.com/u/64821850?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.958
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "nightly.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T02:56:33Z",
      "oldest_open_prs": [
        {
          "number": 134,
          "created_at": "2026-05-13T15:31:02Z",
          "last_comment_at": "2026-05-13T15:34:17Z",
          "last_comment_author": "codacy-production"
        }
      ],
      "last_merged_pr_at": "2026-07-26T02:55:50Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/JeffreyChen-SteamProjects/FrontEngine",
    "host": "github.com",
    "name": "FrontEngine",
    "owner": "JeffreyChen-SteamProjects"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 40,
        "vitality": 79,
        "community": 41,
        "governance": 48,
        "engineering": 72
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "commits_last_year": 191,
              "human_commit_share": 0.76,
              "days_since_last_push": 0,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "191 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 191
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "releases_count": 51,
              "latest_release_tag": "v1.0.37",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "51 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 41,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "forks": 0,
              "stars": 9,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "9 stars",
                "points": 14.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "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": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": 14,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.958
            },
            "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 96% of commits",
                "points": 0.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 96
                    }
                  }
                ],
                "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "merged_prs": 150,
              "open_issues": 0,
              "closed_issues": 18,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "150/152 decided PRs merged",
                "points": 37.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 150,
                      "decided": 152
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "JeffreyChen-SteamProjects",
              "public_repos": 1,
              "account_age_days": 804
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of JeffreyChen-SteamProjects",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "JeffreyChen-SteamProjects"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "1 public repos, account ~2 yr old",
                "points": 6.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 1
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 72,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "dynamic-desktop",
                "dynamics",
                "live-wallpaper",
                "python3",
                "wallpaper",
                "wallpaper-engine",
                "wallpaperengine",
                "wallpapers",
                "widgets",
                "window-11",
                "windows-10",
                "windows-desktop"
              ],
              "has_wiki": false,
              "homepage": "https://integration-automation.github.io/FrontEngine/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://integration-automation.github.io/FrontEngine/",
                "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": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": 40,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [],
              "manifests": [
                "docs/requirements.txt",
                "pyproject.toml",
                "requirements.txt"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": false,
              "has_dependabot_config": true
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:frontengine_dev@1.0.0 runtime dependency closure — what installing the published package pulls in — 7 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:frontengine_dev@1.0.0",
                  "assessed": 7
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 7,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 7,
              "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": 2
            },
            "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.882,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 5232
            },
            "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": "67 of 76 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 76
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "docs/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "docs/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "docs/Makefile"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "dependency automation configured, none observed in the sampled commits",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "dependency_bot_config_only",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 79703,
              "source_files_sampled": 241,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/241 source files over 60KB",
                "points": 54.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 241,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "pypi package 'frontengine_dev' points at a different repository (https://github.com/Intergration-Automation-Testing/FrontEngine); excluded from ecosystem scoring",
    "OpenSSF Scorecard did not return a usable result (2026/07/26 02:56:53 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-26T02:57:29.908631Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/JeffreyChen-SteamProjects/FrontEngine.svg",
  "full_name": "JeffreyChen-SteamProjects/FrontEngine",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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