Referenced by23
Labels20

Referencing ideas

IdeaStatusTagsSummaryKatz
file_searchdoneRank indexed `.rq` files and comment-bearing code files by basename, stem, and path using the same separator-insensitive matching as [fuzzy_search] / [fuzzy_search_whitespace]. Hits use kind `file`; id is the indexed file URI; name is the basename; line start is 0. Empty query does not dump the file catalog. Mixed into [fuzzy_search] so one list ranks ideas and files together. Code files are those persisted by ["../indexer/indexer.rq".index_code_files]. Surfaces: native `fuzzy_search` via [native_workspace_index], ["../extension/local-context/activitybar-panels/search.rq".search_pane_file_hits]. ["../cli/click.rq".click_input] uses this mix when click has no exact match.0.244
fuzzy_searchdoneQuick ranked idea search by name, summary, and tags. Separator and word-order behaviour: [fuzzy_search_whitespace]. Also supports prefix, substring, and character-subsequence ( fuzzy ) ranking. Skips ideaset container rows; empty query returns all non-ideaset ideas ( callers may require a non-empty query ). Ranking engine: ["./rust_port.rq".search_rust] `reqlan-search` ( `fuzzy_search` / `search_ideas` ). Also returns [file_search] hits mixed into the same ranked list ( kind `file` ). Pagination: [fuzzy_search_pages]. Activity-bar search calls [native_workspace_index] `NativeWorkspaceIndex.fuzzySearch` so the host never copies the idea catalog into JS. Client-side highlight helpers stay in [fuzzy_search_impl].0.268
fuzzy_search_pagesdone[fuzzy_search] accepts `offset` + `limit` over the already-ranked mixed idea + file list. `truncated` is true when more hits exist after the returned page ( callers show `{n}+` rather than a full count ). Used by ["../extension/local-context/activitybar-panels/search.rq".search_pane_load_more].0.097
searchSearch over the requirement graph — find ideas by name, body, tags, and related signals. Surfaces: [fuzzy_search], [file_search], [contextual_search], [semantic_search], [katz_search]. Consumed by CLI `reqlan search`, MCP / chat tools, Ideas Summary, and the activity-bar search pane. Rust ranking engine: ["./rust_port.rq".search_rust].0.046
configuration_locationAn optional `.reqlan/config.json` may appear under a base's `.reqlan` directory. For a given `.rq` file, the applying base is the nearest ancestor directory that owns a `.reqlan` folder. The applying config is that base's `.reqlan/config.json` when present. If the owning base has no `config.json`, or no owning base is found, defaults from [configuration_import_roots] apply. A child base does not inherit a parent base's config.0.190
configuration_rqignoredoneEach base may define path ignore rules in `.reqlan/.rqignore` using **gitignore syntax**. Patterns are relative to the base root ( parent of `.reqlan` ), not the `.reqlan` directory. Owned by `@reqlan/analytical` so the CLI, MCP, and extension share one filter for discovery and indexing walks. Built-in defaults always apply ( dependencies, venvs, build output, VCS / editor stores, `*.db3` / sqlite DBs and SQLite sidecars, binary globs per ["../index-host/index.rq".binary_ignore], files that have no comments per ["../index-host/index.rq".commentless_file_ignore], `*.secret.rq`, hidden entries, and `.reqlan/` itself ); the on-disk file adds or overrides via the same syntax, including `!` negation. New bases seed `.reqlan/.rqignore` with those defaults ( ["../index-host/index.rq".rqignore] ). Missing or unreadable `.rqignore` still uses built-in defaults. Location convention: [configuration_location]. Application memory: ["../index-host/index.rq".application_memory].0.223
indexing_trigger_autodoneWhen the editor host is idle, run a **background staleness check** — not a reindex and not a soft full sync UI pass. Philosophy: computationally cheap. Load document mtimes in **one** SQLite read, compare each file's FS mtime in memory, and only then index mismatched or new files; drop deleted docs in one batched delete. A single MAX ( mtime ) watermark is not sufficient ( one file can get newer while another gets older ). If nothing is stale: no state transition, no progress UI, no parse. If some files are stale: index **only those files** under [indexer.nonblocking_index]. Schedule after a quiet period with no index activity; prefer running when the window is unfocused; defer or cancel if the user becomes active again. Extension host only ( [editor_index_adapter] ); CLI / MCP have no idle loop ( they sync on activate / command ).0.113
indexing_trigger_filesaveindexing should be triggered by. rq file create / change / delete via watchers, and by allowlisted source files that may contain comment references.0.106
application_memorydoneBase-local application memory for reqlan tools lives under `<base>/.reqlan/`. The presence of `.reqlan` **marks** a directory as a ["../../bases/base.rq".base]; each base owns its own store. Shared by the VS Code extension, ["../../cli/cli_package.rq".cli_package], and MCP ( [mcp_server] ) — not VS Code `globalStorageUri` / extension-private storage. The ideas graph index ( [indexer.index_ideas] and [indexer.index_technology] ) persists as `ideas-index.sqlite` inside that directory. Schema: ["../../indexer/sqlite-schema.rq".ideas_index_sqlite]. Index timing diagnostics persist separately as `index-diagnostics.sqlite` ( [index_diagnostics_store] / ["./index-diagnostics.rq".index_diagnostics] ) so rebuilds of the ideas index do not wipe history. Click session state persists as `click-sessions.sqlite` ( ["../../cli/click.rq".click_session] ) so agent / CLI click cursors survive ideas-index rebuilds. Diagnostics schema: ["../../indexer/diagnostics-schema.rq".diagnostics_sqlite]. WAL sidecars and JSON siblings: ["../../indexer/sidecars.rq".reqlan_directory_layout]. Export form defaults ( all formats via ["../export/export.rq".export_webview], including HTML options in ["../export/html-export.rq".html_export_form] ) persist as `export_settings.json` in the same directory ( active base ). Path ignore rules live as `.rqignore` in the same directory ( [rqignore] / [configuration.configuration_rqignore] ). Git ignore for SQLite stores lives as `.gitignore` in the same directory ( ["../../bases/base.rq".base_initialisation_ignore] ). Path resolution is owned by [application_memory_impl] ( `resolveApplicationMemoryPath` ); consumers must use it ( or `REQLAN_INDEX_PATH` override for a single store ) so tools read and write the same store for a given base. Multi-base discovery / registry: ["../../bases/base.rq".multi_base_environment]. Index engine ownership: ["../../indexer/indexer.rq".ownership]. Extension wiring: [analytical_submodule]. Aligns with ["../../cli/cli_package.rq".function_parity]: shared analytical memory, not host-only state.0.494
rqignoredone`.reqlan/.rqignore` filters which paths discovery and indexing crawl, using gitignore syntax relative to the base root. Owned by [rqignore_impl] in `@reqlan/analytical` so CLI and editor share behaviour. Defaults cover `node_modules/`, virtualenvs, build dirs ( `bin/`, `generated/`, `out/` ), VCS / editor stores, database files ( `*.db3`, sqlite ) and SQLite sidecars, binary globs ( [binary_ignore] ), `*.html`, secrets, and hidden entries. Walks also skip common files that have no comments ( [commentless_file_ignore] ). New bases seed the file via [rqignore_initialisation]. Product configuration statement: [configuration.configuration_rqignore].0.296
file_crawl_sequencedoneWorkspace crawl is the indexer ( [index], [index_sequencing] ). It is not the open-file path. Native sync walks `.rq` files, then allowlisted code files, and writes SQLite. Open-file links must not wait for that walk ( [open_file_algorithm] ). The language server watches `.rq` files only ( ["./initialisation-and-sequencing.rq".lsp_file_watch] ). Related: [extension_startup_sequence], [background_startup].0.040
open_file_algorithmdoneWhen the editor opens or changes a `.rq` buffer, `reqlan-lsp` runs this sequence. Do not wait for the ideas index. Do not wait for a workspace crawl. Detail: [open_file_sequence_diagram]. Related: [open_file_reference_sequencing], [language_server_rust], [ast_lifecycle], [outbound_one_hop], [open_file_hot_path], [token_colour_sequence], [missing_reference_colour_sequence], [lazy_features_after_outbound]. The hot path finishes before the first diagnostics publish. 1. Parse this buffer once ( [ast_lifecycle] ). 2. Colour tokens from that parse ( [token_colour_sequence] ). 3. Emit same-file links and same-file missing-idea errors from that parse. 4. Parse each imported file once, at depth 1, for idea names and lines ( [outbound_one_hop] ). Link an imported name that exists. Underline an imported name that does not ( [missing_reference_colour_sequence] ). 5. Return. A qualified reference may link to its file from the path token. Do not read that file on this path. After that publish, a background pass fills the rest ( [lazy_features_after_outbound] ). That pass must not delay steps 1 – 5. The server sends the hot publish before it starts that pass. It runs that pass only while no client message waits. A hover or a definition request goes first. A change reuses the import roots loaded at open. It does not read the config again. The node engine keeps [node_engine_open_path].0.330
search_panedoneWorkspace idea search in the activity bar — find rq ideas by name, summary, or tags without leaving the sidebar. Complements the modal from [commands.search_code_actions]; this pane stays open for repeated lookups and inserts. Implemented by [SearchPane] under [CollapsiblePane]; host wire in [activity_bar_webview] / [activity_bar_messages] / [app_state]. [search_pane_query] [search_pane_layout] [search_pane_results] [search_pane_open_live_file] [search_pane_load_more] [search_pane_file_hits] [search_pane_insert_reference] [search_add_to_chat] [search_pane_advanced] [search_pane_empty_query] [search_pane_scoped_status] [search_progress] [search_pane_seed] [search_pane_match_highlighting]0.176
search_pane_file_hitsdone[search_pane] mixes [core_search.file_search] hits ( kind `file` ) into the ranked list with ideas. Click opens the file at line 0. File hits do not offer Insert ref or Pin ( those are idea actions ). Empty-state and placeholder copy mention files.0.115
search_pane_load_moredoneWhen ranked hits exceed the visible page, [search_pane] shows an exceeded-count label ( `40+ matches`, or `{n}+ matches` after further pages ) instead of a full total, and a **Show more** control at the bottom of the list that fetches the next page and appends. A new query resets to the first page. Uses [core_search.fuzzy_search_pages] ( `offset` + `truncated` ).0.095
search_pane_querydone[search_pane] search input posts a debounced host query. Ranking uses [core_search.fuzzy_search] in the native search module ( `NativeWorkspaceIndex.fuzzySearch` ); separator-insensitive `_` / `-` / `...` / whitespace. File-name hits: [search_pane_file_hits] / [core_search.file_search]. Pages: [search_pane_load_more] / [core_search.fuzzy_search_pages]. Highlighting stays in the TS `./fuzzy-search` export.0.063
search_progressdoneActivity-bar search ranks in the native [core_search.fuzzy_search] module ( rusqlite read + score in-process ). The host must not hydrate a JS idea catalog or worker before scoring — return only the capped hit list. A static " Searching … " / " Loading … " label must not be the only signal: the pane should show **live progress** so a slow wait reads as working, not hung. - Host posts progress for the in-flight search request while native scoring runs ( `Scoring ideas…` ). - [SearchPane] displays the phase label with a continuous activity affordance ( spinner / indeterminate bar ) and elapsed time while loading, for both the empty initial wait and the " Updating … " refresh path. - Stale progress from superseded queries must not overwrite a newer request; clear progress when results or a scoped error arrive.0.080
inbound_snapshot_eventsdoneHost → LSP inbound snapshots are event-driven and incremental. Push only when the ideas index is ready ( catalog update, ready-edge, visible-editor change, or window focus ). While Syncing or not ready, do not push an empty batch that clears the language-server last-good map; set a deferred flag and flush on the next ready event. The language client often starts before the index — registration must ensure-open / defer, not skip forever. Each notification is a per-document merge for visible editors; URIs not in the batch stay as last-good until replaced or the document closes. After a single-file enqueue reaches ready, notify catalog so consumers get a ready-state event ( mid-sync catalog notifies alone are not enough ). Coalesce concurrent push work so catalog spam drains to one ready pass. Related: [unify_inbound_indexes], ["../extension/language/support/open-file-sequencing.rq".lazy_features_after_outbound], ["../extension/language/syntax/features-syntax-highlighting.rq".inbound_inlay_index_performance].0.133
index_cache_reusedraftIdentify where the ideas index, diagnostics store, or in-process caches already hold data that other modules recompute. Goal: one walk, one sync, one open store where possible; reuse SQLite edges and mtime maps instead of rebuilding graphs from scratch. Related: [nonblocking_index], [indexing_incrementality], [consumers.index_consumers], [sequencing.index_sequencing].0.164
definitionThe 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
nonblocking_indexdoneIndex sync must stay non-blocking for the host UI ( notably [activity_bar_doc.activity_bar] and [workspace_pane_doc.workspace_loading] ). Editor startup is gated by ["../extension/host/activation.rq".first_paint_startup]; discovering a base must not construct Langium services, which are initialized lazily on the first parse. While syncing, surface progress — state, processed / total, and the current file — in [workspace_pane_doc.workspace_pane] and [ideas_summary_doc.index_panel]. In-flight sync must be cancellable from those surfaces; cancel keeps already-indexed rows and returns the index to ready. Incremental behaviour ( see also [indexing_incrementality] ): - Single-file create / change / delete via watchers indexes only that file — never a full base walk. - Soft full sync ( `syncWorkspace` / Refresh ) skips parse + persist when the file's mtime matches the value stored on the documents row. - Hard refresh ( `clearAndRebuildIndex` / Clear & rebuild ) wipes the store and reindexes every file. - Every sync and stale check applies `.rqignore` to the paths it receives, the same as the base walk; the native single-file index also drops an ignored path. Thus base discovery cannot make the first sync index ignored files. Implemented by [workspace_index]; editor adapter [editor_index_adapter].0.372
idle_stale_checkWhen the editor is idle, use document paths already stored in SQLite ( do not scan the tree ), load mtimes in one SQLite read, compare FS mtimes in memory, and index only mismatched or new files; drop deleted docs in one batch. If nothing is stale: no state transition, no progress UI, no parse. Prefer unfocused windows; cancel if the user becomes active again. Only bases that are already open participate — idle must not reopen every discovered base ( ["../extension/index-host/sqlite-artifact-lifecycle.rq".release_when_idle] ). After the check, release unused SQLite artifacts ( inactive bases always; all bases when unfocused ). Extension host only — see [indexing_trigger_auto]. [index_sequencing]0.075
index_sequencingdoneDescribe when the ideas index starts, updates, and idles, and which trigger owns each pass. Capability aliases live in [triggers] and [idea_index_triggers]. Detail ideas below; keep [nonblocking_index] and [indexing_incrementality] as the UX rules. Related: [consumers.index_consumers], [cache_reuse.index_cache_reuse], [ideas_schema.documents_table], [diagnostics_schema.sync_runs_table].0.179

Reference labels

"../../../../packages/analytical/test/workspace-index.test.ts", "../../../../packages/analytical/test/workspace-index.test.ts:fuzzySearch ranks from the native index without listing all ideas in JS", "../../../../packages/analytical/test/workspace-index.test.ts:fuzzySearch returns file-name hits and pages with offset", "../../../packages/analytical/test/workspace-index.test.ts", "../../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns", "../../packages/analytical/test/workspace-index.test.ts", "../../packages/analytical/test/workspace-index.test.ts:enqueueIndex notifies catalog when ready", "../../packages/analytical/test/workspace-index.test.ts:fuzzySearch ranks from the native index without listing all ideas in JS", "../../packages/analytical/test/workspace-index.test.ts:fuzzySearch returns file-name hits and pages with offset", "../../packages/analytical/test/workspace-index.test.ts:soft sync drops rqignored paths supplied by base discovery", ../../../../packages/analytical/test/workspace-index.test.ts, ../../../../packages/analytical/test/workspace-index.test.ts:fuzzySearch ranks from the native index without listing all ideas in JS, ../../../../packages/analytical/test/workspace-index.test.ts:fuzzySearch returns file-name hits and pages with offset, ../../../packages/analytical/test/workspace-index.test.ts, ../../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns, ../../packages/analytical/test/workspace-index.test.ts, ../../packages/analytical/test/workspace-index.test.ts:enqueueIndex notifies catalog when ready, ../../packages/analytical/test/workspace-index.test.ts:fuzzySearch ranks from the native index without listing all ideas in JS, ../../packages/analytical/test/workspace-index.test.ts:fuzzySearch returns file-name hits and pages with offset, ../../packages/analytical/test/workspace-index.test.ts:soft sync drops rqignored paths supplied by base discovery