JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 699,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 184643,
"Rust": 184311,
"Python": 173933,
"JavaScript": 7266,
"TypeScript": 235365
},
"pushed_at": "2026-07-23T15:42:16Z",
"created_at": "2026-02-11T15:56:48Z",
"owner_type": "User",
"updated_at": "2026-07-23T15:42:06Z",
"description": "Lightweight Webex Mercury WebSocket + KMS message decryption — Node.js, Python, Go, Rust",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript",
"Go",
"Rust",
"Python"
]
},
"owner": {
"blog": null,
"name": "Ergon Copeland",
"type": "User",
"login": "3rg0n",
"company": "Cisco",
"location": "London, UK",
"followers": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/62959009?v=4",
"created_at": "2020-03-31T18:16:10Z",
"is_verified": null,
"public_repos": 18,
"account_age_days": 2308
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.6.14",
"kind": "patch",
"published_at": "2026-07-21T16:28:46Z"
},
{
"tag": "v0.6.13",
"kind": "patch",
"published_at": "2026-07-19T18:13:31Z"
},
{
"tag": "v0.6.12",
"kind": "patch",
"published_at": "2026-06-22T17:28:32Z"
},
{
"tag": "v0.6.11",
"kind": "patch",
"published_at": "2026-06-02T14:29:22Z"
},
{
"tag": "v0.6.10",
"kind": "patch",
"published_at": "2026-06-01T23:20:56Z"
},
{
"tag": "v0.6.9",
"kind": "patch",
"published_at": "2026-04-17T16:45:22Z"
},
{
"tag": "v0.6.8",
"kind": "patch",
"published_at": "2026-04-13T15:36:04Z"
},
{
"tag": "v0.6.7",
"kind": "patch",
"published_at": "2026-04-13T15:09:54Z"
},
{
"tag": "v0.6.6",
"kind": "patch",
"published_at": "2026-04-13T14:02:42Z"
},
{
"tag": "v0.6.5",
"kind": "patch",
"published_at": "2026-04-13T12:23:40Z"
},
{
"tag": "v0.6.4",
"kind": "patch",
"published_at": "2026-04-13T12:12:47Z"
},
{
"tag": "v0.6.3",
"kind": "patch",
"published_at": "2026-04-06T13:35:16Z"
},
{
"tag": "v0.6.2",
"kind": "patch",
"published_at": "2026-04-05T14:58:08Z"
},
{
"tag": "rust/v0.6.1",
"kind": "other",
"published_at": "2026-03-27T23:21:38Z"
},
{
"tag": "go/v0.6.1",
"kind": "other",
"published_at": "2026-03-27T23:21:38Z"
},
{
"tag": "python/v0.6.1",
"kind": "other",
"published_at": "2026-03-27T23:21:37Z"
},
{
"tag": "node/v0.6.1",
"kind": "other",
"published_at": "2026-03-27T23:21:37Z"
},
{
"tag": "rust/v0.6.0",
"kind": "other",
"published_at": "2026-03-27T23:11:10Z"
},
{
"tag": "go/v0.6.0",
"kind": "other",
"published_at": "2026-03-27T23:11:10Z"
},
{
"tag": "python/v0.6.0",
"kind": "other",
"published_at": "2026-03-27T23:11:09Z"
},
{
"tag": "node/v0.6.0",
"kind": "other",
"published_at": "2026-03-27T23:11:09Z"
},
{
"tag": "go/v0.5.1",
"kind": "other",
"published_at": "2026-03-16T15:18:23Z"
},
{
"tag": "go/v0.5.0",
"kind": "other",
"published_at": "2026-02-12T13:19:51Z"
},
{
"tag": "rust/v0.5.0",
"kind": "other",
"published_at": "2026-02-12T12:48:26Z"
},
{
"tag": "python/v0.5.0",
"kind": "other",
"published_at": "2026-02-12T12:48:04Z"
},
{
"tag": "node/v0.5.0",
"kind": "other",
"published_at": "2026-02-12T12:47:54Z"
},
{
"tag": "rust/v0.3.2",
"kind": "other",
"published_at": "2026-02-12T09:15:36Z"
},
{
"tag": "go/v0.3.1",
"kind": "other",
"published_at": "2026-02-12T09:15:26Z"
},
{
"tag": "python/v0.3.1",
"kind": "other",
"published_at": "2026-02-12T09:15:16Z"
},
{
"tag": "node/v0.3.3",
"kind": "other",
"published_at": "2026-02-12T09:15:06Z"
},
{
"tag": "node/v0.3.2",
"kind": "other",
"published_at": "2026-02-12T00:03:54Z"
},
{
"tag": "rust/v0.3.1",
"kind": "other",
"published_at": "2026-02-11T22:52:14Z"
},
{
"tag": "node/v0.3.1",
"kind": "other",
"published_at": "2026-02-11T22:52:04Z"
},
{
"tag": "rust/v0.3.0",
"kind": "other",
"published_at": "2026-02-11T22:18:42Z"
},
{
"tag": "python/v0.3.0",
"kind": "other",
"published_at": "2026-02-11T22:18:32Z"
},
{
"tag": "node/v0.3.0",
"kind": "other",
"published_at": "2026-02-11T22:18:23Z"
},
{
"tag": "go/v0.3.0",
"kind": "other",
"published_at": "2026-02-11T22:16:16Z"
}
],
"recent_commits": [
{
"oid": "fbf1c62c1a51ead882975b4f367f63f6b2e3ad9e",
"body": "Card submit clicks arrive as a conversation.activity (verb=cardAction,\nobject.objectType=submit) whose object.inputs is a JWE-encrypted string\n(dir/A256GCM, under the activity's encryptionKeyUrl — the same key as\nmessage content). Every language's parser type-asserted inputs as an\nobject and silentl\n[…]\n Rust, each with\nnew parser + decryptor tests. Adds an opt-in shape-only debug instrument\n(WMH_DEBUG_RAW_ACTIVITY, Go) that never logs content.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(cards): decrypt JWE object.inputs on Action.Submit (v0.6.15)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-23T15:39:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62affeeec9f1cf670f8775b1d142e1265273bdc9",
"body": "….6.14)\n\nThe library hard-coded the WDM endpoint wdm-a.wbx2.com and never did service\ndiscovery. Webex assigns each org to a region; registering a device in the\nwrong region yields a socket that authorizes and completes the KMS handshake\nbut never receives that org's conversation.activity (REST stil\n[…]\n the 0.6.13 \"backend\nlimitation\" note is marked superseded (root cause was client-side).\n\nThanks to Webex Engineering for the region diagnosis.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(#27): U2C region discovery — register in the org's WDM region (v0…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-21T16:27:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7616855fb7d2f15ee7bb4884849672e601f0029a",
"body": "…s (v0.6.13)\n\nSecurity:\n- ReDoS (CodeQL js/polynomial-redos, high): the <spark-mention> regex used\n two unbounded [^>]* around the attribute, backtracking polynomially on\n crafted message HTML. Rewritten to a single bounded tag match + attribute\n extraction, in Node and Python (both backtracking \n[…]\ncury-sandbox-activity-report.md: #27 write-up (Webex sandbox-org\n Mercury backend limitation — not a library bug; production works, verified).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(security): ReDoS in mention parser + device-leak parity, bump dep…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-19T18:10:47Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9bbc9ac29259f70accb780b29ba0804902e9a042",
"body": "A dependency-free repro tool for the silent-delivery bug (#27). Connects an\nOBSERVER account via the library with debug logging, optionally creates a room +\nadds a second user, then posts round-trip messages AS A SEPARATE POSTER (so they\naren't self-filtered) via REST and reports whether the observe\n[…]\nge), stays healthy (ping/pong), but receives ZERO\nconversation.activity — all round-trips report silent delivery. Isolates the bug\nto the library's Mercury layer, independent of any application stack.",
"is_bot": false,
"headline": "examples: add observe-harness (standalone Mercury delivery repro)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-18T20:48:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a59a4ef76f7ac5a77c869d44a39222860613b9c",
"body": "…auth frame\"\n\nThis reverts commit e9a4ce897dee23e94de26ec98df975dbf9a9d868.",
"is_bot": false,
"headline": "Revert \"fix(mercury): send raw token (not \"Bearer \"-prefixed) in the …",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-18T20:24:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9a4ce897dee23e94de26ec98df975dbf9a9d868",
"body": "The Mercury WebSocket authorization frame must carry the RAW access token in\ndata.token, matching the Webex JS SDK (internal-plugin-mercury socket-base.js\n_authorize: data:{token: this.token}). The Go impl prefixed it with \"Bearer \"\n(the HTTP Authorization header form), which is wrong for the WS aut\n[…]\n complete the handshake (buffer_state returns) yet\nreceive no conversation.activity pushes. Send ms.token unprefixed.\n\nVerified: build + unit tests green. Live delivery to be confirmed on the sandbox.",
"is_bot": false,
"headline": "fix(mercury): send raw token (not \"Bearer \"-prefixed) in the auth frame",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-07-18T20:02:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7239c734bbbd76955fda5e75af93482f523bbe23",
"body": "- node/README: document the Node >=24.0.0 requirement (was undocumented)\n and point Node 22 users to 0.6.9 (last release before the engine bump)\n- go/README: Requires Go 1.26.4+ (was stale \"1.21+\")\n- CONTRIBUTING: bump Node (18->24) and Go (1.21->1.26.4) prerequisites\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update version requirements for v0.6.12",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-06-22T21:40:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c619180aac5f133ff5ab0fb565d4c9a8b3ad1236",
"body": "Node: bump undici 7.24.6 -> 8.5.0 (7 advisories incl. CVE-2026-12151 High,\nDependabot #24). undici 8.x needs Node >=22.19.0, so engines.node raised to\n>=24.0.0 (Node 24 LTS \"Krypton\") — BREAKING for consumers on Node 22.x.\npnpm overrides added for dev-tool transitives (js-yaml, esbuild, @babel/core)\n[…]\n/staticcheck +\ngovulncheck 0, Rust 45 (unchanged). npm audit 1 moderate remaining\n(node-kms>uuid@2, unreachable). Versions: node+python 0.6.12.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(security): remediate Dependabot/GHAS findings + bump deps (v0.6.12)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-06-22T17:26:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "24baf24635727c41152a11f6b5fe705c82b403b6",
"body": "Node: drop the uuid dependency entirely — replace uuid.v4() with built-in\ncrypto.randomUUID() (Node >=22.4.0 is already required). Resolves the\nDependabot bump to ESM-only uuid 14.x (#21) at the root instead of working\naround it. Pin node-jose's transitive uuid to >=11.1.1 and brace-expansion\nto >=5\n[…]\nonly; rand unsound only via rand::rng()+custom logger).\n\nAll tests pass: Node 142, Python 73, Rust 45. cargo audit clean; go\ngovulncheck clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(security): remediate Dependabot/audit findings (v0.6.11)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-06-02T14:27:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4aa46bda0162de5ccaaff1643c3f3340ccd5c312",
"body": "Implements GitHub issues #20 and #23.\n\n#23 (all 4 languages): expose the WDM device registration read-only so\ninbound-only wrappers can make their own outbound calls (e.g. a\nConversation-service read-receipt) using cluster-correct service URLs\ninstead of hardcoding hostnames. Adds deviceRegistration\n[…]\nraw parent\nobject, so ParentID/MessageID were always empty in production.\n\nTests added across all languages; READMEs + CHANGELOG + ADR updated.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: expose WDM service catalog + fix aiohttp connector close (v0.6.10)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-06-01T23:19:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d730cd44284cf1d0751d721cac1a63af97c8b0a2",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.6.9 config options to all READMEs",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-17T16:42:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "922caa8f92f26834cf31809b3890b57657446bfe",
"body": "KMS circuit breaker prevents 30s stalls during outages by failing fast\nafter 3 consecutive failures. KMS key fetch retry handles transient\nerrors with 1 attempt + 1s delay. Optional timing metrics callback\nreports connect and decrypt latency. Delivery guarantees section added\nto all READMEs documenting at-most-once semantics.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add KMS resilience, timing metrics, delivery docs (v0.6.9)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-17T12:20:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "89629418f2d4265603640d6c90362522c5a188ac",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(go): bump go directive to 1.26.2",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T16:26:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fb0cdd56f4c8b09b556aaba890c4f1186c244424",
"body": "Webex returns kms:// (not https://) for the kmsCluster field from the\nencryption service. The URL validator was rejecting it. Also fixed bare\ndomain matching (ciscospark.com) in Node.js and Go validators.\n\nPython was already fixed via PR #16 by @ojaber. This applies the same\nfix to Node.js, Go, and Rust with test coverage for all 4 languages.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: accept kms:// scheme for KMS cluster URL (all languages)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T15:34:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2ddf8bf40ab793010c65ecb196d5df750d8202e4",
"body": "fix: accept kms:// scheme for KMS cluster URL",
"is_bot": false,
"headline": "fix: accept kms:// scheme for KMS cluster URL (#16)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T15:14:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c59ad3f0415aec020dd845e41dc50313e317180a",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.7",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T14:52:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "01cb276181f23de763803dc6733a6a4ead934945",
"body": "Document mentions, message edits, card actions, room events, and files\nfield across Node.js, Python, Go, and Rust READMEs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.6.6 features to all language READMEs",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T14:19:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4f19e2065ef163aaecc1a0b1c751dc49e5ea0bbb",
"body": "…es support\n\nFive new features across all 4 languages (Node.js, Python, Go, Rust):\n\n- Mention parsing: extract mentionedPeople/mentionedGroups from <spark-mention> HTML tags\n- Message edit event (message:updated): verb=update + objectType=comment\n- Adaptive Card submissions (attachmentAction:created\n[…]\neated, room:updated): verb=create/update + objectType=conversation\n- Files field: surface file URLs from Mercury activities on DecryptedMessage\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add mentions, message edits, card actions, room events, and fil…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T14:01:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0589666e8eb70b96a4d6fc4853cf8b29b2a66455",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.5",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T12:22:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0a2e25a6b7fd85cdec808d75cc71dab69ce7d586",
"body": "All four language-specific READMEs now document parentId,\ntoRestId/fromRestId, and threading usage examples.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add threading and ID conversion to language READMEs",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T12:19:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4a88101b1f8b6022803fe4f2fdf262421e5435fa",
"body": "- Add MercuryParent type and parentId field to DecryptedMessage\n across all 4 languages, parsed from Mercury activity parent object\n- Add toRestId/fromRestId utilities to convert between Mercury\n activity UUIDs and Webex REST API base64-encoded IDs\n- Document threading and ID conversion in README with examples\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add thread support (parentId) and Mercury/REST ID conversion",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T12:01:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "59374e8bf0a6d8596e727ef3f7c1afd68df54fd2",
"body": "…ect.id\n\nMercury does not populate activity.object.id for encrypted messages,\nleaving DecryptedMessage.id empty. Use activity.id (the Mercury activity\nUUID) which is always present and works as parentId for threaded replies.\n\nReported by Omar Abduljaber.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: set DecryptedMessage.id from activity.id instead of activity.obj…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-13T11:36:11Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "05f3d0ca032649ab807c33a6f5f522d825787694",
"body": null,
"is_bot": false,
"headline": "test: cover realistic KMS cluster URLs",
"author_name": "Omar",
"author_login": "ojaber",
"committed_at": "2026-04-13T02:23:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab980d5c817e04197a46895fc5dddf2ce06e77e7",
"body": "Webex returns a kms:// scheme in the kmsCluster field from the\nencryption service. The URL validator was requiring https://, which\ncaused KmsError during initialization. The kmsCluster value is used\nas a URI in KMS JSON payloads (not as an HTTP endpoint), so the\nkms:// scheme is correct.",
"is_bot": false,
"headline": "fix: accept kms:// scheme for KMS cluster URL",
"author_name": "Omar",
"author_login": "ojaber",
"committed_at": "2026-04-13T01:32:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aed3f4a116f6d1da4479d77e21a7ea3daa78d717",
"body": "Document disposition of all 18 findings (10 fixed, 3 verified,\n4 accepted, 1 deferred) and update data flow diagram annotations.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: append remediation status to MAESTRO threat model",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-06T17:12:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2c582b245c7321accc1b02ffd13eb70616a06213",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: correct cyclonedx-py SBOM args and add continue-on-error",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-06T13:50:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3883ec57ca4d4eb7d5713e5312ef695e0118d8d0",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update Rust test count to 30",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-06T13:37:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "97d77a010abe0cb00d1c79f91ac79ef2052020e8",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.3",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-06T13:34:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "40a91ede7d45095436266d10929b1ac903a52124",
"body": "Remediates 15 of 18 findings from MAESTRO threat assessment:\n\n- F1 (Critical): Upgrade Python aiohttp 3.13.3→3.13.4 (10 HIGH CVEs),\n pin cryptography>=46.0.6\n- F2 (High): KMS request serialization via mutex (Go, Python)\n- F3 (High): URL validation for all external API responses — enforce\n HTTPS/WS\n[…]\nes),\nF11 (dependency pinning — lockfiles already pin), F13 (token zeroing —\nlanguage-specific complexity), F17-18 (already accepted/mitigated).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "security: remediate MAESTRO threat model findings across all languages",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-06T12:33:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1664207c799ca0880f9daa120f0b6677786ad072",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.2",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-05T14:57:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "79efe5b5445b16ed1071bd5bf2f8c1d9b1703025",
"body": "… findings\n\nGo: go-jose/v4 v4.0.5→v4.1.4 (JWE decryption panic, DoS parsing).\nNode: lodash 4.17.23→4.18.1 via pnpm override (code injection, prototype pollution).\ngolang.org/x/crypto SSH alerts auto-resolved (unused subpackages).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: upgrade go-jose v4.1.4 and override lodash 4.18.1 for Dependabot…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-05T08:53:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f1cd5eb5edcff3e08b111e342afd246530991b88",
"body": "Scans JavaScript/TypeScript, Go, and Python on push, PR,\nand weekly schedule. Rust is not yet supported by CodeQL.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: add CodeQL code scanning workflow",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-04T21:26:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fe59856d24754df7912711dc79fe809d8f08c7e4",
"body": "Document how to use OAuth tokens with the existing reconnect(newToken)\nAPI. The library already handles 401/4401 auth failures by emitting\nAuthError and stopping reconnection — the app just needs to refresh\nthe token and call reconnect().\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add OAuth integration token pattern to README",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-04-03T15:32:16Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cf4bdcf4ee727d199d0e0c9a0437e3cc7b34d60e",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.6.1 changelog and update README test counts",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-28T10:07:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c0347479cc0feb2403ed161623702237d2d436d6",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-27T23:20:49Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dfb82b8067fd9fdbd266679d3336bbe496fc4608",
"body": "…guages\n\nGo:\n- Upgrade go-jose v4.0.4→v4.0.5 (fixes DoS in JWE parsing, GO-2025-3485)\n- Upgrade golang.org/x/crypto v0.31.0→v0.49.0 (multiple CVEs)\n- Fix staticcheck SA1012: replace nil contexts with context.TODO() in tests\n\nPython:\n- Narrow broad exception handlers flagged by bandit (B110)\n- Replac\n[…]\nde rustls-webpki 0.103.9→0.103.10 (CRL validation, RUSTSEC-2026-0049)\n- Document rsa Marvin side-channel as false positive (encrypt-only usage)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: security scanner findings and dependency upgrades across all lan…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-27T23:08:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9d8e7d7a562ed76c32cf63b2fa5ba4ca87055c7f",
"body": "…r/websocket\n\nnhooyr.io/websocket is deprecated — the maintainer moved the library to\ngithub.com/coder/websocket. Same API, new module path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(go): migrate websocket library from nhooyr.io/websocket to code…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-27T22:45:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9631cf5b7d86d3ea490de66ae864c89a20b19d62",
"body": "- kms_client.go: check json.Unmarshal error on local JWK\n- kms_client.go: acknowledge body drain/close errors\n- device_manager.go: acknowledge body drain error\n- mercury_socket.go: acknowledge conn.Close error\n- examples/basic-bot: acknowledge Disconnect error\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(go): handle all gosec G104 unhandled error findings",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-27T22:26:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e629bd089a3ce6dbfcb0889275c5abe3fde71f4c",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump all versions to 0.6.0",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-19T21:04:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9439a1bace5425517b0f1e0d3a61091d9757a785",
"body": "…nguages\n\nGo:\n- Add RWMutex to WebexMessageHandler protecting shared state fields\n- Replace recursive reconnect() with iterative loop (prevents stack overflow)\n- Protect MercurySocket boolean fields with mutex helpers\n- Use cancelable context for activity handlers instead of context.Background()\n- L\n[…]\ndiscard\n- Set 1MB WebSocket message size limit\n- Validate ECDH remote JWK has kty=EC and crv=P-256\n- Replace unwrap() with descriptive expect()\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: concurrency, security, and robustness improvements across all la…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-19T21:03:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ab3dae7c2e70d8bd09d4a7b1572f12308b74b350",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.1 to CHANGELOG",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-16T15:21:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a51ed61852e110145586631014fa53fe5cf026cd",
"body": "…reconnection\n\npendingPongID was accessed from multiple goroutines without mutex\nprotection. Go strings are (pointer, length) headers — concurrent\nread/write can corrupt the header, causing == to dereference a nil\ndata pointer.\n\nAlso fixes:\n- closeWebSocket now cancels context, stopping stale ping/pong goroutines\n- triggerReconnect guard prevents concurrent reconnection attempts\n- Pong timeout goroutine respects context cancellation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(go): race condition in ping loop causes nil pointer panic during …",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-03-16T15:17:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2d708ff99f5309dd6efe3fde9a2e248c062081b1",
"body": "Changed module path from github.com/ecopelan/webex-message-handler-go\nto github.com/3rg0n/webex-message-handler/go to match the consolidated\nmonorepo structure under the 3rg0n organization.\n\nUpdated in:\n- go.mod module declaration\n- All import statements in tests and examples\n- Documentation (README.md, API.md)\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(go): update module path to monorepo structure",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T13:17:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ac0593878e101717b0e123d9ed7252299da051ad",
"body": "- Correct Rust README: tokio-tungstenite does not read proxy env vars\n- Add trust_env=True to Python native HTTP adapter for proxy support\n- Add v0.5.0 changelog entry\n\nCloses #6\nCloses #7\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: Rust README proxy docs, Python trust_env, update CHANGELOG",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:59:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c6f826d49b39b8ab7b79e8ed92c19cb85fb1ffc1",
"body": "Add mitmproxy-based proxy validation scripts for Python, Go, and Rust.\nAdd Node.js e2e integration test.\n\nCloses #9\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: add proxy validation and e2e test scripts for all languages",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:58:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ae014164e1efd4f98f31b72e0eb6b5b33ca06b72",
"body": "Replace deprecated elliptic.Marshal() with (*ecdsa.PublicKey).ECDH().\nRemove dead code and unused imports.\n\nCloses #12\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(go): bump to go 1.24, modernize ECDH key derivation",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:57:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "795b300e6b8bdc43f52d21daac1c89bcb1530f7d",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump versions to 0.5.0 for membership event release",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:47:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "760e326611bf40ed7812af953e9fe6625330a7f3",
"body": "Add MembershipActivity type and membership:created event for Mercury\nmembership activities (add, leave, assignModerator, unassignModerator)\nwith objectType=person. No decryption needed — membership activities\nare unencrypted. No self-message filtering — bots should see their\nown membership events.\n\nAlso fixes all pre-existing lint issues across Python (ruff), Rust\n(clippy), and cleans up unused imports/variables.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add membership:created event support (all 4 languages)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:46:32Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f3fcc67cb5d8a5714296d99551ca511bc4440ca7",
"body": "actions/setup-go@v5 looks for go.sum at the repo root by default.\nSince ours is in the go/ subdirectory, set cache-dependency-path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: fix Go cache warning by pointing to go/go.sum",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:04:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4289d9b57839158be2dd068472dcf32c9d415cbb",
"body": "…fix)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(python): bump to 0.4.4 (0.4.3 published without mercury_socket …",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:03:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5820460d40bcc67c0eaf62312b6c6d1178d0ec83",
"body": "All 4 language integration tests run in parallel against the same bots.\nMessages from other tests (Python, Go, Rust) would bump the message\ncount and cause the Node.js test to falsely report self-filtering as\nbroken. Now only counts messages matching the test pattern.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(node): e2e test ignores unrelated messages from concurrent tests",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T12:01:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ddbc02f0f7dcfd115589da113604764ddd7ea295",
"body": "…ocket\n\n- Add `import aiohttp` (needed for WSMsgType, WSCloseCode references)\n- Change `.send()` to `.send_str()` for auth and ping messages\n (aiohttp ClientWebSocketResponse uses send_str for text)\n- Use literal 1000 for close code instead of aiohttp.WSCloseCode.OK\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(python): add missing aiohttp import and fix send_str in mercury_s…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:59:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "97e6e9a54387ec5fcbb7498b6d9922858765608b",
"body": "…ership\n\n- Remove undefined `connector` reference in KmsClient.__init__ (NameError in production)\n- Fix connector_owner logic: let session own auto-created connector when\n no user connector is provided, preventing \"Unclosed connector\" warnings\n- Bump Python version to 0.4.3\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(python): remove stale connector ref in KmsClient, fix session own…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:56:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9d61b9885e165e6dd95e22b8af1a1183484c1106",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(python): bump version to 0.4.2",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:54:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "de4476b26a111841ccc646dae040972d07d15702",
"body": "The native HTTP adapter used async context managers that closed the\naiohttp session before the caller could read response.json(). This\ncaused ClientConnectionError in production (including CI integration\ntests). Now reads the body bytes eagerly inside the try block and\nreturns a wrapper with the cached data.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(python): read HTTP response body eagerly before closing session",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:54:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "090f54756d697ef24fca5de6c07276e96a005281",
"body": "- Node.js 20 → 22 (package requires >=22.4.0)\n- pnpm 8 → 9\n- Add pnpm build step before e2e test\n- Fix test command: npx tsx src/test/integration.test.ts → node test-e2e.js\n- Python 3.11 → 3.12\n- Go 1.21 → 1.24\n- actions/cache v3 → v4\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: fix integration test workflow for v0.4.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:43:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "36e4fe527918d2808c8e0d097a69217bce3807e3",
"body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump Rust and Python versions to 0.4.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:33:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "33553c08f96163b082809325d199bdd2eb3d2c0d",
"body": "…guages)\n\nconnect() now throws if /people/me is unreachable when\nignoreSelfMessages is enabled, preventing silent degradation to\nunprotected mode. Previously this silently skipped filtering.\n\nAdded \"Important: Implementing Loop Detection\" section to all 4\nREADMEs explaining that the library only sees the receive side and\nrecommending wrapper-level rate limiting for send loops.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: fail-closed on /people/me failure + loop detection docs (all lan…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:19:52Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "388e818e1e17ce4d646d65a42e64dfbe1329da7c",
"body": "The receiver bot now replies to every incoming message via REST API.\nMercury echoes the reply back. If ignoreSelfMessages works correctly,\nthe handler silently drops it. If broken, the test fails with explicit\nLOOP DETECTED or SELF-MESSAGE NOT FILTERED errors.\n\nThis would have caught the ID format mismatch bug immediately.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(node): bidirectional e2e test that exercises self-message filtering",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:07:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "44164f8cade0fd75f55d05bf6e66abb1cef02b02",
"body": "The Webex REST API (/v1/people/me) returns base64-encoded IDs\n(ciscospark://us/PEOPLE/<uuid>) while Mercury wire format uses raw\nUUIDs. The direct equality comparison always failed, so\nignoreSelfMessages never actually filtered anything, causing infinite\nmessage loops in production.\n\nAdded extractPe\n[…]\nrmalize both formats\nto the raw UUID before comparison. Updated tests to use realistic\nmismatched ID formats that reproduce the real-world bug.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: self-message filtering ID format mismatch (all languages) — v0.4.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T11:02:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cbfbfe1cce12d807216d9832e86cf50767f0a4d1",
"body": "BREAKING CHANGES:\n- `agent` config field replaced with `dispatcher` (accepts undici Dispatcher)\n- Node.js engine requirement raised to >=22.4.0\n- Removed `ws` and `@types/ws` dependencies\n- `undici` moved to production dependency\n\nA single ProxyAgent now proxies both fetch() and WebSocket in native \n[…]\n.on() interface, preserving the existing mercury-socket contract.\n\nAll 128 unit tests pass, e2e integration test passes, mitmproxy test passes.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(node)!: migrate from ws to native WebSocket (undici) — v0.4.0",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T10:13:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9da6eda3cad8838a12165b4145d30bf68956182d",
"body": "Bots automatically filter their own messages out of the box,\npreventing infinite response loops without any configuration.\n\n- Node.js 0.3.3: default changed from false to true\n- Python 0.3.1: new feature with default true\n- Go: new feature with default true (*bool for nil=true)\n- Rust 0.3.2: new fea\n[…]\nth default true\n\nEach language fetches /people/me on connect, caches the bot's\nperson ID, and filters matching messages before emitting events.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: add ignoreSelfMessages (default true) to all languages",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T09:14:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f17300d9359d4dc046c1d49c472cba7a1e80065e",
"body": "There is no practical reason for a bot to process its own messages\nechoed back through Mercury. The bot already knows what it sent via\nthe REST API response. Defaulting to true prevents message loops\nout of the box. Set ignoreSelfMessages: false to opt out.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: default ignoreSelfMessages to true",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T09:06:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7486361e465643a542f91ec0ba3eb965f5d13e1f",
"body": "Replaces simulated tests with actual handler integration tests that:\n- Mock sub-components (DeviceManager, Mercury, KMS, Decryptor)\n- Let the handler's real _handleActivity filtering logic run\n- Reproduce the runaway loop bug (bot processes own echoes)\n- Prove ignoreSelfMessages prevents the loop\n- Verify /people/me caching and graceful degradation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: real integration test for message loop prevention",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T09:02:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "820af7e241d2dc3f6da1fa92c7f51e5e7ad76959",
"body": "…ion tests",
"is_bot": false,
"headline": "test: remove overly complex integration tests, keep simple demonstrat…",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T08:56:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "822263865b289af00cf6a65b80c81dc003321a51",
"body": null,
"is_bot": false,
"headline": "docs: remove internal product references from tests and documentation",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T08:56:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee71bf7d71969ce86d3fa08b7fa7336b12df4c7e",
"body": null,
"is_bot": false,
"headline": "docs: update CHANGELOG with loop prevention tests",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T00:14:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97e10ba0d3334e9f56975490f2ae96c5f73aae31",
"body": "- Demonstrates infinite loop without ignoreSelfMessages\n- Validates filtering prevents loops\n- Shows multi-user conversation handling\n- Documents OKRatlas issue scenario",
"is_bot": false,
"headline": "test: add message loop prevention validation tests",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T00:14:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "782c70032c126c8d5be61958f46c96455181235d",
"body": "Version 0.3.2 includes:\n- New ignoreSelfMessages feature to prevent bot message loops\n- WebSocket proxy documentation for injected mode\n- Comprehensive proxy and self-message filtering tests\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: bump version to 0.3.2 and add CHANGELOG",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T00:02:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1d41e2a417b07401c786408be850082f177e6a13",
"body": "Add built-in self-message filtering to prevent infinite response loops,\naddressing common bot development issue discovered in production usage.\n\nFeatures:\n- New ignoreSelfMessages config option (default: false)\n- Automatically fetches bot's person ID on connect()\n- Caches person ID for session lifet\n[…]\nPersonInfo type\n- _fetchBotPersonId() method\n- Filtering logic in _handleActivity()\n- 5 new tests (all passing)\n- Comprehensive documentation\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(node): add ignoreSelfMessages option to prevent message loops",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-12T00:00:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9aeeb5c0b6f3615fd88f56227cff6bc385039b85",
"body": "Add comprehensive documentation and examples for proxy support in\ninjected mode, addressing real-world issue where WebSocket connections\nbypassed proxy configuration.\n\nKey additions:\n- Updated README.md with proxy example for injected mode\n- Added Node.js README section on advanced proxy configurati\n[…]\nte addresses production issue discovered in\nOKRatlas deployment where HTTP requests succeeded through proxy\nbut WebSocket connections failed.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(node): add WebSocket proxy configuration for injected mode",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T23:32:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0af134881aa04afab88a7c1719ab0f23643248b1",
"body": "Add 14 tests validating proxy configuration and usage:\n- ProxyAgent (undici) support\n- http.Agent and https.Agent support\n- Native vs injected mode validation\n- Configuration error handling\n- Environment variable pattern support\n\nAll tests passing. Added undici as devDependency for testing.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(node): add comprehensive proxy support test suite",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T23:17:11Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3138968945e97af2bc5fb07e189b469d14e05744",
"body": "Bump version to include TypeScript fixes from commits after 0.3.0 release.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(node): bump version to 0.3.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:48:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "88186bc03bca128bf0b44de1147da077bd7e4dbc",
"body": "Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: rename workflow to publish.yml to match PyPI config",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:46:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "72055a31bc7a95b842d010e88e9b95902e2bade5",
"body": "Add GitHub Actions workflow for automated PyPI publishing using\ntrusted publishing (OIDC). This eliminates the need for API tokens\nand provides more secure package publishing.\n\nTo use:\n1. Configure trusted publisher at https://pypi.org/manage/account/publishing/\n2. Trigger manually or automatically on GitHub releases\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: add trusted publishing workflow for PyPI",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:46:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "25e2eb6a341cf5cf7c9b8418a01d7c65d9647df1",
"body": "Bump version to republish with unused variable fix since crates.io\ndoesn't allow republishing yanked versions.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(rust): bump version to 0.3.1",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:41:23Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "59190c708fca97a17b99d04837d8814896317ee0",
"body": "Remove leftover unused client variable from adapter refactoring.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(rust): remove unused client variable",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:38:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "267d9cf1837401ce5d9a1ae25c19ca6a1d0939b5",
"body": "Update proxy documentation to recommend undici's ProxyAgent instead of\nHttpsProxyAgent for Node.js v18+ environments. Node.js native fetch()\nuses undici internally, so undici's ProxyAgent provides more reliable\nproxy support than traditional https-proxy-agent.\n\nKey changes:\n- Updated README.md proxy\n[…]\n may still work in some cases, this change helps\nusers avoid the \"TypeError: fetch failed\" issue encountered in\ncorporate proxy environments.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: recommend undici ProxyAgent for Node.js proxy support",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:30:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2195af813947e5daa75e513c6af24f154431d788",
"body": "- Remove unused 'agent' field from handler\n- Update WsFactoryFn type to support both native WebSocket and InjectedWebSocket\n- Remove unused http/https imports from mercury-socket\n- Use type assertions for WebSocket event listeners to support both types\n- Handle both string and Buffer types in message/close event handlers\n- All 105 tests passing\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Node.js TypeScript build errors",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:25:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c337cebd80decb2bd91e61b32b0182e116ed3c78",
"body": "Add support for injecting custom networking implementations across all four languages (Node.js, Python, Go, Rust). This enables wrappers to intercept, log, mock, or route all network calls without the library knowing.\n\nKey changes:\n- Add explicit 'mode' config field ('native' or 'injected')\n- Implem\n[…]\n- Version bumps: Node.js 0.3.0, Python 0.3.0, Go 0.3.0, Rust 0.3.0\n\nNative mode maintains 100% backward compatibility with v0.2.0.\n\nCloses #4\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Implement dependency injection for fetch/WebSocket (Issue #4)",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T22:12:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ba114cfbcbaee3a85696483f1b937bdaacb8a103",
"body": "New features:\n- Add proxy support via connector/client parameter\n- Add integration tests with two-bot pattern",
"is_bot": false,
"headline": "Bump Python and Rust versions to 0.2.0",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:48:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "797be094c183cc2eae406c6327a965f596c4da19",
"body": "New features:\n- Add proxy support via agent parameter\n- Add integration tests with two-bot pattern",
"is_bot": false,
"headline": "Bump version to 0.2.0",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:47:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad209b79bac083ec30f37cca28ae7deaf9a501f8",
"body": null,
"is_bot": false,
"headline": "Fix import path in Node.js integration test",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:45:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "051062ca871dfbd0c9b7b023f49c18f4930e7f7c",
"body": "The test file doesn't need to be part of the compiled library output.\nUse tsx to run the TypeScript test directly.",
"is_bot": false,
"headline": "Run Node.js integration test with tsx instead of compiling",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:44:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a34421ad6993072e1ab48e3b33bbfd7c3cee2f02",
"body": "- Node.js: Move test to src/test/ for compilation to dist/\n- Go: Update to use WEBEX_BOT_TOKEN (receiver) and WEBEX_BOT_TOKEN_TEST (sender)\n- Rust: Update to use two-bot pattern, suppress unused field warning\n\nAll tests now send message FROM sender bot TO receiver bot instead of\ntrying to send to self (which returns HTTP 400).",
"is_bot": false,
"headline": "Fix integration tests to use two-bot pattern",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:42:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f8869ca904ecf1be38b2db6d89070962a9da123a",
"body": "- Bot-to-bot messaging confirmed working! (HTTP 200 OK)\n- Change from self-messaging (blocked) to sender→receiver pattern\n - Receiver bot (WEBEX_BOT_TOKEN): OKR Atlas - runs handler, listens for messages\n - Sender bot (WEBEX_BOT_TOKEN_TEST): experts - sends test message\n- Update Node.js test to fe\n[…]\n WEBEX_TEST_TARGET_EMAIL (no longer needed with two tokens)\n\nThis fixes the HTTP 400 error caused by bots being unable to message themselves.\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update integration tests to use two-bot pattern",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:37:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2608550a1c3906e54833360a72808f0abb37a103",
"body": "- Remove invalid pnpm-workspace.yaml (was causing Node.js install failure)\n- Fix Node.js test to run built version (dist/test/integration.test.js)\n- Fix Go test linting errors (redundant newlines in fmt.Println)\n- Fix Rust test compilation error (disconnect() returns () not Result)\n- Update Python t\n[…]\nests to use WEBEX_TEST_TARGET_EMAIL\n- Update workflow to set WEBEX_TEST_TARGET_EMAIL secret\n- Update TESTING.md with workaround documentation\n\nCo-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix integration test issues",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:29:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "10a15a23489df230ca41f06bd4f57c06db118a95",
"body": "- Add agent/connector/client parameter for proxy support (Node.js, Python, Go, Rust)\n- Add integration tests for all languages\n- Add GitHub Actions workflow for CI/CD integration testing\n- Add TESTING.md documentation\n- Set WEBEX_BOT_TOKEN secret\n\nFixes #1",
"is_bot": false,
"headline": "Add proxy support and integration tests for all languages",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T20:26:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c732c6c034d3a2ddd09a742dd67eba09bf5e736c",
"body": "- Update repository URLs to 3rg0n/webex-message-handler\n- Rust: crates.io ready\n- Python: PyPI ready\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update Rust and Python package metadata for publishing",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T18:38:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cb9c18c25b8e650b504dddecc7a8bd86abd2f842",
"body": "- Update repository URL to 3rg0n/webex-message-handler\n- Add monorepo directory field\n- Change license from Apache-2.0 to MIT (matches root)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update Node.js package.json for npm publish",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T17:21:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "dd9c3fcd3ad15bab3ceb5c8485e8935367db6961",
"body": "Captures every non-obvious detail discovered while porting across\nfour languages: two-channel KMS pattern, dir vs A256KW JWE,\nJWE/JWS detection, ECDH flow, Mercury auth, concurrency pitfalls,\nand common mistakes ranked by debugging cost.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add PORTING.md with implementation insights and protocol details",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T16:35:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e68b4a44a33f2042081d005c9c6bac0b45fda499",
"body": "Guidelines for setup, testing, code style, and PR process\nacross all four language implementations.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add CONTRIBUTING.md",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:56:38Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "30ef06593ca15bd7ceebe783d76ba091b7829990",
"body": "Root README with quick-start examples for all four languages,\narchitecture overview, and links to per-language API docs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add monorepo root documentation",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:53:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cebed7204ad76480dd0507d9516cd1046c6283ad",
"body": "Rust port using tokio, reqwest, tokio-tungstenite, and josekit.\nIncludes source, tests (12 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Rust implementation in rust/ subdirectory",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:53:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c2c385c7777035b0caca7143a1fc7101f6cd766",
"body": "Go port using nhooyr.io/websocket, go-jose/v4, and crypto/ecdh.\nIncludes source, tests (68 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Go implementation in go/ subdirectory",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:52:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "59367ae73251f8efd8777a8685e3bc5921955e9a",
"body": "Async Python port using aiohttp, jwcrypto, and asyncio.\nIncludes source, tests (41 passing), examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Python implementation in python/ subdirectory",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:52:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e8dfd2d3c5df9139151cc817084f7310c83ca163",
"body": "Webex Mercury WebSocket + KMS message decryption library.\nIncludes source, tests, examples, and API documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Node.js/TypeScript implementation in node/ subdirectory",
"author_name": "Ergon Copeland",
"author_login": "3rg0n",
"committed_at": "2026-02-11T15:51:43Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 37,
"commits_last_year": 97,
"latest_release_at": "2026-07-21T16:28:46Z",
"latest_release_tag": "v0.6.14",
"releases_from_tags": false,
"days_since_last_push": 3,
"active_weeks_last_year": 10,
"days_since_latest_release": 5,
"mean_days_between_releases": 11
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/3rg0n/webex-message-handler/go",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/3rg0n/webex-message-handler/go",
"is_deprecated": false,
"latest_version": "v0.6.15",
"repository_url": "https://github.com/3rg0n/webex-message-handler",
"versions_count": 20,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-23T15:39:51Z",
"latest_version_yanked": null,
"days_since_latest_publish": 3
},
{
"name": "webex-message-handler",
"exists": true,
"license": "MIT",
"keywords": [
"bot",
"kms",
"mercury",
"webex",
"websocket",
"network-programming",
"web-programming"
],
"ecosystem": "crates",
"matches_repo": true,
"registry_url": "https://crates.io/crates/webex-message-handler",
"is_deprecated": false,
"latest_version": "0.6.15",
"repository_url": "https://github.com/3rg0n/webex-message-handler",
"versions_count": 21,
"total_downloads": 400,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 57,
"first_published_at": "2026-02-11T18:53:10.017355Z",
"latest_published_at": "2026-07-23T15:58:47.143587Z",
"latest_version_yanked": false,
"days_since_latest_publish": 3
},
{
"name": "webex-message-handler",
"exists": true,
"license": "MIT",
"keywords": [
"webex",
"mercury",
"websocket",
"kms",
"bot",
"messaging"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/webex-message-handler",
"is_deprecated": false,
"latest_version": "0.6.15",
"repository_url": "https://github.com/3rg0n/webex-message-handler",
"versions_count": 15,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 2348,
"first_published_at": "2026-02-11T18:37:36.491000Z",
"latest_published_at": "2026-07-23T15:58:25.600000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 3
},
{
"name": "webex-message-handler",
"exists": true,
"license": "MIT",
"keywords": [
"bot",
"kms",
"mercury",
"messaging",
"webex",
"websocket",
"Development Status :: 4 - Beta",
"Framework :: AsyncIO",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Communications :: Chat"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/webex-message-handler/",
"is_deprecated": false,
"latest_version": "0.6.14",
"repository_url": "https://github.com/3rg0n/webex-message-handler",
"versions_count": 17,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": "2026-02-12T12:04:13.534632Z",
"latest_published_at": "2026-07-21T16:29:21.300074Z",
"latest_version_yanked": null,
"days_since_latest_publish": 5
}
]
},
"popularity": {
"forks": 2,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-04-13",
"count": 1
},
{
"date": "2026-06-09",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 3
},
"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": [
"node/tsconfig.json"
],
"toolchain_manifests": [
"go/go.mod",
"rust/Cargo.toml"
],
"largest_source_bytes": 44381,
"source_files_sampled": 99,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go/go.mod",
"node/package.json",
"python/pyproject.toml",
"rust/Cargo.toml"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [
{
"name": "brace-expansion",
"direct": false,
"version": "1.1.13",
"severity": "high",
"ecosystem": "npm",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-3jxr-9vmj-r5cp",
"GHSA-mh99-v99m-4gvg"
],
"fixed_version": "5.0.8",
"advisory_count": 2,
"oldest_advisory_days": 6
},
{
"name": "brace-expansion",
"direct": false,
"version": "5.0.6",
"severity": "high",
"ecosystem": "npm",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-3jxr-9vmj-r5cp",
"GHSA-mh99-v99m-4gvg"
],
"fixed_version": "5.0.8",
"advisory_count": 2,
"oldest_advisory_days": 6
},
{
"name": "js-yaml",
"direct": false,
"version": "5.0.0",
"severity": "high",
"ecosystem": "npm",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-724g-mxrg-4qvm",
"GHSA-g796-fgmg-93mv",
"GHSA-pm4m-ph32-ghv5"
],
"fixed_version": "5.2.2",
"advisory_count": 3,
"oldest_advisory_days": 6
},
{
"name": "uuid",
"direct": false,
"version": "2.0.3",
"severity": "high",
"ecosystem": "npm",
"cvss_score": 7.5,
"advisory_ids": [
"GHSA-w5hq-g745-h8pq"
],
"fixed_version": "13.0.1",
"advisory_count": 1,
"oldest_advisory_days": 95
},
{
"name": "golang.org/x/crypto",
"direct": true,
"version": "v0.54.0",
"severity": "unknown",
"ecosystem": "go",
"cvss_score": null,
"advisory_ids": [
"GO-2026-5932"
],
"fixed_version": null,
"advisory_count": 1,
"oldest_advisory_days": 19
}
],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {
"high": 4,
"unknown": 1
},
"advisory_count": 9,
"affected_count": 5,
"assessed_count": 516,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 30,
"direct_affected_count": 1
},
"ecosystems": [
"crates",
"go",
"npm",
"pypi"
],
"dependencies": [
{
"name": "github.com/go-jose/go-jose/v4",
"manifest": "go/go.mod",
"ecosystem": "go",
"version_constraint": "v4.1.4"
},
{
"name": "github.com/google/uuid",
"manifest": "go/go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "golang.org/x/crypto",
"manifest": "go/go.mod",
"ecosystem": "go",
"version_constraint": "v0.54.0"
},
{
"name": "github.com/coder/websocket",
"manifest": "go/go.mod",
"ecosystem": "go",
"version_constraint": "v1.8.15"
},
{
"name": "node-jose",
"manifest": "node/package.json",
"ecosystem": "npm",
"version_constraint": "^2.2.0"
},
{
"name": "node-kms",
"manifest": "node/package.json",
"ecosystem": "npm",
"version_constraint": "^0.4.1"
},
{
"name": "undici",
"manifest": "node/package.json",
"ecosystem": "npm",
"version_constraint": "^8.7.0"
},
{
"name": "aiohttp",
"manifest": "python/pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.14.1"
},
{
"name": "cryptography",
"manifest": "python/pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=48.0.1"
},
{
"name": "jwcrypto",
"manifest": "python/pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.5.7"
},
{
"name": "tokio",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "tokio-tungstenite",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.24"
},
{
"name": "reqwest",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.12"
},
{
"name": "serde",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "serde_json",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "uuid",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "thiserror",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2"
},
{
"name": "tracing",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1"
},
{
"name": "url",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2"
},
{
"name": "futures-util",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.3"
},
{
"name": "base64",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.22"
},
{
"name": "p256",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.13"
},
{
"name": "hkdf",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.12"
},
{
"name": "sha1",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.10"
},
{
"name": "sha2",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.10"
},
{
"name": "rand",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.8"
},
{
"name": "aes-gcm",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.10"
},
{
"name": "aes-kw",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.2"
},
{
"name": "rsa",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.9"
},
{
"name": "regex",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "once_cell",
"manifest": "rust/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "aes-gcm",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "aes-kw",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "base64",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "futures-util",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "hkdf",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "once_cell",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "p256",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "rand",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "regex",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "reqwest",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "rsa",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "serde_json",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "sha1",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "sha2",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "thiserror",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tokio",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tokio-tungstenite",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "tracing",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "url",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "uuid",
"direct": true,
"version": null,
"ecosystem": "crates"
},
{
"name": "github.com/coder/websocket",
"direct": true,
"version": "v1.8.15",
"ecosystem": "go"
},
{
"name": "github.com/go-jose/go-jose/v4",
"direct": true,
"version": "v4.1.4",
"ecosystem": "go"
},
{
"name": "github.com/google/uuid",
"direct": true,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/crypto",
"direct": true,
"version": "v0.54.0",
"ecosystem": "go"
},
{
"name": "node-jose",
"direct": true,
"version": "2.2.0",
"ecosystem": "npm"
},
{
"name": "node-kms",
"direct": true,
"version": "0.4.1",
"ecosystem": "npm"
},
{
"name": "undici",
"direct": true,
"version": "8.7.0",
"ecosystem": "npm"
},
{
"name": "aiohttp",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "cryptography",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "jwcrypto",
"direct": true,
"version": null,
"ecosystem": "pypi"
},
{
"name": "tracing-subscriber",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "wiremock",
"direct": false,
"version": null,
"ecosystem": "crates"
},
{
"name": "@babel/code-frame",
"direct": false,
"version": "7.29.0",
"ecosystem": "npm"
},
{
"name": "@babel/code-frame",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/compat-data",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/core",
"direct": false,
"version": "8.0.1",
"ecosystem": "npm"
},
{
"name": "@babel/generator",
"direct": false,
"version": "7.29.1",
"ecosystem": "npm"
},
{
"name": "@babel/generator",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/helper-compilation-targets",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/helper-globals",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/helper-plugin-utils",
"direct": false,
"version": "7.28.6",
"ecosystem": "npm"
},
{
"name": "@babel/helper-string-parser",
"direct": false,
"version": "7.27.1",
"ecosystem": "npm"
},
{
"name": "@babel/helper-string-parser",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/helper-validator-identifier",
"direct": false,
"version": "7.28.5",
"ecosystem": "npm"
},
{
"name": "@babel/helper-validator-identifier",
"direct": false,
"version": "8.0.2",
"ecosystem": "npm"
},
{
"name": "@babel/helper-validator-option",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/helpers",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/parser",
"direct": false,
"version": "7.29.2",
"ecosystem": "npm"
},
{
"name": "@babel/parser",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-async-generators",
"direct": false,
"version": "7.8.4",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-bigint",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-class-properties",
"direct": false,
"version": "7.12.13",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-class-static-block",
"direct": false,
"version": "7.14.5",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-import-attributes",
"direct": false,
"version": "7.28.6",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-import-meta",
"direct": false,
"version": "7.10.4",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-json-strings",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-jsx",
"direct": false,
"version": "7.28.6",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-logical-assignment-operators",
"direct": false,
"version": "7.10.4",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-nullish-coalescing-operator",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-numeric-separator",
"direct": false,
"version": "7.10.4",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-object-rest-spread",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-optional-catch-binding",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-optional-chaining",
"direct": false,
"version": "7.8.3",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-private-property-in-object",
"direct": false,
"version": "7.14.5",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-top-level-await",
"direct": false,
"version": "7.14.5",
"ecosystem": "npm"
},
{
"name": "@babel/plugin-syntax-typescript",
"direct": false,
"version": "7.28.6",
"ecosystem": "npm"
},
{
"name": "@babel/template",
"direct": false,
"version": "7.28.6",
"ecosystem": "npm"
},
{
"name": "@babel/template",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/traverse",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@babel/types",
"direct": false,
"version": "7.29.0",
"ecosystem": "npm"
},
{
"name": "@babel/types",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "@bcoe/v8-coverage",
"direct": false,
"version": "0.2.3",
"ecosystem": "npm"
},
{
"name": "@cspotcode/source-map-support",
"direct": false,
"version": "0.8.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/aix-ppc64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/android-arm",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/android-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/android-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/darwin-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/darwin-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/freebsd-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/freebsd-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-arm",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-ia32",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-loong64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-mips64el",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-ppc64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-riscv64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-s390x",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/linux-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/netbsd-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/netbsd-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/openbsd-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/openbsd-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/openharmony-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/sunos-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/win32-arm64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/win32-ia32",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@esbuild/win32-x64",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "@eslint-community/eslint-utils",
"direct": false,
"version": "4.9.1",
"ecosystem": "npm"
},
{
"name": "@eslint-community/regexpp",
"direct": false,
"version": "4.12.2",
"ecosystem": "npm"
},
{
"name": "@eslint/eslintrc",
"direct": false,
"version": "2.1.4",
"ecosystem": "npm"
},
{
"name": "@eslint/js",
"direct": false,
"version": "8.57.0",
"ecosystem": "npm"
},
{
"name": "@humanwhocodes/config-array",
"direct": false,
"version": "0.11.14",
"ecosystem": "npm"
},
{
"name": "@humanwhocodes/module-importer",
"direct": false,
"version": "1.0.1",
"ecosystem": "npm"
},
{
"name": "@humanwhocodes/object-schema",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "@istanbuljs/load-nyc-config",
"direct": false,
"version": "1.1.0",
"ecosystem": "npm"
},
{
"name": "@istanbuljs/schema",
"direct": false,
"version": "0.1.3",
"ecosystem": "npm"
},
{
"name": "@jest/console",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/core",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/environment",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/expect",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/expect-utils",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/fake-timers",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/globals",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/pattern",
"direct": false,
"version": "30.0.1",
"ecosystem": "npm"
},
{
"name": "@jest/reporters",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/schemas",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "@jest/schemas",
"direct": false,
"version": "30.0.5",
"ecosystem": "npm"
},
{
"name": "@jest/source-map",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "@jest/test-result",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/test-sequencer",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/transform",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "@jest/transform",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "@jest/types",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "@jest/types",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "@jridgewell/gen-mapping",
"direct": false,
"version": "0.3.13",
"ecosystem": "npm"
},
{
"name": "@jridgewell/resolve-uri",
"direct": false,
"version": "3.1.2",
"ecosystem": "npm"
},
{
"name": "@jridgewell/sourcemap-codec",
"direct": false,
"version": "1.5.5",
"ecosystem": "npm"
},
{
"name": "@jridgewell/trace-mapping",
"direct": false,
"version": "0.3.31",
"ecosystem": "npm"
},
{
"name": "@jridgewell/trace-mapping",
"direct": false,
"version": "0.3.9",
"ecosystem": "npm"
},
{
"name": "@nodelib/fs.scandir",
"direct": false,
"version": "2.1.5",
"ecosystem": "npm"
},
{
"name": "@nodelib/fs.stat",
"direct": false,
"version": "2.0.5",
"ecosystem": "npm"
},
{
"name": "@nodelib/fs.walk",
"direct": false,
"version": "1.2.8",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-android-arm-eabi",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-android-arm64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-darwin-arm64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-darwin-x64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-freebsd-arm64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-freebsd-x64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-arm-gnueabihf",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-arm-musleabihf",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-arm64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-arm64-musl",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-loong64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-loong64-musl",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-ppc64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-ppc64-musl",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-riscv64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-riscv64-musl",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-s390x-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-x64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-linux-x64-musl",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-openbsd-x64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-openharmony-arm64",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-win32-arm64-msvc",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-win32-ia32-msvc",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-win32-x64-gnu",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@rollup/rollup-win32-x64-msvc",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "@sinclair/typebox",
"direct": false,
"version": "0.27.10",
"ecosystem": "npm"
},
{
"name": "@sinclair/typebox",
"direct": false,
"version": "0.34.48",
"ecosystem": "npm"
},
{
"name": "@sinonjs/commons",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "@sinonjs/fake-timers",
"direct": false,
"version": "10.3.0",
"ecosystem": "npm"
},
{
"name": "@tsconfig/node10",
"direct": false,
"version": "1.0.12",
"ecosystem": "npm"
},
{
"name": "@tsconfig/node12",
"direct": false,
"version": "1.0.11",
"ecosystem": "npm"
},
{
"name": "@tsconfig/node14",
"direct": false,
"version": "1.0.3",
"ecosystem": "npm"
},
{
"name": "@tsconfig/node16",
"direct": false,
"version": "1.0.4",
"ecosystem": "npm"
},
{
"name": "@types/babel__core",
"direct": false,
"version": "7.20.5",
"ecosystem": "npm"
},
{
"name": "@types/babel__generator",
"direct": false,
"version": "7.27.0",
"ecosystem": "npm"
},
{
"name": "@types/babel__template",
"direct": false,
"version": "7.4.4",
"ecosystem": "npm"
},
{
"name": "@types/babel__traverse",
"direct": false,
"version": "7.28.0",
"ecosystem": "npm"
},
{
"name": "@types/estree",
"direct": false,
"version": "1.0.8",
"ecosystem": "npm"
},
{
"name": "@types/gensync",
"direct": false,
"version": "1.0.5",
"ecosystem": "npm"
},
{
"name": "@types/graceful-fs",
"direct": false,
"version": "4.1.9",
"ecosystem": "npm"
},
{
"name": "@types/istanbul-lib-coverage",
"direct": false,
"version": "2.0.6",
"ecosystem": "npm"
},
{
"name": "@types/istanbul-lib-report",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "@types/istanbul-reports",
"direct": false,
"version": "3.0.4",
"ecosystem": "npm"
},
{
"name": "@types/jest",
"direct": false,
"version": "29.5.14",
"ecosystem": "npm"
},
{
"name": "@types/jsesc",
"direct": false,
"version": "2.5.1",
"ecosystem": "npm"
},
{
"name": "@types/node",
"direct": false,
"version": "22.13.4",
"ecosystem": "npm"
},
{
"name": "@types/node",
"direct": false,
"version": "25.5.0",
"ecosystem": "npm"
},
{
"name": "@types/stack-utils",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "@types/yargs",
"direct": false,
"version": "17.0.35",
"ecosystem": "npm"
},
{
"name": "@types/yargs-parser",
"direct": false,
"version": "21.0.3",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/eslint-plugin",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/parser",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/project-service",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/scope-manager",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/tsconfig-utils",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/type-utils",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/types",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/typescript-estree",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/utils",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@typescript-eslint/visitor-keys",
"direct": false,
"version": "8.57.2",
"ecosystem": "npm"
},
{
"name": "@ungap/structured-clone",
"direct": false,
"version": "1.3.0",
"ecosystem": "npm"
},
{
"name": "acorn",
"direct": false,
"version": "8.16.0",
"ecosystem": "npm"
},
{
"name": "acorn-jsx",
"direct": false,
"version": "5.3.2",
"ecosystem": "npm"
},
{
"name": "acorn-walk",
"direct": false,
"version": "8.3.5",
"ecosystem": "npm"
},
{
"name": "ajv",
"direct": false,
"version": "6.14.0",
"ecosystem": "npm"
},
{
"name": "ansi-escapes",
"direct": false,
"version": "4.3.2",
"ecosystem": "npm"
},
{
"name": "ansi-regex",
"direct": false,
"version": "5.0.1",
"ecosystem": "npm"
},
{
"name": "ansi-styles",
"direct": false,
"version": "4.3.0",
"ecosystem": "npm"
},
{
"name": "ansi-styles",
"direct": false,
"version": "5.2.0",
"ecosystem": "npm"
},
{
"name": "any-promise",
"direct": false,
"version": "1.3.0",
"ecosystem": "npm"
},
{
"name": "anymatch",
"direct": false,
"version": "3.1.3",
"ecosystem": "npm"
},
{
"name": "arg",
"direct": false,
"version": "4.1.3",
"ecosystem": "npm"
},
{
"name": "argparse",
"direct": false,
"version": "2.0.1",
"ecosystem": "npm"
},
{
"name": "babel-jest",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "babel-jest",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "babel-plugin-istanbul",
"direct": false,
"version": "6.1.1",
"ecosystem": "npm"
},
{
"name": "babel-plugin-istanbul",
"direct": false,
"version": "7.0.1",
"ecosystem": "npm"
},
{
"name": "babel-plugin-jest-hoist",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "babel-plugin-jest-hoist",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "babel-preset-current-node-syntax",
"direct": false,
"version": "1.2.0",
"ecosystem": "npm"
},
{
"name": "babel-preset-jest",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "babel-preset-jest",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "balanced-match",
"direct": false,
"version": "1.0.2",
"ecosystem": "npm"
},
{
"name": "balanced-match",
"direct": false,
"version": "4.0.4",
"ecosystem": "npm"
},
{
"name": "base64-js",
"direct": false,
"version": "1.5.1",
"ecosystem": "npm"
},
{
"name": "base64url",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "baseline-browser-mapping",
"direct": false,
"version": "2.10.11",
"ecosystem": "npm"
},
{
"name": "brace-expansion",
"direct": false,
"version": "1.1.13",
"ecosystem": "npm"
},
{
"name": "brace-expansion",
"direct": false,
"version": "5.0.6",
"ecosystem": "npm"
},
{
"name": "braces",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "browserslist",
"direct": false,
"version": "4.28.1",
"ecosystem": "npm"
},
{
"name": "bs-logger",
"direct": false,
"version": "0.2.6",
"ecosystem": "npm"
},
{
"name": "bser",
"direct": false,
"version": "2.1.1",
"ecosystem": "npm"
},
{
"name": "buffer",
"direct": false,
"version": "6.0.3",
"ecosystem": "npm"
},
{
"name": "buffer-from",
"direct": false,
"version": "1.1.2",
"ecosystem": "npm"
},
{
"name": "bundle-require",
"direct": false,
"version": "5.1.0",
"ecosystem": "npm"
},
{
"name": "cac",
"direct": false,
"version": "6.7.14",
"ecosystem": "npm"
},
{
"name": "callsites",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "camelcase",
"direct": false,
"version": "5.3.1",
"ecosystem": "npm"
},
{
"name": "camelcase",
"direct": false,
"version": "6.3.0",
"ecosystem": "npm"
},
{
"name": "caniuse-lite",
"direct": false,
"version": "1.0.30001781",
"ecosystem": "npm"
},
{
"name": "chalk",
"direct": false,
"version": "4.1.2",
"ecosystem": "npm"
},
{
"name": "char-regex",
"direct": false,
"version": "1.0.2",
"ecosystem": "npm"
},
{
"name": "chokidar",
"direct": false,
"version": "4.0.3",
"ecosystem": "npm"
},
{
"name": "ci-info",
"direct": false,
"version": "3.9.0",
"ecosystem": "npm"
},
{
"name": "ci-info",
"direct": false,
"version": "4.4.0",
"ecosystem": "npm"
},
{
"name": "cjs-module-lexer",
"direct": false,
"version": "1.4.3",
"ecosystem": "npm"
},
{
"name": "cliui",
"direct": false,
"version": "8.0.1",
"ecosystem": "npm"
},
{
"name": "co",
"direct": false,
"version": "4.6.0",
"ecosystem": "npm"
},
{
"name": "collect-v8-coverage",
"direct": false,
"version": "1.0.3",
"ecosystem": "npm"
},
{
"name": "color-convert",
"direct": false,
"version": "2.0.1",
"ecosystem": "npm"
},
{
"name": "color-name",
"direct": false,
"version": "1.1.4",
"ecosystem": "npm"
},
{
"name": "commander",
"direct": false,
"version": "4.1.1",
"ecosystem": "npm"
},
{
"name": "concat-map",
"direct": false,
"version": "0.0.1",
"ecosystem": "npm"
},
{
"name": "confbox",
"direct": false,
"version": "0.1.8",
"ecosystem": "npm"
},
{
"name": "consola",
"direct": false,
"version": "3.4.2",
"ecosystem": "npm"
},
{
"name": "convert-source-map",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "create-jest",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "create-require",
"direct": false,
"version": "1.1.1",
"ecosystem": "npm"
},
{
"name": "cross-spawn",
"direct": false,
"version": "7.0.6",
"ecosystem": "npm"
},
{
"name": "debug",
"direct": false,
"version": "4.4.3",
"ecosystem": "npm"
},
{
"name": "dedent",
"direct": false,
"version": "1.7.2",
"ecosystem": "npm"
},
{
"name": "deep-is",
"direct": false,
"version": "0.1.4",
"ecosystem": "npm"
},
{
"name": "deepmerge",
"direct": false,
"version": "4.3.1",
"ecosystem": "npm"
},
{
"name": "detect-newline",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "diff",
"direct": false,
"version": "4.0.4",
"ecosystem": "npm"
},
{
"name": "diff-sequences",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "doctrine",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "electron-to-chromium",
"direct": false,
"version": "1.5.328",
"ecosystem": "npm"
},
{
"name": "emittery",
"direct": false,
"version": "0.13.1",
"ecosystem": "npm"
},
{
"name": "emoji-regex",
"direct": false,
"version": "8.0.0",
"ecosystem": "npm"
},
{
"name": "empathic",
"direct": false,
"version": "2.0.1",
"ecosystem": "npm"
},
{
"name": "error-ex",
"direct": false,
"version": "1.3.4",
"ecosystem": "npm"
},
{
"name": "es6-promise",
"direct": false,
"version": "2.3.0",
"ecosystem": "npm"
},
{
"name": "es6-promise",
"direct": false,
"version": "4.2.8",
"ecosystem": "npm"
},
{
"name": "esbuild",
"direct": false,
"version": "0.28.1",
"ecosystem": "npm"
},
{
"name": "escalade",
"direct": false,
"version": "3.2.0",
"ecosystem": "npm"
},
{
"name": "escape-string-regexp",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "escape-string-regexp",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "eslint",
"direct": false,
"version": "8.57.0",
"ecosystem": "npm"
},
{
"name": "eslint-scope",
"direct": false,
"version": "7.2.2",
"ecosystem": "npm"
},
{
"name": "eslint-visitor-keys",
"direct": false,
"version": "3.4.3",
"ecosystem": "npm"
},
{
"name": "eslint-visitor-keys",
"direct": false,
"version": "5.0.1",
"ecosystem": "npm"
},
{
"name": "espree",
"direct": false,
"version": "9.6.1",
"ecosystem": "npm"
},
{
"name": "esquery",
"direct": false,
"version": "1.7.0",
"ecosystem": "npm"
},
{
"name": "esrecurse",
"direct": false,
"version": "4.3.0",
"ecosystem": "npm"
},
{
"name": "estraverse",
"direct": false,
"version": "5.3.0",
"ecosystem": "npm"
},
{
"name": "esutils",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "execa",
"direct": false,
"version": "5.1.1",
"ecosystem": "npm"
},
{
"name": "exit",
"direct": false,
"version": "0.1.2",
"ecosystem": "npm"
},
{
"name": "expect",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "fast-deep-equal",
"direct": false,
"version": "3.1.3",
"ecosystem": "npm"
},
{
"name": "fast-json-stable-stringify",
"direct": false,
"version": "2.1.0",
"ecosystem": "npm"
},
{
"name": "fast-levenshtein",
"direct": false,
"version": "2.0.6",
"ecosystem": "npm"
},
{
"name": "fastq",
"direct": false,
"version": "1.20.1",
"ecosystem": "npm"
},
{
"name": "fb-watchman",
"direct": false,
"version": "2.0.2",
"ecosystem": "npm"
},
{
"name": "fdir",
"direct": false,
"version": "6.5.0",
"ecosystem": "npm"
},
{
"name": "file-entry-cache",
"direct": false,
"version": "6.0.1",
"ecosystem": "npm"
},
{
"name": "fill-range",
"direct": false,
"version": "7.1.1",
"ecosystem": "npm"
},
{
"name": "find-up",
"direct": false,
"version": "4.1.0",
"ecosystem": "npm"
},
{
"name": "find-up",
"direct": false,
"version": "5.0.0",
"ecosystem": "npm"
},
{
"name": "fix-dts-default-cjs-exports",
"direct": false,
"version": "1.0.1",
"ecosystem": "npm"
},
{
"name": "flat-cache",
"direct": false,
"version": "3.2.0",
"ecosystem": "npm"
},
{
"name": "flatted",
"direct": false,
"version": "3.4.2",
"ecosystem": "npm"
},
{
"name": "fs.realpath",
"direct": false,
"version": "1.0.0",
"ecosystem": "npm"
},
{
"name": "fsevents",
"direct": false,
"version": "2.3.3",
"ecosystem": "npm"
},
{
"name": "function-bind",
"direct": false,
"version": "1.1.2",
"ecosystem": "npm"
},
{
"name": "gensync",
"direct": false,
"version": "1.0.0-beta.2",
"ecosystem": "npm"
},
{
"name": "get-caller-file",
"direct": false,
"version": "2.0.5",
"ecosystem": "npm"
},
{
"name": "get-package-type",
"direct": false,
"version": "0.1.0",
"ecosystem": "npm"
},
{
"name": "get-stream",
"direct": false,
"version": "6.0.1",
"ecosystem": "npm"
},
{
"name": "get-tsconfig",
"direct": false,
"version": "4.13.7",
"ecosystem": "npm"
},
{
"name": "glob",
"direct": false,
"version": "7.2.3",
"ecosystem": "npm"
},
{
"name": "glob-parent",
"direct": false,
"version": "6.0.2",
"ecosystem": "npm"
},
{
"name": "globals",
"direct": false,
"version": "13.24.0",
"ecosystem": "npm"
},
{
"name": "graceful-fs",
"direct": false,
"version": "4.2.11",
"ecosystem": "npm"
},
{
"name": "graphemer",
"direct": false,
"version": "1.4.0",
"ecosystem": "npm"
},
{
"name": "handlebars",
"direct": false,
"version": "4.7.9",
"ecosystem": "npm"
},
{
"name": "has-flag",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "hasown",
"direct": false,
"version": "2.0.2",
"ecosystem": "npm"
},
{
"name": "html-escaper",
"direct": false,
"version": "2.0.2",
"ecosystem": "npm"
},
{
"name": "human-signals",
"direct": false,
"version": "2.1.0",
"ecosystem": "npm"
},
{
"name": "ieee754",
"direct": false,
"version": "1.2.1",
"ecosystem": "npm"
},
{
"name": "ignore",
"direct": false,
"version": "5.3.2",
"ecosystem": "npm"
},
{
"name": "ignore",
"direct": false,
"version": "7.0.5",
"ecosystem": "npm"
},
{
"name": "import-fresh",
"direct": false,
"version": "3.3.1",
"ecosystem": "npm"
},
{
"name": "import-local",
"direct": false,
"version": "3.2.0",
"ecosystem": "npm"
},
{
"name": "import-meta-resolve",
"direct": false,
"version": "4.2.0",
"ecosystem": "npm"
},
{
"name": "imurmurhash",
"direct": false,
"version": "0.1.4",
"ecosystem": "npm"
},
{
"name": "inflight",
"direct": false,
"version": "1.0.6",
"ecosystem": "npm"
},
{
"name": "inherits",
"direct": false,
"version": "2.0.4",
"ecosystem": "npm"
},
{
"name": "is-arrayish",
"direct": false,
"version": "0.2.1",
"ecosystem": "npm"
},
{
"name": "is-core-module",
"direct": false,
"version": "2.16.1",
"ecosystem": "npm"
},
{
"name": "is-extglob",
"direct": false,
"version": "2.1.1",
"ecosystem": "npm"
},
{
"name": "is-fullwidth-code-point",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "is-generator-fn",
"direct": false,
"version": "2.1.0",
"ecosystem": "npm"
},
{
"name": "is-glob",
"direct": false,
"version": "4.0.3",
"ecosystem": "npm"
},
{
"name": "is-number",
"direct": false,
"version": "7.0.0",
"ecosystem": "npm"
},
{
"name": "is-path-inside",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "is-stream",
"direct": false,
"version": "2.0.1",
"ecosystem": "npm"
},
{
"name": "isexe",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "istanbul-lib-coverage",
"direct": false,
"version": "3.2.2",
"ecosystem": "npm"
},
{
"name": "istanbul-lib-instrument",
"direct": false,
"version": "5.2.1",
"ecosystem": "npm"
},
{
"name": "istanbul-lib-instrument",
"direct": false,
"version": "6.0.3",
"ecosystem": "npm"
},
{
"name": "istanbul-lib-report",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "istanbul-lib-source-maps",
"direct": false,
"version": "4.0.1",
"ecosystem": "npm"
},
{
"name": "istanbul-reports",
"direct": false,
"version": "3.2.0",
"ecosystem": "npm"
},
{
"name": "jest",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-changed-files",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-circus",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-cli",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-config",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-diff",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-docblock",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-each",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-environment-node",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-get-type",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "jest-haste-map",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-haste-map",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "jest-leak-detector",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-matcher-utils",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-message-util",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-mock",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-pnp-resolver",
"direct": false,
"version": "1.2.3",
"ecosystem": "npm"
},
{
"name": "jest-regex-util",
"direct": false,
"version": "29.6.3",
"ecosystem": "npm"
},
{
"name": "jest-regex-util",
"direct": false,
"version": "30.0.1",
"ecosystem": "npm"
},
{
"name": "jest-resolve",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-resolve-dependencies",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-runner",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-runtime",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-snapshot",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-util",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-util",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "jest-validate",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-watcher",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-worker",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-worker",
"direct": false,
"version": "30.3.0",
"ecosystem": "npm"
},
{
"name": "jiti",
"direct": false,
"version": "2.6.1",
"ecosystem": "npm"
},
{
"name": "joycon",
"direct": false,
"version": "3.1.1",
"ecosystem": "npm"
},
{
"name": "js-tokens",
"direct": false,
"version": "10.0.0",
"ecosystem": "npm"
},
{
"name": "js-tokens",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "js-yaml",
"direct": false,
"version": "5.0.0",
"ecosystem": "npm"
},
{
"name": "jsesc",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "json-buffer",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "json-parse-even-better-errors",
"direct": false,
"version": "2.3.1",
"ecosystem": "npm"
},
{
"name": "json-schema-traverse",
"direct": false,
"version": "0.4.1",
"ecosystem": "npm"
},
{
"name": "json-stable-stringify-without-jsonify",
"direct": false,
"version": "1.0.1",
"ecosystem": "npm"
},
{
"name": "json5",
"direct": false,
"version": "2.2.3",
"ecosystem": "npm"
},
{
"name": "keyv",
"direct": false,
"version": "4.5.4",
"ecosystem": "npm"
},
{
"name": "kleur",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "leven",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "levn",
"direct": false,
"version": "0.4.1",
"ecosystem": "npm"
},
{
"name": "lilconfig",
"direct": false,
"version": "3.1.3",
"ecosystem": "npm"
},
{
"name": "lines-and-columns",
"direct": false,
"version": "1.2.4",
"ecosystem": "npm"
},
{
"name": "load-tsconfig",
"direct": false,
"version": "0.2.5",
"ecosystem": "npm"
},
{
"name": "locate-path",
"direct": false,
"version": "5.0.0",
"ecosystem": "npm"
},
{
"name": "locate-path",
"direct": false,
"version": "6.0.0",
"ecosystem": "npm"
},
{
"name": "lodash",
"direct": false,
"version": "4.18.1",
"ecosystem": "npm"
},
{
"name": "lodash._arraycopy",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "lodash._arrayeach",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "lodash._baseassign",
"direct": false,
"version": "3.2.0",
"ecosystem": "npm"
},
{
"name": "lodash._baseclone",
"direct": false,
"version": "3.3.0",
"ecosystem": "npm"
},
{
"name": "lodash._basecopy",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "lodash._basefor",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "lodash._bindcallback",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "lodash._getnative",
"direct": false,
"version": "3.9.1",
"ecosystem": "npm"
},
{
"name": "lodash._isiterateecall",
"direct": false,
"version": "3.0.9",
"ecosystem": "npm"
},
{
"name": "lodash.clone",
"direct": false,
"version": "3.0.3",
"ecosystem": "npm"
},
{
"name": "lodash.clonedeep",
"direct": false,
"version": "3.0.2",
"ecosystem": "npm"
},
{
"name": "lodash.isarguments",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "lodash.isarray",
"direct": false,
"version": "3.0.4",
"ecosystem": "npm"
},
{
"name": "lodash.keys",
"direct": false,
"version": "3.1.2",
"ecosystem": "npm"
},
{
"name": "lodash.memoize",
"direct": false,
"version": "4.1.2",
"ecosystem": "npm"
},
{
"name": "lodash.merge",
"direct": false,
"version": "4.6.2",
"ecosystem": "npm"
},
{
"name": "long",
"direct": false,
"version": "5.3.2",
"ecosystem": "npm"
},
{
"name": "lru-cache",
"direct": false,
"version": "11.5.1",
"ecosystem": "npm"
},
{
"name": "magic-string",
"direct": false,
"version": "0.30.21",
"ecosystem": "npm"
},
{
"name": "make-dir",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "make-error",
"direct": false,
"version": "1.3.6",
"ecosystem": "npm"
},
{
"name": "makeerror",
"direct": false,
"version": "1.0.12",
"ecosystem": "npm"
},
{
"name": "merge-stream",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "micromatch",
"direct": false,
"version": "4.0.8",
"ecosystem": "npm"
},
{
"name": "mimic-fn",
"direct": false,
"version": "2.1.0",
"ecosystem": "npm"
},
{
"name": "minimatch",
"direct": false,
"version": "10.2.4",
"ecosystem": "npm"
},
{
"name": "minimatch",
"direct": false,
"version": "3.1.5",
"ecosystem": "npm"
},
{
"name": "minimist",
"direct": false,
"version": "1.2.8",
"ecosystem": "npm"
},
{
"name": "mlly",
"direct": false,
"version": "1.8.2",
"ecosystem": "npm"
},
{
"name": "ms",
"direct": false,
"version": "2.1.3",
"ecosystem": "npm"
},
{
"name": "mz",
"direct": false,
"version": "2.7.0",
"ecosystem": "npm"
},
{
"name": "natural-compare",
"direct": false,
"version": "1.4.0",
"ecosystem": "npm"
},
{
"name": "neo-async",
"direct": false,
"version": "2.6.2",
"ecosystem": "npm"
},
{
"name": "node-forge",
"direct": false,
"version": "1.4.0",
"ecosystem": "npm"
},
{
"name": "node-int64",
"direct": false,
"version": "0.4.0",
"ecosystem": "npm"
},
{
"name": "node-releases",
"direct": false,
"version": "2.0.36",
"ecosystem": "npm"
},
{
"name": "normalize-path",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "npm-run-path",
"direct": false,
"version": "4.0.1",
"ecosystem": "npm"
},
{
"name": "object-assign",
"direct": false,
"version": "4.1.1",
"ecosystem": "npm"
},
{
"name": "obug",
"direct": false,
"version": "2.1.3",
"ecosystem": "npm"
},
{
"name": "once",
"direct": false,
"version": "1.4.0",
"ecosystem": "npm"
},
{
"name": "onetime",
"direct": false,
"version": "5.1.2",
"ecosystem": "npm"
},
{
"name": "optionator",
"direct": false,
"version": "0.9.4",
"ecosystem": "npm"
},
{
"name": "p-limit",
"direct": false,
"version": "2.3.0",
"ecosystem": "npm"
},
{
"name": "p-limit",
"direct": false,
"version": "3.1.0",
"ecosystem": "npm"
},
{
"name": "p-locate",
"direct": false,
"version": "4.1.0",
"ecosystem": "npm"
},
{
"name": "p-locate",
"direct": false,
"version": "5.0.0",
"ecosystem": "npm"
},
{
"name": "p-try",
"direct": false,
"version": "2.2.0",
"ecosystem": "npm"
},
{
"name": "pako",
"direct": false,
"version": "2.1.0",
"ecosystem": "npm"
},
{
"name": "parent-module",
"direct": false,
"version": "1.0.1",
"ecosystem": "npm"
},
{
"name": "parse-json",
"direct": false,
"version": "5.2.0",
"ecosystem": "npm"
},
{
"name": "path-exists",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "path-is-absolute",
"direct": false,
"version": "1.0.1",
"ecosystem": "npm"
},
{
"name": "path-key",
"direct": false,
"version": "3.1.1",
"ecosystem": "npm"
},
{
"name": "path-parse",
"direct": false,
"version": "1.0.7",
"ecosystem": "npm"
},
{
"name": "pathe",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "picocolors",
"direct": false,
"version": "1.1.1",
"ecosystem": "npm"
},
{
"name": "picomatch",
"direct": false,
"version": "2.3.2",
"ecosystem": "npm"
},
{
"name": "picomatch",
"direct": false,
"version": "4.0.4",
"ecosystem": "npm"
},
{
"name": "pirates",
"direct": false,
"version": "4.0.7",
"ecosystem": "npm"
},
{
"name": "pkg-dir",
"direct": false,
"version": "4.2.0",
"ecosystem": "npm"
},
{
"name": "pkg-types",
"direct": false,
"version": "1.3.1",
"ecosystem": "npm"
},
{
"name": "postcss-load-config",
"direct": false,
"version": "6.0.1",
"ecosystem": "npm"
},
{
"name": "prelude-ls",
"direct": false,
"version": "1.2.1",
"ecosystem": "npm"
},
{
"name": "pretty-format",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "process",
"direct": false,
"version": "0.11.10",
"ecosystem": "npm"
},
{
"name": "prompts",
"direct": false,
"version": "2.4.2",
"ecosystem": "npm"
},
{
"name": "punycode",
"direct": false,
"version": "2.3.1",
"ecosystem": "npm"
},
{
"name": "pure-rand",
"direct": false,
"version": "6.1.0",
"ecosystem": "npm"
},
{
"name": "queue-microtask",
"direct": false,
"version": "1.2.3",
"ecosystem": "npm"
},
{
"name": "react-is",
"direct": false,
"version": "18.3.1",
"ecosystem": "npm"
},
{
"name": "readdirp",
"direct": false,
"version": "4.1.2",
"ecosystem": "npm"
},
{
"name": "require-directory",
"direct": false,
"version": "2.1.1",
"ecosystem": "npm"
},
{
"name": "resolve",
"direct": false,
"version": "1.22.11",
"ecosystem": "npm"
},
{
"name": "resolve-cwd",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "resolve-from",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "resolve-from",
"direct": false,
"version": "5.0.0",
"ecosystem": "npm"
},
{
"name": "resolve-pkg-maps",
"direct": false,
"version": "1.0.0",
"ecosystem": "npm"
},
{
"name": "resolve.exports",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "reusify",
"direct": false,
"version": "1.1.0",
"ecosystem": "npm"
},
{
"name": "rimraf",
"direct": false,
"version": "3.0.2",
"ecosystem": "npm"
},
{
"name": "rollup",
"direct": false,
"version": "4.60.0",
"ecosystem": "npm"
},
{
"name": "run-parallel",
"direct": false,
"version": "1.2.0",
"ecosystem": "npm"
},
{
"name": "semver",
"direct": false,
"version": "6.3.1",
"ecosystem": "npm"
},
{
"name": "semver",
"direct": false,
"version": "7.7.4",
"ecosystem": "npm"
},
{
"name": "shebang-command",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "shebang-regex",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "signal-exit",
"direct": false,
"version": "3.0.7",
"ecosystem": "npm"
},
{
"name": "signal-exit",
"direct": false,
"version": "4.1.0",
"ecosystem": "npm"
},
{
"name": "sisteransi",
"direct": false,
"version": "1.0.5",
"ecosystem": "npm"
},
{
"name": "slash",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "source-map",
"direct": false,
"version": "0.6.1",
"ecosystem": "npm"
},
{
"name": "source-map",
"direct": false,
"version": "0.7.6",
"ecosystem": "npm"
},
{
"name": "source-map-support",
"direct": false,
"version": "0.5.13",
"ecosystem": "npm"
},
{
"name": "stack-utils",
"direct": false,
"version": "2.0.6",
"ecosystem": "npm"
},
{
"name": "string-length",
"direct": false,
"version": "4.0.2",
"ecosystem": "npm"
},
{
"name": "string-width",
"direct": false,
"version": "4.2.3",
"ecosystem": "npm"
},
{
"name": "strip-ansi",
"direct": false,
"version": "6.0.1",
"ecosystem": "npm"
},
{
"name": "strip-bom",
"direct": false,
"version": "4.0.0",
"ecosystem": "npm"
},
{
"name": "strip-final-newline",
"direct": false,
"version": "2.0.0",
"ecosystem": "npm"
},
{
"name": "strip-json-comments",
"direct": false,
"version": "3.1.1",
"ecosystem": "npm"
},
{
"name": "sucrase",
"direct": false,
"version": "3.35.1",
"ecosystem": "npm"
},
{
"name": "supports-color",
"direct": false,
"version": "7.2.0",
"ecosystem": "npm"
},
{
"name": "supports-color",
"direct": false,
"version": "8.1.1",
"ecosystem": "npm"
},
{
"name": "supports-preserve-symlinks-flag",
"direct": false,
"version": "1.0.0",
"ecosystem": "npm"
},
{
"name": "test-exclude",
"direct": false,
"version": "6.0.0",
"ecosystem": "npm"
},
{
"name": "text-table",
"direct": false,
"version": "0.2.0",
"ecosystem": "npm"
},
{
"name": "thenify",
"direct": false,
"version": "3.3.1",
"ecosystem": "npm"
},
{
"name": "thenify-all",
"direct": false,
"version": "1.6.0",
"ecosystem": "npm"
},
{
"name": "tinyexec",
"direct": false,
"version": "0.3.2",
"ecosystem": "npm"
},
{
"name": "tinyglobby",
"direct": false,
"version": "0.2.15",
"ecosystem": "npm"
},
{
"name": "tmpl",
"direct": false,
"version": "1.0.5",
"ecosystem": "npm"
},
{
"name": "to-regex-range",
"direct": false,
"version": "5.0.1",
"ecosystem": "npm"
},
{
"name": "tree-kill",
"direct": false,
"version": "1.2.2",
"ecosystem": "npm"
},
{
"name": "ts-api-utils",
"direct": false,
"version": "2.5.0",
"ecosystem": "npm"
},
{
"name": "ts-interface-checker",
"direct": false,
"version": "0.1.13",
"ecosystem": "npm"
},
{
"name": "ts-jest",
"direct": false,
"version": "29.4.6",
"ecosystem": "npm"
},
{
"name": "ts-node",
"direct": false,
"version": "10.9.2",
"ecosystem": "npm"
},
{
"name": "tsup",
"direct": false,
"version": "8.5.1",
"ecosystem": "npm"
},
{
"name": "tsx",
"direct": false,
"version": "4.21.0",
"ecosystem": "npm"
},
{
"name": "type-check",
"direct": false,
"version": "0.4.0",
"ecosystem": "npm"
},
{
"name": "type-detect",
"direct": false,
"version": "4.0.8",
"ecosystem": "npm"
},
{
"name": "type-fest",
"direct": false,
"version": "0.20.2",
"ecosystem": "npm"
},
{
"name": "type-fest",
"direct": false,
"version": "0.21.3",
"ecosystem": "npm"
},
{
"name": "type-fest",
"direct": false,
"version": "4.41.0",
"ecosystem": "npm"
},
{
"name": "typescript",
"direct": false,
"version": "5.9.3",
"ecosystem": "npm"
},
{
"name": "ufo",
"direct": false,
"version": "1.6.3",
"ecosystem": "npm"
},
{
"name": "uglify-js",
"direct": false,
"version": "3.19.3",
"ecosystem": "npm"
},
{
"name": "undici-types",
"direct": false,
"version": "6.20.0",
"ecosystem": "npm"
},
{
"name": "undici-types",
"direct": false,
"version": "7.18.2",
"ecosystem": "npm"
},
{
"name": "update-browserslist-db",
"direct": false,
"version": "1.2.3",
"ecosystem": "npm"
},
{
"name": "uri-js",
"direct": false,
"version": "4.4.1",
"ecosystem": "npm"
},
{
"name": "uuid",
"direct": false,
"version": "11.1.1",
"ecosystem": "npm"
},
{
"name": "uuid",
"direct": false,
"version": "2.0.3",
"ecosystem": "npm"
},
{
"name": "v8-compile-cache-lib",
"direct": false,
"version": "3.0.1",
"ecosystem": "npm"
},
{
"name": "v8-to-istanbul",
"direct": false,
"version": "9.3.0",
"ecosystem": "npm"
},
{
"name": "walker",
"direct": false,
"version": "1.0.8",
"ecosystem": "npm"
},
{
"name": "which",
"direct": false,
"version": "2.0.2",
"ecosystem": "npm"
},
{
"name": "word-wrap",
"direct": false,
"version": "1.2.5",
"ecosystem": "npm"
},
{
"name": "wordwrap",
"direct": false,
"version": "1.0.0",
"ecosystem": "npm"
},
{
"name": "wrap-ansi",
"direct": false,
"version": "7.0.0",
"ecosystem": "npm"
},
{
"name": "wrappy",
"direct": false,
"version": "1.0.2",
"ecosystem": "npm"
},
{
"name": "write-file-atomic",
"direct": false,
"version": "4.0.2",
"ecosystem": "npm"
},
{
"name": "write-file-atomic",
"direct": false,
"version": "5.0.1",
"ecosystem": "npm"
},
{
"name": "y18n",
"direct": false,
"version": "5.0.8",
"ecosystem": "npm"
},
{
"name": "yargs",
"direct": false,
"version": "17.7.2",
"ecosystem": "npm"
},
{
"name": "yargs-parser",
"direct": false,
"version": "21.1.1",
"ecosystem": "npm"
},
{
"name": "yn",
"direct": false,
"version": "3.1.1",
"ecosystem": "npm"
},
{
"name": "yocto-queue",
"direct": false,
"version": "0.1.0",
"ecosystem": "npm"
},
{
"name": "mypy",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pytest",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "pytest-asyncio",
"direct": false,
"version": null,
"ecosystem": "pypi"
},
{
"name": "ruff",
"direct": false,
"version": null,
"ecosystem": "pypi"
}
],
"collected": true,
"truncated": false,
"total_count": 546,
"direct_count": 31,
"indirect_count": 515
}
},
"maintainership": {
"issues": {
"open_prs": 2,
"merged_prs": 2,
"open_issues": 1,
"closed_ratio": 0.923,
"closed_issues": 12,
"closed_unmerged_prs": 10
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "3rg0n",
"commits": 95,
"avatar_url": "https://avatars.githubusercontent.com/u/62959009?v=4"
},
{
"type": "User",
"login": "ojaber",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/468248?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.979
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"codeql.yml",
"integration-tests.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [
".eslintrc.cjs"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum",
"pnpm-lock.yaml"
],
"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": 0,
"reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 1/28 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 5,
"reason": "dependency not pinned by hash detected -- score normalized to 5",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 7,
"reason": "SAST tool detected but not run on all commits",
"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": 3,
"reason": "7 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "fbf1c62c1a51ead882975b4f367f63f6b2e3ad9e",
"ran_at": "2026-07-27T14:07:02Z",
"aggregate_score": 4.3,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-27T07:51:30Z",
"oldest_open_prs": [
{
"number": 18,
"created_at": "2026-04-27T19:27:29Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 19,
"created_at": "2026-04-28T02:55:02Z",
"last_comment_at": "2026-04-28T05:15:53Z",
"last_comment_author": "ojaber"
}
],
"last_merged_pr_at": "2026-04-13T15:14:16Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 26,
"created_at": "2026-07-18T20:41:36Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/3rg0n/webex-message-handler",
"host": "github.com",
"name": "webex-message-handler",
"owner": "3rg0n"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 59,
"inputs": {
"security": 52,
"vitality": 83,
"community": 39,
"governance": 49,
"engineering": 68
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 83,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"commits_last_year": 97,
"human_commit_share": 1,
"days_since_last_push": 3,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 3 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 3
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "10/52 weeks with commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 10
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "97 commits in the last year",
"points": 17.9,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 97
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 37,
"latest_release_tag": "v0.6.14",
"releases_from_tags": false,
"days_since_latest_release": 5,
"mean_days_between_releases": 11
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "37 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 37
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 5 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 5
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~11 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 11
}
}
],
"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": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 39,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 2,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"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": 56,
"inputs": {
"packages": [
"github.com/3rg0n/webex-message-handler/go",
"webex-message-handler",
"webex-message-handler",
"webex-message-handler"
],
"dependents": null,
"ecosystems": "crates, go, npm, pypi",
"total_downloads": 400,
"monthly_downloads": 2405
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,405 downloads/month across crates, go, npm, pypi",
"points": 45.1,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2405,
"ecosystems": "crates, go, npm, pypi"
}
}
],
"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": "at_risk",
"name": "Sustainability & Governance",
"value": 49,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 15,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.979
},
"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 98% of commits",
"points": 0.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 98
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"merged_prs": 2,
"open_issues": 1,
"closed_issues": 12,
"issue_closed_ratio": 0.923,
"closed_unmerged_prs": 10
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "92% of issues closed",
"points": 43.2,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 92
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "2/12 decided PRs merged",
"points": 6.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 2,
"decided": 12
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 1/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"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": 47,
"inputs": {
"followers": 6,
"owner_type": "User",
"is_verified": null,
"owner_login": "3rg0n",
"public_repos": 18,
"account_age_days": 2308
},
"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": "6 followers of 3rg0n",
"points": 6.1,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 6,
"login": "3rg0n"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "18 public repos, account ~6 yr old",
"points": 21.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 18
}
},
{
"code": "account_age_years",
"params": {
"years": 6
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/3rg0n/webex-message-handler/go",
"webex-message-handler",
"webex-message-handler",
"webex-message-handler"
],
"ecosystems": "crates, go, npm, pypi",
"any_deprecated": false,
"min_days_since_publish": 3
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "4 package(s) on crates, go, npm, pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 4,
"ecosystems": "crates, go, npm, pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 3 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 3
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "21 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 21
}
}
],
"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": 68,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "3 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 3
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": ".eslintrc.cjs",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".eslintrc.cjs"
}
}
],
"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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "moderate",
"name": "Security",
"value": 52,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 43,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.3
},
"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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"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 1/28 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "10 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 5",
"points": 2.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool detected but not run on all commits",
"points": 3.5,
"status": "partial",
"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": "7 existing vulnerabilities detected",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories. Remaining weights renormalized. Matched 516 resolved dependencies against OSV; 30 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 516
}
},
{
"code": "advisories_unassessed",
"params": {
"count": 30
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 89,
"inputs": {
"source": "osv",
"advisories": 9,
"affected_packages": 5,
"assessed_packages": 516,
"unassessed_packages": 30,
"affected_by_severity": "high 4, unknown 1",
"direct_affected_packages": 1
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "1 affected: golang.org/x/crypto v0.54.0 (unknown)",
"points": 26.6,
"status": "partial",
"details": [
{
"code": "advisories_affected",
"params": {
"count": 1,
"packages": "golang.org/x/crypto v0.54.0 (unknown)"
}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory has been public longer than 90 days",
"points": 40,
"status": "met",
"details": [
{
"code": "advisories_none_stale",
"params": {
"days": 90
}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 516,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 4
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 66,
"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.979,
"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": "95 of 97 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 95,
"sampled": 97
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 82,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum",
"pnpm-lock.yaml"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"node/tsconfig.json"
],
"agent_commit_share": 0.835,
"toolchain_manifests": [
"go/go.mod",
"rust/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go/go.mod, rust/Cargo.toml (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go/go.mod, rust/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": ".eslintrc.cjs",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": ".eslintrc.cjs"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "node/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "node/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "81 of the last 97 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 81,
"sampled": 97
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 5",
"points": 5,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 44381,
"source_files_sampled": 99,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/99 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 99,
"oversized": 0
}
}
],
"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": [],
"report_type": "repository",
"generated_at": "2026-07-27T14:07:11.709620Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/3/3rg0n/webex-message-handler.svg",
"full_name": "3rg0n/webex-message-handler",
"license_state": "standard",
"license_spdx": "MIT"
}