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

chinedufn / swift-bridge

swift-bridge facilitates Rust and Swift interop.

RustApache-2.0★ 1,119 星标⑂ 77 复刻始于 2021年11月在 GitHub 上查看 ↗

chinedufn/swift-bridge 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是Community & Adoption(66/100),最低的是Vitality(39/100)。 最近一次更新在 200 天前。 近期的大部分工作由 1 位贡献者完成。

55
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

539 关注者106 个公开仓库始于 2012年8月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
crates.ioswift-bridge0.1.5955,77660200 天前bindingsffiiosmacswift

按类别列示的指标

活力

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

39存在风险 · 占总体的 22%
评分方式
3.6/36推送新近度 — 最近一次推送于 200 天前
4.8/36提交节奏 — 52 周中有 7 周有提交
10.8/18提交量 — 最近一年 15 次提交
0/10OpenSSF Scorecard:Maintained — 0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0
所用输入
commits_last_year15
human_commit_share1
days_since_last_push200
active_weeks_last_year7

发布纪律

70良好
评分方式
27/27有发布版本 — 已发布 42 个发布版本
16.2/36发布时效 — 最近一次发布版本于 200 天前
19.8/27发布节奏 — 约每 116.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count42
latest_release_tag0.1.59
releases_from_tags
days_since_latest_release200
mean_days_between_releases116.7
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

66中等 · 占总体的 18%
评分方式
49.4/60星标 — 1,119 个星标
15.7/25复刻 — 77 个复刻
6/15关注者 — 13 位关注者
所用输入
forks77
stars1,119
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
63.3/80月度下载量 — crates 合计每月 55,776 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesswift-bridge
dependents
ecosystemscrates
total_downloads1,909,127
monthly_downloads55,776
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

60中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.3/22.5提交分布 — 头号贡献者编写了 81% 的提交
13.5/13.5贡献者广度 — 33 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled33
top_contributor_share0.811
评分方式
24.4/46.8议题解决 — 52% 的议题已关闭
36/38.3PR 接受 — 已裁定的 PR 中 159/169 已合并
6/15OpenSSF Scorecard:Code-Review — Found 13/30 approved changesets -- score normalized to 4
所用输入
merged_prs159
open_issues92
closed_issues100
issue_closed_ratio0.521
closed_unmerged_prs10
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
19.6/25所有者影响力 — chinedufn 有 539 位关注者
25/25既往记录 — 106 个公开仓库,账户约 13 年
所用输入
followers539
owner_typeUser
is_verified
owner_loginchinedufn
public_repos106
account_age_days5,101
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — crates 上有 1 个软件包
26/35发布时效 — 最近一次发布于 200 天前
20/20版本历史 — 60 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesswift-bridge
ecosystemscrates
any_deprecated
min_days_since_publish200

工程质量

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

64中等 · 占总体的 20%

工程实践

56中等
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
8/20OpenSSF Scorecard:CI-Tests — 9 out of 22 merged PRs checked by a CI test -- score normalized to 4
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

75良好
评分方式
30/30README
0/25文档目录
15/15文档 / 主页站点 — https://chinedufn.github.io/swift-bridge
10/10仓库描述
10/10主题标签 — 5 个主题标签
10/10Wiki
所用输入
topicsrust, swift, ffi, interop, ios
has_wiki
homepagehttps://chinedufn.github.io/swift-bridge
has_readme
has_docs_dir
has_description

安全

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

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

安全态势

34存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1/2.5CI-Tests — 9 out of 22 merged PRs checked by a CI test -- score normalized to 4
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 13/30 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — 0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3.4
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages24
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 crates:swift-bridge@0.1.59 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 24 个软件包。 未对可达性进行分析。

AI 就绪度

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

51中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 79 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.79
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — Cargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Rust(静态类型)
0/10可复现环境
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsCargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml, crates/swift-bridge-build/Cargo.toml, crates/swift-bridge-cli/Cargo.toml, crates/swift-bridge-ir/Cargo.toml, crates/swift-bridge-macro/Cargo.toml, crates/swift-integration-tests/Cargo.toml, examples/async-functions/Cargo.toml, examples/codegen-visualizer/Cargo.toml, examples/multiple-bridge-modules/Cargo.toml, examples/rust-binary-calls-swift-package/Cargo.toml, examples/without-a-bridge-module/Cargo.toml
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Rust(静态类型)
54.5/55可控的文件大小 — 采样的 241 个源文件中有 2 个超过 60KB
所用输入
primary_languageRust
largest_source_bytes79,752
source_files_sampled241
oversized_source_files2

机器可读接口

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

关键数据

1,119GitHub 星标
33贡献者
15最近 12 个月提交数
200距最近推送天数
42发布版本数
1巴士系数(bus factor)
92开放议题
crates.io软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 0 ★ / 77 ⇿
0Star
77Fork
42发布

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

0204060807632021-122024-032026-07
主版本 0次版本 0修订 42

每个点涵盖 5 天。

OpenSSF Scorecard 3.4 / 10
3.4综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
4CI-Tests9 out of 22 merged PRs checked by a CI test -- score normalized to 4
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 13/30 approved changesets -- score normalized to 4
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 3
注册表软件包版本约束清单文件
crates.ioswift-bridge-macro0.1.59Cargo.toml
crates.iotokio1Cargo.toml
crates.ioonce_cell1.9Cargo.toml
全部依赖 13

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

注册表软件包版本关系
crates.ioonce_cell直接
crates.ioswift-bridge-macro直接
crates.iotokio直接
crates.ioclap间接
crates.iocrossbeam-channel间接
crates.ioproc-macro2间接
crates.ioquote间接
crates.ioreqwest间接
crates.ioswift-bridge-build间接
crates.ioswift-bridge-ir间接
crates.iosyn间接
crates.iotempfile间接
crates.iotrybuild间接
依赖安全公告 0

安装 crates:swift-bridge@0.1.59 会引入 24 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

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

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "rust",
        "swift",
        "ffi",
        "interop",
        "ios"
      ],
      "is_fork": false,
      "size_kb": 7239,
      "has_wiki": true,
      "homepage": "https://chinedufn.github.io/swift-bridge",
      "languages": {
        "C": 1310,
        "Rust": 1234454,
        "Shell": 3321,
        "Swift": 102500
      },
      "pushed_at": "2026-01-06T09:04:46Z",
      "created_at": "2021-11-14T04:24:28Z",
      "owner_type": "User",
      "updated_at": "2026-07-18T12:28:55Z",
      "description": "swift-bridge facilitates Rust and Swift interop.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "master",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Rust",
      "significant_languages": [
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://chinedufn.com",
      "name": "Chinedu Francis Nwafili",
      "type": "User",
      "login": "chinedufn",
      "company": null,
      "location": "New Jersey",
      "followers": 539,
      "avatar_url": "https://avatars.githubusercontent.com/u/2099811?v=4",
      "created_at": "2012-08-05T21:09:44Z",
      "is_verified": null,
      "public_repos": 106,
      "account_age_days": 5101
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "0.1.59",
          "kind": "patch",
          "published_at": "2026-01-06T09:04:46Z"
        },
        {
          "tag": "0.1.58",
          "kind": "patch",
          "published_at": "2025-12-06T16:06:29Z"
        },
        {
          "tag": "0.1.57",
          "kind": "patch",
          "published_at": "2024-08-15T13:36:22Z"
        },
        {
          "tag": "0.1.56",
          "kind": "patch",
          "published_at": "2024-08-08T09:34:25Z"
        },
        {
          "tag": "0.1.55",
          "kind": "patch",
          "published_at": "2024-04-29T03:20:16Z"
        },
        {
          "tag": "0.1.54",
          "kind": "patch",
          "published_at": "2024-04-28T17:52:24Z"
        },
        {
          "tag": "0.1.53",
          "kind": "patch",
          "published_at": "2024-03-26T00:39:25Z"
        },
        {
          "tag": "0.1.52",
          "kind": "patch",
          "published_at": "2023-07-10T12:14:46Z"
        },
        {
          "tag": "0.1.51",
          "kind": "patch",
          "published_at": "2023-02-28T01:13:22Z"
        },
        {
          "tag": "0.1.50",
          "kind": "patch",
          "published_at": "2023-02-20T18:06:23Z"
        },
        {
          "tag": "0.1.49",
          "kind": "patch",
          "published_at": "2023-02-09T12:28:10Z"
        },
        {
          "tag": "0.1.48",
          "kind": "patch",
          "published_at": "2023-01-29T19:37:47Z"
        },
        {
          "tag": "0.1.47",
          "kind": "patch",
          "published_at": "2023-01-25T01:53:02Z"
        },
        {
          "tag": "0.1.46",
          "kind": "patch",
          "published_at": "2023-01-19T16:26:39Z"
        },
        {
          "tag": "0.1.45",
          "kind": "patch",
          "published_at": "2023-01-12T13:47:37Z"
        },
        {
          "tag": "0.1.44",
          "kind": "patch",
          "published_at": "2022-12-15T21:19:14Z"
        },
        {
          "tag": "0.1.43",
          "kind": "patch",
          "published_at": "2022-12-15T17:29:22Z"
        },
        {
          "tag": "0.1.42",
          "kind": "patch",
          "published_at": "2022-12-15T02:12:36Z"
        },
        {
          "tag": "0.1.41",
          "kind": "patch",
          "published_at": "2022-10-28T19:38:24Z"
        },
        {
          "tag": "0.1.40",
          "kind": "patch",
          "published_at": "2022-10-03T21:51:47Z"
        },
        {
          "tag": "0.1.39",
          "kind": "patch",
          "published_at": "2022-10-02T11:14:46Z"
        },
        {
          "tag": "0.1.38",
          "kind": "patch",
          "published_at": "2022-09-20T23:32:50Z"
        },
        {
          "tag": "0.1.37",
          "kind": "patch",
          "published_at": "2022-09-15T16:31:15Z"
        },
        {
          "tag": "0.1.36",
          "kind": "patch",
          "published_at": "2022-08-23T17:14:30Z"
        },
        {
          "tag": "0.1.35",
          "kind": "patch",
          "published_at": "2022-07-27T03:25:47Z"
        },
        {
          "tag": "0.1.34",
          "kind": "patch",
          "published_at": "2022-06-06T20:15:45Z"
        },
        {
          "tag": "0.1.33",
          "kind": "patch",
          "published_at": "2022-05-10T22:39:52Z"
        },
        {
          "tag": "0.1.32",
          "kind": "patch",
          "published_at": "2022-04-24T04:31:18Z"
        },
        {
          "tag": "0.1.31",
          "kind": "patch",
          "published_at": "2022-04-21T12:23:45Z"
        },
        {
          "tag": "0.1.30",
          "kind": "patch",
          "published_at": "2022-04-20T01:55:03Z"
        },
        {
          "tag": "0.1.29",
          "kind": "patch",
          "published_at": "2022-03-12T15:18:27Z"
        },
        {
          "tag": "0.1.28",
          "kind": "patch",
          "published_at": "2022-02-17T02:22:59Z"
        },
        {
          "tag": "0.1.27",
          "kind": "patch",
          "published_at": "2022-02-09T01:05:41Z"
        },
        {
          "tag": "0.1.26",
          "kind": "patch",
          "published_at": "2022-02-02T15:49:36Z"
        },
        {
          "tag": "0.1.25",
          "kind": "patch",
          "published_at": "2022-01-28T20:39:24Z"
        },
        {
          "tag": "0.1.24",
          "kind": "patch",
          "published_at": "2022-01-26T13:19:13Z"
        },
        {
          "tag": "0.1.23",
          "kind": "patch",
          "published_at": "2022-01-25T12:56:45Z"
        },
        {
          "tag": "0.1.22",
          "kind": "patch",
          "published_at": "2022-01-25T01:35:25Z"
        },
        {
          "tag": "0.1.21",
          "kind": "patch",
          "published_at": "2022-01-24T21:03:39Z"
        },
        {
          "tag": "0.1.20",
          "kind": "patch",
          "published_at": "2022-01-22T19:56:11Z"
        },
        {
          "tag": "0.1.19",
          "kind": "patch",
          "published_at": "2022-01-17T11:49:36Z"
        },
        {
          "tag": "v0.1.18",
          "kind": "patch",
          "published_at": "2022-01-17T09:29:43Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e527dc7454bebbfab537d842990bf3a1672e676c",
          "body": null,
          "is_bot": false,
          "headline": "0.1.59",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2026-01-06T09:00:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea55b2a5a25e6e05ea25505d2890d09d79457c89",
          "body": "Add Swift 6 strict concurrency compatibility for generated async function code\nAdd `@MainActor` to test classes using XCTContext.runActivity\nAdd CI matrix to test with both Swift 5.0 and Swift 6.0",
          "is_bot": false,
          "headline": "Add Swift 6 compatibility for async function code generation (#362)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2026-01-06T08:49:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82b08851a9a6ebeed8fd6084f1a41176d904fae5",
          "body": "Just cosmetic fix. It removes warning of non-camel case type.\n\n<img width=\"845\" height=\"310\" alt=\"image\" src=\"https://github.com/user-attachments/assets/34189676-cb3c-4fd5-b4cd-e7e361308a0c\" />",
          "is_bot": false,
          "headline": "Fix non camel case warning ffi types (#361)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-19T15:05:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b80238fd55e9ffedfabfafb134bd93b1920ff7f6",
          "body": "Adds support for Option<String> fields in shared structs.\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n    #[swift_bridge(swift_repr = \"struct\")]\n    struct UserProfile {\n        name: String,\n        bio: Option<String>,  // Now supported!\n    }\n\n    extern \"Rust\" {\n        fn cre\n[…]\nNone value  \nlet profileWithoutBio = UserProfile(\n    name: \"Bob\".intoRustString(),\n    bio: nil\n)\n\n// Access optional field\nif let bio = profileWithBio.bio {\n    print(\"Bio: \\(bio.toString())\")\n}\n```",
          "is_bot": false,
          "headline": "Support `Option<String>` fields in shared structs (#354)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-08T12:59:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "69bda0e98df3d8df67bb9367e979ad7d96d230d4",
          "body": "- Add support for calling async Swift functions that throw errors from Rust and return void\n- Swift throwing functions are mapped to Rust Result<(), E> return type\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n    enum SwiftError {\n        SomeError,\n    }\n\n    extern \"Swift\" {\n    \n[…]\n: Bool) -> Result<(), SwiftError>;\n    }\n}\n```\n\n```swift\n// swift\nfunc swift_throwing_function_void(succeed: Bool) throws(SwiftError) {\n    if !succeed {\n        throw SwiftError.SomeError\n    }\n}\n```",
          "is_bot": false,
          "headline": "Support Rust calls Swift async throwing function (#348)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-08T11:50:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aee3e37e2990a252aea234ed5734165afc32df6e",
          "body": null,
          "is_bot": false,
          "headline": "0.1.58",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-12-08T11:50:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81e1aa0b83aa89c2b615ff32ae0a3558930b3850",
          "body": "This commit makes the README's example demonstrate support of Rust\ncalling an async Swift function.",
          "is_bot": false,
          "headline": "Add async function demo to README",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-12-07T10:50:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d764dacf2a7ffec52e34edb3aa9e858b46cc397",
          "body": "Adds #[swift_bridge(label = \"...\")] attribute for swift function parameters (fixes #337)\n\n## Example:\n\n```rust\n// rust\nextern \"Swift\" {\n    fn swift_func_with_unlabeled_params(\n        #[swift_bridge(label = \"_\")] a: i32,\n        #[swift_bridge(label = \"_\")] b: i32,\n    ) -> i32;\n\n    fn swift_func_\n[…]\nswift\nfunc swift_func_with_unlabeled_params(_ a: Int32, _ b: Int32) -> Int32 {\n    return a + b\n}\n\nfunc swift_func_with_custom_labels(first a: Int32, second b: Int32) -> Int32 {\n    return a + b\n}\n```",
          "is_bot": false,
          "headline": "Support Swift function argument labels (#349)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-06T15:25:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "15062f374b1cc85b8c8ab5da3b70cf2e0bd53a63",
          "body": "- Add support for calling synchronous Swift functions that throw errors from Rust\n- Swift throwing functions are mapped to Rust Result<T, E> return types (T = void also supported)\n\n## Example\n\n```rust\n// rust\n#[swift_bridge::bridge]\nmod ffi {\n    enum SwiftError {\n        SomeError,\n    }\n\n    exter\n[…]\neturn 42\n    } else {\n        throw SwiftError.SomeError\n    }\n}\n\nfunc swift_throwing_function_void(succeed: Bool) throws(SwiftError) {\n    if !succeed {\n        throw SwiftError.SomeError\n    }\n}\n```",
          "is_bot": false,
          "headline": "Support call Swift throwing function from Rust (#347)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-05T00:31:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f69a5e633a12094a309cc959168e144c5c68841f",
          "body": "This enables Rust code to call async Swift functions declared in\nextern \"Swift\" blocks (fixes #345). The implementation uses a callback-based\napproach where:\n\n- Rust generates an async wrapper that creates a oneshot channel\n- Swift wraps the call in Task { } and invokes callbacks on completion\n- Sup\n[…]\nror {}\n\nfunc fetch_count() async -> UInt32 {\n    return 42\n}\n\nfunc fetch_data(succeed: Bool) async throws(FetchError) -> UInt32 {\n    if !succeed { throw FetchError.NetworkError }\n    return 123\n}\n```",
          "is_bot": false,
          "headline": "Support call async Swift function from Rust (#346)",
          "author_name": "Vladimir Pankratov",
          "author_login": "Choochmeque",
          "committed_at": "2025-12-01T21:23:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09171dcad46d7f55a1eb823ee4e6fa679dbdea07",
          "body": "This commit fixes #334, adding support for generating a Hashable conformance for Copy types.\n\nFor example, the following is now possible:\n\n```rust\nextern \"Rust\" {\n    #[swift_bridge(Copy(8), Equatable, Hashable)]\n    type T;\n}\n```",
          "is_bot": false,
          "headline": "Generate Hashable conformance for Copy types (#339)",
          "author_name": "Jonathan Tanner",
          "author_login": "aDifferentJT",
          "committed_at": "2025-10-26T14:32:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93da216d126987bb89cea8765dab0934a33d9955",
          "body": "This commit adds documentation to the internal book explaining why pull\nrequests should not simply link to existing issues.\n\nThe pull request must also include enough information for a maintainer\nto understand the change while working offline.",
          "is_bot": false,
          "headline": "Clarify why linking to issues is not enough (#343)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-10-11T23:43:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36193c8a8fe68586b328c3e5b9dc9d6e401271a3",
          "body": "This commit adds documentation explaining our expectations of pull\nrequest titles and bodies.",
          "is_bot": false,
          "headline": "Document pull request guidelines (#342)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-10-11T23:25:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5350b061aeb3d06463b2bddefe71a412c7630a3e",
          "body": "Without this fix I get errors like the following under Swift 6:\n\n```\n/home/colinmarc/dev/swift-bridge/integration-tests/Sources/SharedLib/Generated/SharedLib.swift:4159:26: error: sending 'rustFnRetVal' risks causing data races\n4157 |     return try await withCheckedThrowingContinuation({ (continuat\n[…]\nask-isolated uses\n4160 |         }\n4161 |\n```\n\nI avoided adding `Sendable` for `RustString` since that's being discussed in #296 and elsewhere. Instead, I commented it out and left a TODO.\n\nFixes #311",
          "is_bot": false,
          "headline": "Add Sendable to all async return types in tests (#312)",
          "author_name": "Colin Marc",
          "author_login": "colinmarc",
          "committed_at": "2025-08-27T22:42:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "455e98639c714a576bf2c4c6467336a47bc06570",
          "body": "This commit adds an `@unchecked Sendable` protocol implementation for\nthe `RustString` class, as well as documentation explaining that this is\nthread safe so long as the rules outlined in the book's `Safety` chapter\nare upheld.\n\nThe following code now compiles:\n```swift\nlet rustString = RustString(\"hello world\")\n\nThread.detachNewThread {\n    XCTAssertEqual(rustString.len(), 11)\n}\n```",
          "is_bot": false,
          "headline": "Implement Sendable for `RustString` (#330)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-08-27T22:24:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "840235cbcc16d66329f7c49efa8136c2d66b3851",
          "body": "`SwiftBirdgeCore` -> `SwiftBridgeCore`",
          "is_bot": false,
          "headline": "Fix typo in `.expect` message for copying `SwiftBridgeCore.h` (#329)",
          "author_name": "Chris Krycho",
          "author_login": "chriskrycho",
          "committed_at": "2025-05-26T16:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73dcc32753975120797090e5edfcef225347abca",
          "body": "Allows automatic use of `==` on opaque (`extern \"Rust\"`) copyable types. The correct code was already being generated for the Rust crate and C header, but was not exposed in Swift code.\n\nFor the given bridge module declaration:\n```rust\n// Rust\n#[swift_bridge::bridge]\nmod ffi {\n    extern \"Rust\" {\n  \n[…]\n does not need to be heap-allocated\nlet x = SomeOpaqueBytes(initWith: ~)\nlet y = SomeOpaqueBytes(initSomeOtherWay: ~)\n\n// With this PR, we can now compare them with `==`\nif x == y { // <--\n    ~\n}\n```",
          "is_bot": false,
          "headline": "Support `Equatable` on Rust `Copy` types (#328)",
          "author_name": "pearfalse",
          "author_login": "pearfalse",
          "committed_at": "2025-05-26T16:51:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0a0b44eddeb215e39fafa3fbdeb81aab61d64515",
          "body": "Closes https://github.com/chinedufn/swift-bridge/issues/107",
          "is_bot": false,
          "headline": "Support Linux in `rust-binary-calls-swift-package` example (#297)",
          "author_name": "Terraputix",
          "author_login": "terraputix",
          "committed_at": "2025-02-11T07:29:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "864cb4ee4f3d0efb0f03b62d679f7dc18a3f99e2",
          "body": "This commit adds documentation explaining that there is is no zero-copy\r\nway to create a Swift `String`.\r\n\r\nWe also add documentation explaining that the reason the `RustString`\r\ntype exists is to avoid the implicit allocation that would be required\r\nif we automatically converted Rust's `std::string::String` to Swift's\r\n`String`.\r\n\r\nWe also document some potential new attributes that would allow users to\r\nopt into automatically converted from a `Rust std::string::String` to a\r\nSwift String.",
          "is_bot": false,
          "headline": "Document Swift String copying (#318)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-02-06T14:05:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4827500b2caccaac1ca078762dd24a9c16f24429",
          "body": "This commit introduces a new `#[swift_bridge(Sendable)]`\r\nattribute that emits Swift `Sendable` implementations for opaque\r\nRust types, and Rust `Send + Sync` implementations for opaque\r\nSwift types.\r\n\r\nThese implementations are checked at compile time.\r\n\r\nExample usage:\r\n```rust\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        #[swift_bridge(Sendable)]\r\n        type MyRustType;\r\n    }\r\n\r\n    extern \"Swift\" {\r\n        #[swift_bridge(Sendable)]\r\n        type MySwiftType;\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Add `#[swift_bridge(Sendable)]` attribute (#317)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-02-04T17:23:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c15279c5a412fbc597e6831673b6bf850ddb4217",
          "body": "This commit introduces a\r\n\"Minimum Supported Swift Version\" policy to help users understand\r\nwhether their code is guaranteed to work on a particular version of\r\nSwift.\r\n\r\nAs a starting point, we are supporting Swift 6.0+ .\r\n\r\nStarting at `6.0` allows us to begin leveraging Swift's new ownership\r\nfe\n[…]\n certain safety requirements.\r\n\r\nSee the `Safety` chapter in the internal book for more information about\r\nsafety requirements that, by leveraging Swift 6.0, we will be able to\r\nautomatically enforce.",
          "is_bot": false,
          "headline": "Add Minimum Supported Swift Version Policy (#316)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-02-02T16:43:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a661800559c8aec75e5959b2f4701828639e6c06",
          "body": "This commit introduces a new attribute that can be used to enable\r\nexperimental support for Swift ownership.\r\n\r\nThe new `__experimental_swift_ownership` can be used on an opaque Rust\r\ntype.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod foo {\r\n    extern \"Rust\" {\r\n        #[swift_bridge(__experimental_swi\n[…]\n` protocol to ensure that\r\nwhen Swift has ownership over an opaque Rust type it cannot copy that\r\nhandle, which should make attempts to use-after-free a compile-time\r\nerror instead of a runtime error.",
          "is_bot": false,
          "headline": "Add attribute for Swift ownership support (#314)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2025-02-02T11:42:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "225380ed46cac687ebfec359fc8b5d9d5f764801",
          "body": "This commit introduces an example of using multiple bridge modules in a\r\nproject.",
          "is_bot": false,
          "headline": "Add multiple-bridge-modules example (#302)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-11-16T20:27:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d64db649d3670741b1c73f4915f06ae278977429",
          "body": "This commit introduces documentation explaining why `swift-bridge` uses\r\na bridge module design, as opposed to, say, a design where users\r\nannotate their types with proc macro attributes.",
          "is_bot": false,
          "headline": "Document motivation for bridge module (#301)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-11-16T19:52:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c45a38cf8730013a6a03af2184df0831f523b1a6",
          "body": "Support Rust returning `-> Result<_, String>`, e.g.:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        fn do_fallible_work() -> Result<(), String>;\r\n    }\r\n}\r\n```\r\n\r\n---\r\n\r\nIncorporate the changes from #282 to implement swift's `Error` protocol for ruststring, & extend them with the tests requested in https://github.com/chinedufn/swift-bridge/issues/295#issuecomment-2411049833",
          "is_bot": false,
          "headline": "Support Rust returning `-> Result<_, String>` (#296)",
          "author_name": "Britt",
          "author_login": "brittlewis12",
          "committed_at": "2024-10-14T20:20:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0698b41d0434c6036f4d13a921677dcdfdde34dc",
          "body": "This commit adds a `[package] name = \"...\"` entry to the example `Cargo.toml` file in the `Swift Packages` chapter of the book.\r\n\r\nThis prevents the example crate from being interpreted as a virtual manifest.\r\nThis is important because a Cargo virtual manifest cannot have a `[lib]` section.",
          "is_bot": false,
          "headline": "Add package name to example Cargo.toml (#290)",
          "author_name": "Seto Elkahfi",
          "author_login": "setoelkahfi",
          "committed_at": "2024-08-26T15:17:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cfb0aa8c930fc79fa14d260f3567e6898db689b",
          "body": null,
          "is_bot": false,
          "headline": "0.1.57",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-08-15T13:31:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b547a5f0ca976d711e6671b8d70d06113e916c4",
          "body": "This PR implements throwing initializers. See: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/errorhandling/.\r\n\r\nHere's an example of using this feature:\r\n\r\n```rust\r\n// Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    enum ResultTransparentEnum {\r\n        NamedField { da\n[…]\n -> i32;\r\n    }\r\n}\r\n```\r\n\r\n```swift\r\n// Swift\r\ndo {\r\n    let throwingInitializer = try ThrowingInitializer(false)\r\n} catch let error as ResultTransparentEnum {\r\n    //...\r\n} catch {\r\n    //...\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support throwing initializers (#287)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2024-08-15T10:19:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "495611ba39bc6b08838408751b92f6329b98f321",
          "body": "Related to #235.\r\n\r\nThis PR supports failable initializers.\r\n\r\nSomething like:\r\n\r\n```rust\r\n// Rust side\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        #[swift_bridge(Equatable)]\r\n        type FailableInitType;\r\n\r\n        #[swift_bridge(init)]\r\n        fn new() -> Option<FailableIn\n[…]\n   ~\r\n} else {\r\n   ~\r\n}\r\n```\r\n\r\nSee: [Swift Documentation - Failable Initializers](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/initialization/#Failable-Initializers)",
          "is_bot": false,
          "headline": "Support failable initializers (#276)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2024-08-08T22:57:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d2c09e2e602a3dd9a2d0ff6c9298f77b2a4b5eeb",
          "body": null,
          "is_bot": false,
          "headline": "0.1.56",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-08-08T09:21:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3d2da4e01bcf321fe32d6b07c5dfff94ee48fa8",
          "body": "This commit upgrades the macOS CI runners from v11 to v14.\r\n\r\nGitHub has discontinued v11, so our CI was failing before this commit.",
          "is_bot": false,
          "headline": "Upgrade macOS CI runners (#285)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-08-01T20:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37ac2c2627362d65edb7cce06705d27ad6acf066",
          "body": "This commit makes `#[swift_bridge::bridge]` respect the bridge module's visibility.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n// enums.rs\r\n\r\n// NOTE that we can now use `pub mod`, `pub(crate) mod`, etc\r\n#[swift_bridge::bridge]\r\npub mod ffi {\r\n    enum MyEnum {\r\n        VariantA,\r\n        Varia\n[…]\nms;\r\nuse enums::ffi::MyEnum;\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n  #[swift_bridge(already_declared)]\r\n  enum MyEnum {}\r\n\r\n  extern \"Rust\" {\r\n    fn getEnum() -> MyEnum;\r\n  }\r\n}\r\n```\r\n\r\nCloses #252.",
          "is_bot": false,
          "headline": "Apply input module visibility to output module (#284)",
          "author_name": "Joshua Booth",
          "author_login": "jnbooth",
          "committed_at": "2024-07-30T22:12:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "34ce1ffb6bc5a54730bf60cf177042e1f4e479ff",
          "body": "…pe>` (#278)\n\nIn Rust 1.79.0, dead code warnings are emitted from enums where the compiler does not infer that wrapped data is used, even when the enum has been annotated with `#[repr(C]`. This warning triggers in `swift-bridge` when defining transparent structs or enums that will be returned in err\n[…]\n, self)\r\n    }\r\n}\r\n\r\nimpl std::fmt::Display for ffi:: TransparentErrorStruct {\r\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\r\n        write!(f, \"{}\", self.0)\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Suppress dead_code warning when returning `-> Result<*, TransparentTy…",
          "author_name": "Eric Saxby",
          "author_login": "sax",
          "committed_at": "2024-06-21T08:59:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "717fcef70d3c293c2fd8b962ad678da18b10a3c3",
          "body": "## What's this?\r\n\r\nA new `parse-bridges` subcommand.\r\nAlso, an update to the documentation in the example showing this feature's preview.\r\n\r\nThis is handy for usage in higher-level build systems.\r\nFor example, in my case, I build both Rust and Swift with CMake, and having this CLI command implemente\n[…]\nesome-crate -f src/lib.rs -o generated\r\n```\r\n\r\nMultiple files:\r\n```shell\r\nswift-bridge-cli parse-bridges --crate-name my-superb-crate \\\r\n-f src/lib.rs \\\r\n-f src/some_other_file.rs \\\r\n-o generated\r\n```",
          "is_bot": false,
          "headline": "Add parse-bridges CLI subcommand (#274)",
          "author_name": "Maksym",
          "author_login": "integer-overflown",
          "committed_at": "2024-06-16T01:33:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef01d21001914b79e0384627535098e15f87f096",
          "body": null,
          "is_bot": false,
          "headline": "0.1.55",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-29T03:16:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87dbea3c28d4a96d9195bd3a70fdecfd85fd8f5c",
          "body": "This commit fixes a memory leak when passing `Option<SwiftType>` to\r\n`extern \"Rust\"` functions.\r\n\r\nFor example, the following bridge module would lead to memory leaks:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Swift\" {\r\n        type SomeSwiftType;\r\n    }\r\n\r\n    extern \"Rust\" {\r\n   \n[…]\ne on the Swift side\r\n\r\n- Pass `Option<SwiftType>` to Rust. Retain count is now 2\r\n\r\n- Rust passes ownership back to Swift. Retain count is now 1\r\n\r\n- Retain count never hits 0. Memory has been leaked.",
          "is_bot": false,
          "headline": "Fix memory leak for `Option<SwiftType>` (#273)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-29T03:14:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b4ba1a72a682c3917d78d6650ffb249c7109999b",
          "body": "This commit replaces calls to `pointer::cast` with explicit casting via\n`as *mut SomeType`.\n\nThis reduces the likelihood of our codegen generating unsound code that\ncasts a pointer to the wrong type.",
          "is_bot": false,
          "headline": "Use explicit pointer casting",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-29T02:11:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d02d8f4e8e0b1482e79cdceea9343456a6d4d57",
          "body": null,
          "is_bot": false,
          "headline": "0.1.54",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-28T17:49:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "636fa2774870c052a18f06d98ca5f6966c09bdd6",
          "body": "This adds support for bridging `Option<OpaqueSwiftType>` in `extern \"Rust\"` functions. This fixes #268, and makes the following now possible:\r\n\r\n```rs\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Swift\" {\r\n        type SomeSwiftType;\r\n    }\r\n\r\n    extern \"Rust\" {\r\n        fn option_arg(arg: Option<SomeSwiftType>);\r\n        fn returns_option() -> Option<SomeSwiftType>;\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support Option<OpaqueSwiftType> (#272)",
          "author_name": "BrightShard",
          "author_login": "Bright-Shard",
          "committed_at": "2024-04-28T14:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3c950c90867550e09a24c94357f1e502bf6d69d",
          "body": "This commit inlines some of the example code in the book.\n\nThis makes it easier to read book chapters using any text viewer, as\nopposed to needing to use `mdbook`.",
          "is_bot": false,
          "headline": "Inline example code in book",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-23T07:15:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75a1077f1661ad048398a850226472c3310abc47",
          "body": null,
          "is_bot": false,
          "headline": "Improve signature support docs (#267)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-09T11:47:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fc3d3ccca618f3f231fc6f8a7678ad119ca99b0",
          "body": "This commit adds documentation that explains the `ToRustStr` protocol.",
          "is_bot": false,
          "headline": "Document the ToRustStr protocol (#266)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-04-09T11:27:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04e6abf522119fd11cf2e6f8b44172794eae11d2",
          "body": null,
          "is_bot": false,
          "headline": "0.1.53",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-03-26T00:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58f4a40f96bb050607c746376422ab3c62e0e771",
          "body": "This commit adds support for passing `Option<String>` to and from\r\n`extern \"Swift\"` functions, as well as for passing `Option<&str>` to\r\nextern \"Swift\" functions.\r\n\r\nFor example, the following is now possible:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Swift\" {\r\n        fn opt_strin\n[…]\npt_str_function(arg: Option<&str>);\r\n    }\r\n}\r\n```\r\n\r\nNote that you can not yet return `-> Option<&str>` from Swift.\r\n\r\nThis is an uncommon use case, so we're waiting until someone actually\r\nneeds it.",
          "is_bot": false,
          "headline": "Swift Option<String> and Option<&str> (#264)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-03-26T00:37:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53b118d17f2f1a2922e969de528b99a2ffbc7dde",
          "body": "Add test cases for Option<&T> and fix rust codegen\r\n\r\nCurrently swift-bridge only has tests for Option<T> - this adds test\r\ncases for Option<&T> and fixes a bug in rust codegen that does not\r\ncorrectly translate Option<&T>.\r\n\r\nThis is now possible:\r\n\r\n```rust\r\nmod ffi {\r\n  extern \"Rust\" {\r\n    type SomeType;\r\n\r\n    fn my_func(arg: Option<&SomeType>) -> Option<&SomeType>;\r\n  }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Add test cases for Option<&T> and fix rust codegen (#257)",
          "author_name": "Peter Farr",
          "author_login": "PrismaPhonic",
          "committed_at": "2024-03-15T00:55:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd5bef56af28db4f1a1244d86115def6abede931",
          "body": "This commit fixes an `improper_ctypes` warning when bridging transparent\r\nstructs that contain non FFI safe types.\r\n\r\nWhile transparent structs that contained non FFI safe types were being\r\npassed in an FFI safe way before this commit, the Rust compiler could\r\nnot know that what we were doing was FF\n[…]\nield: *mut std::string::RustString\r\n}\r\n```\r\nwas triggering a warning because the Rust compiler can't know that the\r\nnon-FFI safe `std::string::RustString` is not being dereferenced on the\r\nSwift side.",
          "is_bot": false,
          "headline": "Fix `improper_ctypes` warning (#254)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-03-08T02:43:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "48195b550d5d92073550aded61f0504088067477",
          "body": "This cmmit removes an unnecessary call to `Deref::deref`.\n\nThis fixes a warning that was causing CI to fail.",
          "is_bot": false,
          "headline": "Remove unnecessary `.deref()`",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-02-14T15:23:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9746f311ce666ffd51676cabfe2a8adeb7b7cdd4",
          "body": null,
          "is_bot": false,
          "headline": "Fix typos in Vec<-->RustVec docs (#251)",
          "author_name": "Gabbi Fisher",
          "author_login": "gabbifish",
          "committed_at": "2024-02-01T20:12:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8059a445355200cca0e065cf45fb5a131b5b56e",
          "body": "in build-swiftc-links-rust.sh, the command\r\nswiftc -L target/x86_64-apple-darwin/debug/ -lswift_and_rust -import-objc-header bridging-header.h \\\r\n  main.swift lib.swift ./generated/swift-and-rust/swift-and-rust.swift \r\nis missing the source ./generated/SwiftBridgeCore.swift",
          "is_bot": false,
          "headline": "Fix compilation source in documentation (#250)",
          "author_name": "ItamarMu",
          "author_login": "ItamarMu",
          "committed_at": "2024-01-30T19:16:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0614ba7d6d99c5b961b0e80fdbac84ce32551ae1",
          "body": "This commit removes the `Array.toUnsafeBufferPointer` usage from the\ndocumentation.\nThis was a method that we used to have but removed in a previous commit.\n\nSwift pointers have lifetimes that can be shorter than the lifetime of\nthe object that they are pointing to, so the returned pointer could\nunpredictably become a dangling pointer.\n\nThe documentation has been updated with an alternative approach to\npassing a Swift buffer pointer to Rust.",
          "is_bot": false,
          "headline": "Remove `Array.toUnsafeBufferPointer`",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2024-01-26T23:15:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d527f3231636ab7188a8ae02245cd1f9db1511de",
          "body": "The panic message now contains the name of the unsupported attribute as well\r\nas the name of the struct that the attribute was found on.\r\n\r\nThis commit also updates the documentation to fix faulty struct attributes.",
          "is_bot": false,
          "headline": "Improve error message for unsupported attribute (#244)",
          "author_name": "Erik Živković",
          "author_login": "bes",
          "committed_at": "2023-09-10T19:08:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af962ca051ba15b81794575a0837f1e2abde9984",
          "body": null,
          "is_bot": false,
          "headline": "0.1.52",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-07-10T12:12:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "27246447b4ac741b8bf086d3dfca15b47558e44f",
          "body": "Related to #201. This commit adds support `RustString`  in extern Swift functions.\r\n\r\nHere's an example of using this.\r\n\r\n```Swift\r\n//Swift\r\nfunc reflect_swift_string(arg: RustString) -> RustString {\r\n    arg\r\n}\r\n\r\n```\r\n\r\n```Rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Swift\" {\r\n   \n[…]\n   fn reflect_swift_string(arg: String) -> String;\r\n    }\r\n}\r\n\r\nlet foo = \"foo\";\r\nlet string = ffi::reflect_swift_string(foo.to_string());\r\nassert_eq!(string.len(), 3);\r\nassert_eq!(&string, foo);\r\n```",
          "is_bot": false,
          "headline": "Support `RustString` in extern Swift functions (#225)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-06-23T21:59:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "36565f2c59b4bc438b54fdf5fb5a696ea63348df",
          "body": "This commit documents how we use the `RustString` type to avoid implicit\nSwift String allocations.",
          "is_bot": false,
          "headline": "Add docs on RustString",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-06-23T11:18:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df91f282e62b32755f1410c0e6f22b03f836f018",
          "body": "This commit fixes the `SwiftRustIntegrationTestRunner` project such that\nit now builds and runs the full test suite.\n\nBefore this commit there was a recently introduced file that was not\nactually added to the project, so the project could not compile.\n\nCI was failing for the last few commits so this slipped through the\ncracks. This commit should fix CI.",
          "is_bot": false,
          "headline": "Fix integration tests",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-06-21T08:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fbd30f81085dc366bda3c0303eac66345de3ed9",
          "body": "Related to #225.\r\n\r\nBefore this commit, the integration tests sometimes fail, like so:\r\n\r\n```\r\nfield has incomplete type 'struct swift_bridge$tuple$I32ResultTestOpaqueRustTypeString'\r\n```\r\n\r\nThis PR fixes the issue.",
          "is_bot": false,
          "headline": "Fix non-deterministic generation order (#230)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-06-20T23:52:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffe20d8c8eb4f0404e1e56ef3892f810c7182fea",
          "body": "Fixes #228.\r\n\r\nThis enables the following use case:\r\n```rust\r\n// Rust\r\nfn main() {\r\n    let bytes = ffi::receive_bytes();\r\n    println!(\"bytes: {:?}\", bytes);\r\n\r\n    let vec: Vec<u8> = vec![6, 1, 2, 3, 4, 5];\r\n    ffi::send_bytes(vec);\r\n}\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Swift\" {\r\n\n[…]\ns with my PR given that this is my first time dealing with this kind of interop work, so by all means do let me know how to address the current weaknesses/problems and I'll do my best to resolve them.",
          "is_bot": false,
          "headline": "Swift `Vec<primitive>` ret type and fn arg (#229)",
          "author_name": "Tim Wedde",
          "author_login": "timwedde",
          "committed_at": "2023-06-20T17:17:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ecd3b974754e32fc951b8bc4098ecef84e974821",
          "body": "When generating the rust function wrappers for an extern swift function with an already_declared struct/enum the generated code used a locally defined struct/enum with this patch we add `super` to that function signature.\r\n\r\nAn example of code that was previously not working:\r\n\r\n```rs\r\n#[swift_bridg\n[…]\niously the genrated function would be something like:\r\n```rs\r\nmod ffi {\r\n  fn baz(a: Foo) {\r\n    // ...\r\n  }\r\n}\r\n```\r\n\r\nnow it's\r\n\r\n```rs\r\nmod ffi {\r\n  fn baz(a: super::Foo) {\r\n    // ...\r\n  }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Fix `already_declared` attribute for enums and structs (#226)",
          "author_name": "Gabi",
          "author_login": "conectado",
          "committed_at": "2023-05-27T00:25:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c14ea07ab71702019e652fcc5a5f7a111d5ea0e",
          "body": "Fixes #220 \r\n\r\nThis supports bridges of the form:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        type ErrorType;\r\n        async fn some_function() -> Result<(), ErrorType>;\r\n    }\r\n}\r\n\r\nasync fn some_function() -> Result<(), ErrorType> {\r\n  Ok(())\r\n}\r\n```",
          "is_bot": false,
          "headline": "Fix async Rust fn return Result<(), OpaqueType>  (#221)",
          "author_name": "Josh Faust",
          "author_login": "jfaust",
          "committed_at": "2023-05-04T12:33:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de059024732fa2f8135a9fe1232b727d96794af6",
          "body": "Fixes #217 \r\n\r\nThis supports bridges of the form:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        type OpaqueRust;\r\n        fn rust_func_return_result_of_vec_u32() -> Result<Vec<u32>, OpaqueRust>;\r\n        fn rust_func_return_result_of_vec_opaque(\r\n        ) -> Result<Vec<\n[…]\nfunc_return_result_of_vec_opaque(\r\n) -> Result<Vec<OpaqueRust>, OpaqueRust> {\r\n    Ok(vec![\r\n        OpaqueRust::new(...),\r\n        OpaqueRust::new(...),\r\n        OpaqueRust::new(...),\r\n    ])\r\n}\r\n```",
          "is_bot": false,
          "headline": "Fix returning Result<Vec<>, ...> from Rust (#218)",
          "author_name": "Josh Faust",
          "author_login": "jfaust",
          "committed_at": "2023-05-04T12:26:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "852ece728d3f362f3ada4368e037fe9ebb2a913f",
          "body": "This commit adds support for returning `Result<tuple, Any Type>` from Rust functions. Note that this doesn't support returning `Result<Any Type, tuple>` from Rust functions.\r\n\r\nHere's an example of using this.\r\n\r\n```Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        fn rust_func_\n[…]\n``Swift\r\n//...\r\ndo {\r\n    //...\r\n    let tuple: (Int32, ResultTestOpaqueRustType, RustString) = try rust_func_return_result_tuple_transparent_enum(true)\r\n    //...\r\n} catch {\r\n    //...\r\n}\r\n//...\r\n```",
          "is_bot": false,
          "headline": "Support returning Result<tuple, Any Type> from Rust (#213)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-05-04T12:20:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e140ca5e6ec3f969c19001c844f98fe76bd787c",
          "body": "This commit adds a method to the `Vectorizable` protocol:\r\n\r\n```swift\r\nstatic func vecOfSelfAsPtr(vecPtr: UnsafeMutableRawPointer) -> UnsafePointer<SelfRef>\r\n```\r\n\r\nMy reason for adding this method was to be able to easily pass a serialized Protobuf object back and forth between Rust and Swift. Moti\n[…]\nta: Data(\r\n            // The `.as_ptr()` method keeps this very straightforward\r\n            bytes: output.as_ptr(),\r\n            count: output.len()\r\n        )\r\n    )\r\n} catch { ... }\r\n\r\n// ...\r\n```",
          "is_bot": false,
          "headline": "Add `RustVec<T>.as_ptr` method (#216)",
          "author_name": "aiongg",
          "author_login": "aiongg",
          "committed_at": "2023-04-26T15:41:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e09fcefbd2581fc6e44cb4207c99d25eb175b4d",
          "body": null,
          "is_bot": false,
          "headline": "Update incorrect-return-type.stderr (#215)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-04-24T15:25:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f9dd05360b4001fbe4c167304f6815399882699",
          "body": null,
          "is_bot": false,
          "headline": "Support tuples from Swift -> Rust (#211)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-04-18T13:57:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53b93f47cc32d605377194a43f3164745cea6dd6",
          "body": "Related issue: #190 \r\n\r\nExample:\r\n\r\n```rs\r\n// Rust\r\n\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    #[derive(Debug)]\r\n    enum DeriveDebugEnum {\r\n        Variant,\r\n    }\r\n}\r\n```\r\n\r\n```swift\r\n// Swift\r\n\r\nlet debugString = String(reflecting: DeriveDebugEnum.Variant)\r\nXCTAssertEqual(debugString, \"Variant\")\r\n```",
          "is_bot": false,
          "headline": "Support derive(Debug) on enums (#194)",
          "author_name": "naturecodevoid",
          "author_login": "amsam0",
          "committed_at": "2023-04-06T01:38:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b1ea0d2b440a628a6658caca953f72752b7329",
          "body": "This commit adds support for generating a `#include<~>` corresponding to each field in tuples. \r\n\r\nHere's an example.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        fn some_function(arg1: (i32, bool)) -> (i32, bool);\r\n    }\r\n}\r\n```\r\n\r\nGenerates the following c header file:\r\n```c\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n//...\r\n```",
          "is_bot": false,
          "headline": "Generate includes for tuples (#208)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-04-03T17:38:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b797f6595c9e45f30032db5a24403f746f5d1b0",
          "body": "This commit adds support for generating a compile error message when using `#[swift_bridge(associated_to = OpaqueRustType)]` on instance methods.\r\n\r\nRelated to #179.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        type SomeType;\r\n\r\n        #[swift_bridge(associated_to = \n[…]\nciated_to attribute is used for only an associated method.\r\n  --> tests/ui/invalid-associated-to-attribute.rs:16:25\r\n   |\r\n16 |         fn owned_method(self);\r\n   |                         ^^^^\r\n\r\n```",
          "is_bot": false,
          "headline": "Add compile error for associated_to attribute (#206)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-29T12:16:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d03f77295fb60bee9f1bbb67da9d1f49bc765966",
          "body": "This commit adds support tuples from Swift -> Rust, which consist of only primitives.\n\nrelated to #204.\n\nHere's an example of using this:\n\n```rust\n#[swift_bridge::bridge]\nmod ffi {\n    extern \"Swift\" {\n        fn swift_reflect_tuple_primitives(arg: (i32, u32)) -> (i32, u32);\n    }\n}\n```\n\n```rust\n//Rust\n\n//...\nlet tuple = swift_reflect_tuple_primitives((-123, 123));\n//...\n```",
          "is_bot": false,
          "headline": "Support primitive tuples Swift -> Rust (#205)",
          "author_name": "niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-27T17:06:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "637c7b353539c1122dacc3a64e7d5dc052a4fec9",
          "body": "This commit adds support for tuples. \r\n\r\nrelated to #188.\r\n\r\nHere's an example of using this:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        fn reflect_tuple_primitives(tuple: (i16, u32)) -> (i16, u32);\r\n    }\r\n}\r\n\r\nfn reflect_tuple_primitives(tuple: (i16, u32)) -> (i16, u32) {\r\n    tuple\r\n}\r\n```\r\n\r\n```swift\r\n//...\r\nlet tuple = reflect_tuple_primitives((-1, 10))\r\n//...\r\n```",
          "is_bot": false,
          "headline": "Support tuples (#195)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-20T16:33:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d713d36391a09fedc5c1b03cd3a15c814f2f11ef",
          "body": null,
          "is_bot": false,
          "headline": "Add Performance section to README",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-03-19T02:27:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdca9fcc2080a60d30de958fc4ada2516691581e",
          "body": "This commit adds support for Option<PrimitiveType> in `extern \"Swift\"`\r\nfunctions.\r\n\r\nFor example, the following is now possible:\r\n\r\n```rust\r\nmod ffi {\r\n    extern \"Swift\" {\r\n        fn my_func(arg: Option<u8>) -> Option<bool>;\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support Option<Primitive> in Swift fns (#203)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-03-19T01:52:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03ca04126a8f73f8208fbee3572ea905e1a93aec",
          "body": "Closes https://github.com/chinedufn/swift-bridge/issues/108",
          "is_bot": false,
          "headline": "Fix dangling pointer warning (#202)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-03-18T16:48:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4c5d9bffe2f457822b753a00c93bb3384e8f8ba",
          "body": "This commit adds support for `Vec<f32>`/`Vec<f64>`.\r\n\r\nRust code would look like:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    #[swift_bridge(swift_repr = \"struct\")]\r\n    struct SomeStruct {\r\n        field: Vec<f32>,\r\n    }\r\n\r\n    extern \"Rust\" {\r\n        fn do_something(val: SomeStruct) -> Vec<f32>;\r\n    }\r\n}\r\n\r\nfn do_something(val: SomeStruct) -> Vec<f32> {\r\n    /* do something */\r\n}\r\n```\r\nOn Swift side, `Double` and `Float` are now `Vectorizable`.",
          "is_bot": false,
          "headline": "Add Vec<f32> and Vec<f64> support (#200)",
          "author_name": "Rodrigo Kreutz",
          "author_login": "rkreutz",
          "committed_at": "2023-03-17T23:26:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b151f1ab72fb3f36f61c42186dc3319b17936a9",
          "body": "This commit adds support for `#[derive(Copy, Clone)]` to `SharedStruct`s.\r\n\r\n## Example\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    #[swift_bridge(swift_repr = \"struct\")]\r\n    #[derive(Copy, Clone)]\r\n    struct Foo {\r\n        field: u8,\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Adding derive() macro support to SharedStructs (#198)",
          "author_name": "Rodrigo Kreutz",
          "author_login": "rkreutz",
          "committed_at": "2023-03-16T16:30:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d60d9ee83a153b07c5413af9f9cc3ad6075c9f4",
          "body": "This commit adds support for returning Result<(), TransparentEnum> from Rust async functions.\r\n\r\nHere's an example of using this:\r\n\r\n```Rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    enum SomeEnum {\r\n       //...\r\n    }\r\n    extern \"Rust\" {\r\n        async fn some_function() -> Result<(), SomeEnum>;\r\n    }\r\n}\r\n```\r\n\r\n```Swift\r\n//Swift\r\ndo {\r\n    let value = try await some_function()\r\n    //...\r\n} catch let error as SomeEnum {\r\n    //...\r\n} catch {\r\n    //...\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support Rust async fn ret `Result<(),enum>` (#189)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-07T23:08:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68c3a385fcc21810f6f33794fc63003c3b9bb168",
          "body": "This commit adds support for returning `Result<OpaqueRustType, TransparentEnumType>` from `async` Rust functions. \r\nrelated to #159.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    enum NetworkError {\r\n\tNoData,\r\n\tAuthentication,\r\n    }\r\n    extern \"Rust\" {\r\n  \n[…]\n)\r\n    //...\r\n} catch let error as NetworkError {\r\n    //...\r\n} catch {\r\n    //...\r\n}\r\n```\r\n\r\nNote that This commit doesn't support `Result<TransparentEnum, ()>` and `Result<(), TransparentEnum>` yet.",
          "is_bot": false,
          "headline": "Rust async fn return Result<enum, enum> (#182)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-06T23:17:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "20baa731361c9cb86c2b4a9f5c7d0a5f65f6ff45",
          "body": "This commit replaces `ResultVoidAndPtr` with a pointer.  Note that this commit doesn't affect the user experience at all.\r\n\r\nrelated to #183.\r\n\r\nFor example, the following bridge module:\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        type SomeType;\r\n\r\n        fn some_func\n[…]\n\n        Ok(ok) => std::ptr::null_mut(),\r\n        Err(err) => Box::into_raw(Box::new({\r\n            let val: super::SomeType = err;\r\n            val\r\n        })) as *mut super::SomeType\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Replace `ResultVoidAndPtr` with pointer (#184)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-05T02:17:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "321e03e8d7f51fbf0629f56960defebfced244dc",
          "body": "This commit adds support for returning `Result<transparent enum, transparent enum>` from Rust functions.\r\n\r\nrelated to #159.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        type ResultTestOpaqueRustType;\r\n    }\r\n    enum ResultTranspar\n[…]\n\n        fn some_function() -> Result<ResultTestOpaqueRustType, ResultTransparentEnum>;\r\n    }\r\n}\r\n\r\n```\r\n\r\n```swift\r\ndo {\r\n    let value = try some_function()\r\n    //...\r\n} catch {\r\n    //...\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support Rust fn return `Result<enum, enum>` (#182)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-03-04T17:51:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5acac1d4ba9269ed0de8d583a9c01509084ab197",
          "body": null,
          "is_bot": false,
          "headline": "0.1.51",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-28T01:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "832498a8a822690e2ef61e5929a05d713ba2fbe8",
          "body": "This commit adds support for opaque types as enum variant fields. However, This PR doesn't support generic opaque types. I'll write the reason later.\r\n\r\nHere's an example:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        #[swift_bridge(Equatable)]\r\n        type Foo;\r\n    \n[…]\nhNamedData.Variant3(foo: Foo.new())\r\nswitch reflect_enum_with_named_data(enumWithNamedData3) {\r\ncase .Variant3(let foo):\r\n    XCTAssertEqual(foo, Foo.new())\r\n    break\r\ndefault:\r\n    XCTFail()\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support opaque types as enum variant fields  (#181)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-28T00:18:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "27d7be991141586fb120e4691b7bea7d9eeecd17",
          "body": "This commit adds support for returning `Result<(), OpaqueRust>` but not passing as an arg.\r\n\r\nThe change to `examples/rust-binary-calls-swift-package/build.rs` was to support xcode not existing in the default location (I use the `xcodes` tool).\r\n\r\nThis commit also supports empty types, such as `stru\n[…]\nit_result() -> Result<UnitType, OpaqueType>;\r\n    }\r\n}\r\n\r\nfn null_result() -> Result<(), OpaqueType> {\r\n    Ok(())\r\n}\r\n\r\nfn unit_result() -> Result<UnitType, OpaqueType> {\r\n    Ok(UnitType {})\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support returning Result<(), OpaqueRust> from Rust functions (#180)",
          "author_name": "Josh Faust",
          "author_login": "jfaust",
          "committed_at": "2023-02-26T22:47:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b13c56ab399a9725bdb89b1435cafa76c056b21d",
          "body": "This commit adds documentation that explains that it is possible to\r\ntrigger undefined behavior by violating Rust's borrowing rules using\r\nSwift.\r\n\r\nRelated:\r\n- https://github.com/chinedufn/swift-bridge/issues/161\r\n- https://github.com/chinedufn/swift-bridge/issues/162",
          "is_bot": false,
          "headline": "Improve memory safety documentation (#164)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-25T02:23:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c15ba303a2c33dc457ddc2078cd0f8dbdc8e96de",
          "body": "This commit modifies our codegen to elide arguments and return types\r\nthat have exactly one FFI representation, such as `()` `struct Foo;` and\r\n`enum MyEnum { OneVariant }`.\r\n\r\nFor example, the following bridge module:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    struct UnitStruct1;\r\n    stru\n[…]\nant }`.\r\n\r\nAlthough, perhaps not that notably, since I'm still not sure whether\r\nanyone will have an FFI use case that involves bridging single-repr\r\ntypes.\r\n\r\nWho knows. Developers will surprise you.",
          "is_bot": false,
          "headline": "Elide types with one FFI representation (#178)",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-24T05:19:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9e312c470f924c93252aba850ec5fd3273714ae",
          "body": null,
          "is_bot": false,
          "headline": "Document the ResultPtrAndPtr FFI support type",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-22T10:48:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f087fe2a636b95948c7e909afda86cffebe19ab",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md (#176)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-21T13:44:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b7004e2602bb867c0cfba20868e7630e5c35a8c",
          "body": "This commit addresses #160 and adds support for enums with named data. \r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    enum EnumWithNamedData {\r\n        Variant1 { hello: String, data_u8: u8 },\r\n        Variant2 { data_i32: i32 },\r\n        Variant3,\r\n    }\r\n\r\n[…]\nnumWithNamedData1) {\r\n    case .Variant1(let hello, let dataU8):\r\n        XCTAssertEqual(hello.toString(), \"hello\")\r\n        XCTAssertEqual(dataU8, 123)\r\n    default:\r\n        XCTFail()\r\n    }\r\n}\r\n```",
          "is_bot": false,
          "headline": "Support enums with named data (#175)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-21T12:05:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c7d1a3bb8c74a16e9417fbecb987896b52e7980",
          "body": null,
          "is_bot": false,
          "headline": "0.1.50",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-20T17:54:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81cfce43385efb55394ea066d3084593d4e57626",
          "body": null,
          "is_bot": false,
          "headline": "Cargo fmt",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-19T16:46:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe8f5216e6dc7c27cf87c3a72d687e3c3703d326",
          "body": null,
          "is_bot": false,
          "headline": "Simplify all variants empty method",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-19T16:05:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fff2983df90810cf9b4551d8c1de574b50ca979",
          "body": "This commit addresses #160 and adds support for enums with unnamed data. This commit doesn't implement enums with named data.\r\n\r\nHere's an example of using this.\r\n\r\n```rust\r\n//Rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    enum EnumWithUnnamedData {\r\n        Variant1(String, u32),\r\n        Variant2(i\n[…]\nwitch enumWithUnnamedData {\r\ncase .Variant1(let rustString, let valueUInt32):\r\n    XCTAssertEqual(rustString.toString(), \"hello\")\r\n    XCTAssertEqual(valueUInt32, 0)\r\ndefault:\r\n    XCTFail()\r\n}\r\n\r\n```",
          "is_bot": false,
          "headline": "Support enums with unnamed data (#172)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-19T15:59:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "09c1f4f5280a2300a3957b100088d8760fbd85f8",
          "body": null,
          "is_bot": false,
          "headline": "cargo fmt",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-15T16:36:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b33e95b9c5b2d87ca2485aa972dcbb6f971ef18",
          "body": null,
          "is_bot": false,
          "headline": "Better invalid return type error message",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-15T16:17:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7aef343da039d0ff9e2783cf7989443ed39cca3",
          "body": "This commit introduces a compile time error for incorrect return types.\r\n\r\nFor example, the following will now fail to compile:\r\n\r\n```rust\r\n#[swift_bridge::bridge]\r\nmod ffi {\r\n    extern \"Rust\" {\r\n        fn get_reference() -> SomeType;\r\n    }\r\n}\r\n\r\nfn get_reference() -> &'static SomeType {\r\n    &SomeType\r\n}\r\n```\r\n\r\nBefore this commit the above example would compile and calling `get_reference` would cause undefined behavior.",
          "is_bot": false,
          "headline": "Fix to make incorrect return type into error (#169)",
          "author_name": "Mikuroさいな",
          "author_login": "MikuroXina",
          "committed_at": "2023-02-15T16:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5a0c893897f9aa2dddfdf1775876ff56b29d97c",
          "body": null,
          "is_bot": false,
          "headline": "Fix Copy attribute UI test",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-13T00:59:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1b469dc2e6b5251f1313787e58b882c7fd61aaa",
          "body": null,
          "is_bot": false,
          "headline": "Document the Shared{Struct,Enum} traits",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-12T22:50:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3238914429980d105d8d93de143d391a6f74ffa6",
          "body": null,
          "is_bot": false,
          "headline": "Replace fatalError() with XCTFail() (#163)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-11T00:26:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdbb028dea65148136851ff24bb8a025c5c66557",
          "body": null,
          "is_bot": false,
          "headline": "Fix docs",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-09T16:55:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d85c9b10bfcc0889cbdb944f788f831e4aa236db",
          "body": null,
          "is_bot": false,
          "headline": "0.1.49",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-09T12:20:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4a11f4e3fa7e9c0e1652f4e21e9b3d94c6c837b",
          "body": "This PR addresses #157 and adds support for returning a `Result<OpaqueRust, OpaqueRust>` from async functions.\n\nHere's an example of using this.\n\n```rust\n// Rust\n#[swift_bridge::bridge]\nmod ffi {\n    extern \"Rust\" {\n        type OpaqueType1;\n        type OpaqueType2;\n        async fn some_function() -> Result<OpaqueType1, OpaqueType2>;\n    }\n}\n```\n\n```Swift\n// Swift\ndo {\n    let opaqueType1 = try await some_function()\n} catch {\n    //...\n}\n```",
          "is_bot": false,
          "headline": "Support `Result<OpaqueRust>` in async fns (#158)",
          "author_name": "Niwaka",
          "author_login": "NiwakaDev",
          "committed_at": "2023-02-09T12:18:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5332f40d3abcfd4d0162d4ea1e1f8123e2ee476f",
          "body": null,
          "is_bot": false,
          "headline": "Alphabetize",
          "author_name": "Chinedu Francis Nwafili",
          "author_login": "chinedufn",
          "committed_at": "2023-02-05T01:35:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 42,
      "commits_last_year": 15,
      "latest_release_at": "2026-01-06T09:04:46Z",
      "latest_release_tag": "0.1.59",
      "releases_from_tags": false,
      "days_since_last_push": 200,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 200,
      "mean_days_between_releases": 116.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "swift-bridge",
          "exists": true,
          "license": "Apache-2.0/MIT",
          "keywords": [
            "bindings",
            "ffi",
            "ios",
            "mac",
            "swift"
          ],
          "ecosystem": "crates",
          "matches_repo": true,
          "registry_url": "https://crates.io/crates/swift-bridge",
          "is_deprecated": false,
          "latest_version": "0.1.59",
          "repository_url": "https://github.com/chinedufn/swift-bridge",
          "versions_count": 60,
          "total_downloads": 1909127,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 55776,
          "first_published_at": "2021-11-23T17:38:25.393174Z",
          "latest_published_at": "2026-01-06T09:03:02.401260Z",
          "latest_version_yanked": false,
          "days_since_latest_publish": 200
        }
      ]
    },
    "popularity": {
      "forks": 77,
      "stars": 1119,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2021-12-29",
            "count": 1
          },
          {
            "date": "2021-12-30",
            "count": 1
          },
          {
            "date": "2022-01-02",
            "count": 1
          },
          {
            "date": "2022-01-26",
            "count": 1
          },
          {
            "date": "2022-01-28",
            "count": 1
          },
          {
            "date": "2022-02-19",
            "count": 1
          },
          {
            "date": "2022-03-19",
            "count": 1
          },
          {
            "date": "2022-03-21",
            "count": 1
          },
          {
            "date": "2022-04-10",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-05-15",
            "count": 1
          },
          {
            "date": "2022-06-04",
            "count": 1
          },
          {
            "date": "2022-08-03",
            "count": 1
          },
          {
            "date": "2022-08-06",
            "count": 1
          },
          {
            "date": "2022-09-12",
            "count": 1
          },
          {
            "date": "2022-11-05",
            "count": 1
          },
          {
            "date": "2022-12-01",
            "count": 1
          },
          {
            "date": "2022-12-13",
            "count": 1
          },
          {
            "date": "2022-12-27",
            "count": 1
          },
          {
            "date": "2023-01-08",
            "count": 1
          },
          {
            "date": "2023-01-12",
            "count": 1
          },
          {
            "date": "2023-01-24",
            "count": 2
          },
          {
            "date": "2023-02-13",
            "count": 1
          },
          {
            "date": "2023-02-17",
            "count": 1
          },
          {
            "date": "2023-02-24",
            "count": 1
          },
          {
            "date": "2023-03-08",
            "count": 1
          },
          {
            "date": "2023-03-11",
            "count": 1
          },
          {
            "date": "2023-04-24",
            "count": 1
          },
          {
            "date": "2023-05-02",
            "count": 1
          },
          {
            "date": "2023-05-11",
            "count": 1
          },
          {
            "date": "2023-05-29",
            "count": 1
          },
          {
            "date": "2023-06-04",
            "count": 1
          },
          {
            "date": "2023-06-14",
            "count": 1
          },
          {
            "date": "2023-08-19",
            "count": 1
          },
          {
            "date": "2023-09-06",
            "count": 1
          },
          {
            "date": "2023-11-07",
            "count": 1
          },
          {
            "date": "2023-11-15",
            "count": 1
          },
          {
            "date": "2023-12-12",
            "count": 1
          },
          {
            "date": "2024-01-09",
            "count": 1
          },
          {
            "date": "2024-01-28",
            "count": 1
          },
          {
            "date": "2024-02-01",
            "count": 1
          },
          {
            "date": "2024-03-05",
            "count": 1
          },
          {
            "date": "2024-03-14",
            "count": 1
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-04-09",
            "count": 1
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-05-10",
            "count": 1
          },
          {
            "date": "2024-06-17",
            "count": 1
          },
          {
            "date": "2024-07-19",
            "count": 1
          },
          {
            "date": "2024-08-26",
            "count": 1
          },
          {
            "date": "2024-09-04",
            "count": 1
          },
          {
            "date": "2024-09-13",
            "count": 1
          },
          {
            "date": "2024-10-14",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 1
          },
          {
            "date": "2024-11-10",
            "count": 1
          },
          {
            "date": "2024-12-09",
            "count": 1
          },
          {
            "date": "2025-01-26",
            "count": 1
          },
          {
            "date": "2025-02-07",
            "count": 1
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-24",
            "count": 1
          },
          {
            "date": "2025-05-08",
            "count": 1
          },
          {
            "date": "2025-05-10",
            "count": 1
          },
          {
            "date": "2025-05-25",
            "count": 1
          },
          {
            "date": "2025-10-01",
            "count": 1
          },
          {
            "date": "2025-10-10",
            "count": 1
          },
          {
            "date": "2025-10-27",
            "count": 1
          },
          {
            "date": "2025-11-10",
            "count": 1
          },
          {
            "date": "2025-11-30",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 2
          },
          {
            "date": "2026-03-14",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 2
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 76,
        "total_forks": 77
      },
      "star_history": null,
      "open_issues_and_prs": 101
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "Cargo.toml",
        "SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml",
        "SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml",
        "crates/swift-bridge-build/Cargo.toml",
        "crates/swift-bridge-cli/Cargo.toml",
        "crates/swift-bridge-ir/Cargo.toml",
        "crates/swift-bridge-macro/Cargo.toml",
        "crates/swift-integration-tests/Cargo.toml",
        "examples/async-functions/Cargo.toml",
        "examples/codegen-visualizer/Cargo.toml",
        "examples/multiple-bridge-modules/Cargo.toml",
        "examples/rust-binary-calls-swift-package/Cargo.toml",
        "examples/without-a-bridge-module/Cargo.toml"
      ],
      "largest_source_bytes": 79752,
      "source_files_sampled": 241,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 24,
        "malicious_count": 0,
        "assessed_package": "crates:swift-bridge@0.1.59",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "crates"
      ],
      "dependencies": [
        {
          "name": "swift-bridge-macro",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "0.1.59"
        },
        {
          "name": "tokio",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1"
        },
        {
          "name": "once_cell",
          "manifest": "Cargo.toml",
          "ecosystem": "crates",
          "version_constraint": "1.9"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "once_cell",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "swift-bridge-macro",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tokio",
            "direct": true,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "clap",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "crossbeam-channel",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "proc-macro2",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "quote",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "reqwest",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "swift-bridge-build",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "swift-bridge-ir",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "syn",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "tempfile",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          },
          {
            "name": "trybuild",
            "direct": false,
            "version": null,
            "ecosystem": "crates"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 13,
        "direct_count": 3,
        "indirect_count": 10
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 9,
        "merged_prs": 159,
        "open_issues": 92,
        "closed_ratio": 0.521,
        "closed_issues": 100,
        "closed_unmerged_prs": 10
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "chinedufn",
          "commits": 334,
          "avatar_url": "https://avatars.githubusercontent.com/u/2099811?v=4"
        },
        {
          "type": "User",
          "login": "NiwakaDev",
          "commits": 29,
          "avatar_url": "https://avatars.githubusercontent.com/u/61189782?v=4"
        },
        {
          "type": "User",
          "login": "Choochmeque",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/8397079?v=4"
        },
        {
          "type": "User",
          "login": "bes",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/85731?v=4"
        },
        {
          "type": "User",
          "login": "Jomy10",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/62475953?v=4"
        },
        {
          "type": "User",
          "login": "jfaust",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/1388377?v=4"
        },
        {
          "type": "User",
          "login": "rkreutz",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/8869678?v=4"
        },
        {
          "type": "User",
          "login": "onato",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/107999?v=4"
        },
        {
          "type": "User",
          "login": "akesson",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/1822029?v=4"
        },
        {
          "type": "User",
          "login": "simlay",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/1163510?v=4"
        }
      ],
      "contributors_sampled": 33,
      "top_contributor_share": 0.811
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "gh-pages.yml",
        "test.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 4,
            "reason": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 4,
            "reason": "Found 13/30 approved changesets -- score normalized to 4",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e527dc7454bebbfab537d842990bf3a1672e676c",
        "ran_at": "2026-07-25T12:19:02Z",
        "aggregate_score": 3.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-01-06T09:05:18Z",
      "oldest_open_prs": [
        {
          "number": 199,
          "created_at": "2023-03-16T22:50:02Z",
          "last_comment_at": "2024-01-09T08:35:59Z",
          "last_comment_author": "wooden-worm"
        },
        {
          "number": 209,
          "created_at": "2023-04-07T23:19:20Z",
          "last_comment_at": "2024-08-15T03:38:40Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 248,
          "created_at": "2024-01-09T20:16:12Z",
          "last_comment_at": "2024-04-30T16:02:52Z",
          "last_comment_author": "extrawurst"
        },
        {
          "number": 262,
          "created_at": "2024-03-17T23:44:59Z",
          "last_comment_at": "2024-06-01T22:33:02Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 307,
          "created_at": "2025-01-26T23:09:37Z",
          "last_comment_at": "2025-08-27T22:47:50Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 340,
          "created_at": "2025-10-10T09:12:47Z",
          "last_comment_at": "2025-10-11T23:54:50Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 341,
          "created_at": "2025-10-11T09:28:12Z",
          "last_comment_at": "2025-10-26T14:34:38Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 369,
          "created_at": "2026-04-25T21:59:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 371,
          "created_at": "2026-07-01T21:56:57Z",
          "last_comment_at": "2026-07-03T03:40:44Z",
          "last_comment_author": "finn-devs"
        }
      ],
      "last_merged_pr_at": "2026-01-06T08:49:54Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 5,
          "created_at": "2021-12-29T14:05:17Z",
          "last_comment_at": "2025-02-06T14:07:07Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 10,
          "created_at": "2022-01-17T09:07:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 14,
          "created_at": "2022-01-21T15:31:58Z",
          "last_comment_at": "2023-02-24T05:24:39Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 44,
          "created_at": "2022-03-16T01:17:51Z",
          "last_comment_at": "2022-05-01T10:41:39Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 47,
          "created_at": "2022-03-18T22:04:20Z",
          "last_comment_at": "2022-03-18T23:13:27Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 58,
          "created_at": "2022-04-21T10:59:15Z",
          "last_comment_at": "2025-02-27T11:03:44Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 62,
          "created_at": "2022-04-24T00:29:31Z",
          "last_comment_at": "2023-01-27T19:07:05Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 65,
          "created_at": "2022-04-25T06:47:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 67,
          "created_at": "2022-04-26T07:59:22Z",
          "last_comment_at": "2023-01-23T02:12:22Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 68,
          "created_at": "2022-04-26T08:09:41Z",
          "last_comment_at": "2023-07-12T06:19:39Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 69,
          "created_at": "2022-04-26T08:14:45Z",
          "last_comment_at": "2023-01-28T00:05:32Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 76,
          "created_at": "2022-04-28T21:01:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 91,
          "created_at": "2022-05-05T18:52:46Z",
          "last_comment_at": "2023-02-26T16:58:12Z",
          "last_comment_author": "antoniusnaumann"
        },
        {
          "number": 92,
          "created_at": "2022-05-08T12:12:43Z",
          "last_comment_at": "2023-01-27T19:23:35Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 96,
          "created_at": "2022-05-10T22:25:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 97,
          "created_at": "2022-05-11T01:57:29Z",
          "last_comment_at": "2023-01-24T13:01:13Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 99,
          "created_at": "2022-05-16T15:57:59Z",
          "last_comment_at": "2023-01-21T12:30:43Z",
          "last_comment_author": "chinedufn"
        },
        {
          "number": 102,
          "created_at": "2022-07-20T01:13:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 106,
          "created_at": "2022-07-29T16:40:03Z",
          "last_comment_at": "2024-05-11T23:10:09Z",
          "last_comment_author": "integer-overflown"
        },
        {
          "number": 112,
          "created_at": "2022-09-25T17:47:37Z",
          "last_comment_at": "2022-12-08T12:15:37Z",
          "last_comment_author": "chinedufn"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/chinedufn/swift-bridge",
    "host": "github.com",
    "name": "swift-bridge",
    "owner": "chinedufn"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 47,
        "vitality": 39,
        "community": 66,
        "governance": 60,
        "engineering": 64
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 39,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "commits_last_year": 15,
              "human_commit_share": 1,
              "days_since_last_push": 200,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 200 days ago",
                "points": 3.6,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 200
                    }
                  }
                ],
                "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": "15 commits in the last year",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "releases_count": 42,
              "latest_release_tag": "0.1.59",
              "releases_from_tags": false,
              "days_since_latest_release": 200,
              "mean_days_between_releases": 116.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "42 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 200 days ago",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 200
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~116.7 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 116.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "dormant",
              "guards": [
                "recent_release",
                "dependencies_clean"
              ],
              "signals": [
                "issue_rot",
                "scorecard_unmaintained"
              ],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": 7,
              "unanswered_open_issues": 7,
              "days_since_last_merged_pr": 200,
              "days_since_last_human_commit": 200,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "no human commit for 200 days, with nothing left unanswered; held at dormant by a release within the year, no affected dependency",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_quiet",
                    "params": {
                      "days": 200
                    }
                  },
                  {
                    "code": "abandonment_guarded",
                    "params": {
                      "guards": "a release within the year, no affected dependency"
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 66,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "forks": 77,
              "stars": 1119,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1,119 stars",
                "points": 49.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1119
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "77 forks",
                "points": 15.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 77
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "13 watchers",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 79,
            "inputs": {
              "packages": [
                "swift-bridge"
              ],
              "dependents": null,
              "ecosystems": "crates",
              "total_downloads": 1909127,
              "monthly_downloads": 55776
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "55,776 downloads/month across crates",
                "points": 63.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 55776,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 33,
              "top_contributor_share": 0.811
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 81% of commits",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 81
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "33 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 33
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "merged_prs": 159,
              "open_issues": 92,
              "closed_issues": 100,
              "issue_closed_ratio": 0.521,
              "closed_unmerged_prs": 10
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "52% of issues closed",
                "points": 24.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 52
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "159/169 decided PRs merged",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 159,
                      "decided": 169
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 13/30 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 68,
            "inputs": {
              "followers": 539,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "chinedufn",
              "public_repos": 106,
              "account_age_days": 5101
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "539 followers of chinedufn",
                "points": 19.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 539,
                      "login": "chinedufn"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "106 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 106
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 91,
            "inputs": {
              "packages": [
                "swift-bridge"
              ],
              "ecosystems": "crates",
              "any_deprecated": false,
              "min_days_since_publish": 200
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on crates",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "crates"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 200 days ago",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 200
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "60 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 64,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "rust",
                "swift",
                "ffi",
                "interop",
                "ios"
              ],
              "has_wiki": true,
              "homepage": "https://chinedufn.github.io/swift-bridge",
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://chinedufn.github.io/swift-bridge",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 47,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "9 out of 22 merged PRs checked by a CI test -- score normalized to 4",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 13/30 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the crates:swift-bridge@0.1.59 runtime dependency closure — what installing the published package pulls in — 24 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": "crates:swift-bridge@0.1.59",
                  "assessed": 24
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 24,
              "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": 24,
              "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": 12
            },
            "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": 51,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.79,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "79 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 79,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml",
                "SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml",
                "crates/swift-bridge-build/Cargo.toml",
                "crates/swift-bridge-cli/Cargo.toml",
                "crates/swift-bridge-ir/Cargo.toml",
                "crates/swift-bridge-macro/Cargo.toml",
                "crates/swift-integration-tests/Cargo.toml",
                "examples/async-functions/Cargo.toml",
                "examples/codegen-visualizer/Cargo.toml",
                "examples/multiple-bridge-modules/Cargo.toml",
                "examples/rust-binary-calls-swift-package/Cargo.toml",
                "examples/without-a-bridge-module/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, SwiftRustIntegrationTestRunner/integration-test-create-swift-package/Cargo.toml, SwiftRustIntegrationTestRunner/swift-package-rust-library-fixture/Cargo.toml"
                    }
                  }
                ],
                "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": "Rust (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Rust",
              "largest_source_bytes": 79752,
              "source_files_sampled": 241,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Rust (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Rust"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/241 source files over 60KB",
                "points": 54.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 241,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T12:19:25.911514Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/chinedufn/swift-bridge.svg",
  "full_name": "chinedufn/swift-bridge",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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