JSON-Rohbericht maschinenlesbar
{
"data": {
"icon": {
"bytes": 553,
"width": 64,
"height": 64,
"rejected": [],
"collected": true,
"media_type": "image/svg+xml",
"source_url": "https://danfry1.github.io/vitest-native/favicon.svg",
"source_type": "homepage",
"content_hash": "cb47013a4e817f67ecb7d04d62493dfc60fa75d17cba945e4cc06d3d40b9566d",
"candidates_considered": 1
},
"repo": {
"topics": [
"expo",
"jest",
"mocking",
"react",
"react-native",
"react-native-testing-library",
"testing",
"testing-library",
"typescript",
"unit-testing",
"vite",
"vitest"
],
"is_fork": false,
"size_kb": 1546,
"has_wiki": true,
"homepage": "https://danfry1.github.io/vitest-native/",
"languages": {
"CSS": 2020,
"JavaScript": 255629,
"TypeScript": 1366256
},
"pushed_at": "2026-08-03T04:33:01Z",
"created_at": "2026-03-07T20:54:06Z",
"owner_type": "User",
"updated_at": "2026-08-02T21:20:47Z",
"description": "Test React Native with Vitest — against real React Native, or a fast mock. One plugin, zero config.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript",
"JavaScript"
]
},
"owner": {
"blog": "https://danfry.dev",
"name": "Daniel Fry",
"type": "User",
"login": "danfry1",
"company": "@jpmorganchase",
"location": "London",
"followers": 143,
"avatar_url": "https://avatars.githubusercontent.com/u/95628792?v=4",
"created_at": "2021-12-06T13:17:36Z",
"is_verified": null,
"public_repos": 33,
"account_age_days": 1702
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-07-24T22:10:41Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-06-26T11:44:29Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-06-21T20:02:13Z"
},
{
"tag": "v0.6.1",
"kind": "patch",
"published_at": "2026-06-14T16:32:39Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-06-14T15:33:37Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-06-13T17:23:31Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2026-06-11T20:46:59Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-06-11T20:39:48Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-03-10T21:45:43Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-03-08T14:03:48Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-03-08T13:04:33Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2026-03-07T22:47:58Z"
}
],
"recent_commits": [
{
"oid": "4285a779ceb7e2e61ced85de28cca2b679030845",
"body": "Package auto-detection walked manifests UPWARDS from the run root. In a\nworkspace the run root is frequently above the package under test — Nx invokes\ntasks from the workspace root, and Vitest's root follows the working directory —\nso the app's own dependencies live in a manifest that walking up nev\n[…]\noot being the member itself, and a\nworkspace with no members configured. Removing the member expansion fails three\nof them and both root-run fixture assertions; ignoring pnpm-workspace.yaml fails\none.",
"is_bot": false,
"headline": "fix(native): detect the packages a workspace member declares (#127)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T21:20:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ccf588a312c1a8d1bf0f161df152f7d0aad1fa46",
"body": "…nge (#126)\n\n* fix(native): restore the full named-export surface of auto-detected packages\n\nNode decides a CommonJS module's named exports with cjs-module-lexer, which\nreads the source statically and stops at shapes it cannot follow. For ordinary\nhand-written CommonJS:\n\n module.exports = { Banner(\n[…]\n13 back-compat legs:\nthe markers themselves, waitFor under vi.useFakeTimers, findBy* under\njest.useFakeTimers, and waitFor when the timer is never advanced. Verified\npassing on RNTL 13.3.3 and 14.0.0.",
"is_bot": false,
"headline": "test(native): pin RNTL's fake-timer behaviour across the supported ra…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T21:05:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b773a2d95d2181ed2d053ccce621355f67624a77",
"body": "…ackages (#125)\n\nNode decides a CommonJS module's named exports with cjs-module-lexer, which\nreads the source statically and stops at shapes it cannot follow. For ordinary\nhand-written CommonJS:\n\n module.exports = { Banner({ label }) {}, renderCount: () => n };\n\nNode reports [\"Banner\", \"default\", \"\n[…]\nees — test graph \"mocked-os\", library \"ios\".\n\nThe package budget is re-baselined to ~5% above the measured artifact, which is\nwhat its own policy asks for, rather than left to fail on the next change.",
"is_bot": false,
"headline": "fix(native): restore the full named-export surface of auto-detected p…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T21:04:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e6cb4583a020566001a6f22f2d22d38dd107719e",
"body": "…odule (#122)\n\n`jestMockTransform()` wraps each `jest.mock` factory so its return passes\nthrough Jest's CommonJS interop, and the wrapper handled a synchronous return\nonly. An async factory — or any factory returning a promise — handed the promise\nitself to the interop, where it matched the object b\n[…]\nexporting shapes, and two\nintegration cases in the hoisting suite — a declared-async factory and one\nreturning a promise without being declared async, since the latter cannot be\ndetected from the AST.",
"is_bot": false,
"headline": "fix(jest-compat): apply mock interop to an async factory's resolved m…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1c973da6fce2ca221dcfe86a1f6b81e2e724a40",
"body": "`resolve.extensions` replaces Vite's default list wholesale, so anything\nmissing from it stops resolving. `json` was missing while Metro treats it as a\nsource extension: `import config from './config'` beside a `config.json` worked\nin the app and failed in the test with \"Cannot find module\".\n\nThe or\n[…]\n presets, which import vitest at module scope, and vitest\ncannot be required from CommonJS. Every declared runtime entry is now loaded,\nwith those three recorded explicitly and a stale record failing.",
"is_bot": false,
"headline": "fix(native): resolve .json, and try extensions in Metro's order (#121)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0bee72639f7b062bb8bc603b96433f8b881ef15e",
"body": "…#120)\n\nA preset shadows a package: under the native engine the real source never\nloads, so whatever the preset lists in `exports` becomes that module's\nnamed-export surface. Four presets declared names the real package has never\nexported, making the mock more permissive than reality — code importin\n[…]\nrather than\nproducing false violations, and the set of packages the gate must measure is\nnamed rather than counted, so a package that stops resolving fails instead of\nquietly dropping out of coverage.",
"is_bot": false,
"headline": "fix(presets): stop declaring exports the real package does not have (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3a0dc69a14ed103f1930a08ae419d04c345b17e1",
"body": "…#119)\n\n* feat(presets): cover the native-stack surface in the screens preset\n\nA real native-stack never reached onReady, so the screen stayed empty with nothing\nthrown, until the reporting project shipped its own mock. The preset declared 12\nexports where the package has 26.\n\nThe gap was closed aga\n[…]\nl's flags — found 27 runtime exports where the\nregex found 26, and separated 76 type-only exports the regex would have reported\nas missing surface.\n\nSo the count in this PR was seventeen, not sixteen.",
"is_bot": false,
"headline": "feat(presets): cover the native-stack surface in the screens preset (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b62e24ffaa5de4044659fcf98a3385f983ef06fc",
"body": "…ry (#118)\n\n* fix(cli): resolve doctor from the run's root, not the working directory\n\nPeers and engine detection resolved from wherever the command was typed. In a\nworkspace that is frequently not where the Vitest config lives, and under pnpm a\npackage's node_modules holds only its declared depende\n[…]\nd pnpm's isolation, and a hand-built pnpm-shaped layout showed that a\nworkspace package CAN still reach a root-declared dependency by walking up. The\ndirection that actually fails is the opposite one.",
"is_bot": false,
"headline": "fix(cli): resolve doctor from the run's root, not the working directo…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4be3eabbedc52c492c19ba8f7a1f91d938d75dff",
"body": "…e rest (#117)\n\n`presets` accepted only an array, and providing one replaced auto-detection\nentirely. A project needing to drop a single preset — the navigation one, say,\nbecause its stub means a real NavigationContainer never fires onReady — had to\nenumerate every other detected preset by hand. Tha\n[…]\nto\nknow what was switched off, since detection happens there — it now receives the\ndisabled names and subtracts them.\n\nCeilings match the ones in the resolver-alignment branch so the two do not drift.",
"is_bot": false,
"headline": "feat(presets): switch one auto-detected preset off without listing th…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "44432f0b59df6b7d926180edeee6005bf646d211",
"body": "…#116)\n\nJest resolves `jest.requireActual('../thing')` against the calling module. The shim\nbacked it with one createRequire anchored at the project root, so bare specifiers\nworked and relative ones escaped the source tree entirely — MODULE_NOT_FOUND with a\nrequireStack pointing at <projectRoot>/pac\n[…]\nserted the old behaviour, with a comment describing the root\nanchoring as a property rather than the bug it was. It now uses a path relative to\nitself, which is what the same code would do under Jest.",
"is_bot": false,
"headline": "fix(jest-compat): resolve relative requireActual against the caller (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:41:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "415070d9f0b10a3feffe2dc8696d1895b3745077",
"body": "* fix(ci): run the hot soak from the root its configs declare\n\nThe soak generates test files under the package root, writes configs that set\n`root` to the package root, and ran vitest with the working directory set to the\ngenerated directory instead. The include globs are written relative to the\npac\n[…]\ntripping a latent npm bug. npm 11\ninstalls every fixture.\n\nReproduced locally against npm 10.9.2 and confirmed fixed against npm 11, on\nboth the fixture with the packed tarball and the one without it.",
"is_bot": false,
"headline": "fix(ci): repair two upstream-drift failures on main (#124)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:40:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "599d0e044951552ef7d0c55e3d225a17f435326a",
"body": "* fix(native): make Vite resolve format-only fields the way Node does\n\nThe native engine runs two module systems, and a package can end up in both with\nseparate module-level state. Vitest forwards resolve.conditions to the worker's\nNode, so `exports`-based packages already agree; legacy top-level fi\n[…]\n mine has reached CI without the static\ngates being re-run after the last edit. They take seconds; the loop that misses\nthem is running the suites, deciding the change is good, and then editing again.",
"is_bot": false,
"headline": "fix(native): give React Native ecosystem packages a single owner (#115)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-08-02T20:02:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "69c761b1b2838f4fed5ec5b388800e0a5263cfd9",
"body": "…#113)\n\nThe native engine runs two module systems. Vite resolves the test graph, and\nNode's CJS resolver serves everything externalized. The plugin points Vite at\nReact Native's fields — react-native, module, jsnext:main, jsnext — and `main`,\nwhich is all Node's resolver consults, is not among them.\n[…]\nssed the case entirely, since the\nreproducing package is not a declared dependency and so is never a candidate for\ninlining.\n\nThis is a diagnostic. Making the two resolvers agree is a separate change.",
"is_bot": false,
"headline": "feat(native): report a package that resolves to two different files (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-27T20:26:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9360e8191ab5c39c1d3e005ace8f83a873d34bf9",
"body": "…umer (#111)\n\nThe entry said the classes were \"exported for typed use alongside an\nisVitestNativeError guard\". They are not: there is no vitest-native/errors entry\npoint and src/index.ts does not re-export them, so nothing in that sentence is\nreachable from an installed package.\n\nIt also implied `co\n[…]\ne main process.\n\nWhat a consumer actually gets is the error `name`, which does survive that\ncrossing. The entry now says that, and records the export as an open decision\nrather than a shipped feature.",
"is_bot": false,
"headline": "docs(changeset): describe what the error classes actually give a cons…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-27T20:26:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ddc9a85c256c7c3097153a3626a226cb933f77aa",
"body": "Releases are cut from the changeset queue, so a change under\npackages/vitest-native/src/ with no entry reaches users with no changelog line and\ncontributes nothing to the version bump. Nothing checked for it.\n\nThe gap was measured, not supposed. Of thirteen pull requests opened in one\nsession, exact\n[…]\ncases that\nmatter are unit-tested — including that neither .changeset/README.md nor\nconfig.json counts as a changeset, since those live there permanently and would\notherwise satisfy the check forever.",
"is_bot": false,
"headline": "ci: require a changeset when shipped source changes (#109)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:35:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "44679003b00afc16157faa8acb7ae92c84834162",
"body": "* fix(ci): keep the resolution check active where it matters\n\nThe published surface is eleven `exports` subpaths; the consumer gate imports\nthree. The rest were covered only by `@arethetypeswrong/cli`, which ran with\n`--ignore-rules no-resolution`.\n\nThat ignore was there for node10 — TypeScript's pr\n[…]\nrmittently is worse than one that is merely narrow: a\npackage whose ./presets points at a non-existent file exits 1 and reports \"node16\n(from ESM): Resolution failed\", and the current package exits 0.",
"is_bot": false,
"headline": "fix(ci): keep the resolution check active where it matters (#107)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:34:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3189ff915f9543cd2e78de139d1e3df9c9a1b3c8",
"body": "* feat(errors): give thrown errors a class and a stable code\n\nThe only way to tell a vitest-native failure from an arbitrary crash was a\n`[vitest-native]` prefix in the message, and 12 of 33 throws did not carry one. Failures\nnow raise VitestNativeError or VitestNativeTypeError with a stable `code`,\n[…]\ne position, reaching 839470\nagainst a ceiling of 840000.\n\nPull request CI tests the branch merged into the base as it stood when the run\nstarted, so two branches open at once never measure each other.",
"is_bot": false,
"headline": "feat(errors): give thrown errors a class and a stable code (#110)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:34:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "04a2fdad8f535fa94a085f1586ee388ff4e8e398",
"body": "…exactly (#108)\n\n* fix(build): give the package budget floors, and check the export map exactly\n\nEvery limit in package-budget.json was an upper bound, so the check only noticed\nthe package growing.\n\nRun against an unbuilt tree it reported \"OK files: 8 / 85\" and exited 0 — a budget\nthat passes while\n[…]\ny left thin for exactly this\nreason. Unpacked was in the same position at 828154 against 830000.\n\nBoth raised once, keeping the same small headroom rather than buying room for\nchanges not yet written.",
"is_bot": false,
"headline": "fix(build): give the package budget floors, and check the export map …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:27:19Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a027071a3ec0c1f9dc064a4fa12b62861b7bf1c2",
"body": "…text (#105)\n\n* test(native): execute the remediation advice instead of matching its text\n\nWhen Node cannot parse an untranspiled node_modules file, the native engine\nreplaces the bare \"Unexpected token '<'\" with an explanation naming the package\nand the fix:\n\n reactNative({ transform: ['<pkg>'] \n[…]\ned \"No test\nfiles found, exiting with code 1\".\n\nEvery other config in this directory uses a relative glob for that reason, and\ncrosscheck/vitest.config.mts carries a comment recording the same hazard.",
"is_bot": false,
"headline": "test(native): execute the remediation advice instead of matching its …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:19:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "33c5dda55778a1d56d3a51b81100894a66123733",
"body": "The release workflow fires on any v* tag from any commit, and the documented flow tags a\nSHA by hand after merging the release PR. Tagging the wrong one — a commit still on a\nbranch, or a stale commit from before a fix landed — publishes it. Nothing else catches\nthat: the tag/version check only comp\n[…]\nheckout takes full history,\nbecause the comparison is invisible to the default shallow fetch.\n\nVerified against real commits in this repository: a branch head is rejected, a commit on\nmain is allowed.",
"is_bot": false,
"headline": "ci(release): refuse to publish a tag that is not on main (#98)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:18:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "79e8b163d6ea40da5de921f748b144e1a22104da",
"body": "…tually used (#106)\n\n* fix(cli): make doctor's config check reflect whether the plugin is actually used\n\n`doctor` exists to diagnose broken projects, so reporting \"No blocking problems\nfound\" on one that cannot run a test is its worst failure mode. The config check\nwas the substring test `content.in\n[…]\nesbuild does not\nresolve from a project root under the current Vite. That failure is loud on the\nfirst run, unlike the ones above, which are silent.\n\n* chore: add changeset for the doctor config check",
"is_bot": false,
"headline": "fix(cli): make doctor's config check reflect whether the plugin is ac…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:18:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "942811933c5e7d0b7b7cc7b686678c0c980abe76",
"body": "* fix(native): report when the precompiled registry cannot be built\n\nThe registry collapses React Native's ~440 per-file module loads into one\ncompiled file. When it cannot be built the engine falls back to per-file\nloading, which is correct — nothing fails and no result changes — and that is\nwhat m\n[…]\nthe test passed with the\ncollapse deleted. It now drives the warning directly with a multi-line cause,\nand fails when the collapse is removed.\n\n* chore: add changeset for the registry fallback warning",
"is_bot": false,
"headline": "fix(native): report when the precompiled registry cannot be built (#104)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:18:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e599ad0d2204cce32032a6efe5b3dc6cf6c96780",
"body": "…#103)\n\nplugin-options.md opens with \"All options are optional. `reactNative()` with no\narguments works for any real RN app\" and then shows every option written out, which\nreads as the defaults spelled in full. One line made it materially different:\n\n presets: [], // Third-party library\n[…]\nuto-detection to find something first, so it cannot pass by both sides being empty,\nand requires the block to stay literal-only — a defaults reference a reader cannot\ncopy verbatim is itself a defect.",
"is_bot": false,
"headline": "docs(options): stop documenting a config that disables every preset (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:18:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee3208384a78cf7b351a5ab5ac27d8d51d4eb57a",
"body": "…ne (#102)\n\nThree pages tell readers to verify the fidelity claim themselves:\n\n index.md \"Anyone can run it (`bun run crosscheck`)\"\n fidelity.md \"Reproduce it yourself: `bun run crosscheck`.\"\n comparison.md \"It's reproducible — clone the repo and run `bun run crosscheck`.\"\n\nNone of them\n[…]\nith instructions rather than falling through to the unresolved import.\n\nThe decision is split into scripts/ensure-built.mjs with its dependencies injected,\nso it can be tested without running a build.",
"is_bot": false,
"headline": "fix(crosscheck): make the published reproduce command work from a clo…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:17:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "daa3e207caae1eda35a1b29c0e453b713bfb9c71",
"body": "…m (#101)\n\nThree ways the published matrix page misstated what CI had gated.\n\nRows rendered only the RESOLVED Vitest version. The `locked` and `latest-supported`\ncells normally resolve to the same version, so the two rows came out byte-identical:\nthe live page listed every React Native version twice\n[…]\names the missing cells, and\nexplains why they can be absent.\n\nThe resolved-version fallback no longer restates the axis name when a report body\nlacks a version, since the flavor is now its own column.",
"is_bot": false,
"headline": "fix(fidelity): make the matrix page describe the run it was built fro…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:17:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2a2fe905b739fe0dabc4aa0091d92d4ca512fd66",
"body": "…#100)\n\nThe published fidelity numbers are generated from however many probes reported,\nwith no floor. Probes can stop registering without anything going red — an import\nthat throws, a describe that never runs, a helper that returns early — and the\narithmetic downstream stays honest while the eviden\n[…]\nlished number an\nexplicit and reviewable act rather than a side effect of regenerating.\n\nThe floor lives in the badge rather than a new file so it cannot drift away from\nthe number actually published.",
"is_bot": false,
"headline": "fix(fidelity): treat a shrinking cross-check corpus as a regression (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:17:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "da5c8cc083ea3d6c88af0f32571d86a4d2cc415c",
"body": "…(#99)\n\nThe external-app ratchet has failed on its last two scheduled runs, and the tracking\nissue it opened says \"(infra?)\" — with the question mark — because the workflow could not\ntell what had happened.\n\ncollectCounts returns null when a run produces no JSON to measure, and the caller never\nchec\n[…]\n blank line within 400 characters of the call and so matched only one of the two sites,\nwhich would have reported success while half the code went unchecked. It now fails when\neither guard is removed.",
"is_bot": false,
"headline": "fix(bakeoff): classify an unmeasurable run instead of crashing on it …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:17:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f21986f629777b11446f6c2491088405609b2853",
"body": "… (#96)\n\n* fix(mocks): close the Animated surface gaps against real React Native\n\nDiffing the mock's member list against real React Native's, rather than testing\nbehaviour, found fourteen differences in the Animated surface. A behavioural probe\ncannot catch an absent member: nothing exercises it, so\n[…]\nady\ncommitted, so this only changes what Windows produces. Confirmed by comparing the two\norderings directly rather than by inference: they differ, and the sorted order is the\none already on the page.",
"is_bot": false,
"headline": "fix(mocks): close the Animated surface gaps against real React Native…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-26T20:15:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a70c9f232ab04b2e975df8a46d09001aa6803923",
"body": "…rk found reviewing it (#95)\n\n* feat(native): give the hot runtime real per-file module isolation\n\nThe hot runtime kept externalized modules resident across test files and undid their\ndamage afterwards, from a boot snapshot plus a call-stack heuristic attributing each\nlistener to import or test phas\n[…]\nification ran from inside the package, which is the one place the\nomission is invisible.\n\nAlso checks the other direction: all 17 `bun run` invocations in ci.yml now resolve\nagainst the root manifest.",
"is_bot": false,
"headline": "fix(native): per-file hot isolation, plus the correctness and gate wo…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-25T14:38:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4a2cd63607d4da0093d88cdb4562dabe34a7cfa2",
"body": null,
"is_bot": false,
"headline": "chore: release 0.9.0 (#94)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T22:04:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac70decbae2582c5b20299eeaad400ddb561a94a",
"body": "…') work (#93)\n\n* perf(native): precompile React Native's require graph into a lazy module registry\n\nThe native engine re-instantiated React Native's ~440-module graph for every\nisolated test file. Measured on RN 0.86, that cost ~59ms for a typical test's\nslice of RN and ~110ms for the full public s\n[…]\n roughly 10% above the new actuals. The guardrail's purpose is to\ncatch unintended growth, which it still does; it is not meant to pin the artifact to\na size measured before a reviewed feature landed.",
"is_bot": false,
"headline": "perf(native): precompile React Native, and make vi.mock('react-native…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T22:00:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4a4ec0731615e492fac8170757b8f48165bd95e",
"body": null,
"is_bot": false,
"headline": "harden validation signals and package budgets (#90)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T21:55:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e35583450e80e96c9f31d415b21ade19b1466e7",
"body": "…ry file read/execute) (#80)",
"is_bot": false,
"headline": "fix(deps): bump bench vitest 4.0.18 -> 4.1.9 (GHSA: UI server arbitra…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T18:26:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e47c10bb0c1287bbf83de428ab899aaccbb6036f",
"body": "Bumps the production-dependencies group with 1 update in the / directory: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types).\n\n\nUpdates `flow-remove-types` from 2.321.0 to 2.322.0\n- [Release notes](https://github.com/facebook/flow/releases)\n- [Changelog](https\n[…]\nte:semver-minor\n dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump flow-remove-types (#91)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-24T18:26:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3b08c194b2c49380b6524bc7e6d095e3f2ca2799",
"body": "…ure points (#87)\n\n* feat(dx): actionable errors + engine transparency at migration failure points\n\nUntransformed node_modules JSX/Flow/TS SyntaxErrors now name the owning\npackage and the transform:[...] fix; Babel transform crashes are decorated\nwith file/platform/package at the single choke point;\n[…]\nanspiled JSX and asserts the explained error (package name, the\ntransform:[...] fix, chained cause) — the require-hook wiring was previously\ncovered only by unit tests of the pure explainer functions.",
"is_bot": false,
"headline": "feat(dx): actionable errors and engine transparency at migration fail…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T18:26:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bbbfc5d7359dfc3cf2e627d06600f5d2f3dd9b82",
"body": "…s) (#89)\n\nexpo's Expo.fx requires async-require/messageSocket whenever\n__DEV__ && globalThis.expo, and the module throws at load time when the\nbundle wasn't served over HTTP — taking down any suite that imports an\nexpo-* package under the native engine. Its only job is a devtools\nwebsocket to a liv\n[…]\nlate bake-off: login-form suite goes\nfrom import-time failure to passing; 34/40 → 38/40 overall (the two\nremaining failures pre-date this change and are bottom-sheet mock\ncompleteness, not Expo-init).",
"is_bot": false,
"headline": "feat(native): stub Expo's dev-server messageSocket (unblocks Expo app…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T18:23:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "19fc38175e0339a1dfbc46b4ba98fb5c1002480f",
"body": "Split PRs break lockstep-versioned actions: github/codeql-action\ninit/analyze/upload-sarif must move together, or each individual PR\nfails Analyze with a config/runner version mismatch (seen on #81/#82).\nGrouping also collapses the weekly actions noise into a single PR.",
"is_bot": false,
"headline": "ci: group all github-actions dependabot bumps into one PR (#88)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-24T18:23:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d313e71115f0d92bf49f432ecae5291743c130d9",
"body": null,
"is_bot": false,
"headline": "chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 (#57)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:32:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bec216c09bbf144de27a8a17f1ed4539834f3d0e",
"body": "Bumps the production-dependencies group with 1 update in the / directory: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types).\n\n\nUpdates `flow-remove-types` from 2.318.0 to 2.321.0\n- [Release notes](https://github.com/facebook/flow/releases)\n- [Changelog](https\n[…]\nte:semver-minor\n dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump flow-remove-types (#56)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-09T21:32:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2ce2b31123d4b762aef49f873fa519ddb7ce527a",
"body": null,
"is_bot": false,
"headline": "feat(trust): weekly real-app bake-off ratchet (stock + hot) (#78)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:31:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1a3bceadef37b20f11d2c12fb6937eda381513c5",
"body": "* feat(cli): npx vitest-native init | doctor | migrate\n\nThe docs previously asked migrating users to be the codemod: the jest-compat\nconfig block was copy-pasted across four doc pages, environment problems\n(missing babel preset, RNTL 14 on Node < 22.13, absent peers) surfaced as raw\nruntime failures\n[…]\nle-character alternatives keep the repetition\nunambiguous and linear while preserving the no-early-close property for\nleading nested groups. Verified: 50k-char unclosed input resolves in\nmilliseconds.",
"is_bot": false,
"headline": "feat(cli): npx vitest-native init | doctor | migrate (#75)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:31:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c0d5f6770d2b4a905ce3348164579858f2ff7472",
"body": "…ports (#74)",
"is_bot": false,
"headline": "feat(trust): publish the per-version fidelity matrix from CI's own re…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:30:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6a6ae3f2f48b3711a442cb879235ea3a3462b92",
"body": "…#76)\n\n* feat(mock): Animated as a live node graph with subscribing wrappers\n\nThe mock's Animated was a snapshot system: numeric interpolate() returned a\ndead value computed at call time (string interpolation was live via closure —\nthe two paths disagreed), add/multiply/&c coerced node operands to 0\n[…]\ndren ≤ 1 after five re-renders),\npost-unmount consumer emptiness, removeAllListeners keeps the mounted\ncomponent updating while user listeners stop. 158 Animated tests + 78/78\ncrosscheck probes green.",
"is_bot": false,
"headline": "feat(mock): Animated as a live node graph with subscribing wrappers (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:28:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9531800cf1ea5b0d08f3a5b17b2d446ede5998af",
"body": "… bound matrix cells (#72)",
"is_bot": false,
"headline": "ci: cancel superseded runs, cache bun downloads and transform output,…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:25:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3b1c39692fa831bdabe12eb171dcdf8d9bba6497",
"body": "…l/core (#73)\n\n* perf(native): project-local content-keyed transform cache, lazy @babel/core\n\n- Move the transform disk cache from os.tmpdir() to the project's\n node_modules/.cache/vitest-native/ (tmpdir fallback when node_modules is\n absent/unwritable). tmpdir is ephemeral on CI runners — every j\n[…]\n subprocess\n\nWindows absolute paths (D:\\...) are rejected by Node's ESM loader as an\nunsupported URL scheme; pathToFileURL makes the inline script portable.\nCaught by the Windows leg of the full gate.",
"is_bot": false,
"headline": "perf(native): project-local content-keyed transform cache, lazy @babe…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:24:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c567c15000106d691a4f1d920c0c6f77aa75763",
"body": "…ride clearing (#70)\n\nUnmocked native modules were served by a Proxy that minted a fresh stub\nobject on every property access and whose get trap never consulted the\ntarget. Consequences: NativeModules.Foo !== NativeModules.Foo, and\nvi.spyOn(NativeModules.Foo, 'method') silently recorded nothing — th\n[…]\nThe leak's expression is environment-dependent, but\n the clear-then-restore order is strictly safer.\n\nUnder the default engine each file gets a fresh process, so the reset\nregistry never fires there.",
"is_bot": false,
"headline": "fix(native): identity-stable, spy-able turboStubs with hot-reset over…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:23:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "091a57276bb1c53a1227b36bcc373842ff8a25ab",
"body": "…trip guard (#71)\n\n* fix(hardening): prerelease peer versions, asset-stub escaping, Flow-strip guard\n\n- validate.ts: strip prerelease/build metadata before version comparison —\n \"4.0.0-beta.3\" parsed to [4, NaN, …] and failed the minimum check, throwing\n the unsupported-peer startup error for inst\n[…]\nnly prereleases sharing the minimum's major.minor failed, not all\nprereleases); the quote-escaping test now asserts the emitted literal\nround-trips rather than mirroring the implementation expression.",
"is_bot": false,
"headline": "fix(hardening): prerelease peer versions, asset-stub escaping, Flow-s…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:23:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "373a55cb05b33ba0c1702bcef1e9f1ccabc08a1e",
"body": "…ine reality (#69)\n\n- native-rn-matrix.yml: add the RN 0.86 row. The lockfile has shipped RN 0.86\n since #38, so the full gate already ran it on every push, but the matrix —\n which the published fidelity page derives its claim from — still stopped at\n 0.85, publishing an understated range. Add a \n[…]\ns the engine caveat and documents the previously-undocumented\n setInsets(), plugin-options.md documents the per-project alternative and adds\n the missing mock-engine-only caveat on the mocks option.",
"is_bot": false,
"headline": "docs+ci: sync trust surfaces with the actually-gated RN range and eng…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-09T21:22:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "57f155d6090a60e9ce1c1bfd315a7a1d23eacd4c",
"body": "…t subpath shadowing (#68)\n\n* fix(resolution): leaf-aware subpath imports, real package.json, preset subpath shadowing\n\nThree resolution-fidelity gaps around deep (subpath) imports, all silent\nfailures:\n\n- react-native subpath default exports (mock engine): import Platform from\n 'react-native/Libra\n[…]\nty subpaths are never shadowed — is now\nasserted at the loader and plugin resolution layers, with both packages\nregistered as presets so the pass-through is attributable to the\nutility-leaf exemption.",
"is_bot": false,
"headline": "fix(resolution): leaf-aware subpath imports, real package.json, prese…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-02T21:13:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "24c5c3c22b8eba7eded35fdf3c019b234222074e",
"body": "…(#67)\n\nThe fidelity report is rendered by VitePress, which parses Markdown as\nVue. A known-difference description contained a bare `<Text>`, which\nVitePress read as an unclosed HTML element — breaking `vitepress build`\n(and the Pages deploy) since the report began publishing that row.\n\nEscape free-\n[…]\no probe reasons and known-difference rows. The one currently-affected\ncell (<Text>) is updated in the committed page to match the fixed\ngenerator's deterministic output, keeping the drift check green.",
"is_bot": false,
"headline": "fix(fidelity): escape Markdown/Vue hazards in generated report cells …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T19:47:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6c295660786e2f4e8e1ec5cfb42203873b8de68e",
"body": "…l runs (#66)\n\nExpand the Migrating from Jest guide with the empirically-derived reality\nof a real migration:\n\n- A 'Known limits' section: assertions coupled to Jest's RN mock internals\n that can't port under a real-RN engine (jest.spyOn(View.prototype, …),\n mocks of RN internal submodules, raw so\n[…]\nse error and adding the package to transform (the transformIgnorePatterns\n replacement), plus vi.mock needing the lib in the Vite graph.\n\nApplied to both the website guide and the packaged docs copy.",
"is_bot": false,
"headline": "docs(migration): document known limits + transform-allowlist from rea…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T19:42:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6c4c5b1e70b4958b38db987cf0c7a52789cceec",
"body": "RN's getDevServer (Libraries/Core/Devtools/getDevServer.js) reads\nSourceCode.getConstants().scriptURL and calls .match() on it. Under the\nnative engine the value was undefined, so getDevServer threw and took down\nany test whose module graph reached it.\n\nReturn a file:// (bundled) URL for the SourceC\n[…]\nsymbolicateStackTrace, DevTools) and third-party SDKs\nfrom believing they're connected to a packager and attempting real network\nI/O against localhost:8081, mirroring the intent of RN's own jest mock.",
"is_bot": false,
"headline": "fix(native): provide SourceCode.scriptURL so getDevServer resolves (#65)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T19:30:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a756f6a522974730e73414130e8ed6e94d02a160",
"body": "Jest suites commonly clone-and-override React Native:\n const RN = jest.requireActual('react-native'); RN.Platform = {...}\nUnder the native engine RN's index is a facade of lazy getters with no\nsetters, so the assignment threw \"Cannot set property … which has only a\ngetter\" and failed to load the wh\n[…]\ny) facade, assignments are captured so the override\nwins on later reads — matching Jest's mutable module. Only react-native is\nwrapped; its submodules and other packages are ordinary mutable CommonJS.",
"is_bot": false,
"headline": "fix(jest-compat): make requireActual('react-native') writable (#64)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T18:32:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2d07b7a885c7999b9e7a2177a00c47c8500a3e9e",
"body": "react-native-worklets is Reanimated's low-level runtime and is also\nimported directly by apps (e.g. `import { scheduleOnUI } from\n'react-native-worklets'`). It ships a Jest mock at\n`react-native-worklets/lib/module/mock` that is ESM ending in\n`module.exports = …`; under the native engine React Nativ\n[…]\nheir worklet synchronously,\nmatching the Reanimated preset's runOnJS/runOnUI convention — and register\nit in the auto-detect map. Worklets-using suites now load and render\nwithout a hand-written mock.",
"is_bot": false,
"headline": "feat(native): add react-native-worklets preset (auto-detected) (#63)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T18:20:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e49168ef584c48497efaa750e1d405f00f570175",
"body": "…ing (#62)\n\n* feat(native): bound hot-runtime memory with a default per-worker ceiling\n\nHot workers keep React Native resident and accumulate ~4 MB per test file\n(RNTL's resident render trees can't be reclaimed across files), so an enabled\nhot runtime with no configured recycling could grow toward O\n[…]\neaking\nthe precedence in plugin.ts would pass unit tests silently. Assert that\nplain hotRuntime:true turns on worker heap reporting (memoryLimit > 0),\nguarding the default-application path end to end.",
"is_bot": false,
"headline": "feat(native): bound hot-runtime memory with a default per-worker ceil…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-07-01T17:39:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e3dee081170fd4f02a5c390f43696ee7577e830f",
"body": "… design (#61)\n\n* test(validation): add idiomatic hot-parity oracle (proves hot == default at scale)\n\nAdds a vitest-first validation suite representing how a normal app uses\nvitest-native — host-element queries, userEvent, real Animated, Context,\nFlatList, Switch, real listener/timer hooks — with NO\n[…]\nworkers, so a worker-count cap is still needed (m4).\n- README reframed to lead with parity (the load-bearing evidence) and to note the\n hand-written suite is a manual snapshot, not yet CI-wired (M4).",
"is_bot": false,
"headline": "test(validation): idiomatic hot-parity oracle + de-risk + hot-default…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-30T21:43:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0d3840152cd08ff1b765a9d1d3f1b364aec19cfa",
"body": "…+ corpus 56→75, 3 mock fixes) (#59)\n\n* feat(fidelity): publish the cross-check as a living fidelity report\n\nTurns the behavioral cross-check from an internal CI gate into a published,\nself-updating proof of mock-vs-real-React-Native parity.\n\n- crosscheck.mjs writes an ephemeral combined report (RN \n[…]\ner-facing mock behavior fixes (Pressable function\nstyle/children, processColor undefined for unparseable input) and the new\nfidelity report so they appear in the changelog and trigger a patch release.",
"is_bot": false,
"headline": "feat(fidelity): publish the cross-check as a living fidelity report (…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-30T20:14:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7ec60b637fc9af6984295ba3062a027870ffb380",
"body": "…resident-state limitation (#55)\n\n* fix(native): bound hot-runtime memory and surface inactive recycling\n\nUnder the hot runtime, React Native Testing Library is loaded once and\nstays resident, so its auto-registered `afterEach(cleanup)` only takes\neffect for the first test file. Every later file's m\n[…]\nuites back to\nthe default engine, and explains why the mode stays opt-in and experimental\n(a per-file module reset inside a persistent worker is an upstream Vitest\ncapability that does not yet exist).",
"is_bot": false,
"headline": "fix(native): surface inactive hot-runtime recycling and document its …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-28T16:36:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f9cbee0ec93b4d38f1cc7e90995f0330c37e0735",
"body": "* docs: use reliable GitHub-hosted avatars for contributors section\n\ncontrib.rocks was timing out (broken image on the README). Replace it with\nGitHub-hosted contributor avatars (always reachable) linking to each profile,\nplus an auto-current link to the contributors graph for the full list.\n\n* docs: drop the heart emoji from the contributors line",
"is_bot": false,
"headline": "docs: fix broken contributors image (use GitHub-hosted avatars) (#54)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-26T12:21:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "54f3e4c3ba538e172a079d493f4118df1645e8e8",
"body": null,
"is_bot": false,
"headline": "docs: add auto-updating contributors section to the README (#53)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-26T12:11:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04bf9085068c3e220961d185cef6371b537d70eb",
"body": "* chore: release 0.8.0\n\n* docs: credit @Doko-Demo-Doa for the node_modules path fix in the changelog",
"is_bot": false,
"headline": "chore: release 0.8.0 (#52)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-26T11:38:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b31e3d9c634d6ac7fc094faff958d7e4b553639f",
"body": "* test: await RNTL render/fireEvent/act for RNTL 14 async APIs\n\nRNTL 14 makes render/renderHook/fireEvent/act/rerender/unmount async.\nAwait them across the test suites (back-compatible with RNTL 12/13, where\nawait on a non-Promise is a no-op). Bump devDep RNTL to 14 + add the new\ntest-renderer/react\n[…]\n=12 <15, so test the floor too: add an RNTL 12 Node 20\nleg alongside RNTL 13. Continuously proving the full declared range (12, 13, 14)\nkeeps the compatibility claim backed by CI rather than asserted.",
"is_bot": false,
"headline": "feat: support @testing-library/react-native 14 (range 12–14) (#51)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-26T11:17:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "489a5360930cdaec06b5848527ca229f97ea87eb",
"body": "…older (#50)\n\n* fix: update regex patterns to include node_modules for react-native paths\n\n* test(native): guard node_modules-scoped RN path detection + changeset\n\nAdd a regression test asserting React Native is externalized only under\nnode_modules (not in a project named react-native), and a changeset for\nthe fix.\n\n* style: apply oxfmt to native external config\n\n---------\n\nCo-authored-by: Daniel Fry <danf@hotmail.co.za>",
"is_bot": false,
"headline": "fix: update regex patterns to include node_modules for react-native f…",
"author_name": "Quan Pham",
"author_login": "Doko-Demo-Doa",
"committed_at": "2026-06-26T10:06:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "067e2aab5fbc6100feda4015a82da0c1fff88081",
"body": "* feat(presets): add flash-list, bottom-sheet, keyboard-controller\n\nThree native-module libraries the migration bake-offs repeatedly had to mock by\nhand. Each is now auto-detected when installed and shadowed by a self-contained\npreset under both engines:\n\n- @shopify/flash-list: renders its data thro\n[…]\nonstants and assert the full shape. Also clarify the comment: the scrollable\nmembers are backed by the engine's own RN component mocks (equivalent behavior),\nnot literally the library's RN components.",
"is_bot": false,
"headline": "feat(presets): flash-list, bottom-sheet, keyboard-controller (#48)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-24T21:15:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0554e5522cb5c147d984d2efce8f9ba0d15859cc",
"body": "Bumps the production-dependencies group with 2 updates: [flow-remove-types](https://github.com/facebook/flow/tree/HEAD/packages/flow-remove-types) and [react-native](https://github.com/facebook/react-native/tree/HEAD/packages/react-native).\n\n\nUpdates `flow-remove-types` from 2.317.0 to 2.318.0\n- [Re\n[…]\nte:semver-minor\n dependency-group: production-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump the production-dependencies group with 2 updates (#45)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-24T21:00:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5eaf8cb344aff58807cef24340fe7f617de7c682",
"body": "…mpile cache (#47)\n\n* perf(native): cache the RN graph's compiled bytecode via Node's V8 compile cache\n\nUnder engine:'native' with per-file isolation, React Native's module graph is\nre-instantiated per test file, recompiling its source to V8 bytecode each time.\nEnable Node's on-disk compile cache (N\n[…]\nve-internals coverage.\n- Note in the source why no atomic-write handling is needed: Node CRC32-validates\n each compile-cache entry, so a raced write is a cache miss and recompile, never\n corruption.",
"is_bot": false,
"headline": "perf(native): cache the RN graph's compiled bytecode via Node's V8 co…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-24T20:59:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e7353f0c118fd3b345cf80a96c1bbc1554cb1c01",
"body": "changeset version: bump 0.6.1 → 0.7.0, consuming the externalized-resolution\n(minor) and react-native 0.86 exports (patch) changesets into the package\nchangelog.",
"is_bot": false,
"headline": "chore: release 0.7.0 (#44)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-21T19:56:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03ea0969a73bcf637d7b7ee5b8d51bdf00789e9b",
"body": "…rides (#42)\n\nAdds the runtime-issue Troubleshooting entries migrators most commonly hit:\n\n- Large native suites can exhaust a worker's heap (every file loads a full RN\n renderer); document `poolOptions.threads.memoryLimit` (Vitest recycles a worker\n once it exceeds the limit) and the experimental\n[…]\nd.\n- How to override an auto-detected preset's mock (vi.mock + spread importOriginal),\n since presets expose the module to Vitest's graph.\n\nLinks the migration guide's triage step to Troubleshooting.",
"is_bot": false,
"headline": "docs: cover large-suite memory, error-boundary noise, and preset over…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-21T19:46:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7b368b19a75529859a6feea0cbfd40953b3a0fa2",
"body": "…bals, a11y (#40)\n\nFills the remaining native-engine integration gaps (the unit layer in tests/\nalready covers transform/resolve/boundary/preset factories; tests-native covers\ncomponent + preset integration):\n\n- resetAllMocks() actually restores driven Dimensions / color scheme / injected\n native m\n[…]\n-environment flags, the batched-bridge config).\n- Accessibility queries (getByRole/getByLabelText) and toHaveStyle resolving a\n StyleSheet ref — core RNTL paths not previously exercised under native.",
"is_bot": false,
"headline": "test(native): cover control surface, platform-extension priority, glo…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-21T19:46:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c355c15e8f5274dbac87656c934efb580ab9a40",
"body": "The module holds module-level state (the in-memory `mem` cache, lazy babel\nhandles) plus a shared disk cache, so 'stateless' was inaccurate. The real point\nis that the loader and require hooks run in separate threads, each with its own\nmodule instance (per-thread in-memory cache), with the disk cache shared across\nthem. State the accurate model.",
"is_bot": false,
"headline": "docs(transform): correct the misleading 'stateless' module comment (#41)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-21T19:46:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37c8123061ac5dbbd4fc5c859d1156f8a8eab092",
"body": "…ps (#39)\n\n* feat(native): Metro-style resolution for externalized node_modules deps\n\nVitest externalizes node_modules dependencies that Node can import natively, so\nthey load through Node rather than Vite — and Node's resolver has no notion of\nReact Native's Metro conventions. The native engine now\n[…]\nyout, and the cache lifetime matches Vite's own resolution cache (a newly added\nplatform variant is picked up on restart). Behavior is unchanged; only repeated\nresolution of the same base is now O(1).",
"is_bot": false,
"headline": "feat(native): Metro-style resolution for externalized node_modules de…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-21T19:46:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5a868728cdbca1a50ca51cb4dfc8e66b3fb6afa4",
"body": "The weekly compatibility check found 10 new stable exports in\nreact-native 0.86 that were not covered by the mock registry.\n\nMock the three real exports so named imports resolve under the mock\nengine:\n- EventEmitter (generic base event-emitter class)\n- useAnimatedColor (returns an Animated.Color)\n- \n[…]\nnd\nrelated) to the compatibility check's known-skipped list, alongside\nthe existing unstable_VirtualView family.\n\nVerified against the real react-native 0.86.0 index: no missing\nstable exports remain.",
"is_bot": false,
"headline": "fix(compat): mock react-native 0.86 top-level exports (#38)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-16T18:15:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8ebe480c82bf66fe3f81189ed67be5143f1ff906",
"body": "- changeset version: bump to 0.6.1, add the #32 getter-export ESM facade\n fix to the package changelog.\n- docs: point the Changelog nav link at the real, changesets-maintained\n packages/vitest-native/CHANGELOG.md (was pointing at the stale root\n CHANGELOG.md that only listed 0.1.0).\n- root CHANGELOG.md: replace stale content with a pointer to the package\n changelog.",
"is_bot": false,
"headline": "chore: release 0.6.1 + fix changelog link (#34)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T16:28:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77164e972a143fb47d191ca39b57db4630109215",
"body": "The #32 merge landed before the Full gate finished and failed format:check\n(loader.mjs not oxfmt-formatted). Formatting only — no logic change.",
"is_bot": false,
"headline": "style: oxfmt loader.mjs (fix format:check on main) (#33)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T16:18:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "40a51476aa675bba25842a0097b2f5a4416344f0",
"body": "…med-import getter exports (#32)\n\nReact Native's index exports via lazy getters (module.exports = { get\nAppearance() {…} }), which cjs-module-lexer can't see when Node imports\nthe CJS from the ESM graph — so an externalized ESM dep doing\n'import { Appearance } from \"react-native\"' threw 'does not pr\n[…]\ndule._extensions hook).\n\nRemoves the need for the manual transform:['uniwind'] workaround.\nSurfaced by the obytes bake-off. Regression test + externalized fixture\nincluded (negative-control verified).",
"is_bot": false,
"headline": "fix(native): serve RN index as ESM facade so externalized libs can na…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T16:10:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "29118357d1e71813f82bb8cf595bae580e0ad402",
"body": "* docs: update paper bake-off to 625/734 (~85%)\n\nReflects the improved bake-off (runtime monkeypatch of resident RN's\nAnimated/Dimensions recovered ~23 tests). Tighten the remaining-failures\nexamples to the irreducible jest-mock-internal cases.\n\n* docs: add obytes bake-off (34/40) as a second reproducible data point",
"is_bot": false,
"headline": "docs: bake-off updates (paper 625/734, obytes 34/40) (#31)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T15:54:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44c217787582444ce7ba050dd3a9ef1c98d08291",
"body": "Consume pending changesets: vectorIcons preset (minor), Animated host/\nstyle fidelity, native asset require() stub, and the hot-runner Vitest\n4.0.x compat fix (patches).",
"is_bot": false,
"headline": "chore: release 0.6.0 (#30)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T15:25:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "476fa6a8659a35de59c4f31ccc23728a8aaa09ae",
"body": "* docs: add VitePress documentation website\n\nA full docs site under website/, deployed to GitHub Pages, matching the\nVitePress setup used by bonsai-js and reflow-ts.\n\n- Home page with hero, two-engine pitch, and Jest comparison\n- Guide: intro, install, quick-start, engines, how-it-works, plugin\n op\n[…]\nom/danfry1/vitest-native-bakeoffs): paper's own suite runs\n602/734 (~82%) under engine:native with a config swap + RNTL bump; the\nrest are jest-mock-coupled tests, not bugs. README + homepage + guide.",
"is_bot": false,
"headline": "docs: add VitePress documentation website (#28)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T15:22:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "50ffc49f3b501369f2122340c8e659f0da74613e",
"body": "PR #27 switched the hot runner to import TestRunner from \"vitest\" to drop\na 4.1 deprecation warning — but vitest 4.0.x doesn't export TestRunner\nfrom the main entry (only VitestTestRunner via the now-deprecated\n\"vitest/runners\"). That made the hot runner 4.1-only while the package\ndeclares vitest >=\n[…]\n on vitest 4.1 (this repo) and 4.0.18 (bench).\n\nbench: bump vite 6.4.1 -> 6.4.3 to satisfy the package's peer floor\n(>=6.4.2), which is what exposed the regression when re-running the\nscale benchmark.",
"is_bot": false,
"headline": "fix(native): restore vitest 4.0.x compatibility in hot runner (#29)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T15:22:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2d78a0d077f7f1755f92243981ac6b5d05761ec",
"body": "…r (#27)\n\nvitest/runners is deprecated since Vitest 4.1, emitting a warning once per\nworker spawn under the hot runtime. Vitest 4.1 re-exports the identical\nclass as TestRunner from the main entry, so import that instead.",
"is_bot": false,
"headline": "fix(native): use non-deprecated vitest TestRunner import in hot runne…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-14T08:54:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3297e5bc628875c3428de126fa40c32ce6f61736",
"body": "* fix(native): stub asset require() on Node's CJS loader path\n\nA literal require('./logo.png') in an RN component escapes Vite's asset\nhandling and reaches Node's CJS loader, where the binary was compiled as JS\nand threw 'SyntaxError: Invalid or unexpected token', failing the whole file.\n\nThe native\n[…]\n311 -> 317\n(entire vector-icons failure category resolved). vitest-native gates: native 97,\nmock 1240, crosscheck 43/43, typecheck/lint clean.\n\n* chore(deps): exact-pin vector-icons devDeps (syncpack)",
"is_bot": false,
"headline": "feat(native): asset require() stubbing + vectorIcons preset (#26)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T21:51:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e333954dca037871c49191a939b5b6f3693a770a",
"body": "Two fidelity gaps surfaced by the mock-vs-real-RN cross-check:\n\n- Animated.Text rendered a host literally named \"Animated.Text\", so RNTL's\n queryByText (which only descends into Text hosts) couldn't see its children.\n createAnimatedWrapper now strips the Animated. prefix and renders the base\n hos\n[…]\n within(), getAllByRole, toHaveProp, accessibility-value,\nActivityIndicator/KeyboardAvoidingView), which is what caught both bugs.\n\nGates: crosscheck 56/56, mock 1240, native 93, typecheck/lint clean.",
"is_bot": false,
"headline": "fix(mock): Animated.* host name + Animated.Value style resolution (#25)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T21:50:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "baaf491f777f4a7d442259b58c5e2e27aaa938cf",
"body": "…-permissions) (#24)\n\nCodeQL (js/polynomial-redos): the rgb()/rgba() color parsers in Animated.ts\nused overlapping \\\\s* groups (\\\\s*(\\\\d+)\\\\s*,...), which backtrack\npolynomially on malformed input like 'rgb(9,9,9' + many spaces. Strip\nwhitespace once (linear) then match without \\\\s* — verified ~1058\n[…]\n, native-rn-matrix.yml and compat-check.yml\nhad no top-level permissions. Add 'permissions: contents: read'; compat-check's\njob keeps 'issues: write' for the github-script edge-failure tracking issue.",
"is_bot": false,
"headline": "fix(security): resolve code-scanning findings (ReDoS + workflow token…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T18:09:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4c9ce3816c9928009bfe75d8e75c48b97d24f180",
"body": "Bumps [actions/github-script](https://github.com/actions/github-script) from 7.0.1 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/60a0d83039c74a4aee543508d2ffcb1c3799cdea...3a2844b7e9c422d3c10d287c895573f710\n[…]\nirect:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump actions/github-script from 7.0.1 to 9.0.0 (#10)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-13T17:41:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b022e6892cf002d31c60d7a133dcb895ec8fd67",
"body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.1 to 4.36.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/8\n[…]\nirect:production\n update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump github/codeql-action from 4.36.1 to 4.36.2 (#11)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-13T17:41:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "39ef7f9fc4bf920caf0a24fe109ab0eec08a0428",
"body": "Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.9.3 to 6.0.3.\n- [Release notes](https://github.com/microsoft/TypeScript/releases)\n- [Commits](https://github.com/microsoft/TypeScript/compare/v5.9.3...v6.0.3)\n\n---\nupdated-dependencies:\n- dependency-name: typescript\n dependency-vers\n[…]\nrect:development\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps-dev): bump typescript from 5.9.3 to 6.0.3 (#15)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-13T17:41:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f4771469642a660bbe305bde49768c0a9a1d8316",
"body": "…(#23)\n\nFold the post-#19 fixes into the unreleased 0.5.0 entry and drop the stray\nchangeset:\n- #18 disabled-press fix (pointerEvents:\"none\" under RNTL >=14)\n- #22 hostComponentNames configure-warning fix\n- #21 mock-engine RNTL 14 consumer fixture noted in the validation matrix\n\nRemoves .changeset/disabled-press-pointer-events.md (this repo documents\nreleases manually in CHANGELOG.md; the changeset would otherwise linger\nunconsumed). No version bump — 0.5.0 is unreleased, so these fold in.",
"is_bot": false,
"headline": "docs(release): document mock-engine RNTL 14 fixes in 0.5.0 changelog …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T17:13:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "39a5b3596963347c1e8ca17011b4b3cb3c55b5d0",
"body": "RNTL 14 removed the hostComponentNames configure option (it auto-detects host\ncomponents by rendering a probe, which works with the mock's host names).\nPassing it on RNTL >=14 is a no-op that logs an 'Unknown option(s) passed to\nconfigure' warning on every run. Detect the RNTL major version and only\n[…]\ntorical behavior, required by older RNTL).\n\nVerified: warning gone under the mock + RNTL 14 consumer fixture (still 7/7),\nand the RNTL 12.9 mock unit suite still configures hostComponentNames (57/57).",
"is_bot": false,
"headline": "fix(mock): skip hostComponentNames configure on RNTL >=14 (#22)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T14:22:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a714dbf4f6d85d306b568efff44f30220254b8c1",
"body": "…re (#21)\n\nFollow-up to #18. The disabled-press fix lives in the mock engine, but nothing\nin CI paired the mock engine with RNTL 14 — unit tests run RNTL 12.9 (where the\nbug doesn't reproduce) and the other consumer fixtures use the native engine.\nThis adds the missing combination as a packed consum\n[…]\ns disabled\nPressable/Touchable*/Button do not fire onPress while enabled controls still do.\n\nVerified the fixture fails on the pre-#18 build (disabled Pressable + Button\nfire) and passes with the fix.",
"is_bot": false,
"headline": "test(consumers): guard disabled-press fix with a mock + RNTL 14 fixtu…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T14:11:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f996dc2c284d54d92aab5df7f363ea0121998758",
"body": null,
"is_bot": false,
"headline": "fix: block press on disabled mocks under RNTL v14 (#18)",
"author_name": "Jake Boone",
"author_login": "jakeboone02",
"committed_at": "2026-06-13T14:05:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a566712cf0f2743e579a5e3bc3ec0098a486478",
"body": "* feat: harden native runtime and release gates\n\n* fix: restore Vite and RN 0.81 CI compatibility\n\n* ci: enforce LF line endings via .gitattributes\n\nThe Windows full-gate job failed at the formatting step: GitHub's Windows\nrunners check out with core.autocrlf=true, rewriting every tracked file to\nCR\n[…]\n Windows, so the absolute include never matched and the\ncrosscheck reported 'No test files found' (0/0 probes) on the Windows gate.\nNormalize to forward slashes — a no-op on POSIX, correct on Windows.",
"is_bot": false,
"headline": "Harden native runtime reliability and release gates (#19)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-13T13:43:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c2b9415f221af1286bc618cc8d3c793ec515ad88",
"body": "- Installation: note the companion deps the examples need (@testing-library/\n react-native; real RN apps already have react-native + babel-preset + @babel/core).\n- Correct the RN-conformance count (118 ported: 115 pass, 3 documented skips).\n- (Quick Start vitest import + Maintained-successor wording already on main.)\n\nPatch release to get the corrected README onto npm.",
"is_bot": false,
"headline": "docs(readme): improve consumer onboarding (0.4.1)",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-11T20:45:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dff1ed09de766a5bfddba093d65b2ec28458cf2a",
"body": "- Quick Start used bare test()/expect() with no import, but the plugin does NOT\n enable Vitest globals (every real test in the repo imports from 'vitest'), so a\n consumer copying it hit \"test is not defined\". Add the import; note the\n globals:true alternative.\n- \"Spiritual successor\" -> \"Maintained successor\" (matches the root README and the\n actual positioning) + link the migration guide.",
"is_bot": false,
"headline": "docs(readme): fix the Quick Start example + strengthen lineage wording",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-11T20:42:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fcdbdca9b3f0b83d05bdfb55ce2934d077e6b76f",
"body": "…../dist)",
"is_bot": false,
"headline": "fix(release): build before running tests (native test config imports …",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-11T20:38:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17ce31045110843caee62b7009c41163f7cf8d0f",
"body": "…taged publish, CodeQL, Scorecard)\n\nHardens the supply chain ahead of the 0.4.0 release, mirroring danfry1/reflow-ts,\nadapted for this bun-workspace monorepo. The 7-day install-age gate is respected\neverywhere (no bypass).\n\n- syncpack (.syncpackrc.json): devDeps pinned exact; runtime/peer deps keep \n[…]\nPR limits.\n- release.yml: npm stage publish (npm >= 11.15) — staged tarball not installable\n until a maintainer 2FA-approves; keeps OIDC provenance.\n- CodeQL + OpenSSF Scorecard (pinned action SHAs).",
"is_bot": false,
"headline": "chore(security): supply-chain hardening (syncpack, min-release-age, s…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-11T20:35:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "10de37f0a3fa239979f8f67114e422f744ae4e4a",
"body": "…4.0)\n\nvitest-native 0.4.0 — the native engine (real React Native, mocking only the\n~7-module native boundary) is now the zero-config default; the pure-JS mock\nengine is demoted to an opt-in escape hatch. Maintained successor to\nvitest-community/vitest-react-native.\n\n- engine: 'auto' (default) resol\n[…]\nest×RN matrix (0.81–0.84)\n- jest + vitest-react-native migration tooling and guides\n- two-engine example app; mock fidelity fixes\n\nSee packages/vitest-native/CHANGELOG.md for the full 0.4.0 narrative.",
"is_bot": false,
"headline": "feat(engine)!: native (real-RN) engine as the zero-config default (0.…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-11T20:13:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21efdf14f552c56c1a995786400f1efee2c98684",
"body": "…rs (#6)\n\nResolves two enhancement requests:\n\n- #5: The react-native-gesture-handler preset now exports `Pressable`,\n reusing the RN Pressable mock so it mirrors real RN behavior (including\n not firing press handlers when `disabled`).\n- #2: Register reanimated-compatible `toHaveAnimatedStyle` and\n\n[…]\now \"Invalid Chai property\" under Vitest. Types ship via the\n `vitest-native/matchers` subpath. README gains an Animated Matchers\n section with a Reanimated + RNGH example that needs no manual mocks.",
"is_bot": false,
"headline": "feat: add RNGH Pressable preset export and reanimated animated matche…",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-06-03T21:03:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ca2ed512345d699f75a88594b39f0fc7acb4d97b",
"body": "…s (#4)\n\nWhen `disabled={true}`, `onPress`, `onPressIn`, `onPressOut`, and `onLongPress` are now stripped from Pressable, TouchableOpacity, TouchableHighlight, TouchableWithoutFeedback, and TouchableNativeFeedback mocks, matching real React Native behavior.\n\nCloses #3",
"is_bot": false,
"headline": "fix: suppress press handlers on disabled Pressable and Touchable mock…",
"author_name": "Jake Boone",
"author_login": "jakeboone02",
"committed_at": "2026-06-03T20:51:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "962a8ad5cfa82d6b1f017ddc216f04c3d5cf6233",
"body": "Adds a validate module with peer dep version checks (vitest, vite, react, optional RNTL) logged on configResolved, and Levenshtein-based typo suggestions for unknown plugin options.",
"is_bot": false,
"headline": "feat: add runtime peer dependency validation and unknown option warnings",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-03-22T22:03:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4d98cb28b9d35a6703455a2e1643685387e3356b",
"body": "RN defaults to 'extend' extrapolation, not 'clamp'. The test was\nmissing the explicit extrapolate option.",
"is_bot": false,
"headline": "fix: add extrapolate clamp to interpolation test",
"author_name": "Daniel Fry",
"author_login": "danfry1",
"committed_at": "2026-03-10T22:30:42Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 12,
"commits_last_year": 141,
"latest_release_at": "2026-07-24T22:10:41Z",
"latest_release_tag": "v0.9.0",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 10,
"days_since_latest_release": 11,
"mean_days_between_releases": 15.4
},
"artifacts": {
"collected": true,
"structure": [],
"declarations": [
{
"name": null,
"path": "bench/package.json",
"tokens": [
"npm.private"
],
"ecosystem": "npm"
},
{
"name": null,
"path": "package.json",
"tokens": [
"npm.private",
"npm.workspaces"
],
"ecosystem": "npm"
},
{
"name": "vitest-native",
"path": "packages/vitest-native/package.json",
"tokens": [
"npm.bin",
"npm.entry",
"npm.peer_dependencies"
],
"ecosystem": "npm"
}
]
},
"community": {
"has_readme": true,
"has_license": true,
"readme_badges": {
"hosts": [],
"total": 0,
"header": 0,
"collected": true,
"has_inspect_badge": false
},
"has_description": true,
"has_contributing": true,
"health_percentage": 85,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "vitest-native",
"exists": true,
"license": "MIT",
"keywords": [
"vitest",
"react-native",
"testing",
"mock",
"vite",
"plugin",
"expo",
"react"
],
"ecosystem": "npm",
"categories": [],
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/vitest-native",
"declared_type": null,
"is_deprecated": false,
"latest_version": "0.9.0",
"repository_url": "https://github.com/danfry1/vitest-native",
"versions_count": 15,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 41302,
"first_published_at": "2026-03-07T20:48:33.193000Z",
"latest_published_at": "2026-07-24T22:20:06.833000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 11
}
]
},
"popularity": {
"forks": 0,
"stars": 39,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 4
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"example"
],
"has_llms_txt": true,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"apps/example/tsconfig.json",
"packages/vitest-native/tsconfig.json",
"tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 63039,
"source_files_sampled": 389,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"bench/package.json",
"package.json"
],
"advisories": {
"error": null,
"scope": "published_package",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 8,
"malicious_count": 0,
"assessed_package": "npm:vitest-native@0.9.0",
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "flow-remove-types",
"manifest": "packages/vitest-native/package.json",
"ecosystem": "npm",
"version_constraint": "^2.322.0"
},
{
"name": "magic-string",
"manifest": "packages/vitest-native/package.json",
"ecosystem": "npm",
"version_constraint": "^0.30.21"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "flow-remove-types",
"direct": true,
"version": "^2.322.0",
"ecosystem": "npm"
},
{
"name": "magic-string",
"direct": true,
"version": "^0.30.21",
"ecosystem": "npm"
},
{
"name": "@babel/core",
"direct": false,
"version": "7.29.7",
"ecosystem": "npm"
},
{
"name": "@babel/core",
"direct": false,
"version": "^7.29.7",
"ecosystem": "npm"
},
{
"name": "@babel/runtime",
"direct": false,
"version": "7.29.7",
"ecosystem": "npm"
},
{
"name": "@changesets/cli",
"direct": false,
"version": "2.30.0",
"ecosystem": "npm"
},
{
"name": "@consumer/ui",
"direct": false,
"version": "*",
"ecosystem": "npm"
},
{
"name": "@gorhom/bottom-sheet",
"direct": false,
"version": "5.2.14",
"ecosystem": "npm"
},
{
"name": "@react-native-vector-icons/common",
"direct": false,
"version": "13.0.1",
"ecosystem": "npm"
},
{
"name": "@react-native-vector-icons/material-icons",
"direct": false,
"version": "13.1.2",
"ecosystem": "npm"
},
{
"name": "@react-native/babel-preset",
"direct": false,
"version": "0.83.9",
"ecosystem": "npm"
},
{
"name": "@react-native/babel-preset",
"direct": false,
"version": "0.85.3",
"ecosystem": "npm"
},
{
"name": "@react-native/babel-preset",
"direct": false,
"version": "0.86.0",
"ecosystem": "npm"
},
{
"name": "@react-native/babel-preset",
"direct": false,
"version": "^0.85.3",
"ecosystem": "npm"
},
{
"name": "@react-navigation/native",
"direct": false,
"version": "7.2.5",
"ecosystem": "npm"
},
{
"name": "@react-navigation/native-stack",
"direct": false,
"version": "7.16.0",
"ecosystem": "npm"
},
{
"name": "@shopify/flash-list",
"direct": false,
"version": "2.3.2",
"ecosystem": "npm"
},
{
"name": "@testing-library/react-native",
"direct": false,
"version": "12.9.0",
"ecosystem": "npm"
},
{
"name": "@testing-library/react-native",
"direct": false,
"version": "13.3.3",
"ecosystem": "npm"
},
{
"name": "@testing-library/react-native",
"direct": false,
"version": "14.0.0",
"ecosystem": "npm"
},
{
"name": "@testing-library/react-native",
"direct": false,
"version": "^12.9.0",
"ecosystem": "npm"
},
{
"name": "@types/node",
"direct": false,
"version": "25.3.5",
"ecosystem": "npm"
},
{
"name": "@types/react",
"direct": false,
"version": "19.2.14",
"ecosystem": "npm"
},
{
"name": "@vitest/coverage-v8",
"direct": false,
"version": "4.1.9",
"ecosystem": "npm"
},
{
"name": "babel-jest",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "expo",
"direct": false,
"version": "56.0.11",
"ecosystem": "npm"
},
{
"name": "expo-constants",
"direct": false,
"version": "56.0.16",
"ecosystem": "npm"
},
{
"name": "expo-constants",
"direct": false,
"version": "56.0.18",
"ecosystem": "npm"
},
{
"name": "expo-status-bar",
"direct": false,
"version": "56.0.4",
"ecosystem": "npm"
},
{
"name": "jest",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "jest-environment-node",
"direct": false,
"version": "29.7.0",
"ecosystem": "npm"
},
{
"name": "oxc-minify",
"direct": false,
"version": "0.134.0",
"ecosystem": "npm"
},
{
"name": "oxfmt",
"direct": false,
"version": "0.36.0",
"ecosystem": "npm"
},
{
"name": "oxlint",
"direct": false,
"version": "1.51.0",
"ecosystem": "npm"
},
{
"name": "react",
"direct": false,
"version": "19.2.4",
"ecosystem": "npm"
},
{
"name": "react",
"direct": false,
"version": "^19.2.3",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "*",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "0.83.9",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "0.84.1",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "0.85.3",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "0.86.0",
"ecosystem": "npm"
},
{
"name": "react-native",
"direct": false,
"version": "^0.86.0",
"ecosystem": "npm"
},
{
"name": "react-native-gesture-handler",
"direct": false,
"version": "3.0.0",
"ecosystem": "npm"
},
{
"name": "react-native-keyboard-controller",
"direct": false,
"version": "1.21.11",
"ecosystem": "npm"
},
{
"name": "react-native-reanimated",
"direct": false,
"version": "4.3.1",
"ecosystem": "npm"
},
{
"name": "react-native-safe-area-context",
"direct": false,
"version": "5.8.0",
"ecosystem": "npm"
},
{
"name": "react-native-worklets",
"direct": false,
"version": "0.9.1",
"ecosystem": "npm"
},
{
"name": "react-test-renderer",
"direct": false,
"version": "19.2.4",
"ecosystem": "npm"
},
{
"name": "react-test-renderer",
"direct": false,
"version": "^19.2.3",
"ecosystem": "npm"
},
{
"name": "syncpack",
"direct": false,
"version": "15.3.1",
"ecosystem": "npm"
},
{
"name": "test-renderer",
"direct": false,
"version": "1.2.0",
"ecosystem": "npm"
},
{
"name": "test-renderer",
"direct": false,
"version": "^1.2.0",
"ecosystem": "npm"
},
{
"name": "tsdown",
"direct": false,
"version": "0.21.10",
"ecosystem": "npm"
},
{
"name": "typescript",
"direct": false,
"version": "6.0.3",
"ecosystem": "npm"
},
{
"name": "vite",
"direct": false,
"version": "6.4.3",
"ecosystem": "npm"
},
{
"name": "vite",
"direct": false,
"version": "^6.4.2",
"ecosystem": "npm"
},
{
"name": "vite",
"direct": false,
"version": "^7.3.2",
"ecosystem": "npm"
},
{
"name": "vite",
"direct": false,
"version": "^8.0.5",
"ecosystem": "npm"
},
{
"name": "vitepress",
"direct": false,
"version": "2.0.0-alpha.17",
"ecosystem": "npm"
},
{
"name": "vitest",
"direct": false,
"version": "4.1.8",
"ecosystem": "npm"
},
{
"name": "vitest",
"direct": false,
"version": "4.1.9",
"ecosystem": "npm"
}
],
"collected": true,
"truncated": false,
"total_count": 61,
"direct_count": 2,
"indirect_count": 59
}
},
"maintainership": {
"issues": {
"open_prs": 4,
"merged_prs": 92,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 5,
"closed_unmerged_prs": 30
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "danfry1",
"commits": 132,
"avatar_url": "https://avatars.githubusercontent.com/u/95628792?v=4"
},
{
"type": "User",
"login": "jakeboone02",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/366438?v=4"
},
{
"type": "User",
"login": "Doko-Demo-Doa",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/7723097?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.978
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"bakeoff-ratchet.yml",
"ci.yml",
"codeql.yml",
"compat-check.yml",
"native-rn-matrix.yml",
"pages.yml",
"release.yml",
"scorecard.yml"
],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 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": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 3 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": 7,
"reason": "dependency not pinned by hash detected -- score normalized to 7",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 10,
"reason": "SAST tool is run on all commits",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file 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": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 1,
"reason": "9 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "4285a779ceb7e2e61ced85de28cca2b679030845",
"ran_at": "2026-08-05T08:27:55Z",
"aggregate_score": 6.7,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"recent_prs": {
"merged_7d": 12,
"decided_7d": 14,
"merged_30d": 42,
"authors_30d": 1,
"decided_30d": 49,
"sample_size": 60,
"window_days": 30,
"sample_exhausted": true,
"authors_probed_30d": 1,
"newcomer_merged_30d": 0,
"bot_prs_excluded_30d": 11,
"newcomer_authors_30d": 0,
"newcomer_decided_30d": 0
},
"ci_last_run_at": "2026-08-04T09:58:13Z",
"oldest_open_prs": [
{
"number": 128,
"created_at": "2026-08-03T04:29:00Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 129,
"created_at": "2026-08-03T04:29:07Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 130,
"created_at": "2026-08-03T04:30:47Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 131,
"created_at": "2026-08-03T04:33:02Z",
"last_comment_at": null,
"last_comment_author": null
}
],
"last_merged_pr_at": "2026-08-02T21:20:08Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/danfry1/vitest-native",
"host": "github.com",
"name": "vitest-native",
"owner": "danfry1"
},
"metrics": {
"overall": {
"key": "overall",
"band": "excellent",
"name": "Overall health",
"note": "The weighted overall 68 is calibrated to 80 on the published index scale (record calibration 2026-08-02).",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 68,
"calibrated": 80,
"calibration": "2026-08-02"
}
}
],
"value": 80,
"inputs": {
"security": 74,
"vitality": 83,
"community": 57,
"governance": 58,
"calibration": "2026-08-02",
"engineering": 71,
"ai_readiness": 57,
"weighted_overall_raw": 68
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 83,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"commits_last_year": 141,
"human_commit_share": 0.94,
"days_since_last_push": 2,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "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": "141 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 141
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "exceptional",
"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": 12,
"latest_release_tag": "v0.9.0",
"releases_from_tags": false,
"days_since_latest_release": 11,
"mean_days_between_releases": 15.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "12 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 12
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 11 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 11
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~15.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 15.4
}
}
],
"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": "exceptional",
"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": "moderate",
"name": "Community & Adoption",
"value": 57,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "at_risk",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 26,
"inputs": {
"forks": 0,
"stars": 39,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "39 stars",
"points": 25.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 39
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "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": 77,
"inputs": {
"has_readme": true,
"has_license": true,
"readme_badges": 0,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"has_pull_request_template": true
},
"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": 6.3,
"status": "met",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "good",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 77,
"inputs": {
"packages": [
"vitest-native"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 41302
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "41,302 downloads/month across npm",
"points": 61.5,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 41302,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 58,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 17,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.978
},
"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": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"newcomer_pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 74,
"inputs": {
"merged_prs": 92,
"open_issues": 0,
"closed_issues": 5,
"prs_merged_7d": 12,
"prs_decided_7d": 14,
"prs_merged_30d": 42,
"prs_decided_30d": 49,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 30,
"first_time_authors_30d": 0,
"first_time_prs_merged_30d": 0,
"first_time_prs_decided_30d": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 42,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "92/122 decided PRs merged",
"points": 22.6,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 92,
"decided": 122
}
}
],
"max_points": 30
},
{
"key": "newcomer_pr_acceptance",
"name": "Newcomer PR acceptance",
"detail": "no first-time contributor's PR decided in 30d",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_newcomer_prs",
"params": {
"days": 30
}
}
],
"max_points": 13
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 58,
"inputs": {
"followers": 143,
"owner_type": "User",
"is_verified": null,
"owner_login": "danfry1",
"public_repos": 33,
"account_age_days": 1702
},
"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": "143 followers of danfry1",
"points": 15.5,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 143,
"login": "danfry1"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "33 public repos, account ~4 yr old",
"points": 20.5,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 33
}
},
{
"code": "account_age_years",
"params": {
"years": 4
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "exceptional",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"vitest-native"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 11
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 11 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 11
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "15 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 15
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 71,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "8 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 8
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"expo",
"jest",
"mocking",
"react",
"react-native",
"react-native-testing-library",
"testing",
"testing-library",
"typescript",
"unit-testing",
"vite",
"vitest"
],
"has_wiki": true,
"homepage": "https://danfry1.github.io/vitest-native/",
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://danfry1.github.io/vitest-native/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "12 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 12
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "good",
"name": "Security",
"value": 74,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "good",
"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": 67,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 6.7
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 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": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 3 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 7",
"points": 3.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is run on all commits",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"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": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "9 existing vulnerabilities detected",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "exceptional",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:vitest-native@0.9.0 runtime dependency closure — what installing the published package pulls in — 8 packages. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_published",
"params": {
"package": "npm:vitest-native@0.9.0",
"assessed": 8
}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 8,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "no indirect dependency carries a known advisory",
"points": 25,
"status": "met",
"details": [
{
"code": "no_indirect_advisories",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "exceptional",
"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": 8,
"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": "exceptional",
"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"
],
"commit_weight_rule": {
"min_commits": 50,
"min_commit_share": 0.1
},
"review_only_matches": 0,
"below_threshold_exposures": [],
"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": 57,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "moderate",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"has_llms_txt": true,
"legible_history_share": 1,
"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": "llms.txt present",
"points": 15,
"status": "met",
"details": [
{
"code": "llms_txt_present",
"params": {}
}
],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "94 of 94 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 94,
"sampled": 94
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "weak",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 48,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"apps/example/tsconfig.json",
"packages/vitest-native/tsconfig.json",
"tsconfig.json"
],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0.06
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "apps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "apps/example/tsconfig.json, packages/vitest-native/tsconfig.json, tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "6 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 6,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 7",
"points": 7,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "exceptional",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 63039,
"source_files_sampled": 389,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/389 source files over 60KB",
"points": 54.9,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 389,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "weak",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"example"
],
"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": "example",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "example"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
}
],
"classification": {
"top": [
"library",
"application",
"host-extension"
],
"labels": [
"library",
"cli",
"plugin"
],
"scores": {
"cli": 6,
"plugin": 4,
"library": 6.6
},
"primary": "library",
"evidence": [
{
"tier": "declared",
"label": "cli",
"source": "npm.bin",
"weight": 6
},
{
"tier": "declared",
"label": "library",
"source": "npm.private",
"weight": -6
},
{
"tier": "distribution",
"label": "library",
"source": "registry:npm",
"weight": 6
},
{
"tier": "declared",
"label": "library",
"source": "npm.entry",
"weight": 4.8
},
{
"tier": "description",
"label": "plugin",
"source": "description:plugin",
"weight": 2
},
{
"tier": "tags",
"label": "plugin",
"source": "tag:plugin",
"weight": 2
},
{
"tier": "declared",
"label": "library",
"source": "npm.peer_dependencies",
"weight": 1.8
}
],
"artifacts": [
{
"path": "bench/package.json",
"labels": [],
"ecosystem": "npm"
},
{
"path": "package.json",
"labels": [],
"ecosystem": "npm"
},
{
"path": "packages/vitest-native/package.json",
"labels": [
"library",
"cli"
],
"ecosystem": "npm"
}
],
"confidence": "high",
"host_extension": true,
"runs_as_process": true,
"consumed_by_code": true
},
"metrics_version": "2.5.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-08-05T08:28:13.257426Z",
"schema_version": "0.31.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/danfry1/vitest-native.svg",
"full_name": "danfry1/vitest-native",
"license_state": "standard",
"license_spdx": "MIT"
}