@reqlan/analytical 0.6.3 → 0.8.1
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.
- package/README.md +30 -0
- package/out/analysis/fuzzy-search-analyser.d.ts +17 -0
- package/out/analysis/fuzzy-search-analyser.js +25 -0
- package/out/analysis/fuzzy-search-analyser.js.map +1 -0
- package/out/analysis/fuzzy-search-worker-client.d.ts +39 -0
- package/out/analysis/fuzzy-search-worker-client.js +178 -0
- package/out/analysis/fuzzy-search-worker-client.js.map +1 -0
- package/out/analysis/fuzzy-search-worker.d.ts +32 -0
- package/out/analysis/fuzzy-search-worker.js +81 -0
- package/out/analysis/fuzzy-search-worker.js.map +1 -0
- package/out/analysis/fuzzy-search.d.ts +38 -0
- package/out/analysis/fuzzy-search.js +217 -0
- package/out/analysis/fuzzy-search.js.map +1 -0
- package/out/analysis/git-dates-analyser.js +12 -3
- package/out/analysis/git-dates-analyser.js.map +1 -1
- package/out/analysis-api.d.ts +16 -2
- package/out/analysis-api.js +36 -3
- package/out/analysis-api.js.map +1 -1
- package/out/core/barrel-page.d.ts +46 -0
- package/out/core/barrel-page.js +162 -0
- package/out/core/barrel-page.js.map +1 -0
- package/out/core/filter-specials.d.ts +37 -0
- package/out/core/filter-specials.js +113 -0
- package/out/core/filter-specials.js.map +1 -0
- package/out/core/types.d.ts +27 -1
- package/out/core/types.js +1 -0
- package/out/core/types.js.map +1 -1
- package/out/create-runtime.js +2 -0
- package/out/create-runtime.js.map +1 -1
- package/out/export/build-export-snapshot.d.ts +2 -2
- package/out/export/build-export-snapshot.js +43 -16
- package/out/export/build-export-snapshot.js.map +1 -1
- package/out/export/export-csv.d.ts +4 -0
- package/out/export/export-csv.js +13 -0
- package/out/export/export-csv.js.map +1 -0
- package/out/export/export-html.d.ts +2 -2
- package/out/export/export-html.js +7 -3
- package/out/export/export-html.js.map +1 -1
- package/out/export/export-json.d.ts +6 -0
- package/out/export/export-json.js +28 -0
- package/out/export/export-json.js.map +1 -0
- package/out/export/export-markdown.d.ts +4 -0
- package/out/export/export-markdown.js +23 -0
- package/out/export/export-markdown.js.map +1 -0
- package/out/export/html-export-assets.d.ts +1 -1
- package/out/export/html-export-assets.js +663 -20
- package/out/export/html-export-assets.js.map +1 -1
- package/out/export/html-export-template.js +160 -61
- package/out/export/html-export-template.js.map +1 -1
- package/out/export/html-export-utils.d.ts +33 -3
- package/out/export/html-export-utils.js +121 -13
- package/out/export/html-export-utils.js.map +1 -1
- package/out/export/types.d.ts +20 -1
- package/out/export/write-csv-export.d.ts +5 -0
- package/out/export/write-csv-export.js +132 -0
- package/out/export/write-csv-export.js.map +1 -0
- package/out/export/write-html-export.d.ts +2 -2
- package/out/export/write-html-export.js +61 -29
- package/out/export/write-html-export.js.map +1 -1
- package/out/export/write-json-export.d.ts +3 -0
- package/out/export/write-json-export.js +92 -0
- package/out/export/write-json-export.js.map +1 -0
- package/out/export/write-markdown-export.d.ts +5 -0
- package/out/export/write-markdown-export.js +177 -0
- package/out/export/write-markdown-export.js.map +1 -0
- package/out/graph/physics-core-source.d.ts +5 -0
- package/out/graph/physics-core-source.js +8 -0
- package/out/graph/physics-core-source.js.map +1 -0
- package/out/index-store/idea-extractor.d.ts +6 -1
- package/out/index-store/idea-extractor.js +56 -11
- package/out/index-store/idea-extractor.js.map +1 -1
- package/out/index-store/index-diagnostics-store.js +1 -2
- package/out/index-store/index-diagnostics-store.js.map +1 -1
- package/out/index-store/sqlite-store.d.ts +16 -3
- package/out/index-store/sqlite-store.js +107 -9
- package/out/index-store/sqlite-store.js.map +1 -1
- package/out/index-store/webview-graph-queries.d.ts +13 -2
- package/out/index-store/webview-graph-queries.js +98 -18
- package/out/index-store/webview-graph-queries.js.map +1 -1
- package/out/index-store/webview-table-queries.js +1 -0
- package/out/index-store/webview-table-queries.js.map +1 -1
- package/out/index-store/workspace-index-file.js +22 -1
- package/out/index-store/workspace-index-file.js.map +1 -1
- package/out/index-store/workspace-index.d.ts +2 -1
- package/out/index-store/workspace-index.js +4 -1
- package/out/index-store/workspace-index.js.map +1 -1
- package/out/index.d.ts +17 -2
- package/out/index.js +10 -1
- package/out/index.js.map +1 -1
- package/package.json +7 -3
|
@@ -0,0 +1,217 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy-search.js","sourceRoot":"","sources":["../../src/analysis/fuzzy-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,19 @@
|
|
|
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
|
+
*/
|
|
1
9
|
import { URI } from 'langium';
|
|
2
10
|
import { execFile } from 'node:child_process';
|
|
3
11
|
import { promisify } from 'node:util';
|
|
4
12
|
import { resolveWorkspaceFileUri } from '../core/workspace-paths.js';
|
|
5
13
|
const execFileAsync = promisify(execFile);
|
|
6
14
|
const GIT_LOG_TIMEOUT_MS = 4000;
|
|
7
|
-
|
|
15
|
+
/** Keep background indexing gentle on the extension host. */
|
|
16
|
+
const LOOKUP_CONCURRENCY = 2;
|
|
8
17
|
export const gitDatesAnalyser = {
|
|
9
18
|
id: 'git_dates',
|
|
10
19
|
async run({ store, workspaceRoot }, { ideaIds }) {
|
|
@@ -54,8 +63,8 @@ async function lookupGitDates(fileUri, lineStart, lineEnd, workspaceRoot) {
|
|
|
54
63
|
// Fall through to file-level dates.
|
|
55
64
|
}
|
|
56
65
|
try {
|
|
57
|
-
const { stdout: createdStdout } = await execFileAsync('git', ['log', '--diff-filter=A', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
|
|
58
|
-
const { stdout: modifiedStdout } = await execFileAsync('git', ['log', '--format=%aI', '-1', '--', filePath], { cwd, timeout: GIT_LOG_TIMEOUT_MS });
|
|
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 });
|
|
59
68
|
return {
|
|
60
69
|
createdAt: createdStdout.trim() || undefined,
|
|
61
70
|
modifiedAt: modifiedStdout.trim() || undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-dates-analyser.js","sourceRoot":"","sources":["../../src/analysis/git-dates-analyser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"git-dates-analyser.js","sourceRoot":"","sources":["../../src/analysis/git-dates-analyser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,kBAAkB,GAAG,IAAK,CAAC;AACjC,6DAA6D;AAC7D,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAQ7B,MAAM,CAAC,MAAM,gBAAgB,GAAoD;IAC7E,EAAE,EAAE,WAAW;IACf,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACvD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1D,MAAM,KAAK,GAAG,MAAM,cAAc,CAC9B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EACZ,aAAa,CAChB,CAAC;gBACF,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtC,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3E,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,cAAc,CACzB,OAAe,EACf,SAAiB,EACjB,OAAe,EACf,aAAsB;IAEtB,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACjG,MAAM,GAAG,GAAG,aAAa,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAC9C,KAAK,EACL,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,EACxE,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,MAAM,SAAS,GAAG,UAAU;aACvB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxB,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO;gBACH,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;gBACxB,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;aAC7C,CAAC;QACN,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,oCAAoC;IACxC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,aAAa,CACjD,KAAK,EACL,CAAC,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAC5E,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CAClD,KAAK,EACL,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EACzD,EAAE,GAAG,EAAE,OAAO,EAAE,kBAAkB,EAAE,CACvC,CAAC;QACF,OAAO;YACH,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,SAAS;YAC5C,UAAU,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,SAAS;SACjD,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}
|
package/out/analysis-api.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CompletionSummary, DeprecationImpact, FileRelatedRequirements, GraphSlice, IdeaSummary } from './core/types.js';
|
|
2
2
|
import type { AnalysisRuntime } from './create-runtime.js';
|
|
3
|
-
import type { ExportRequest, ExportResult } from './export/types.js';
|
|
3
|
+
import type { ExportProgressCallback, ExportRequest, ExportResult } from './export/types.js';
|
|
4
4
|
export interface RequirementMatch {
|
|
5
5
|
idea: IdeaSummary;
|
|
6
6
|
score?: number;
|
|
@@ -28,7 +28,21 @@ export declare class AnalysisApi {
|
|
|
28
28
|
*/
|
|
29
29
|
exportHtml(request: Omit<ExportRequest, 'workspaceRoot'> & {
|
|
30
30
|
workspaceRoot?: string;
|
|
31
|
-
}): Promise<ExportResult>;
|
|
31
|
+
}, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Export the indexed requirement graph as markdown (README + optional idea pages).
|
|
34
|
+
*/
|
|
35
|
+
exportMarkdown(request: Omit<ExportRequest, 'workspaceRoot'> & {
|
|
36
|
+
workspaceRoot?: string;
|
|
37
|
+
}, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
38
|
+
/** Export structured JSON for tooling and AI consumption. */
|
|
39
|
+
exportJson(request: Omit<ExportRequest, 'workspaceRoot'> & {
|
|
40
|
+
workspaceRoot?: string;
|
|
41
|
+
}, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
42
|
+
/** Export ideas/references as CSV with flattened tags and attributes. */
|
|
43
|
+
exportCsv(request: Omit<ExportRequest, 'workspaceRoot'> & {
|
|
44
|
+
workspaceRoot?: string;
|
|
45
|
+
}, onProgress?: ExportProgressCallback): Promise<ExportResult>;
|
|
32
46
|
resolveRequirementReference(name?: string): Promise<IdeaSummary[]>;
|
|
33
47
|
resolveFileReference(pathPrefix?: string): Promise<Array<{
|
|
34
48
|
path: string;
|
package/out/analysis-api.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
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';
|
|
2
5
|
export class AnalysisApi {
|
|
3
6
|
constructor(runtime) {
|
|
4
7
|
this.runtime = runtime;
|
|
@@ -59,12 +62,41 @@ export class AnalysisApi {
|
|
|
59
62
|
* Export the indexed requirement graph as a multi-file static HTML site.
|
|
60
63
|
* Headless entry point shared by CLI and site build.
|
|
61
64
|
*/
|
|
62
|
-
async exportHtml(request) {
|
|
65
|
+
async exportHtml(request, onProgress) {
|
|
63
66
|
await this.ensureReady();
|
|
64
67
|
return exportHtml(this.runtime.index.indexStore, {
|
|
65
68
|
...request,
|
|
66
69
|
workspaceRoot: request.workspaceRoot ?? this.runtime.workspaceRoot
|
|
67
|
-
});
|
|
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);
|
|
68
100
|
}
|
|
69
101
|
async resolveRequirementReference(name) {
|
|
70
102
|
await this.ensureReady();
|
|
@@ -137,7 +169,8 @@ export class AnalysisApi {
|
|
|
137
169
|
parameters: {
|
|
138
170
|
outputDir: 'Parent directory for the export folder',
|
|
139
171
|
exportName: 'Export folder name',
|
|
140
|
-
excludeSecretFiles: 'Optional: omit *.secret.rq files'
|
|
172
|
+
excludeSecretFiles: 'Optional: omit *.secret.rq files',
|
|
173
|
+
excludeIgnoredFiles: 'Optional: omit .rqignore-matched files'
|
|
141
174
|
}
|
|
142
175
|
},
|
|
143
176
|
{
|
package/out/analysis-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-api.js","sourceRoot":"","sources":["../src/analysis-api.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"analysis-api.js","sourceRoot":"","sources":["../src/analysis-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface BarrelPagePlanOptions {
|
|
2
|
+
/** Container idea name; defaults to sanitized source file basename. */
|
|
3
|
+
containerName?: string;
|
|
4
|
+
/** Source file name used when defaulting the container name (e.g. `features.rq`). */
|
|
5
|
+
sourceFileName?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface BarrelPageChildPlan {
|
|
8
|
+
ideaName: string;
|
|
9
|
+
/** Relative file name written next to the source (e.g. `alpha.rq`). */
|
|
10
|
+
fileName: string;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface BarrelPagePlan {
|
|
14
|
+
containerName: string;
|
|
15
|
+
containerContent: string;
|
|
16
|
+
children: BarrelPageChildPlan[];
|
|
17
|
+
/** Top-level ideaset declarations preserved in the container file. */
|
|
18
|
+
preservedIdeasets: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface BarrelPageOptions extends BarrelPagePlanOptions {
|
|
21
|
+
/** When true, compute the plan without writing files. */
|
|
22
|
+
dryRun?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface BarrelPageResult extends BarrelPagePlan {
|
|
25
|
+
/** Absolute path of the barreled source file. */
|
|
26
|
+
sourcePath: string;
|
|
27
|
+
/** Absolute paths of child files that were (or would be) written. */
|
|
28
|
+
createdPaths: string[];
|
|
29
|
+
dryRun: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Plan a barrel transform from source text (no filesystem writes).
|
|
33
|
+
*/
|
|
34
|
+
export declare function planBarrelPage(sourceText: string, options?: BarrelPagePlanOptions): Promise<BarrelPagePlan>;
|
|
35
|
+
/**
|
|
36
|
+
* Barrel a `.rq` file on disk: write one child file per idea and replace the source with a container.
|
|
37
|
+
*/
|
|
38
|
+
export declare function barrelPage(filePath: string, options?: BarrelPageOptions): Promise<BarrelPageResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Rewrite same-file sibling idea refs `[other]` to `[other.other]` and record needed imports.
|
|
41
|
+
* Leaves wiki links `[[...]]` and already-qualified refs untouched.
|
|
42
|
+
*/
|
|
43
|
+
export declare function rewriteSiblingRefs(text: string, selfName: string, siblingNames: ReadonlySet<string>): {
|
|
44
|
+
text: string;
|
|
45
|
+
neededSiblings: string[];
|
|
46
|
+
};
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
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.
|
|
4
|
+
*
|
|
5
|
+
* rq:["../../../reqlan rq/extension/features-commands.rq".barrel_page]
|
|
6
|
+
* rq:["../../../reqlan rq/extension/features-commands.rq".file_based_code_actions]
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
10
|
+
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
|
+
/**
|
|
14
|
+
* Plan a barrel transform from source text (no filesystem writes).
|
|
15
|
+
*/
|
|
16
|
+
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.');
|
|
25
|
+
}
|
|
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`;
|
|
79
|
+
return {
|
|
80
|
+
containerName,
|
|
81
|
+
containerContent,
|
|
82
|
+
children,
|
|
83
|
+
preservedIdeasets: ideasetTexts
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Barrel a `.rq` file on disk: write one child file per idea and replace the source with a container.
|
|
88
|
+
*/
|
|
89
|
+
export async function barrelPage(filePath, options = {}) {
|
|
90
|
+
const sourcePath = resolve(filePath);
|
|
91
|
+
if (!sourcePath.endsWith('.rq')) {
|
|
92
|
+
throw new Error(`Barrel page expects a .rq file, got: ${filePath}`);
|
|
93
|
+
}
|
|
94
|
+
if (!existsSync(sourcePath)) {
|
|
95
|
+
throw new Error(`File does not exist: ${sourcePath}`);
|
|
96
|
+
}
|
|
97
|
+
const sourceText = await readFile(sourcePath, 'utf8');
|
|
98
|
+
const plan = await planBarrelPage(sourceText, {
|
|
99
|
+
containerName: options.containerName,
|
|
100
|
+
sourceFileName: basename(sourcePath)
|
|
101
|
+
});
|
|
102
|
+
const outDir = dirname(sourcePath);
|
|
103
|
+
const createdPaths = plan.children.map(child => join(outDir, child.fileName));
|
|
104
|
+
for (const childPath of createdPaths) {
|
|
105
|
+
if (childPath === sourcePath) {
|
|
106
|
+
throw new Error(`Refusing to overwrite the source file with a child idea file (${basename(childPath)}).`);
|
|
107
|
+
}
|
|
108
|
+
if (existsSync(childPath)) {
|
|
109
|
+
throw new Error(`Refusing to overwrite existing file: ${childPath}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const dryRun = options.dryRun === true;
|
|
113
|
+
if (!dryRun) {
|
|
114
|
+
await mkdir(outDir, { recursive: true });
|
|
115
|
+
for (let i = 0; i < plan.children.length; i++) {
|
|
116
|
+
await writeFile(createdPaths[i], plan.children[i].content, 'utf8');
|
|
117
|
+
}
|
|
118
|
+
await writeFile(sourcePath, plan.containerContent, 'utf8');
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
...plan,
|
|
122
|
+
sourcePath,
|
|
123
|
+
createdPaths,
|
|
124
|
+
dryRun
|
|
125
|
+
};
|
|
126
|
+
}
|
|
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
|
+
/**
|
|
142
|
+
* Rewrite same-file sibling idea refs `[other]` to `[other.other]` and record needed imports.
|
|
143
|
+
* Leaves wiki links `[[...]]` and already-qualified refs untouched.
|
|
144
|
+
*/
|
|
145
|
+
export function rewriteSiblingRefs(text, selfName, siblingNames) {
|
|
146
|
+
const needed = new Set();
|
|
147
|
+
const rewritten = text.replace(/\[\[([^\]]*)\]\]|\[([A-Za-z_][\w-]*)\]/g, (match, _wiki, local) => {
|
|
148
|
+
if (local === undefined) {
|
|
149
|
+
return match;
|
|
150
|
+
}
|
|
151
|
+
if (local === selfName || !siblingNames.has(local)) {
|
|
152
|
+
return match;
|
|
153
|
+
}
|
|
154
|
+
needed.add(local);
|
|
155
|
+
return `[${local}.${local}]`;
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
text: rewritten,
|
|
159
|
+
neededSiblings: [...needed].sort()
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=barrel-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrel-page.js","sourceRoot":"","sources":["../../src/core/barrel-page.ts"],"names":[],"mappings":"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"}
|