Attribute detail
tests
113 ideas · 91 distinct values
| Value | Distribution | Ideas | Share |
|---|---|---|---|
| ["../../packages/analytical/test/export-html.test.ts"] |
|
11 | 9.7% |
| ["../../../packages/language/test/completion.test.ts"] |
|
6 | 5.3% |
| "../../packages/extension/test/startup-gate.test.ts", "../../packages/analytical/test/workspace-index-lazy-services.test.ts" |
|
3 | 2.7% |
| ["../../../packages/language/test/inlay-hints.test.ts"] |
|
3 | 2.7% |
| ["../../../packages/analytical/test/context-signals.test.ts"], ["../../../packages/extension/test/context-model.test.ts"] |
|
2 | 1.8% |
| ["../../../packages/extension/test/graph-ui-state.test.ts"], ["../../../packages/analytical/test/export-html.test.ts"] |
|
2 | 1.8% |
| ["../../packages/analytical/test/export-html.test.ts"], ["../../packages/language/test/config.test.ts"] |
|
2 | 1.8% |
| "../../packages/analytical/test/workspace-index-lazy-services.test.ts" |
|
1 | 0.9% |
| "../../packages/extension/test/incremental-build.test.ts" |
|
1 | 0.9% |
| "../../packages/extension/test/startup-gate.test.ts" |
|
1 | 0.9% |
| ["../../../../packages/analytical/src/core/context-signals.ts"], ["../../../../packages/analytical/test/context-signals.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] |
|
1 | 0.9% |
| ["../../../../packages/analytical/test/idea-extractor-namespace-refs.test.ts"], ["../../../../packages/analytical/test/file-reference-resolve.test.ts"], ["../../../../packages/language/test/linking.test.ts:does not report linking error for bare namespace alias references"] |
|
1 | 0.9% |
| ["../../../../packages/analytical/test/webview-table-queries.test.ts"] |
|
1 | 0.9% |
| ["../../../../packages/analytical/test/webview-table-queries.test.ts"], ["../../../../packages/extension/test/bases-table-filter.test.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/test/bases-table-filter.test.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/test/filter-bases.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/BasePicker.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/state/app.svelte.ts"], ["../../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/test/group-file-issues.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"], ["../../../../packages/analytical/src/index-store/idea-extractor.ts"], ["../../../../packages/analytical/test/idea-extractor-namespace-refs.test.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"], ["../../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/src/activity_bar_module/git-context.ts"], ["../../../../packages/extension/src/activity_bar_module/git-context-helpers.ts"], ["../../../../packages/analytical/src/core/context-model.ts"], ["../../../../packages/analytical/src/core/context-signals.ts"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] |
|
1 | 0.9% |
| ["../../../../packages/extension/webviews/activity-bar/components/widgets/DependencyPulse.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] |
|
1 | 0.9% |
| ["../../../packages/analytical/src/core/context-model.ts"], ["../../../packages/analytical/src/core/context-signals.ts"] |
|
1 | 0.9% |
| ["../../../packages/analytical/src/index-store/webview-graph-queries.ts"], ["../../../packages/extension/src/activity_bar_module/context-model.ts"] |
|
1 | 0.9% |
| ["../../../packages/analytical/test/context-signals.test.ts"], ["../../../packages/extension/test/context-model.test.ts"], ["../../../packages/extension/test/context-widgets.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/analytical/test/export-html.test.ts"], ["../../../packages/analytical/test/filter-specials.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/analytical/test/index-diagnostics.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/analytical/test/rqignore.test.ts"], ["../../../packages/analytical/test/create-base.test.ts:seeds .reqlan/.rqignore when creating a new base"], ["../../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns"] |
|
1 | 0.9% |
| ["../../../packages/extension/test/group-file-issues.test.ts"], ["../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"], ["../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"] |
|
1 | 0.9% |
| ["../../../packages/extension/test/startup-gate.test.ts"], ["../../../packages/analytical/test/workspace-index-lazy-services.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/extension/webviews/activity-bar/App.svelte"], ["../../../packages/extension/webviews/activity-bar/state/app.svelte.ts"], ["../../../packages/extension/webviews/activity-bar/components/BootstrapStatus.svelte"], ["../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"], ["../../../packages/extension/src/activity_bar_module/get-activity-bar-html.ts"], ["../../../packages/extension/test/startup-gate.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/extension/webviews/activity-bar/components/HeaderBar.svelte"], ["../../../packages/extension/src/activity_bar_module/context-session.ts"] |
|
1 | 0.9% |
| ["../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../packages/extension/src/activity_bar_module/context-session.ts"] |
|
1 | 0.9% |
| ["../../../packages/extension/webviews/activity-bar/components/widgets"], ["../../../packages/extension/test/context-widgets.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/code-actions.test.ts"], ["../../../packages/language/test/import-edits.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/code-lens.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/completion.test.ts:completes import-root alias paths"] |
|
1 | 0.9% |
| ["../../../packages/language/test/completion.test.ts"], ["../../../packages/language/test/completion.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/implicit-import-extension.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/linking.test.ts:document links resolve test file references to the matching test"], ["../../../packages/language/test/linking.test.ts:folder file references resolve without reading the directory as a file"], ["../../../packages/language/test/linking.test.ts:empty file references produce document links and warning diagnostics"], ["../../../packages/language/test/linking.test.ts:parse-error file references produce document links and warning diagnostics"], ["../../../packages/language/test/linking.test.ts:missing file references do not produce document links"] |
|
1 | 0.9% |
| ["../../../packages/language/test/parsing.test.ts"], ["../../../packages/language/test/parsing.test.ts"] |
|
1 | 0.9% |
| ["../../../packages/language/test/validating.test.ts"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/application-memory.test.ts:defaults to <workspace>/.reqlan"], ["../../packages/analytical/test/application-memory.test.ts:honours storagePath override"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"], ["../../packages/analytical/test/base-discovery.test.ts:selectDefaultBase prefers cwd containment"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/base-discovery.test.ts:discovers nested bases and excludes child files from parent ownership"], ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/base-discovery.test.ts:discovers nested bases and excludes child files from parent ownership"], ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"], ["../../packages/analytical/test/base-discovery.test.ts:selectDefaultBase prefers cwd containment"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/base-discovery.test.ts:returns empty when no .reqlan exists"], ["../../packages/analytical/test/base-discovery.test.ts:discovers base at workspace root"], ["../../packages/analytical/test/base-discovery.test.ts:skips node_modules and does not treat .reqlan as a walkable base root"], ["../../packages/analytical/test/application-memory.test.ts:defaults to <workspace>/.reqlan"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/base-registry-catchup.test.ts:ensureBaseReady opens and soft-syncs an uninitialized base"], ["../../packages/analytical/test/base-registry-catchup.test.ts:checkStaleAll heals an uninitialized base"], ["../../packages/analytical/test/base-registry-catchup.test.ts:deactivate returns to uninitialized so a base can be reopened"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/create-base.test.ts:creates .reqlan marker and reports created"], ["../../packages/analytical/test/create-base.test.ts:is idempotent when marker already exists"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/index-diagnostics.test.ts"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/rqignore.test.ts"], ["../../packages/analytical/test/create-base.test.ts:seeds .reqlan/.rqignore when creating a new base"], ["../../packages/analytical/test/base-discovery.test.ts:skips node_modules and does not treat .reqlan as a walkable base root"], ["../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns"] |
|
1 | 0.9% |
| ["../../packages/analytical/test/workspace-index.test.ts"] |
|
1 | 0.9% |
| ["../../packages/extension/test/export-settings.test.ts"], ["../../packages/extension/test/extension-package.test.ts"], ["../../packages/analytical/test/export-html.test.ts"] |
|
1 | 0.9% |
| ["../../packages/language/test/code-actions.test.ts"], ["../../packages/extension/test/reference-search.test.ts"] |
|
1 | 0.9% |
| ["../../packages/language/test/config.test.ts:empty object uses default alias mapping"], ["../../packages/language/test/config.test.ts:importRoots alias only overrides the alias"], ["../../packages/language/test/config.test.ts:relative root resolves against the base root"], ["../../packages/language/test/config.test.ts:absolute filesystem root is used directly"], ["../../packages/language/test/config.test.ts:file URI root is used directly"], ["../../packages/language/test/config.test.ts:multiple importRoots map aliases to different roots"], ["../../packages/language/test/config.test.ts:longest alias wins when mappings overlap"], ["../../packages/language/test/config.test.ts:empty string alias entries are skipped"], ["../../packages/language/test/config.test.ts:empty string root is ignored on a mapping"], ["../../packages/language/test/config.test.ts:invalid importRoots entries are skipped"], ["../../packages/language/test/config.test.ts:unknown properties are ignored while known keys still apply"], ["../../packages/language/test/config.test.ts:invalid JSON falls back to undefined load"], ["../../packages/language/test/config.test.ts:non-object JSON falls back to undefined load"], ["../../packages/language/test/config.test.ts:non-array importRoots falls back to undefined load"], ["../../packages/language/test/config.test.ts:empty importRoots array uses default alias mapping"], ["../../packages/language/test/config.test.ts:resolveRqConfig falls back to defaults when applying JSON is invalid"], ["../../packages/language/test/config.test.ts:aliased path uses relative root from applying config"], ["../../packages/language/test/config.test.ts:aliased path uses workspace folder when root is omitted"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"], ["../../packages/language/test/path-resolve.test.ts:resolves using config importRoots mapping"], ["../../packages/language/test/path-resolve.test.ts:rewrite leaves aliased paths unchanged"], ["../../packages/language/test/completion.test.ts:completes import-root alias paths"] |
|
1 | 0.9% |
| ["../../packages/language/test/config.test.ts:returns undefined when no config exists"], ["../../packages/language/test/config.test.ts:loads config from the owning base .reqlan"], ["../../packages/language/test/config.test.ts:loads config from an ancestor base"], ["../../packages/language/test/config.test.ts:nearest base config wins over farther ones"], ["../../packages/language/test/config.test.ts:owning base without config does not inherit parent"], ["../../packages/language/test/config.test.ts:resolveRqConfig uses defaults when no applying file exists"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"] |
|
1 | 0.9% |
| ["../../packages/language/test/config.test.ts:returns undefined when no config exists"], ["../../packages/language/test/config.test.ts:loads config from the owning base .reqlan"], ["../../packages/language/test/config.test.ts:loads config from an ancestor base"], ["../../packages/language/test/config.test.ts:nearest base config wins over farther ones"], ["../../packages/language/test/config.test.ts:owning base without config does not inherit parent"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"] |
|
1 | 0.9% |
| ["../../packages/language/test/config.test.ts:unknown properties are ignored while known keys still apply"], ["../../packages/language/test/config.test.ts:schema file documents importRoots mappings"] |
|
1 | 0.9% |
| ["../../packages/language/test/file-path-rewrite.test.ts:updates inbound import path when the target file moves"] |
|
1 | 0.9% |
| ["../../packages/language/test/file-path-rewrite.test.ts:updates inbound import path when the target file moves"], ["../../packages/language/test/file-path-rewrite.test.ts:preserves extensionless inbound paths"], ["../../packages/language/test/file-path-rewrite.test.ts:buildInboundPathRewriteEdits quotes replacement paths"], ["../../packages/language/test/file-path-rewrite.test.ts:updates paths when a file moves to a sibling directory"] |
|
1 | 0.9% |
| ["../../packages/language/test/file-path-rewrite.test.ts:updates paths when a file moves to a sibling directory"], ["../../packages/language/test/file-path-rewrite.test.ts:finds import and embedded paths in rq files"], ["../../packages/language/test/file-path-rewrite.test.ts:finds rq comment paths in code files"] |
|
1 | 0.9% |
| ["../../packages/language/test/idea-refactor.test.ts:delete plan removes declaration and bracket references"] |
|
1 | 0.9% |
| ["../../packages/language/test/idea-refactor.test.ts:move plan cuts from source and inserts into destination"] |
|
1 | 0.9% |
| ["../../packages/language/test/ignore-error.test.ts"] |
|
1 | 0.9% |
| ["../../packages/language/test/linking.test.ts:resolve namespace import references to files"], ["../../packages/language/test/linking.test.ts:namespace import bracket reference links only the alias name"] |
|
1 | 0.9% |
| ["../../packages/language/test/linking.test.ts:resolve same-file bracket reference to local idea"], ["../../packages/language/test/linking.test.ts:resolve forward reference to later idea in the same file"], ["../../packages/language/test/linking.test.ts:resolve circular same-file references"], ["../../packages/language/test/linking.test.ts:resolve ideaset member forward reference"] |
|
1 | 0.9% |
| ["../../packages/language/test/parse-budget.test.ts:times out a hung parse worker with warning and error"], ["../../packages/language/test/parse-budget.test.ts:returns incomplete result when worker parse fails"], ["../../packages/language/test/parse-budget.test.ts:parses a normal file within budget"], ["../../packages/language/test/parse-budget.test.ts:parses small files on the calling thread without a worker"], ["../../packages/language/test/parse-budget.test.ts:escalates large files to the worker path"], ["../../packages/language/test/parse-budget.test.ts:forceWorker escalates a small file"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:allows escaped closing brace in body prose"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:keeps inline parentheses in body prose as text"], ["../../packages/language/test/parsing.test.ts:keeps inline braces in body prose as text"], ["../../packages/language/test/parsing.test.ts:parse extension graph.rq library"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:keeps inline prose brace pairs as text"], ["../../packages/language/test/parsing.test.ts:keeps end-of-line matching prose braces as text"], ["../../packages/language/test/parsing.test.ts:parse thanks-for-installing template"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in block body text"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in attribute scalar values"], ["../../packages/language/test/parsing.test.ts:keeps single-quoted naked phrases in block body text"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in one-liner body after the idea name"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in list items"], ["../../packages/language/test/parsing.test.ts:keeps naked quotes alongside bracket references on one line"], ["../../packages/language/test/parsing.test.ts:does not treat naked quoted path-like prose as an import reference"], ["../../packages/language/test/parsing.test.ts:parses reframe requirement snippets with naked quoted UI labels"], ["../../packages/language/test/parsing.test.ts:parses self-contained ideas with apostrophe contractions in body prose"], ["../../packages/language/test/naked-strings.test.ts"], ["../../packages/language/test/comment-in-string.test.ts:single-quoted URL in block body is naked prose"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:keeps pipe characters in body prose as text"], ["../../packages/language/test/parsing.test.ts:parse extension context-scope.rq module"], ["../../packages/language/test/linking.test.ts:resolve wikilink to idea declaration in main.rq"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:malformed from-as import keeps later ideas parseable"], ["../../packages/language/test/validating.test.ts:reports local diagnostic for from-as mistaken import"], ["../../packages/language/test/validating.test.ts:reports local diagnostic for unquoted from-import"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse code snippet in block idea"], ["../../packages/language/test/parsing.test.ts:parse fenced code block in attribute value"], ["../../packages/language/test/parsing.test.ts:treats fenced rq example as opaque text"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse dash and underscore delimited idea names"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse list items as one-liners and anonymous blocks"], ["../../packages/language/test/parsing.test.ts:keeps inline parentheses in body prose as text"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse name-only ideas without a body"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse syntax.rq"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parse thanks-for-installing template"], ["../../packages/extension/test/onboarding-rq-highlight.test.ts"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parses a large import prelude without repeated full-document brace scans"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parses from-import example line inside an attribute block value"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parses top-level nameless braces without aborting later ideas"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"], ["../../packages/language/test/validating.test.ts:warns on top-level nameless braces without invalidating later ideas"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:parses valued attributes without a colon"], ["../../packages/language/test/parsing.test.ts:still accepts optional colon before attribute values"] |
|
1 | 0.9% |
| ["../../packages/language/test/parsing.test.ts:treats mid-line @ as body text and line-start @ as attribute"], ["../../packages/language/test/parsing.test.ts:backslash before @ at line start keeps it as body text"] |
|
1 | 0.9% |
| ["../../packages/language/test/path-resolve.test.ts:resolves import-root alias against the workspace folder"], ["../../packages/language/test/path-resolve.test.ts:leaves non-aliased relative paths document-relative"], ["../../packages/language/test/path-resolve.test.ts:matchImportRootAlias requires alias then slash"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"], ["../../packages/language/test/path-resolve.test.ts:resolves using config importRoots mapping"], ["../../packages/language/test/path-resolve.test.ts:rewrite leaves aliased paths unchanged"], ["../../packages/language/test/completion.test.ts:completes import-root alias paths"], ["../../packages/language/test/config.test.ts:multiple importRoots map aliases to different roots"], ["../../packages/language/test/config.test.ts:longest alias wins when mappings overlap"], ["../../packages/language/test/config.test.ts:aliased path uses relative root from applying config"], ["../../packages/language/test/config.test.ts:aliased path uses workspace folder when root is omitted"] |
|
1 | 0.9% |
| ["../../packages/language/test/references.test.ts:unquotes single-quoted reqlan string literals"], ["../../packages/language/test/parsing.test.ts:parse single-quoted import paths and idea names"] |
|
1 | 0.9% |
| ["../../packages/language/test/rename-provider.test.ts:rename updates declaration and wikilink references"], ["../../packages/language/test/rename-provider.test.ts:rename also updates rq comment idea tokens in the same document"], ["../../packages/language/test/comment-rename.test.ts:builds rename edits for matching comment idea tokens"], ["../../packages/language/test/linking.test.ts:rename finds all idea references including wikilinks"] |
|
1 | 0.9% |
| ["../../packages/language/test/testing.test.ts:each test file includes rq comment references to its requirements"] |
|
1 | 0.9% |
| ["../../packages/language/test/validating.test.ts:allows local idea when import uses an alias"], ["../../packages/language/test/validating.test.ts:allows local idea when qualified import uses an alias"], ["../../packages/language/test/validating.test.ts:reports duplicate when local idea shares unaliased import binding"], ["../../packages/language/test/linking.test.ts:import idea reference resolves to imported file when local idea shares name"] |
|
1 | 0.9% |
| [workspace_index_tests], "../../packages/analytical/test/workspace-index-lazy-services.test.ts" |
|
1 | 0.9% |
| Idea | Value | Status | Tags | Summary |
|---|---|---|---|---|
| active_base_switch | ["../../packages/analytical/test/base-registry-catchup.test.ts:ensureBaseReady opens and soft-syncs an uninitialized base"], ["../../packages/analytical/test/base-registry-catchup.test.ts:checkStaleAll heals an uninitialized base"], ["../../packages/analytical/test/base-registry-catchup.test.ts:deactivate returns to uninitialized so a base can be reopened"] | done | Changing the active base is a * * pointer swap * * onto a per-base `WorkspaceIndex` / store. - Do * * not * * await soft-sync, hard-rebuild, or a full `.rq` walk on the switch call itself. - Host surfaces rebind views to the newly active store ( status snapshot, tables, context panes ) immediately. - If the selected base is not yet ready, show its readiness / progress and * * schedule * * the normal activate catch-up ( open if needed, then one soft sync ) fire-and-forget — same path as ["../indexer/indexer.rq".triggers] / ["../extension/features-graph-analysers.rq".indexing_trigger_open], not a special switcher rebuild. - Idle staleness checks also heal unopened / never-synced bases ( they cannot mtime-diff without a store ). - `activateAll` isolates open failures so one bad base cannot leave siblings stranded in `uninitialized`. - Editor-follow must not overwrite a user pin on the same refresh that applies the selection. Surfaces: activity bar ["../extension/module/activitybar-panels/workspace.rq".workspace_base_picker], Ideas Summary ["../extension/module/ideas_summary/base-scope.rq".ideas_summary_base_scope]. Implemented by [editor_index_adapter] ( `setActiveBaseId` / `scheduleBaseCatchUp` ); engine: [base_registry] `ensureBaseReady`, [workspace_index] `ensureReady`. | |
| base | ["../../packages/analytical/test/base-discovery.test.ts:returns empty when no .reqlan exists"], ["../../packages/analytical/test/base-discovery.test.ts:discovers base at workspace root"], ["../../packages/analytical/test/base-discovery.test.ts:skips node_modules and does not treat .reqlan as a walkable base root"], ["../../packages/analytical/test/application-memory.test.ts:defaults to <workspace>/.reqlan"] | A base is a container for ideas, ideasets, and files. It forms the boundary of one ideas graph and is consumed by the CLI and the extension. Marker: a directory is a base only when it owns a `.reqlan` folder ( [app_memory_doc.application_memory] ). No bare workspace folder is treated as a base until the user creates `.reqlan` there ( [create_base_onboarding] ). Aligns with [ontology_base]. Discovery and registry: [base_discovery], [base_registry]. Marker path helpers: [application_memory_impl]. | ||
| base_configuration | ["../../packages/language/test/config.test.ts:returns undefined when no config exists"], ["../../packages/language/test/config.test.ts:loads config from the owning base .reqlan"], ["../../packages/language/test/config.test.ts:loads config from an ancestor base"], ["../../packages/language/test/config.test.ts:nearest base config wins over farther ones"], ["../../packages/language/test/config.test.ts:owning base without config does not inherit parent"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"] | Base configuration is distinct from, but related to, [extension_configuration]. Optional settings live at `<base>/.reqlan/config.json` ( one config per base ). For an `.rq` file, the applying base is the nearest ancestor that owns `.reqlan`; that base's config applies when present. See [extension_configuration.configuration_location]; resolved by [path_resolve]. | ||
| base_nesting | ["../../packages/analytical/test/base-discovery.test.ts:discovers nested bases and excludes child files from parent ownership"], ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"] | Bases may nest: any subdirectory that owns its own `.reqlan` is a child base. Parent-base indexing includes only `.rq` files under the parent root that are * * not * * under any child base root ( [base_discovery] ownership exclusion ). Nested bases appear as siblings in the multi-base registry; the longest-matching base root wins for a given file path ( [implied_context] ). | ||
| base_ownership | ["../../packages/analytical/test/application-memory.test.ts:defaults to <workspace>/.reqlan"], ["../../packages/analytical/test/application-memory.test.ts:honours storagePath override"] | Each base holds its own [ideas_index] store under `<base>/.reqlan/ideas-index.sqlite`. Path keys inside the index are relative to that base root, not the VS Code workspace root. Store path: [application_memory_impl]; per-base engine: [workspace_index] via [base_registry]. | ||
| implied_context | ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"], ["../../packages/analytical/test/base-discovery.test.ts:selectDefaultBase prefers cwd containment"] | The * * active base * * for editor-adjacent surfaces is the longest-matching base root that contains the focused file path. When no file is focused, the last selected base ( Ideas Summary switcher / activity bar ) or the first discovered base is used. Context, local graph, and analysers bind to the active base's index — not a merged global graph. User / explicit pin is a pointer swap only — [active_base_switch]. Core selection: [base_discovery] ( `baseForPath` / `selectDefaultBase` ); editor pin / switch: [editor_index_adapter]. | ||
| multi_base_environment | ["../../packages/analytical/test/base-discovery.test.ts:discovers nested bases and excludes child files from parent ownership"], ["../../packages/analytical/test/base-discovery.test.ts:baseForPath picks longest matching root"], ["../../packages/analytical/test/base-discovery.test.ts:selectDefaultBase prefers cwd containment"] | Analytical features are multibase aware via [base_registry]: one [ideas_index] / `WorkspaceIndex` per base, isolated catalogs ( no cross-base idea-id collision ). Surfaces list all discovered bases; Ideas Summary and context panes scope to the active / selected base ( [active_base_switch] ). Cross-base reference resolution and merged graphs are out of scope for the first multi-base pass. Headless ( CLI / MCP ) selects one base via [analysis_runtime]; the editor hosts [editor_index_adapter]. | ||
| init | ["../../packages/analytical/test/create-base.test.ts:creates .reqlan marker and reports created"], ["../../packages/analytical/test/create-base.test.ts:is idempotent when marker already exists"] | done | The cli should be able to initialise a new [base]. Creates `<path>/.reqlan/` ( empty directory is a valid marker ), matching [create_base_onboarding]. Headless helper lives in `@reqlan/analytical` so CLI and extension share one create-base path. | |
| incremental_extension_build | "../../packages/extension/test/incremental-build.test.ts" | done | Extension builds fingerprint inputs and outputs per independently cacheable artifact: - Langium generated sources / TextMate grammar - generated shared graph-physics source - logo media - generated marketplace README - each of the five Vite webviews separately - extension-host / language-server / lazy sql. js esbuild outputs A step is skipped only when its command / input fingerprint and current output-content fingerprint both match the cache under `packages/extension/out/`. Missing, changed, or manually edited output invalidates that step. Webview output fingerprints cover each complete emitted directory, including future lazy chunks. Host-bundle inputs include bundled phonebook data and the sql. js vendor source as well as workspace package output. TypeScript retains its native `tsc -b` project-reference incrementality. TextMate syntax copies are cached by content; Cursor-skill sync still runs because it targets workspace-external state. `pnpm run build:force` / `node scripts/build.mjs --force` bypasses all cache entries; `vscode:prepublish` uses this forced mode for release correctness. `clean` removes `out/`, including the cache, so clean builds remain cold. Root `pnpm run build:ext` delegates only to the extension package. The extension build generates Langium / physics artifacts when their fingerprints change, then its `tsc -b` builds language / analytical project references before downstream fingerprints are evaluated. It does not rebuild unrelated CLI, MCP, site, or test projects. | |
| testing | ["../../packages/language/test/testing.test.ts:each test file includes rq comment references to its requirements"] | tests should have comment references to the requirements they serve to test. per ["../extension/features-code-comment/functional-code-comment-references.rq"] | ||
| first_paint_startup | "../../packages/extension/test/startup-gate.test.ts", "../../packages/analytical/test/workspace-index-lazy-services.test.ts" | done | The activity-bar HTML shell is assigned synchronously by ["../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"]. Its Svelte app installs the host message listener before mount, then sends the one-shot `ready` handshake from a task queued after its first animation frame. ["../../packages/extension/src/extension/startup-gate.ts"] resolves that handshake once; `IndexService.activate` then discovers bases and syncs. If no view opens, a bounded three-second fallback starts the index without any visible first paint to contend with. Parser services inside each `WorkspaceIndex` are lazy and are created only when a file is actually parsed, not while bases are discovered. The sql. js asm implementation is emitted as a separate lazy vendor bundle, so loading `main.cjs` does not parse the database engine before `activate`. | |
| configuration_import_roots | ["../../packages/language/test/config.test.ts:empty object uses default alias mapping"], ["../../packages/language/test/config.test.ts:importRoots alias only overrides the alias"], ["../../packages/language/test/config.test.ts:relative root resolves against the base root"], ["../../packages/language/test/config.test.ts:absolute filesystem root is used directly"], ["../../packages/language/test/config.test.ts:file URI root is used directly"], ["../../packages/language/test/config.test.ts:multiple importRoots map aliases to different roots"], ["../../packages/language/test/config.test.ts:longest alias wins when mappings overlap"], ["../../packages/language/test/config.test.ts:empty string alias entries are skipped"], ["../../packages/language/test/config.test.ts:empty string root is ignored on a mapping"], ["../../packages/language/test/config.test.ts:invalid importRoots entries are skipped"], ["../../packages/language/test/config.test.ts:unknown properties are ignored while known keys still apply"], ["../../packages/language/test/config.test.ts:invalid JSON falls back to undefined load"], ["../../packages/language/test/config.test.ts:non-object JSON falls back to undefined load"], ["../../packages/language/test/config.test.ts:non-array importRoots falls back to undefined load"], ["../../packages/language/test/config.test.ts:empty importRoots array uses default alias mapping"], ["../../packages/language/test/config.test.ts:resolveRqConfig falls back to defaults when applying JSON is invalid"], ["../../packages/language/test/config.test.ts:aliased path uses relative root from applying config"], ["../../packages/language/test/config.test.ts:aliased path uses workspace folder when root is omitted"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"], ["../../packages/language/test/path-resolve.test.ts:resolves using config importRoots mapping"], ["../../packages/language/test/path-resolve.test.ts:rewrite leaves aliased paths unchanged"], ["../../packages/language/test/completion.test.ts:completes import-root alias paths"] | `importRoots` is an optional array of alias-to-directory mappings in `.reqlan/config.json`. Each mapping has: - `alias` ( required non-empty string ): prefix before `/` in aliased import paths. - `root` ( optional non-empty string ): directory for that alias. A relative `root` resolves against the base root ( the parent of `.reqlan` ), not against the `.reqlan` directory. An absolute path or `file://` URI is used as that alias' import-root directory directly. When `root` is omitted for a mapping, that alias uses the workspace folder that contains the `.rq` file. When `importRoots` is omitted, empty, or has no valid entries, the default is one mapping with alias `@` and no explicit root. When several aliases could match a path, the longest alias wins. Invalid or unreadable JSON, and a non-array `importRoots` value, fall back to defaults ( or no loaded config for discovery, then defaults at resolve time ). Language path forms and `@/` shorthand: ["../language/imports.rq".import_paths] and ["../language/imports.rq".configuration_import_root_alias]. Schema: [configuration_schema_file]. Applying file discovery: [configuration_location]. Editor completion of aliased import paths: ["./syntax/features-syntax.rq".code_completion]. | ||
| configuration_location | ["../../packages/language/test/config.test.ts:returns undefined when no config exists"], ["../../packages/language/test/config.test.ts:loads config from the owning base .reqlan"], ["../../packages/language/test/config.test.ts:loads config from an ancestor base"], ["../../packages/language/test/config.test.ts:nearest base config wins over farther ones"], ["../../packages/language/test/config.test.ts:owning base without config does not inherit parent"], ["../../packages/language/test/config.test.ts:resolveRqConfig uses defaults when no applying file exists"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"] | An 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. Implemented by ["../../packages/language/src/reqlan-path-resolve.ts"]. | ||
| configuration_rqignore | ["../../packages/analytical/test/rqignore.test.ts"], ["../../packages/analytical/test/create-base.test.ts:seeds .reqlan/.rqignore when creating a new base"], ["../../packages/analytical/test/base-discovery.test.ts:skips node_modules and does not treat .reqlan as a walkable base root"], ["../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns"] | done | Each 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, `*.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 ( ["./module/index.rq".rqignore] ). Missing or unreadable `.rqignore` still uses built-in defaults. Location convention: [configuration_location]. Application memory: ["./module/index.rq".application_memory]. | |
| configuration_schema_file | ["../../packages/language/test/config.test.ts:unknown properties are ignored while known keys still apply"], ["../../packages/language/test/config.test.ts:schema file documents importRoots mappings"] | The machine-readable JSON Schema for `.reqlan/config.json` is ["../../packages/extension/schemas/config.schema.json"]. The extension contributes that schema for `**/.reqlan/config.json` via `jsonValidation` in ["../../packages/extension/package.json"]. `.reqlan/config.json` is a JSON object. Unknown properties are not part of the schema and are ignored when loading. | ||
| search_code_actions | ["../../packages/language/test/code-actions.test.ts"], ["../../packages/extension/test/reference-search.test.ts"] | done | when cursor is in a [reference], there shouls be a code action to search for references to that idea. it should also allow wrapping a selected string, or the word at the cursor when in idea-body prose, as a new [reference]. it should open up a webview modal that shows a search dialog that allows the user to search for potential references. the search menu should preserve / show the context of the would-be reference: the rest of the containing idea, with styling, and with the selected text pulsing / styled prominently. it should support fuzzy / partial searching. it should list the closest matches in a paginated view. selecting the idea should fill / replace the reference ( or wrap the selection as [name] ) and an import ( if required ) appropiately | |
| indexing_trigger_auto | ["../../packages/analytical/test/workspace-index.test.ts"] | done | When 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/indexer.rq".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 ). | |
| html_export_attribute_pages | ["../../packages/analytical/test/export-html.test.ts"], ["../../packages/language/test/config.test.ts"] | 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. | ||
| html_export_attributes_index | ["../../packages/analytical/test/export-html.test.ts"] | 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. | ||
| html_export_code_reference_pages | ["../../packages/analytical/test/export-html.test.ts"], ["../../packages/language/test/config.test.ts"] | Html export should generate dedicated pages for outbound file_reference targets 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. | ||
| html_export_file_pages | ["../../packages/analytical/test/export-html.test.ts"] | 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. | ||
| html_export_form | ["../../packages/extension/test/export-settings.test.ts"], ["../../packages/extension/test/extension-package.test.ts"], ["../../packages/analytical/test/export-html.test.ts"] | partial | HTML export options are hosted inside the general ["./features-export.rq".export_webview] ( not a separate HTML-only panel long-term ). When format is HTML: simple options include scope, output folder, export name, and runtime mode. Advanced HTML settings should be collapsed by default behind an expandable section ( template, cluster strategy, page-family toggles, file filters, url base, header link, print entry, neighbourhood graph node cap ). File filters: exclude `*.secret.rq` ideas ( `excludeSecretFiles` ) and / or exclude paths matched by `.reqlan/.rqignore` ( `excludeIgnoredFiles` ); both default off so indexed ideas from those files are included unless opted out. Form defaults persist to ["./module/index.rq".application_memory] as `export_settings.json` under `<workspace>/.reqlan/` ( shared with other export formats ). Saving settings or running export writes that file; reopening the form reloads the last values. HTML export still calls `@reqlan/analytical` `exportHtml` with an `ExportRequest` built from the form. While export runs, the webview shows progress from the analytical pipeline ( snapshot phases, then write completed / total ) via `exportProgress` messages — see ["./features-export.rq".export_webview]. Current implementation is HTML-only and should be generalized; until then the existing panel satisfies the HTML path. | |
| html_export_graph_label_auto | ["../../packages/analytical/test/export-html.test.ts"] | 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. Zoom and Fit from [html_export_graph_interaction] / [manual_reframe] update opacity each paint. | |
| html_export_graph_label_modes | ["../../packages/analytical/test/export-html.test.ts"] | done | Export-surface wiring for [graph_label_modes]: Labels control on every interactive export graph cycles auto / on / off; Reset restores auto. | |
| html_export_graph_labels | ["../../packages/analytical/test/export-html.test.ts"] | HTML export canvas graphs implement shared [graph_labels] ( full names, no ellipsis truncation ). [html_export_graph_label_modes] [html_export_graph_label_auto] | ||
| html_export_graph_links | ["../../packages/analytical/test/export-html.test.ts"] | 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. | ||
| html_export_graph_page | ["../../packages/analytical/test/export-html.test.ts"] | 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. 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_subject] [html_export_graph_labels] [html_export_graph_label_modes] [html_export_graph_label_auto] [html_export_graph_interaction] [html_export_graph_metadata] | ||
| html_export_header_link | ["../../packages/analytical/test/export-html.test.ts"] | 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/reqs/core.rq".spec_html_export]. Often paired with [html_export_url_base] when the export is mounted under a parent static site. | |
| html_export_list_views | ["../../packages/analytical/test/export-html.test.ts"] | 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. Long lists that sit above other page content follow [html_export_scrollable_lists]. [html_export_attributes_index] [html_export_file_pages] [html_export_code_reference_pages] [html_export_scrollable_lists] | ||
| html_export_scrollable_lists | ["../../packages/analytical/test/export-html.test.ts"] | 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. | ||
| html_export_url_base | ["../../packages/analytical/test/export-html.test.ts"] | 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/reqs/core.rq".spec_html_export]. Often paired with [html_export_header_link] when the export is mounted under a parent static site. | |
| index_diagnostics_metrics | ["../../packages/analytical/test/index-diagnostics.test.ts"] | done | For each sync / index run on a base, record: - wall-clock * * sum / total duration * * of the pass - * * file count * * ( visited ), skipped-by-mtime count, indexed ( parse / persist attempted ) count, error count - * * average path depth * * of visited files ( segments under the base root ) - per-file * * duration * * and outcome ( `mtime_skip` | `mtime_refresh` | `hash_skip` | `persisted` | `error` ) Runs are attributable to a trigger ( `soft_sync` | `rebuild` | `enqueue` | `stale` ). Instrumentation wraps [workspace_index] soft sync and [indexer.nonblocking_index] single-file paths via [diagnostics_store]. | |
| move_file | ["../../packages/language/test/file-path-rewrite.test.ts:updates paths when a file moves to a sibling directory"], ["../../packages/language/test/file-path-rewrite.test.ts:finds import and embedded paths in rq files"], ["../../packages/language/test/file-path-rewrite.test.ts:finds rq comment paths in code files"] | if a file is moved, a prompt should be shown to the user to update any references in the file to the new path. if multiple files are moved there should be only one prompt. the trigger should only happen if the reqlan file has inbound or outbound references, or the non-reqlan file has inbound reqlan references. " reqlan wants to make refactoring changes to your codebase. Do you approve? " " yes ", " no ", " view changes " See also ["refactor_support.rq".refactor_file_moves]. Implemented by ["../../packages/extension/src/mutation_hooks_module/register-file-mutation-hooks.ts"], ["../../packages/extension/src/mutation_hooks_module/show-mutation-approval.ts"], and ["../../packages/extension/src/mutation_hooks_module/file-mutation-gate.ts"]. | ||
| rename_file | ["../../packages/language/test/file-path-rewrite.test.ts:updates inbound import path when the target file moves"] | this should update any referencess in rq files ( imports, inline references, etc ) it should also update any inline references in functional code files - per ["features-code-comment"] See also ["refactor_support.rq".refactor_file_moves] and ["refactor_support.rq".refactor_changes]. Implemented by ["../../packages/extension/src/mutation_hooks_module/file-move-plan.ts"], ["../../packages/language/src/file-path-rewrite.ts"], and ["../../packages/extension/src/mutation_hooks_module/collect-inbound-referencers.ts"]. | ||
| anonymous_reference_code_completion | ["../../../packages/language/test/completion.test.ts"] | Anonymous imports should share the same code completion e. g. ["@/reqlan rq/extension/code_completion.rq"] should complete the same as `import "@/reqlan rq/extension/code_completion.rq" as code_completion`. they should share the same code and logic | ||
| implicit_file_extension | ["../../../packages/language/test/implicit-import-extension.test.ts"] | The import statements should not require an extension, i. e. it should assume ". rq " unless otherwise specified. An extensionless path resolves to the ". rq " file first, then to a literal extensionless file. A path that already carries any extension is resolved exactly as written. | ||
| import_code_completion_explicit_extension | ["../../../packages/language/test/completion.test.ts"] | Completions insert paths with an explicit `.rq` extension. [implicit_file_extension] Hand-written imports may still omit the extension; completion prefers the written form with `.rq`. | ||
| import_code_completion_path_segments | ["../../../packages/language/test/completion.test.ts"] | In a folder context, show next path segments ( directories with a trailing `/` ). After `../`, offer `../path/` before nested `../path/file.rq`. | ||
| import_code_completion_ranking | ["../../../packages/language/test/completion.test.ts"] | Rank import path completions by directory proximity ( hop count from the completing file's directory to the candidate's directory ), then directories before files, then path alphabetically. Example: typing `../` ranks `../close.rq` before `../../../path.rq`. Emit sortText for that order, and set filterText so the editor does not re-rank by label fuzzy score over proximity. | ||
| import_code_completion_substring_match | ["../../../packages/language/test/completion.test.ts"] | Filter path candidates by search within the path, not only a starts-with prefix. Typing `path` should match `../../parent/path.rq`. Typing `hellopath` should match `../../hello/inbetween/path/file.rq` ( characters matched in order across path segments ). | ||
| import_does_not_exist_error | ["../../../packages/language/test/validating.test.ts"] | Imports show an underline error when the target file does not exist. Imports also show an underline error when a named imported idea does not exist in the target file. [general_errors] | ||
| import_error | ["../../../packages/language/test/code-actions.test.ts"], ["../../../packages/language/test/import-edits.test.ts"] | " Could not resolve reference " errors offer Quick Fix code actions ( lightbulb and editor right-click Quick Fix ). Fixes: - Add import from a matching idea found in loaded documents or the name catalog pushed from the index - Rewrite the reference to an anonymous qualified form `["path".name]` - Search the index for matching ideas, ideasets, or files ( QuickPick ), then insert an import - Create the idea in a new. rq file and import it [general_errors] [code_actions] [quick_fixes] | ||
| graph_label_auto | ["../../../packages/extension/test/graph-ui-state.test.ts"], ["../../../packages/analytical/test/export-html.test.ts"] | done | In Labels auto mode, visibility follows viewport zoom continuously rather than a hard cut. Below a low zoom threshold labels are fully hidden; above a slightly higher threshold they are fully opaque; between those thresholds opacity ramps briefly through a muted / semi-transparent phase ( GRAPH_LABEL_FADE_START → GRAPH_LABEL_FADE_END ). Hovered or dragged nodes remain fully opaque even when ambient auto opacity is low or zero. Zoom and Fit from [view_controls] / [reframe_view] must update this opacity on each paint or zoom event. Applies to Ideas Summary GraphCyController and HTML export canvas graph alike. | |
| graph_label_modes | ["../../../packages/extension/test/graph-ui-state.test.ts"], ["../../../packages/analytical/test/export-html.test.ts"] | done | Every interactive graph should provide a Labels control that cycles auto ( default ), on, and off without changing graph membership. On forces full opacity; off hides all labels; auto follows [graph_label_auto]. Reset / default restore auto. Ideas Summary: control in ["../../../packages/extension/webviews/ideas-summary/components/GraphControls.svelte"], mode persisted via ["../module/ideas_summary/graphical_graph.rq".graph_ui_persistence]. HTML export: control in ["../../../packages/analytical/src/export/html-export-template.ts"] / ["../../../packages/analytical/src/export/html-export-assets.ts"]. Driven by the same viewport zoom as [view_controls]. | |
| graph_status_tag_filters | ["../../../packages/analytical/test/export-html.test.ts"], ["../../../packages/analytical/test/filter-specials.test.ts"] | done | Status and tag graph filters are searchable checkbox dropdowns ( still a dropdown trigger; multi-select via checkboxes; OR within each field ). They must distinguish attribute absence from an empty declaration and from a literal unspecified value: - Not present — attribute key absent ( no `@status` / no `@tags` ) - Empty — attribute declared with no value ( `@status`, `@tags`, `@status ""`, bare flag ) - unspecified — literal authored value " unspecified " Do not invent unspecified for missing attributes in rollups, clusters, or filter options. Special options render differently from concrete values ( italic muted Not present; info-tint Empty; warning-tint unspecified ). Shared helpers live in ["../../../packages/analytical/src/core/filter-specials.ts"]. Surfaces: Ideas Summary SearchableCheckboxDropdown; HTML export SCD in ["../../../packages/analytical/src/export/html-export-assets.ts"]. | |
| context_content_styling | ["../../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"] | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. Priority: [scope_pane]; [reference_lists_pane] kind groups; also selection / parents. [ScopePane] [ReferenceListsPane] | |
| dependency_pulse_table | ["../../../../packages/extension/webviews/activity-bar/components/widgets/DependencyPulse.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] | done | The focus-hero [DependencyPulse] compass ( ↑ parents, → outbound, ← inbound, ↓ dependents, ● centre ) is clickable. Clicking any arm or the centre toggles a compact reference table below with Dir, Role, Idea, and Status. Rows open / focus the related idea. Duplicates of always-on inbound / outbound lists are omitted from the hero; the current-file lens still lists them. Aligns with [context_scope_v2.dependency_pulse]. Implemented by [DependencyPulse] [ScopePane]. | |
| fingerprint_axis_drilldown | ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] | done | Each [ContextFingerprint] axis row ( Files, Requirements, History, Architecture, Git, Diagnostics, Coverage ) is clickable. Clicking a row toggles a compact contributor table below it ( Source, Item, Detail ) listing what filled that axis — e. g. which lenses included a file, which ideas are in the footprint, git focus commits / authors ( dirty paths secondary ), anomalies, or relationship edges. Table rows open / focus the related idea or file when actionable. Empty axes show a short “ why care / how to fill ” message. Mirrors the interaction pattern of [dependency_pulse_table]. Aligns with [context_scope_v2.context_fingerprint] and [tooltip_detail]. Implemented by [ContextFingerprint] [ScopePane]. | |
| git_history_lens | ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/src/activity_bar_module/git-context.ts"], ["../../../../packages/extension/src/activity_bar_module/git-context-helpers.ts"], ["../../../../packages/analytical/src/core/context-model.ts"], ["../../../../packages/analytical/src/core/context-signals.ts"] | done | Expanded git dimension in [scope_pane]: focus-centric development history, not a Source Control duplicate. Layout: - Header: branch name, HEAD short hash, muted summary ( e. g. " main · 3 commits · 2 authors " ). - Focus history ( primary ): up to ~ 8 commits touching the focus file / idea line range — relative time, short hash, subject, author. Prefer `git log -L` for `.rq` ideas; fall back to path log. Non-. rq uses path `--follow`. - Authors: compact chip row of top authors from that log window. - Working tree ( secondary, collapsed by default ): dirty staged / unstaged paths for caution / footprint only. Focus hero: history cue ( last commit age / branch ), not `git: staged|unstaged`. Fingerprint Git axis and drilldown list commits / authors ( dirty paths secondary ) per [fingerprint_axis_drilldown] and [tooltip_detail]. Aligns with ["../context-scope.rq".git_context] and [context_scope_v2.development_history_signals]. Implemented by [ScopePane] [ContextFingerprint]. | |
| reference_lists_pane | ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"], ["../../../../packages/analytical/src/index-store/idea-extractor.ts"], ["../../../../packages/analytical/test/idea-extractor-namespace-refs.test.ts"] | Actionable inbound and outbound reference lists for the focused idea. - Inbound: ideas that reference the focus ( edges to the focus ). - Outbound: ideas and files the focus references ( edges from the focus ). - Group entries by edge kind ( dependency, related to, file ref, incompatible, etc. ) in collapsible sections. - Show a short snippet or source line explaining why each edge exists where available. - Text filter scoped to this pane only ( not the full ui-sql layer ). - " Add to context " pins an idea into [context_tray] for Copilot / @ reqlan workflows. - [reference_resolution_parity]: panel resolution must match the editor file view. - [unresolved_reference_create]: unresolved idea targets get a create affordance, not a dead file link. Implemented by [ReferenceListsPane]. | ||
| reference_resolution_parity | ["../../../../packages/analytical/test/idea-extractor-namespace-refs.test.ts"], ["../../../../packages/analytical/test/file-reference-resolve.test.ts"], ["../../../../packages/language/test/linking.test.ts:does not report linking error for bare namespace alias references"] | done | Reference resolution for the activity-bar references pane must use the same shared rules as the editor ( document links / go-to-definition ), not a second ad-hoc classifier. - Bare namespace-alias bracket refs such as `[ActivityBarApp]` that open a file in the editor must index as resolved `file_reference` edges ( import path ), not unresolved idea refs — per ["../../language/imports.rq".import_namespace]. - Quoted file paths and markdown file links use the same file-target treatment as the language file-link resolver in ["../../../../packages/language/src/reqlan-file-link-resolver.ts"] / ["../../../../packages/language/src/reqlan-namespace-import-links.ts"]. - File targets are opened relative to the defining `.rq` file ( same path join as the miniature graph ), not the workspace root. - If a target resolves in the file view, it must resolve ( and be openable ) in [reference_lists_pane]. Implemented by ["../../../../packages/analytical/src/index-store/idea-extractor.ts"], ["../../../../packages/analytical/src/core/file-reference-resolve.ts"], [ReferenceListsPane]. | |
| tooltip_detail | ["../../../../packages/analytical/src/core/context-signals.ts"], ["../../../../packages/analytical/test/context-signals.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/widgets/ContextFingerprint.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"] | done | Scope pane tooltips are detailed enough to explain * what * a meter means and * why it matters *. - [scope_pane] widgets ( stability, dependency pulse, timeline, churn, lens chips, footprint line ) expose granular hover copy on the control and its sub-items. - [ContextFingerprint] has an ⓘ info button with semantic scoring help, per-axis hover copy, and [fingerprint_axis_drilldown]. - Scoring copy is sourced from [context_signals] ( `CONTEXT_FINGERPRINT_HELP`, `CONTEXT_FINGERPRINT_AXIS_HELP`, `buildContextFingerprint` ) so UI stays aligned with [context_scope_v2.context_fingerprint] and [context_scope_v2.ai_readiness_gauge]. Implemented by [ContextFingerprint] [ScopePane]. | |
| unresolved_reference_create | ["../../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"], ["../../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"] | done | When an outbound reference remains unresolved after shared resolution ( missing idea, not a file / namespace-alias target ): - Do * * not * * treat the label as a file path or navigate to a non-existent file. - Show an unresolved badge and a * * + * * control with tooltip " Create idea ". - Activating * * + * * opens create-idea ( reuse [commands.pallete_function_create_todo] when available; until then, the existing import-error create-file flow prefilled with the reference name and source document ). Implemented by [ReferenceListsPane] and the activity-bar host message handler. | |
| workspace_base_picker | ["../../../../packages/extension/test/filter-bases.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/BasePicker.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"], ["../../../../packages/extension/webviews/activity-bar/state/app.svelte.ts"], ["../../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"] | done | Bases in the Workspace pane are chosen via a * * searchable dropdown * *, not a stacked list of base rows. - Closed: shows the active base label ( and compact ready / issue hint when useful ). - Open: type-to-filter over discovered bases by label and path; selecting a match * * pins * * the active base ( [bases.active_base_switch] ) — a pointer swap, not a sync. - Options surface label / path plus ready state and idea / edge / issue counts so the user can distinguish bases before committing. - Single-base workspaces still use the same control ( no special flat list ); empty discovery stays on the Create Base CTA. - Prefer VS Code dropdown tokens for chrome; keep the control compact so health / stats / actions remain the focus of the pane. Switch UX: - Selecting a base posts immediately; the picker may flash * * Switching … * * until `indexHealth` confirms `activeBaseId` ( should be near-instant ). - Never kick soft / hard sync on switch; readiness / progress for a not-yet-ready base is whatever the index already reports. - Editor-follow must not overwrite a user-selected base on the same refresh that applies the selection. Implemented by [BasePicker] in [WorkspacePane]; filter helpers in [filter_bases]. | |
| workspace_content_styling | ["../../../../packages/extension/test/group-file-issues.test.ts"], ["../../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"] | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. File → errors grouping via [group_file_issues] in [WorkspacePane]. | |
| header_buttons | ["../../../packages/extension/webviews/activity-bar/components/HeaderBar.svelte"], ["../../../packages/extension/src/activity_bar_module/context-session.ts"] | Cross-pane controls live in a compact header above the pane stack. - " Sync with editor " toggle: panes follow the active editor and cursor by default; when off, stay pinned on the last focused idea. - [hop_depth_control]: global graph hop depth for context search, graph slice, references, and ancestors — not a boolean toggle. - " Open in Ideas Summary ": reveal [ideas_summary_panel] with the ideas table filtered to the current file, or the graph tab centred on the current idea. - " Export slice ": JSON or CSV of the current neighbourhood only ( lighter than workspace [commands.export_json] / [commands.export_csv] ). - " Copy as markdown ": copy the focused idea plus parents and reference lists for pasting into chat or PRs. - Refresh control tied to index readiness. - [info_site_link] | ||
| loading_state | ["../../../packages/extension/webviews/activity-bar/App.svelte"], ["../../../packages/extension/webviews/activity-bar/state/app.svelte.ts"], ["../../../packages/extension/webviews/activity-bar/components/BootstrapStatus.svelte"], ["../../../packages/extension/src/activity_bar_module/activity-bar-webview-provider.ts"], ["../../../packages/extension/src/activity_bar_module/get-activity-bar-html.ts"], ["../../../packages/extension/test/startup-gate.test.ts"] | done | After the activity bar shell mounts, the header may appear before pane data. Cover every sequencing beat with an explicit loading or error affordance — never a blank content area: 1. HTML shell ( before Svelte boots ): inline waiting markup in [get_activity_bar_html]. 2. Connecting: header visible; a post-first-frame `ready` handshake starts the index and requests the first host state. 3. Waiting for index: [workspace_panel.workspace_loading]. 4. Ready panes: [current_context_scope.context_panes_loading] and [minigraph.minigraph_loading]. Index sync progress belongs in [workspace_pane]; graph slice waits stay in [miniature_graph_pane], not a second global overlay. Host posts index health on `ready` and on subsequent status changes; soft-waits when the index is not ready instead of erroring the whole bar. | |
| panel_content_styling | ["../../../packages/extension/test/group-file-issues.test.ts"], ["../../../packages/extension/webviews/activity-bar/components/NestedSection.svelte"], ["../../../packages/extension/webviews/activity-bar/components/WorkspacePane.svelte"], ["../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../packages/extension/webviews/activity-bar/components/ReferenceListsPane.svelte"] | done | Pane bodies must not grow unbounded. Nested lists use [NestedSection] ( collapse + scroll ) under [CollapsiblePane]. Details: [workspace_panel.workspace_content_styling], [current_context_scope.context_content_styling]. [WorkspacePane] [ScopePane] [ReferenceListsPane] | |
| performance | ["../../../packages/extension/test/startup-gate.test.ts"], ["../../../packages/analytical/test/workspace-index-lazy-services.test.ts"] | done | Sidebar webviews share the same constraints as [graph_lib.webview_threading]. - The HTML / Svelte shell paints before index discovery begins; the post-paint `ready` handshake starts indexing. - Keep sql. js outside the activation-critical host bundle and load it only when a database opens. - Default neighbourhood slices; never load the full workspace graph into a pane. - Debounce editor selection and cursor events before rebuilding slices. - Lazy-mount cytoscape only for visible sub-panes; destroy when collapsed or hidden. - Reuse [graph_analysers.local_graph_analysis] and graph query builders rather than ad-hoc index walks in the webview. | |
| context_model_layers | ["../../../packages/analytical/src/core/context-model.ts"], ["../../../packages/analytical/src/core/context-signals.ts"] | done | Canonical v2 layers. Implementation builds on [context_scope_v1.reqlan_context_model]; consumers must not reconstruct project understanding independently. | |
| context_scope_v2 | ["../../../packages/analytical/test/context-signals.test.ts"], ["../../../packages/extension/test/context-model.test.ts"], ["../../../packages/extension/test/context-widgets.test.ts"] | in-progress | context, ui, knowledge, v2 | Evolves [context_scope_v1.context_scope] from a * * source-oriented * * model ( " where did this context come from? " ) to a * * decision-oriented * * model ( " what information helps a human or AI make the next decision? " ). v1 [context_scope_v1.context_dimensions] remain valid * producers * ( workspace, current file, open files, file history, edit history, manual, git ). v2 separates those producers from extracted signals, synthesized knowledge, presentation views, and consumers — so new analyses can be added without inventing new dimensions each time. Primary UI principle: [ui.show_dont_tell] — make project health, momentum, relationships, and intent legible at a glance. Host fact chips ( " 17 modified files " ) remain useful; widgets below are the preferred default for conveying meaning. Surfaces: extend [activitybar.scope_pane] / [context_scope_v1.scope_pane_design], Ideas Summary ( [ideas_summary_doc.ideas_summary] ), and graph overlays ( [graphical_graph_doc.graphical_graph] ) — same signals, different projections. |
| context_signals | ["../../../packages/analytical/test/context-signals.test.ts"], ["../../../packages/extension/test/context-model.test.ts"] | done | Extracted facts. Answer: " What useful information exists? " One source may emit many signals ( e. g. git → development history, not only staged / unstaged ). Families: - [requirement_signals] - [file_signals] - [development_history_signals] - [project_activity_signals] - [semantic_signals] - [quality_signals] - [user_signals] - [relationship_signals] - [temporal_signals] - [risk_signals] - [architecture_signals] - [requirement_lifecycle_signals] - [base_signals] Signals are evidence; [synthesized_context] merges them into actionable knowledge. | |
| show_dont_tell | ["../../../packages/extension/webviews/activity-bar/components/widgets"], ["../../../packages/extension/test/context-widgets.test.ts"] | in-progress | ui, widgets, show-dont-tell | Make project state * * legible at a glance * *. Prefer visual evidence of health, momentum, relationships, and intent over numeric fact lists. Widgets below are show-don ' t-tell components for [context_scope_v2]; each consumes [context_signals] / [synthesized_context] and may appear in activity bar, Ideas Summary, focus heroes, search results, or graph overlays. Placement guidance: - Focus / card density: [timeline_ribbon], [churn_heat_bar], [dependency_pulse], [stability_meter], [change_velocity], [requirement_lifecycle_wheel], [requirement_card], [confidence_card], [ai_readiness_gauge] - Workspace chrome / dashboard denser: [activity_river], [project_weather], [context_fingerprint], [architectural_map] - Graph / Ideas Summary: [hotspot_overlay], [impact_radius], [activity_constellation], [historical_replay_slider], [relationship_cloud] - Coverage / ownership / density: [knowledge_coverage], [traceability_matrix], [ownership_distribution], [concept_density], [context_radar], [semantic_diff_viewer] |
| synthesized_context | ["../../../packages/analytical/test/context-signals.test.ts"], ["../../../packages/extension/test/context-model.test.ts"] | done | Signals merged into decision-oriented knowledge not tied to a single source. Example projection on a requirement: - Importance, Confidence, Stability, Recent Activity - Dependencies, Implementations, Tests, Documentation - AI Risk Synthesis powers [show_dont_tell] widgets and [features_ai.ai_integration] exports — preference for compact synthesized facts over raw dimension dumps ( [context_scope_v1.ai_context_export] ). | |
| dimension_hop_control | ["../../../packages/extension/webviews/activity-bar/components/ScopePane.svelte"], ["../../../packages/extension/src/activity_bar_module/context-session.ts"] | When a graph-searchable dimension lens is expanded in [scope_pane_design], show a local * * − / value / + * * pair. Applies to [current_file_context], [open_files_context], [file_history_context], [edit_history_context], and [manual_context] — not [workspace_context] or [git_context]. Per-dimension override inherits [global_hop_depth] until the user adjusts it; stored in dimensionHopDepth on the session and model. Edge cases match [activitybar.hop_depth_control]: disable − at min, + at max, clamp on apply. | ||
| reqlan_context_model | ["../../../packages/analytical/src/index-store/webview-graph-queries.ts"], ["../../../packages/extension/src/activity_bar_module/context-model.ts"] | Canonical composed context per [analytical_context_model]. Implementation: [context_model]. - [context_focus] is the single anchor ( idea, file, selection, or none ). - [context_dimensions] each contribute [context_contribution] records with counts and summary lines. - [context_footprint] merges enabled dimensions into deduped idea / file sets and an [effective_center_id] for graph / refs panes. - [current_file_slice] is the projection used when the current-file lens is expanded. Includes `isRqFile`, `referencingIdeas`, `commentLinkedIdeas`, `folderReferencingIdeas`, and optional `gitChange`. - [context_selection] when the user highlights a non-empty range spanning one or more `.rq` ideas ( [activitybar.selection_pane] ). - [global_hop_depth] and [dimension_hop_control] overrides on the model. Host increments `revision` when any dimension or hop depth changes; webview ignores stale posts by revision. | ||
| bases_tab | ["../../../../packages/extension/test/bases-table-filter.test.ts"] | done | Table of discovered [ontology.base] entries in the workspace ( label, path, ready, idea / edge / issue counts, state ). Selecting a row pins that base ( pointer swap ) per [ideas_summary_base.ideas_summary_base_scope]. Filterable / sortable / column options like other tables; data comes from index status, not a merged cross-base SQLite dump. Client-side search and column filters via [BasesTable] / bases-filter matcher. | |
| ideas_table_filters | ["../../../../packages/analytical/test/webview-table-queries.test.ts"] | done | the ideas table should support text search, column sorting, and attribute-column filters driven by chip clicks. attribute filters require a non-null attribute value in sqlite json per [webview_table_queries] reference chip filters match outbound / inbound edges by target or source id per [webview_table_queries] chips are right-aligned so truncated labels keep the informative suffix visible. active attribute and reference filters appear as removable chips in the table toolbar. Also [table_column_filters], [table_column_options], and [group_by_type]. | |
| table_column_filters | ["../../../../packages/analytical/test/webview-table-queries.test.ts"], ["../../../../packages/extension/test/bases-table-filter.test.ts"] | done | Every data table supports a global search and a per-column filter row ( [ColumnFilterRow] ), matching the usability of [html_export.html_export_list_views]. Text / path / body columns use searchable inputs; closed sets ( idea kind, reference type, ideaset kind, base ready ) use select / multi-select from a fixed option list. Column filters are applied in the ui-sql layer ( [webview_table_queries] ) together with existing chip filters. Table panels must bind AppState query / rows via Svelte 5 `$derived` ( not legacy `$:` ) so filtered results from the extension message listener re-render — same pattern as [graphical_graph_doc.graphical_graph] / GraphView. Bases table filters client-side in the webview; other tables round-trip search through [ideas_summary_panel]. | |
| index_diagnostics_store | ["../../../packages/analytical/test/index-diagnostics.test.ts"] | done | Per-base diagnostic timing index at `<base>/.reqlan/index-diagnostics.sqlite`. Sibling of `ideas-index.sqlite`; not deleted by Clear & rebuild. Records sync runs and per-file durations for ["../features-index-diagnostics.rq".index_diagnostics_metrics]. Webview: ["../features-index-diagnostics.rq".index_diagnostics_webview]. | |
| rqignore | ["../../../packages/analytical/test/rqignore.test.ts"], ["../../../packages/analytical/test/create-base.test.ts:seeds .reqlan/.rqignore when creating a new base"], ["../../../packages/analytical/test/workspace-index.test.ts:skips .rq files under rqignore patterns"] | done | `.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, VCS / editor stores, database files ( `*.db3`, sqlite ), secrets, and hidden entries; new bases seed the file via create-base. Product configuration statement: [configuration.configuration_rqignore]. | |
| installation_event | ["../../packages/language/test/parsing.test.ts:parse thanks-for-installing template"], ["../../packages/extension/test/onboarding-rq-highlight.test.ts"] | done | On installation of the extension a webview should be opened showing: - A welcome message - Resolved links to site, github, docs etc. ( not template placeholders ) - A syntax-highlighted example `.rq` with real URLs ( clickable ) from ["../../packages/extension/templates/thanks-for-installing.template.rq"] after placeholder substitution - A control to open that example as an untitled `.rq` editor beside the webview - Short tips for the activity bar and `@reqlan` chat - A thanks to sponsors Place in overall install sequencing: ["../installation.rq".welcome_webview_install] / ["../installation.rq".extension_installation]. Implemented as a Svelte webview under ["../../packages/extension/webviews/onboarding/"] bundled to ["../../packages/extension/media/webviews/onboarding/"] and opened once on first activation by ["../../packages/extension/src/extension/open-thanks-for-installing.ts"] via ["../../packages/extension/src/extension/onboarding-panel.ts"]. Resource links and template values are resolved at runtime from [phonebook_reqs.phonebook] through ["../../packages/extension/src/shared/phonebook.ts"] and posted to the webview; the example block imports ["../../packages/extension/templates/thanks-for-installing.template.rq"] via Vite `?raw` and substitutes `{{…}}` placeholders before display. Highlighting uses the onboarding tokenizer in ["../../packages/extension/webviews/onboarding/lib/rq-highlight.ts"]. The source template still uses placeholders such as { { SITE_URL } }; those matching braces are body prose per ["../language/syntax-edge-cases.rq".nested_curly_braces] and must parse without errors. Activation state is stored in extension global state key `onboarding` with `onboardingMessageShown` and `lastVersion` per ["../../packages/extension/src/extension/onboarding-state.ts"]. VS Code persists `globalState` in the extension global storage directory ( `globalStorage/reqlan.reqlan-extension/state.vscdb` under the editor user data folder ). | |
| refactor_file_moves | ["../../packages/language/test/file-path-rewrite.test.ts:updates inbound import path when the target file moves"], ["../../packages/language/test/file-path-rewrite.test.ts:preserves extensionless inbound paths"], ["../../packages/language/test/file-path-rewrite.test.ts:buildInboundPathRewriteEdits quotes replacement paths"], ["../../packages/language/test/file-path-rewrite.test.ts:updates paths when a file moves to a sibling directory"] | The extension should watch for file moves and renames, migrate the index for moved . rq files, and update imports and path references both inside the moved file ( outbound ) and in other files that pointed at it ( inbound ), including comment paths in code files. There should be a single prompt per batch asking whether to apply path updates, aligned with [move_file] and [rename_file]. Implemented by ["../../packages/extension/src/mutation_hooks_module/register-file-mutation-hooks.ts"], ["../../packages/extension/src/mutation_hooks_module/file-move-plan.ts"], ["../../packages/extension/src/mutation_hooks_module/file-mutation-gate.ts"], ["../../packages/language/src/file-path-rewrite.ts"], and ["../../packages/language/src/reqlan-path-references.ts"]. | ||
| refactor_symbol_delete | ["../../packages/language/test/idea-refactor.test.ts:delete plan removes declaration and bracket references"] | An idea declaration should offer a code action to delete it and update references. Deleting should remove the declaration, clear or rewrite AST and comment references that targeted it, and reindex affected files. [refactor_support] [refactor_changes] Implemented by ["../../packages/language/src/reqlan-idea-refactor.ts"], ["../../packages/language/src/reqlan-code-action-provider.ts"], and ["../../packages/extension/src/refactor_module/register-idea-refactor-commands.ts"]. | ||
| refactor_symbol_move | ["../../packages/language/test/idea-refactor.test.ts:move plan cuts from source and inserts into destination"] | An idea declaration should offer a code action to move it to another. rq file. Moving should cut the declaration from the source, insert it into the destination, rewrite imports and references ( including comment references ), and reindex without leaving duplicate idea rows for the old hosting file. [refactor_support] [refactor_changes] Implemented by ["../../packages/language/src/reqlan-idea-refactor.ts"], ["../../packages/language/src/reqlan-code-action-provider.ts"], and ["../../packages/extension/src/refactor_module/register-idea-refactor-commands.ts"]. | ||
| refactor_symbol_rename | ["../../packages/language/test/rename-provider.test.ts:rename updates declaration and wikilink references"], ["../../packages/language/test/rename-provider.test.ts:rename also updates rq comment idea tokens in the same document"], ["../../packages/language/test/comment-rename.test.ts:builds rename edits for matching comment idea tokens"], ["../../packages/language/test/linking.test.ts:rename finds all idea references including wikilinks"] | Syntactic symbols ( ideas, ideasets, import aliases, and import paths ) should be renamable via the editor rename action ( F2 / LSP rename ). Rename should update AST references across. rq files and matching `rq:["path".idea]` comment idea tokens in source files. [refactor_support] Implemented by ["../../packages/language/src/reqlan-rename-provider.ts"], ["../../packages/language/src/reqlan-comment-rename.ts"], ["../../packages/language/src/reqlan-name-provider.ts"], and ["../../packages/extension/src/refactor_module/register-comment-rename-provider.ts"]. | ||
| extension_startup_reliability | "../../packages/extension/test/startup-gate.test.ts", "../../packages/analytical/test/workspace-index-lazy-services.test.ts" | done | Reqlan startup must make the activity-bar shell and contributed commands available before optional indexing, parser construction, database initialization, or language-client startup can monopolize the extension host. The implementation contract is [first_paint_contract], [deferred_startup_sequence], [lazy_runtime_dependencies], and [development_bundle_freshness]. Operational diagnosis follows [startup_diagnostics]. [activation.activation_sequence] [activitybar.loading_state] [indexer.nonblocking_index] [build.extension_bundle] | |
| first_paint_contract | "../../packages/extension/test/startup-gate.test.ts" | done | The platform spinner ends only after VS Code loads the host module, calls `activate`, the provider registers, and `resolveWebviewView` assigns HTML. Reqlan assigns the lightweight HTML / Svelte shell first. The webview installs its host message listener, mounts, waits for its first animation frame, then posts the one-shot `ready` signal from a queued task. Index discovery / sync waits for that post-paint signal so synchronous parser or database setup cannot race the first visible frame. [activation.first_paint_startup] ["../../packages/extension/webviews/activity-bar/App.svelte"] ["../../packages/extension/webviews/activity-bar/state/app.svelte.ts"] ["../../packages/extension/src/extension/startup-gate.ts"] | |
| lazy_runtime_dependencies | "../../packages/analytical/test/workspace-index-lazy-services.test.ts" | done | Base discovery must be cheap: - Constructing `WorkspaceIndex` does not construct Langium / Chevrotain services; services are memoized on first parse. - sql. js asm is not parsed as part of `main.cjs`; both index stores dynamically import the generated vendor bundle when a database first opens. - Export / physics source is generated at build time rather than read via extension-runtime URLs. The host bundle consequently fell from approximately 11. 2 MB to 2. 66 MB; sql. js occupies a separate approximately 8. 0 MB lazy vendor bundle. ["../../packages/analytical/src/index-store/workspace-index.ts"] ["../../packages/analytical/src/index-store/sqlite-store.ts"] ["../../packages/analytical/src/index-store/index-diagnostics-store.ts"] ["../../packages/extension/esbuild.mjs"] | |
| verification_contract | "../../packages/extension/test/startup-gate.test.ts", "../../packages/analytical/test/workspace-index-lazy-services.test.ts" | done | Startup changes are complete only when: - The production extension build succeeds and emits both `out/extension/main.cjs` and `out/extension/vendor/sql-asm.cjs`. - The main bundle does not contain the sql. js asm implementation and imports the vendor lazily. - The lazy vendor can initialize a database. - Extension startup-gate and analytical lazy-service tests pass. - Activity-bar shell paint is visually checked in a newly restarted F5 development host; activation failures are cached for the lifetime of a failed host session. - Requirement analysis resolves the updated startup graph. | |
| code_lens_reference_types | ["../../../packages/language/test/code-lens.test.ts"] | done | References should have a ["../vsc-primitives.rq".codelens] button. The button should be togleable in settings. The button should the classification of the reference. e. g. ' open reqlan file', " open { extension } file', ' open folder', ' open idea' Clicking the CodeLens should open a reference card with summary stats — not navigate, because references already act as editor links. The card should offer open / reveal / file-selector actions when useful. Folders should be handled by focusing on the ide explorer, or by opening a file selector. Some summary stats should be shown for references - e. g. last edited, count of references, count of referencers, etc. Implemented by ["../../../packages/language/src/reqlan-code-lens-provider.ts"], ["../../../packages/language/src/reqlan-reference-code-lens.ts"], ["../../../packages/language/src/reqlan-code-lens-settings.ts"], ["../../../packages/extension/src/extension/register-reference-code-lens.ts"], and ["../../../packages/extension/src/extension/reference-code-lens-card.ts"]. | |
| inbound_inlay_hints_whole_graph | ["../../../packages/language/test/inlay-hints.test.ts"] | done | Inbound references shown in [view_references_as_inlay_hints] should include referencers from the whole requirement graph across the workspace, not only ideas declared in the current file. Implemented by ["../../../packages/language/src/reqlan-inbound-reference-inlay-label.ts"], ["../../../packages/language/src/reqlan-inlay-hint-provider.ts"]. [view_references_as_inlay_hints] [traceable_inlay_hints] | |
| reference_code_completion | ["../../../packages/language/test/completion.test.ts"], ["../../../packages/language/test/completion.test.ts"] | autocompletion | references should code complete the available namespace of ideas this includes both ideas using hte standards idea namespace syntax, and ideas using file paths, and relative file paths. Implemented by ["../../../packages/language/src/reqlan-completion-provider.ts"]. ["../code_completion.rq"] | |
| reference_code_completion_sequencing | ["../../../packages/language/test/completion.test.ts"] | [reference_code_completion] should be offered, not alphabetically, but by distance, then alphabetically. Implemented by ["../../../packages/language/src/reqlan-completion-provider.ts"]. ["../code_completion.rq".code_completion] | ||
| traceable_inlay_hints | ["../../../packages/language/test/inlay-hints.test.ts"] | done | Inlay hints should be traceable, i. e. if a user clicks a specific idea reference, it should open that idea, if a user clicks the all references hint, it should open a search webview with the idea preselected / targets prefiltered Implemented by ["../../../packages/language/src/reqlan-inbound-reference-inlay-label.ts"], ["../../../packages/language/src/reqlan-inlay-hint-provider.ts"], and ["../../../packages/extension/src/webview_module/register-webview.ts"]. | |
| view_references_as_inlay_hints | ["../../../packages/language/test/inlay-hints.test.ts"] | incomplete | References should be shown as inlay hints in the editor. This should be a toggleable setting, which should be available in the command palette. N-lines ( configurable setting ) of hints should be shown below the idea. Implemented by ["../../../packages/language/src/reqlan-inlay-hint-provider.ts"], ["../../../packages/language/src/reqlan-inbound-reference-inlay-label.ts"], ["../../../packages/language/src/reqlan-inlay-hint-settings.ts"], and ["../../../packages/extension/src/extension/register-reference-inlay-hints.ts"]. | |
| at_sign_in_idea_text_block | ["../../../packages/language/test/parsing.test.ts"], ["../../../packages/language/test/parsing.test.ts"] | the @ symbol should only indicate an attribute if at the start of a line. it should be escapeable with a backslash ( although any character would work as the @ would no longer be at the start of the line ) so @ this_is_not_an_attribute | ||
| code_completion | ["../../../packages/language/test/completion.test.ts:completes import-root alias paths"] | The extension should support sensible code completion. - support for references - support for imports, including import-root alias paths such as `@/` from ["../../language/imports.rq".configuration_import_root_alias] and ["../configuration.rq".configuration_import_roots] - support for semantic search - support for graph-proximity based ranking | ||
| file_references | ["../../../packages/language/test/linking.test.ts:document links resolve test file references to the matching test"], ["../../../packages/language/test/linking.test.ts:folder file references resolve without reading the directory as a file"], ["../../../packages/language/test/linking.test.ts:empty file references produce document links and warning diagnostics"], ["../../../packages/language/test/linking.test.ts:parse-error file references produce document links and warning diagnostics"], ["../../../packages/language/test/linking.test.ts:missing file references do not produce document links"] | A file reference should act as a link in the editor. If the target file is empty or has a parse error, the link should remain available and clickable, but should show a warning underline. Implemented by ["../../../packages/language/src/reqlan-file-link-resolver.ts"], ["../../../packages/language/src/reqlan-document-link-provider.ts"], ["../../../packages/language/src/reqlan-definition-provider.ts"], and ["../../../packages/language/src/reqlan-validator.ts"]. | ||
| nonblocking_index | [workspace_index_tests], "../../packages/analytical/test/workspace-index-lazy-services.test.ts" | done | Index 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/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 [graph_analysers.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. Implemented by [workspace_index]; editor adapter [editor_index_adapter]. | |
| configuration_import_root_alias | ["../../packages/language/test/path-resolve.test.ts:resolves import-root alias against the workspace folder"], ["../../packages/language/test/path-resolve.test.ts:leaves non-aliased relative paths document-relative"], ["../../packages/language/test/path-resolve.test.ts:matchImportRootAlias requires alias then slash"], ["../../packages/language/test/path-resolve.test.ts:loads importRoots list from nearest base config"], ["../../packages/language/test/path-resolve.test.ts:resolves using config importRoots mapping"], ["../../packages/language/test/path-resolve.test.ts:rewrite leaves aliased paths unchanged"], ["../../packages/language/test/completion.test.ts:completes import-root alias paths"], ["../../packages/language/test/config.test.ts:multiple importRoots map aliases to different roots"], ["../../packages/language/test/config.test.ts:longest alias wins when mappings overlap"], ["../../packages/language/test/config.test.ts:aliased path uses relative root from applying config"], ["../../packages/language/test/config.test.ts:aliased path uses workspace folder when root is omitted"] | An import path may start with an alias string, then `/`, then a relative path under that alias's import-root directory. Default alias string: `@`, written as `@/` plus a path relative to the import root. Default import-root directory: the workspace folder that contains the `.rq` file ( not the document directory ). The path after `/` is joined to that alias's import-root directory; the alias itself must be followed by `/` ( e. g. `@reqs` is not aliased ). Alias strings and import-root directories are configured as [configuration.configuration_import_roots] in the applying `.reqlan/config.json` from [configuration.configuration_location]. A configured relative `root` resolves against the base root ( parent of `.reqlan` ); an omitted `root` keeps the workspace-folder default. When several configured aliases could match a path, the longest alias wins. Related path forms: [import_paths]. Completion: ["../extension/syntax/features-syntax.rq".code_completion]. | ||
| import_error_recovery | ["../../packages/language/test/parsing.test.ts:malformed from-as import keeps later ideas parseable"], ["../../packages/language/test/validating.test.ts:reports local diagnostic for from-as mistaken import"], ["../../packages/language/test/validating.test.ts:reports local diagnostic for unquoted from-import"] | A malformed import must not invalidate the rest of the file. Recoverable invalid `from` shapes parse as local import nodes with a line-level diagnostic: - `from "path" as alias` ( mistaken namespace form ) — suggest `import "path" as alias` or `from "path" import <idea>` - bare `from "path"` — require the `import <idea>` clause - `from` without a quoted path — consume the remainder of the line as an invalid import Later imports and top-level ideas continue to parse and link normally. Same recovery posture for nameless top-level braces: ["./syntax.rq".no_name_idea_safe_warning]. If lex / parse never completes, see ["./parser_lexer.rq".parse_budget_timeout]. | ||
| import_from | ["../../packages/language/test/parsing.test.ts:parses from-import example line inside an attribute block value"] | From-import syntax uses from, a quoted path, import, and an idea name. From-import may include an alias using as. | ||
| import_namespace | ["../../packages/language/test/linking.test.ts:resolve namespace import references to files"], ["../../packages/language/test/linking.test.ts:namespace import bracket reference links only the alias name"] | Namespace import syntax uses import and a quoted path. Namespace import may include an alias using as. A bracket reference to the alias alone — for example [context_model] — opens the imported file and links only the alias name, like an ideaset namespace. Qualified references through the alias — for example [context_model.builder] — resolve ideas from the imported module. | ||
| import_tokenisation | ["../../packages/language/test/validating.test.ts:allows local idea when import uses an alias"], ["../../packages/language/test/validating.test.ts:allows local idea when qualified import uses an alias"], ["../../packages/language/test/validating.test.ts:reports duplicate when local idea shares unaliased import binding"], ["../../packages/language/test/linking.test.ts:import idea reference resolves to imported file when local idea shares name"] | if an import is given an alias, then the base name is still available as a variable name and should not cause a conflict. Only the alias binds in the importing file; the imported idea's base name may be reused for a local idea. e. g. The same rule applies to qualified imports with `as`. Unaliased imports still bind the idea name and conflict with a local idea of that name. Related: ["../extension/syntax/features-syntax.rq".sensible_alias_support]. | ||
| parse_budget_timeout | ["../../packages/language/test/parse-budget.test.ts:times out a hung parse worker with warning and error"], ["../../packages/language/test/parse-budget.test.ts:returns incomplete result when worker parse fails"], ["../../packages/language/test/parse-budget.test.ts:parses a normal file within budget"], ["../../packages/language/test/parse-budget.test.ts:parses small files on the calling thread without a worker"], ["../../packages/language/test/parse-budget.test.ts:escalates large files to the worker path"], ["../../packages/language/test/parse-budget.test.ts:forceWorker escalates a small file"] | done | Lexing, parsing, or a parse subprocess for a single `.rq` file must finish within a wall-clock budget. If it cannot, do not hang the language server or block the rest of the workspace. Surface both a warning ( budget exceeded; semantic features may be incomplete ) and an error ( file left unloaded ) on that document, then continue with other files. Happy path stays in-process ( sync ) for typical file sizes so edits and workspace load stay fast. Killable worker enforcement is used when the input is large, a file previously hit the budget ( sticky escalate ), or a caller forces the worker path; sync throws still become the same incomplete result shape. | |
| closing_nested_curly_braces | ["../../packages/language/test/parsing.test.ts:allows escaped closing brace in body prose"] | if, for some reason, there is a prose block containing only closing curly braces, they should be escaped and allowed \ } like this. | ||
| context_sensitive_lexer_scaling | ["../../packages/language/test/parsing.test.ts:parses a large import prelude without repeated full-document brace scans"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"] | done | Context-sensitive token classification for structural / prose braces and top-level import keywords must remain linear in document size. The lexer records brace-depth changes sparsely ( not per-character tables ) and looks them up in log time while tokenising, so workspace language-server initialization and editor re-lexes stay bounded. Code fences are skipped during the brace scan so example braces cannot inflate work or desync depth. Bounded work still assumes the lexer / parser * returns *; unbounded hangs are cut by ["./parser_lexer.rq".parse_budget_timeout]. | |
| nested_curly_braces | ["../../packages/language/test/parsing.test.ts:keeps inline prose brace pairs as text"], ["../../packages/language/test/parsing.test.ts:keeps end-of-line matching prose braces as text"], ["../../packages/language/test/parsing.test.ts:parse thanks-for-installing template"] | if there is a prose block containing curly braces, { such as this one } they should be treated as part of the prose. Matching braces that end a line — including adjacent pairs like { { SITE_URL } } — stay in the body; they must not close the enclosing idea. A lone `}` on its own line still closes the structural block so an unbalanced prose `{` cannot swallow the idea closer. | ||
| attribute_forms | ["../../packages/language/test/parsing.test.ts:parses valued attributes without a colon"], ["../../packages/language/test/parsing.test.ts:still accepts optional colon before attribute values"] | A bare attribute name after @ denotes a true flag or render keyword. A negated flag uses a trailing bang after the attribute name. A valued attribute uses a space after the attribute name followed by a value. A colon after the attribute name is optional legacy syntax and is not part of the value. Common attributes include plan, status, priority, criticality, confirmation, owner, log, tags, and references with the @ prefix. Any custom attribute name is allowed. | ||
| attribute_location | ["../../packages/language/test/parsing.test.ts:treats mid-line @ as body text and line-start @ as attribute"], ["../../packages/language/test/parsing.test.ts:backslash before @ at line start keeps it as body text"] | Marked attributes must be at the start of a line. @ this_is_not_an_attribute | ||
| code_snippets | ["../../packages/language/test/parsing.test.ts:parse code snippet in block idea"], ["../../packages/language/test/parsing.test.ts:parse fenced code block in attribute value"], ["../../packages/language/test/parsing.test.ts:treats fenced rq example as opaque text"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"] | Idea bodies and block attribute values may embed fenced code blocks delimited by triple backticks. An opening fence is three backticks on a line, optionally followed by a language tag such as python or rq. A closing fence is three backticks on a line. Everything between the fences is literal opaque text — it is not parsed as reqlan syntax. Keywords, imports, attributes, braces, and quotes inside a fence are inert for the parser and may be shown as examples without parse errors. Fenced blocks may span multiple lines and preserve their inner content verbatim. Brace-depth tracking must skip fence interiors so example braces cannot desync surrounding structure ( [no_name_idea_safe_warning] ). | ||
| comment_reference_ignore | ["../../packages/language/test/ignore-error.test.ts"] | Comment reference ignore syntax uses `//rq-ignore-error`. Comment reference ignore suppresses diagnostics on the immediately following line. | ||
| file_layout | ["../../packages/language/test/parsing.test.ts:parse syntax.rq"] | incomplete | A file begins with zero or more import statements, followed by top-level ideas and ideasets. The file forms an implicit ideaset; its name may default to the filename without the suffix. Front matter syntax is not yet specified. | |
| idea_name | ["../../packages/language/test/parsing.test.ts:parse dash and underscore delimited idea names"] | Idea names are identifiers or double-quoted strings. Unquoted names follow identifier rules and may use letters, digits, underscores, and dashes, for example myidea, my_idea, or dash-or_underscore_delimited-idea. Quoted names allow spaces and other characters when wrapped in double quotes. Idea names must be unique within their ideaset or file. Idea names should not use reserved keywords. | ||
| lists | ["../../packages/language/test/parsing.test.ts:parse list items as one-liners and anonymous blocks"], ["../../packages/language/test/parsing.test.ts:keeps inline parentheses in body prose as text"] | Parenthesized lists contain newline-separated items. Each list item is either a one-liner or a nameless block idea in curly braces. Lists may appear as attribute values and inside block bodies. Named lists use a label followed by a parenthesized item list; the opening parenthesis must be followed by a newline before the first item. Nested lists may appear inside block values or as list items; the opening parenthesis must be followed by a newline before the first item. Inline parentheses in body prose — for example continuous ( " live " ) physics or ( pixelRatio 1, no WebGL ) — are plain text, not lists. | ||
| naked_strings_in_body | ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in block body text"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in attribute scalar values"], ["../../packages/language/test/parsing.test.ts:keeps single-quoted naked phrases in block body text"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in one-liner body after the idea name"], ["../../packages/language/test/parsing.test.ts:keeps naked quoted phrases in list items"], ["../../packages/language/test/parsing.test.ts:keeps naked quotes alongside bracket references on one line"], ["../../packages/language/test/parsing.test.ts:does not treat naked quoted path-like prose as an import reference"], ["../../packages/language/test/parsing.test.ts:parses reframe requirement snippets with naked quoted UI labels"], ["../../packages/language/test/parsing.test.ts:parses self-contained ideas with apostrophe contractions in body prose"], ["../../packages/language/test/naked-strings.test.ts"], ["../../packages/language/test/comment-in-string.test.ts:single-quoted URL in block body is naked prose"] | Quoted text in idea bodies, attribute values, and list items is plain prose, not a string literal. Quote characters are preserved in the body text. For example, " Fit to view " in a bullet line is body text. String literals are reserved for import paths, top-level quoted idea names, and quoted paths inside bracket references. | ||
| no_name_idea_safe_warning | ["../../packages/language/test/parsing.test.ts:parses top-level nameless braces without aborting later ideas"], ["../../packages/language/test/parsing.test.ts:treats fenced TypeScript braces as opaque for surrounding structure"], ["../../packages/language/test/validating.test.ts:warns on top-level nameless braces without invalidating later ideas"] | done | A top-level nameless curly-brace block — `{... }` with no idea name — must not take down the parser or the language server workspace. Parse the block as a recoverable anonymous top-level element, emit a descriptive warning that a name is required before `{`, and continue so later ideas, imports, and links still work. Nameless blocks inside parenthesized lists remain valid list items per [lists]; only top-level nameless blocks warn. Related recovery posture: ["./imports.rq".import_error_recovery]. Block shape: [block_idea]. Fenced examples must stay opaque per [code_snippets] so braces inside snippets cannot desync structural depth. Non-termination ( lex / parse never finishes ) is a different failure mode: ["./parser_lexer.rq".parse_budget_timeout]. | |
| reference_wikilink | ["../../packages/language/test/parsing.test.ts:keeps pipe characters in body prose as text"], ["../../packages/language/test/parsing.test.ts:parse extension context-scope.rq module"], ["../../packages/language/test/linking.test.ts:resolve wikilink to idea declaration in main.rq"] | Double-bracket wikilinks use doubled square brackets around a target. Wikilinks may include an obsidian-style alias pipe with a display label after the target. A bare pipe character in body prose — for example kind: idea | file | selection — is plain text, not wikilink syntax. | ||
| round_brackets | ["../../packages/language/test/parsing.test.ts:keeps inline parentheses in body prose as text"], ["../../packages/language/test/parsing.test.ts:keeps inline braces in body prose as text"], ["../../packages/language/test/parsing.test.ts:parse extension graph.rq library"] | Round brackets indicate a list of ideas or attributes. Items may be separated by commas or newlines. Attribute list values may use commas or newlines; see @ example_list_attribute_using_commas and @ example_list_attribute_using_newlines. Parentheses in body prose — including API call shapes like cytoscape. animate ( { fit, easing: ' ease-out-cubic ' } ) — are plain text, not list syntax. | ||
| same_file_reference | ["../../packages/language/test/linking.test.ts:resolve same-file bracket reference to local idea"], ["../../packages/language/test/linking.test.ts:resolve forward reference to later idea in the same file"], ["../../packages/language/test/linking.test.ts:resolve circular same-file references"], ["../../packages/language/test/linking.test.ts:resolve ideaset member forward reference"] | [reference_brackets] should work if the target is either imported, or it is in the same file. Forward references to ideas declared later in the file are valid. Circular references between ideas in the same file are valid. So, this idea should not throw an error. | ||
| simple_idea | ["../../packages/language/test/parsing.test.ts:parse name-only ideas without a body"] | A one-liner idea is written as a name followed by unstructured body text on the same line. A name-only idea is a one-liner with just the name and no body text. One-liner ideas do not use curly braces and do not continue onto subsequent lines. | ||
| string_and_reference_apostrophes | ["../../packages/language/test/references.test.ts:unquotes single-quoted reqlan string literals"], ["../../packages/language/test/parsing.test.ts:parse single-quoted import paths and idea names"] | strings should use double or single apostrophes interchangeably and support backslash escapes. |