@wiki0/core 0.0.2 → 0.0.4
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 +27 -3
- package/dist/database.d.ts +3 -2
- package/dist/database.js +2 -2
- package/dist/database.js.map +1 -1
- package/dist/events.d.ts +9 -0
- package/dist/events.js +56 -0
- package/dist/events.js.map +1 -0
- package/dist/facts.js +78 -16
- package/dist/facts.js.map +1 -1
- package/dist/graph.js +14 -2
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +13 -1
- package/dist/indexer.js +208 -7
- package/dist/indexer.js.map +1 -1
- package/dist/lint.js +2 -2
- package/dist/lint.js.map +1 -1
- package/dist/markdown.js +32 -54
- package/dist/markdown.js.map +1 -1
- package/dist/pages.js +26 -4
- package/dist/pages.js.map +1 -1
- package/dist/review.js +3 -1
- package/dist/review.js.map +1 -1
- package/dist/schema.sql +38 -0
- package/dist/search.d.ts +5 -2
- package/dist/search.js +218 -12
- package/dist/search.js.map +1 -1
- package/dist/topics.d.ts +2 -0
- package/dist/topics.js +55 -0
- package/dist/topics.js.map +1 -0
- package/dist/types.d.ts +102 -12
- package/dist/workflow.d.ts +4 -0
- package/dist/workflow.js +301 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +2 -3
package/dist/search.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
1
3
|
import { open_wiki_database } from './database.js';
|
|
4
|
+
import { index_status } from './indexer.js';
|
|
2
5
|
import { resolve_page_path } from './pages.js';
|
|
6
|
+
import { resolve_wiki_root } from './paths.js';
|
|
3
7
|
export function search_wiki(query, root = '.', limit = 10) {
|
|
4
8
|
const db = open_wiki_database(root);
|
|
5
9
|
const statement = db.prepare(`SELECT path, title,
|
|
@@ -16,40 +20,233 @@ export function search_wiki(query, root = '.', limit = 10) {
|
|
|
16
20
|
}
|
|
17
21
|
try {
|
|
18
22
|
const rows = statement.all(fts_query, limit);
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
if (rows.length > 0)
|
|
24
|
+
return rows;
|
|
25
|
+
const relaxed_query = relaxed_plain_text_fts_query(query);
|
|
26
|
+
if (!relaxed_query || relaxed_query === fts_query)
|
|
27
|
+
return rows;
|
|
28
|
+
return statement.all(relaxed_query, limit);
|
|
21
29
|
}
|
|
22
30
|
catch (error) {
|
|
23
|
-
db.close();
|
|
24
31
|
throw new Error(`Invalid wiki search query: ${query}`, {
|
|
25
32
|
cause: error,
|
|
26
33
|
});
|
|
27
34
|
}
|
|
35
|
+
finally {
|
|
36
|
+
db.close();
|
|
37
|
+
}
|
|
28
38
|
}
|
|
39
|
+
const stop_words = new Set([
|
|
40
|
+
'a',
|
|
41
|
+
'an',
|
|
42
|
+
'and',
|
|
43
|
+
'are',
|
|
44
|
+
'as',
|
|
45
|
+
'at',
|
|
46
|
+
'be',
|
|
47
|
+
'by',
|
|
48
|
+
'did',
|
|
49
|
+
'do',
|
|
50
|
+
'does',
|
|
51
|
+
'for',
|
|
52
|
+
'from',
|
|
53
|
+
'how',
|
|
54
|
+
'in',
|
|
55
|
+
'is',
|
|
56
|
+
'it',
|
|
57
|
+
'of',
|
|
58
|
+
'on',
|
|
59
|
+
'or',
|
|
60
|
+
'that',
|
|
61
|
+
'the',
|
|
62
|
+
'this',
|
|
63
|
+
'to',
|
|
64
|
+
'was',
|
|
65
|
+
'we',
|
|
66
|
+
'what',
|
|
67
|
+
'when',
|
|
68
|
+
'where',
|
|
69
|
+
'who',
|
|
70
|
+
'why',
|
|
71
|
+
'with',
|
|
72
|
+
]);
|
|
29
73
|
export function plain_text_fts_query(query) {
|
|
74
|
+
return plain_text_terms(query).map(quote_fts_term).join(' ');
|
|
75
|
+
}
|
|
76
|
+
export function relaxed_plain_text_fts_query(query) {
|
|
77
|
+
return plain_text_terms(query)
|
|
78
|
+
.filter((term) => !stop_words.has(term.toLowerCase()))
|
|
79
|
+
.map(quote_fts_term)
|
|
80
|
+
.join(' OR ');
|
|
81
|
+
}
|
|
82
|
+
function plain_text_terms(query) {
|
|
30
83
|
return query
|
|
31
84
|
.split(/\s+/u)
|
|
32
85
|
.map((term) => term.replace(/^\W+|\W+$/gu, ''))
|
|
33
|
-
.filter((term) => term.length > 0)
|
|
34
|
-
|
|
35
|
-
|
|
86
|
+
.filter((term) => term.length > 0);
|
|
87
|
+
}
|
|
88
|
+
function quote_fts_term(term) {
|
|
89
|
+
return `"${term.replace(/"/gu, '""')}"`;
|
|
90
|
+
}
|
|
91
|
+
export function search_wiki_chunks(query, root = '.', limit = 10) {
|
|
92
|
+
const db = open_wiki_database(root);
|
|
93
|
+
const statement = db.prepare(`SELECT fts_page_chunks.chunk_id AS chunk_id,
|
|
94
|
+
fts_page_chunks.path,
|
|
95
|
+
fts_page_chunks.title,
|
|
96
|
+
page_chunks.heading,
|
|
97
|
+
page_chunks.body,
|
|
98
|
+
page_chunks.start_line AS start_line,
|
|
99
|
+
page_chunks.end_line AS end_line,
|
|
100
|
+
page_chunks.page_priority,
|
|
101
|
+
page_chunks.page_status,
|
|
102
|
+
page_chunks.page_tags,
|
|
103
|
+
snippet(fts_page_chunks, 4, '[', ']', '…', 12) AS snippet,
|
|
104
|
+
bm25(fts_page_chunks) AS rank
|
|
105
|
+
FROM fts_page_chunks
|
|
106
|
+
JOIN page_chunks ON page_chunks.id = fts_page_chunks.chunk_id
|
|
107
|
+
WHERE fts_page_chunks MATCH ?
|
|
108
|
+
ORDER BY rank
|
|
109
|
+
LIMIT ?`);
|
|
110
|
+
const fts_query = plain_text_fts_query(query);
|
|
111
|
+
if (!fts_query) {
|
|
112
|
+
db.close();
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const rows = boosted_chunk_rows(statement.all(fts_query, limit * 5).map(chunk_row_from_sql), limit);
|
|
117
|
+
if (rows.length > 0)
|
|
118
|
+
return rows;
|
|
119
|
+
const relaxed_query = relaxed_plain_text_fts_query(query);
|
|
120
|
+
if (!relaxed_query || relaxed_query === fts_query)
|
|
121
|
+
return rows;
|
|
122
|
+
return boosted_chunk_rows(statement.all(relaxed_query, limit * 5).map(chunk_row_from_sql), limit);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new Error(`Invalid wiki chunk search query: ${query}`, {
|
|
126
|
+
cause: error,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
db.close();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function chunk_row_from_sql(row) {
|
|
134
|
+
return {
|
|
135
|
+
chunk_id: Number(row.chunk_id),
|
|
136
|
+
path: String(row.path),
|
|
137
|
+
title: String(row.title),
|
|
138
|
+
heading: row.heading === null ? null : String(row.heading),
|
|
139
|
+
body: String(row.body),
|
|
140
|
+
start_line: Number(row.start_line),
|
|
141
|
+
end_line: Number(row.end_line),
|
|
142
|
+
page_priority: Number(row.page_priority ?? 0),
|
|
143
|
+
page_status: row.page_status === null ? null : String(row.page_status),
|
|
144
|
+
page_tags: parse_page_tags(row.page_tags),
|
|
145
|
+
snippet: String(row.snippet),
|
|
146
|
+
rank: Number(row.rank),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function boosted_chunk_rows(rows, limit) {
|
|
150
|
+
return rows
|
|
151
|
+
.map(normalize_chunk_row)
|
|
152
|
+
.map((row) => ({ ...row, rank: boosted_rank(row) }))
|
|
153
|
+
.sort((left, right) => left.rank - right.rank)
|
|
154
|
+
.slice(0, limit);
|
|
155
|
+
}
|
|
156
|
+
function normalize_chunk_row(row) {
|
|
157
|
+
return {
|
|
158
|
+
...row,
|
|
159
|
+
page_tags: parse_page_tags(row.page_tags),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function boosted_rank(row) {
|
|
163
|
+
const priority = row.page_priority ?? 0;
|
|
164
|
+
const status = (row.page_status ?? '').toLowerCase();
|
|
165
|
+
const tags = row.page_tags ?? [];
|
|
166
|
+
let rank = row.rank - priority * 0.1;
|
|
167
|
+
if (status === 'verified' || status === 'accepted')
|
|
168
|
+
rank -= 0.5;
|
|
169
|
+
if (status === 'draft' || status === 'review')
|
|
170
|
+
rank += 0.5;
|
|
171
|
+
if (status === 'stale' ||
|
|
172
|
+
status === 'superseded' ||
|
|
173
|
+
status === 'archived') {
|
|
174
|
+
rank += 2;
|
|
175
|
+
}
|
|
176
|
+
if (tags.includes('canonical') || tags.includes('source'))
|
|
177
|
+
rank -= 0.25;
|
|
178
|
+
if (tags.includes('archive') || tags.includes('superseded'))
|
|
179
|
+
rank += 2;
|
|
180
|
+
return rank;
|
|
181
|
+
}
|
|
182
|
+
function parse_page_tags(value) {
|
|
183
|
+
if (Array.isArray(value))
|
|
184
|
+
return value.filter((item) => typeof item === 'string');
|
|
185
|
+
if (typeof value !== 'string')
|
|
186
|
+
return [];
|
|
187
|
+
try {
|
|
188
|
+
const parsed = JSON.parse(value);
|
|
189
|
+
return Array.isArray(parsed)
|
|
190
|
+
? parsed.filter((item) => typeof item === 'string')
|
|
191
|
+
: [];
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export function show_wiki_chunk(target, root = '.') {
|
|
198
|
+
const { path, line } = parse_chunk_target(target, root);
|
|
199
|
+
const db = open_wiki_database(root);
|
|
200
|
+
const row = db
|
|
201
|
+
.prepare(`SELECT id AS chunk_id, path, title, heading, body,
|
|
202
|
+
start_line AS start_line, end_line AS end_line,
|
|
203
|
+
body AS snippet, 0 AS rank
|
|
204
|
+
FROM page_chunks
|
|
205
|
+
WHERE path = ? AND (? IS NULL OR (start_line <= ? AND end_line >= ?))
|
|
206
|
+
ORDER BY sequence
|
|
207
|
+
LIMIT 1`)
|
|
208
|
+
.get(path, line, line, line);
|
|
209
|
+
db.close();
|
|
210
|
+
return row ?? null;
|
|
211
|
+
}
|
|
212
|
+
function parse_chunk_target(target, root) {
|
|
213
|
+
const match = target.match(/^(.*?)(?::(\d+))?$/u);
|
|
214
|
+
const title = match?.[1]?.trim() ?? target;
|
|
215
|
+
const line = match?.[2] ? Number(match[2]) : null;
|
|
216
|
+
const wiki_root = resolve_wiki_root(root);
|
|
217
|
+
const direct_path = title.endsWith('.md') ? title : `${title}.md`;
|
|
218
|
+
if (existsSync(join(wiki_root, 'wiki', direct_path))) {
|
|
219
|
+
return { path: direct_path, line };
|
|
220
|
+
}
|
|
221
|
+
return { path: resolve_page_path(title, root), line };
|
|
36
222
|
}
|
|
37
223
|
export function get_wiki_context(query, root = '.', limit = 5) {
|
|
38
|
-
const
|
|
224
|
+
const status = index_status(root);
|
|
225
|
+
const warnings = status.stale
|
|
226
|
+
? [
|
|
227
|
+
`Index is stale (${status.reasons.join(', ')}); run index_wiki before relying on these results.`,
|
|
228
|
+
]
|
|
229
|
+
: [];
|
|
230
|
+
const results = search_wiki_chunks(query, root, limit);
|
|
39
231
|
return {
|
|
40
232
|
query,
|
|
41
233
|
results,
|
|
42
|
-
|
|
234
|
+
warnings,
|
|
235
|
+
markdown: format_context_markdown(query, results, warnings),
|
|
43
236
|
};
|
|
44
237
|
}
|
|
45
|
-
export function format_context_markdown(query, results) {
|
|
238
|
+
export function format_context_markdown(query, results, warnings = []) {
|
|
46
239
|
const lines = [`# wiki0 context: ${query}`, ''];
|
|
240
|
+
if (warnings.length > 0) {
|
|
241
|
+
lines.push('## Warnings', '', ...warnings.map((warning) => `- ${warning}`), '');
|
|
242
|
+
}
|
|
47
243
|
if (results.length === 0) {
|
|
48
244
|
lines.push('No indexed wiki context found.');
|
|
49
245
|
return `${lines.join('\n')}\n`;
|
|
50
246
|
}
|
|
51
247
|
for (const [index, result] of results.entries()) {
|
|
52
|
-
|
|
248
|
+
const line_range = `${result.start_line}-${result.end_line}`;
|
|
249
|
+
lines.push(`## ${index + 1}. ${result.title}`, `Source: \`wiki/${result.path}:${line_range}\``, result.heading ? `Heading: ${result.heading}` : '', '', result.body.trim(), '');
|
|
53
250
|
}
|
|
54
251
|
return `${lines.join('\n').trimEnd()}\n`;
|
|
55
252
|
}
|
|
@@ -57,7 +254,7 @@ export function backlinks_for_page(title, root = '.') {
|
|
|
57
254
|
const db = open_wiki_database(root);
|
|
58
255
|
const page_path = resolve_page_path(title, root);
|
|
59
256
|
const rows = db
|
|
60
|
-
.prepare(`SELECT pages.path, pages.title, page_links.raw_text AS
|
|
257
|
+
.prepare(`SELECT pages.path, pages.title, page_links.raw_text AS raw_text,
|
|
61
258
|
page_links.alias, page_links.embed
|
|
62
259
|
FROM page_links
|
|
63
260
|
JOIN pages ON pages.id = page_links.from_page_id
|
|
@@ -65,6 +262,15 @@ export function backlinks_for_page(title, root = '.') {
|
|
|
65
262
|
ORDER BY pages.path`)
|
|
66
263
|
.all(page_path);
|
|
67
264
|
db.close();
|
|
68
|
-
return rows.map(
|
|
265
|
+
return rows.map(backlink_from_row);
|
|
266
|
+
}
|
|
267
|
+
function backlink_from_row(row) {
|
|
268
|
+
return {
|
|
269
|
+
path: String(row.path),
|
|
270
|
+
title: String(row.title),
|
|
271
|
+
raw_text: String(row.raw_text),
|
|
272
|
+
alias: row.alias === null ? null : String(row.alias),
|
|
273
|
+
embed: Boolean(row.embed),
|
|
274
|
+
};
|
|
69
275
|
}
|
|
70
276
|
//# sourceMappingURL=search.js.map
|
package/dist/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/topics.d.ts
ADDED
package/dist/topics.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { open_wiki_database } from './database.js';
|
|
2
|
+
export function list_topic_threads(root = '.', limit = 50) {
|
|
3
|
+
const db = open_wiki_database(root);
|
|
4
|
+
const rows = db
|
|
5
|
+
.prepare(`SELECT path, title, heading, page_tags FROM page_chunks
|
|
6
|
+
ORDER BY path, sequence`)
|
|
7
|
+
.all();
|
|
8
|
+
db.close();
|
|
9
|
+
const topics = new Map();
|
|
10
|
+
for (const row of rows) {
|
|
11
|
+
const path = String(row.path);
|
|
12
|
+
const heading = row.heading === null ? null : String(row.heading);
|
|
13
|
+
const tags = parse_tags(row.page_tags);
|
|
14
|
+
for (const topic of [...tags, ...(heading ? [heading] : [])]) {
|
|
15
|
+
const normalized_topic = topic.trim();
|
|
16
|
+
if (!normalized_topic)
|
|
17
|
+
continue;
|
|
18
|
+
const bucket = topics.get(normalized_topic) ?? {
|
|
19
|
+
paths: new Set(),
|
|
20
|
+
references: 0,
|
|
21
|
+
headings: new Set(),
|
|
22
|
+
};
|
|
23
|
+
bucket.paths.add(path);
|
|
24
|
+
bucket.references += 1;
|
|
25
|
+
if (heading)
|
|
26
|
+
bucket.headings.add(heading);
|
|
27
|
+
topics.set(normalized_topic, bucket);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return [...topics]
|
|
31
|
+
.map(([topic, bucket]) => ({
|
|
32
|
+
topic,
|
|
33
|
+
reference_count: bucket.references,
|
|
34
|
+
page_count: bucket.paths.size,
|
|
35
|
+
paths: [...bucket.paths].sort(),
|
|
36
|
+
summary: [...bucket.headings].slice(0, 5).join('; '),
|
|
37
|
+
}))
|
|
38
|
+
.sort((left, right) => right.reference_count - left.reference_count ||
|
|
39
|
+
left.topic.localeCompare(right.topic))
|
|
40
|
+
.slice(0, limit);
|
|
41
|
+
}
|
|
42
|
+
function parse_tags(value) {
|
|
43
|
+
if (value === null)
|
|
44
|
+
return [];
|
|
45
|
+
try {
|
|
46
|
+
const parsed = JSON.parse(String(value));
|
|
47
|
+
return Array.isArray(parsed)
|
|
48
|
+
? parsed.filter((tag) => typeof tag === 'string')
|
|
49
|
+
: [];
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=topics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../src/topics.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type WikiConfig = {
|
|
2
2
|
root: string;
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
wiki_dir?: string;
|
|
4
|
+
db_path?: string;
|
|
5
5
|
};
|
|
6
6
|
export type WikiLink = {
|
|
7
7
|
raw: string;
|
|
@@ -9,7 +9,9 @@ export type WikiLink = {
|
|
|
9
9
|
alias?: string;
|
|
10
10
|
embed: boolean;
|
|
11
11
|
};
|
|
12
|
-
export type FrontmatterValue = string | number | boolean |
|
|
12
|
+
export type FrontmatterValue = string | number | boolean | null | FrontmatterValue[] | {
|
|
13
|
+
[key: string]: FrontmatterValue;
|
|
14
|
+
};
|
|
13
15
|
export type WikiFrontmatter = Record<string, FrontmatterValue>;
|
|
14
16
|
export type ParsedMarkdown = {
|
|
15
17
|
frontmatter: WikiFrontmatter;
|
|
@@ -33,9 +35,26 @@ export type PageFrontmatterOptions = {
|
|
|
33
35
|
};
|
|
34
36
|
export type IndexResult = {
|
|
35
37
|
root: string;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
db_path: string;
|
|
39
|
+
page_count: number;
|
|
40
|
+
link_count: number;
|
|
41
|
+
indexed_at: string;
|
|
42
|
+
schema_version: number;
|
|
43
|
+
package_version: string;
|
|
44
|
+
};
|
|
45
|
+
export type IndexStatus = {
|
|
46
|
+
root: string;
|
|
47
|
+
db_path: string;
|
|
48
|
+
exists: boolean;
|
|
49
|
+
indexed_at: string | null;
|
|
50
|
+
schema_version: number | null;
|
|
51
|
+
current_schema_version: number;
|
|
52
|
+
package_version: string | null;
|
|
53
|
+
current_package_version: string;
|
|
54
|
+
page_count: number;
|
|
55
|
+
indexed_page_count: number;
|
|
56
|
+
stale: boolean;
|
|
57
|
+
reasons: string[];
|
|
39
58
|
};
|
|
40
59
|
export type SearchResult = {
|
|
41
60
|
path: string;
|
|
@@ -43,15 +62,27 @@ export type SearchResult = {
|
|
|
43
62
|
snippet: string;
|
|
44
63
|
rank: number;
|
|
45
64
|
};
|
|
65
|
+
export type ChunkSearchResult = SearchResult & {
|
|
66
|
+
chunk_id: number;
|
|
67
|
+
heading: string | null;
|
|
68
|
+
body: string;
|
|
69
|
+
start_line: number;
|
|
70
|
+
end_line: number;
|
|
71
|
+
page_priority?: number;
|
|
72
|
+
page_status?: string | null;
|
|
73
|
+
page_tags?: string[];
|
|
74
|
+
};
|
|
75
|
+
export type ShowChunkResult = ChunkSearchResult;
|
|
46
76
|
export type ContextResult = {
|
|
47
77
|
query: string;
|
|
48
|
-
results:
|
|
78
|
+
results: ChunkSearchResult[];
|
|
79
|
+
warnings: string[];
|
|
49
80
|
markdown: string;
|
|
50
81
|
};
|
|
51
82
|
export type BacklinkResult = {
|
|
52
83
|
path: string;
|
|
53
84
|
title: string;
|
|
54
|
-
|
|
85
|
+
raw_text: string;
|
|
55
86
|
alias: string | null;
|
|
56
87
|
embed: boolean;
|
|
57
88
|
};
|
|
@@ -63,7 +94,7 @@ export type GraphEdge = {
|
|
|
63
94
|
from: string;
|
|
64
95
|
to: string;
|
|
65
96
|
target: string;
|
|
66
|
-
|
|
97
|
+
raw_text: string;
|
|
67
98
|
alias: string | null;
|
|
68
99
|
embed: boolean;
|
|
69
100
|
status: 'resolved' | 'unresolved';
|
|
@@ -76,12 +107,17 @@ export type GraphResult = {
|
|
|
76
107
|
export type FactConfidence = 'unknown' | 'low' | 'medium' | 'high' | 'verified';
|
|
77
108
|
export type Fact = {
|
|
78
109
|
id: number;
|
|
79
|
-
|
|
110
|
+
page_path: string | null;
|
|
80
111
|
category: string;
|
|
81
112
|
summary: string;
|
|
82
113
|
body: string | null;
|
|
83
114
|
confidence: FactConfidence;
|
|
84
|
-
|
|
115
|
+
source_path: string | null;
|
|
116
|
+
source_heading: string | null;
|
|
117
|
+
source_start_line: number | null;
|
|
118
|
+
source_end_line: number | null;
|
|
119
|
+
source_quote: string | null;
|
|
120
|
+
created_at: string;
|
|
85
121
|
};
|
|
86
122
|
export type FactWriteOptions = {
|
|
87
123
|
root?: string;
|
|
@@ -90,6 +126,8 @@ export type FactWriteOptions = {
|
|
|
90
126
|
summary: string;
|
|
91
127
|
body?: string;
|
|
92
128
|
confidence?: FactConfidence;
|
|
129
|
+
source?: string;
|
|
130
|
+
source_quote?: string;
|
|
93
131
|
};
|
|
94
132
|
export type ReviewResult = {
|
|
95
133
|
path: string;
|
|
@@ -108,6 +146,58 @@ export type LintIssue = {
|
|
|
108
146
|
export type LintResult = {
|
|
109
147
|
root: string;
|
|
110
148
|
ok: boolean;
|
|
111
|
-
|
|
149
|
+
issue_count: number;
|
|
112
150
|
issues: LintIssue[];
|
|
113
151
|
};
|
|
152
|
+
export type WikiSourceType = 'general' | 'codebase' | 'docs' | 'research' | 'notes';
|
|
153
|
+
export type WikiPlanOptions = {
|
|
154
|
+
source_type?: WikiSourceType;
|
|
155
|
+
scope?: string;
|
|
156
|
+
sources?: string[];
|
|
157
|
+
};
|
|
158
|
+
export type WikiBootstrapOptions = WikiPlanOptions & {
|
|
159
|
+
root?: string;
|
|
160
|
+
overwrite?: boolean;
|
|
161
|
+
ingest_sources?: boolean;
|
|
162
|
+
};
|
|
163
|
+
export type WikiPlanPage = {
|
|
164
|
+
title: string;
|
|
165
|
+
path: string;
|
|
166
|
+
purpose: string;
|
|
167
|
+
tags: string[];
|
|
168
|
+
};
|
|
169
|
+
export type WikiPlanResult = {
|
|
170
|
+
source_type: WikiSourceType;
|
|
171
|
+
scope: string;
|
|
172
|
+
workflow: string;
|
|
173
|
+
pages: WikiPlanPage[];
|
|
174
|
+
next_steps: string[];
|
|
175
|
+
};
|
|
176
|
+
export type WikiSourceIngestion = {
|
|
177
|
+
source: string;
|
|
178
|
+
page: string;
|
|
179
|
+
kind: 'file' | 'url' | 'missing';
|
|
180
|
+
};
|
|
181
|
+
export type WikiBootstrapResult = {
|
|
182
|
+
root: string;
|
|
183
|
+
plan: WikiPlanResult;
|
|
184
|
+
created: string[];
|
|
185
|
+
skipped: string[];
|
|
186
|
+
ingested_sources: WikiSourceIngestion[];
|
|
187
|
+
indexed: IndexResult;
|
|
188
|
+
};
|
|
189
|
+
export type WikiEvent = {
|
|
190
|
+
id: number;
|
|
191
|
+
operation: string;
|
|
192
|
+
summary: string;
|
|
193
|
+
target: string | null;
|
|
194
|
+
details: string | null;
|
|
195
|
+
created_at: string;
|
|
196
|
+
};
|
|
197
|
+
export type TopicThreadResult = {
|
|
198
|
+
topic: string;
|
|
199
|
+
reference_count: number;
|
|
200
|
+
page_count: number;
|
|
201
|
+
paths: string[];
|
|
202
|
+
summary: string;
|
|
203
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WikiBootstrapOptions, WikiBootstrapResult, WikiPlanOptions, WikiPlanResult } from './types.js';
|
|
2
|
+
export declare const wiki_building_workflow_markdown = "# Wiki building workflow\n\nUse this workflow when a user asks to build, bootstrap, generate, or improve a wiki from source material. A codebase is one source type; the same workflow applies to docs, notes, research, transcripts, or any mixed knowledge corpus.\n\n## Steps\n\n1. Clarify the source scope only if it is ambiguous.\n2. Inspect source material before writing pages.\n3. Propose a small page plan with names, purposes, and review flags.\n4. Create an index page that explains the corpus and links to major sections.\n5. Create focused pages for concepts, workflows, decisions, sources, and open questions.\n6. Use [[WikiLinks]] to connect related pages instead of duplicating context.\n7. Use frontmatter for title, aliases, tags, status, and review markers.\n8. Add structured facts for durable claims, decisions, or constraints.\n9. Run index_wiki after page creation.\n10. Run lint_wiki and fix unresolved links or duplicate names.\n11. Run review_wiki and surface pages that still need human review.\n\n## Quality bar\n\n- Prefer many focused pages over one giant dump.\n- Mark uncertain pages with needs-review instead of inventing confidence.\n- Preserve citations or source paths when facts come from external material.\n- Make the wiki navigable for humans and retrievable for agents.\n";
|
|
3
|
+
export declare function plan_wiki(options?: WikiPlanOptions): WikiPlanResult;
|
|
4
|
+
export declare function bootstrap_wiki(options?: WikiBootstrapOptions): WikiBootstrapResult;
|