@mfittko/repo-wiki 0.2.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.
Files changed (190) hide show
  1. package/.llmwiki/schema.md +107 -0
  2. package/AGENTS.md +42 -0
  3. package/CHANGELOG.md +91 -0
  4. package/LICENSE +21 -0
  5. package/README.md +254 -0
  6. package/dist/bin/repo-wiki.d.ts +2 -0
  7. package/dist/bin/repo-wiki.js +7 -0
  8. package/dist/bin/repo-wiki.js.map +1 -0
  9. package/dist/src/cli.d.ts +1 -0
  10. package/dist/src/cli.js +404 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/compiler.d.ts +55 -0
  13. package/dist/src/compiler.js +2046 -0
  14. package/dist/src/compiler.js.map +1 -0
  15. package/dist/src/config.d.ts +63 -0
  16. package/dist/src/config.js +86 -0
  17. package/dist/src/config.js.map +1 -0
  18. package/dist/src/context-assembler.d.ts +68 -0
  19. package/dist/src/context-assembler.js +378 -0
  20. package/dist/src/context-assembler.js.map +1 -0
  21. package/dist/src/data-model-signals.d.ts +1 -0
  22. package/dist/src/data-model-signals.js +13 -0
  23. package/dist/src/data-model-signals.js.map +1 -0
  24. package/dist/src/docs-ingestor.d.ts +138 -0
  25. package/dist/src/docs-ingestor.js +844 -0
  26. package/dist/src/docs-ingestor.js.map +1 -0
  27. package/dist/src/docs-linter.d.ts +14 -0
  28. package/dist/src/docs-linter.js +164 -0
  29. package/dist/src/docs-linter.js.map +1 -0
  30. package/dist/src/docs-validation.d.ts +36 -0
  31. package/dist/src/docs-validation.js +297 -0
  32. package/dist/src/docs-validation.js.map +1 -0
  33. package/dist/src/extractors.d.ts +50 -0
  34. package/dist/src/extractors.js +2275 -0
  35. package/dist/src/extractors.js.map +1 -0
  36. package/dist/src/frontmatter.d.ts +46 -0
  37. package/dist/src/frontmatter.js +377 -0
  38. package/dist/src/frontmatter.js.map +1 -0
  39. package/dist/src/index.d.ts +26 -0
  40. package/dist/src/index.js +18 -0
  41. package/dist/src/index.js.map +1 -0
  42. package/dist/src/init.d.ts +12 -0
  43. package/dist/src/init.js +121 -0
  44. package/dist/src/init.js.map +1 -0
  45. package/dist/src/language.d.ts +2 -0
  46. package/dist/src/language.js +62 -0
  47. package/dist/src/language.js.map +1 -0
  48. package/dist/src/linter.d.ts +33 -0
  49. package/dist/src/linter.js +398 -0
  50. package/dist/src/linter.js.map +1 -0
  51. package/dist/src/llm-provider.d.ts +267 -0
  52. package/dist/src/llm-provider.js +474 -0
  53. package/dist/src/llm-provider.js.map +1 -0
  54. package/dist/src/page-ownership.d.ts +38 -0
  55. package/dist/src/page-ownership.js +96 -0
  56. package/dist/src/page-ownership.js.map +1 -0
  57. package/dist/src/planner.d.ts +55 -0
  58. package/dist/src/planner.js +422 -0
  59. package/dist/src/planner.js.map +1 -0
  60. package/dist/src/prompts.d.ts +103 -0
  61. package/dist/src/prompts.js +344 -0
  62. package/dist/src/prompts.js.map +1 -0
  63. package/dist/src/publisher.d.ts +68 -0
  64. package/dist/src/publisher.js +662 -0
  65. package/dist/src/publisher.js.map +1 -0
  66. package/dist/src/repository-analysis.d.ts +88 -0
  67. package/dist/src/repository-analysis.js +485 -0
  68. package/dist/src/repository-analysis.js.map +1 -0
  69. package/dist/src/scanner.d.ts +122 -0
  70. package/dist/src/scanner.js +309 -0
  71. package/dist/src/scanner.js.map +1 -0
  72. package/dist/src/search.d.ts +71 -0
  73. package/dist/src/search.js +410 -0
  74. package/dist/src/search.js.map +1 -0
  75. package/dist/src/secret-patterns.d.ts +3 -0
  76. package/dist/src/secret-patterns.js +14 -0
  77. package/dist/src/secret-patterns.js.map +1 -0
  78. package/dist/src/utils/args.d.ts +2 -0
  79. package/dist/src/utils/args.js +19 -0
  80. package/dist/src/utils/args.js.map +1 -0
  81. package/dist/src/utils/dotenv.d.ts +7 -0
  82. package/dist/src/utils/dotenv.js +73 -0
  83. package/dist/src/utils/dotenv.js.map +1 -0
  84. package/dist/src/utils/fs.d.ts +22 -0
  85. package/dist/src/utils/fs.js +83 -0
  86. package/dist/src/utils/fs.js.map +1 -0
  87. package/dist/src/utils/git.d.ts +13 -0
  88. package/dist/src/utils/git.js +39 -0
  89. package/dist/src/utils/git.js.map +1 -0
  90. package/dist/src/wiki-graph.d.ts +74 -0
  91. package/dist/src/wiki-graph.js +335 -0
  92. package/dist/src/wiki-graph.js.map +1 -0
  93. package/dist/src/wiki-patch.d.ts +152 -0
  94. package/dist/src/wiki-patch.js +489 -0
  95. package/dist/src/wiki-patch.js.map +1 -0
  96. package/dist/src/wiki-query.d.ts +63 -0
  97. package/dist/src/wiki-query.js +255 -0
  98. package/dist/src/wiki-query.js.map +1 -0
  99. package/dist/test/cli.test.d.ts +1 -0
  100. package/dist/test/cli.test.js +514 -0
  101. package/dist/test/cli.test.js.map +1 -0
  102. package/dist/test/compiler-eval.test.d.ts +1 -0
  103. package/dist/test/compiler-eval.test.js +234 -0
  104. package/dist/test/compiler-eval.test.js.map +1 -0
  105. package/dist/test/compiler.test.d.ts +1 -0
  106. package/dist/test/compiler.test.js +2537 -0
  107. package/dist/test/compiler.test.js.map +1 -0
  108. package/dist/test/context-assembler.test.d.ts +1 -0
  109. package/dist/test/context-assembler.test.js +379 -0
  110. package/dist/test/context-assembler.test.js.map +1 -0
  111. package/dist/test/docs-linter.test.d.ts +1 -0
  112. package/dist/test/docs-linter.test.js +900 -0
  113. package/dist/test/docs-linter.test.js.map +1 -0
  114. package/dist/test/dotenv.test.d.ts +1 -0
  115. package/dist/test/dotenv.test.js +77 -0
  116. package/dist/test/dotenv.test.js.map +1 -0
  117. package/dist/test/extractors-go.test.d.ts +1 -0
  118. package/dist/test/extractors-go.test.js +393 -0
  119. package/dist/test/extractors-go.test.js.map +1 -0
  120. package/dist/test/extractors-rust.test.d.ts +1 -0
  121. package/dist/test/extractors-rust.test.js +219 -0
  122. package/dist/test/extractors-rust.test.js.map +1 -0
  123. package/dist/test/extractors-utils.test.d.ts +1 -0
  124. package/dist/test/extractors-utils.test.js +786 -0
  125. package/dist/test/extractors-utils.test.js.map +1 -0
  126. package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.d.ts +1 -0
  127. package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.js +4 -0
  128. package/dist/test/fixtures/compiler-e2e/basic-node-service/repo/infra/deploy.js.map +1 -0
  129. package/dist/test/frontmatter.test.d.ts +1 -0
  130. package/dist/test/frontmatter.test.js +287 -0
  131. package/dist/test/frontmatter.test.js.map +1 -0
  132. package/dist/test/init-planner.test.d.ts +1 -0
  133. package/dist/test/init-planner.test.js +688 -0
  134. package/dist/test/init-planner.test.js.map +1 -0
  135. package/dist/test/linter.test.d.ts +1 -0
  136. package/dist/test/linter.test.js +426 -0
  137. package/dist/test/linter.test.js.map +1 -0
  138. package/dist/test/llm-provider.test.d.ts +1 -0
  139. package/dist/test/llm-provider.test.js +783 -0
  140. package/dist/test/llm-provider.test.js.map +1 -0
  141. package/dist/test/page-ownership.test.d.ts +1 -0
  142. package/dist/test/page-ownership.test.js +247 -0
  143. package/dist/test/page-ownership.test.js.map +1 -0
  144. package/dist/test/publisher.test.d.ts +1 -0
  145. package/dist/test/publisher.test.js +1297 -0
  146. package/dist/test/publisher.test.js.map +1 -0
  147. package/dist/test/repository-analysis.test.d.ts +1 -0
  148. package/dist/test/repository-analysis.test.js +182 -0
  149. package/dist/test/repository-analysis.test.js.map +1 -0
  150. package/dist/test/run-compiled-tests.d.ts +1 -0
  151. package/dist/test/run-compiled-tests.js +48 -0
  152. package/dist/test/run-compiled-tests.js.map +1 -0
  153. package/dist/test/scanner.test.d.ts +1 -0
  154. package/dist/test/scanner.test.js +551 -0
  155. package/dist/test/scanner.test.js.map +1 -0
  156. package/dist/test/search.test.d.ts +1 -0
  157. package/dist/test/search.test.js +92 -0
  158. package/dist/test/search.test.js.map +1 -0
  159. package/dist/test/update-changelog.test.d.ts +1 -0
  160. package/dist/test/update-changelog.test.js +125 -0
  161. package/dist/test/update-changelog.test.js.map +1 -0
  162. package/dist/test/wiki-graph.test.d.ts +1 -0
  163. package/dist/test/wiki-graph.test.js +164 -0
  164. package/dist/test/wiki-graph.test.js.map +1 -0
  165. package/dist/test/wiki-patch.test.d.ts +1 -0
  166. package/dist/test/wiki-patch.test.js +610 -0
  167. package/dist/test/wiki-patch.test.js.map +1 -0
  168. package/dist/test/wiki-query.test.d.ts +1 -0
  169. package/dist/test/wiki-query.test.js +163 -0
  170. package/dist/test/wiki-query.test.js.map +1 -0
  171. package/docs/PLAN.md +993 -0
  172. package/docs/WHY.md +61 -0
  173. package/docs/plans/agent-integration.md +85 -0
  174. package/docs/plans/ci-publishing.md +111 -0
  175. package/docs/plans/doc-validation.md +92 -0
  176. package/docs/plans/github-action.md +113 -0
  177. package/docs/plans/incremental-mode.md +98 -0
  178. package/docs/plans/karpathy-llm-wiki-alignment.md +84 -0
  179. package/docs/plans/llm-compiler.md +160 -0
  180. package/docs/plans/production-scanner.md +104 -0
  181. package/docs/plans/query-and-file-back.md +103 -0
  182. package/docs/plans/search-index.md +118 -0
  183. package/docs/plans/trust-hardening.md +74 -0
  184. package/docs/plans/wiki-graph.md +183 -0
  185. package/docs/plans/wiki-health.md +76 -0
  186. package/package.json +83 -0
  187. package/prompts/compiler.md +16 -0
  188. package/prompts/lint.md +18 -0
  189. package/prompts/page-templates.md +25 -0
  190. package/skills/repo-wiki-cli/SKILL.md +139 -0
@@ -0,0 +1,410 @@
1
+ import path from 'node:path';
2
+ import { promises as fs } from 'node:fs';
3
+ import { extractFrontmatterBlock, parseSimpleYamlObject } from './frontmatter.js';
4
+ import { ensureDir, writeJson } from './utils/fs.js';
5
+ export const SEARCH_INDEX_VERSION = 1;
6
+ const DEFAULT_LIMIT = 10;
7
+ export function defaultSearchDirForWiki(wikiDir) {
8
+ return path.join(path.dirname(path.resolve(wikiDir)), 'search');
9
+ }
10
+ export async function buildSearchIndex({ wikiDir, outDir = defaultSearchDirForWiki(wikiDir) }) {
11
+ const resolvedWikiDir = path.resolve(wikiDir);
12
+ const resolvedOutDir = path.resolve(outDir);
13
+ const pageFiles = (await fs.readdir(resolvedWikiDir, { withFileTypes: true }))
14
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
15
+ .map((entry) => entry.name)
16
+ .sort((a, b) => a.localeCompare(b));
17
+ const drafts = [];
18
+ for (const pagePath of pageFiles) {
19
+ const filePath = path.join(resolvedWikiDir, pagePath);
20
+ const content = await fs.readFile(filePath, 'utf8');
21
+ drafts.push(parseSearchEntry(pagePath, content));
22
+ }
23
+ const pageRefIndex = new Map();
24
+ for (const entry of drafts) {
25
+ pageRefIndex.set(normalizePageReference(entry.pagePath), entry.pagePath);
26
+ pageRefIndex.set(normalizePageReference(entry.title), entry.pagePath);
27
+ }
28
+ const inboundMap = new Map();
29
+ const entries = drafts.map((entry) => {
30
+ const outboundLinks = uniqueSorted(entry.outboundRefs
31
+ .map((ref) => resolvePageReference(ref, pageRefIndex))
32
+ .filter((ref) => Boolean(ref) && ref !== entry.pagePath));
33
+ for (const target of outboundLinks) {
34
+ if (!inboundMap.has(target)) {
35
+ inboundMap.set(target, new Set());
36
+ }
37
+ inboundMap.get(target).add(entry.pagePath);
38
+ }
39
+ return {
40
+ pagePath: entry.pagePath,
41
+ title: entry.title,
42
+ kind: entry.kind,
43
+ pageState: entry.pageState,
44
+ summary: entry.summary,
45
+ snippet: entry.snippet,
46
+ sourceCommit: entry.sourceCommit,
47
+ sourcePaths: entry.sourcePaths,
48
+ headings: entry.headings,
49
+ outboundLinks,
50
+ inboundLinks: [],
51
+ searchText: entry.searchText
52
+ };
53
+ }).sort((a, b) => a.pagePath.localeCompare(b.pagePath));
54
+ for (const entry of entries) {
55
+ entry.inboundLinks = uniqueSorted([...(inboundMap.get(entry.pagePath) || new Set())]);
56
+ }
57
+ const sourceCommits = uniqueSorted(entries
58
+ .map((entry) => entry.sourceCommit)
59
+ .filter((value) => Boolean(value)));
60
+ const index = {
61
+ version: SEARCH_INDEX_VERSION,
62
+ wikiDir: normalizeStoredPath(path.relative(resolvedOutDir, resolvedWikiDir) || '.'),
63
+ sourceCommits,
64
+ entries
65
+ };
66
+ await ensureDir(resolvedOutDir);
67
+ const outFile = path.join(resolvedOutDir, 'index.json');
68
+ await writeJson(outFile, index);
69
+ return {
70
+ index,
71
+ summary: {
72
+ outDir: normalizeSummaryPath(path.relative(process.cwd(), resolvedOutDir) || '.'),
73
+ outFile: normalizeSummaryPath(path.relative(process.cwd(), outFile) || path.basename(outFile)),
74
+ pages: entries.length,
75
+ sourceCommits
76
+ }
77
+ };
78
+ }
79
+ export async function searchWiki({ query, wikiDir, outDir = defaultSearchDirForWiki(wikiDir), limit = DEFAULT_LIMIT }) {
80
+ const normalizedLimit = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : DEFAULT_LIMIT;
81
+ const { index, summary: indexSummary } = await buildSearchIndex({ wikiDir, outDir });
82
+ const results = searchIndex(index, query, normalizedLimit);
83
+ return {
84
+ index,
85
+ results,
86
+ summary: {
87
+ query,
88
+ limit: normalizedLimit,
89
+ totalResults: results.length,
90
+ index: indexSummary
91
+ }
92
+ };
93
+ }
94
+ export function searchIndex(index, query, limit = DEFAULT_LIMIT) {
95
+ if (!Number.isFinite(limit) || limit <= 0) {
96
+ return [];
97
+ }
98
+ const tokens = tokenizeSearchText(query);
99
+ if (tokens.length === 0) {
100
+ return [];
101
+ }
102
+ const normalizedQuery = tokens.join(' ');
103
+ const scored = index.entries
104
+ .map((entry) => ({ entry, score: scoreEntry(entry, tokens, normalizedQuery) }))
105
+ .filter((item) => item.score > 0)
106
+ .sort((left, right) => {
107
+ if (right.score !== left.score) {
108
+ return right.score - left.score;
109
+ }
110
+ const titleCompare = left.entry.title.localeCompare(right.entry.title);
111
+ if (titleCompare !== 0) {
112
+ return titleCompare;
113
+ }
114
+ return left.entry.pagePath.localeCompare(right.entry.pagePath);
115
+ })
116
+ .slice(0, Math.max(1, Math.floor(limit)));
117
+ return scored.map(({ entry, score }, indexPosition) => ({
118
+ rank: indexPosition + 1,
119
+ score,
120
+ pagePath: entry.pagePath,
121
+ title: entry.title,
122
+ kind: entry.kind,
123
+ pageState: entry.pageState,
124
+ summary: entry.summary,
125
+ snippet: buildResultSnippet(entry, tokens),
126
+ sourcePaths: entry.sourcePaths,
127
+ graph: {
128
+ outboundLinks: entry.outboundLinks,
129
+ inboundLinks: entry.inboundLinks
130
+ }
131
+ }));
132
+ }
133
+ export function formatSearchResults(query, results) {
134
+ if (results.length === 0) {
135
+ return `No results for: ${query}`;
136
+ }
137
+ const lines = [`Search results for: ${query}`, ''];
138
+ for (const result of results) {
139
+ lines.push(`${result.rank}. ${result.title} (${result.kind || 'page'})`);
140
+ lines.push(` page: ${result.pagePath}`);
141
+ lines.push(` score: ${result.score}`);
142
+ lines.push(` ${result.summary || result.snippet}`);
143
+ if (result.sourcePaths.length > 0) {
144
+ lines.push(` source_paths: ${formatSourcePaths(result.sourcePaths)}`);
145
+ }
146
+ const graphBits = [];
147
+ if (result.graph.inboundLinks.length > 0) {
148
+ graphBits.push(`inbound ${result.graph.inboundLinks.length}`);
149
+ }
150
+ if (result.graph.outboundLinks.length > 0) {
151
+ graphBits.push(`outbound ${result.graph.outboundLinks.length}`);
152
+ }
153
+ if (graphBits.length > 0) {
154
+ lines.push(` graph: ${graphBits.join(', ')}`);
155
+ }
156
+ lines.push('');
157
+ }
158
+ return lines.join('\n').trimEnd();
159
+ }
160
+ function parseSearchEntry(pagePath, content) {
161
+ const block = extractFrontmatterBlock(content);
162
+ const frontmatter = parseFrontmatter(block?.yaml || '');
163
+ const body = (block?.body || content).trim();
164
+ const title = extractTitle(pagePath, body);
165
+ const headings = extractHeadings(body);
166
+ const cleanBody = normalizeWhitespace(markdownToText(body));
167
+ const summary = extractSummary(body, cleanBody);
168
+ const snippet = buildBaseSnippet(summary, cleanBody);
169
+ const outboundRefs = extractWikiLinkReferences(body);
170
+ const searchText = normalizeSearchText([
171
+ title,
172
+ frontmatter.kind,
173
+ headings.join(' '),
174
+ summary,
175
+ cleanBody,
176
+ frontmatter.sourcePaths.join(' '),
177
+ outboundRefs.join(' ')
178
+ ].filter((value) => Boolean(value)).join(' '));
179
+ return {
180
+ pagePath,
181
+ title,
182
+ kind: frontmatter.kind,
183
+ pageState: frontmatter.pageState,
184
+ summary,
185
+ snippet,
186
+ sourceCommit: frontmatter.sourceCommit,
187
+ sourcePaths: frontmatter.sourcePaths,
188
+ headings,
189
+ outboundRefs,
190
+ searchText
191
+ };
192
+ }
193
+ function parseFrontmatter(rawYaml) {
194
+ const parsed = parseSimpleYamlObject(rawYaml) || {};
195
+ return {
196
+ kind: readOptionalFrontmatterString(parsed.kind),
197
+ pageState: readOptionalFrontmatterString(parsed.page_state),
198
+ sourceCommit: readOptionalFrontmatterString(parsed.source_commit),
199
+ sourcePaths: uniqueSorted(readFrontmatterStringArray(parsed.source_paths))
200
+ };
201
+ }
202
+ function readOptionalFrontmatterString(value) {
203
+ if (value === undefined || value === null) {
204
+ return null;
205
+ }
206
+ if (typeof value === 'string') {
207
+ return value;
208
+ }
209
+ if (typeof value === 'number' || typeof value === 'boolean') {
210
+ return String(value);
211
+ }
212
+ return null;
213
+ }
214
+ function readFrontmatterStringArray(value) {
215
+ if (value === undefined || value === null) {
216
+ return [];
217
+ }
218
+ if (!Array.isArray(value)) {
219
+ return [];
220
+ }
221
+ const entries = [];
222
+ for (const entry of value) {
223
+ const normalized = readOptionalFrontmatterString(entry);
224
+ if (normalized !== null) {
225
+ entries.push(normalized);
226
+ }
227
+ }
228
+ return entries;
229
+ }
230
+ function extractTitle(pagePath, body) {
231
+ const headingMatch = /^#\s+(.+)$/m.exec(body);
232
+ if (headingMatch) {
233
+ return normalizeWhitespace(markdownToText(headingMatch[1]));
234
+ }
235
+ return pagePath
236
+ .replace(/\.md$/i, '')
237
+ .replace(/-/g, ' ')
238
+ .trim();
239
+ }
240
+ function extractHeadings(body) {
241
+ const headings = body
242
+ .split('\n')
243
+ .map((line) => /^#{2,6}\s+(.+)$/.exec(line.trim()))
244
+ .filter((match) => Boolean(match))
245
+ .map((match) => normalizeWhitespace(markdownToText(match[1])))
246
+ .filter(Boolean);
247
+ return uniqueSorted(headings);
248
+ }
249
+ function extractSummary(body, cleanBody) {
250
+ const paragraphs = body
251
+ .replace(/^#\s+.*$/m, '')
252
+ .split(/\n\s*\n/)
253
+ .map((part) => normalizeWhitespace(markdownToText(part)))
254
+ .filter((part) => part && !part.startsWith('```'));
255
+ const summary = paragraphs.find((paragraph) => paragraph.length > 0) || cleanBody;
256
+ if (!summary) {
257
+ return null;
258
+ }
259
+ return truncate(summary, 220);
260
+ }
261
+ function buildBaseSnippet(summary, cleanBody) {
262
+ return truncate(summary || cleanBody, 220) || '';
263
+ }
264
+ function extractWikiLinkReferences(body) {
265
+ const refs = new Set();
266
+ const markdownLink = /\[[^\]]+\]\(([^)]+)\)/g;
267
+ for (const match of body.matchAll(markdownLink)) {
268
+ const target = match[1]?.trim();
269
+ if (!target || isExternalReference(target)) {
270
+ continue;
271
+ }
272
+ refs.add(target);
273
+ }
274
+ const wikilink = /\[\[([^\]]+)\]\]/g;
275
+ for (const match of body.matchAll(wikilink)) {
276
+ const target = match[1]?.trim();
277
+ if (target) {
278
+ refs.add(target);
279
+ }
280
+ }
281
+ return uniqueSorted([...refs]);
282
+ }
283
+ function isExternalReference(target) {
284
+ return target.startsWith('http://') || target.startsWith('https://') || target.startsWith('#') || target.startsWith('mailto:');
285
+ }
286
+ function resolvePageReference(target, pageRefIndex) {
287
+ const cleaned = target.split('#')[0].split('?')[0].trim();
288
+ if (!cleaned) {
289
+ return null;
290
+ }
291
+ const normalized = normalizePageReference(path.basename(cleaned));
292
+ return pageRefIndex.get(normalized) || null;
293
+ }
294
+ function normalizePageReference(value) {
295
+ return value
296
+ .replace(/^\.\//, '')
297
+ .replace(/\.md$/i, '')
298
+ .replace(/\s+/g, '-')
299
+ .toLowerCase();
300
+ }
301
+ function scoreEntry(entry, tokens, normalizedQuery) {
302
+ const titleText = normalizeSearchText(entry.title);
303
+ const kindText = normalizeSearchText(entry.kind || '');
304
+ const summaryText = normalizeSearchText(entry.summary || '');
305
+ const headingsText = normalizeSearchText(entry.headings.join(' '));
306
+ const sourceText = normalizeSearchText(entry.sourcePaths.join(' '));
307
+ const linkText = normalizeSearchText([...entry.outboundLinks, ...entry.inboundLinks].join(' '));
308
+ const bodyText = entry.searchText;
309
+ let score = 0;
310
+ if (normalizedQuery && titleText.includes(normalizedQuery))
311
+ score += 120;
312
+ if (normalizedQuery && summaryText.includes(normalizedQuery))
313
+ score += 45;
314
+ if (normalizedQuery && headingsText.includes(normalizedQuery))
315
+ score += 35;
316
+ if (normalizedQuery && sourceText.includes(normalizedQuery))
317
+ score += 30;
318
+ for (const token of tokens) {
319
+ score += countOccurrences(titleText, token) * 40;
320
+ score += countOccurrences(kindText, token) * 20;
321
+ score += countOccurrences(sourceText, token) * 18;
322
+ score += countOccurrences(summaryText, token) * 14;
323
+ score += countOccurrences(headingsText, token) * 10;
324
+ score += Math.min(6, countOccurrences(linkText, token)) * 4;
325
+ score += Math.min(10, countOccurrences(bodyText, token)) * 2;
326
+ }
327
+ const matchedTokens = tokens.filter((token) => bodyText.includes(token)).length;
328
+ score += matchedTokens * 5;
329
+ return score;
330
+ }
331
+ function buildResultSnippet(entry, tokens) {
332
+ const body = normalizeWhitespace(entry.summary || entry.snippet || entry.searchText);
333
+ const lower = body.toLowerCase();
334
+ for (const token of tokens) {
335
+ const index = lower.indexOf(token);
336
+ if (index >= 0) {
337
+ const start = Math.max(0, index - 55);
338
+ const end = Math.min(body.length, index + token.length + 85);
339
+ const snippet = body.slice(start, end).trim();
340
+ return `${start > 0 ? '…' : ''}${snippet}${end < body.length ? '…' : ''}`;
341
+ }
342
+ }
343
+ return entry.snippet;
344
+ }
345
+ function markdownToText(body) {
346
+ return body
347
+ .replace(/```[\s\S]*?```/g, ' ')
348
+ .replace(/`([^`]+)`/g, '$1')
349
+ .replace(/!\[[^\]]*\]\(([^)]+)\)/g, ' $1 ')
350
+ .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 $2')
351
+ .replace(/\[\[([^\]]+)\]\]/g, '$1')
352
+ .replace(/<[^>]+>/g, ' ')
353
+ .replace(/^#{1,6}\s+/gm, '')
354
+ .replace(/^>\s?/gm, '')
355
+ .replace(/[|*_~]/g, ' ');
356
+ }
357
+ function tokenizeSearchText(value) {
358
+ return uniqueSorted(normalizeSearchText(value).split(' ').filter(Boolean));
359
+ }
360
+ function normalizeSearchText(value) {
361
+ return value
362
+ .toLowerCase()
363
+ .replace(/[^a-z0-9/._-]+/g, ' ')
364
+ .replace(/[._/]+/g, ' ')
365
+ .replace(/\s+/g, ' ')
366
+ .trim();
367
+ }
368
+ function normalizeWhitespace(value) {
369
+ return value.replace(/\s+/g, ' ').trim();
370
+ }
371
+ function truncate(value, maxLength) {
372
+ const normalized = normalizeWhitespace(value);
373
+ if (normalized.length <= maxLength) {
374
+ return normalized;
375
+ }
376
+ return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;
377
+ }
378
+ function normalizeStoredPath(value) {
379
+ return value.replaceAll(path.sep, '/');
380
+ }
381
+ function normalizeSummaryPath(value) {
382
+ return normalizeStoredPath(value);
383
+ }
384
+ function formatSourcePaths(sourcePaths) {
385
+ const visible = sourcePaths.slice(0, 5);
386
+ const hiddenCount = sourcePaths.length - visible.length;
387
+ return hiddenCount > 0
388
+ ? `${visible.join(', ')} (+${hiddenCount} more)`
389
+ : visible.join(', ');
390
+ }
391
+ function countOccurrences(haystack, needle) {
392
+ if (!haystack || !needle) {
393
+ return 0;
394
+ }
395
+ let count = 0;
396
+ let index = 0;
397
+ while (index >= 0) {
398
+ index = haystack.indexOf(needle, index);
399
+ if (index === -1) {
400
+ break;
401
+ }
402
+ count += 1;
403
+ index += needle.length;
404
+ }
405
+ return count;
406
+ }
407
+ function uniqueSorted(values) {
408
+ return [...new Set(values)].sort((a, b) => a.localeCompare(b));
409
+ }
410
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Shared patterns for detecting credential-like content in generated or published wiki markdown. */
2
+ export declare const SECRET_PATTERNS: readonly RegExp[];
3
+ export declare function containsSecretLikeContent(content: string): boolean;
@@ -0,0 +1,14 @@
1
+ /** Shared patterns for detecting credential-like content in generated or published wiki markdown. */
2
+ export const SECRET_PATTERNS = [
3
+ /AKIA[0-9A-Z]{16}/,
4
+ /-----BEGIN (RSA|DSA|EC|OPENSSH) PRIVATE KEY-----/,
5
+ /ghp_[A-Za-z0-9_]{30,}/,
6
+ /xox[baprs]-[A-Za-z0-9-]{20,}/,
7
+ /sk-[A-Za-z0-9]{20,}/,
8
+ /authorization:\s*bearer\s+[^\s"']{8,}/i,
9
+ /(?:token|password|api[_-]?key|secret)=[^\s&]{8,}/i
10
+ ];
11
+ export function containsSecretLikeContent(content) {
12
+ return SECRET_PATTERNS.some((pattern) => pattern.test(content));
13
+ }
14
+ //# sourceMappingURL=secret-patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-patterns.js","sourceRoot":"","sources":["../../src/secret-patterns.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,kBAAkB;IAClB,kDAAkD;IAClD,uBAAuB;IACvB,8BAA8B;IAC9B,qBAAqB;IACrB,wCAAwC;IACxC,mDAAmD;CACpD,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type ParsedArgs = Record<string, string | boolean | undefined>;
2
+ export declare function parseArgs(argv: string[]): ParsedArgs;
@@ -0,0 +1,19 @@
1
+ export function parseArgs(argv) {
2
+ const options = {};
3
+ for (let i = 0; i < argv.length; i += 1) {
4
+ const token = argv[i];
5
+ if (!token.startsWith('--')) {
6
+ continue;
7
+ }
8
+ const key = token.slice(2);
9
+ const next = argv[i + 1];
10
+ if (!next || next.startsWith('--')) {
11
+ options[key] = true;
12
+ continue;
13
+ }
14
+ options[key] = next;
15
+ i += 1;
16
+ }
17
+ return options;
18
+ }
19
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/utils/args.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type DotEnvLoadResult = {
2
+ path: string;
3
+ loaded: boolean;
4
+ keys: string[];
5
+ };
6
+ export declare function loadDotEnv(cwd?: string, fileName?: string): Promise<DotEnvLoadResult>;
7
+ export declare function parseDotEnv(content: string): Record<string, string>;
@@ -0,0 +1,73 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileExists } from './fs.js';
4
+ export async function loadDotEnv(cwd = process.cwd(), fileName = '.env') {
5
+ const envPath = path.join(path.resolve(cwd), fileName);
6
+ if (!await fileExists(envPath)) {
7
+ return { path: envPath, loaded: false, keys: [] };
8
+ }
9
+ const content = await fs.readFile(envPath, 'utf8');
10
+ const parsed = parseDotEnv(content);
11
+ const keys = [];
12
+ for (const [key, value] of Object.entries(parsed)) {
13
+ if (process.env[key] === undefined) {
14
+ process.env[key] = value;
15
+ keys.push(key);
16
+ }
17
+ }
18
+ return { path: envPath, loaded: true, keys: keys.sort() };
19
+ }
20
+ export function parseDotEnv(content) {
21
+ const values = {};
22
+ for (const rawLine of content.split(/\r?\n/)) {
23
+ const line = rawLine.trim();
24
+ if (!line || line.startsWith('#')) {
25
+ continue;
26
+ }
27
+ const withoutExport = line.startsWith('export ') ? line.slice('export '.length).trimStart() : line;
28
+ const equalsIndex = withoutExport.indexOf('=');
29
+ if (equalsIndex <= 0) {
30
+ continue;
31
+ }
32
+ const key = withoutExport.slice(0, equalsIndex).trim();
33
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
34
+ continue;
35
+ }
36
+ values[key] = parseDotEnvValue(withoutExport.slice(equalsIndex + 1).trim());
37
+ }
38
+ return values;
39
+ }
40
+ function parseDotEnvValue(rawValue) {
41
+ if (rawValue.startsWith('"')) {
42
+ const end = findClosingQuote(rawValue, '"');
43
+ const quoted = end === -1 ? rawValue.slice(1) : rawValue.slice(1, end);
44
+ return quoted
45
+ .replace(/\\n/g, '\n')
46
+ .replace(/\\r/g, '\r')
47
+ .replace(/\\t/g, '\t')
48
+ .replace(/\\"/g, '"')
49
+ .replace(/\\\\/g, '\\');
50
+ }
51
+ if (rawValue.startsWith("'")) {
52
+ const end = findClosingQuote(rawValue, "'");
53
+ return end === -1 ? rawValue.slice(1) : rawValue.slice(1, end);
54
+ }
55
+ return stripInlineComment(rawValue).trim();
56
+ }
57
+ function findClosingQuote(value, quote) {
58
+ for (let i = 1; i < value.length; i += 1) {
59
+ if (value[i] === quote && value[i - 1] !== '\\') {
60
+ return i;
61
+ }
62
+ }
63
+ return -1;
64
+ }
65
+ function stripInlineComment(value) {
66
+ for (let i = 0; i < value.length; i += 1) {
67
+ if (value[i] === '#' && (i === 0 || /\s/.test(value[i - 1]))) {
68
+ return value.slice(0, i);
69
+ }
70
+ }
71
+ return value;
72
+ }
73
+ //# sourceMappingURL=dotenv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotenv.js","sourceRoot":"","sources":["../../../src/utils/dotenv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ type WalkFile = {
2
+ absolute: string;
3
+ relative: string;
4
+ };
5
+ type WalkFilesOptions = {
6
+ /** Replace the built-in traversal excludes. */
7
+ exclude?: string[];
8
+ /** Append excludes to the active list (either `exclude` or the defaults). */
9
+ additionalExclude?: string[];
10
+ /** Skip nested Git repository/worktree roots discovered below rootDir. */
11
+ suppressNestedRepositories?: boolean;
12
+ /** Observe nested repository/worktree roots that were suppressed. */
13
+ onSuppressNestedRepository?: (relativePath: string) => void;
14
+ };
15
+ export declare function ensureDir(dirPath: string): Promise<void>;
16
+ export declare function readJson(filePath: string): Promise<any>;
17
+ export declare function writeJson(filePath: string, data: unknown): Promise<void>;
18
+ export declare function writeText(filePath: string, content: string): Promise<void>;
19
+ export declare function fileExists(filePath: string): Promise<boolean>;
20
+ export declare function walkFiles(rootDir: string, options?: WalkFilesOptions): Promise<WalkFile[]>;
21
+ export declare const DEFAULT_WALK_EXCLUDES: string[];
22
+ export {};