@reqlan/analytical 0.8.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +27 -2
  2. package/README.template.md +1 -1
  3. package/out/core/barrel-page.d.ts +2 -1
  4. package/out/core/barrel-page.js +18 -83
  5. package/out/core/barrel-page.js.map +1 -1
  6. package/out/core/base-discovery.d.ts +6 -0
  7. package/out/core/base-discovery.js +56 -4
  8. package/out/core/base-discovery.js.map +1 -1
  9. package/out/core/create-base.js +10 -14
  10. package/out/core/create-base.js.map +1 -1
  11. package/out/core/file-reference-resolve.js +8 -2
  12. package/out/core/file-reference-resolve.js.map +1 -1
  13. package/out/core/index-error.d.ts +3 -3
  14. package/out/core/index-error.js.map +1 -1
  15. package/out/core/index-state-types.d.ts +47 -0
  16. package/out/core/index-state-types.js +11 -0
  17. package/out/core/index-state-types.js.map +1 -0
  18. package/out/core/path-relative.d.ts +15 -0
  19. package/out/core/path-relative.js +84 -0
  20. package/out/core/path-relative.js.map +1 -0
  21. package/out/core/rqignore.js +62 -62
  22. package/out/core/rqignore.js.map +1 -1
  23. package/out/core/types.d.ts +12 -3
  24. package/out/core/types.js +4 -1
  25. package/out/core/types.js.map +1 -1
  26. package/out/core/workspace-paths.d.ts +1 -1
  27. package/out/core/workspace-paths.js +8 -44
  28. package/out/core/workspace-paths.js.map +1 -1
  29. package/out/export/build-export-snapshot.js +1 -1
  30. package/out/export/build-export-snapshot.js.map +1 -1
  31. package/out/export/export-utils.d.ts +5 -0
  32. package/out/export/export-utils.js +38 -0
  33. package/out/export/export-utils.js.map +1 -0
  34. package/out/export/write-csv-export.js +1 -1
  35. package/out/export/write-csv-export.js.map +1 -1
  36. package/out/export/write-markdown-export.js +1 -1
  37. package/out/export/write-markdown-export.js.map +1 -1
  38. package/out/index-store/base-registry.d.ts +2 -3
  39. package/out/index-store/base-registry.js +8 -4
  40. package/out/index-store/base-registry.js.map +1 -1
  41. package/out/index-store/fuzzy-search-hit.d.ts +10 -0
  42. package/out/index-store/fuzzy-search-hit.js +2 -0
  43. package/out/index-store/fuzzy-search-hit.js.map +1 -0
  44. package/out/index-store/index-diagnostics-store.d.ts +4 -0
  45. package/out/index-store/index-diagnostics-store.js +44 -88
  46. package/out/index-store/index-diagnostics-store.js.map +1 -1
  47. package/out/index-store/index-file-error.d.ts +1 -1
  48. package/out/index-store/index-parse-issues.d.ts +4 -3
  49. package/out/index-store/index-parse-issues.js +0 -38
  50. package/out/index-store/index-parse-issues.js.map +1 -1
  51. package/out/index-store/index-status.d.ts +1 -1
  52. package/out/index-store/schema.d.ts +1 -1
  53. package/out/index-store/schema.js +6 -2
  54. package/out/index-store/schema.js.map +1 -1
  55. package/out/index-store/sqlite-store.d.ts +10 -4
  56. package/out/index-store/sqlite-store.js +81 -606
  57. package/out/index-store/sqlite-store.js.map +1 -1
  58. package/out/index-store/webview-graph-queries.d.ts +7 -0
  59. package/out/index-store/webview-graph-queries.js.map +1 -1
  60. package/out/index-store/webview-table-queries.d.ts +1 -1
  61. package/out/index-store/webview-table-queries.js +9 -0
  62. package/out/index-store/webview-table-queries.js.map +1 -1
  63. package/out/index-store/workspace-index-file.d.ts +3 -14
  64. package/out/index-store/workspace-index-file.js +1 -118
  65. package/out/index-store/workspace-index-file.js.map +1 -1
  66. package/out/index-store/workspace-index-sync.d.ts +4 -17
  67. package/out/index-store/workspace-index-sync.js +29 -11
  68. package/out/index-store/workspace-index-sync.js.map +1 -1
  69. package/out/index-store/workspace-index.d.ts +36 -9
  70. package/out/index-store/workspace-index.js +223 -120
  71. package/out/index-store/workspace-index.js.map +1 -1
  72. package/out/index.d.ts +16 -39
  73. package/out/index.js +9 -23
  74. package/out/index.js.map +1 -1
  75. package/out/native/generated.d.ts +102 -0
  76. package/out/native/generated.js +4 -0
  77. package/out/native/generated.js.map +1 -0
  78. package/out/native/index.d.ts +17 -0
  79. package/out/native/index.js +12 -0
  80. package/out/native/index.js.map +1 -0
  81. package/out/native/load-native.d.ts +50 -0
  82. package/out/native/load-native.js +152 -0
  83. package/out/native/load-native.js.map +1 -0
  84. package/out/{analysis-api.d.ts → native/native-analysis-api.d.ts} +24 -20
  85. package/out/native/native-analysis-api.js +212 -0
  86. package/out/native/native-analysis-api.js.map +1 -0
  87. package/out/native/native-index-store.d.ts +5 -0
  88. package/out/native/native-index-store.js +6 -0
  89. package/out/native/native-index-store.js.map +1 -0
  90. package/out/native/native-sql-db.d.ts +135 -0
  91. package/out/native/native-sql-db.js +217 -0
  92. package/out/native/native-sql-db.js.map +1 -0
  93. package/out/native/native-workspace-index.d.ts +164 -0
  94. package/out/native/native-workspace-index.js +283 -0
  95. package/out/native/native-workspace-index.js.map +1 -0
  96. package/out/native/open-analysis-api.d.ts +16 -0
  97. package/out/native/open-analysis-api.js +21 -0
  98. package/out/native/open-analysis-api.js.map +1 -0
  99. package/out/native/parse-source.d.ts +24 -0
  100. package/out/native/parse-source.js +26 -0
  101. package/out/native/parse-source.js.map +1 -0
  102. package/package.json +18 -22
  103. package/out/analysis/analyser-registry.d.ts +0 -21
  104. package/out/analysis/analyser-registry.js +0 -33
  105. package/out/analysis/analyser-registry.js.map +0 -1
  106. package/out/analysis/completion-tracking-analyser.d.ts +0 -3
  107. package/out/analysis/completion-tracking-analyser.js +0 -37
  108. package/out/analysis/completion-tracking-analyser.js.map +0 -1
  109. package/out/analysis/deprecation-impact-analyser.d.ts +0 -3
  110. package/out/analysis/deprecation-impact-analyser.js +0 -21
  111. package/out/analysis/deprecation-impact-analyser.js.map +0 -1
  112. package/out/analysis/file-related-analyser.d.ts +0 -5
  113. package/out/analysis/file-related-analyser.js +0 -41
  114. package/out/analysis/file-related-analyser.js.map +0 -1
  115. package/out/analysis/fuzzy-search-analyser.d.ts +0 -17
  116. package/out/analysis/fuzzy-search-analyser.js +0 -25
  117. package/out/analysis/fuzzy-search-analyser.js.map +0 -1
  118. package/out/analysis/fuzzy-search-worker-client.d.ts +0 -39
  119. package/out/analysis/fuzzy-search-worker-client.js +0 -178
  120. package/out/analysis/fuzzy-search-worker-client.js.map +0 -1
  121. package/out/analysis/fuzzy-search-worker.d.ts +0 -32
  122. package/out/analysis/fuzzy-search-worker.js +0 -81
  123. package/out/analysis/fuzzy-search-worker.js.map +0 -1
  124. package/out/analysis/fuzzy-search.d.ts +0 -38
  125. package/out/analysis/fuzzy-search.js +0 -217
  126. package/out/analysis/fuzzy-search.js.map +0 -1
  127. package/out/analysis/git-dates-analyser.d.ts +0 -9
  128. package/out/analysis/git-dates-analyser.js +0 -77
  129. package/out/analysis/git-dates-analyser.js.map +0 -1
  130. package/out/analysis/list-ideas-analyser.d.ts +0 -3
  131. package/out/analysis/list-ideas-analyser.js +0 -7
  132. package/out/analysis/list-ideas-analyser.js.map +0 -1
  133. package/out/analysis/local-graph-analyser.d.ts +0 -6
  134. package/out/analysis/local-graph-analyser.js +0 -42
  135. package/out/analysis/local-graph-analyser.js.map +0 -1
  136. package/out/analysis/semantic-search-analyser.d.ts +0 -8
  137. package/out/analysis/semantic-search-analyser.js +0 -51
  138. package/out/analysis/semantic-search-analyser.js.map +0 -1
  139. package/out/analysis-api.js +0 -190
  140. package/out/analysis-api.js.map +0 -1
  141. package/out/core/analytical-store.d.ts +0 -85
  142. package/out/core/analytical-store.js +0 -143
  143. package/out/core/analytical-store.js.map +0 -1
  144. package/out/core/context-model.d.ts +0 -204
  145. package/out/core/context-model.js +0 -36
  146. package/out/core/context-model.js.map +0 -1
  147. package/out/core/context-signals.d.ts +0 -149
  148. package/out/core/context-signals.js +0 -397
  149. package/out/core/context-signals.js.map +0 -1
  150. package/out/create-runtime.d.ts +0 -47
  151. package/out/create-runtime.js +0 -79
  152. package/out/create-runtime.js.map +0 -1
  153. package/out/export/export-html.d.ts +0 -4
  154. package/out/export/export-html.js +0 -12
  155. package/out/export/export-html.js.map +0 -1
  156. package/out/export/html-export-assets.d.ts +0 -3
  157. package/out/export/html-export-assets.js +0 -1926
  158. package/out/export/html-export-assets.js.map +0 -1
  159. package/out/export/html-export-template.d.ts +0 -18
  160. package/out/export/html-export-template.js +0 -1139
  161. package/out/export/html-export-template.js.map +0 -1
  162. package/out/export/html-export-utils.d.ts +0 -86
  163. package/out/export/html-export-utils.js +0 -485
  164. package/out/export/html-export-utils.js.map +0 -1
  165. package/out/export/write-html-export.d.ts +0 -2
  166. package/out/export/write-html-export.js +0 -181
  167. package/out/export/write-html-export.js.map +0 -1
  168. package/out/graph/physics-core-source.d.ts +0 -5
  169. package/out/graph/physics-core-source.js +0 -8
  170. package/out/graph/physics-core-source.js.map +0 -1
  171. package/out/graph/physics-core.d.ts +0 -141
  172. package/out/graph/physics-core.js +0 -237
  173. package/out/graph/physics-core.js.map +0 -1
  174. package/out/index-store/idea-extractor.d.ts +0 -11
  175. package/out/index-store/idea-extractor.js +0 -351
  176. package/out/index-store/idea-extractor.js.map +0 -1
  177. package/out/index-store/overview-coverage.d.ts +0 -23
  178. package/out/index-store/overview-coverage.js +0 -254
  179. package/out/index-store/overview-coverage.js.map +0 -1
package/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
 
5
5
  # @reqlan/analytical
6
6
 
7
- Shared requirement graph index and analysers for reqlan
7
+ Native requirement graph index and analysis API for reqlan
8
8
 
9
9
  ## Features
10
10
 
11
- - Headless requirement graph index (sql.js) over parsed `.rq` workspaces
11
+ - Headless requirement graph index (rusqlite via napi) over parsed `.rq` workspaces
12
12
  - Shared application memory under `<workspace>/.reqlan` (ideas-index.sqlite) for extension, CLI, and MCP
13
13
  - Analysers for semantic search, file context, local graphs, and completion status
14
14
  - `AnalysisApi` façade shared by the CLI and MCP server
@@ -30,6 +30,31 @@ npm install @reqlan/analytical
30
30
 
31
31
  ## Changelog
32
32
 
33
+ ### 0.10.0
34
+
35
+ #### Minor Changes
36
+
37
+ - e9b7e8a: rust
38
+
39
+ #### Patch Changes
40
+
41
+ - 72246b6: up pnpm
42
+ - 70ccc6f: up pnpm version
43
+
44
+ ### 0.9.1
45
+
46
+ #### Patch Changes
47
+
48
+ - 45d37df: Fix Windows CLI startup: dynamic import of `C:\...` is protocol `c:`; use `file://` URLs. Treat drive-letter paths as filesystem paths, not URI schemes.
49
+ - Updated dependencies [45d37df]
50
+ - @reqlan/language@1.8.3
51
+
52
+ ### 0.9.0
53
+
54
+ #### Minor Changes
55
+
56
+ - 2294beb: minor improvements to graph and search and website
57
+
33
58
  ### 0.8.2
34
59
 
35
60
  #### Patch Changes
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## Features
10
10
 
11
- - Headless requirement graph index (sql.js) over parsed `.rq` workspaces
11
+ - Headless requirement graph index (rusqlite via napi) over parsed `.rq` workspaces
12
12
  - Shared application memory under `<workspace>/.reqlan` (ideas-index.sqlite) for extension, CLI, and MCP
13
13
  - Analysers for semantic search, file context, local graphs, and completion status
14
14
  - `AnalysisApi` façade shared by the CLI and MCP server
@@ -38,7 +38,8 @@ export declare function planBarrelPage(sourceText: string, options?: BarrelPageP
38
38
  export declare function barrelPage(filePath: string, options?: BarrelPageOptions): Promise<BarrelPageResult>;
39
39
  /**
40
40
  * Rewrite same-file sibling idea refs `[other]` to `[other.other]` and record needed imports.
41
- * Leaves wiki links `[[...]]` and already-qualified refs untouched.
41
+ * Leaves wiki links `[[...]]` and already-qualified refs untouched. Pure text helper mirrored
42
+ * in the native barrel engine; kept in TS for webview edits and re-use without a native round-trip.
42
43
  */
43
44
  export declare function rewriteSiblingRefs(text: string, selfName: string, siblingNames: ReadonlySet<string>): {
44
45
  text: string;
@@ -1,86 +1,34 @@
1
1
  /**
2
2
  * Barrel a large `.rq` page into a container that imports one file per top-level idea.
3
- * Shared by CLI `barrel`, extension code action / command, and other headless tools.
3
+ * The plan is computed by the native engine (`reqlan-parse`); this module only performs
4
+ * the filesystem writes. Shared by CLI `barrel`, the extension code action, and headless tools.
4
5
  *
5
6
  * rq:["../../../reqlan rq/extension/features-commands.rq".barrel_page]
6
7
  * rq:["../../../reqlan rq/extension/features-commands.rq".file_based_code_actions]
8
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".native_bridge]
7
9
  */
8
10
  import { existsSync } from 'node:fs';
9
11
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
10
12
  import { basename, dirname, join, resolve } from 'node:path';
11
- import { EmptyFileSystem, URI } from 'langium';
12
- import { createReqlanServices, fileBasenameAlias, ideaDeclarationText, isIdeaSet, isModel, isRefactorIdeaDeclaration } from '@reqlan/language';
13
+ import { loadNativeEngine } from '../native/load-native.js';
13
14
  /**
14
15
  * Plan a barrel transform from source text (no filesystem writes).
15
16
  */
16
17
  export async function planBarrelPage(sourceText, options = {}) {
17
- const services = createReqlanServices(EmptyFileSystem);
18
- const sourceFileName = options.sourceFileName ?? 'page.rq';
19
- const document = services.shared.workspace.LangiumDocumentFactory.fromString(sourceText, URI.parse(`file:///barrel-plan/${encodeURIComponent(sourceFileName)}`));
20
- services.shared.workspace.LangiumDocuments.addDocument(document);
21
- await services.shared.workspace.DocumentBuilder.build([document], { validation: false });
22
- const model = document.parseResult.value;
23
- if (!isModel(model)) {
24
- throw new Error('Failed to parse reqlan document for barrel page.');
18
+ const engine = loadNativeEngine();
19
+ if (typeof engine.barrelPagePlan !== 'function') {
20
+ throw new Error('Native barrelPagePlan is missing; rebuild crates/reqlan-napi (cargo build -p reqlan-napi).');
25
21
  }
26
- const ideas = [];
27
- const ideasetTexts = [];
28
- for (const element of model.elements) {
29
- if (isRefactorIdeaDeclaration(element)) {
30
- ideas.push(element);
31
- }
32
- else if (isIdeaSet(element)) {
33
- const text = element.$cstNode
34
- ? document.textDocument.getText(element.$cstNode.range)
35
- : undefined;
36
- if (text) {
37
- ideasetTexts.push(text.trimEnd());
38
- }
39
- }
40
- }
41
- if (ideas.length === 0) {
42
- throw new Error('Barrel page requires at least one top-level idea.');
43
- }
44
- const containerName = options.containerName?.trim()
45
- || fileBasenameAlias(sourceFileName);
46
- if (!containerName) {
47
- throw new Error('Container idea name must not be empty.');
48
- }
49
- if (ideas.some(idea => idea.name === containerName)) {
50
- throw new Error(`Container name "${containerName}" conflicts with an idea being barreled; choose a different --name.`);
51
- }
52
- const siblingNames = new Set(ideas.map(idea => idea.name));
53
- const importPreamble = extractImportPreamble(document, model);
54
- const children = ideas.map(idea => {
55
- const declaration = ideaDeclarationText(document, idea);
56
- if (!declaration) {
57
- throw new Error(`Could not read declaration text for idea "${idea.name}".`);
58
- }
59
- const { text: rewritten, neededSiblings } = rewriteSiblingRefs(declaration.trimEnd(), idea.name, siblingNames);
60
- const siblingImports = neededSiblings
61
- .map(name => `import "./${name}.rq" as ${name}`)
62
- .join('\n');
63
- const parts = [importPreamble.trimEnd(), siblingImports, rewritten]
64
- .filter(part => part && part.length > 0);
65
- return {
66
- ideaName: idea.name,
67
- fileName: `${idea.name}.rq`,
68
- content: `${parts.join('\n\n')}\n`
69
- };
70
- });
71
- const importLines = children
72
- .map(child => `import "./${child.fileName}" as ${child.ideaName}`)
73
- .join('\n');
74
- const memberRefs = children
75
- .map(child => ` [${child.ideaName}.${child.ideaName}]`)
76
- .join('\n');
77
- const preservedBlock = ideasetTexts.length > 0 ? `\n\n${ideasetTexts.join('\n\n')}` : '';
78
- const containerContent = `${importLines}\n\n${containerName} {\n${memberRefs}\n}${preservedBlock}\n`;
22
+ const plan = engine.barrelPagePlan(sourceText, options.containerName, options.sourceFileName ?? 'page.rq');
79
23
  return {
80
- containerName,
81
- containerContent,
82
- children,
83
- preservedIdeasets: ideasetTexts
24
+ containerName: plan.containerName,
25
+ containerContent: plan.containerContent,
26
+ children: plan.children.map(child => ({
27
+ ideaName: child.ideaName,
28
+ fileName: child.fileName,
29
+ content: child.content
30
+ })),
31
+ preservedIdeasets: plan.preservedIdeasets
84
32
  };
85
33
  }
86
34
  /**
@@ -124,23 +72,10 @@ export async function barrelPage(filePath, options = {}) {
124
72
  dryRun
125
73
  };
126
74
  }
127
- function extractImportPreamble(document, model) {
128
- if (model.imports.length === 0) {
129
- return '';
130
- }
131
- const first = model.imports[0]?.$cstNode?.range.start;
132
- const last = model.imports[model.imports.length - 1]?.$cstNode?.range.end;
133
- if (!first || !last) {
134
- return '';
135
- }
136
- return document.textDocument.getText({
137
- start: { line: first.line, character: 0 },
138
- end: last
139
- });
140
- }
141
75
  /**
142
76
  * Rewrite same-file sibling idea refs `[other]` to `[other.other]` and record needed imports.
143
- * Leaves wiki links `[[...]]` and already-qualified refs untouched.
77
+ * Leaves wiki links `[[...]]` and already-qualified refs untouched. Pure text helper mirrored
78
+ * in the native barrel engine; kept in TS for webview edits and re-use without a native round-trip.
144
79
  */
145
80
  export function rewriteSiblingRefs(text, selfName, siblingNames) {
146
81
  const needed = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"barrel-page.js","sourceRoot":"","sources":["../../src/core/barrel-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"barrel-page.js","sourceRoot":"","sources":["../../src/core/barrel-page.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,12 @@ export declare function discoverBasesUnder(root: string): BaseDescriptor[];
19
19
  */
20
20
  export declare function discoverBases(roots: string[]): BaseDescriptor[];
21
21
  export declare function toBaseDescriptor(baseRoot: string, labelRoot?: string): BaseDescriptor;
22
+ /**
23
+ * Nearest ancestor directory that owns `.reqlan` (O(depth) `existsSync`).
24
+ * Use this on click / selection / open paths — never `discoverBases`, which walks the tree.
25
+ * When `stopAt` is set, do not walk above those roots (typically workspace folders).
26
+ */
27
+ export declare function nearestBaseRoot(absPath: string, stopAt?: readonly string[]): string | undefined;
22
28
  /** Longest-matching base root that contains `absPath`, or undefined. */
23
29
  export declare function baseForPath(bases: readonly BaseDescriptor[], absPath: string): BaseDescriptor | undefined;
24
30
  /** True if `filePath` is under `dir` (or equal). */
@@ -5,13 +5,15 @@
5
5
  * Walk pruning uses built-in `.rqignore` defaults (and the search root's `.reqlan/.rqignore`
6
6
  * when that root is already a base).
7
7
  *
8
+ * rq:["../../../reqlan rq/ontology.rq".base]
8
9
  * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
9
10
  * rq:["../../../reqlan rq/extension/module/index.rq".rqignore]
10
11
  */
11
12
  import { existsSync, readdirSync, statSync } from 'node:fs';
12
- import { basename, join, relative, resolve, sep } from 'node:path';
13
+ import { basename, dirname, join, relative, resolve, sep } from 'node:path';
13
14
  import { APPLICATION_MEMORY_DIR } from './application-memory.js';
14
15
  import { isIgnoredPath, loadRqIgnore } from './rqignore.js';
16
+ import { relativeWindowsDrivePath } from './path-relative.js';
15
17
  function normalizeRoot(path) {
16
18
  return resolve(path).replace(/\\/g, '/');
17
19
  }
@@ -93,6 +95,50 @@ export function toBaseDescriptor(baseRoot, labelRoot) {
93
95
  }
94
96
  return { id, root, memoryPath, label };
95
97
  }
98
+ /**
99
+ * Nearest ancestor directory that owns `.reqlan` (O(depth) `existsSync`).
100
+ * Use this on click / selection / open paths — never `discoverBases`, which walks the tree.
101
+ * When `stopAt` is set, do not walk above those roots (typically workspace folders).
102
+ */
103
+ export function nearestBaseRoot(absPath, stopAt) {
104
+ const target = resolve(absPath);
105
+ let dir = target;
106
+ try {
107
+ if (statSync(dir).isFile()) {
108
+ dir = dirname(dir);
109
+ }
110
+ }
111
+ catch {
112
+ dir = dirname(dir);
113
+ }
114
+ const stops = (stopAt ?? []).map(root => resolve(root));
115
+ const insideStop = (path) => stops.length === 0 || stops.some(stop => isPathInsideOrEqual(path, stop));
116
+ while (insideStop(dir)) {
117
+ const marker = join(dir, APPLICATION_MEMORY_DIR);
118
+ try {
119
+ if (existsSync(marker) && statSync(marker).isDirectory()) {
120
+ return dir;
121
+ }
122
+ }
123
+ catch {
124
+ // unreadable marker — keep walking
125
+ }
126
+ if (stops.some(stop => pathsEqual(dir, stop))) {
127
+ return undefined;
128
+ }
129
+ const parent = dirname(dir);
130
+ if (parent === dir) {
131
+ return undefined;
132
+ }
133
+ dir = parent;
134
+ }
135
+ return undefined;
136
+ }
137
+ function pathsEqual(left, right) {
138
+ const leftCmp = process.platform === 'win32' ? resolve(left).toLowerCase() : resolve(left);
139
+ const rightCmp = process.platform === 'win32' ? resolve(right).toLowerCase() : resolve(right);
140
+ return leftCmp === rightCmp;
141
+ }
96
142
  /** Longest-matching base root that contains `absPath`, or undefined. */
97
143
  export function baseForPath(bases, absPath) {
98
144
  const target = resolve(absPath);
@@ -111,13 +157,19 @@ export function baseForPath(bases, absPath) {
111
157
  }
112
158
  /** True if `filePath` is under `dir` (or equal). */
113
159
  export function isPathInsideOrEqual(filePath, dir) {
160
+ const driveRelative = relativeWindowsDrivePath(filePath, dir);
161
+ if (driveRelative !== undefined) {
162
+ return !driveRelative.startsWith('..');
163
+ }
114
164
  const absFile = resolve(filePath);
115
165
  const absDir = resolve(dir);
116
- if (absFile === absDir) {
166
+ const fileCmp = process.platform === 'win32' ? absFile.toLowerCase() : absFile;
167
+ const dirCmp = process.platform === 'win32' ? absDir.toLowerCase() : absDir;
168
+ if (fileCmp === dirCmp) {
117
169
  return true;
118
170
  }
119
- const prefix = absDir.endsWith(sep) ? absDir : absDir + sep;
120
- return absFile.startsWith(prefix);
171
+ const prefix = dirCmp.endsWith(sep) ? dirCmp : dirCmp + sep;
172
+ return fileCmp.startsWith(prefix);
121
173
  }
122
174
  /**
123
175
  * Child bases of `parent` (strict descendants that are themselves bases).
@@ -1 +1 @@
1
- {"version":3,"file":"base-discovery.js","sourceRoot":"","sources":["../../src/core/base-discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-discovery.js","sourceRoot":"","sources":["../../src/core/base-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAa9D,SAAS,aAAa,CAAC,IAAY;IAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,wFAAwF;IACxF,MAAM,UAAU,GAAmB,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzD,SAAS,KAAK,CAAC,GAAW;QACtB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACD,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;YACjD,IAAI,CAAC;gBACD,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,2BAA2B;YAC/B,CAAC;QACL,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9B,IAAI,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAClD,SAAS;YACb,CAAC;YACD,IAAI,CAAC;gBACD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBAChC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,kBAAkB;YACtB,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC;IAEf,OAAO,KAAK;SACP,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAe;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAkB;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IACtD,IAAI,KAAa,CAAC;IAClB,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnE,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,CAAC;SAAM,CAAC;QACJ,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,MAA0B;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,IAAI,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACzB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAW,EAAE,CACzC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9E,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;QACjD,IAAI,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvD,OAAO,GAAG,CAAC;YACf,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,mCAAmC;QACvC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9F,OAAO,OAAO,KAAK,QAAQ,CAAC;AAChC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,KAAgC,EAAE,OAAe;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,IAAgC,CAAC;IACrC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;gBAChB,IAAI,GAAG,IAAI,CAAC;gBACZ,OAAO,GAAG,GAAG,CAAC;YAClB,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,GAAW;IAC7D,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5E,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;IAC5D,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CACxB,MAAsB,EACtB,QAAmC;IAEnC,OAAO,QAAQ,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CACtE,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC5B,IAAoB,EACpB,QAA2B,EAC3B,QAAmC;IAEnC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC7B,KAAgC,EAChC,GAAY;IAEZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,GAAG,EAAE,CAAC;QACN,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,33 +1,29 @@
1
1
  /**
2
2
  * Create a reqlan base by writing the `.reqlan` application-memory marker.
3
- * Shared by CLI `init` and other headless tools; the extension uses the same marker.
3
+ * The native engine seeds `config.json` + `.rqignore` (single source of truth for
4
+ * the default ignore patterns); this wrapper returns the base descriptor.
4
5
  *
5
6
  * rq:["../../../reqlan rq/extension/module/index.rq".rqignore]
6
7
  * rq:["../../../reqlan rq/extension/configuration.rq".configuration_rqignore]
8
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".native_bridge]
7
9
  */
8
- import { existsSync } from 'node:fs';
9
- import { mkdir, writeFile } from 'node:fs/promises';
10
- import { join, resolve } from 'node:path';
11
- import { CONFIG_FILENAME, RQIGNORE_FILENAME, resolveApplicationMemoryPath } from './application-memory.js';
10
+ import { resolve } from 'node:path';
11
+ import { loadNativeEngine } from '../native/load-native.js';
12
12
  import { toBaseDescriptor } from './base-discovery.js';
13
- import { defaultRqIgnoreFileContents } from './rqignore.js';
14
- const DEFAULT_CONFIG_JSON = `${JSON.stringify({}, null, 2)}\n`;
15
13
  /**
16
14
  * Ensure `<baseRoot>/.reqlan/` exists and seed `config.json` + `.rqignore` when creating a new base.
17
15
  * Idempotent: existing markers are left alone and reported as `created: false`.
18
16
  */
19
17
  export async function createBase(baseRoot) {
20
18
  const root = resolve(baseRoot);
21
- const memoryPath = resolveApplicationMemoryPath(root);
22
- const created = !existsSync(memoryPath);
23
- await mkdir(memoryPath, { recursive: true });
24
- if (created) {
25
- await writeFile(join(memoryPath, CONFIG_FILENAME), DEFAULT_CONFIG_JSON, 'utf8');
26
- await writeFile(join(memoryPath, RQIGNORE_FILENAME), defaultRqIgnoreFileContents(), 'utf8');
19
+ const engine = loadNativeEngine();
20
+ if (typeof engine.createBase !== 'function') {
21
+ throw new Error('Native createBase is missing; rebuild crates/reqlan-napi (cargo build -p reqlan-napi).');
27
22
  }
23
+ const result = engine.createBase(root);
28
24
  return {
29
25
  base: toBaseDescriptor(root),
30
- created
26
+ created: result.created
31
27
  };
32
28
  }
33
29
  //# sourceMappingURL=create-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-base.js","sourceRoot":"","sources":["../../src/core/create-base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,4BAA4B,EAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAQ5D,MAAM,mBAAmB,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,2BAA2B,EAAE,EAAE,MAAM,CAAC,CAAC;IAChG,CAAC;IACD,OAAO;QACH,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC5B,OAAO;KACV,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"create-base.js","sourceRoot":"","sources":["../../src/core/create-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AAa5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACX,wFAAwF,CAC3F,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAA2B,CAAC;IACjE,OAAO;QACH,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;KAC1B,CAAC;AACN,CAAC"}
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Resolve authored file-reference paths against the defining idea's file.
3
3
  * Shared by graph slices and reference-list rows so open actions match the editor.
4
+ * rq:["../../../reqlan rq/ontology.rq".referenced_files]
5
+ * rq:["../../../reqlan rq/ontology.rq".reference_types]
4
6
  */
7
+ import { isWindowsAbsolutePath } from './path-relative.js';
5
8
  import { posix } from 'node:path';
6
9
  function definingFilePath(sourceId) {
7
10
  const separator = sourceId.lastIndexOf('#');
@@ -16,11 +19,14 @@ function definingFilePath(sourceId) {
16
19
  */
17
20
  export function resolveReferencedFilePath(targetFile, sourceId) {
18
21
  const target = targetFile.replace(/\\/g, '/');
19
- if (target.includes('://') || posix.isAbsolute(target)) {
22
+ if (target.includes('://') || posix.isAbsolute(target) || isWindowsAbsolutePath(targetFile) || isWindowsAbsolutePath(target)) {
20
23
  return targetFile;
21
24
  }
22
25
  const definingFile = definingFilePath(sourceId).replace(/\\/g, '/');
23
- if (!definingFile || definingFile.includes('://') || posix.isAbsolute(definingFile)) {
26
+ if (!definingFile
27
+ || definingFile.includes('://')
28
+ || posix.isAbsolute(definingFile)
29
+ || isWindowsAbsolutePath(definingFile)) {
24
30
  return targetFile;
25
31
  }
26
32
  return posix.join(posix.dirname(definingFile), target);
@@ -1 +1 @@
1
- {"version":3,"file":"file-reference-resolve.js","sourceRoot":"","sources":["../../src/core/file-reference-resolve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,SAAS,gBAAgB,CAAC,QAAgB;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClF,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"file-reference-resolve.js","sourceRoot":"","sources":["../../src/core/file-reference-resolve.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,SAAS,gBAAgB,CAAC,QAAgB;IACtC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB,EAAE,QAAgB;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,UAAU,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3H,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,IACI,CAAC,YAAY;WACV,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;WAC5B,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;WAC9B,qBAAqB,CAAC,YAAY,CAAC,EACxC,CAAC;QACC,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,5 +1,5 @@
1
- import type { IndexError } from './analytical-store.js';
2
- export type { IndexErrorPhase } from './analytical-store.js';
1
+ import type { IndexError } from './index-state-types.js';
2
+ export type { IndexErrorPhase } from './index-state-types.js';
3
3
  export interface IndexErrorDetail {
4
4
  summary: string;
5
5
  file?: string;
@@ -19,5 +19,5 @@ export interface FileIndexIssueView {
19
19
  ideaNames?: string[];
20
20
  cause?: string;
21
21
  }
22
- export declare function toFileIndexIssueView(issue: import('./analytical-store.js').FileIndexIssue, relativePath?: (fileUri: string) => string): FileIndexIssueView;
22
+ export declare function toFileIndexIssueView(issue: import('./index-state-types.js').FileIndexIssue, relativePath?: (fileUri: string) => string): FileIndexIssueView;
23
23
  export declare function toIndexErrorDetail(error: IndexError, relativePath?: (fileUri: string) => string): IndexErrorDetail;
@@ -1 +1 @@
1
- {"version":3,"file":"index-error.js","sourceRoot":"","sources":["../../src/core/index-error.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAcD,MAAM,UAAU,oBAAoB,CAChC,KAAqD,EACrD,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAChE,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,KAAiB,EACjB,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7D,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;KACxC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"index-error.js","sourceRoot":"","sources":["../../src/core/index-error.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAcD,MAAM,UAAU,oBAAoB,CAChC,KAAsD,EACtD,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACzD,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAChE,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,CAAC;AACN,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,KAAiB,EACjB,eAA4C,GAAG,CAAC,EAAE,CAAC,GAAG;IAEtD,OAAO;QACH,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7D,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC;KACxC,CAAC;AACN,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Index lifecycle state types shared by the TS facade and the native runtime.
3
+ *
4
+ * The lifecycle FSM, counts, problem list, and activity rings now live in the
5
+ * Rust `WorkspaceIndexRuntime` (surfaced via `NativeWorkspaceIndex.statusSnapshot`).
6
+ * These are the plain shapes the TS side reads back from that snapshot.
7
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".native_bridge]
8
+ * rq:["../../../reqlan rq/codestyle/typescript.rq".zustand_boundary]
9
+ */
10
+ export type IndexState = 'uninitialized' | 'opening' | 'idle' | 'syncing' | 'ready' | 'error' | 'closing';
11
+ export type IndexEvent = 'activate' | 'opened' | 'sync' | 'synced' | 'fail' | 'deactivate' | 'closed';
12
+ export type WorkspaceChange = 'created' | 'changed' | 'deleted';
13
+ export type IndexErrorPhase = 'open' | 'parse' | 'extract' | 'persist' | 'sync' | 'transition';
14
+ export interface IndexError {
15
+ message: string;
16
+ fileUri?: string;
17
+ ideaNames?: string[];
18
+ phase?: IndexErrorPhase;
19
+ cause?: unknown;
20
+ }
21
+ export interface FileIndexIssue {
22
+ fileUri: string;
23
+ line: number;
24
+ column: number;
25
+ message: string;
26
+ phase: IndexErrorPhase;
27
+ ideaNames?: string[];
28
+ cause?: string;
29
+ at: number;
30
+ }
31
+ export interface DocumentUpdateIdea {
32
+ id: string;
33
+ name: string;
34
+ lineStart: number;
35
+ }
36
+ export interface DocumentUpdate {
37
+ fileUri: string;
38
+ ideaCount: number;
39
+ /** Ideas persisted in this update — used for idea-centric Timeline events. */
40
+ ideas?: DocumentUpdateIdea[];
41
+ at: number;
42
+ }
43
+ export interface WorkspaceFileChange {
44
+ fileUri: string;
45
+ change: WorkspaceChange;
46
+ at: number;
47
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Index lifecycle state types shared by the TS facade and the native runtime.
3
+ *
4
+ * The lifecycle FSM, counts, problem list, and activity rings now live in the
5
+ * Rust `WorkspaceIndexRuntime` (surfaced via `NativeWorkspaceIndex.statusSnapshot`).
6
+ * These are the plain shapes the TS side reads back from that snapshot.
7
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".native_bridge]
8
+ * rq:["../../../reqlan rq/codestyle/typescript.rq".zustand_boundary]
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index-state-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-state-types.js","sourceRoot":"","sources":["../../src/core/index-state-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,15 @@
1
+ /** Drive-letter or UNC filesystem path (not a URI). Pure port of the former Langium helper. */
2
+ export declare function isWindowsAbsolutePath(value: string): boolean;
3
+ /**
4
+ * Build a `file:` URI string from a filesystem path — pure Node port of the
5
+ * former Langium `fileUriFromFsPath(...).toString()`.
6
+ * Windows drive paths must not go through URL parsing (scheme would be `c:`).
7
+ */
8
+ export declare function fileUriFromFsPath(fsPath: string): string;
9
+ /**
10
+ * Convert a `file://` URI to an fsPath that still understands Windows drive
11
+ * URIs when running on POSIX (Langium `URI.fsPath` behaviour).
12
+ */
13
+ export declare function fsPathFromFileUri(fileUri: string): string;
14
+ export declare function relativeWindowsDrivePath(filePath: string, workspaceRoot: string): string | undefined;
15
+ export declare function toWorkspaceRelativePath(fileUri: string, workspaceRoot: string): string;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Workspace-relative path helpers with no Langium / @reqlan/language imports.
3
+ * Used by the `@reqlan/analytical/core` entry so headless commands do not load the LSP parser.
4
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".native_bridge]
5
+ * rq:["../../../reqlan rq/core_analysis/rust_port.rq".cutover]
6
+ */
7
+ import { isAbsolute, relative } from 'node:path';
8
+ import { pathToFileURL } from 'node:url';
9
+ const WINDOWS_DRIVE_ABS = /^[A-Za-z]:[\\/]/;
10
+ function normalizeSlashes(filePath) {
11
+ return filePath.replace(/\\/g, '/');
12
+ }
13
+ /** Drive-letter or UNC filesystem path (not a URI). Pure port of the former Langium helper. */
14
+ export function isWindowsAbsolutePath(value) {
15
+ return WINDOWS_DRIVE_ABS.test(value) || value.startsWith('\\\\');
16
+ }
17
+ /**
18
+ * Build a `file:` URI string from a filesystem path — pure Node port of the
19
+ * former Langium `fileUriFromFsPath(...).toString()`.
20
+ * Windows drive paths must not go through URL parsing (scheme would be `c:`).
21
+ */
22
+ export function fileUriFromFsPath(fsPath) {
23
+ if (WINDOWS_DRIVE_ABS.test(fsPath)) {
24
+ return `file:///${fsPath.replace(/\\/g, '/')}`;
25
+ }
26
+ if (fsPath.startsWith('\\\\')) {
27
+ return `file:${fsPath.replace(/\\/g, '/')}`;
28
+ }
29
+ return pathToFileURL(fsPath).toString();
30
+ }
31
+ /**
32
+ * Convert a `file://` URI to an fsPath that still understands Windows drive
33
+ * URIs when running on POSIX (Langium `URI.fsPath` behaviour).
34
+ */
35
+ export function fsPathFromFileUri(fileUri) {
36
+ const url = new URL(fileUri);
37
+ let pathname = decodeURIComponent(url.pathname);
38
+ if (url.protocol === 'file:' && /^\/[A-Za-z]:/.test(pathname)) {
39
+ return pathname.slice(1).replace(/\//g, '\\');
40
+ }
41
+ if (url.protocol === 'file:' && url.hostname) {
42
+ const hostPath = pathname.replace(/\//g, '\\');
43
+ return `\\\\${url.hostname}${hostPath}`;
44
+ }
45
+ return pathname;
46
+ }
47
+ export function relativeWindowsDrivePath(filePath, workspaceRoot) {
48
+ const normalizedFile = normalizeSlashes(filePath);
49
+ const normalizedRoot = normalizeSlashes(workspaceRoot).replace(/\/+$/, '');
50
+ const fileMatch = normalizedFile.match(/^([A-Za-z]:)(\/.*)?$/);
51
+ const rootMatch = normalizedRoot.match(/^([A-Za-z]:)(\/.*)?$/);
52
+ if (!fileMatch || !rootMatch || fileMatch[1].toLowerCase() !== rootMatch[1].toLowerCase()) {
53
+ return undefined;
54
+ }
55
+ const fileRest = (fileMatch[2] ?? '').replace(/^\/+/, '');
56
+ const rootRest = (rootMatch[2] ?? '').replace(/^\/+/, '');
57
+ if (fileRest.toLowerCase() === rootRest.toLowerCase()) {
58
+ return '';
59
+ }
60
+ const rootPrefix = rootRest ? `${rootRest}/` : '';
61
+ if (!rootRest || fileRest.toLowerCase().startsWith(rootPrefix.toLowerCase())) {
62
+ return rootRest ? fileRest.slice(rootPrefix.length) : fileRest;
63
+ }
64
+ return undefined;
65
+ }
66
+ export function toWorkspaceRelativePath(fileUri, workspaceRoot) {
67
+ if (!workspaceRoot) {
68
+ return normalizeSlashes(fileUri);
69
+ }
70
+ const filePath = fileUri.startsWith('file://') ? fsPathFromFileUri(fileUri) : fileUri;
71
+ const driveRelative = relativeWindowsDrivePath(filePath, workspaceRoot);
72
+ if (driveRelative !== undefined) {
73
+ return driveRelative;
74
+ }
75
+ if (!isAbsolute(filePath)) {
76
+ return normalizeSlashes(filePath);
77
+ }
78
+ const rel = relative(workspaceRoot, filePath);
79
+ if (rel.startsWith('..')) {
80
+ return normalizeSlashes(fileUri);
81
+ }
82
+ return normalizeSlashes(rel);
83
+ }
84
+ //# sourceMappingURL=path-relative.js.map