portfolio_query
Traverse the graph ACROSS products in one call (the multi-product `query`). Runs the same BFS (typed-edge traversal + field projection) against every product in scope and tags each subgraph with its source `product_id`, without `switch_product` (the active product is read live; others are read-only). Use for portfolio-level questions ("every product's strategy region", "which products have a persona"). `from_id` only matches in its owning product. Read-only.
Arguments
fromstringoptionalStart from all nodes of this type (in each product)
from_idstringoptionalStart from a specific node ID. Node IDs are product-local; only the owning product returns results.
traversearrayoptionalEdge types to follow at each level (in order). If omitted, follows all edges. Prefix with ! to exclude.
depthnumberoptionalMax traversal depth (default 3, max 10)
includearrayoptionalFields per node: "title", "status", "tags", "description", "properties" (default: title, status, type)
limitnumberoptionalMax nodes per product (default 100, max 1000)
edge_includearrayoptionalEdge fields to return: "id", "type", "source", "target". Empty array = no edges. Default: all fields.
property_includearrayoptionalWhen "properties" is in include, only return these property keys.
scopearrayoptionalProduct IDs (or files) to query. Omit to query ALL products in the workspace. Match by product id, relative file, or basename.
Returns
{ products: Array<{ product_id, file, title, total_nodes, total_edges, nodes, edges, truncated? }>, products_searched, products_with_matches, empty_products, unmatched_scope? }empty_products, not expanded, to keep the payload lean.from_id only matches in its owning product; the rest report empty.