Skip to content

Merge open canonical fixes and add a Homebrew MCP service - #21

Closed
philocalyst wants to merge 170 commits into
canonicalfrom
jimmy/merge-open-prs-088a
Closed

philocalyst wants to merge 170 commits into
canonicalfrom
jimmy/merge-open-prs-088a

Conversation

@philocalyst

@philocalyst philocalyst commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Integrates the open pull requests that already target canonical, and adds a Homebrew formula that installs the MCP server as a loopback service from a clean clone.

#12 (jimmy/nix-oci-backend-7a89) is not included. It is based on the pre-canonical workspace/index tree (merge-base main), and closed #11 is an earlier commit on that same branch. Those paths are gone on canonical.

cargo check --workspace --locked --all-targets passed on this branch. Targeted Turso graph tests (4) and Qdrant HTTP tests (11) passed.

Test plan

  • cargo check --workspace --locked --all-targets
  • cargo test -p backend-extension-turso --lib -- --test-threads=8 --skip stress_fts
  • cargo test -p backend-extension-qdrant --lib http:: -- --test-threads=8
  • brew install --HEAD ./packaging/homebrew/backend-mcp.rb from a blank Homebrew prefix
  • brew services start backend-mcp against a small Next.js TypeScript project
  • MCP initialize, backend.index, backend.search, and backend.resolve against that project
Open in Web Open in Cursor 

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith with what you need. Autofix is disabled.

cursoragent and others added 30 commits September 25, 2026 02:31
…er declared.

refer() on a missing id made Lowering::finish reject the whole package. Declarations now land first, and a re-export target that this package did not declare becomes a foreign key instead of an empty slot.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A target named * was never declared. export * as ns and a star that fans out to nothing now reference the module root, and no sealed symbol is named *.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…n the same package.

A barrel used to see a later file's declare_ref as missing and store a foreign key. Ids this package will declare are referred first, so the later declare_ref fills the slot.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…the name.

Return types and heritage clauses used to stay unresolved strings, so returnedBy and subtypes had nothing to follow. A declared name is referred; a real type parameter stays a type variable; an unknown name stays unresolved.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…e parameter.

lower_ts_type passed no parameter set, so every identifier including ImportedWidget became TypeVar. Function signatures now pass their type parameters, and a name outside that set stays a nominal.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…duplicate.

Re-exports and nominals refer an id only when this package will declare it; everything else is a foreign key. Twin files that share a skeleton publish once, while two different bodies in one file stay two entries or surface Error::Duplicate. CommonJS function assignments and require bindings lower as an owned function and a package reference.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A bare or dotted name this package declares becomes a nominal ref when the file imports it unambiguously or declares it in the same file. Overload branches keep each signature's parameters, and self or cls is dropped only when it is that function's receiver.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Header-only APIs were dropped because only .c/.cpp files were parsed and
is_in_main_file ignores included declarations. Each package-root header is
now parsed once. T&& no longer lowers as Primitive::Reference, and a type
declared in the package becomes a local nominal. std:: names use
nominal_import so finish does not report them undeclared.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…set-8770

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…8770

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
An empty returnedBy, subtypes, acceptedBy, heldBy, or usages page now carries a closed reason: an unlinked nominal, occurrences that were never attached, a true negative, or Rust-only implementors still pointing at subtypes. The note follows the queried symbol, so a package that linked Return for someone else does not hide an unlinked name.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A name plus a kind filter no longer lists every symbol of that kind, and re-exports are searchable. One engine load checks packages, search, read, refs, graph, and the schema card.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…-8770

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Identical bodies written twice in one file stay one declaration. Different bodies sharing a name get their own discriminant, keyed by span so a later overload cannot overwrite the first. The 21 latest npm packages that used to die in finish now seal.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
axios, follow-redirects, form-data, and proxy-from-env each finish. serde 1.0.229 and serde_core 1.0.229 each finish, and serde names serde_core as a foreign package.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Interface and class skeletons now include signatures, so two namespace blocks that declare the same interface with different methods stay two overloads. Member ids put the parent overload in the name, not in a discriminant that overflows.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Two namespace blocks that differ only by an index signature or a construct signature no longer compare equal and drop the second body.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
f<T> and f<T extends string> no longer compare as the same interface and drop the bounded overload.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Variance, this-parameters, readonly parameters, function-type detail, type-alias generics, extends versus implements, decorators, accessors, modifiers, and docs all participate in body identity.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
The same key and the same query must return the same page, a graph hit must open in read, and an empty implementors edge must point at subtypes.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
…ile.

Visibility and docs stay part of same-file identity. Twin files still merge on the body alone, so a repeated enum does not declare its variants twice.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Getters, setters, declare, override, definite assignment, initializers, static index signatures, optional and rest tuple elements, readonly function parameters, enum unary values, and computed keys no longer collapse onto the other declaration in the same file.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
An accessor's override, definite assignment, and initializer, and the source of a static block, are part of the class skeleton.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Two implementations that share a signature stay distinct, and object and array parameters keep the names written in the pattern.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A default value and a parameter decorator are part of the function skeleton, and override on a constructor parameter property is part of the synthesized field.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A decorator on a rest parameter, and a comment on a call, construct, or index signature, is part of the same-file skeleton.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A call, construct, or index signature stores the deprecation note and the ignore flag, not only the comment description.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
An index, call, or construct signature inside an object type keeps the block comment in front of it, so two commented shapes in one file do not collapse.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A block comment in front of a property inside an object type is part of that property's name, so two commented properties in one file do not collapse.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
go/types panics when a cgo named type is still incomplete. The oracle now
recovers, records those names, and the package seals with them as gaps.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
cursoragent and others added 25 commits September 25, 2026 20:34
References name the real caller, and dependencies follow the parsed Cargo.toml edge. A snapshot or product-text failure fails the command.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Package identity is the Cargo.toml name and version, and a purl that does not match fails. Explore and tree-open report the indexed declaration instead of echoing the query.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A later const with a different initializer is its own fact, and a use of that binding targets it. Identical twins still share the first fact.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Cargo and npm share one rank in the package graph. A repeated name keeps
the higher scope, and dependents include only runtime and optional rows.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
IngestedVersion and TursoCatalog publish now share verify_entity_locators.
An identical republish stays unchanged and a short entity slice does not append history.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Both manifests call validate_selection_admission. A duplicate present id
and a reversed selection order are rejected on both lanes.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Upsert classifies the preflight readback. A matching point is not
submitted, a missing point is written, and a changed vector stays a conflict.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
ExactManifestError and LexicalManifestError are aliases of
SelectionAdmissionFault, so a new admission fault cannot land on only one lane.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Index sorts stay on the stack. The first fault is still the leftmost one:
a missing overlap is reported before a later duplicate.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Receipt and page admission use one increasing-coordinate check and one
overrun check. A bad artifact is still reported before a catalog overrun.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Direct module requires stay Runtime. A // indirect require is Development,
which dependents do not count, and duplicate names collapse before admission
so a direct row wins over the same module marked indirect.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
The file owner is the source path. Shelf names come from Cargo.toml, and package-versions lists only releases that were indexed.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Direct accesses and macro-receiver accesses share one emitted span, so identity!(panel).score is recorded once and access_field!(panel, score) is still kept.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Retrieve each batch before PUT. Unchanged points stay in place.
Legacy points without a key are rewritten once. A different key
is an immutable-vector error and is not written.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
A name this compilation pushed stays a local fact. A package that was not loaded stays a foreign key.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Package graph sync deleted every edge whenever the UI root changed.
Edges are identified by facts_version, so an identical payload now
stays in place. Missing edges are deleted one id at a time, and
queries fence on the meta root.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Share dependency scope, selection admission, and unchanged Qdrant upserts.

Closed pull requests #8, #9, and #10 were earlier drafts of this branch.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Skip unchanged Qdrant HTTP upserts.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Keep unchanged package edges when the view root changes.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Keep a field access that only exists inside a macro.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Resolve a Go call when the target package is in the same image.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
List indexed packages, owners, and versions from the manifest.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
brew install --HEAD builds backend-mcp and backend-locald from a fresh
clone, and brew services starts the HTTP MCP endpoint on 127.0.0.1:8741.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
The service wrapper still creates the bearer token on first start.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Homebrew 7 rejects a formula path outside a tap. Formula/backend-mcp.rb
is the file `brew tap` reads.

Co-authored-by: Miles Wirht <philocalyst@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants