Cluster detail
reqlan rq/core_analysis
Ideas located under folder reqlan rq/core_analysis.
folder
90 ideas
6 files
| Idea | File | Status | Summary | Katz |
|---|---|---|---|---|
| check | reqlan rq/core_analysis/check.rq | done | `reqlan check` should run perform the following checks: - ensure all rq [reference] point to real nodes, unless rq ignored with [comment_reference_ignore]. - this tests rqcomments point to real parts of the namespace, that code references exist, and that rq references exists. - report unresolved imports: [check_unresolved_imports]. - report a comment reference with invalid syntax: [code_comment_syntax_errors]. - report a qualified reference whose file is not on disk: [check_qualified_missing_file]. - report a qualified reference whose `.rq` file does not declare the idea: [check_qualified_missing_idea]. - it should really just be a wrapper of the [index] and return the issues ( as a pipe, terminal output, or json ). Issue order: [check_order_by_target]. Sparse wildcards: [check_wildcard_sparse] via flags [check_wildcard_zero] and [check_wildcard_one]. Path globs: [check_glob_patterns]. Skip missing targets: [check_skip_targets] [check_skip_gitignored_targets]. CLI: ["../cli/cli_package.rq".commands]. MCP: ["../extension/agent/skills-and-mcp.rq".mcp_check]. CI: [check_meta_implementation]. Site demo: ["../site/site.rq".broken_links_showcase]. | 1.000 |
| check_glob_patterns | reqlan rq/core_analysis/check.rq | done | [check] accepts more than one `--glob` pattern. Repeat `--glob` for each pattern. A file is in the recursive scan when it matches any glob. One `--glob` selects the same files as one path glob. A reference target that matches no glob is still checked. That target must resolve. [check] does not walk a directory that matches no glob. A positional path can name a file outside the globs. [check] checks that file. A positional path that is a directory outside the globs is not walked. An empty `--glob` value is an error. API: `AnalysisApi.check({ pathGlobs, paths })`. CLI: ["../cli/cli_package.rq".commands]. MCP: ["../extension/agent/skills-and-mcp.rq".mcp_check]. Related: [check] | 0.308 |
| check_meta_implementation | reqlan rq/core_analysis/check.rq | done | [check] is a step in the sequential GitHub CI job after one workspace build. Pull requests use ["../../.github/workflows/ci.yml"]. Main uses the same workflow through ["../../.github/workflows/release.yml"] ( ["../distribution/distribution.rq".ci_gate] ). The job installs workspace packages once ( `pnpm install --frozen-lockfile` ), asserts `@reqlan/*` resolve under `packages/` ( ["../../scripts/assert-workspace-reqlan.mjs"] ), compiles crates and TypeScript, then runs crate tests, `node packages/cli/bin/cli.js check`, and JS / TS tests against that build. Do not install `@reqlan/cli` or other `@reqlan/*` packages from npm. Platform natives in this workspace come from `packages/analytical-native/` via `packageExtensions` in ["../../pnpm-workspace.yaml"], not from the registry. Do not call a global `reqlan` binary. Do not run a second install before check. GitHub and Azure pass `--skip-gitignored-targets` because gitignored files are not in a CI checkout ( [check_skip_gitignored_targets] ). Azure uses the same workspace CLI after its package build on `ext/v*` tags. Related: [check] [check_skip_targets] [check_skip_gitignored_targets] ["../distribution/distribution.rq".ci_gate] | 0.355 |
| check_order_by_target | reqlan rq/core_analysis/check.rq | done | [check] returns issues ordered by the missing [reference] target, not by the source file. Rows that share the same missing idea, comment target, file path, or import target stay together so you can see every site that points at one missing thing. Inside a target group, order by kind, then source file, then line. JSON and pipe keep a flat list in that order. Terminal output uses one heading per missing target. Related: [check] ["../cli/cli_package.rq".commands] | 0.370 |
| check_qualified_missing_file | reqlan rq/core_analysis/check.rq | done | A qualified [reference] names a file and an idea. Example: `["../../../../my/non-existentfile.ts".term]`. [check] reports an error when that file is not on disk. The issue kind is `file_reference`. The label is the resolved file path. A qualified reference to a file that exists is not this error. A same-file idea reference is not this error. The editor already underlines this target. Related: [check] [check_qualified_missing_idea] ["../language/syntax.rq".reference_file] ["../extension/language/syntax/features-syntax-highlighting.rq".unresolved_reference_diagnostics] | 0.211 |
| check_qualified_missing_idea | reqlan rq/core_analysis/check.rq | done | A qualified [reference] names a file and an idea. Example: `["../extension/index-host/graph-analysers.rq".not_an_idea]`. The same rule applies to a namespace alias: `[alias.idea]` ( [import_namespace] ). [check] reports an error when that file is an `.rq` file, the file does not declare the idea, and the file does not bind that name as an import alias. The issue kind is `references`. The label is the missing idea name. A path with no extension means `.rq` first ( [implicit_file_extension] ). A qualified reference to an idea that the `.rq` file declares is not this error. A qualified reference to an import alias bound in that file is not this error. A namespace import binds its `as` name. A from-import or qualified import binds its `as` name, or the idea name when `as` is absent. A from-import of an import alias stays [check_unresolved_imports]. The alias is not an idea. A qualified reference to a code file is not this error. That form uses [check_qualified_missing_file]. A missing file stays [check_qualified_missing_file]. [check] does not also report a missing idea for that file. [comment_reference_ignore] suppresses this error. Related: [check] [check_qualified_missing_file] ["../language/syntax.rq".reference_qualified] | 0.278 |
| check_skip_gitignored_targets | reqlan rq/core_analysis/check.rq | done | [check] omits a file [reference] issue when Git ignore rules ignore the missing target. The analyser function `check_references` takes `skip_gitignored_targets` ( default false ). Match uses the workspace ["../../.gitignore"] and nested `.gitignore` files on the target path. Match uses the resolved path from the workspace root, not the authored path in the source file. Idea references, comment references, and missing imported idea names stay in the issue list. Missing import paths follow the same skip as file references ( [check_unresolved_imports] ). Use this when a referenced file is build output or editor config that git does not store. Examples: `.cursor/` for ["../extension/agent/chat-participant.rq".mcp], and `packages/extension/media/webviews/` for ["../extension/host/onboarding/page-thanks-for-installing.rq".installation_event]. CLI: `--skip-gitignored-targets` ( ["../cli/cli_package.rq".commands] ). API: `AnalysisApi.check({ skipGitignoredTargets })`. CI: ["../../.github/workflows/ci.yml"] and ["../../azure-pipelines.yml"] pass `--skip-gitignored-targets` because a CI checkout does not contain gitignored files ( [check_meta_implementation] ). Related: [check] [check_skip_targets] [check_unresolved_imports] [check_meta_implementation] | 0.445 |
| check_skip_targets | reqlan rq/core_analysis/check.rq | done | [check] omits an issue when the missing [reference] target matches a skip glob. The analyser function `check_references` takes `skip_targets`: a list of globs. Match uses the same path glob rules as `--glob`. Match is against the issue `label` ( the missing target ), not the source file. An empty skip glob has no effect. Use this when a referenced file is not in git and you name the skip glob. For all Git ignore rules, use [check_skip_gitignored_targets]. CLI: repeatable `--skip-target <glob>` ( ["../cli/cli_package.rq".commands] ). API: `AnalysisApi.check({ skipTargets })`. Related: [check] [check_skip_gitignored_targets] [check_meta_implementation] | 0.445 |
| check_unresolved_imports | reqlan rq/core_analysis/check.rq | done | [check] reports an error when an import does not resolve. A missing import path is an error. A named imported idea that is not in the target file is an error. Do not report imported idea names when the path is missing. An existing folder is a valid import path ( [import_folder_targets] ). A remote URL is not a missing path. Import paths with no extension mean `.rq` first ( [implicit_file_extension] ). Ignore a site with [comment_reference_ignore]. Issue kind is `import`. The `label` is the missing path or the missing idea name. Forms: [import_from], [import_namespace], [import_qualified]. Editor underline: [import_does_not_exist_error]. [check_skip_targets] matches that label. [check_skip_gitignored_targets] omits a missing import path that Git ignore rules ignore. Related: [check] [check_order_by_target] [import_does_not_exist_error] | 0.425 |
| check_wildcard_one | reqlan rq/core_analysis/check.rq | done | `check_references` flag `wildcard_one` ( default `warn` ) controls a ["../reference_types.rq".wildcard_reference] that matches exactly 1 idea. 1 match means the pattern is too narrow — use a concrete [reference] instead. `warn` — emit the row with severity `warning` and match count 1. `error` — emit the row with severity `error` and match count 1. `off` — omit the row. CLI: `--wildcard-one <warn|error|off>` ( ["../cli/cli_package.rq".commands] ). API: `AnalysisApi.check({ wildcardOne })`. Related: [check] [check_wildcard_sparse] [check_wildcard_zero] ["../language/imports.rq".wildcard_references] | 0.507 |
| check_wildcard_sparse | reqlan rq/core_analysis/check.rq | done | A ["../reference_types.rq".wildcard_reference] is for many matches. [check] recounts each wildcard against the full idea catalog, not the stored edges, so files that the indexer visited first still get the true match count. How 0 - match and 1 - match rows are handled is controlled by [check_wildcard_zero] and [check_wildcard_one] ( both default `warn` ). Ignore a site with [comment_reference_ignore]. The language server already warns when a wildcard matches nothing ( ["../language/imports.rq".wildcard_references] ); it also warns when the match count is 1. Related: [check] ["../language/imports.rq".wildcard_references] | 0.417 |
| check_wildcard_zero | reqlan rq/core_analysis/check.rq | done | `check_references` flag `wildcard_zero` ( default `warn` ) controls a ["../reference_types.rq".wildcard_reference] that matches 0 ideas. 0 matches means the pattern hits nothing. `warn` — emit the row with severity `warning` and match count 0. `error` — emit the row with severity `error` and match count 0. `off` — omit the row. CLI: `--wildcard-zero <warn|error|off>` ( ["../cli/cli_package.rq".commands] ). API: `AnalysisApi.check({ wildcardZero })`. Related: [check] [check_wildcard_sparse] [check_wildcard_one] | 0.507 |
| code_comment_syntax_errors | reqlan rq/core_analysis/check.rq | done | A comment reference uses `rq:[idea]` or `rq:["path".idea]`. A path string uses double quotes or single quotes. A qualified reference may use dotted idea names after the path. Line comments use `//` and `#`. The same forms apply in every comment span that the indexer reads. [check] reads each comment reference in a non- `.rq` source file. A comment reference with invalid syntax is a syntax error. [check] reports the syntax error. The issue kind is `comment_syntax`. The issue label is the error reason and the comment reference text. The issue severity is `error`. A valid comment reference stays a ["../language/syntax.rq".comment_reference] site. An unresolved valid target stays a `comment_link` issue. A source file that contains only a syntax error stays in the code index. [comment_reference_ignore] suppresses the syntax error on the next line. Related: [check] ["../extension/language/comment-references/functional-code-comment-references.rq".references_in_functional_code_comments] | 0.174 |
| analysers | reqlan rq/core_analysis/core.rq | Queries over [index]: list, file-related, local graph, completion, deprecation, git dates, [test_references]. [graph_analysers] | 0.078 | |
| analysis_scope | reqlan rq/core_analysis/core.rq | `@reqlan/analytical` — shared index + analysis API. Hosts: CLI, [extension], MCP. Native rewrite: [rust_port.analytical_rust_port]. [parse] [index] [search] [export] [analysers] [runtime] | 0.087 | |
| check | reqlan rq/core_analysis/core.rq | reqlan check is a analysis tool surfaced by the cli. Intended for use in CI. see ["./check.rq".check] ["./check.rq".check_order_by_target] ["./check.rq".check_wildcard_sparse] ["./check.rq".check_wildcard_zero] ["./check.rq".check_wildcard_one] ["./check.rq".check_skip_targets] ["./check.rq".check_skip_gitignored_targets] ["./check.rq".check_meta_implementation] | 0.040 | |
| consumption_silence | reqlan rq/core_analysis/core.rq | done | Hosts that consume the native core ( and helper CLI tools such as `git` / `node` ) must not open a visible console window. On Windows, a GUI editor host that spawns a console-subsystem process without `CREATE_NO_WINDOW` / `windowsHide` flashes a CLI window. Git-dates fill in the core engine and Activity Bar git history were the repeating flashes after `.rq` change; the language-server Node probe can flash once at start on old hosts. Index parse itself stays in-process ( napi `.node` / `.dll` ) and does not spawn a console. Related: ["../indexer/indexer.rq".git_dates], ["../extension/index-host/git-codelens.rq".git_dates_background_indexing], ["../extension/index-host/git-codelens.rq".git_dates_rate_cap], ["../extension/local-context/context-scope.rq".git_context], ["../extension/index-host/index.rq".git_information_capture]. | 0.131 |
| export | reqlan rq/core_analysis/core.rq | Snapshot → html / md / json / csv. [export_doc.export_pipeline] [html_export.html_export] | 0.051 | |
| index | reqlan rq/core_analysis/core.rq | Ideas / edges → SQLite ( `<base>/.reqlan` ). [indexer.index] | 0.331 | |
| modules | reqlan rq/core_analysis/core.rq | Ideaset (modules) | 0.040 | |
| parse | reqlan rq/core_analysis/core.rq | Lex + parse `.rq` for the index path ( not LSP ). [parser_lexer] → extract in [index]. | 0.051 | |
| runtime | reqlan rq/core_analysis/core.rq | Headless facade: `createAnalysisRuntime` / `AnalysisApi`. [core_arch.analysis_runtime] | 0.078 | |
| search | reqlan rq/core_analysis/core.rq | Rank ideas: fuzzy, contextual, semantic. [search_doc.search] | 0.051 | |
| test_references | reqlan rq/core_analysis/core.rq | done | The indexer lists broken references in a [index] base. A broken reference is an unresolved idea or wildcard reference. You can give an optional path glob so that the list covers only a subset of the base. You can optionally include unresolved [comment_reference] sites. The function is in the core analysis module. The CLI exposes it on [commands] ( `analyse --broken-refs` ). Related: [analysers] [runtime] [indexer.index_code_files] ["../language/syntax.rq".comment_reference_resolution_error] | 0.201 |
| csv_export | reqlan rq/core_analysis/export.rq | done | CSV export writes `ideas.csv` with tags and non-status / tag attributes flattened into columns ( `attr:<key>` ), plus `references.csv` for inbound / outbound / unresolved edges. Shared base / scope / output / name and file filters apply. Pipeline: `exportCsv` / `writeCsvExport` ( [export_pipeline] ). Extension UI host: ["../extension/export/export.rq".export_webview]. | 0.055 |
| export_pipeline | reqlan rq/core_analysis/export.rq | done | `@reqlan/analytical` owns export execution for every format. Shared contract: `ExportRequest` / progress callbacks / snapshot build, then format writers. Hosts ( extension webview, CLI ) assemble an `ExportRequest` and call `NativeAnalysisApi.exportHtml` / `exportMarkdown` / `exportJson` / `exportCsv` — they do not reimplement writers. Formats: ["./html_export.rq".html_export], [markdown_export], [json_export], [csv_export], [pdf_export]. Progress phases ( snapshot, then write completed / total ) are reported to hosts for loading UI. Consumed under [analysis_scope]. Rust port of snapshot + writers: ["./rust_port.rq".export_rust]. | 0.114 |
| json_export | reqlan rq/core_analysis/export.rq | done | JSON export writes `export.json` for the selected base: ideas ( with attributes and reference lists ), files, clusters, attributes, and status / tag rollups — suitable for tooling and AI consumption. Shared base / scope / output / name and file filters apply. Pipeline: `exportJson` / `writeJsonExport` ( [export_pipeline] ). Extension UI host: ["../extension/export/export.rq".export_webview]. | 0.055 |
| markdown_export | reqlan rq/core_analysis/export.rq | done | Markdown export writes a `README.md` index for the selected base ( counts, status / tag rollups, idea list, file list ) and optional per-idea `.md` pages under `ideas/` with attributes and inbound / outbound references as relative markdown links. When per-idea pages are disabled, idea bodies are inlined in the README. Shared base / scope / output / name and file filters apply; HTML-only page families ( graph, clusters, attributes, print ) are omitted. Pipeline: `exportMarkdown` / `writeMarkdownExport` using the same snapshot builder as HTML ( [export_pipeline] ). Extension UI host: ["../extension/export/export.rq".export_webview]. | 0.055 |
| pdf_export | reqlan rq/core_analysis/export.rq | partial | PDF export prepares a print-oriented HTML report from the selected base so the user can Print → Save as PDF in the browser. Direct PDF binary rendering is not required yet; preserve links in the printable HTML ( ["./html_export.rq".html_export_printable_pages] ). PDF-specific options include file filters and print entry filename; shared base / scope / output / name apply. Extension UI host: ["../extension/export/export.rq".export_webview] ( not a separate QuickPick chain ). | 0.073 |
| html_export | reqlan rq/core_analysis/html_export.rq | done | `@reqlan/analytical` builds documentation as HTML from the requirement graph ( ["./export.rq".export_pipeline], [analysis_scope] ). Html export should render ideas, attributes, references, and navigable structure suitable for sharing. Pipeline: `NativeAnalysisApi.exportHtml` / `AnalysisRuntime.export` → `reqlan-export` snapshot ( `build_export_snapshot` ) → multi-file static site ( `write_html_export` ). Single-file mode remains optional via [html_export_runtime_modes]. Interactive graph / search JS stays bundled static assets ( [html_export_graph_layout] ), not a second writer ( ["./rust_port.rq".export_rust] ). Thin hosts: extension UI ( ["../extension/export/export.rq".export_webview], ["../extension/export/html-export.rq".html_export_form], ["../extension/export/export.rq".export_html] ) and CLI ( `reqlan export` / ["../cli/cli_package.rq".commands] ). Export is scoped to a selected ["../bases/base.rq".base] ( not a merged multi-base workspace graph ). [html_export_multi_file] [html_export_internal_links] [html_export_idea_tooltips] [html_export_layout_cards] [html_export_heading_tooltips] [html_export_table_columns] [html_export_search] [html_export_list_views] [html_export_overview_links] [html_export_idea_pages] [html_export_file_pages] [html_export_code_reference_pages] [html_export_cluster_pages] [html_export_graph_page] [html_export_attributes_index] [html_export_attribute_pages] [html_export_printable_pages] [html_export_print_idea_cards] [html_export_print_body_whitespace] [html_export_print_in_page_anchors] [html_export_print_all_attributes] [html_export_print_button] [html_export_print_order_by] [html_export_runtime_modes] [html_export_scrollable_lists] [html_export_header_link] [html_export_url_base] [html_export_katz_column] | 0.201 |
| html_export_attribute_pages | reqlan rq/core_analysis/html_export.rq | Html export should generate a dedicated page per attribute key used in the export scope. Attribute pages should show a distribution of distinct values ( counts and share of ideas ), and a searchable full list of ideas that declare the attribute with their values for that key. Emission defaults on and is controllable via includeAttributePages so this page family can be flagged in or out without changing the export pipeline shape. The attributes index, idea attribute tables, and search results should link to these pages when enabled. | 0.078 | |
| html_export_attributes_index | reqlan rq/core_analysis/html_export.rq | Html export should provide a searchable attributes index page listing every attribute key used in the export scope. Each attribute entry should summarize distinct values and idea counts, and link to the dedicated attribute page when [html_export_attribute_pages] is enabled. | 0.089 | |
| html_export_cluster_pages | reqlan rq/core_analysis/html_export.rq | Html export should support cluster pages that group related ideas. Deterministic clusters should at least include file, folder, tag, and status groupings. Optional computed clusters should use graph or semantic analysis when available without making export correctness depend on them. | 0.080 | |
| html_export_code_reference_pages | reqlan rq/core_analysis/html_export.rq | Html export should generate dedicated pages for outbound file_reference targets and inbound comment_link code files that are not idea-hosting reqlan files already covered by [html_export_file_pages]. Code-file pages should list referencing ideas and reference labels, and participate in search and navigation. Emission defaults on and is controllable via includeCodeFilePages so this page family can be flagged in or out later. Outbound reference path cells and graph external file nodes should link to these pages when enabled. Comment-linked files: ["../indexer/indexer.rq".index_code_files]. | 0.151 | |
| html_export_file_pages | reqlan rq/core_analysis/html_export.rq | Html export should generate dedicated pages for reqlan source files that host ideas in the export scope. File pages should list hosted ideas, related clusters, and a local graph view when available. Emission defaults on and is controllable via includeFilePages so page families can be flagged in or out without changing the export pipeline shape. Graph nodes and idea source-file links for hosting files should resolve to these pages when enabled. | 0.119 | |
| html_export_graph_animation | reqlan rq/core_analysis/html_export.rq | Live physics in the HTML export should match Ideas Summary animatePhysics: continuous damped semi-implicit Euler using the defaults from ["../../packages/extension/webviews/shared/graph/physics-core.js"] ( same module as ["../../packages/extension/webviews/shared/graph/graph-physics.ts"] ), inlined in ["../../crates/reqlan-export/assets/app.js"]. A Live physics toggle pauses and resumes the same simulation state ( default off ); when off, the graph batch-settles then sleeps. Batch settle must remain responsive per [html_export_graph_background_load] — yield between chunks rather than freezing the page for large graphs. Simulation should converge and sleep when calm, waking on filter changes or when Live physics is turned back on, aligned with [layout_physics]. Large graphs use a spatial grid + repulsion cutoff in the shared core; all nodes and full labels remain visible. | 0.093 | |
| html_export_graph_background_load | reqlan rq/core_analysis/html_export.rq | done | Interactive HTML export graph boot and layout settle must not monopolise the main thread on large graphs. Page chrome ( nav, filters, search, other controls ) should stay responsive while the graph initialises. Graph wiring should start after the first paint / idle opportunity rather than synchronously blocking `DOMContentLoaded`. When Live physics is off, the initial batch settle should run in yielded chunks ( animation frames or idle callbacks ) so the browser can paint and handle input between steps; keep the boot spinner until the first usable canvas frame, then show progressive settle status. A new filter / refresh or remount must cancel any in-flight background settle before starting another. Cross-refs [html_export_graph_page], [html_export_graph_animation], [html_export_graph_interaction]. | 0.093 |
| html_export_graph_interaction | reqlan rq/core_analysis/html_export.rq | The interactive export graph should support dragging nodes and panning or zooming the viewport, aligned with [view_controls] and [manual_reframe]. Click-through to idea pages must remain available after drag via click-versus-drag discrimination. A Fit control should reframe the viewport to the current node set without restarting layout or clearing live physics state. Zoom and Fit must continuously drive [graph_label_auto] / [html_export_graph_label_auto] opacity when Labels is in auto mode. When ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] is compound: file bounding boxes are hittable — drag moves member nodes together; clicking the underlined title navigates to the hosting file page ( when `hostFilePageUrl` / `pageUrl` is present ). When linked: synthetic file ideaset nodes are dragged and clicked like other leaves. Related: ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle], ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".webview_export_graph_parity]. | 0.085 | |
| html_export_graph_label_auto | reqlan rq/core_analysis/html_export.rq | done | Export-surface wiring for [graph_label_auto]: canvas paint applies continuous zoom opacity ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ); hover / drag stays fully opaque. Labels stay fully invisible while the graph is initialising or batch-settling so text paint does not lag those phases; zoom fade applies only after settle completes. Zoom and Fit from [html_export_graph_interaction] / [manual_reframe] update opacity each paint. | 0.081 |
| html_export_graph_label_modes | reqlan rq/core_analysis/html_export.rq | done | Export-surface wiring for [graph_label_modes]: Labels control on every interactive export graph cycles auto / on / off; Reset restores auto. | 0.070 |
| html_export_graph_labels | reqlan rq/core_analysis/html_export.rq | HTML export canvas graphs implement shared [graph_labels] ( full names, no ellipsis truncation ). [html_export_graph_label_modes] [html_export_graph_label_auto] | 0.062 | |
| html_export_graph_layout | reqlan rq/core_analysis/html_export.rq | The interactive export graph should lay out nodes so labels and circles do not heavily overlap. Initial placement should settle with the same Obsidian-style force model as [layout_physics] ( central gravity, edge springs, inverse-square repulsion ). Rendering uses canvas 2 d ( not SVG DOM ) with shared physics from ["../../packages/extension/webviews/shared/graph/physics-core.js"], inlined into the export asset ["../../crates/reqlan-export/assets/app.js"]. | 0.121 | |
| html_export_graph_links | reqlan rq/core_analysis/html_export.rq | Graph node hrefs must resolve to idea pages from every export page depth, including nested idea, file, and cluster pages. Node urls should be export-root-relative so path segments such as ideas / are not dropped when resolving from nested pages. When [html_export_url_base] is set, runtime resolution of those urls must honour the mount prefix ( same contract as page and asset hrefs ). External file nodes should resolve to [html_export_file_pages] or [html_export_code_reference_pages] when those page families are enabled. Hosting-file linked nodes ( ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] linked mode ) prefer `hostFilePageUrl` stamped during graph URL enrichment ( file / code-file page for the idea's `fileUri` ), falling back to a member idea `pageUrl` when file pages are disabled. | 0.117 | |
| html_export_graph_metadata | reqlan rq/core_analysis/html_export.rq | Graph nodes in the HTML export should surface tags, status, and attribute keys on or beside the node, not only as filter inputs. Attribute values declared on the idea should be reachable from the graph via the idea page and on-node attribute key summary. | 0.062 | |
| html_export_graph_page | reqlan rq/core_analysis/html_export.rq | Html export should provide an interactive graph page with search, filters, and links back into idea and cluster pages. The graph should support scoped views for workspace, file, cluster, and idea contexts. The workspace graph page must include every idea in the export scope — blocks, oneliners, and ideasets — and must not apply the interactive Ideas Summary GRAPH_MAX_NODES budget. Ideasets are visible by default with a Hide ideasets / Show ideasets toggle, matching the external-file visibility control ( explicit AST ideasets only — distinct from hosting-file treatment ). Hosting `.rq` files ( implicit ideasets ) use a Files `<select>` — hidden / compound / linked — with option tooltips, per ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".file_treatment_toggle] ( parity with Ideas Summary ). Compound mode draws hittable / draggable bounding boxes with clickable titles; linked mode adds synthetic ideaset nodes that navigate via `hostFilePageUrl` / `pageUrl`. Wildcard fan-out edges ( `wildcard_reference` ) are visible by default with a " Wildcard refs " chip ( same label / default as Ideas Summary ); turning it off client-filters those edges and draws them dotted when on — see ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".wildcard_refs_toggle] and ["../extension/workspace-summary/ideas_summary/graphical_graph.rq".webview_export_graph_parity]. Status and tag filters are multi-select and distinguish [graph_status_tag_filters]. Per-idea, per-file, and per-cluster neighbourhood graphs may still use a capped budget for focused pages. [html_export_graph_links] [html_export_graph_layout] [html_export_graph_animation] [html_export_graph_background_load] [html_export_graph_subject] [html_export_graph_labels] [html_export_graph_label_modes] [html_export_graph_label_auto] [html_export_graph_interaction] [html_export_graph_metadata] | 0.165 | |
| html_export_graph_subject | reqlan rq/core_analysis/html_export.rq | When a graph view has a subject or center idea, that node should be visually distinct from peers and externals. Subject styling should use the brand rust accent against cyan peer nodes. | 0.062 | |
| html_export_header_link | reqlan rq/core_analysis/html_export.rq | done | Html export should accept an optional header link ( href + label ) rendered in the topbar ahead of section navigation. Hosts such as the marketing site build can set this so readers can return to the parent site from any exported page. When omitted, the topbar shows only the export section nav. Site embed consumption: ["../site/site.rq".spec_html_export]. Often paired with [html_export_url_base] when the export is mounted under a parent static site. | 0.222 |
| html_export_heading_tooltips | reqlan rq/core_analysis/html_export.rq | done | Section headings on layout panels show a short descriptive tip via the styled tooltip panel when pointer or keyboard focus rests on the heading. Entity-card title headings tip with that card's short summary text. Idea title headings tip with the idea summary when present. Heading tips must not use the browser title text. Reuses the tooltip surface from [html_export_idea_tooltips]. Cross-refs [html_export_layout_cards]. | 0.092 |
| html_export_idea_pages | reqlan rq/core_analysis/html_export.rq | Html export should generate a dedicated page per idea. Idea pages should include summary, attributes, inbound references, outbound references, nearby context, and links to related ideas, files, clusters, graph views, and printable forms. Status and tags are nullable attributes: render them only when present. | 0.081 | |
| html_export_idea_tooltips | reqlan rq/core_analysis/html_export.rq | done | A link to an idea must show a tooltip when the pointer or keyboard focus rests on the link. The tooltip must show the idea name, the source file, and the idea body text. The tooltip must show the status when the idea has a status. The tooltip must be a styled panel. The tooltip must not use the browser title text. The tooltip must stay inside the viewport. An unresolved reference must not show an idea tooltip. Section and card heading tips follow [html_export_heading_tooltips]. | 0.099 |
| html_export_ideas_ref_columns | reqlan rq/core_analysis/html_export.rq | done | The ideas index table shows inbound reference counts and outbound reference counts in two columns. The first count column is In. The second count column is Out. Each cell shows one integer. Each column has its own header sort and column filter. Filter keys are `in` and `out`. | 0.056 |
| html_export_internal_links | reqlan rq/core_analysis/html_export.rq | Every exported idea should have a stable html page path and stable in-page anchors. References, breadcrumbs, search results, graph nodes, cluster members, attribute listings, file listings, and code-file listings should link to html pages rather than only showing text labels. Overview status / tag rollups and list-table facet cells follow [html_export_overview_links]. On the printable report, same-page idea links use those in-page anchors per [html_export_print_in_page_anchors]. Graph node links must follow [html_export_graph_links]. When [html_export_url_base] is set, those same links must be root-relative under the mount prefix so static hosts resolve them with or without a trailing slash. A link `[idea.attribute]` opens that attribute on the idea page. See ["../language/syntax.rq".attribute_namespacing]. A link to an idea shows that idea's body in a tooltip per [html_export_idea_tooltips]. | 0.152 | |
| html_export_katz_column | reqlan rq/core_analysis/html_export.rq | done | HTML export shows the inbound Katz score ( ["../modelling/advanced_analysis.rq".katz_centrality] ) for each idea. The ideas index adds a Katz column after Out. File idea tables, code-file idea tables, cluster member tables, and attribute idea tables add a Katz column. The printable file sheet, code-file sheet, and cluster sheet add the same column. The idea page and the printable idea sheet show the same score as a metric. The cell text uses 3 decimal places. The sort value is the full score. The filter key is `katz`. File, cluster, and attribute index tables do not show this column. | 0.075 |
| html_export_layout_cards | reqlan rq/core_analysis/html_export.rq | done | In interactive runtime mode, detail-page panels ( panel, table-shell, graph-shell ) and entity-card tiles are drag-reorderable within their layout group and collapsible. In interactive mode, cards that are direct children of a page layout group and use panel, table-shell, or graph-shell chrome are width-resizable by column span. Entity-card tiles inside an entity-list layout group are drag-reorderable and collapsible, but they are not width-resizable. Column hide and column width on tables stay separate from card width. Width-resizable cards sit in a responsive multi-column grid and snap to column spans so a card can take one column, several columns, or the full row. Double-click on the card width handle fills the row. A second double-click restores the last non-full span. Collapsed cards ignore fill. Narrow viewports collapse spans so cards stack without horizontal overflow. The full card header is the drag handle. Links, buttons, and inputs in the header still activate on click. The collapse caret stays hidden until the card is hovered or has focus within. Collapse hides the card body and shrinks the card chrome so the layout does not keep empty body space. Card-width and header drag must not lose control to text selection: pointer capture, select lock, and preventDefault on resize pointerdown. Order, collapse, column-span, and fill-restore state persist in localStorage for that page path. Document and print runtime modes keep a static layout with no rearrange, resize, or collapse behaviour. Printable-report idea cards stay outside this idea ( [html_export_print_idea_cards], [html_export_print_order_by] ). Table column chrome follows [html_export_table_columns]. Cross-refs [html_export_runtime_modes], [html_export_heading_tooltips]. | 0.092 |
| html_export_list_views | reqlan rq/core_analysis/html_export.rq | Html export should provide searchable list views for ideas, files, code files, references, clusters, and attributes. List views should preserve the usability of the current ideas summary tables with counts, sorting, filters, and quick navigation. Every interactive table column should be sortable by header click and filterable with a per-column filter, in addition to any page-level search bar. Navigable facet cells in those tables ( status, tags, paths, attribute values, cluster labels / kinds ) should be links to the matching detail page or to a list page with the matching column filter applied via [html_export_overview_links]. Long lists that sit above other page content follow [html_export_scrollable_lists]. The ideas index count columns follow [html_export_ideas_ref_columns]. Column hide, resize, and selector chrome follow [html_export_table_columns]. [html_export_ideas_ref_columns] [html_export_table_columns] [html_export_attributes_index] [html_export_file_pages] [html_export_code_reference_pages] [html_export_scrollable_lists] [html_export_overview_links] | 0.121 | |
| html_export_multi_file | reqlan rq/core_analysis/html_export.rq | Html export should generate a multi-file static site rather than a single document. The export should include page families for overview, ideas, files, code files, clusters, attributes, graph, data, and print-focused pages. | 0.067 | |
| html_export_overview_links | reqlan rq/core_analysis/html_export.rq | done | The interactive overview page status rollup, tags rollup, and highlighted clusters must be interactive navigation, not plain labels. Status and tag rollup entries should open the matching status / tag cluster page when [html_export_cluster_pages] is enabled; otherwise they should open the ideas list with the Status or Tags column filter seeded from the rollup key. Highlighted clusters should open the matching cluster page ( or the clusters index when cluster pages are disabled ). List pages must honour URL query parameters that seed per-column filters ( for example `ideas.html?status=todo` or `ideas.html?tags=export` ) so overview and in-table facet links land with the filter already applied. Query keys match stable `data-filter-key` values on table headers; filter values use the same display labels as the rollup ( including Not present / Empty ). Cross-refs [html_export_list_views], [html_export_cluster_pages], [html_export_internal_links]. | 0.103 |
| html_export_print_all_attributes | reqlan rq/core_analysis/html_export.rq | done | Printable report idea cards and per-idea printable sheets must show every declared attribute for the idea, not only status ( or status + tags ). Attribute values that contain idea refs follow the link rules of the hosting print surface ( [html_export_print_in_page_anchors] on the report page ). Cross-refs [html_export_printable_pages], [html_export_idea_pages]. | 0.110 |
| html_export_print_body_whitespace | reqlan rq/core_analysis/html_export.rq | done | The printable report must show the idea body text that the parser stores. Each per-idea printable sheet must show the stored idea body text. The parser removes the base indent. The base indent is the indent of the first body line. Extra indent on a later line is part of the body text. A later line with 4 more spaces than the first body line is stored with those 4 spaces. Print HTML must keep those leading spaces. Print HTML must not collapse those spaces. The body text must still wrap inside the card width. Cross-refs [html_export_printable_pages], [html_export_print_idea_cards]. | 0.110 |
| html_export_print_button | reqlan rq/core_analysis/html_export.rq | done | Printable report and printable idea sheets include a Print control that opens the browser print dialog ( `window.print` ). The control must work without the interactive javascript bundle ( inline handler is acceptable ) and should be hidden in the printed output. Cross-refs [html_export_printable_pages]. | 0.090 |
| html_export_print_idea_cards | reqlan rq/core_analysis/html_export.rq | done | The printable report page lists ideas as cards in a single column that must remain within the page width on narrow viewports — no horizontal spill from long summaries, file paths, refs, or attribute values. Cards use a one-column grid ( `minmax(0, 1fr)` ) and wrapping / overflow rules so content reflows instead of overflowing the layout. Stored idea body spaces on these cards follow [html_export_print_body_whitespace]. Cross-refs [html_export_printable_pages], [html_export_print_in_page_anchors], [html_export_print_all_attributes]. | 0.153 |
| html_export_print_in_page_anchors | reqlan rq/core_analysis/html_export.rq | done | On the printable report page, each idea card has a stable html `id` derived from the idea identity. Cross-idea links rendered on that page ( title links and inline idea refs in summaries / attributes ) must resolve to same-page `#` fragment urls targeting those ids, not separate idea detail pages. When browsed with the sticky site topbar, fragment navigation must leave the target card fully visible below the header ( scroll padding / scroll-margin ), not clipped behind it. Aligns with stable in-page anchors in [html_export_internal_links]. Cross-refs [html_export_printable_pages], [html_export_print_idea_cards]. | 0.145 |
| html_export_print_order_by | reqlan rq/core_analysis/html_export.rq | todo | The printable report should support ordering idea cards by a chosen field or attribute ( for example name, status, file path, or a custom attribute key ). Consumers should be able to select or configure the sort so printed documents follow a deliberate sequence rather than only the default export order. Not implemented yet — tracked for a follow-up. Cross-refs [html_export_printable_pages], [html_export_print_idea_cards]. | 0.120 |
| html_export_printable_pages | reqlan rq/core_analysis/html_export.rq | Html export should provide static printable pages alongside the interactive site. Print pages should not depend on the interactive javascript bundle. Status and tags are nullable: when absent, printable sheets must omit those fields rather than inventing placeholders such as unspecified or empty dashes. When print pages are browsed in interactive runtime mode, long lists with content below them follow [html_export_scrollable_lists]. Idea cards on the printable report follow [html_export_print_idea_cards], [html_export_print_in_page_anchors], [html_export_print_all_attributes], and [html_export_print_button]. Stored idea body spaces on print pages follow [html_export_print_body_whitespace]. Ordering of cards on the printable report is tracked by [html_export_print_order_by]. | 0.174 | |
| html_export_runtime_modes | reqlan rq/core_analysis/html_export.rq | Html export should support a richer interactive site mode and a leaner document or print-oriented mode from the same export manifest. Template identifiers should select real rendering behavior rather than metadata only. Scrollable list viewports from [html_export_scrollable_lists] apply only in interactive mode; document and print modes keep full-length lists. | 0.079 | |
| html_export_scrollable_lists | reqlan rq/core_analysis/html_export.rq | In interactive runtime mode, long list and table sections that have additional content below them should render inside a scrollable viewport with a max height so lower sections remain reachable without endless page scrolling. Toolbar titles and filters for those sections should stay outside the scroll viewport. In document and print runtime modes, those same lists should expand to their full natural height so the export remains readable as a continuous document and suitable for printing. Browser print of interactive pages should also expand constrained lists to full height. | 0.117 | |
| html_export_search | reqlan rq/core_analysis/html_export.rq | The interactive html export should provide a global search bar and page-local search bars. Search should work offline from generated data bundled with the export. Attribute keys and values should be searchable alongside ideas, files, code files, and clusters. | 0.067 | |
| html_export_table_columns | reqlan rq/core_analysis/html_export.rq | done | In interactive runtime mode, tables inside layout cards let the user hide and resize columns. An eye control on each column header toggles that column. The eye shows when the header cell is hovered or focused. A column-selector control in the table card header opens a multiselect panel with search, select all, clear, and shift-click range selection. Column resize must not lose control to text selection: pointer capture, select lock, and a resize handle above selectable header text. Hidden columns and column widths persist in localStorage for that page path and table. Document and print runtime modes keep all columns visible at default widths with no column chrome. Cross-refs [html_export_layout_cards], [html_export_list_views]. | 0.095 |
| html_export_url_base | reqlan rq/core_analysis/html_export.rq | done | Html export should accept an optional urlBase mount prefix ( for example `/spec` or `/reqlan/spec` ). When set, page and asset hrefs must be root-relative under that prefix so static hosts resolve correctly whether the directory URL includes a trailing slash. When omitted, exports keep document-relative hrefs suitable for local folder browsing. Applies across [html_export_internal_links] and [html_export_graph_links]; site embed consumption: ["../site/site.rq".spec_html_export]. Often paired with [html_export_header_link] when the export is mounted under a parent static site. | 0.259 |
| analytical_rust_port | reqlan rq/core_analysis/rust_port.rq | in-progress | Port ["../core-architecture.rq".analytical_package] to Rust: lexer, parser ( index path ), extractor, SQLite index, search, and export. `@reqlan/analytical` remains the published JS facade ( `createAnalysisRuntime` / `AnalysisApi` / Zustand host state ). Native work lives in a `crates/` Cargo workspace and ships as per-architecture binaries per [distribution.rust_binary_distribution]. The editor language server is [lsp_rust.language_server_rust]. This analytical port does not replace that process. Component plans: [rust_crate_layout], [lexer_rust], [parser_rust], [parser_align], [indexer.indexer_rust], [search_rust], [export_rust], [native_bridge], [cutover]. | 0.243 |
| comment_span_align | reqlan rq/core_analysis/rust_port.rq | done | On every frozen [golden_corpus] `.rq` file, `//` and `/* … */` comment character ranges must be identical across: - the Langium lexer ( hidden `SL_COMMENT` / `ML_COMMENT` ) - `findCommentSpansInText` C-style spans ( host `#` / triple-quote spans are not `.rq` comments ) - TextMate `comment.line.reqlan` and `comment.block.reqlan` scopes Same-line fences, glob `/**/`, URL `://`, and fenced ` ` ` bodies must not open comments. Mid-line triple backticks are prose. They must not open a fence or hide later ideas. Example: `@reqlan/*` in inline code must not open a block comment. Related: [parser_align], ["../language/syntax.rq".code_snippets], ["../language/syntax.rq".comments], ["../language/syntax-edge-cases.rq".fencing_comments], ["../language/syntax.rq".inline_code]. | 0.141 |
| cutover | reqlan rq/core_analysis/rust_port.rq | done | Native engine is required for CLI, MCP, and the extension IndexService path ( no `REQLAN_ANALYTICAL_ENGINE=js` escape hatch ). Order: golden parse / extract → headless CLI `analyse` / `search` / `export` → MCP → extension via platform VSIX ( host-matching napi `.node` required ). Shared [bases.base] `.reqlan` DB is schema v4 rusqlite; fixtures verify reopen compatibility. The default editor LSP is [lsp_rust.language_server_rust]. Langium remains only as the transitional `node` engine fallback and dual-parser oracle ( [parser_align] ). | 0.118 |
| export_rust | reqlan rq/core_analysis/rust_port.rq | done | Port [export_reqs.export_pipeline]: `buildExportSnapshot` then HTML / markdown / JSON / CSV writers in `reqlan-export`. Interactive HTML JS ( graph canvas, list filters, search bars ) stays static assets bundled into the export — not rewritten in Rust ( [html_export.html_export], [html_export.html_export_graph_animation] ). Hosts still call `NativeAnalysisApi.exportHtml` / `exportMarkdown` / `exportJson` / `exportCsv`; they do not grow format writers. PDF remains print-HTML ( [export_reqs.pdf_export] ); [html_export.html_export_print_order_by] stays a product follow-up, not a port blocker. | 0.137 |
| golden_corpus | reqlan rq/core_analysis/rust_port.rq | done | Parser / extractor alignment uses a frozen `.rq` tree under `testdata/golden-corpus/`, not live product requirements in `reqlan rq/`. Production idea lists may change without regenerating the dump. Copy a representative file into the corpus and refresh `crates/reqlan-index/tests/golden/langium-corpus-names.json` only when grammar or extract behaviour needs a new sample. Langium and Rust both extract name + kind from that tree and must match the committed dump. Live parse alignment ( elements and refs, both engines in one test ): [parser_align]. Comment character ranges on the same tree: [comment_span_align]. | 0.104 |
| lexer_rust | reqlan rq/core_analysis/rust_port.rq | done | Hand-written Rust lexer that ports ["../../packages/language/src/reqlan-token-builder.ts"]: structural vs prose `{` / `}`, fence opacity, quote-aware comments, `@` only at line start, glob `/**/` not a block comment. Linear in document size with sparse brace-depth lookup ( [syntax_edges.context_sensitive_lexer_scaling] ). Owned by `reqlan-parse`; consumed by [parser_rust] and by [lsp_rust.language_server_rust]. The Langium token builder remains only for the transitional `node` engine fallback and dual-parser tests. | 0.105 |
| native_bridge | reqlan rq/core_analysis/rust_port.rq | in-progress | The Rust engine is the analytical core ( parse, index, search, export, typed queries, git-dates, overview coverage, barrel plan ) — not an optional addon. `@reqlan/analytical` is a typed napi facade ( specta `generated.ts` ) plus thin Node helpers ( `createBase`, path utils, `SqliteIndexStore` wrappers over typed napi ). It does not depend on Langium, `@reqlan/language`, or Zustand. Webview-only helpers ( search highlight, filter labels, file-treatment, context signals / model, graph physics ) live in the extension package. Interactive HTML JS stays in `crates/reqlan-export/assets`. Native owns: parse-for-index, persist, query, search, export execution, IndexService / WorkspaceIndex sync, and the index lifecycle FSM + status snapshot via `NativeWorkspaceIndex` + `NativeSqlDb`. The FSM ( `opening` / `syncing` / `ready` / `error` ), counts, in-memory sync progress / cancel, last error, file-index issues ( cap 500 ), and the document-update / workspace-change rings ( cap 50 ) live in `WorkspaceIndexRuntime`; TS reads them through `statusSnapshot()`. Durable diagnostics persist in `index-diagnostics.sqlite`. Consumers: [cli.cli_package] and MCP import `@reqlan/analytical/core` so they never load Langium; the extension host uses the per-target VSIX ( [distribution.vsix_export], [distribution.extension_host_target] ). The host-matching `.node` is required at runtime; there is no sql. js fallback. | 0.290 |
| parser_align | reqlan rq/core_analysis/rust_port.rq | done | Langium and `reqlan-parse` stay two engines as a dual-parser **test oracle**. Grammar truth is [syntax] / ["../../packages/language/src/reqlan.langium"]. The same source must yield the same parse snapshot: top-level elements, live bracket and wiki refs, inline-code count, and fence count. One Node test runs Langium and native `parseReqlanSource` ( `parseAlignSnapshot` ) together. A committed name dump is not the only check. The default editor LSP already uses Rust ( [lsp_rust.language_server_rust] ); this idea does not gate that cutover. Related: [golden_corpus], [parser_rust], [comment_span_align]. | 0.150 |
| parser_rust | reqlan rq/core_analysis/rust_port.rq | done | Recursive-descent parser matching ["../../packages/language/src/reqlan.langium"] productions into a Rust AST the extractor can walk. Recovery: nameless `{...}` and local import mistakes still yield a usable document ( [parser_lexer.recovery_vs_budget] ). Wall-clock [parser_lexer.parse_budget_timeout] via native timeout / cancel — no Node worker process required on the index path. Open `.rq` buffers and CLI `parse` use `reqlan-parse` ( [lsp_rust.language_server_rust] ). Langium remains a dual-parser test oracle and the transitional `node` engine fallback — not the default editor LSP. Alignment contract: [parser_align]. | 0.217 |
| port_phases | reqlan rq/core_analysis/rust_port.rq | Ideaset (port_phases) | 0.040 | |
| rust_crate_layout | reqlan rq/core_analysis/rust_port.rq | done | Cargo workspace at repo-root `crates/` ( not inside `packages/analytical` ), crates: - `reqlan-parse` — lexer, parser, AST, recovery, parse budget - `reqlan-index` — extract, rusqlite store, mtime sync, diagnostics - `reqlan-search` — fuzzy / contextual / semantic ranking - `reqlan-export` — snapshot + html / md / json / csv writers; embed existing HTML JS assets - `reqlan-analytical` — facade matching `AnalysisApi` + `WorkspaceIndex` operations - `reqlan-napi` — Node binding for the core engine ( [native_bridge] ) - `reqlan-lsp` — editor language server ( [lsp_rust.language_server_rust] ) Mature crates only ( rusqlite, napi ): no experimental parser generators for the lexer. Golden tests compare Rust extract against Langium on the frozen [golden_corpus], plus the language-test fixtures ported into `reqlan-parse` / `reqlan-index` tests. Format: ["../development/commit.rq".rust_fmt]. Root `pnpm test` runs `test:js` then `test:rust` from ["../../package.json"]. `test:rust` is `cargo test --workspace --exclude reqlan-napi`. GitHub CI compiles crates once, then runs `cargo test` as its own step so crate tests reuse that build ( ["../distribution/distribution.rq".ci_gate] ). | 0.138 |
| search_rust | reqlan rq/core_analysis/rust_port.rq | done | Port [search_reqs.fuzzy_search] ( separator-insensitive ranking ), [search_reqs.contextual_search] ( hop-distance rerank ), and [search_reqs.semantic_search] into `reqlan-search`. Same `AnalysisApi.searchRequirements` / `--context` contract ( [cli.commands] ). Activity-bar idea search uses `WorkspaceIndexRuntime.fuzzy_search` / napi `NativeWorkspaceIndex.fuzzySearch` so ranking stays next to rusqlite and only capped hits cross into JS. Mixed list includes indexed `.rq` file-name hits ( `kind` `file` ) and pages with `offset` / `limit` ( `truncated` ). Client-side highlight helpers used by webviews may stay in the TS `./fuzzy-search` export until a shared WASM / JS copy is needed. | 0.137 |
| ts_interface | reqlan rq/core_analysis/rust_port.rq | done | The TS interface over the Rust functionality stays fully typed via specta ( `crates/reqlan-analytical` `export-ts` → `packages/analytical/src/native/generated.ts` ). Specta copies Rust doc comments. `export-ts` rewrites those `rq:` paths from crate-src depth to `packages/analytical/src/native` depth. | 0.040 |
| contextual_search | reqlan rq/core_analysis/search.rq | done | Search string plus an optional context list of relative `.rq` paths, `path#idea` refs, or bare idea names. Runs [semantic_search], then re-ranks with min undirected hop distance from any resolved context idea and exponential decay ( [idea_graph_distance] ): `finalScore = textScore * 2^(-minHop)` ( unreachable floor = 8 hops ). Surfaces: [native_analysis_api] `searchRequirements(..., { context })` and CLI `reqlan search --context` ( [search_cli] ). Implements [search_with_context]. PageRank ( [pagerank] ) and full [context_scope_v2] ingestion remain future work. Default ranking does not use Katz. Opt in with [katz_search]. Complements [fuzzy_search] when neighbourhood / context should bias ranking. ["../cli/click.rq".click_input] ranks ambiguous click matches the same way, with session ideas as context. | 0.208 |
| file_search | reqlan rq/core_analysis/search.rq | done | Rank 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_search | reqlan rq/core_analysis/search.rq | done | Quick 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_pages | reqlan rq/core_analysis/search.rq | done | [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 |
| fuzzy_search_whitespace | reqlan rq/core_analysis/search.rq | done | Matching treats `_`, `-`, `.` / `...` / `…`, and whitespace as interchangeable separators so queries like `cli package`, `cli_package`, and `cli-package` hit the same idea. Prefers query word order, but still matches when words are reordered or when intermediate name words are missing ( e. g. `package cli` → `cli_package`, `search actions` → `search_code_actions` ). Extends [fuzzy_search]; implementation [fuzzy_search_impl]. | 0.117 |
| katz_search | reqlan rq/core_analysis/search.rq | done | Search can bias matches by inbound Katz centrality ( [katz_centrality] ). The bias is off unless the caller sets it. CLI flag: `reqlan search <query> --katz`. API field: `SearchRequirementsOptions.katz`. When the bias is on, the score is `textScore * (1 + katzScore)`. The match reasons include `katz:<score>`. Context hop decay runs first. The Katz multiplier runs second. When the bias is off, match order and scores stay on the text ranking. | 0.082 |
| search | reqlan rq/core_analysis/search.rq | Search 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 | |
| semantic_search | reqlan rq/core_analysis/search.rq | Broader token / edge-label search over candidates through [native_analysis_api]. Prefer [fuzzy_search] for fast name-oriented lookup with separator-insensitive matching. | 0.092 |
Cluster graph
Initialising graph…