@wiki0/core 0.0.1 → 0.0.2
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 +39 -0
- package/dist/facts.d.ts +3 -0
- package/dist/facts.js +43 -0
- package/dist/facts.js.map +1 -0
- package/dist/graph.d.ts +2 -0
- package/dist/graph.js +34 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer.js +24 -6
- package/dist/indexer.js.map +1 -1
- package/dist/lint.d.ts +2 -0
- package/dist/lint.js +58 -0
- package/dist/lint.js.map +1 -0
- package/dist/pages.d.ts +1 -0
- package/dist/pages.js +29 -15
- package/dist/pages.js.map +1 -1
- package/dist/search.d.ts +1 -0
- package/dist/search.js +33 -13
- package/dist/search.js.map +1 -1
- package/dist/types.d.ts +49 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# @wiki0/core
|
|
2
|
+
|
|
3
|
+
Core wiki0 primitives for local-first Markdown wiki memory.
|
|
4
|
+
|
|
5
|
+
## What it provides
|
|
6
|
+
|
|
7
|
+
- Markdown and frontmatter parsing.
|
|
8
|
+
- Obsidian-style `[[WikiLinks]]` parsing.
|
|
9
|
+
- Page create/read/append/frontmatter operations.
|
|
10
|
+
- SQLite indexing and FTS search.
|
|
11
|
+
- Context snippets with `wiki/...` citations.
|
|
12
|
+
- Backlinks, graph data, lint results, review queues, and structured
|
|
13
|
+
facts.
|
|
14
|
+
|
|
15
|
+
## Basic usage
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import {
|
|
19
|
+
create_page,
|
|
20
|
+
index_wiki,
|
|
21
|
+
search_wiki,
|
|
22
|
+
get_wiki_context,
|
|
23
|
+
lint_wiki,
|
|
24
|
+
} from '@wiki0/core';
|
|
25
|
+
|
|
26
|
+
create_page('projects/wiki0', 'Local-first [[topics/memory]].', {
|
|
27
|
+
root: '.',
|
|
28
|
+
});
|
|
29
|
+
index_wiki('.');
|
|
30
|
+
console.log(search_wiki('memory', '.', 10));
|
|
31
|
+
console.log(get_wiki_context('what is wiki0?', '.', 5).markdown);
|
|
32
|
+
console.log(lint_wiki('.'));
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Storage model
|
|
36
|
+
|
|
37
|
+
Markdown files under `wiki/` are canonical. The `.wiki0/wiki0.sqlite`
|
|
38
|
+
database is a rebuildable cache for search, backlinks, graph data, and
|
|
39
|
+
facts.
|
package/dist/facts.d.ts
ADDED
package/dist/facts.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { open_wiki_database } from './database.js';
|
|
2
|
+
import { resolve_page_path } from './pages.js';
|
|
3
|
+
import { resolve_wiki_root } from './paths.js';
|
|
4
|
+
export function add_fact(fact) {
|
|
5
|
+
const wiki_root = resolve_wiki_root(fact.root);
|
|
6
|
+
const db = open_wiki_database(wiki_root);
|
|
7
|
+
const page_path = fact.page
|
|
8
|
+
? resolve_page_path(fact.page, wiki_root)
|
|
9
|
+
: null;
|
|
10
|
+
const page = page_path
|
|
11
|
+
? db
|
|
12
|
+
.prepare('SELECT id FROM pages WHERE path = ?')
|
|
13
|
+
.get(page_path)
|
|
14
|
+
: undefined;
|
|
15
|
+
const result = db
|
|
16
|
+
.prepare(`INSERT INTO facts (page_id, category, summary, body, confidence)
|
|
17
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
18
|
+
.run(page?.id ?? null, fact.category, fact.summary, fact.body ?? null, fact.confidence ?? 'unknown');
|
|
19
|
+
const inserted = db
|
|
20
|
+
.prepare(`SELECT facts.id, pages.path AS pagePath, facts.category,
|
|
21
|
+
facts.summary, facts.body, facts.confidence, facts.created_at AS createdAt
|
|
22
|
+
FROM facts
|
|
23
|
+
LEFT JOIN pages ON pages.id = facts.page_id
|
|
24
|
+
WHERE facts.id = ?`)
|
|
25
|
+
.get(result.lastInsertRowid);
|
|
26
|
+
db.close();
|
|
27
|
+
return inserted;
|
|
28
|
+
}
|
|
29
|
+
export function list_facts(root = '.', category) {
|
|
30
|
+
const db = open_wiki_database(root);
|
|
31
|
+
const sql = `SELECT facts.id, pages.path AS pagePath, facts.category,
|
|
32
|
+
facts.summary, facts.body, facts.confidence, facts.created_at AS createdAt
|
|
33
|
+
FROM facts
|
|
34
|
+
LEFT JOIN pages ON pages.id = facts.page_id
|
|
35
|
+
${category ? 'WHERE facts.category = ?' : ''}
|
|
36
|
+
ORDER BY facts.created_at DESC, facts.id DESC`;
|
|
37
|
+
const rows = category
|
|
38
|
+
? db.prepare(sql).all(category)
|
|
39
|
+
: db.prepare(sql).all();
|
|
40
|
+
db.close();
|
|
41
|
+
return rows;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../src/facts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,MAAM,UAAU,QAAQ,CAAC,IAAsB;IAC9C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI;QAC1B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC;IACR,MAAM,IAAI,GAAG,SAAS;QACrB,CAAC,CAAE,EAAE;aACF,OAAO,CAAC,qCAAqC,CAAC;aAC9C,GAAG,CAAC,SAAS,CAAgC;QAChD,CAAC,CAAC,SAAS,CAAC;IAEb,MAAM,MAAM,GAAG,EAAE;SACf,OAAO,CACP;0BACuB,CACvB;SACA,GAAG,CACH,IAAI,EAAE,EAAE,IAAI,IAAI,EAChB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,IAAI,IAAI,IAAI,EACjB,IAAI,CAAC,UAAU,IAAI,SAAS,CAC5B,CAAC;IACH,MAAM,QAAQ,GAAG,EAAE;SACjB,OAAO,CACP;;;;sBAImB,CACnB;SACA,GAAG,CAAC,MAAM,CAAC,eAAe,CAAS,CAAC;IACtC,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,GAAG,EAAE,QAAiB;IACvD,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG;;;;IAIT,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE;gDACE,CAAC;IAChD,MAAM,IAAI,GAAG,QAAQ;QACpB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC/B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,IAAc,CAAC;AACvB,CAAC"}
|
package/dist/graph.d.ts
ADDED
package/dist/graph.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { open_wiki_database } from './database.js';
|
|
2
|
+
import { resolve_wiki_root, wikilink_target_path } from './paths.js';
|
|
3
|
+
export function graph_wiki(root = '.') {
|
|
4
|
+
const wiki_root = resolve_wiki_root(root);
|
|
5
|
+
const db = open_wiki_database(wiki_root);
|
|
6
|
+
const nodes = db
|
|
7
|
+
.prepare('SELECT path, title FROM pages ORDER BY path')
|
|
8
|
+
.all();
|
|
9
|
+
const edges = db
|
|
10
|
+
.prepare(`SELECT pages.path AS "from",
|
|
11
|
+
COALESCE(page_links.to_path, page_links.target) AS "to",
|
|
12
|
+
page_links.target,
|
|
13
|
+
page_links.raw_text AS rawText,
|
|
14
|
+
page_links.alias,
|
|
15
|
+
page_links.embed,
|
|
16
|
+
page_links.status
|
|
17
|
+
FROM page_links
|
|
18
|
+
JOIN pages ON pages.id = page_links.from_page_id
|
|
19
|
+
ORDER BY pages.path, page_links.target`)
|
|
20
|
+
.all();
|
|
21
|
+
db.close();
|
|
22
|
+
return {
|
|
23
|
+
root: wiki_root,
|
|
24
|
+
nodes,
|
|
25
|
+
edges: edges.map((edge) => ({
|
|
26
|
+
...edge,
|
|
27
|
+
to: edge.status === 'resolved'
|
|
28
|
+
? edge.to
|
|
29
|
+
: wikilink_target_path(edge.target),
|
|
30
|
+
embed: Boolean(edge.embed),
|
|
31
|
+
})),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,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,KAAK,GAAG,EAAE;SACd,OAAO,CACP;;;;;;;;;0CASuC,CACvC;SACA,GAAG,EAAiB,CAAC;IACvB,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export { open_wiki_database, wiki_db_path } from './database.js';
|
|
2
|
+
export { add_fact, list_facts } from './facts.js';
|
|
3
|
+
export { graph_wiki } from './graph.js';
|
|
2
4
|
export { index_wiki } from './indexer.js';
|
|
5
|
+
export { lint_wiki } from './lint.js';
|
|
3
6
|
export { page_title_from_markdown, parse_frontmatter, parse_markdown, parse_wikilinks, serialize_frontmatter, strip_fenced_code_blocks, strip_inline_code, } from './markdown.js';
|
|
4
|
-
export { append_page, create_page, list_markdown_page_paths, read_page, set_page_frontmatter, } from './pages.js';
|
|
7
|
+
export { append_page, create_page, list_markdown_page_paths, read_page, resolve_page_path, set_page_frontmatter, } from './pages.js';
|
|
5
8
|
export { display_page_title, page_file_path, page_relative_path, resolve_wiki_root, slugify_title, wikilink_target_path, } from './paths.js';
|
|
6
9
|
export { review_wiki } from './review.js';
|
|
7
10
|
export { schema_sql } from './schema.js';
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export { open_wiki_database, wiki_db_path } from './database.js';
|
|
2
|
+
export { add_fact, list_facts } from './facts.js';
|
|
3
|
+
export { graph_wiki } from './graph.js';
|
|
2
4
|
export { index_wiki } from './indexer.js';
|
|
5
|
+
export { lint_wiki } from './lint.js';
|
|
3
6
|
export { page_title_from_markdown, parse_frontmatter, parse_markdown, parse_wikilinks, serialize_frontmatter, strip_fenced_code_blocks, strip_inline_code, } from './markdown.js';
|
|
4
|
-
export { append_page, create_page, list_markdown_page_paths, read_page, set_page_frontmatter, } from './pages.js';
|
|
7
|
+
export { append_page, create_page, list_markdown_page_paths, read_page, resolve_page_path, set_page_frontmatter, } from './pages.js';
|
|
5
8
|
export { display_page_title, page_file_path, page_relative_path, resolve_wiki_root, slugify_title, wikilink_target_path, } from './paths.js';
|
|
6
9
|
export { review_wiki } from './review.js';
|
|
7
10
|
export { schema_sql } from './schema.js';
|
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,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,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,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,GACX,MAAM,aAAa,CAAC"}
|
|
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,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,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,GACX,MAAM,aAAa,CAAC"}
|
package/dist/indexer.js
CHANGED
|
@@ -30,11 +30,25 @@ export function index_wiki(root = '.') {
|
|
|
30
30
|
const insert_fts = db.prepare('INSERT INTO fts_pages (path, title, body) VALUES (?, ?, ?)');
|
|
31
31
|
const page_paths = list_markdown_page_paths(wiki_root);
|
|
32
32
|
const known_paths = new Set(page_paths);
|
|
33
|
+
const pages = page_paths.map((page_path) => read_page_by_path(page_path, wiki_root));
|
|
34
|
+
const name_paths = new Map();
|
|
35
|
+
for (const page of pages) {
|
|
36
|
+
const aliases = page.frontmatter.aliases;
|
|
37
|
+
const alias_list = Array.isArray(aliases)
|
|
38
|
+
? aliases
|
|
39
|
+
: typeof aliases === 'string'
|
|
40
|
+
? [aliases]
|
|
41
|
+
: [];
|
|
42
|
+
for (const name of [page.title, ...alias_list]) {
|
|
43
|
+
const normalized_name = name.trim().toLowerCase();
|
|
44
|
+
if (normalized_name)
|
|
45
|
+
name_paths.set(normalized_name, page.path);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
33
48
|
const transaction = db.transaction(() => {
|
|
34
49
|
clear_fts.run();
|
|
35
|
-
for (const
|
|
36
|
-
const file_path = join(wiki_root, 'wiki',
|
|
37
|
-
const page = read_page_by_path(page_path, wiki_root);
|
|
50
|
+
for (const page of pages) {
|
|
51
|
+
const file_path = join(wiki_root, 'wiki', page.path);
|
|
38
52
|
const modified_at = statSync(file_path).mtime.toISOString();
|
|
39
53
|
const content_hash = createHash('sha256')
|
|
40
54
|
.update(page.body)
|
|
@@ -49,9 +63,13 @@ export function index_wiki(root = '.') {
|
|
|
49
63
|
const row = page_id_query.get(page.path);
|
|
50
64
|
delete_links.run(row.id);
|
|
51
65
|
for (const link of page.links) {
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
66
|
+
const direct_path = wikilink_target_path(link.target);
|
|
67
|
+
const target_name = link.target.split('#')[0]?.trim().toLowerCase() ?? '';
|
|
68
|
+
const resolved_path = known_paths.has(direct_path)
|
|
69
|
+
? direct_path
|
|
70
|
+
: name_paths.get(target_name);
|
|
71
|
+
const is_resolved = Boolean(resolved_path);
|
|
72
|
+
insert_link.run(row.id, resolved_path ?? null, link.raw, link.target, link.alias ?? null, link.embed ? 1 : 0, is_resolved ? 'resolved' : 'unresolved');
|
|
55
73
|
link_count += 1;
|
|
56
74
|
}
|
|
57
75
|
insert_fts.run(page.path, page.title, page.content);
|
package/dist/indexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACN,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,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,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;EAS9B,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAC/B,qCAAqC,CACrC,CAAC;IACF,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC9B,+CAA+C,CAC/C,CAAC;IACF,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;;;EAG9B,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC5B,4DAA4D,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../src/indexer.ts"],"names":[],"mappings":"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"}
|
package/dist/lint.d.ts
ADDED
package/dist/lint.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { list_markdown_page_paths, read_page_by_path, } from './pages.js';
|
|
2
|
+
import { resolve_wiki_root, wikilink_target_path } from './paths.js';
|
|
3
|
+
export function lint_wiki(root = '.') {
|
|
4
|
+
const wiki_root = resolve_wiki_root(root);
|
|
5
|
+
const page_paths = list_markdown_page_paths(wiki_root);
|
|
6
|
+
const known_paths = new Set(page_paths);
|
|
7
|
+
const issues = [];
|
|
8
|
+
const names = new Map();
|
|
9
|
+
const pages = page_paths.map((page_path) => read_page_by_path(page_path, wiki_root));
|
|
10
|
+
for (const page of pages) {
|
|
11
|
+
const aliases = page.frontmatter.aliases;
|
|
12
|
+
const alias_list = Array.isArray(aliases)
|
|
13
|
+
? aliases
|
|
14
|
+
: typeof aliases === 'string'
|
|
15
|
+
? [aliases]
|
|
16
|
+
: [];
|
|
17
|
+
for (const name of [page.title, ...alias_list]) {
|
|
18
|
+
const normalized_name = name.trim().toLowerCase();
|
|
19
|
+
if (!normalized_name)
|
|
20
|
+
continue;
|
|
21
|
+
const existing_path = names.get(normalized_name);
|
|
22
|
+
if (existing_path && existing_path !== page.path) {
|
|
23
|
+
issues.push({
|
|
24
|
+
code: 'duplicate-name',
|
|
25
|
+
severity: 'warning',
|
|
26
|
+
path: page.path,
|
|
27
|
+
target: name,
|
|
28
|
+
message: `Duplicate title or alias "${name}" also used by wiki/${existing_path}`,
|
|
29
|
+
});
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
names.set(normalized_name, page.path);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const page of pages) {
|
|
36
|
+
for (const link of page.links) {
|
|
37
|
+
const target_path = wikilink_target_path(link.target);
|
|
38
|
+
const target_name = link.target.split('#')[0]?.trim().toLowerCase() ?? '';
|
|
39
|
+
if (known_paths.has(target_path) || names.has(target_name)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
issues.push({
|
|
43
|
+
code: 'unresolved-wikilink',
|
|
44
|
+
severity: 'error',
|
|
45
|
+
path: page.path,
|
|
46
|
+
target: link.target,
|
|
47
|
+
message: `Unresolved wikilink ${link.raw}`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
root: wiki_root,
|
|
53
|
+
ok: issues.every((issue) => issue.severity !== 'error'),
|
|
54
|
+
issueCount: issues.length,
|
|
55
|
+
issues: issues.sort((left, right) => `${left.path}:${left.code}:${left.target ?? ''}`.localeCompare(`${right.path}:${right.code}:${right.target ?? ''}`)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=lint.js.map
|
package/dist/lint.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGrE,MAAM,UAAU,SAAS,CAAC,IAAI,GAAG,GAAG;IACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC1C,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CACvC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ;gBAC5B,CAAC,CAAC,CAAC,OAAO,CAAC;gBACX,CAAC,CAAC,EAAE,CAAC;QAEP,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC;YAChD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,eAAe;gBAAE,SAAS;YAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACjD,IAAI,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,6BAA6B,IAAI,uBAAuB,aAAa,EAAE;iBAChF,CAAC,CAAC;gBACH,SAAS;YACV,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,WAAW,GAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;YACvD,IAAI,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5D,SAAS;YACV,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,uBAAuB,IAAI,CAAC,GAAG,EAAE;aAC1C,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,OAAO;QACN,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;QACvD,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,aAAa,CAC7D,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CACnD,CACD;KACD,CAAC;AACH,CAAC"}
|
package/dist/pages.d.ts
CHANGED
|
@@ -4,5 +4,6 @@ export declare function create_page(title: string, body: string, options?: PageW
|
|
|
4
4
|
export declare function read_page(title: string, root?: string): WikiPage;
|
|
5
5
|
export declare function set_page_frontmatter(title: string, frontmatter: Parameters<typeof serialize_frontmatter>[0], options?: PageFrontmatterOptions): WikiPage;
|
|
6
6
|
export declare function append_page(title: string, body: string, root?: string): WikiPage;
|
|
7
|
+
export declare function resolve_page_path(title: string, root?: string): string;
|
|
7
8
|
export declare function list_markdown_page_paths(root?: string): string[];
|
|
8
9
|
export declare function read_page_by_path(page_path: string, root?: string): WikiPage;
|
package/dist/pages.js
CHANGED
|
@@ -14,20 +14,12 @@ export function create_page(title, body, options = {}) {
|
|
|
14
14
|
return read_page(title, options.root);
|
|
15
15
|
}
|
|
16
16
|
export function read_page(title, root = '.') {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
const parsed_markdown = parse_markdown(body);
|
|
20
|
-
return {
|
|
21
|
-
path: page_relative_path(title),
|
|
22
|
-
title: page_title_from_markdown(body, display_page_title(title)),
|
|
23
|
-
body,
|
|
24
|
-
content: parsed_markdown.content,
|
|
25
|
-
frontmatter: parsed_markdown.frontmatter,
|
|
26
|
-
links: parse_wikilinks(body),
|
|
27
|
-
};
|
|
17
|
+
const page_path = resolve_page_path(title, root);
|
|
18
|
+
return read_page_by_path(page_path, root);
|
|
28
19
|
}
|
|
29
20
|
export function set_page_frontmatter(title, frontmatter, options = {}) {
|
|
30
|
-
const
|
|
21
|
+
const page_path = resolve_page_path(title, options.root);
|
|
22
|
+
const file_path = join(resolve_wiki_root(options.root), 'wiki', page_path);
|
|
31
23
|
const body = readFileSync(file_path, 'utf-8');
|
|
32
24
|
const parsed_markdown = parse_markdown(body);
|
|
33
25
|
const next_frontmatter = options.merge
|
|
@@ -35,15 +27,37 @@ export function set_page_frontmatter(title, frontmatter, options = {}) {
|
|
|
35
27
|
: frontmatter;
|
|
36
28
|
const next_body = `${serialize_frontmatter(next_frontmatter)}${parsed_markdown.content}`;
|
|
37
29
|
writeFileSync(file_path, next_body.endsWith('\n') ? next_body : `${next_body}\n`);
|
|
38
|
-
return
|
|
30
|
+
return read_page_by_path(page_path, options.root);
|
|
39
31
|
}
|
|
40
32
|
export function append_page(title, body, root = '.') {
|
|
41
|
-
const
|
|
33
|
+
const page_path = resolve_page_path(title, root);
|
|
34
|
+
const file_path = join(resolve_wiki_root(root), 'wiki', page_path);
|
|
42
35
|
const append_body = body.startsWith('\n') ? body : `\n${body}`;
|
|
43
36
|
writeFileSync(file_path, append_body.endsWith('\n') ? append_body : `${append_body}\n`, {
|
|
44
37
|
flag: 'a',
|
|
45
38
|
});
|
|
46
|
-
return
|
|
39
|
+
return read_page_by_path(page_path, root);
|
|
40
|
+
}
|
|
41
|
+
export function resolve_page_path(title, root = '.') {
|
|
42
|
+
const wiki_root = resolve_wiki_root(root);
|
|
43
|
+
const direct_path = page_relative_path(title);
|
|
44
|
+
if (existsSync(join(wiki_root, 'wiki', direct_path))) {
|
|
45
|
+
return direct_path;
|
|
46
|
+
}
|
|
47
|
+
const normalized_title = title.trim().toLowerCase();
|
|
48
|
+
for (const page_path of list_markdown_page_paths(wiki_root)) {
|
|
49
|
+
const page = read_page_by_path(page_path, wiki_root);
|
|
50
|
+
const aliases = page.frontmatter.aliases;
|
|
51
|
+
const alias_list = Array.isArray(aliases)
|
|
52
|
+
? aliases
|
|
53
|
+
: typeof aliases === 'string'
|
|
54
|
+
? [aliases]
|
|
55
|
+
: [];
|
|
56
|
+
const candidates = [page.title, ...alias_list].map((candidate) => candidate.toLowerCase());
|
|
57
|
+
if (candidates.includes(normalized_title))
|
|
58
|
+
return page_path;
|
|
59
|
+
}
|
|
60
|
+
return direct_path;
|
|
47
61
|
}
|
|
48
62
|
export function list_markdown_page_paths(root = '.') {
|
|
49
63
|
const wiki_root = resolve_wiki_root(root);
|
package/dist/pages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,qBAAqB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AAOpB,MAAM,UAAU,WAAW,CAC1B,KAAa,EACb,IAAY,EACZ,UAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACtC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,KAAK,kBAAkB,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAE/C,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CACZ,SAAS,EACT,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,EACvD;QACC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;KACpC,CACD,CAAC;IAEF,OAAO,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAAI,GAAG,GAAG;IAClD,MAAM,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../src/pages.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { BacklinkResult, ContextResult, SearchResult } from './types.js';
|
|
2
2
|
export declare function search_wiki(query: string, root?: string, limit?: number): SearchResult[];
|
|
3
|
+
export declare function plain_text_fts_query(query: string): string;
|
|
3
4
|
export declare function get_wiki_context(query: string, root?: string, limit?: number): ContextResult;
|
|
4
5
|
export declare function format_context_markdown(query: string, results: SearchResult[]): string;
|
|
5
6
|
export declare function backlinks_for_page(title: string, root?: string): BacklinkResult[];
|
package/dist/search.js
CHANGED
|
@@ -1,18 +1,38 @@
|
|
|
1
1
|
import { open_wiki_database } from './database.js';
|
|
2
|
-
import {
|
|
2
|
+
import { resolve_page_path } from './pages.js';
|
|
3
3
|
export function search_wiki(query, root = '.', limit = 10) {
|
|
4
4
|
const db = open_wiki_database(root);
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
const statement = db.prepare(`SELECT path, title,
|
|
6
|
+
snippet(fts_pages, 2, '[', ']', '…', 12) AS snippet,
|
|
7
|
+
bm25(fts_pages) AS rank
|
|
8
|
+
FROM fts_pages
|
|
9
|
+
WHERE fts_pages MATCH ?
|
|
10
|
+
ORDER BY rank
|
|
11
|
+
LIMIT ?`);
|
|
12
|
+
const fts_query = plain_text_fts_query(query);
|
|
13
|
+
if (!fts_query) {
|
|
14
|
+
db.close();
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const rows = statement.all(fts_query, limit);
|
|
19
|
+
db.close();
|
|
20
|
+
return rows;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
db.close();
|
|
24
|
+
throw new Error(`Invalid wiki search query: ${query}`, {
|
|
25
|
+
cause: error,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function plain_text_fts_query(query) {
|
|
30
|
+
return query
|
|
31
|
+
.split(/\s+/u)
|
|
32
|
+
.map((term) => term.replace(/^\W+|\W+$/gu, ''))
|
|
33
|
+
.filter((term) => term.length > 0)
|
|
34
|
+
.map((term) => `"${term.replace(/"/gu, '""')}"`)
|
|
35
|
+
.join(' ');
|
|
16
36
|
}
|
|
17
37
|
export function get_wiki_context(query, root = '.', limit = 5) {
|
|
18
38
|
const results = search_wiki(query, root, limit);
|
|
@@ -35,7 +55,7 @@ export function format_context_markdown(query, results) {
|
|
|
35
55
|
}
|
|
36
56
|
export function backlinks_for_page(title, root = '.') {
|
|
37
57
|
const db = open_wiki_database(root);
|
|
38
|
-
const page_path =
|
|
58
|
+
const page_path = resolve_page_path(title, root);
|
|
39
59
|
const rows = db
|
|
40
60
|
.prepare(`SELECT pages.path, pages.title, page_links.raw_text AS rawText,
|
|
41
61
|
page_links.alias, page_links.embed
|
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,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -55,6 +55,42 @@ export type BacklinkResult = {
|
|
|
55
55
|
alias: string | null;
|
|
56
56
|
embed: boolean;
|
|
57
57
|
};
|
|
58
|
+
export type GraphNode = {
|
|
59
|
+
path: string;
|
|
60
|
+
title: string;
|
|
61
|
+
};
|
|
62
|
+
export type GraphEdge = {
|
|
63
|
+
from: string;
|
|
64
|
+
to: string;
|
|
65
|
+
target: string;
|
|
66
|
+
rawText: string;
|
|
67
|
+
alias: string | null;
|
|
68
|
+
embed: boolean;
|
|
69
|
+
status: 'resolved' | 'unresolved';
|
|
70
|
+
};
|
|
71
|
+
export type GraphResult = {
|
|
72
|
+
root: string;
|
|
73
|
+
nodes: GraphNode[];
|
|
74
|
+
edges: GraphEdge[];
|
|
75
|
+
};
|
|
76
|
+
export type FactConfidence = 'unknown' | 'low' | 'medium' | 'high' | 'verified';
|
|
77
|
+
export type Fact = {
|
|
78
|
+
id: number;
|
|
79
|
+
pagePath: string | null;
|
|
80
|
+
category: string;
|
|
81
|
+
summary: string;
|
|
82
|
+
body: string | null;
|
|
83
|
+
confidence: FactConfidence;
|
|
84
|
+
createdAt: string;
|
|
85
|
+
};
|
|
86
|
+
export type FactWriteOptions = {
|
|
87
|
+
root?: string;
|
|
88
|
+
page?: string;
|
|
89
|
+
category: string;
|
|
90
|
+
summary: string;
|
|
91
|
+
body?: string;
|
|
92
|
+
confidence?: FactConfidence;
|
|
93
|
+
};
|
|
58
94
|
export type ReviewResult = {
|
|
59
95
|
path: string;
|
|
60
96
|
title: string;
|
|
@@ -62,3 +98,16 @@ export type ReviewResult = {
|
|
|
62
98
|
tags: string[];
|
|
63
99
|
reason: string;
|
|
64
100
|
};
|
|
101
|
+
export type LintIssue = {
|
|
102
|
+
code: string;
|
|
103
|
+
severity: 'error' | 'warning';
|
|
104
|
+
path: string;
|
|
105
|
+
message: string;
|
|
106
|
+
target?: string;
|
|
107
|
+
};
|
|
108
|
+
export type LintResult = {
|
|
109
|
+
root: string;
|
|
110
|
+
ok: boolean;
|
|
111
|
+
issueCount: number;
|
|
112
|
+
issues: LintIssue[];
|
|
113
|
+
};
|
package/package.json
CHANGED