@wiki0/core 0.0.3 → 0.0.5
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 +38 -23
- package/dist/documents.d.ts +12 -0
- package/dist/documents.js +143 -0
- package/dist/documents.js.map +1 -0
- package/dist/events.d.ts +9 -0
- package/dist/events.js +56 -0
- package/dist/events.js.map +1 -0
- package/dist/facts.d.ts +4 -0
- package/dist/facts.js +108 -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 +8 -4
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +11 -1
- package/dist/indexer.js +132 -21
- package/dist/indexer.js.map +1 -1
- package/dist/ingest.d.ts +2 -0
- package/dist/ingest.js +253 -0
- package/dist/ingest.js.map +1 -0
- package/dist/lint.js +1 -1
- package/dist/lint.js.map +1 -1
- package/dist/pages.js +25 -3
- package/dist/pages.js.map +1 -1
- package/dist/schema.sql +32 -0
- package/dist/search.d.ts +4 -2
- package/dist/search.js +162 -6
- package/dist/search.js.map +1 -1
- package/dist/sync.d.ts +2 -0
- package/dist/sync.js +340 -0
- package/dist/sync.js.map +1 -0
- 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 +83 -29
- package/dist/workflow.d.ts +2 -3
- package/dist/workflow.js +5 -92
- package/dist/workflow.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -8,9 +8,14 @@ Core wiki0 primitives for local-first Markdown wiki memory.
|
|
|
8
8
|
- Obsidian-style `[[WikiLinks]]` parsing.
|
|
9
9
|
- Page create/read/append/frontmatter operations.
|
|
10
10
|
- SQLite indexing and FTS search.
|
|
11
|
-
-
|
|
11
|
+
- Chunk-level context snippets with `wiki/path.md:line-line`
|
|
12
|
+
citations.
|
|
13
|
+
- Direct indexed chunk lookup for known `path:line` targets.
|
|
12
14
|
- Backlinks, graph data, lint results, review queues, and structured
|
|
13
|
-
facts.
|
|
15
|
+
facts with optional source-line provenance.
|
|
16
|
+
- Stale-index warnings in context responses.
|
|
17
|
+
- Lightweight topic threads and operation logs for agent workflows.
|
|
18
|
+
- Frontmatter-aware chunk ranking using priority, status, and tags.
|
|
14
19
|
- Wiki-building workflow planning for agents that need a deterministic
|
|
15
20
|
source-to-wiki recipe.
|
|
16
21
|
|
|
@@ -18,31 +23,41 @@ Core wiki0 primitives for local-first Markdown wiki memory.
|
|
|
18
23
|
|
|
19
24
|
```ts
|
|
20
25
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
create_page,
|
|
27
|
+
index_status,
|
|
28
|
+
index_wiki,
|
|
29
|
+
search_wiki,
|
|
30
|
+
get_wiki_context,
|
|
31
|
+
sync_documents,
|
|
32
|
+
lint_wiki,
|
|
33
|
+
parse_document,
|
|
34
|
+
plan_wiki,
|
|
35
|
+
} from '@wiki0/core';
|
|
36
|
+
|
|
37
|
+
create_page('projects/wiki0', 'Local-first [[topics/memory]].', {
|
|
38
|
+
root: '.',
|
|
33
39
|
});
|
|
34
|
-
index_wiki(
|
|
35
|
-
console.log(index_status(
|
|
36
|
-
console.log(search_wiki(
|
|
37
|
-
console.log(get_wiki_context(
|
|
38
|
-
console.log(lint_wiki(
|
|
39
|
-
console.log(
|
|
40
|
-
|
|
40
|
+
index_wiki('.');
|
|
41
|
+
console.log(index_status('.'));
|
|
42
|
+
console.log(search_wiki('memory', '.', 10));
|
|
43
|
+
console.log(get_wiki_context('what is wiki0?', '.', 5).markdown);
|
|
44
|
+
console.log(lint_wiki('.'));
|
|
45
|
+
console.log(
|
|
46
|
+
plan_wiki({ source_type: 'codebase', scope: 'current repo' }),
|
|
47
|
+
);
|
|
48
|
+
console.log(await parse_document('docs/guide.md'));
|
|
49
|
+
console.log(
|
|
50
|
+
await sync_documents({
|
|
51
|
+
root: '.',
|
|
52
|
+
sources: ['docs'],
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
41
55
|
```
|
|
42
56
|
|
|
43
57
|
## Storage model
|
|
44
58
|
|
|
45
59
|
Markdown files under `wiki/` are canonical. The `.wiki0/wiki0.sqlite`
|
|
46
60
|
database is a rebuildable cache for search, backlinks, graph data, and
|
|
47
|
-
facts. `index_status` reports indexed-at time, schema
|
|
48
|
-
stale reasons when Markdown
|
|
61
|
+
facts. `index_status` reports indexed-at time, schema/package
|
|
62
|
+
versions, and stale reasons when Markdown or index metadata has
|
|
63
|
+
changed since the last rebuild.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ParsedDocumentKind = 'markdown' | 'text' | 'pdf' | 'docx' | 'unsupported';
|
|
2
|
+
export type ParsedDocumentMetadata = Record<string, string | number | boolean | null>;
|
|
3
|
+
export interface ParsedDocument {
|
|
4
|
+
source_path: string;
|
|
5
|
+
kind: ParsedDocumentKind;
|
|
6
|
+
title?: string;
|
|
7
|
+
text: string;
|
|
8
|
+
metadata: ParsedDocumentMetadata;
|
|
9
|
+
warnings: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function parse_document(source_path: string): Promise<ParsedDocument>;
|
|
12
|
+
export declare function document_kind(source_path: string): ParsedDocumentKind;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import mammoth from 'mammoth';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import { basename, extname, resolve } from 'node:path';
|
|
4
|
+
import { PDFParse } from 'pdf-parse';
|
|
5
|
+
import { page_title_from_markdown, parse_markdown, } from './markdown.js';
|
|
6
|
+
export async function parse_document(source_path) {
|
|
7
|
+
const resolved_path = resolve(source_path);
|
|
8
|
+
const kind = document_kind(source_path);
|
|
9
|
+
const base_result = {
|
|
10
|
+
source_path,
|
|
11
|
+
kind,
|
|
12
|
+
text: '',
|
|
13
|
+
metadata: {},
|
|
14
|
+
warnings: [],
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
const stats = await stat(resolved_path);
|
|
18
|
+
if (!stats.isFile()) {
|
|
19
|
+
return {
|
|
20
|
+
...base_result,
|
|
21
|
+
kind: 'unsupported',
|
|
22
|
+
warnings: ['Source is not a file.'],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return {
|
|
28
|
+
...base_result,
|
|
29
|
+
kind: 'unsupported',
|
|
30
|
+
warnings: [`Source could not be read: ${error_message(error)}`],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (kind === 'markdown')
|
|
34
|
+
return parse_markdown_document(source_path);
|
|
35
|
+
if (kind === 'text')
|
|
36
|
+
return parse_text_document(source_path);
|
|
37
|
+
if (kind === 'pdf')
|
|
38
|
+
return parse_pdf_document(source_path);
|
|
39
|
+
if (kind === 'docx')
|
|
40
|
+
return parse_docx_document(source_path);
|
|
41
|
+
return {
|
|
42
|
+
...base_result,
|
|
43
|
+
warnings: [`Unsupported document type: ${extname(source_path)}`],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function document_kind(source_path) {
|
|
47
|
+
const extension = extname(source_path).toLowerCase();
|
|
48
|
+
if (extension === '.md' || extension === '.markdown')
|
|
49
|
+
return 'markdown';
|
|
50
|
+
if (extension === '.txt')
|
|
51
|
+
return 'text';
|
|
52
|
+
if (extension === '.pdf')
|
|
53
|
+
return 'pdf';
|
|
54
|
+
if (extension === '.docx')
|
|
55
|
+
return 'docx';
|
|
56
|
+
return 'unsupported';
|
|
57
|
+
}
|
|
58
|
+
async function parse_markdown_document(source_path) {
|
|
59
|
+
const text = await readFile(source_path, 'utf-8');
|
|
60
|
+
const parsed = parse_markdown(text);
|
|
61
|
+
return {
|
|
62
|
+
source_path,
|
|
63
|
+
kind: 'markdown',
|
|
64
|
+
title: page_title_from_markdown(text, basename(source_path)),
|
|
65
|
+
text: normalize_text(parsed.content),
|
|
66
|
+
metadata: {
|
|
67
|
+
bytes: Buffer.byteLength(text),
|
|
68
|
+
...flatten_frontmatter_metadata(parsed.frontmatter),
|
|
69
|
+
},
|
|
70
|
+
warnings: [],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function parse_text_document(source_path) {
|
|
74
|
+
const text = await readFile(source_path, 'utf-8');
|
|
75
|
+
return {
|
|
76
|
+
source_path,
|
|
77
|
+
kind: 'text',
|
|
78
|
+
title: basename(source_path),
|
|
79
|
+
text: normalize_text(text),
|
|
80
|
+
metadata: { bytes: Buffer.byteLength(text) },
|
|
81
|
+
warnings: [],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function parse_pdf_document(source_path) {
|
|
85
|
+
const parser = new PDFParse({ data: await readFile(source_path) });
|
|
86
|
+
try {
|
|
87
|
+
const [text_result, info_result] = await Promise.all([
|
|
88
|
+
parser.getText(),
|
|
89
|
+
parser.getInfo().catch(() => null),
|
|
90
|
+
]);
|
|
91
|
+
const info = info_result?.info;
|
|
92
|
+
return {
|
|
93
|
+
source_path,
|
|
94
|
+
kind: 'pdf',
|
|
95
|
+
title: string_metadata(info?.Title) ?? basename(source_path),
|
|
96
|
+
text: normalize_text(text_result.text),
|
|
97
|
+
metadata: compact_metadata({
|
|
98
|
+
pages: text_result.total,
|
|
99
|
+
title: string_metadata(info?.Title),
|
|
100
|
+
author: string_metadata(info?.Author),
|
|
101
|
+
subject: string_metadata(info?.Subject),
|
|
102
|
+
creator: string_metadata(info?.Creator),
|
|
103
|
+
producer: string_metadata(info?.Producer),
|
|
104
|
+
}),
|
|
105
|
+
warnings: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
await parser.destroy();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function parse_docx_document(source_path) {
|
|
113
|
+
const result = await mammoth.extractRawText({ path: source_path });
|
|
114
|
+
return {
|
|
115
|
+
source_path,
|
|
116
|
+
kind: 'docx',
|
|
117
|
+
title: basename(source_path),
|
|
118
|
+
text: normalize_text(result.value),
|
|
119
|
+
metadata: {},
|
|
120
|
+
warnings: result.messages.map((message) => message.message),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function normalize_text(text) {
|
|
124
|
+
return text.replace(/\r\n?/gu, '\n').trim();
|
|
125
|
+
}
|
|
126
|
+
function flatten_frontmatter_metadata(frontmatter) {
|
|
127
|
+
return Object.fromEntries(Object.entries(frontmatter)
|
|
128
|
+
.filter((entry) => entry[1] === null ||
|
|
129
|
+
['string', 'number', 'boolean'].includes(typeof entry[1]))
|
|
130
|
+
.map(([key, value]) => [`frontmatter_${key}`, value]));
|
|
131
|
+
}
|
|
132
|
+
function compact_metadata(metadata) {
|
|
133
|
+
return Object.fromEntries(Object.entries(metadata).filter((entry) => entry[1] !== undefined));
|
|
134
|
+
}
|
|
135
|
+
function string_metadata(value) {
|
|
136
|
+
return typeof value === 'string' && value.trim().length > 0
|
|
137
|
+
? value.trim()
|
|
138
|
+
: undefined;
|
|
139
|
+
}
|
|
140
|
+
function error_message(error) {
|
|
141
|
+
return error instanceof Error ? error.message : String(error);
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WikiEvent } from './types.js';
|
|
2
|
+
export declare function log_wiki_event(options: {
|
|
3
|
+
root?: string;
|
|
4
|
+
operation: string;
|
|
5
|
+
summary: string;
|
|
6
|
+
target?: string;
|
|
7
|
+
details?: unknown;
|
|
8
|
+
}): WikiEvent;
|
|
9
|
+
export declare function list_wiki_events(root?: string, limit?: number): WikiEvent[];
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { open_wiki_database } from './database.js';
|
|
2
|
+
import { resolve_wiki_root } from './paths.js';
|
|
3
|
+
export function log_wiki_event(options) {
|
|
4
|
+
const wiki_root = resolve_wiki_root(options.root);
|
|
5
|
+
const db = open_wiki_database(wiki_root);
|
|
6
|
+
ensure_events_table(db);
|
|
7
|
+
const result = db
|
|
8
|
+
.prepare(`INSERT INTO wiki_events (operation, summary, target, details)
|
|
9
|
+
VALUES (?, ?, ?, ?)`)
|
|
10
|
+
.run(options.operation, options.summary, options.target ?? null, options.details === undefined
|
|
11
|
+
? null
|
|
12
|
+
: JSON.stringify(options.details));
|
|
13
|
+
const event = select_event_by_id(db, Number(result.lastInsertRowid));
|
|
14
|
+
db.close();
|
|
15
|
+
return event;
|
|
16
|
+
}
|
|
17
|
+
export function list_wiki_events(root = '.', limit = 50) {
|
|
18
|
+
const db = open_wiki_database(root);
|
|
19
|
+
ensure_events_table(db);
|
|
20
|
+
const rows = db
|
|
21
|
+
.prepare(`SELECT id, operation, summary, target, details, created_at
|
|
22
|
+
FROM wiki_events
|
|
23
|
+
ORDER BY id DESC
|
|
24
|
+
LIMIT ?`)
|
|
25
|
+
.all(limit);
|
|
26
|
+
db.close();
|
|
27
|
+
return rows.map(event_from_row);
|
|
28
|
+
}
|
|
29
|
+
function select_event_by_id(db, id) {
|
|
30
|
+
const row = db
|
|
31
|
+
.prepare(`SELECT id, operation, summary, target, details, created_at
|
|
32
|
+
FROM wiki_events WHERE id = ?`)
|
|
33
|
+
.get(id);
|
|
34
|
+
return event_from_row(row);
|
|
35
|
+
}
|
|
36
|
+
function event_from_row(row) {
|
|
37
|
+
return {
|
|
38
|
+
id: Number(row.id),
|
|
39
|
+
operation: String(row.operation),
|
|
40
|
+
summary: String(row.summary),
|
|
41
|
+
target: row.target === null ? null : String(row.target),
|
|
42
|
+
details: row.details === null ? null : String(row.details),
|
|
43
|
+
created_at: String(row.created_at),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function ensure_events_table(db) {
|
|
47
|
+
db.exec(`CREATE TABLE IF NOT EXISTS wiki_events (
|
|
48
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
49
|
+
operation TEXT NOT NULL,
|
|
50
|
+
summary TEXT NOT NULL,
|
|
51
|
+
target TEXT,
|
|
52
|
+
details TEXT,
|
|
53
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
54
|
+
)`);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAqB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,UAAU,cAAc,CAAC,OAM9B;IACA,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,EAAE;SACf,OAAO,CACP;uBACoB,CACpB;SACA,GAAG,CACH,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,MAAM,IAAI,IAAI,EACtB,OAAO,CAAC,OAAO,KAAK,SAAS;QAC5B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAClC,CAAC;IACH,MAAM,KAAK,GAAG,kBAAkB,CAC/B,EAAE,EACF,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAC9B,CAAC;IACF,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,IAAI,GAAG,GAAG,EACV,KAAK,GAAG,EAAE;IAEV,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACpC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,EAAE;SACb,OAAO,CACP;;;WAGQ,CACR;SACA,GAAG,CAAC,KAAK,CAAqC,CAAC;IACjD,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAgB,EAAE,EAAU;IACvD,MAAM,GAAG,GAAG,EAAE;SACZ,OAAO,CACP;iCAC8B,CAC9B;SACA,GAAG,CAAC,EAAE,CAAmC,CAAC;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CACtB,GAAmC;IAEnC,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACvD,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1D,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KAClC,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAgB;IAC5C,EAAE,CAAC,IAAI,CAAC;;;;;;;GAON,CAAC,CAAC;AACL,CAAC"}
|
package/dist/facts.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { Fact, FactWriteOptions } from './types.js';
|
|
2
|
+
export type DerivedFactCandidate = Omit<FactWriteOptions, 'root' | 'page' | 'source'> & {
|
|
3
|
+
line: number;
|
|
4
|
+
};
|
|
2
5
|
export declare function add_fact(fact: FactWriteOptions): Fact;
|
|
3
6
|
export declare function list_facts(root?: string, category?: string): Fact[];
|
|
7
|
+
export declare function derive_facts_from_markdown(markdown: string): DerivedFactCandidate[];
|
package/dist/facts.js
CHANGED
|
@@ -1,43 +1,135 @@
|
|
|
1
1
|
import { open_wiki_database } from './database.js';
|
|
2
|
+
import { log_wiki_event } from './events.js';
|
|
2
3
|
import { resolve_page_path } from './pages.js';
|
|
3
4
|
import { resolve_wiki_root } from './paths.js';
|
|
5
|
+
import { show_wiki_chunk } from './search.js';
|
|
4
6
|
export function add_fact(fact) {
|
|
5
7
|
const wiki_root = resolve_wiki_root(fact.root);
|
|
6
8
|
const db = open_wiki_database(wiki_root);
|
|
9
|
+
ensure_fact_provenance_columns(db);
|
|
10
|
+
const source_chunk = fact.source
|
|
11
|
+
? show_wiki_chunk(fact.source, wiki_root)
|
|
12
|
+
: null;
|
|
7
13
|
const page_path = fact.page
|
|
8
14
|
? resolve_page_path(fact.page, wiki_root)
|
|
9
|
-
: null;
|
|
15
|
+
: (source_chunk?.path ?? null);
|
|
10
16
|
const page = page_path
|
|
11
17
|
? db
|
|
12
18
|
.prepare('SELECT id FROM pages WHERE path = ?')
|
|
13
19
|
.get(page_path)
|
|
14
20
|
: undefined;
|
|
15
21
|
const result = db
|
|
16
|
-
.prepare(`INSERT INTO facts (
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
LEFT JOIN pages ON pages.id = facts.page_id
|
|
24
|
-
WHERE facts.id = ?`)
|
|
25
|
-
.get(result.lastInsertRowid);
|
|
22
|
+
.prepare(`INSERT INTO facts (
|
|
23
|
+
page_id, category, summary, body, confidence,
|
|
24
|
+
source_path, source_heading, source_start_line, source_end_line, source_quote
|
|
25
|
+
)
|
|
26
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
27
|
+
.run(page?.id ?? null, fact.category, fact.summary, fact.body ?? null, fact.confidence ?? 'unknown', source_chunk?.path ?? null, source_chunk?.heading ?? null, source_chunk?.start_line ?? null, source_chunk?.end_line ?? null, fact.source_quote ?? source_quote(source_chunk));
|
|
28
|
+
const inserted = select_fact_by_id(db, Number(result.lastInsertRowid));
|
|
26
29
|
db.close();
|
|
30
|
+
log_wiki_event({
|
|
31
|
+
root: wiki_root,
|
|
32
|
+
operation: 'add_fact',
|
|
33
|
+
summary: fact.summary,
|
|
34
|
+
target: page_path ?? source_chunk?.path ?? undefined,
|
|
35
|
+
details: {
|
|
36
|
+
category: fact.category,
|
|
37
|
+
confidence: inserted.confidence,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
27
40
|
return inserted;
|
|
28
41
|
}
|
|
29
42
|
export function list_facts(root = '.', category) {
|
|
30
43
|
const db = open_wiki_database(root);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
FROM facts
|
|
34
|
-
LEFT JOIN pages ON pages.id = facts.page_id
|
|
44
|
+
ensure_fact_provenance_columns(db);
|
|
45
|
+
const sql = `${fact_select_sql}
|
|
35
46
|
${category ? 'WHERE facts.category = ?' : ''}
|
|
36
47
|
ORDER BY facts.created_at DESC, facts.id DESC`;
|
|
37
48
|
const rows = category
|
|
38
49
|
? db.prepare(sql).all(category)
|
|
39
50
|
: db.prepare(sql).all();
|
|
40
51
|
db.close();
|
|
41
|
-
return rows;
|
|
52
|
+
return rows.map(fact_from_row);
|
|
53
|
+
}
|
|
54
|
+
export function derive_facts_from_markdown(markdown) {
|
|
55
|
+
return markdown
|
|
56
|
+
.split(/\n/u)
|
|
57
|
+
.map((line, index) => ({
|
|
58
|
+
line: line.trim(),
|
|
59
|
+
line_number: index + 1,
|
|
60
|
+
}))
|
|
61
|
+
.filter(({ line }) => /\b(should|must|required|requirement|decision|constraint|risk|assumption|fact)\b/iu.test(line))
|
|
62
|
+
.slice(0, 20)
|
|
63
|
+
.map(({ line, line_number }) => ({
|
|
64
|
+
category: fact_category(line),
|
|
65
|
+
summary: line.replace(/^[-*]\s*/u, '').slice(0, 240),
|
|
66
|
+
body: `Derived from extracted source text line ${line_number}.`,
|
|
67
|
+
confidence: 'low',
|
|
68
|
+
source_quote: line,
|
|
69
|
+
line: line_number,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
function fact_category(line) {
|
|
73
|
+
if (/\b(decision)\b/iu.test(line))
|
|
74
|
+
return 'decision';
|
|
75
|
+
if (/\b(risk)\b/iu.test(line))
|
|
76
|
+
return 'risk';
|
|
77
|
+
if (/\b(assumption)\b/iu.test(line))
|
|
78
|
+
return 'assumption';
|
|
79
|
+
if (/\b(constraint|must|required|requirement|should)\b/iu.test(line)) {
|
|
80
|
+
return 'constraint';
|
|
81
|
+
}
|
|
82
|
+
return 'note';
|
|
83
|
+
}
|
|
84
|
+
const fact_select_sql = `SELECT facts.id, pages.path AS page_path, facts.category,
|
|
85
|
+
facts.summary, facts.body, facts.confidence,
|
|
86
|
+
facts.source_path, facts.source_heading, facts.source_start_line,
|
|
87
|
+
facts.source_end_line, facts.source_quote, facts.created_at AS created_at
|
|
88
|
+
FROM facts
|
|
89
|
+
LEFT JOIN pages ON pages.id = facts.page_id`;
|
|
90
|
+
function select_fact_by_id(db, id) {
|
|
91
|
+
const row = db
|
|
92
|
+
.prepare(`${fact_select_sql} WHERE facts.id = ?`)
|
|
93
|
+
.get(id);
|
|
94
|
+
return fact_from_row(row);
|
|
95
|
+
}
|
|
96
|
+
function fact_from_row(row) {
|
|
97
|
+
return {
|
|
98
|
+
id: Number(row.id),
|
|
99
|
+
page_path: row.page_path === null ? null : String(row.page_path),
|
|
100
|
+
category: String(row.category),
|
|
101
|
+
summary: String(row.summary),
|
|
102
|
+
body: row.body === null ? null : String(row.body),
|
|
103
|
+
confidence: String(row.confidence),
|
|
104
|
+
source_path: row.source_path === null ? null : String(row.source_path),
|
|
105
|
+
source_heading: row.source_heading === null ? null : String(row.source_heading),
|
|
106
|
+
source_start_line: row.source_start_line === null
|
|
107
|
+
? null
|
|
108
|
+
: Number(row.source_start_line),
|
|
109
|
+
source_end_line: row.source_end_line === null
|
|
110
|
+
? null
|
|
111
|
+
: Number(row.source_end_line),
|
|
112
|
+
source_quote: row.source_quote === null ? null : String(row.source_quote),
|
|
113
|
+
created_at: String(row.created_at),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function source_quote(source_chunk) {
|
|
117
|
+
if (!source_chunk)
|
|
118
|
+
return null;
|
|
119
|
+
return source_chunk.body.slice(0, 1000);
|
|
120
|
+
}
|
|
121
|
+
function ensure_fact_provenance_columns(db) {
|
|
122
|
+
const columns = new Set(db.prepare('PRAGMA table_info(facts)').all().map((column) => column.name));
|
|
123
|
+
const migrations = {
|
|
124
|
+
source_path: 'ALTER TABLE facts ADD COLUMN source_path TEXT',
|
|
125
|
+
source_heading: 'ALTER TABLE facts ADD COLUMN source_heading TEXT',
|
|
126
|
+
source_start_line: 'ALTER TABLE facts ADD COLUMN source_start_line INTEGER',
|
|
127
|
+
source_end_line: 'ALTER TABLE facts ADD COLUMN source_end_line INTEGER',
|
|
128
|
+
source_quote: 'ALTER TABLE facts ADD COLUMN source_quote TEXT',
|
|
129
|
+
};
|
|
130
|
+
for (const [column_name, sql] of Object.entries(migrations)) {
|
|
131
|
+
if (!columns.has(column_name))
|
|
132
|
+
db.exec(sql);
|
|
133
|
+
}
|
|
42
134
|
}
|
|
43
135
|
//# sourceMappingURL=facts.js.map
|
package/dist/facts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../src/facts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../src/facts.ts"],"names":[],"mappings":"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"}
|
package/dist/graph.js
CHANGED
|
@@ -6,11 +6,11 @@ export function graph_wiki(root = '.') {
|
|
|
6
6
|
const nodes = db
|
|
7
7
|
.prepare('SELECT path, title FROM pages ORDER BY path')
|
|
8
8
|
.all();
|
|
9
|
-
const
|
|
9
|
+
const edge_rows = db
|
|
10
10
|
.prepare(`SELECT pages.path AS "from",
|
|
11
11
|
COALESCE(page_links.to_path, page_links.target) AS "to",
|
|
12
12
|
page_links.target,
|
|
13
|
-
page_links.raw_text AS
|
|
13
|
+
page_links.raw_text AS raw_text,
|
|
14
14
|
page_links.alias,
|
|
15
15
|
page_links.embed,
|
|
16
16
|
page_links.status
|
|
@@ -19,6 +19,7 @@ export function graph_wiki(root = '.') {
|
|
|
19
19
|
ORDER BY pages.path, page_links.target`)
|
|
20
20
|
.all();
|
|
21
21
|
db.close();
|
|
22
|
+
const edges = edge_rows.map(graph_edge_from_row);
|
|
22
23
|
return {
|
|
23
24
|
root: wiki_root,
|
|
24
25
|
nodes,
|
|
@@ -31,4 +32,15 @@ export function graph_wiki(root = '.') {
|
|
|
31
32
|
})),
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
function graph_edge_from_row(row) {
|
|
36
|
+
return {
|
|
37
|
+
from: String(row.from),
|
|
38
|
+
to: String(row.to),
|
|
39
|
+
target: String(row.target),
|
|
40
|
+
raw_text: String(row.raw_text),
|
|
41
|
+
alias: row.alias === null ? null : String(row.alias),
|
|
42
|
+
embed: Boolean(row.embed),
|
|
43
|
+
status: row.status === 'resolved' ? 'resolved' : 'unresolved',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
34
46
|
//# sourceMappingURL=graph.js.map
|
package/dist/graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGrE,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,GAAG;IACpC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,EAAE;SACd,OAAO,CAAC,6CAA6C,CAAC;SACtD,GAAG,EAAiB,CAAC;IACvB,MAAM,SAAS,GAAG,EAAE;SAClB,OAAO,CACP;;;;;;;;;0CASuC,CACvC;SACA,GAAG,EAAsC,CAAC;IAC5C,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjD,OAAO;QACN,IAAI,EAAE,SAAS;QACf,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3B,GAAG,IAAI;YACP,EAAE,EACD,IAAI,CAAC,MAAM,KAAK,UAAU;gBACzB,CAAC,CAAC,IAAI,CAAC,EAAE;gBACT,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;YACrC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;SAC1B,CAAC,CAAC;KACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,GAAmC;IAEnC,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACpD,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;KAC7D,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
export { open_wiki_database, wiki_db_path } from './database.js';
|
|
2
|
-
export {
|
|
2
|
+
export { document_kind, parse_document, type ParsedDocument, type ParsedDocumentKind, type ParsedDocumentMetadata, } from './documents.js';
|
|
3
|
+
export { list_wiki_events, log_wiki_event } from './events.js';
|
|
4
|
+
export { add_fact, derive_facts_from_markdown, list_facts, type DerivedFactCandidate, } from './facts.js';
|
|
3
5
|
export { graph_wiki } from './graph.js';
|
|
4
|
-
export { current_index_schema_version, index_status, index_wiki, } from './indexer.js';
|
|
6
|
+
export { current_index_package_version, current_index_schema_version, index_status, index_wiki, } from './indexer.js';
|
|
5
7
|
export { lint_wiki } from './lint.js';
|
|
6
8
|
export { page_title_from_markdown, parse_frontmatter, parse_markdown, parse_wikilinks, serialize_frontmatter, strip_fenced_code_blocks, strip_inline_code, } from './markdown.js';
|
|
7
9
|
export { append_page, create_page, list_markdown_page_paths, read_page, resolve_page_path, set_page_frontmatter, } from './pages.js';
|
|
8
10
|
export { display_page_title, page_file_path, page_relative_path, resolve_wiki_root, slugify_title, wikilink_target_path, } from './paths.js';
|
|
9
11
|
export { review_wiki } from './review.js';
|
|
10
12
|
export { schema_sql } from './schema.js';
|
|
11
|
-
export { backlinks_for_page, format_context_markdown, get_wiki_context, search_wiki, } from './search.js';
|
|
13
|
+
export { backlinks_for_page, format_context_markdown, get_wiki_context, search_wiki, search_wiki_chunks, show_wiki_chunk, } from './search.js';
|
|
14
|
+
export { sync_documents } from './sync.js';
|
|
15
|
+
export { list_topic_threads } from './topics.js';
|
|
12
16
|
export type * from './types.js';
|
|
13
|
-
export {
|
|
17
|
+
export { plan_wiki, wiki_building_workflow_markdown, } from './workflow.js';
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
export { open_wiki_database, wiki_db_path } from './database.js';
|
|
2
|
-
export {
|
|
2
|
+
export { document_kind, parse_document, } from './documents.js';
|
|
3
|
+
export { list_wiki_events, log_wiki_event } from './events.js';
|
|
4
|
+
export { add_fact, derive_facts_from_markdown, list_facts, } from './facts.js';
|
|
3
5
|
export { graph_wiki } from './graph.js';
|
|
4
|
-
export { current_index_schema_version, index_status, index_wiki, } from './indexer.js';
|
|
6
|
+
export { current_index_package_version, current_index_schema_version, index_status, index_wiki, } from './indexer.js';
|
|
5
7
|
export { lint_wiki } from './lint.js';
|
|
6
8
|
export { page_title_from_markdown, parse_frontmatter, parse_markdown, parse_wikilinks, serialize_frontmatter, strip_fenced_code_blocks, strip_inline_code, } from './markdown.js';
|
|
7
9
|
export { append_page, create_page, list_markdown_page_paths, read_page, resolve_page_path, set_page_frontmatter, } from './pages.js';
|
|
8
10
|
export { display_page_title, page_file_path, page_relative_path, resolve_wiki_root, slugify_title, wikilink_target_path, } from './paths.js';
|
|
9
11
|
export { review_wiki } from './review.js';
|
|
10
12
|
export { schema_sql } from './schema.js';
|
|
11
|
-
export { backlinks_for_page, format_context_markdown, get_wiki_context, search_wiki, } from './search.js';
|
|
12
|
-
export {
|
|
13
|
+
export { backlinks_for_page, format_context_markdown, get_wiki_context, search_wiki, search_wiki_chunks, show_wiki_chunk, } from './search.js';
|
|
14
|
+
export { sync_documents } from './sync.js';
|
|
15
|
+
export { list_topic_threads } from './topics.js';
|
|
16
|
+
export { plan_wiki, wiki_building_workflow_markdown, } from './workflow.js';
|
|
13
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACN,aAAa,EACb,cAAc,GAId,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EACN,QAAQ,EACR,0BAA0B,EAC1B,UAAU,GAEV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,6BAA6B,EAC7B,4BAA4B,EAC5B,YAAY,EACZ,UAAU,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACN,wBAAwB,EACxB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,WAAW,EACX,WAAW,EACX,wBAAwB,EACxB,SAAS,EACT,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACN,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACN,SAAS,EACT,+BAA+B,GAC/B,MAAM,eAAe,CAAC"}
|
package/dist/indexer.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import type { IndexResult, IndexStatus } from './types.js';
|
|
2
|
-
export declare const current_index_schema_version =
|
|
2
|
+
export declare const current_index_schema_version = 4;
|
|
3
|
+
export declare const current_index_package_version: string;
|
|
3
4
|
export declare function index_wiki(root?: string): IndexResult;
|
|
5
|
+
type PageChunk = {
|
|
6
|
+
heading: string | null;
|
|
7
|
+
body: string;
|
|
8
|
+
start_line: number;
|
|
9
|
+
end_line: number;
|
|
10
|
+
sequence: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function chunk_page_body(body: string): PageChunk[];
|
|
4
13
|
export declare function index_status(root?: string): IndexStatus;
|
|
14
|
+
export {};
|