Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 1247,
"has_wiki": true,
"homepage": null,
"languages": {
"C": 23607,
"Go": 618345,
"C++": 1843,
"Shell": 4417,
"Makefile": 2005,
"Linker Script": 836
},
"pushed_at": "2026-07-20T15:36:44Z",
"created_at": "2026-06-20T08:51:02Z",
"owner_type": "User",
"updated_at": "2026-07-20T15:39:17Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": null,
"type": "User",
"login": "spock2300",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/59272067?v=4",
"created_at": "2019-12-27T03:18:34Z",
"is_verified": null,
"public_repos": 13,
"account_age_days": 2398
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.0.59",
"kind": "patch",
"published_at": "2026-07-17T13:11:28Z"
},
{
"tag": "v1.0.58",
"kind": "patch",
"published_at": "2026-07-17T05:15:49Z"
},
{
"tag": "v1.0.57",
"kind": "patch",
"published_at": "2026-07-11T14:18:19Z"
},
{
"tag": "v1.0.56",
"kind": "patch",
"published_at": "2026-07-05T04:24:22Z"
},
{
"tag": "v1.0.55",
"kind": "patch",
"published_at": "2026-06-29T14:21:08Z"
},
{
"tag": "v1.0.54",
"kind": "patch",
"published_at": "2026-06-21T02:48:45Z"
},
{
"tag": "v1.0.53",
"kind": "patch",
"published_at": "2026-06-21T02:25:46Z"
},
{
"tag": "v1.0.52",
"kind": "patch",
"published_at": "2026-06-21T00:33:12Z"
},
{
"tag": "v1.0.51",
"kind": "patch",
"published_at": "2026-06-20T10:42:43Z"
}
],
"recent_commits": [
{
"oid": "a0a4b270f21dbf5c8170ec082a842d21978dbfa2",
"body": "- README/README.zh: add missing commands (test, distclean, doctor, manifest, completion), fix git tag flags, add test dirs 21-24\n- AGENTS.md: fix pipeline references, update skill install paths, fix function references\n- ARCHITECTURE.md: fix pipeline diagram, remove nonexistent Source fields, add mi\n[…]\nconstraint operator\n- references/cli.md: remove --force flag reference\n- examples/with-package.md: remove nonexistent @ constraint operator\n- test_data/README.md: add test dirs 21-24 with descriptions",
"is_bot": false,
"headline": "docs: proofread all documentation against actual codebase",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-20T15:36:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "19b570620e6194bb4b47cfc743db61ceb1e8dee2",
"body": null,
"is_bot": false,
"headline": "make English README the default, rename Chinese to README.zh.md",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-20T15:20:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15f994ad504b3de43a9b7ecfd5b348159e8fc7f0",
"body": null,
"is_bot": false,
"headline": "docs: update plugin description — yaegi interpreted, no .so files",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-20T15:19:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b39fe4b0b693c6f24190365f418e9b363fa1746d",
"body": "Remove all references to removed autoWireRequireDeps (v2). Update\nbuild phase tables to reflect ResolveDeferred being a no-op and\nadd explicit Compile & Link phase. Fix ScriptDir() description\n(defaults to \"\" not SourceDir). Add missing CLI commands\n(check-symbols, doctor, update) and API methods (SetRoot,\nSetExportConfig, SetImportConfigs, SetGlobalFlags, and getters).\nAdd missing utility functions to api.md reference.",
"is_bot": false,
"headline": "docs(skills): sync vmake skill docs with v2 codebase",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-17T13:11:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "810fb97956a558ac0928bec562f4b3a9e646ce3b",
"body": "…n plugins\n\nExtension plugins are now interpreted at runtime by yaegi (same as\nbuildscripts), eliminating go build -buildmode=plugin, the Linux-only\nconstraint, and binary version-mismatch issues.\n\n- internal/yaegisym: cobra/pflag symbols via yaegi extract (go:generate)\n- internal/yaegibase: shared \n[…]\neted (no more .so)\n- cmd/vmake/ext_cmd.go: removed ext clean, simplified loadPlugin\n- VMAKE_DIR env var and start_dev.sh retired\n- Plugin source code remains 100% compatible (cobra.Command still used)",
"is_bot": false,
"headline": "feat(plugin): yaegi interpreter replaces .so compilation for extensio…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-17T13:01:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "02137919f171e29132fdf11484e6790a2a906be3",
"body": "Interactive config UI improvements:\n- option search (/): live filter, single-match jumps, multi-match browse\n with pick-then-jump; refine or clear with Esc\n- modified markers (*) + r/R reset (to open value / default); accurate\n count badge instead of a single Modified flag\n- choice candidate overl\n[…]\nws and footer wraps when help is long. Now measured\n dynamically via lipgloss.Height; contentHeight subtracts real heights\n\nAdds pkg/tui unit tests (0 -> 72), covering pure logic and key/mouse flows.",
"is_bot": false,
"headline": "feat(tui): search, overlays, edit-cursor nav, mouse + layout fixes",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-17T05:15:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "999f265d4a70303ab91c9b7536790fcd8f45650f",
"body": "yaegi's Eval(string) handles complete Go files (starting with 'package')\nidentically to EvalPath — the inc flag only wraps bare declarations and\nexpressions. Removes unnecessary CreateTemp/WriteFile/Remove cycle.",
"is_bot": false,
"headline": "refactor(buildscript): replace EvalPath temp file with in-memory Eval",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-11T14:18:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7649d6e670f084a86c7f33346dc26664bec0b39c",
"body": "- Interpret build.go via yaegi at runtime (no go build, no .so files)\n- Multi-file buildscript support (merge .go files, dedupe imports)\n- Track all .go file changes for C object staleness (not just build.go)\n- Add YaegiSymbols() exports for pkg/api and pkg/toolchain\n- Add completeness test (source \n[…]\nith Default fallback)\n- Remove dead --force flag (yaegi interprets fresh every invocation)\n- Remove deleted compiler/extractor/loader/manager files\n- Update docs/AGENTS.md for yaegi-based architecture",
"is_bot": false,
"headline": "feat(buildscript): yaegi interpreter replaces .so plugin compilation",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-11T14:13:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "62672086bd36dff5ea58b36f6f68678208fd1e6f",
"body": "…ntal rebuild\n\nExtend needRelink to compare PostLinkDeps() mtimes against the link\noutput; any dep newer or missing triggers relink + re-run of all\npost-link steps. Without this, post-link inputs (e.g.\nobjcopy --keep-global-symbols=file.sym) are invisible to staleness,\nso editing the .sym is silentl\n[…]\nre\nneedRelink (AddPostLinkDeps is a no-op there). Granularity is\nwhole-target: one dep change relinks and re-runs all post-link steps.\nDiagnostic: 'RELINK <name> (post-link dep <file> newer|missing)'.",
"is_bot": false,
"headline": "feat(build): AddPostLinkDeps tracks post-link input files for increme…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-07-05T04:24:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b28b7e0806775d9ab64493f3feaa3e6b0c20cab",
"body": "…xed global --set\n\nGlobal options (GlobalOption/GlobalMode) leaked into the package panel of\nvmake config because GlobalOption registers them in the package's own\noption map. buildOptionItems now skips IsGlobal() entries so they render\nonly under the Global node. resolveSetOption now errors on pkg/globalopt,\ndirecting users to the bare globalopt=value form. ctx.AllOptions is left\nuntouched to keep the build path's option resolution intact.",
"is_bot": false,
"headline": "fix(config): hide global options from package panel; reject pkg-prefi…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-29T14:21:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d9a257ac30f1ca9f79ace64fdb670d5c1d4f7b7e",
"body": "…-group for objs\n\n- TargetObject ld -r now passes only the target's own compiled .o files,\n not DepArtifacts (archives/.so) from the dependency chain\n- Move objFiles inside --start-group/--end-group for consistency with\n libFiles; emit the group whenever any input exists",
"is_bot": false,
"headline": "fix(build): TargetObject partial-link uses own .o only; unify --start…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-21T02:48:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f9b898c2190d0cb8eaddc019ed0c6cf6f42327c",
"body": "…mbers\n\nar r only replaces members by name; it does not delete entries absent\nfrom the new list. Previously a stale combined.o (or any removed source)\nstayed in libfoo.a alongside newly generated objects, causing duplicate\nsymbols and orphaned code. Remove the archive before ar rcs so each\nbuild starts from a clean archive, matching CMake/Meson convention.\n\nAdds TestLinkStatic_RemovesStaleMembers regression test (verified to\nfail without the fix).",
"is_bot": false,
"headline": "fix(build): delete stale archive before ar rcs to drop obsolete .o me…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-21T02:25:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1cd6e625d3134b9933adef8bdef5f49136475841",
"body": "…-detection\n\nSetExpectedExports was over-engineered: it required users to manually maintain\na list of exported symbols per target, duplicating information already in\nversion-scripts and visibility attributes. The check-symbols command did\nNOTHING if no target declared SetExpectedExports, making it u\n[…]\ninfo-only, warn, error)\n- mangledRe regex, findBuiltOutput, sort stability\n\nAll snapshot baselines regenerated to reflect current state (compile_commands\njson now populated for multi-module projects).",
"is_bot": false,
"headline": "refactor(check-symbols): replace SetExpectedExports with pure nm auto…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-21T00:33:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bed0caf7ed91f2adde23e8a232284eea9d244cab",
"body": "…composition\n\nReplaces the minimal '1 app + 1 rootfs' demo with a realistic IoT firmware\nproject demonstrating 11 vmake API patterns in a single end-to-end build.\n\nStructure (12 packages):\n- libs/libcore/ TargetShared 'core' (libcore.so) — common utils, AddPublicIncludes\n- libs/libnet/ Target\n[…]\nnel: status/send/version subcommands (~50 lines)\n\nRemoves old myapp/ (single binary), app/ (single squashfs), rootfs/ (single\nrootfs). The minimal demo is now absorbed into the comprehensive scenario.",
"is_bot": false,
"headline": "refactor(test): rewrite 17_firmware as complex multi-app Linux image …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-21T00:10:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0b4884a890cce1225066086fef9295483e453a82",
"body": "…ration guide\n\nPhase 6 completes the No-Fallbacks migration:\n\nRemoves:\n- autoWireRequireDeps() function (build_exec.go)\n- resolveWireDepName() helper (build_exec.go)\n- The autoWireRequireDeps call site in executeMainPackages (build_phase.go)\n\nThe fallback silently auto-added AddDeps edges when a pac\n[…]\nGENTS.md and docs/ARCHITECTURE.md to mark autoWireRequireDeps as\nremoved, removing it from the runtime execution flow description.\n\nVerified: all unit tests + 20 snapshot tests + go vet + gofmt clean.",
"is_bot": false,
"headline": "refactor(phase6): remove autoWireRequireDeps + add SetRoot hint + mig…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T23:49:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "17c692247fea435e79d68d675ecc8a753c5a5d6f",
"body": null,
"is_bot": false,
"headline": "style: gofmt after Phase 4 scheduler changes",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T16:36:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69742fbe05ef7dbc98edd70923148e463be224df",
"body": "Adds 'vmake doctor' subcommand that scans build.go files and reports\npatterns that currently work but may become problematic:\n\n [autoWire] (warn) — package has AddRequires but targets lack AddDeps;\n currently rescued by autoWireRequireDeps fallback. Suggests explicit\n AddDeps to align with No-Fal\n[…]\nindings),\nexplicit AddDeps (no findings), missing AddDeps (warns), OnRequire without\nAddRequires (no findings — empty callbacks don't count), missing file\n(no findings), hasSetRoot true/false/missing.",
"is_bot": false,
"headline": "feat(phase6): vmake doctor — diagnose autoWire + SetRoot patterns",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T16:35:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "385438ef3a83b7f5d0b7b7939a4ef09773cd4c91",
"body": "…eys, BuildKeyOverrides\n\nPhase 4 partial: eliminates 3 of the 4 SubGraph-related state fields on\nbuildPhaseState by relying on Go's natural recursion semantics.\n\nRemoves:\n- subGraphFrame type and subGraphStack field (was tracking which targets\n belong to which recursion level; now all targets flow \n[…]\n gone). The ToolchainScope abstraction from the original plan turned out\nunnecessary — removing the overrides was sufficient since scheduler's\nBuildKey computation already matches the mutated pkgDirs.",
"is_bot": false,
"headline": "refactor(phase4): simplify SubGraph — remove subGraphStack, subBuildK…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T16:31:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3316644b38b1b0f0def2e39977484acf54df9137",
"body": "Previously, remote packages (both registry and native) were registered as\n'deferred' nodes during ResolveAll, then resolved in a separate fixed-point\nloop (ResolveDeferred → resolveDeferredNode). This added ~60 lines of\nindirection and made the resolution flow harder to follow.\n\nChanges:\n- resolvePa\n[…]\nnapshot tests pass; behavior preserved\n(verified by golden baselines).\n\nThe Deferred field on PackageNode is retained for backward compatibility\nwith existing test code and any external introspection.",
"is_bot": false,
"headline": "refactor(phase2): eager resolution — eliminate Deferred mechanism",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T16:24:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2230d2bb2b87c68a24fb249e2a0ce2cec7df6786",
"body": "…omputeReachable, runPostPhase1→runConfigurePhase\n\nPhase 1 (naming cleanup, zero semantic change):\n\n- cmd/vmake/mainfest_cmd.go → cmd/vmake/manifest_cmd.go (filename typo fix,\n was blocked by AGENTS.md warning which is now updated to reflect the rename)\n- collectNeeded → computeReachable (descripti\n[…]\ne consolidation: high churn, marginal value. Deferred.\n- buildPhaseState split: depends on Phase 4 (SubGraph refactor), deferred.\n\nVerified: go test ./pkg/... ./cmd/vmake/ green, snapshot tests green.",
"is_bot": false,
"headline": "refactor(phase1): rename cleanup — mainfest→manifest, collectNeeded→c…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:23:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a966ed6a8febe80ee0930fcd31b88a344d2719b5",
"body": null,
"is_bot": false,
"headline": "style: gofmt pkg/api test files",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:19:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ea3acac90f8468e87250e506681edaa0f491ed4",
"body": "Adds tests for collectNeeded (BFS from roots, explicit SetRoot, reachability,\nlibrary-only seed exclusion semantics, empty graph), restoreKConfigFiles\n(all 4 skip rules: no entry, empty KConfig, matching content, patches applied),\nParseBuildGo (regex-based version+gitURL extraction), resolveMode/Too\n[…]\ns TestCollectNeededLibrary\nOnlyStillPulledInViaBFS.\n\nSkipped: TestCollectNeededMultipleRootsFatals (vlog.Fatal calls os.Exit\nwhich kills the test process; covered by integration test 21_root_package).",
"is_bot": false,
"headline": "test(cmd): add tests for collectNeeded + restoreKConfigFiles + helpers",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:18:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a9bfe70b4e4c7e9a3ec42358f7e3bcb06fe4de08",
"body": "Adds tests for: corrupt JSON load failure, missing-parent-dir load (treated\nas not-exist), GetEntry with existing entry having nil Options (auto-init),\nSetEntry on nil Entries map, BuildGlobalValues with nil Global / empty\ntoolchain+mode strings, UnmarshalJSON entry parse-failure tolerance\n(per store.go:66 silently skips bad entries), Global.Options auto-init,\nround-trip of KConfig + SelectedPreset + multi-entry configs.",
"is_bot": false,
"headline": "test(config): add edge-case tests, coverage 95.9%",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:10:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f9373e7d2e31fbe1ee356b55e6b0bda9c30c6f6",
"body": "The '**/build/' pattern was meant to ignore per-project build output\ndirectories (test_data/<proj>/build/, test_linux/<proj>/build/) but was\nalso matching the pkg/build/ source directory. New test files in pkg/build/\nhad to be force-added with -f. Negate the pattern for pkg/build/.",
"is_bot": false,
"headline": "fix(gitignore): exclude pkg/build/ from **/build/ pattern",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:09:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a86d3e7718fddefcaef9022812a9d0bf33b30fd",
"body": "Adds tests for NewBuildGraph (3 dep forms: pkg:target, bare, wildcard),\ntopological ordering, ForEachDefault (skips non-default), cycle detection,\nBuildKey (deterministic, order-independent, differs on toolchain/mode/options),\nBuildCompileArgs, LinkPolicy flag translation (version-script/exclude-lib\n[…]\n compilation to\nexercise and is validated end-to-end by the test_data/_snapshot golden tests.\n\nNote: pkg/build/ is matched by the '**/build/' gitignore pattern; the test\nfiles are force-added with -f.",
"is_bot": false,
"headline": "test(build): add unit tests for graph, buildkey, linker, compiler, stamp",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:08:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9465c9e047fc5d68d6fdd8352e2b24066608bf06",
"body": "Adds tests for resolveDepName (sub-package expansion), FilterDeps (Deps\nreplacement semantics, missing node errors, no-op fast paths), checkNodeConstraints\nedge cases (empty incoming, multi-compatible, conflict fatal), deterministic\ntopological ordering, and hasCachedScript freshness logic (mtime vs\n[…]\n '>=1.0' vs\n'>=2.0' is NOT bidirectionally compatible. Previous test expected standard semver\nsemantics and was failing. Comment added to explain the discrepancy as a finding\nfor potential future fix.",
"is_bot": false,
"headline": "test(resolver): add unit tests for dep resolution + cache logic",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T13:04:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "82ca8f92d2503feccacc3f9528686aa99b621a76",
"body": "Covers Target/TargetKind fluent API, Option lifecycle, ConfigAccessor\ntype coercion + discover-mode behavior, MergeImportedOptions (local-wins),\nConfigToDefines/Header (macro naming, choice variant, global skip), Package\ncallback registration + execution order, version selection (single + multi\ncons\n[…]\n Global options (group=Global) are skipped from ConfigToDefines/Header\n\nSkipped: Fatal-on-double-set (SetVersionScript/SetSymbolPrefix/etc) since\nvlog.Fatal calls os.Exit which kills the test process.",
"is_bot": false,
"headline": "test(api): add unit tests for pkg/api (85.8% coverage)",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T12:59:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9162de261684b1c4917fe29c0f56219d969436c9",
"body": "Suppresses noise from:\n- /vmake and /vmake-extensions at repo root (built binary + global ext dir)\n- .opencode/ (local tooling)\n- test_data/*/.gitignore (auto-created by ensureGitignore; already covered by\n test_data/.gitignore)\n- test_data/*/go.mod and go.sum (synthesized by plugin compiler)\n- test_data/07_subbuild_codegen/output/ and 15_subgraph_siblings/t15lib/include/\n (generated code)\n- test_linux/17_firmware build outputs (.config, vmlinux, zImage, u-boot.bin,\n board.dtb, busybox/src/)",
"is_bot": false,
"headline": "chore: ignore vmake-generated per-project artifacts and build outputs",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T12:49:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "188a81e9500339e803abe3df9919666dc000557f",
"body": "…ects\n\nCleans each test_data/* project from scratch, builds via 'vmake build --install',\nand compares install/ tree + manifest (volatile fields redacted) +\nbuild/compile_commands.json against committed baselines.\n\nIncludes baselines for 20 projects: 01-06, 11-16, 17_firmware, 18-24.\nSkips known-fail\n[…]\ns caused shared libraries to\nhave different build-ids and content across rebuilds, blocking snapshot tests.\n\nDiscovered via the snapshot test on 22_version_script (libfoo.so hash drifted\nacross runs).",
"is_bot": false,
"headline": "test(snapshot): add golden snapshot infrastructure for test_data proj…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T12:48:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5bbe18cd6b5b2014a39d34124fda56c92dbc802e",
"body": "Adds a five-layer symbol management toolkit to control which symbols a\nlibrary exports, preventing conflicts and leaks across dependency\ngraphs. Useful when multiple shared/static libraries are linked into\nthe same binary and internal helpers might collide.\n\nAPI additions:\n- ctx.SetDefaultVisibility\n[…]\n-layer model + recipes)\n- SKILL.md Decision Guide + Symbol Management section\n- references/api.md updated with new Target/ConfigContext methods\n- AGENTS.md Key Design Decisions section + CLI reference",
"is_bot": false,
"headline": "feat: add symbol management for complex C/C++ dependency graphs",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T11:59:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "987c7a7bc2458f2a84d51fce7765ef3e23b3db87",
"body": "This reverts commit b8803636f2c02fb63c9f28512b0e774623248e53.",
"is_bot": false,
"headline": "Revert \"linker: support ldflags for TargetObject (partial link)\"",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T11:25:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "759b172693675759e8dc23b6bea258eba7efd04b",
"body": "Replace all gitee.com/spock2300/vmake references with github.com/spock2300/vmake\nacross the entire codebase (125 files): go.mod module declaration, all Go imports,\nupdate command URL, generated go.mod templates, documentation, and test fixtures.\n\nGitHub public repos allow unauthenticated git ls-remote, fixing the vmake update\nauthentication failure on gitee.",
"is_bot": false,
"headline": "refactor: migrate module path from gitee.com to github.com",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T10:42:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b8803636f2c02fb63c9f28512b0e774623248e53",
"body": "TargetObject now passes target-specific ldflags (AddLdFlags) to cc -r.\nToolchain default ldflags (--gc-sections, -pie, etc.) are excluded since\nthey are incompatible with partial linking.\n\nArchitecture:\n- Remove defaultLdFlags from TargetRegistry; SetDefaultFlags drops ldflags param\n- Toolchain LdFl\n[…]\nults now flow through Manager.AddGlobalLdFlags\n- build_phase.go pushes defaults to Manager next to SetDefaultFlags call\n- Scheduler uses target.LdFlags() for TargetObject, AllLdFlags for Binary/Shared",
"is_bot": false,
"headline": "linker: support ldflags for TargetObject (partial link)",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-20T02:15:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "317e76680142e2d5afa24d21c6d23003072d42f8",
"body": null,
"is_bot": false,
"headline": "docs: add missing vmake ext clean command to CLI reference",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-18T15:31:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2934327a2551c1cfd62daa794c0dbbb083cae0a4",
"body": null,
"is_bot": false,
"headline": "feat:添加option到 define的描述",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-18T15:28:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd4ab0908d7ee4398de667461e7fb93668e69661",
"body": null,
"is_bot": false,
"headline": "fix: avoid duplicate command line output on compile error",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-06-05T03:30:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0d520549c615bc3c7c9565ca73ac65ced7b5484",
"body": "Native packages (git repos with build.go at root) can now contain nested\nbuild.go files in subdirectories. These are auto-discovered as sub-packages\nwith qualified names (e.g., 'system/core', 'system/freertos').\n\nKey mechanism: when a sub-package uses an unqualified dep name, the resolver\nwalks up t\n[…]\neps and ImportConfigs\n- build_phase: sub-package dir setup (SourceDir from parent checkout),\n SetGit source download for sub-packages\n- api: shared walk-up resolution function (ResolveSubPackageName)",
"is_bot": false,
"headline": "feat: support sub-package discovery in native remote packages",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-15T11:55:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "60aa6a213c5ee8f30b661e3dc9ebf871cdb72b67",
"body": null,
"is_bot": false,
"headline": "feat:update test 10",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-11T14:39:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18ffc34b67050cb262ecfd00450be75cfcb0a50c",
"body": null,
"is_bot": false,
"headline": "fix: invalidate void target stamp when dependency artifacts are newer",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-11T14:38:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4701cc6a990b2797219f1ac0e9b86f3523fd8a5",
"body": "…skipping them",
"is_bot": false,
"headline": "fix: auto-recompile extension plugins on version mismatch instead of …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-10T15:23:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3acc1c793c706dbb7eafa76c18355c0655312f6",
"body": "…Clean/OnInstall examples",
"is_bot": false,
"headline": "refactor: trim SKILL.md ~33%, extract dirs/gotchas references, add On…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-10T15:10:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8f2e3f0e8d8234642f190863737b5e78bb90b43",
"body": "…lugin load failures non-fatal",
"is_bot": false,
"headline": "feat: add 'ext clean' command to clear plugin build artifacts, make p…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-10T14:39:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b738e72e8b4c11f8503aa21558ed2c46824a254",
"body": "…eState\n\nIntroduce buildPhaseState struct to consolidate shared state previously\nthreaded through 6+ functions with 5-10 parameters each. Replace closure-\nbased subgraph recursion with stack-based subGraphFrame methods. Extract\nconfig code generation into applyBuildContextConfig.\n\nFix: applyManifestVersions panic on short refs (len < 12)\nFix: git rev-parse output leak via missing Quiet:true in GetCurrentCommit/IsAlreadyAtRef",
"is_bot": false,
"headline": "refactor: split build_cmd.go into phase-oriented files with buildPhas…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-10T14:16:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dce2057dd48bb4276225e2ccfb3769710cee5c5e",
"body": "…t nested archives",
"is_bot": false,
"headline": "fix: filter out dep .a files from TargetStatic archive step to preven…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-06T15:38:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9750a0f6c68564f6b1d00a6981a8c3b795a7568a",
"body": "…stalled libs to .a paths",
"is_bot": false,
"headline": "feat: default --whole-archive for all static libraries and resolve in…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-06T15:11:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e04844b206d3139a800dbbf8448df6a24257869",
"body": "…passing global flags to CMake external builds",
"is_bot": false,
"headline": "feat: add CMakeGlobalFlagsArgs and MergedCFlags/CxxFlags/LdFlags for …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-06T10:53:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec06dd6d220978e92337c0e26d06c02137b9e330",
"body": "…endency chain",
"is_bot": false,
"headline": "feat: add SetRoot API to prune build graph to single root package dep…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-05T15:39:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eeef17d218dabe424b4ae5c299a72d469a9e27c3",
"body": "…ve no local dependents\n\nThe hasLocalRequire heuristic skipped ALL packages without OnRequire,\nincluding independent projects that happen to share a parent directory.\nNow only packages that are depended on by another local package are\ntreated as libraries and excluded from roots.",
"is_bot": false,
"headline": "fix: keep independent packages as roots in collectNeeded when they ha…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-05T14:52:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec08bba3789610f7b39a5b1416b8521365f8ab7c",
"body": "…lpers\n\nExtract resolveToConfig and resolveToConfigBestEffort to unify the\ninit->require->config sequence shared by all 7 pipeline commands.\nRemove pipelineOptions struct, runPipeline, and runThroughConfigPhase.\n\nBuild/test/rebuild now inline their build phase instead of using\ncallback hooks. Clean/distclean use resolveToConfigBestEffort for\ngraceful degradation. Config/query now also call ensureGitignore.",
"is_bot": false,
"headline": "refactor: replace pipelineOptions/runPipeline with resolveToConfig he…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-05T14:37:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6fa9082e4c67f8fac69ead6c2ec2e3ac294ff499",
"body": "…xtract shared helpers",
"is_bot": false,
"headline": "refactor: unify local/remote package options into allPkgOptions and e…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-05T14:28:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c18cd5814781b95b74b6dada1edd3893af7d0594",
"body": "When some local packages use conditional OnRequire (e.g. only require\nnuttx when os=nuttx), unconditional BFS seeding from all locals causes\nunused packages to be built. Now only locals with OnRequire are seeded;\nothers are reached transitively via dependency edges.",
"is_bot": false,
"headline": "fix: seed collectNeeded BFS only from local packages with OnRequire",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-05T13:43:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd6b2973ea4f570796949df74aad6984369a1c37",
"body": "…thout VMAKE_DIR",
"is_bot": false,
"headline": "fix: auto-detect vmake source dir for extension plugin compilation wi…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-03T15:34:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a34d9d8fcb3146d197819f05ba6a6731e3b61ae",
"body": "…amp invalidation, AddPublicIncludes resolution",
"is_bot": false,
"headline": "docs: fix inconsistencies in vmake skill docs — global flag order, st…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-03T15:20:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a530684961d04df2e57d7c2062226489808be424",
"body": "…and architecture docs\n\n- README: fix test_data/17_firmware path, add missing tests 18-20, add internal/flock and toposort\n- AGENTS: update BuildContext struct, fix line numbers, remove invalid ./hello\n- test_data/README: add missing test dirs 15/16/18/19/20, fix build path\n- api.md: remove false Se\n[…]\ncli.md: add --set flag, fix subcommand display\n- ARCHITECTURE: fix MergeGlobals source reference\n- BUILD_SCRIPT_API: add AddGlobalLinks and SetDefaultFlags\n- with-package: fix @ constraint description",
"is_bot": false,
"headline": "docs: fix outdated documentation across README, AGENTS, skill files, …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-03T14:18:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3b9b66c6c7bac6b0758055d2662faacf95e928cd",
"body": "…lean pipeline, and test loop fix",
"is_bot": false,
"headline": "docs: update AGENTS.md with tests 18-20, OnClean/CleanContext docs, c…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-03T14:01:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9091f3b8d26edbc63ad63f3d4cc30bf665c5e4d7",
"body": "…balCxxFlags in plugin API",
"is_bot": false,
"headline": "refactor: replace AddGlobalFlags with separate AddGlobalCFlags/AddGlo…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-02T16:55:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0be15a292c685336bac60d5d21e39998044acc6b",
"body": "…callbacks",
"is_bot": false,
"headline": "feat: expose global flags on Package for SetBuildFunc external build …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-02T16:51:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b73927642d6ec817aed96739b7c614de3a05f959",
"body": "…ting",
"is_bot": false,
"headline": "feat: add --set flag to config command for non-interactive option set…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-02T16:22:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7234ca4e0f4dcdb464c0eb90f4d37859e5362ed7",
"body": "…il Source, default TargetKind to binary\n\nAddGlobalCFlags and AddGlobalCxxFlags were collected and stored in the\ntoolchain manager but never read during compilation. Only LdFlags and\nLinks were applied in resolveTarget. Add the missing GetGlobalCFlags and\nGetGlobalCxxFlags calls so per-package globa\n[…]\nof zero-value empty string (which silently produced no output),\nadd error for unknown TargetKind in realizeTarget, and fatal instead of\nreturning orphan KConfigEntry when ConfigContext has no package.",
"is_bot": false,
"headline": "fix: wire AddGlobalCFlags/AddGlobalCxxFlags into compilation, guard n…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-01T16:15:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "40ec5968e3e7543b875c3940203cf9f97fcd9253",
"body": "… survive FilterDeps",
"is_bot": false,
"headline": "fix: buffer global flags per-package and apply only for packages that…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-01T15:45:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "99d0a31e43c315596f86c84e0104538060fadaef",
"body": "…skill files and AGENTS.md",
"is_bot": false,
"headline": "docs: document OnRequire two-phase execution and FilterDeps phase in …",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-05-01T15:17:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "612c9819e2f7053bb09ce07d4589fb92d56a301d",
"body": "… scientific notation for integer options\n\nGo's json.Unmarshal decodes all numbers as float64, so fmt.Sprintf(\"%v\", float64(16000000))\nproduced \"1.6e+07\" instead of \"16000000\". Changing OnApply to pass the raw typed value (any)\ninstead of a pre-formatted string preserves type information. Also fix ConfigToDefines for\nOptionInt to use strconv.Itoa instead of fmt.Sprintf(\"%v\").",
"is_bot": false,
"headline": "fix: change SetOnApply callback from val string to val any to prevent…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T16:28:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8590042986517066616115804d9fe95c4e78993a",
"body": "…ove it",
"is_bot": false,
"headline": "fix: return .so path even when CompilePlugin fails so cleanup can rem…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T16:05:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "efc21891e10d6422d5f634ff312d5b3103d5dcb8",
"body": "…tale .so files",
"is_bot": false,
"headline": "fix: fail hard on extension plugin compile/load errors and clean up s…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T16:02:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "32d8cef6eb3e67351eeeb89309073308e992d434",
"body": "…om a package",
"is_bot": false,
"headline": "feat: support pkg:* wildcard syntax in AddDeps to link all targets fr…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T15:56:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8fd7958d801f30418bca00da5b7a9ba56dc3f274",
"body": "…Links",
"is_bot": false,
"headline": "docs: update SKILL.md to use AddGlobalLinks instead of per-target Add…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T14:13:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b67380b7733ffc25434ed853b08126d6d61573a",
"body": null,
"is_bot": false,
"headline": "feat: add AddGlobalLinks API for placing system libs inside link group",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-28T14:09:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8936676c6527f7c02d95b915ed4c0ede2601877e",
"body": "…r in non-quiet mode",
"is_bot": false,
"headline": "fix: eliminate duplicate compiler error output by not buffering stder…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-27T16:00:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "617372ad86546f98d288c727d9325edb75da5635",
"body": "…re patterns, and path resolution guide",
"is_bot": false,
"headline": "docs: update SKILL.md with SetGit for local packages, embedded firmwa…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T16:59:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb15545814070dd4e79fa494d8ee7e889a419d7b",
"body": "…or consumer propagation",
"is_bot": false,
"headline": "fix: resolve PublicIncludes relative to SourceDir instead of SrcDir f…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T16:50:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "efeb9e40e0613f3ace28ee5e2d217f9cf50d917e",
"body": "…lags works in OnConfig",
"is_bot": false,
"headline": "fix: wire global flag func pointers in collectOptions so AddGlobalLdF…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T14:11:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5d1b3936295ee8758858fef425b04e8ae4decd3",
"body": "SetGenConfigDefines -> GenerateConfigDefines\nSetExportConfig -> ExportConfig (getter: ExportConfig bool -> ExportEnabled bool)\nSetGenConfigHeader -> GenerateConfigHeader\n\nAlso updates all documentation and test_data references to match.",
"is_bot": false,
"headline": "refactor: rename BuildContext config methods to match their behavior",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T13:31:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f07a27e65039179f0f483dd54ab1d38ff74b0b20",
"body": "…k fix\n\n- Unify ConfigToDefines/ConfigToHeader with shared collectConfigEntries\n- Extract mergeCfgVals, installOnePackage, executeOnBuildForPackages\n- Split prepareAllPackages, runConfigPhase, executePackageOnBuild\n- Rename GenerateConfigHeader/Flag to SetGenConfigHeader/GenConfigHeader\n- Add PkgInf\n[…]\ninkPath))\n- Fix resolver.go: clone to globalSrc before creating symlink\n- Use jsonio.Save, slices.Contains, maps.Keys, slices.Sorted\n- Consolidate paths.go getters, flags.go registration, newActionCmd",
"is_bot": false,
"headline": "refactor: DRY extractions, API rename, stdlib migration, EnsureSymlin…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T13:10:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "14edcc679cda8bd901811aa7b79b43b07f01327d",
"body": "…ConfigDefines\n\nAdd three new BuildContext APIs for propagating config options across\npackage boundaries in distributed RTOS projects:\n\n- ExportConfig() marks a package's config as importable by downstream\n- ImportConfig(pkg...) merges imported package options into -D defines\n- SyncConfigDefines(pkg\n[…]\nateConfigHeader).\n\nDocument that autoconf.h must not be included from public headers to\nprevent cross-package include conflicts.\n\nAdd test_data/20_config_propagate with chip -> app multi-package test.",
"is_bot": false,
"headline": "feat: cross-package config defines via ExportConfig/ImportConfig/Sync…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T11:47:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ebb9c9cee4c156cfe4ac266ceb2d3bf10733f4a7",
"body": null,
"is_bot": false,
"headline": "docs: sync ARCHITECTURE.md with codebase, fix PackageMeta receiver type",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T10:15:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f9319069e011a489757f90ceed534cca687072e0",
"body": "… methods",
"is_bot": false,
"headline": "docs: sync build script docs with codebase, add remaining missing API…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T09:59:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f76304bb1445483765a928f23c0fc29cf7205888",
"body": "- EXTENSION_PLUGIN.md: fix 11 API mismatches (RepoDir, AddGlobalLdFlags,\n RegisterToolchainsFromRepo, LoadToolchainDef, ExtractToDir, SetOnMissing\n signature), replace manifest.json with toolchain.json, update auto-download\n mechanism to tc plugin + RegisterToolchainsFromRepo flow\n- ARCHITECTURE.\n[…]\n Context method list, and\n toolchain auto-download section\n- VMAKE_HOME.md: update directory structure and remove dead loadAllToolchainManifests\n- README.md/README.en.md: sync capability descriptions",
"is_bot": false,
"headline": "docs: sync extension plugin docs with redesigned plugin system",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T09:50:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1f2f9d2ca0891d41a2dcfec44a335b67f70ccbf",
"body": null,
"is_bot": false,
"headline": "docs: sync BUILD_SCRIPT_API.md with codebase, add missing API methods",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T09:19:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e42440d6179f63422b65e94c6cb0288665f94c9",
"body": null,
"is_bot": false,
"headline": "docs: fix SKILL.md auto-wire description and fill missing API methods",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T09:16:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "695419a182a41d69df1119d07c517d8badb59b1f",
"body": "AddGlobalCFlags, AddGlobalCxxFlags, AddGlobalLdFlags, and\nSetProvidedLinkerScript are only effective during config phase\n(OnApply callbacks on ConfigContext). Removing from BuildContext\nto prevent misuse during OnBuild.",
"is_bot": false,
"headline": "refactor: remove global flag and linker script methods from BuildContext",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T08:24:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eec500c84bfebdda283fb04d714bf168d25b4d3f",
"body": "…ain target",
"is_bot": false,
"headline": "feat: install post-link artifacts (.bin, .hex, .stripped) alongside m…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T03:38:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e5f727761c2b1b8bfd0f86c08b7b324fe60d1d1",
"body": null,
"is_bot": false,
"headline": "refactor: move SetLibs from Package to Target.AddProvidedLibs",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T01:53:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "527668138b5cbccf056547b58eca418c9ed40fac",
"body": null,
"is_bot": false,
"headline": "feat: SetPrebuilt for exporting pre-compiled .a/.so as build targets",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-26T01:31:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21e703cb40331cf4b1167ddddcc0ff1bfa65b886",
"body": "…ndency resolution\n\nLinkBinary now separates library files (.a/.so/.dylib) from object files\nand wraps them with -l/-L flags in a linker group. Non-library ldflags\n(-pie, -nostartfiles, -Wl,--gc-sections, etc.) are placed after the group.\n\nAlso updates test 12_rtos_simulate to use TargetStatic for chip_sim,\nproviding a real .a dependency to exercise the group wrapping.",
"is_bot": false,
"headline": "feat: wrap .a/.so libs in --start-group/--end-group for circular depe…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T16:43:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c94065b03869f97a44fe16f9133367f0c97aaaf0",
"body": "…ble-set protection\n\nAdd SetOnApply callback on Option for reacting to resolved values during\nconfig phase. Add global ldflags support mirroring cflags/cxxflags. Add\nSetProvidedLinkerScript/UseDependencyLinkerScript for dependency-based\nlinker script inheritance. SetLinkerScript and SetProvidedLinkerScript\nnow fatal on double-set per No Fallbacks principle. Update docs, skill\nfiles, and test_data/12_rtos_simulate to demonstrate the pattern.",
"is_bot": false,
"headline": "feat: Option.OnApply, AddGlobalLdFlags, ProvidedLinkerScript with dou…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T15:44:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "edea4a803237bcccacc0fedf48a9009ebfa18589",
"body": "…ache delay",
"is_bot": false,
"headline": "fix: use git ls-remote --tags for version listing to avoid Go proxy c…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T09:22:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b60ff3f646fd29663a8f94387d05ce229d8ebef",
"body": "…atest pseudo-version",
"is_bot": false,
"headline": "feat: update command resolves latest version via semver instead of @l…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T09:11:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "315c9248a2cbc413e3db3643b15303aad952f7e0",
"body": null,
"is_bot": false,
"headline": "fix: auto-recompile extension plugins when vmake binary is updated",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T09:01:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5d4f8bb90f0019a03f2f934edd0b8ae7106e25ad",
"body": "…s docs\n\n- Add missing API to references/api.md: SelectVersionMulti, SrcDirRaw,\n TargetKind.Ext/Prefix/InstallDir, OptionType.String, CheckCycle,\n Requires.AddInfos, InstalledPackage.UpdateLibDir\n- Fix invalid PatchKConfig map literal in third-party-wrapper.md\n- Remove redundant AddIncludes in mul\n[…]\nfull version rules\n- Fix comparePreIdentifiers numeric vs alpha comparison in semver.go\n- Add >= major locking to Constraint.Match (>=1.2 only matches 1.x.x)\n- Add semver_test.go with 8 test functions",
"is_bot": false,
"headline": "docs: sync skill files with codebase, fix semver, expand version rule…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T08:46:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "be4ab2155382c80229b867f71aa785ff6d3aa59b",
"body": "- Unify SrcDir() fallback: SrcDir() now includes SourceDir fallback,\n add SrcDirRaw() for raw value, remove 7 duplicated fallback patterns\n- Remove PackageInstaller dead code: 4 fields set but never read\n- Extract enableTestDefaults helper to replace duplicated test logic\n- Split findNativeSource i\n[…]\n ensurePackageForVoid + isVoidUpToDate +\n updateVoidLibDirs\n- Fix missing localSrc parent dir when global sources cache is empty\n- Add 12 resolver tests (topological sort, cycle, constraints, native)",
"is_bot": false,
"headline": "refactor: simplify resolver, scheduler, and eliminate dead code",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-25T08:05:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9dfafa5d6ebaa1a5ca1bb0220b776a2b84816816",
"body": null,
"is_bot": false,
"headline": "fix: skip -D define for false bool options, align with #ifdef semantics",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-24T15:08:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1469bc41f0a5ab027df40f4b21c32f4acd053529",
"body": "…tyle config management",
"is_bot": false,
"headline": "feat: add GenerateConfigHeader and GenerateConfigDefines for kernel-s…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-24T14:57:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8f7e31fbf55a41d49305518cdb15d76be6d97730",
"body": "Redesign toolchain registration as a single Go plugin mechanism.\nEach extension repo has one plugin that manages all its toolchains\nvia RegisterToolchainsFromRepo() helper. Per-toolchain toolchain.json\nfiles define metadata and optional install config. Per-toolchain\nonMissing callbacks handle auto-d\n[…]\n\n ExtractToDir, RepoDir\n- pkg/plugin/assets.go: ExtractToDir with multi-format support\n- cmd/vmake/ext_cmd.go: helper wiring (makeRegisterToolchainsFromRepo,\n makeAutoDownload, makeLoadToolchainDef)",
"is_bot": false,
"headline": "feat: toolchain auto-discovery via extension plugins",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-23T16:38:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d860f9c6a93d6fea0c97251d77047911b555f57e",
"body": "… on tc plugin only\n\nThe toolchain registration and auto-download logic was duplicated between\ncmd/vmake/ext_cmd.go (loadExtensionToolchains + handleAutoDownload) and the\ntc extension plugin (vmake-extensions/tc/src/main.go). Remove the ext_cmd\nimplementation and delete the global onToolMissing mechanism, keeping the\nplugin path as the single source of truth.",
"is_bot": false,
"headline": "refactor: remove duplicate toolchain auto-download from ext_cmd, rely…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-23T14:57:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8881d4458975c375f80b9d8030f1ec4aa4f22199",
"body": null,
"is_bot": false,
"headline": "fix: show full compiler errors on plugin compilation failure",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-23T14:28:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dcb2fccbd58f76ea45f0c01217aba2901541fdfc",
"body": "…ymlink corruption\n\nWhen ensureRepo iterated over mirrors and the first clone failed, it\nremoved the local symlink but left a real directory for the next clone.\nNow all git operations work directly on the global source path and the\nsymlink is only created as a finalization step.",
"is_bot": false,
"headline": "fix: use global path for git operations in SourceManager to prevent s…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-17T15:16:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "884664111c4feea425d4e25a09618f96bf3fcd9a",
"body": "Package source checkouts now live in ~/.vmake/sources/<repo>/<pkg>/src/ and are\nsymlinked into each project's vmake_deps/. This lets multiple projects share one\ngit checkout. File locking (flock) serializes concurrent access across projects.\n\n- Add internal/flock for advisory file locking via syscal\n[…]\nin all call sites\n- Update AGENTS.md, SKILL.md, VMAKE_INTRODUCTION.md for new layout\n- Rename 源(Source) concept to 仓库(Repo) in docs\n- Remove stale gotchas (populateDepsFromGraph, scheduler.SetPackage)",
"is_bot": false,
"headline": "feat: share package source globally via symlinks, update docs",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-17T14:36:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bf6dd1d6afd3e91df28eefede8082bde1c296142",
"body": "…deps/\n\nRefactor third-party package management so all source code, buildscript\ncache, and build artifacts live in vmake_deps/ at the project root instead\nof ~/.vmake/cache/ and ~/.vmake/packages/. Each project now has its own\nindependent dependency tree. Global ~/.vmake/ retains only repos, toolchains,\nand extensions.\n\nUpdate SKILL.md, cli.md, AGENTS.md, ARCHITECTURE.md, and VMAKE_HOME.md to\ndocument the new layout. Remove legacy cleanup code from distclean.",
"is_bot": false,
"headline": "feat: move deps storage from global ~/.vmake/ to project-local vmake_…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-17T13:47:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1daafcc22d57cc9086bed9fcac48d6a15a15566f",
"body": null,
"is_bot": false,
"headline": "docs: update skill docs with RemoveFiles/ExcludedFiles API",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-15T11:28:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7563b084b80b0a59c3586886ac47c1effc47dfda",
"body": "…ults",
"is_bot": false,
"headline": "feat: add Target.RemoveFiles to exclude files from glob expansion res…",
"author_name": "spock",
"author_login": "spock2300",
"committed_at": "2026-04-15T11:23:08Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 9,
"commits_last_year": 269,
"latest_release_at": "2026-07-17T13:11:28Z",
"latest_release_tag": "v1.0.59",
"releases_from_tags": true,
"days_since_last_push": 1,
"active_weeks_last_year": 16,
"days_since_latest_release": 4,
"mean_days_between_releases": 3.4
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 28,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/spock2300/vmake",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/spock2300/vmake",
"is_deprecated": false,
"latest_version": "v1.0.59",
"repository_url": "https://github.com/spock2300/vmake",
"versions_count": 9,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-17T13:11:28Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"test_linux/17_firmware/linux/Makefile",
"test_linux/17_firmware/uboot/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod",
"test_data/_snapshot/go.mod"
],
"largest_source_bytes": 31964,
"source_files_sampled": 232,
"oversized_source_files": 0,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 27988
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/charmbracelet/bubbletea",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.3.10"
},
{
"name": "github.com/charmbracelet/lipgloss",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.0"
},
{
"name": "github.com/spf13/cobra",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.10.2"
},
{
"name": "github.com/spf13/pflag",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.9"
},
{
"name": "github.com/traefik/yaegi",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.16.1"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "spock2300",
"commits": 268,
"avatar_url": "https://avatars.githubusercontent.com/u/59272067?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"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": null,
"reason": "no pull request found",
"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": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 8,
"reason": "2 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "a0a4b270f21dbf5c8170ec082a842d21978dbfa2",
"ran_at": "2026-07-21T22:55:31Z",
"aggregate_score": 2.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/spock2300/vmake",
"host": "github.com",
"name": "vmake",
"owner": "spock2300"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 41,
"inputs": {
"security": 24,
"vitality": 74,
"community": 24,
"governance": 33,
"engineering": 44
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 74,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"commits_last_year": 269,
"human_commit_share": 1,
"days_since_last_push": 1,
"active_weeks_last_year": 16
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 1 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 1
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "16/52 weeks with commits",
"points": 11.1,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 16
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "269 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 269
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 9,
"latest_release_tag": "v1.0.59",
"releases_from_tags": true,
"days_since_latest_release": 4,
"mean_days_between_releases": 3.4
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "9 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 9
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~3.4 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 3.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": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 24,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "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": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 33,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"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": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 38,
"inputs": {
"followers": 0,
"owner_type": "User",
"is_verified": null,
"owner_login": "spock2300",
"public_repos": 13,
"account_age_days": 2398
},
"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": "0 followers of spock2300",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "spock2300"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "13 public repos, account ~6 yr old",
"points": 20.3,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 13
}
},
{
"code": "account_age_years",
"params": {
"years": 6
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/spock2300/vmake"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 4
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "9 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 9
}
}
],
"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": "at_risk",
"name": "Engineering Quality",
"value": 44,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 24,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 24,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 2.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "2 existing vulnerabilities detected",
"points": 6,
"status": "partial",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 74,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.96,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 27988
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "96 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 96,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 68,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"test_linux/17_firmware/linux/Makefile",
"test_linux/17_firmware/uboot/Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod",
"test_data/_snapshot/go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "test_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "test_linux/17_firmware/linux/Makefile, test_linux/17_firmware/uboot/Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 31964,
"source_files_sampled": 232,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/232 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 232,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-21T22:55:35.884377Z",
"schema_version": "0.25.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/spock2300/vmake.svg",
"full_name": "spock2300/vmake",
"license_state": "standard",
"license_spdx": "MIT"
}