-
Explicit ecosystem hint syntax for
look-up— a<ecosystem>:<name>prefix (npm:go,cran:dplyr,crates:serde@1.0.100) forces a specific ecosystem, as an escape hatch for (1) package names shadowed by the fixed language set (go/swift/r/…, which otherwise route to runtime introspection) and (2) named-only registries (cran/crates/maven/…) that previously relied on the agent inferring the ecosystem. Classification precedence is URL → ecosystem-hint → Language → Package; splitting once at the first:, a hint is recognized only when the prefix (case-insensitively) is one of the nine known ecosystem ids, the remainder is non-empty, and the remainder's first character is not/(so a barenpm:and a URL scheme'snpm://xare both NOT hints and fall through). Version pins compose (crates:serde@1.0.100). This is a plugin-shell (skill contract) change — the MCP binary is unchanged. The publishedexplicit-doc-lookupspec's pin scenario is also reconciled with the crates/go/rubygems pin-honoring behavior shipped earlier. -
R runtime depth adapter —
introspect kind=runtimenow covers R: probesR(falling back toRscript)--version, readsDESCRIPTION'sDepends: R (>= x.y)as a constraint (lower bound, never an exact version), honors.r-version, and auto-detects R projects viaDESCRIPTION+NAMESPACEtogether (a bareDESCRIPTIONis too weak a signal on its own), or any ofrenv.lock/.r-version/*.Rproj. Thelook-upflagship example/livedocs:look-up Rnow anchors to the local R toolchain version when R is installed (DESCRIPTIONDependsstays a lower-bound cross-check, never the effective version; without a toolchain the honest not-resolved degrade still applies). Runtime target ids are canonicalized before the safety gate, so natural spellings likeRandJavaScriptare accepted;renv.lockis a detection signal only (its pinned R version parsing is a tracked follow-up). -
javascript→nodealias — runtime introspection withtarget=javascriptresolves through the Node adapter; the result keeps the requested identifier and the source field discloses the node probe. No response-schema change. -
Version pins honored for crates/go/rubygems —
resolve_source/latest_versionnow confirm a requested pin at each ecosystem's first-class per-version endpoint (crates/crates/{n}/{v}, Go@v/v{v}.info, RubyGems v2versions/{v}.json), reporting the confirmed version.latest_versiongains a machine-readablepin_honoredfield:trueonly when the resolved version exactly equals the requested pin (modulo a leadingv),falsefor a latest-only ecosystem (jsr/packagist/maven/cran), a version that wasn't found, or a non-exact token — an npm dist-tag (beta/next) or a partial pin (18) resolves to a moving/other concrete version and is reportedpin_honored:false, never faked as a confirmed pin. Onfalse,versionis the registry's current resolution — the latest, or the concrete version a tag/partial resolved to — never presented as a confirmed pin or guaranteed-latest-stable. A requested pin always gets apin_honoredsignal, even when nothing resolved. During ecosystem auto-detect, an npm pinned-version miss falls through to PyPI's exact pin instead of short-circuiting to npm's latest. Docs/repo URLs remain latest (default-branch) and stay labeled not-pinned. maven/packagist/jsr per-version support is a tracked follow-up. -
Binary release ships the R adapter (#35) and this version-pin work (#36) together in one signed release train.