@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
@@ -1,217 +0,0 @@
1
- /**
2
- * Characters treated as the same separator family: underscore, hyphen,
3
- * ellipsis / dots, and whitespace. Runs collapse to nothing for matching so
4
- * `cli package`, `cli_package`, `cli-package`, and `cli...package` align.
5
- */
6
- const SEPARATOR_RE = /[_\-\s.…]+/g;
7
- /** Lowercase and strip interchangeable separators for comparison. */
8
- export function normalizeSearchSeparators(value) {
9
- return value.toLowerCase().replace(SEPARATOR_RE, '');
10
- }
11
- /** Split on interchangeable separators into lowercase word tokens. */
12
- export function splitSearchTokens(value) {
13
- return value
14
- .toLowerCase()
15
- .split(SEPARATOR_RE)
16
- .map(token => token.trim())
17
- .filter(Boolean);
18
- }
19
- export function filterAndScoreIdeas(ideas, query) {
20
- return rankScoredIdeas(scoreIdeas(ideas, query));
21
- }
22
- /**
23
- * Score ideas in chunks, yielding to the event loop so UI actions (e.g. openIdea)
24
- * are not blocked by a long synchronous scan of a large index.
25
- * Returns `undefined` when `isCancelled` becomes true mid-run.
26
- */
27
- export async function filterAndScoreIdeasAsync(ideas, query, options) {
28
- const chunkSize = Math.max(1, options?.chunkSize ?? 250);
29
- const isCancelled = options?.isCancelled;
30
- const rawNeedle = query.trim().toLowerCase();
31
- const needle = normalizeSearchSeparators(rawNeedle);
32
- const queryTokens = splitSearchTokens(rawNeedle);
33
- const scored = [];
34
- for (let index = 0; index < ideas.length; index += 1) {
35
- if (index > 0 && index % chunkSize === 0) {
36
- if (isCancelled?.()) {
37
- return undefined;
38
- }
39
- await yieldEventLoop();
40
- if (isCancelled?.()) {
41
- return undefined;
42
- }
43
- }
44
- const idea = ideas[index];
45
- if (idea.kind === 'ideaset') {
46
- continue;
47
- }
48
- const score = rawNeedle ? scoreIdeaMatch(idea, rawNeedle, needle, queryTokens) : 1;
49
- if (score <= 0) {
50
- continue;
51
- }
52
- scored.push({
53
- id: idea.id,
54
- name: idea.name,
55
- kind: idea.kind,
56
- fileUri: idea.fileUri,
57
- summary: idea.summary,
58
- lineStart: idea.lineStart,
59
- score
60
- });
61
- }
62
- if (isCancelled?.()) {
63
- return undefined;
64
- }
65
- return rankScoredIdeas(scored);
66
- }
67
- function scoreIdeas(ideas, query) {
68
- const rawNeedle = query.trim().toLowerCase();
69
- const needle = normalizeSearchSeparators(rawNeedle);
70
- const queryTokens = splitSearchTokens(rawNeedle);
71
- const scored = [];
72
- for (const idea of ideas) {
73
- if (idea.kind === 'ideaset') {
74
- continue;
75
- }
76
- const score = rawNeedle ? scoreIdeaMatch(idea, rawNeedle, needle, queryTokens) : 1;
77
- if (score <= 0) {
78
- continue;
79
- }
80
- scored.push({
81
- id: idea.id,
82
- name: idea.name,
83
- kind: idea.kind,
84
- fileUri: idea.fileUri,
85
- summary: idea.summary,
86
- lineStart: idea.lineStart,
87
- score
88
- });
89
- }
90
- return scored;
91
- }
92
- function rankScoredIdeas(scored) {
93
- return scored.sort((left, right) => right.score - left.score
94
- || left.name.localeCompare(right.name)
95
- || left.fileUri.localeCompare(right.fileUri));
96
- }
97
- function yieldEventLoop() {
98
- return new Promise(resolve => {
99
- setTimeout(resolve, 0);
100
- });
101
- }
102
- function scoreIdeaMatch(idea, rawNeedle, needle, queryTokens) {
103
- const nameRaw = idea.name.toLowerCase();
104
- const name = normalizeSearchSeparators(idea.name);
105
- const summaryRaw = idea.summary.toLowerCase();
106
- const summary = normalizeSearchSeparators(idea.summary);
107
- let score = 0;
108
- if (nameRaw === rawNeedle || name === needle) {
109
- score = 100;
110
- }
111
- else if (nameRaw.startsWith(rawNeedle) || name.startsWith(needle)) {
112
- score = 80;
113
- }
114
- else if (nameRaw.includes(rawNeedle) || name.includes(needle)) {
115
- score = 50;
116
- }
117
- else if (fuzzySubsequence(nameRaw, rawNeedle) || fuzzySubsequence(name, needle)) {
118
- score = 30;
119
- }
120
- const nameTokenKind = matchQueryTokens(splitSearchTokens(idea.name), queryTokens);
121
- if (nameTokenKind === 'ordered') {
122
- score = Math.max(score, 45);
123
- }
124
- else if (nameTokenKind === 'reordered') {
125
- score = Math.max(score, 35);
126
- }
127
- if (summaryRaw.includes(rawNeedle) || (needle && summary.includes(needle))) {
128
- score = Math.max(score, 20) + 5;
129
- }
130
- else {
131
- const summaryTokenKind = matchQueryTokens(splitSearchTokens(idea.summary), queryTokens);
132
- if (summaryTokenKind === 'ordered') {
133
- score = Math.max(score, 22);
134
- }
135
- else if (summaryTokenKind === 'reordered') {
136
- score = Math.max(score, 18);
137
- }
138
- }
139
- for (const tag of idea.tags) {
140
- const tagRaw = tag.toLowerCase();
141
- const tagNorm = normalizeSearchSeparators(tag);
142
- if (tagRaw.includes(rawNeedle) || (needle && tagNorm.includes(needle))) {
143
- score = Math.max(score, 15) + 2;
144
- }
145
- else if (matchQueryTokens(splitSearchTokens(tag), queryTokens) !== null) {
146
- score = Math.max(score, 15) + 2;
147
- }
148
- }
149
- return score;
150
- }
151
- /**
152
- * Match every query token against hay tokens.
153
- * Prefers order-preserving matches; still accepts reordered tokens (missing
154
- * intermediate hay words are fine either way).
155
- */
156
- export function matchQueryTokens(hayTokens, queryTokens) {
157
- if (queryTokens.length === 0 || hayTokens.length === 0) {
158
- return null;
159
- }
160
- let hayIndex = 0;
161
- let ordered = true;
162
- for (const queryToken of queryTokens) {
163
- let found = -1;
164
- for (let index = hayIndex; index < hayTokens.length; index += 1) {
165
- if (tokenMatches(hayTokens[index], queryToken)) {
166
- found = index;
167
- break;
168
- }
169
- }
170
- if (found < 0) {
171
- ordered = false;
172
- break;
173
- }
174
- hayIndex = found + 1;
175
- }
176
- if (ordered) {
177
- return 'ordered';
178
- }
179
- const used = new Set();
180
- for (const queryToken of queryTokens) {
181
- let found = -1;
182
- for (let index = 0; index < hayTokens.length; index += 1) {
183
- if (used.has(index)) {
184
- continue;
185
- }
186
- if (tokenMatches(hayTokens[index], queryToken)) {
187
- found = index;
188
- break;
189
- }
190
- }
191
- if (found < 0) {
192
- return null;
193
- }
194
- used.add(found);
195
- }
196
- return 'reordered';
197
- }
198
- function tokenMatches(hayToken, queryToken) {
199
- return hayToken === queryToken || hayToken.startsWith(queryToken);
200
- }
201
- /** True when needle characters appear in order inside hay (simple fuzzy). */
202
- export function fuzzySubsequence(hay, needle) {
203
- if (!needle) {
204
- return true;
205
- }
206
- let index = 0;
207
- for (const char of hay) {
208
- if (char === needle[index]) {
209
- index += 1;
210
- if (index >= needle.length) {
211
- return true;
212
- }
213
- }
214
- }
215
- return false;
216
- }
217
- //# sourceMappingURL=fuzzy-search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fuzzy-search.js","sourceRoot":"","sources":["../../src/analysis/fuzzy-search.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { Analyser } from './analyser-registry.js';
2
- export interface GitDateInfo {
3
- ideaId: string;
4
- createdAt?: string;
5
- modifiedAt?: string;
6
- }
7
- export declare const gitDatesAnalyser: Analyser<{
8
- ideaIds?: string[];
9
- }, GitDateInfo[]>;
@@ -1,77 +0,0 @@
1
- /**
2
- * Surfaces creation and last-modified dates for ideas via git history.
3
- * Persists into the ideas index for silent background fill and Timeline consumers.
4
- *
5
- * rq:["../../../reqlan rq/extension/features-graph-analysers.rq".git_dates]
6
- * rq:["../../../reqlan rq/extension/git-codelens.rq".git_idea_timeline_analysis]
7
- * rq:["../../../reqlan rq/extension/git-codelens.rq".git_dates_background_indexing]
8
- */
9
- import { URI } from 'langium';
10
- import { execFile } from 'node:child_process';
11
- import { promisify } from 'node:util';
12
- import { resolveWorkspaceFileUri } from '../core/workspace-paths.js';
13
- const execFileAsync = promisify(execFile);
14
- const GIT_LOG_TIMEOUT_MS = 4000;
15
- /** Keep background indexing gentle on the extension host. */
16
- const LOOKUP_CONCURRENCY = 2;
17
- export const gitDatesAnalyser = {
18
- id: 'git_dates',
19
- async run({ store, workspaceRoot }, { ideaIds }) {
20
- const wanted = ideaIds ? new Set(ideaIds) : undefined;
21
- const ideas = (await store.getAllIdeasRaw()).filter(idea => {
22
- if (idea.kind === 'ideaset') {
23
- return false;
24
- }
25
- return wanted ? wanted.has(idea.id) : true;
26
- });
27
- const results = [];
28
- for (let offset = 0; offset < ideas.length; offset += LOOKUP_CONCURRENCY) {
29
- const batch = ideas.slice(offset, offset + LOOKUP_CONCURRENCY);
30
- const batchResults = await Promise.all(batch.map(async (idea) => {
31
- const dates = await lookupGitDates(idea.fileUri, idea.lineStart, idea.lineEnd, workspaceRoot);
32
- if (dates.createdAt || dates.modifiedAt) {
33
- await store.updateGitDates(idea.id, dates.createdAt, dates.modifiedAt);
34
- }
35
- return { ideaId: idea.id, ...dates };
36
- }));
37
- results.push(...batchResults);
38
- }
39
- return results;
40
- }
41
- };
42
- async function lookupGitDates(fileUri, lineStart, lineEnd, workspaceRoot) {
43
- const resolvedUri = resolveWorkspaceFileUri(fileUri, workspaceRoot);
44
- const filePath = resolvedUri.startsWith('file://') ? URI.parse(resolvedUri).fsPath : resolvedUri;
45
- const cwd = workspaceRoot;
46
- const start = Math.min(lineStart, lineEnd) + 1;
47
- const end = Math.max(lineStart, lineEnd) + 1;
48
- try {
49
- const { stdout: lineStdout } = await execFileAsync('git', ['log', '-L', `${start},${end}:${filePath}`, '--format=%aI', '-n', '40'], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
50
- const lineDates = lineStdout
51
- .trim()
52
- .split('\n')
53
- .map(line => line.trim())
54
- .filter(Boolean);
55
- if (lineDates.length > 0) {
56
- return {
57
- modifiedAt: lineDates[0],
58
- createdAt: lineDates[lineDates.length - 1]
59
- };
60
- }
61
- }
62
- catch {
63
- // Fall through to file-level dates.
64
- }
65
- try {
66
- const { stdout: createdStdout } = await execFileAsync('git', ['log', '--follow', '--diff-filter=A', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
67
- const { stdout: modifiedStdout } = await execFileAsync('git', ['log', '--follow', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
68
- return {
69
- createdAt: createdStdout.trim() || undefined,
70
- modifiedAt: modifiedStdout.trim() || undefined
71
- };
72
- }
73
- catch {
74
- return {};
75
- }
76
- }
77
- //# sourceMappingURL=git-dates-analyser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-dates-analyser.js","sourceRoot":"","sources":["../../src/analysis/git-dates-analyser.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Analyser } from './analyser-registry.js';
2
- import type { IdeaSummary } from '../core/types.js';
3
- export declare const listAllIdeasAnalyser: Analyser<void, IdeaSummary[]>;
@@ -1,7 +0,0 @@
1
- export const listAllIdeasAnalyser = {
2
- id: 'list_all_ideas',
3
- async run({ store }) {
4
- return store.listAllIdeas();
5
- }
6
- };
7
- //# sourceMappingURL=list-ideas-analyser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-ideas-analyser.js","sourceRoot":"","sources":["../../src/analysis/list-ideas-analyser.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAkC;IAC/D,EAAE,EAAE,gBAAgB;IACpB,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE;QACf,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC;IAChC,CAAC;CACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { Analyser } from './analyser-registry.js';
2
- import type { GraphSlice } from '../core/types.js';
3
- export declare const localGraphAnalyser: Analyser<{
4
- centerId: string;
5
- depth?: number;
6
- }, GraphSlice>;
@@ -1,42 +0,0 @@
1
- export const localGraphAnalyser = {
2
- id: 'local_graph_analysis',
3
- async run({ store }, { centerId, depth = 1 }) {
4
- const center = await store.getIdea(centerId);
5
- if (!center) {
6
- return { centerId, depth, nodes: [], edges: [] };
7
- }
8
- const nodes = new Map();
9
- const edges = new Map();
10
- const visited = new Set();
11
- const queue = [{ id: centerId, remaining: depth }];
12
- while (queue.length > 0) {
13
- const current = queue.shift();
14
- if (visited.has(current.id)) {
15
- continue;
16
- }
17
- visited.add(current.id);
18
- const idea = await store.getIdea(current.id);
19
- if (idea) {
20
- nodes.set(idea.id, idea);
21
- }
22
- const outbound = await store.getEdgesFrom(current.id);
23
- const inbound = await store.getEdgesTo(current.id);
24
- for (const edge of [...outbound, ...inbound]) {
25
- edges.set(edge.id, edge);
26
- if (current.remaining > 0) {
27
- const nextId = edge.sourceId === current.id ? edge.targetId : edge.sourceId;
28
- if (nextId) {
29
- queue.push({ id: nextId, remaining: current.remaining - 1 });
30
- }
31
- }
32
- }
33
- }
34
- return {
35
- centerId,
36
- depth,
37
- nodes: [...nodes.values()],
38
- edges: [...edges.values()]
39
- };
40
- }
41
- };
42
- //# sourceMappingURL=local-graph-analyser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-graph-analyser.js","sourceRoot":"","sources":["../../src/analysis/local-graph-analyser.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAA+D;IAC1F,EAAE,EAAE,sBAAsB;IAC1B,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,KAAK,GAA6C,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7F,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACb,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,EAAE,CAAC;gBACP,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;gBAC3C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACzB,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC5E,IAAI,MAAM,EAAE,CAAC;wBACT,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjE,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO;YACH,QAAQ;YACR,KAAK;YACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;SAC7B,CAAC;IACN,CAAC;CACJ,CAAC"}
@@ -1,8 +0,0 @@
1
- import type { Analyser } from './analyser-registry.js';
2
- import type { SemanticMatch } from '../core/types.js';
3
- export interface SemanticSearchParams {
4
- query: string;
5
- ideaset?: string;
6
- limit?: number;
7
- }
8
- export declare const semanticSearchAnalyser: Analyser<SemanticSearchParams, SemanticMatch[]>;
@@ -1,51 +0,0 @@
1
- export const semanticSearchAnalyser = {
2
- id: 'semantic_analysis',
3
- async run({ store }, { query, ideaset, limit = 20 }) {
4
- const normalized = query.toLowerCase();
5
- const tokens = normalized.split(/\s+/).filter(Boolean);
6
- const candidates = await store.searchByNameOrSummary(query);
7
- const matches = [];
8
- for (const idea of candidates) {
9
- if (ideaset && idea.kind === 'ideaset' && idea.name !== ideaset) {
10
- continue;
11
- }
12
- const haystack = `${idea.name} ${idea.summary} ${idea.tags.join(' ')}`.toLowerCase();
13
- const reasons = [];
14
- let score = 0;
15
- if (idea.name.toLowerCase().includes(normalized)) {
16
- score += 3;
17
- reasons.push('name match');
18
- }
19
- if (idea.summary.toLowerCase().includes(normalized)) {
20
- score += 2;
21
- reasons.push('summary match');
22
- }
23
- for (const token of tokens) {
24
- if (haystack.includes(token)) {
25
- score += 1;
26
- reasons.push(`token:${token}`);
27
- }
28
- }
29
- for (const tag of idea.tags) {
30
- if (tag.toLowerCase().includes(normalized)) {
31
- score += 1;
32
- reasons.push(`tag:${tag}`);
33
- }
34
- }
35
- const relatedEdges = await store.getEdgesFrom(idea.id);
36
- for (const edge of relatedEdges) {
37
- if (edge.label?.toLowerCase().includes(normalized)) {
38
- score += 1;
39
- reasons.push('reference label');
40
- }
41
- }
42
- if (score > 0) {
43
- matches.push({ idea, score, reasons: [...new Set(reasons)] });
44
- }
45
- }
46
- return matches
47
- .sort((left, right) => right.score - left.score)
48
- .slice(0, limit);
49
- }
50
- };
51
- //# sourceMappingURL=semantic-search-analyser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-search-analyser.js","sourceRoot":"","sources":["../../src/analysis/semantic-search-analyser.ts"],"names":[],"mappings":"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"}
@@ -1,190 +0,0 @@
1
- import { exportHtml } from './export/export-html.js';
2
- import { exportMarkdown } from './export/export-markdown.js';
3
- import { exportJson } from './export/export-json.js';
4
- import { exportCsv } from './export/export-csv.js';
5
- export class AnalysisApi {
6
- constructor(runtime) {
7
- this.runtime = runtime;
8
- }
9
- async ensureReady() {
10
- if (this.runtime.index.isReady) {
11
- return;
12
- }
13
- await this.runtime.index.syncWorkspace();
14
- }
15
- async searchRequirements(query, limit = 8) {
16
- await this.ensureReady();
17
- const matches = await this.runtime.analysers.run(this.runtime.makeContext(), 'semantic_analysis', { query, limit });
18
- return matches.map(match => ({
19
- idea: match.idea,
20
- score: match.score,
21
- reasons: match.reasons
22
- }));
23
- }
24
- async listRequirements(limit = 50) {
25
- await this.ensureReady();
26
- const ideas = await this.runtime.analysers.run(this.runtime.makeContext(), 'list_all_ideas', undefined);
27
- return ideas.slice(0, limit);
28
- }
29
- async getFileContext(filePath) {
30
- await this.ensureReady();
31
- const fileUri = this.runtime.index.resolveFileUri(filePath);
32
- return this.runtime.analysers.run(this.runtime.makeContext(), 'file_related_requirements', { fileUri });
33
- }
34
- async getLocalGraph(filePath, depth = 1) {
35
- await this.ensureReady();
36
- const fileUri = this.runtime.index.resolveFileUri(filePath);
37
- const ideas = await this.runtime.index.indexStore.getIdeasInFile(fileUri);
38
- if (ideas.length === 0) {
39
- return undefined;
40
- }
41
- const center = ideas[0];
42
- return this.runtime.analysers.run(this.runtime.makeContext(), 'local_graph_analysis', { centerId: center.id, depth });
43
- }
44
- async summarizeSubtree(requirementName, depth = 2) {
45
- await this.ensureReady();
46
- const matches = await this.searchRequirements(requirementName, 1);
47
- const center = matches[0]?.idea;
48
- if (!center) {
49
- return undefined;
50
- }
51
- return this.runtime.analysers.run(this.runtime.makeContext(), 'local_graph_analysis', { centerId: center.id, depth });
52
- }
53
- async getCompletionStatus() {
54
- await this.ensureReady();
55
- return this.runtime.analysers.run(this.runtime.makeContext(), 'completion_tracking', undefined);
56
- }
57
- async getDeprecationImpact() {
58
- await this.ensureReady();
59
- return this.runtime.analysers.run(this.runtime.makeContext(), 'deprecation_impact_analysis', undefined);
60
- }
61
- /**
62
- * Export the indexed requirement graph as a multi-file static HTML site.
63
- * Headless entry point shared by CLI and site build.
64
- */
65
- async exportHtml(request, onProgress) {
66
- await this.ensureReady();
67
- return exportHtml(this.runtime.index.indexStore, {
68
- ...request,
69
- workspaceRoot: request.workspaceRoot ?? this.runtime.workspaceRoot
70
- }, onProgress);
71
- }
72
- /**
73
- * Export the indexed requirement graph as markdown (README + optional idea pages).
74
- */
75
- async exportMarkdown(request, onProgress) {
76
- await this.ensureReady();
77
- return exportMarkdown(this.runtime.index.indexStore, {
78
- ...request,
79
- format: 'markdown',
80
- workspaceRoot: request.workspaceRoot ?? this.runtime.workspaceRoot
81
- }, onProgress);
82
- }
83
- /** Export structured JSON for tooling and AI consumption. */
84
- async exportJson(request, onProgress) {
85
- await this.ensureReady();
86
- return exportJson(this.runtime.index.indexStore, {
87
- ...request,
88
- format: 'json',
89
- workspaceRoot: request.workspaceRoot ?? this.runtime.workspaceRoot
90
- }, onProgress);
91
- }
92
- /** Export ideas/references as CSV with flattened tags and attributes. */
93
- async exportCsv(request, onProgress) {
94
- await this.ensureReady();
95
- return exportCsv(this.runtime.index.indexStore, {
96
- ...request,
97
- format: 'csv',
98
- workspaceRoot: request.workspaceRoot ?? this.runtime.workspaceRoot
99
- }, onProgress);
100
- }
101
- async resolveRequirementReference(name) {
102
- await this.ensureReady();
103
- const query = name?.trim() ?? '';
104
- if (query) {
105
- const matches = await this.searchRequirements(query, 8);
106
- return matches.map(match => match.idea);
107
- }
108
- return this.listRequirements(12);
109
- }
110
- async resolveFileReference(pathPrefix) {
111
- await this.ensureReady();
112
- const prefix = pathPrefix?.trim() ?? '';
113
- const files = await this.runtime.index.listRqFiles(prefix).slice(0, 12);
114
- const results = [];
115
- for (const path of files) {
116
- const related = await this.getFileContext(path).catch(() => undefined);
117
- results.push({
118
- path,
119
- ideas: related?.ideasInFile.slice(0, 4) ?? []
120
- });
121
- }
122
- return results;
123
- }
124
- listInteractions() {
125
- return [
126
- {
127
- name: 'search_requirements',
128
- description: 'Search requirements by keyword across names, summaries, tags, and references.',
129
- parameters: { query: 'Search text', limit: 'Optional maximum number of matches' }
130
- },
131
- {
132
- name: 'list_requirements',
133
- description: 'List indexed requirements in the workspace.',
134
- parameters: { limit: 'Optional maximum number of requirements' }
135
- },
136
- {
137
- name: 'file_context',
138
- description: 'Get requirements in, referencing, or comment-linked to a file.',
139
- parameters: { filePath: 'Relative or absolute path to a .rq file' }
140
- },
141
- {
142
- name: 'local_graph',
143
- description: 'Get the local requirement graph around the first requirement in a file.',
144
- parameters: { filePath: 'Relative or absolute path to a .rq file', depth: 'Optional hop depth' }
145
- },
146
- {
147
- name: 'summarize_subtree',
148
- description: 'Summarise a requirement subtree rooted at a named requirement.',
149
- parameters: { requirementName: 'Requirement name or search text', depth: 'Optional hop depth' }
150
- },
151
- {
152
- name: 'requirement_reference',
153
- description: 'Resolve a requirement by name for compact chat or MCP context.',
154
- parameters: { name: 'Optional requirement name or search text' }
155
- },
156
- {
157
- name: 'file_reference',
158
- description: 'Resolve requirements indexed in matching .rq files.',
159
- parameters: { path: 'Optional path fragment filter' }
160
- },
161
- {
162
- name: 'completion_status',
163
- description: 'Summarise completion and deprecation status across the workspace graph.',
164
- parameters: {}
165
- },
166
- {
167
- name: 'export_html',
168
- description: 'Export the requirement graph as a multi-file static HTML site.',
169
- parameters: {
170
- outputDir: 'Parent directory for the export folder',
171
- exportName: 'Export folder name',
172
- excludeSecretFiles: 'Optional: omit *.secret.rq files',
173
- excludeIgnoredFiles: 'Optional: omit .rqignore-matched files'
174
- }
175
- },
176
- {
177
- name: 'list_interactions',
178
- description: 'Discover available requirement graph interactions and parameters.',
179
- parameters: {}
180
- }
181
- ];
182
- }
183
- formatIdea(idea) {
184
- const location = `${this.runtime.index.relativePath(idea.fileUri)}:${idea.lineStart + 1}`;
185
- const tags = idea.tags.length > 0 ? `\nTags: ${idea.tags.join(', ')}` : '';
186
- const status = idea.status ? `\nStatus: ${idea.status}` : '';
187
- return `### ${idea.name} (${location})\n${idea.summary || '(no summary)'}${status}${tags}`;
188
- }
189
- }
190
- //# sourceMappingURL=analysis-api.js.map