feat(ecosystems): add TOML reader plus 9 ecosystems and 20+ new sources - #2
Merged
Niicolaa merged 1 commit intoAug 4, 2026
Conversation
Niicolaa
force-pushed
the
claude/ecosystem-sources-tb6ae
branch
2 times, most recently
from
August 4, 2026 14:24
5bcd8cb to
9b2b58b
Compare
Niicolaa
force-pushed
the
claude/windows-support-planning-tb6ae
branch
from
August 4, 2026 14:31
3f055c4 to
e62c2c6
Compare
Adds a dependency-free restricted TOML reader (internal/toml) and uses
it to unblock the ecosystem coverage previously listed in
docs/inventory-sources.md as "not currently covered". The stdlib has no
TOML support and this project ships zero non-stdlib dependencies, so
that single gap was what blocked Cargo, Poetry, uv, PEP 751, Julia, and
the Codex MCP host config.
New ecosystems. Emitted values follow the lowercased OSV identifiers so
an advisory-derived exposure catalog needs no translation table:
crates.io Cargo.lock
nuget packages.lock.json, packages.config, *.deps.json,
Directory.Packages.props / Packages.props, and installed
<id>/<version>/<id>.nuspec in the global packages folder
maven pom.xml, *gradle.lockfile, *.sbt.lock, and
META-INF/maven/*/pom.properties inside jar/war/ear/par
swift Package.resolved (v1 and v2/v3)
cocoapods Podfile.lock
pub pubspec.lock
hex mix.lock (:hex entries only)
conan conan.lock (v1 graph and v2 flat)
julia Manifest.toml (format 1.0 and 2.0)
Extended existing ecosystems:
pypi requirements*.txt, Pipfile.lock, poetry.lock, uv.lock,
pylock.toml — closes the asymmetry where npm had declared-state
coverage and Python had installed-state only
go go.work.sum, vendor/modules.txt, and build info read from
compiled binaries via debug/buildinfo (stdlib), the only record
of what went into a `go install`-ed tool
mcp ~/.codex/config.toml
Confidence reflects what each file proves: resolved locks are high,
declarations (pom.xml, Packages.props, pinned requirements) are medium,
and unpinned requirement specifiers record the spec with no version at
low confidence, matching how MCP server references are handled.
Baseline roots gain only ~/.nuget/packages and ~/.julia/environments —
locations that actually hold metadata a scanner can read. Deliberately
excluded are ~/.m2/repository and ~/.gradle/caches, which are already
in walk.DefaultExcludes as high-cost dependency caches; opening every
cached JAR is far too expensive for a profile meant to run 6-hourly.
Both stay reachable via an explicit --root or a deep sweep.
Also fixes an editor-extension gap found while mapping coverage: the
roots were missing .vscode-insiders-server and .vscodium-server while
their local counterparts were present, so remote/SSH installs of those
two editors were invisible.
The walker's dispatch switch and the worker's handler switch were
linked only by matching string literals, so a typo on either side
compiled cleanly and silently dropped an ecosystem. All 43 job kinds
are now constants referenced by both, making a mismatch a compile
error. dispatch_test.go additionally walks a tree with one fixture per
new source and asserts each produces a record.
Niicolaa
force-pushed
the
claude/ecosystem-sources-tb6ae
branch
from
August 4, 2026 14:34
9b2b58b to
4edb711
Compare
Niicolaa
merged commit Aug 4, 2026
c30ac87
into
claude/windows-support-planning-tb6ae
4 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes most of the gap between what Bumblebee collects and what a developer endpoint actually has on disk, including every ecosystem
docs/inventory-sources.mdlisted under "Not currently covered".This is PR 2 of 2 and is stacked on #1 — its base is
claude/windows-support-planning-tb6ae, notmain. Merge #1 first; GitHub will then retarget this tomainautomatically. The diff shown here is only this PR's own changes.The blocker was TOML
The stdlib has no TOML support and this project ships zero non-stdlib dependencies. That single gap was what blocked Cargo, Poetry, uv, PEP 751, Julia, and the Codex MCP host config — which is why
config.tomlwas listed as an explicit v0.1 non-goal despite~/.codexalready being a scanned root.internal/tomlis a ~590-line restricted reader covering what lockfiles actually use: bare/quoted/dotted keys,[table],[[array of tables]], basic and literal strings (including multi-line), integers, floats, booleans, arrays, and inline tables. Dates are returned as raw text rather than typed — no consumer here needs temporal comparison, and skipping it keeps the reader small. Everything goes through a small facade (Parse,Table,Tables,String,Strings,Get), so swapping in a library later is a one-file change rather than a refactor of six parsers.New ecosystems
Emitted values follow the lowercased OSV identifiers, so an exposure catalog derived from an advisory feed needs no translation table.
crates.ioCargo.locknugetpackages.lock.json,packages.config,*.deps.json,Directory.Packages.props/Packages.props, installed<id>/<version>/<id>.nuspecmavenpom.xml,*gradle.lockfile,*.sbt.lock,META-INF/maven/*/pom.propertiesinside.jar/.war/.ear/.parswiftPackage.resolved(v1 and v2/v3)cocoapodsPodfile.lockpubpubspec.lockhexmix.lock(:hexentries only)conanconan.lock(v1 graph and v2 flat)juliaManifest.toml(format 1.0 and 2.0)Extended existing ecosystems
pypi—requirements*.txt,Pipfile.lock,poetry.lock,uv.lock,pylock.toml. This closes a real asymmetry: npm had declared-state coverage (lockfiles) while Python had installed-state only (dist-info), even though PyPI is a constant target for typosquat campaigns and the repo already shipsthreat_intel/auto-osv-malicious-pypi.json.go—go.work.sum,vendor/modules.txt, and build info read from compiled binaries via stdlibdebug/buildinfo.go installwrites tools into~/go/binand nothing else on disk records what went into them.mcp—~/.codex/config.toml.envvalues and key names are dropped, same as every other MCP source.Confidence reflects what each file proves
pom.xml,Packages.props, arequirements.txt==pin. Exact versions, but a request rather than a record of an install.requested_specandversionis left empty, matching how MCP server references are handled.Unresolvable inputs are skipped rather than guessed: MSBuild
$(Property)references, Maven${...}that doesn't resolve against the pom's own<properties>, version ranges, wildcard pins,(devel)Go builds, and.nuspec$token$versions.Notes on scope
Baseline roots gain only
~/.nuget/packagesand~/.julia/environments— the two that actually hold metadata a scanner can read.~/.m2/repositoryand~/.gradle/cachesare deliberately not baseline roots: both are already inwalk.DefaultExcludesas high-cost dependency caches, and opening every cached JAR is exactly what a profile meant to run 6-hourly should avoid. The Pub/Hex/Conan/Swift caches hold extracted sources or tarballs rather than any file this scanner parses. All remain reachable through an explicit--rootor a deep sweep.Java archive scanning reads identity only from the embedded
META-INF/maven/*/pom.properties. A shaded uber-jar without one yields nothing rather than a filename-derived guess.Not adopted from Trivy: OS packages, container images, IaC misconfiguration, and secret scanning. The last would directly contradict the stated privacy posture — MCP
envvalues and key names are both dropped, and.env/.envrcare skipped even outside excluded directories.Dispatch wiring
The walker's dispatch switch and the worker's handler switch were linked only by matching string literals, so a typo on either side compiled cleanly and silently dropped an entire ecosystem. All 43 job kinds are now constants referenced by both, making a mismatch a compile error.
That matters because tests can't cover everything here:
go-binarycannot be covered by a record-level test in this repo. This module has zero non-stdlib dependencies, so a binary built from it reportslen(Deps)==0, and its ownMain.Versionis(devel), whichScanGoBinarydeliberately skips. Verified directly:dispatch_test.gostill walks a tree with one fixture per new source and asserts each produces a record, including the three gated on file shape rather than basename (cached.nuspec, Java archive, Go binary).Also fixed
Editor-extension roots were missing
.vscode-insiders-serverand.vscodium-serverwhile their local counterparts were present, so remote/SSH installs of those two editors were invisible.Verification
go test -race ./...— green across all 30 packagesgofmt -l .andgo vet ./...— cleanGOOS=windowsamd64andarm64— build and vet cleanbumblebee selftest— OK--ecosystemnow accepts:npm,pypi,go,rubygems,packagist,crates.io,nuget,maven,swift,cocoapods,pub,hex,conan,julia,mcp,editor-extension,browser-extension🤖 Generated with Claude Code
https://claude.ai/code/session_01H9erz849YcDcunP7sWteMu
Generated by Claude Code