@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/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
- db.close();
20
- return rows;
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
- .map((term) => `"${term.replace(/"/gu, '""')}"`)
35
- .join(' ');
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 results = search_wiki(query, root, limit);
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
- markdown: format_context_markdown(query, results),
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
- lines.push(`## ${index + 1}. ${result.title}`, `Source: \`wiki/${result.path}\``, '', result.snippet.replace(/\s+/gu, ' ').trim(), '');
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 rawText,
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((row) => ({ ...row, embed: Boolean(row.embed) }));
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
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { TopicThreadResult } from './types.js';
2
+ export declare function list_topic_threads(root?: string, limit?: number): TopicThreadResult[];
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
- wikiDir?: string;
4
- dbPath?: string;
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 | string[];
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
- dbPath: string;
37
- pageCount: number;
38
- linkCount: number;
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: SearchResult[];
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
- rawText: string;
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
- rawText: string;
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
- pagePath: string | null;
110
+ page_path: string | null;
80
111
  category: string;
81
112
  summary: string;
82
113
  body: string | null;
83
114
  confidence: FactConfidence;
84
- createdAt: string;
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
- issueCount: number;
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;