Code reference detail
wildcard_reference_edges.rs
crates/reqlan-index/tests/wildcard_reference_edges.rs
| Idea | Status | Tags | Summary | Katz |
|---|---|---|---|---|
| graphical_graph | There should be a tab that renders requirement ideas and references as a force-directed web. The graph tab lives in the Ideas Summary webview per [ideas_summary]. UI is implemented in ["../../../../packages/extension/webviews/ideas-summary/components/GraphView.svelte"]. Graph slices are built in ["../../../../packages/analytical/src/index-store/webview-graph-queries.ts"] and served by ["../../../../packages/extension/src/ideas_summary_module/ideas-summary-panel.ts"]. By default the view focuses on the active editor file's first idea; without a focus it shows a capped slice of matching ideas rather than dumping the full graph. Users can filter by search text, path, multi-select @ status, and multi-select tags per [graph_status_tag_filters]. An " Indirect references " toggle expands neighbourhood depth from 1 to 2 hops. A " Wildcard refs " toggle includes or hides edges expanded from path + idea wildcards per [wildcard_refs_toggle] ["@/reqlan rq/language/imports.rq".wildcard_references] A " Files " dropdown selects hosting- `.rq` treatment per [file_treatment_toggle] ( hidden / compound containers / linked ideaset nodes ), with per-option info tooltips. Interactive graph controls that also exist on HTML export must stay aligned per [webview_export_graph_parity]. Clicking a node opens its source; double-click or " Focus graph " recenters the slice on that idea. Linked file ideaset nodes and file-compound titles open the hosting `.rq` file per [file_treatment_toggle]. External file references render as dashed edges to file nodes; wildcard-fan-out edges render dotted. A toggleable key explains node colours and edge styles and toggles node-type visibility per [key_panel_toggle]; a toggleable [control_panel] exposes layout, physics, and node-budget settings. Key and Controls state persist per workspace via [graph_ui_persistence]. Pan, zoom, and drag repositioning per [view_controls]. [manual_reframe] via " Fit to view " in [ui_controls]; [auto_reframe] when the loaded node set changes; [reframe_animation] for smooth transitions after the first paint. Node text labels per [graph_labels], [graph_label_modes], and [graph_label_auto]. Layout, compound grouping, and live physics behaviour per [layout_physics], [layout_options], [physics_options], and [compound_graph]. Cytoscape lifecycle and threading constraints per [graph_cy_controller] and [webview_threading]. | 0.207 | ||
| webview_export_graph_parity | done | Interactive graph behaviour that authors rely on in Ideas Summary must have a matching affordance on the HTML export workspace graph ( [html_export_graph_page] ) unless a requirement explicitly scopes it to one host. Shared today: Labels auto / on / off, live physics, Fit, status / tag filters, path / search filters, hide external files, hide ideasets ( explicit AST ), [file_treatment_toggle] ( dropdown with the same three modes, compound drag / title-open, linked-node open ), and [wildcard_refs_toggle] ( default on; dotted wildcard edges ). Ideas Summary may still differ where the host model differs: Indirect refs rebuilds hop depth via `buildGraphViewSlice` ( export freezes neighbourhood at snapshot time — no Indirect chip ); Key / Controls panels and node-budget controls are webview-only; export uses client-side filters on the embedded graph JSON rather than re-querying the index; Ideas Summary uses cytoscape compound parents while export draws AABB compound boxes on canvas. When adding a new Ideas Summary graph chip or edge style, update [html_export_graph_page] ( or document an intentional exception here ) and keep labels / defaults aligned across surfaces. Related: [graphical_graph], [wildcard_refs_toggle], [file_treatment_toggle], [ui_controls], [graph_labels], [graph_label_modes], [graph_status_tag_filters]. | 0.165 | |
| wildcard_refs_toggle | done | Toolbar chip " Wildcard refs " ( next to Indirect refs ) on GraphControls toggles `GraphViewQuery.includeWildcardRefs`. Default true — edges of kind `wildcard_reference` from the indexer fan-out stay visible ( ["../../../indexer/indexer.rq".wildcard_reference_edges] ). When false, `buildGraphViewSlice` omits those edges and does not expand neighbourhood through them ( `includeWildcardRefs!== false` normalisation in Ideas Summary host + analytical query ). Distinct from plain `references` and from the Indirect refs depth toggle; Key legend shows a dotted " Wildcard reference " row; cytoscape marks `edge[?isWildcard]` with `line-style: dotted`. Query field flows Ideas Summary loadGraph → `buildGraphViewSlice` in ["../../../../packages/analytical/src/index-store/webview-graph-queries.ts"]. HTML export workspace graph has the same chip ( client filter on embedded edges; dotted stroke ) per [webview_export_graph_parity] and [html_export_graph_page]. Related: ["../../../language/imports.rq".wildcard_references], ["../../../indexer/indexer.rq".wildcard_reference_edges], ["../../../indexer/indexer.rq".index], [graphical_graph], [ui_controls], [webview_export_graph_parity]. | 0.308 | |
| definition | The indexer should live in the [core_analysis] module. On-disk schema: [sqlite_schema.ideas_index_sqlite] and [diagnostics_schema.diagnostics_sqlite]. Layout and WAL sidecars: [sidecars.reqlan_directory_layout]. Consumers: [consumers.index_consumers] ( extends [consumption] ). Sequencing and triggers: [sequencing.index_sequencing] ( extends [triggers] ). Cache reuse opportunities: [cache_reuse.index_cache_reuse]. | 0.040 | ||
| index | The ideas graph indexer: parse `.rq` with the native engine, extract ideas / edges, persist to rusqlite SQLite. Same-file `[ideaset.member]` edges target the member leaf ( ["../language/syntax.rq".references_to_subidea] ). Wildcard path + idea fan-out: [wildcard_reference_edges] ( ["../language/imports.rq".wildcard_references] ). Ideas Summary graph can hide those edges via [ideas_summary_doc] / ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle]. Soft mtime sync skips unchanged files. `extract_version` in the ideas index meta is the extract-rule generation. When that number does not match the engine, sync rebuilds so stale edges do not remain ( ["../language/syntax.rq".inline_code] ). Owned by [ownership]; consumed per [consumption]. | 0.587 | ||
| indexer_rust | in-progress | The [index] engine ( parse-for-index → extract → SQLite persist → incremental sync ) should be written in Rust. Crate: `reqlan-index` over `reqlan-parse` per ["../core_analysis/rust_port.rq".rust_crate_layout]. Extractor ports ["../../crates/reqlan-index/src/extract.rs"] including [wildcard_reference_edges]. Store ports schema v4 ( ["../../packages/analytical/src/index-store/schema.ts"] ) via rusqlite; diagnostics live in `index-diagnostics.sqlite` on the same engine. Sync keeps [nonblocking_index]: per-file upsert, mtime skip, hard rebuild, cancellable progress. Not the Langium LSP. Comment-file indexing: [index_code_files]. | 0.172 | |
| wildcard_reference_edges | done | Native extract ( `["../../crates/reqlan-index/src/extract.rs"]` ) expands each AST wildcard against the idea catalog ( `match_wildcard` / workspace candidate list ). Persist one edge of kind `wildcard_reference` per matching idea ( label = target idea name ); never emit plain `references` for wildcard forms. Zero matches → one unresolved edge of the same kind ( `isResolved: false`, label = pattern text ). Edge ids use `edgeId(source, 'wildcard_reference', targetOrUnresolvedKey)`. Sync walks sorted `.rq` files and grows the catalog as it goes, so a wildcard file is expanded against ideas already stored plus files earlier in that walk ( ["../../crates/reqlan-index/src/sync.rs"] ). Ancestor / reference-chain walks treat `wildcard_reference` like `references` ( ["../../packages/analytical/src/index-store/sqlite-store.ts"] ). Ideas Summary references table groups them under sub-idea with other idea-to-idea links; graph visibility is [ideas_summary_doc] / ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle]. Soft mtime sync skips unchanged files — after introducing this edge kind, reindex ( or touch ) `.rq` files that contain wildcards so stored rows leave any legacy `references` fan-out. Langium `idea-extractor` keeps the same kind for remaining TS extract paths. Open-file local extract ( [local_symbolic_analysis] ) does not expand wildcards against a catalog. Related: ["../language/imports.rq".wildcard_references], [index], [indexer_rust], ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle], [local_symbolic_analysis]. | 0.353 | |
| import_keywords | The keywords import, from, and as are reserved for import statements. Import keywords may also appear as ordinary words in idea body text when not at statement start. | 0.047 | ||
| wildcard_references | done | Qualified path + idea-pattern references match multiple ideas across files. Surface forms: bracket `[…]` and wikilink `[[…]]` ( same `WildcardReference` target ). Path is a quoted string that may include shell-style globs ( `*`, `**`, `?` ) and `@/` import-root aliases ( [configuration_import_root_alias] ). Relative globs resolve against the defining document directory; `.` / `..` segments are collapsed before matching. Idea pattern is an unquoted `WILDCARD_NAME` that must contain at least one `*` or `?` Exact quoted-path plus idea stays ["./syntax.rq".reference_qualified]. Matching uses anchored globs ( not full JS regex ): path `*` is one segment, `**` crosses segments; idea `*` / `?` match within the idea name. Zero matches produce a warning diagnostic. One match also produces a warning — a wildcard is for many ideas; use a concrete ["./syntax.rq".reference_qualified] when only one idea matches ( ["../core_analysis/check.rq".check_wildcard_one] ). Path segment `/**/` must not be lexed as an empty block comment — see ["./syntax.rq".comments]. Lexer note: `ID` is a prefix of many wildcard names ( `import_` vs `import_*` ); the token builder sets `ID.LONGER_ALT = WILDCARD_NAME` so `import_*` is one token. Body prose `*` tokens are accepted via `WILDCARD_NAME` in PlainText so ordinary `*` characters still parse. Without that longer-alt, a live wildcard inside a block body can fail Idea recovery and leave later top-level ideas unindexed ( soft mtime sync will not rebuild until the `.rq` file changes ). Navigation does not emit N LocationLinks. A document-link click opens `reqlan.openWildcardReference` with `{ pathPattern, ideaPattern, fromUri }` ( see [wildcard_references_webview] ). Go-to-definition does not open that panel. Indexing fans out per ["../indexer/indexer.rq".wildcard_reference_edges] ( owned under ["../indexer/indexer.rq".index] ): native extract writes one `wildcard_reference` edge per catalog match; empty catalog / zero matches → one unresolved edge of that kind labeled with the pattern text. ["../core_analysis/check.rq".check] handles 0 - match and 1 - match fan-out through ["../core_analysis/check.rq".check_wildcard_zero] and ["../core_analysis/check.rq".check_wildcard_one] ( ["../core_analysis/check.rq".check_wildcard_sparse] ). Ideas Summary graph toggles those edges via ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle]. The server can answer `reqlan/wildcardReferenceAt`. Go-to-definition does not call it. Related: ["./syntax.rq".reference_embedding], ["./syntax.rq".reference_brackets], ["./syntax.rq".reference_wikilink], ["../indexer/indexer.rq".wildcard_reference_edges], ["../core_analysis/check.rq".check_wildcard_sparse], ["../core_analysis/check.rq".check_wildcard_zero], ["../core_analysis/check.rq".check_wildcard_one]. Illustrative forms ( fenced so this file does not embed live wildcards ): | 0.486 | |
| idea_reference | done | Idea-to-idea ["./ontology.rq".reference]: bracket `[name]` / `[ideaset.name]` targets a local, imported, or same-file idea. Syntax: ["./language/syntax.rq".reference_brackets], ["./language/syntax.rq".same_file_reference], ["./language/syntax.rq".reference_qualified], ["./language/syntax.rq".reference_embedding], ["./language/syntax.rq".references_to_subidea]. Index edge kind `references` on [analytical_types] / [rust_index_types]. Extract: [idea_extractor], [rust_extract]. A `[ideaset.member]` form records the edge on the member leaf, not on the ideaset container. An attribute uses the same brackets. See ["./language/syntax.rq".attribute_namespacing]. Wikilink surface for the same edge kind: [link_reference]. Fan-out across files: [wildcard_reference]. | 0.125 | |
| wildcard_reference | done | One ["./ontology.rq".reference] that matches many ideas: quoted path glob + idea pattern ( `*` / `?` ). Syntax and navigation: ["./language/imports.rq".wildcard_references], ["./language/imports.rq".wildcard_references_webview]. Index: one `wildcard_reference` edge per catalog match ( ["./indexer/indexer.rq".wildcard_reference_edges] ); never stored as plain `references`. Native extract: ["../crates/reqlan-index/src/extract.rs"]. Sparse match handling: ["./core_analysis/check.rq".check_wildcard_sparse] ( ["./core_analysis/check.rq".check_wildcard_zero], ["./core_analysis/check.rq".check_wildcard_one] ). | 0.279 |
Reference labels
"../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs", "../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs:indexer_and_graphical_graph_rq_capture_wildcard_edge_and_toggle_ideas", "../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:emits_unresolved_edge_when_catalog_has_no_matches", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:expands_wildcard_refs_to_one_edge_per_matching_idea", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:extract_indexed_document_fans_out_edges_for_matching_catalog_ideas", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:imports_rq_extract_includes_webview_and_path_filter_ideas", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:indexer_and_graphical_graph_rq_capture_wildcard_edge_and_toggle_ideas", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:nested_path_glob_matches_catalog_ideas", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_unresolved_wildcard_edge_when_catalog_has_no_matches", "../../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_wildcard_reference_edges", "../crates/reqlan-index/tests/wildcard_reference_edges.rs:emits_unresolved_edge_when_catalog_has_no_matches", "../crates/reqlan-index/tests/wildcard_reference_edges.rs:expands_wildcard_refs_to_one_edge_per_matching_idea", "../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind", "../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_wildcard_reference_edges", ../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs, ../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs:indexer_and_graphical_graph_rq_capture_wildcard_edge_and_toggle_ideas, ../../../../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:emits_unresolved_edge_when_catalog_has_no_matches, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:expands_wildcard_refs_to_one_edge_per_matching_idea, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:extract_indexed_document_fans_out_edges_for_matching_catalog_ideas, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:imports_rq_extract_includes_webview_and_path_filter_ideas, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:indexer_and_graphical_graph_rq_capture_wildcard_edge_and_toggle_ideas, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:nested_path_glob_matches_catalog_ideas, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_unresolved_wildcard_edge_when_catalog_has_no_matches, ../../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_wildcard_reference_edges, ../crates/reqlan-index/tests/wildcard_reference_edges.rs:emits_unresolved_edge_when_catalog_has_no_matches, ../crates/reqlan-index/tests/wildcard_reference_edges.rs:expands_wildcard_refs_to_one_edge_per_matching_idea, ../crates/reqlan-index/tests/wildcard_reference_edges.rs:stores_wildcard_fan_out_as_wildcard_reference_kind, ../crates/reqlan-index/tests/wildcard_reference_edges.rs:sync_persists_wildcard_reference_edges