gnosys-mcp 0.1.0
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/LICENSE +21 -0
- package/README.md +297 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +927 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1092 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +86 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/ingest.d.ts +47 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +134 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/resolver.d.ts +84 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +269 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/search.d.ts +50 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +166 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/store.d.ts +67 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +168 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/test/bootstrap.test.d.ts +2 -0
- package/dist/test/bootstrap.test.d.ts.map +1 -0
- package/dist/test/bootstrap.test.js +208 -0
- package/dist/test/bootstrap.test.js.map +1 -0
- package/dist/test/history.test.d.ts +2 -0
- package/dist/test/history.test.d.ts.map +1 -0
- package/dist/test/history.test.js +141 -0
- package/dist/test/history.test.js.map +1 -0
- package/dist/test/ingest.test.d.ts +2 -0
- package/dist/test/ingest.test.d.ts.map +1 -0
- package/dist/test/ingest.test.js +132 -0
- package/dist/test/ingest.test.js.map +1 -0
- package/dist/test/lensing.test.d.ts +2 -0
- package/dist/test/lensing.test.d.ts.map +1 -0
- package/dist/test/lensing.test.js +154 -0
- package/dist/test/lensing.test.js.map +1 -0
- package/dist/test/search.test.d.ts +2 -0
- package/dist/test/search.test.d.ts.map +1 -0
- package/dist/test/search.test.js +129 -0
- package/dist/test/search.test.js.map +1 -0
- package/dist/test/store.test.d.ts +2 -0
- package/dist/test/store.test.d.ts.map +1 -0
- package/dist/test/store.test.js +152 -0
- package/dist/test/store.test.js.map +1 -0
- package/dist/test/tags.test.d.ts +2 -0
- package/dist/test/tags.test.d.ts.map +1 -0
- package/dist/test/tags.test.js +81 -0
- package/dist/test/tags.test.js.map +1 -0
- package/dist/test/timeline.test.d.ts +2 -0
- package/dist/test/timeline.test.d.ts.map +1 -0
- package/dist/test/timeline.test.js +127 -0
- package/dist/test/timeline.test.js.map +1 -0
- package/dist/test/wikilinks.test.d.ts +2 -0
- package/dist/test/wikilinks.test.d.ts.map +1 -0
- package/dist/test/wikilinks.test.js +178 -0
- package/dist/test/wikilinks.test.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Timeline — Temporal views and statistics for memory stores.
|
|
3
|
+
*
|
|
4
|
+
* Group memories by time period to see knowledge evolution.
|
|
5
|
+
* Compute summary statistics across the store.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Group memories by time period based on their created/modified dates.
|
|
9
|
+
*/
|
|
10
|
+
export function groupByPeriod(memories, period) {
|
|
11
|
+
const createdMap = new Map();
|
|
12
|
+
const modifiedMap = new Map();
|
|
13
|
+
for (const m of memories) {
|
|
14
|
+
const createdKey = toPeriodKey(m.frontmatter.created, period);
|
|
15
|
+
if (createdKey) {
|
|
16
|
+
const entry = createdMap.get(createdKey) || { count: 0, titles: [] };
|
|
17
|
+
entry.count++;
|
|
18
|
+
entry.titles.push(m.frontmatter.title);
|
|
19
|
+
createdMap.set(createdKey, entry);
|
|
20
|
+
}
|
|
21
|
+
const modifiedKey = toPeriodKey(m.frontmatter.modified, period);
|
|
22
|
+
if (modifiedKey && modifiedKey !== createdKey) {
|
|
23
|
+
modifiedMap.set(modifiedKey, (modifiedMap.get(modifiedKey) || 0) + 1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Merge all period keys
|
|
27
|
+
const allKeys = new Set([...createdMap.keys(), ...modifiedMap.keys()]);
|
|
28
|
+
const entries = [];
|
|
29
|
+
for (const key of allKeys) {
|
|
30
|
+
const created = createdMap.get(key);
|
|
31
|
+
entries.push({
|
|
32
|
+
period: key,
|
|
33
|
+
created: created?.count || 0,
|
|
34
|
+
modified: modifiedMap.get(key) || 0,
|
|
35
|
+
titles: created?.titles || [],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return entries.sort((a, b) => a.period.localeCompare(b.period));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Compute summary statistics across all memories.
|
|
42
|
+
*/
|
|
43
|
+
export function computeStats(memories) {
|
|
44
|
+
const byCategory = {};
|
|
45
|
+
const byStatus = {};
|
|
46
|
+
const byAuthor = {};
|
|
47
|
+
const byAuthority = {};
|
|
48
|
+
let totalConfidence = 0;
|
|
49
|
+
let oldest = null;
|
|
50
|
+
let newest = null;
|
|
51
|
+
let lastMod = null;
|
|
52
|
+
for (const m of memories) {
|
|
53
|
+
const fm = m.frontmatter;
|
|
54
|
+
byCategory[fm.category] = (byCategory[fm.category] || 0) + 1;
|
|
55
|
+
byStatus[fm.status] = (byStatus[fm.status] || 0) + 1;
|
|
56
|
+
byAuthor[fm.author] = (byAuthor[fm.author] || 0) + 1;
|
|
57
|
+
byAuthority[fm.authority] = (byAuthority[fm.authority] || 0) + 1;
|
|
58
|
+
totalConfidence += fm.confidence;
|
|
59
|
+
if (!oldest || fm.created < oldest)
|
|
60
|
+
oldest = fm.created;
|
|
61
|
+
if (!newest || fm.created > newest)
|
|
62
|
+
newest = fm.created;
|
|
63
|
+
if (!lastMod || fm.modified > lastMod)
|
|
64
|
+
lastMod = fm.modified;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
totalCount: memories.length,
|
|
68
|
+
byCategory,
|
|
69
|
+
byStatus,
|
|
70
|
+
byAuthor,
|
|
71
|
+
byAuthority,
|
|
72
|
+
averageConfidence: memories.length > 0 ? Math.round((totalConfidence / memories.length) * 100) / 100 : 0,
|
|
73
|
+
oldestCreated: oldest,
|
|
74
|
+
newestCreated: newest,
|
|
75
|
+
lastModified: lastMod,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Convert an ISO date string to a period key.
|
|
80
|
+
*/
|
|
81
|
+
function toPeriodKey(dateStr, period) {
|
|
82
|
+
if (!dateStr)
|
|
83
|
+
return null;
|
|
84
|
+
// Parse the date string (YYYY-MM-DD format)
|
|
85
|
+
const parts = dateStr.split("-");
|
|
86
|
+
if (parts.length < 3)
|
|
87
|
+
return null;
|
|
88
|
+
const year = parseInt(parts[0]);
|
|
89
|
+
const month = parseInt(parts[1]);
|
|
90
|
+
const day = parseInt(parts[2]);
|
|
91
|
+
switch (period) {
|
|
92
|
+
case "day":
|
|
93
|
+
return dateStr; // Already YYYY-MM-DD
|
|
94
|
+
case "week": {
|
|
95
|
+
const d = new Date(year, month - 1, day);
|
|
96
|
+
const weekNum = getISOWeek(d);
|
|
97
|
+
return `${year}-W${String(weekNum).padStart(2, "0")}`;
|
|
98
|
+
}
|
|
99
|
+
case "month":
|
|
100
|
+
return `${year}-${String(month).padStart(2, "0")}`;
|
|
101
|
+
case "year":
|
|
102
|
+
return `${year}`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get ISO week number for a date.
|
|
107
|
+
*/
|
|
108
|
+
function getISOWeek(d) {
|
|
109
|
+
const date = new Date(d.getTime());
|
|
110
|
+
date.setHours(0, 0, 0, 0);
|
|
111
|
+
date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));
|
|
112
|
+
const week1 = new Date(date.getFullYear(), 0, 4);
|
|
113
|
+
return (1 +
|
|
114
|
+
Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + ((week1.getDay() + 6) % 7)) / 7));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/lib/timeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Wikilinks — Obsidian-compatible cross-references between memories.
|
|
3
|
+
*
|
|
4
|
+
* Scans memory content for [[wikilinks]] and builds a link graph.
|
|
5
|
+
* Supports both [[title]] and [[path|display text]] formats.
|
|
6
|
+
*/
|
|
7
|
+
import { Memory } from "./store.js";
|
|
8
|
+
/** A single link found in a memory. */
|
|
9
|
+
export interface WikiLink {
|
|
10
|
+
/** The raw target inside [[ ]] — could be a title or relative path */
|
|
11
|
+
target: string;
|
|
12
|
+
/** Optional display text (from [[target|display]]) */
|
|
13
|
+
displayText: string | null;
|
|
14
|
+
/** The source memory's relative path */
|
|
15
|
+
sourcePath: string;
|
|
16
|
+
/** The source memory's title */
|
|
17
|
+
sourceTitle: string;
|
|
18
|
+
}
|
|
19
|
+
/** A node in the link graph with both outgoing and incoming links. */
|
|
20
|
+
export interface LinkNode {
|
|
21
|
+
/** This memory's relative path */
|
|
22
|
+
path: string;
|
|
23
|
+
/** This memory's title */
|
|
24
|
+
title: string;
|
|
25
|
+
/** Links going OUT from this memory */
|
|
26
|
+
outgoing: WikiLink[];
|
|
27
|
+
/** Backlinks coming IN to this memory */
|
|
28
|
+
incoming: WikiLink[];
|
|
29
|
+
}
|
|
30
|
+
/** Full link graph across all memories. */
|
|
31
|
+
export interface LinkGraph {
|
|
32
|
+
nodes: Map<string, LinkNode>;
|
|
33
|
+
/** Total number of wikilinks found */
|
|
34
|
+
totalLinks: number;
|
|
35
|
+
/** Targets that don't resolve to any known memory */
|
|
36
|
+
orphanedLinks: WikiLink[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract all wikilinks from a memory's content.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractLinks(memory: Memory): WikiLink[];
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a wikilink target to a memory.
|
|
44
|
+
* Tries matching by: exact relative path, title (case-insensitive), id.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveLink(target: string, memories: Memory[]): Memory | null;
|
|
47
|
+
/**
|
|
48
|
+
* Build a full link graph from all memories.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildLinkGraph(memories: Memory[]): LinkGraph;
|
|
51
|
+
/**
|
|
52
|
+
* Get backlinks for a specific memory.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getBacklinks(memories: Memory[], targetPath: string): WikiLink[];
|
|
55
|
+
/**
|
|
56
|
+
* Get outgoing links for a specific memory.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getOutgoingLinks(memories: Memory[], sourcePath: string): WikiLink[];
|
|
59
|
+
/**
|
|
60
|
+
* Format the link graph as a simple text summary.
|
|
61
|
+
*/
|
|
62
|
+
export declare function formatGraphSummary(graph: LinkGraph): string;
|
|
63
|
+
//# sourceMappingURL=wikilinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikilinks.d.ts","sourceRoot":"","sources":["../../src/lib/wikilinks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,uCAAuC;AACvC,MAAM,WAAW,QAAQ;IACvB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,sEAAsE;AACtE,MAAM,WAAW,QAAQ;IACvB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AAED,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,aAAa,EAAE,QAAQ,EAAE,CAAC;CAC3B;AAKD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiBvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,GAAG,IAAI,CA4Bf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,CAsC5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,GACjB,QAAQ,EAAE,CAIZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,GACjB,QAAQ,EAAE,CAIZ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAsC3D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Wikilinks — Obsidian-compatible cross-references between memories.
|
|
3
|
+
*
|
|
4
|
+
* Scans memory content for [[wikilinks]] and builds a link graph.
|
|
5
|
+
* Supports both [[title]] and [[path|display text]] formats.
|
|
6
|
+
*/
|
|
7
|
+
// Regex to match [[target]] or [[target|display text]]
|
|
8
|
+
const WIKILINK_RE = /\[\[([^\]|]+?)(?:\|([^\]]+?))?\]\]/g;
|
|
9
|
+
/**
|
|
10
|
+
* Extract all wikilinks from a memory's content.
|
|
11
|
+
*/
|
|
12
|
+
export function extractLinks(memory) {
|
|
13
|
+
const links = [];
|
|
14
|
+
let match;
|
|
15
|
+
// Reset regex state
|
|
16
|
+
WIKILINK_RE.lastIndex = 0;
|
|
17
|
+
while ((match = WIKILINK_RE.exec(memory.content)) !== null) {
|
|
18
|
+
links.push({
|
|
19
|
+
target: match[1].trim(),
|
|
20
|
+
displayText: match[2]?.trim() || null,
|
|
21
|
+
sourcePath: memory.relativePath,
|
|
22
|
+
sourceTitle: memory.frontmatter.title,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return links;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a wikilink target to a memory.
|
|
29
|
+
* Tries matching by: exact relative path, title (case-insensitive), id.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveLink(target, memories) {
|
|
32
|
+
// 1. Exact relative path match
|
|
33
|
+
const byPath = memories.find((m) => m.relativePath === target);
|
|
34
|
+
if (byPath)
|
|
35
|
+
return byPath;
|
|
36
|
+
// 2. Path with .md extension
|
|
37
|
+
const withMd = memories.find((m) => m.relativePath === target + ".md");
|
|
38
|
+
if (withMd)
|
|
39
|
+
return withMd;
|
|
40
|
+
// 3. Filename match (target might be just the filename without category dir)
|
|
41
|
+
const byFilename = memories.find((m) => {
|
|
42
|
+
const filename = m.relativePath.split("/").pop()?.replace(/\.md$/, "");
|
|
43
|
+
return filename === target;
|
|
44
|
+
});
|
|
45
|
+
if (byFilename)
|
|
46
|
+
return byFilename;
|
|
47
|
+
// 4. Title match (case-insensitive)
|
|
48
|
+
const lowerTarget = target.toLowerCase();
|
|
49
|
+
const byTitle = memories.find((m) => m.frontmatter.title.toLowerCase() === lowerTarget);
|
|
50
|
+
if (byTitle)
|
|
51
|
+
return byTitle;
|
|
52
|
+
// 5. ID match
|
|
53
|
+
const byId = memories.find((m) => m.frontmatter.id === target);
|
|
54
|
+
if (byId)
|
|
55
|
+
return byId;
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a full link graph from all memories.
|
|
60
|
+
*/
|
|
61
|
+
export function buildLinkGraph(memories) {
|
|
62
|
+
const nodes = new Map();
|
|
63
|
+
const orphanedLinks = [];
|
|
64
|
+
let totalLinks = 0;
|
|
65
|
+
// Initialize nodes for all memories
|
|
66
|
+
for (const m of memories) {
|
|
67
|
+
nodes.set(m.relativePath, {
|
|
68
|
+
path: m.relativePath,
|
|
69
|
+
title: m.frontmatter.title,
|
|
70
|
+
outgoing: [],
|
|
71
|
+
incoming: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Extract links and resolve them
|
|
75
|
+
for (const m of memories) {
|
|
76
|
+
const links = extractLinks(m);
|
|
77
|
+
totalLinks += links.length;
|
|
78
|
+
for (const link of links) {
|
|
79
|
+
const resolved = resolveLink(link.target, memories);
|
|
80
|
+
if (resolved) {
|
|
81
|
+
// Add outgoing link to source
|
|
82
|
+
const sourceNode = nodes.get(m.relativePath);
|
|
83
|
+
sourceNode.outgoing.push(link);
|
|
84
|
+
// Add backlink to target
|
|
85
|
+
const targetNode = nodes.get(resolved.relativePath);
|
|
86
|
+
targetNode.incoming.push(link);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
orphanedLinks.push(link);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { nodes, totalLinks, orphanedLinks };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get backlinks for a specific memory.
|
|
97
|
+
*/
|
|
98
|
+
export function getBacklinks(memories, targetPath) {
|
|
99
|
+
const graph = buildLinkGraph(memories);
|
|
100
|
+
const node = graph.nodes.get(targetPath);
|
|
101
|
+
return node?.incoming || [];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get outgoing links for a specific memory.
|
|
105
|
+
*/
|
|
106
|
+
export function getOutgoingLinks(memories, sourcePath) {
|
|
107
|
+
const graph = buildLinkGraph(memories);
|
|
108
|
+
const node = graph.nodes.get(sourcePath);
|
|
109
|
+
return node?.outgoing || [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format the link graph as a simple text summary.
|
|
113
|
+
*/
|
|
114
|
+
export function formatGraphSummary(graph) {
|
|
115
|
+
const lines = [];
|
|
116
|
+
lines.push(`Link Graph: ${graph.totalLinks} total links, ${graph.orphanedLinks.length} orphaned\n`);
|
|
117
|
+
// Find most-connected nodes
|
|
118
|
+
const connected = Array.from(graph.nodes.values())
|
|
119
|
+
.filter((n) => n.outgoing.length > 0 || n.incoming.length > 0)
|
|
120
|
+
.sort((a, b) => (b.incoming.length + b.outgoing.length) - (a.incoming.length + a.outgoing.length));
|
|
121
|
+
if (connected.length === 0) {
|
|
122
|
+
lines.push("No cross-references found. Use [[Title]] in memory content to create links.");
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
for (const node of connected) {
|
|
126
|
+
lines.push(`**${node.title}** (${node.path})`);
|
|
127
|
+
lines.push(` → ${node.outgoing.length} outgoing, ← ${node.incoming.length} backlinks`);
|
|
128
|
+
if (node.outgoing.length > 0) {
|
|
129
|
+
const targets = node.outgoing.map((l) => l.displayText || l.target).join(", ");
|
|
130
|
+
lines.push(` Links to: ${targets}`);
|
|
131
|
+
}
|
|
132
|
+
if (node.incoming.length > 0) {
|
|
133
|
+
const sources = node.incoming.map((l) => l.sourceTitle).join(", ");
|
|
134
|
+
lines.push(` Referenced by: ${sources}`);
|
|
135
|
+
}
|
|
136
|
+
lines.push("");
|
|
137
|
+
}
|
|
138
|
+
if (graph.orphanedLinks.length > 0) {
|
|
139
|
+
lines.push("Orphaned links (targets not found):");
|
|
140
|
+
for (const link of graph.orphanedLinks) {
|
|
141
|
+
lines.push(` [[${link.target}]] in ${link.sourceTitle}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return lines.join("\n");
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=wikilinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikilinks.js","sourceRoot":"","sources":["../../src/lib/wikilinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.test.d.ts","sourceRoot":"","sources":["../../src/test/bootstrap.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import os from "os";
|
|
5
|
+
import { discoverFiles, parseFileForImport, bootstrap } from "../lib/bootstrap.js";
|
|
6
|
+
import { GnosysStore } from "../lib/store.js";
|
|
7
|
+
let tempDir;
|
|
8
|
+
let sourceDir;
|
|
9
|
+
let storeDir;
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "gnosys-bootstrap-test-"));
|
|
12
|
+
sourceDir = path.join(tempDir, "source");
|
|
13
|
+
storeDir = path.join(tempDir, "store");
|
|
14
|
+
await fs.mkdir(sourceDir, { recursive: true });
|
|
15
|
+
await fs.mkdir(storeDir, { recursive: true });
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
describe("discoverFiles", () => {
|
|
21
|
+
it("finds markdown files", async () => {
|
|
22
|
+
await fs.writeFile(path.join(sourceDir, "doc1.md"), "# Doc 1");
|
|
23
|
+
await fs.writeFile(path.join(sourceDir, "doc2.md"), "# Doc 2");
|
|
24
|
+
await fs.writeFile(path.join(sourceDir, "readme.txt"), "Not markdown");
|
|
25
|
+
const files = await discoverFiles(sourceDir);
|
|
26
|
+
expect(files).toHaveLength(2);
|
|
27
|
+
expect(files).toContain("doc1.md");
|
|
28
|
+
expect(files).toContain("doc2.md");
|
|
29
|
+
});
|
|
30
|
+
it("finds files in subdirectories", async () => {
|
|
31
|
+
await fs.mkdir(path.join(sourceDir, "decisions"), { recursive: true });
|
|
32
|
+
await fs.writeFile(path.join(sourceDir, "decisions", "auth.md"), "# Auth");
|
|
33
|
+
const files = await discoverFiles(sourceDir);
|
|
34
|
+
expect(files).toHaveLength(1);
|
|
35
|
+
expect(files[0]).toBe("decisions/auth.md");
|
|
36
|
+
});
|
|
37
|
+
it("supports custom patterns", async () => {
|
|
38
|
+
await fs.writeFile(path.join(sourceDir, "doc.md"), "# Doc");
|
|
39
|
+
await fs.writeFile(path.join(sourceDir, "notes.txt"), "Notes");
|
|
40
|
+
const files = await discoverFiles(sourceDir, ["**/*.md", "**/*.txt"]);
|
|
41
|
+
expect(files).toHaveLength(2);
|
|
42
|
+
});
|
|
43
|
+
it("returns empty for empty directory", async () => {
|
|
44
|
+
const files = await discoverFiles(sourceDir);
|
|
45
|
+
expect(files).toHaveLength(0);
|
|
46
|
+
});
|
|
47
|
+
it("deduplicates files across patterns", async () => {
|
|
48
|
+
await fs.writeFile(path.join(sourceDir, "doc.md"), "# Doc");
|
|
49
|
+
const files = await discoverFiles(sourceDir, ["**/*.md", "*.md"]);
|
|
50
|
+
expect(files).toHaveLength(1);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe("parseFileForImport", () => {
|
|
54
|
+
const defaultOpts = {
|
|
55
|
+
sourceDir: "/tmp",
|
|
56
|
+
defaultCategory: "imported",
|
|
57
|
+
preserveFrontmatter: false,
|
|
58
|
+
};
|
|
59
|
+
it("extracts title from H1 heading", () => {
|
|
60
|
+
const { frontmatter } = parseFileForImport("# My Decision\n\nContent here.", "doc.md", defaultOpts);
|
|
61
|
+
expect(frontmatter.title).toBe("My Decision");
|
|
62
|
+
});
|
|
63
|
+
it("falls back to filename for title", () => {
|
|
64
|
+
const { frontmatter } = parseFileForImport("No heading here.", "my-cool-doc.md", defaultOpts);
|
|
65
|
+
expect(frontmatter.title).toBe("My Cool Doc");
|
|
66
|
+
});
|
|
67
|
+
it("infers category from directory structure", () => {
|
|
68
|
+
const { frontmatter } = parseFileForImport("# Test", "decisions/auth.md", defaultOpts);
|
|
69
|
+
expect(frontmatter.category).toBe("decisions");
|
|
70
|
+
});
|
|
71
|
+
it("uses default category for root files", () => {
|
|
72
|
+
const { frontmatter } = parseFileForImport("# Test", "doc.md", defaultOpts);
|
|
73
|
+
expect(frontmatter.category).toBe("imported");
|
|
74
|
+
});
|
|
75
|
+
it("preserves existing frontmatter when option is set", () => {
|
|
76
|
+
const content = `---
|
|
77
|
+
title: Custom Title
|
|
78
|
+
category: architecture
|
|
79
|
+
confidence: 0.95
|
|
80
|
+
author: human
|
|
81
|
+
---
|
|
82
|
+
# Custom Title
|
|
83
|
+
|
|
84
|
+
Content here.`;
|
|
85
|
+
const { frontmatter } = parseFileForImport(content, "doc.md", {
|
|
86
|
+
...defaultOpts,
|
|
87
|
+
preserveFrontmatter: true,
|
|
88
|
+
});
|
|
89
|
+
expect(frontmatter.title).toBe("Custom Title");
|
|
90
|
+
expect(frontmatter.category).toBe("architecture");
|
|
91
|
+
expect(frontmatter.confidence).toBe(0.95);
|
|
92
|
+
expect(frontmatter.author).toBe("human");
|
|
93
|
+
});
|
|
94
|
+
it("uses defaults when not preserving frontmatter", () => {
|
|
95
|
+
const content = `---
|
|
96
|
+
title: Custom Title
|
|
97
|
+
category: architecture
|
|
98
|
+
---
|
|
99
|
+
# Custom Title`;
|
|
100
|
+
const { frontmatter } = parseFileForImport(content, "doc.md", defaultOpts);
|
|
101
|
+
// Should NOT preserve even though frontmatter exists
|
|
102
|
+
expect(frontmatter.category).toBe("imported");
|
|
103
|
+
expect(frontmatter.authority).toBe("imported");
|
|
104
|
+
});
|
|
105
|
+
it("strips frontmatter from body", () => {
|
|
106
|
+
const content = `---
|
|
107
|
+
title: Test
|
|
108
|
+
---
|
|
109
|
+
# Test
|
|
110
|
+
|
|
111
|
+
Body content.`;
|
|
112
|
+
const { body } = parseFileForImport(content, "doc.md", defaultOpts);
|
|
113
|
+
expect(body).toBe("# Test\n\nBody content.");
|
|
114
|
+
expect(body).not.toContain("---");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe("bootstrap", () => {
|
|
118
|
+
it("imports files into the store", async () => {
|
|
119
|
+
await fs.writeFile(path.join(sourceDir, "doc1.md"), "# First Doc\n\nContent one.");
|
|
120
|
+
await fs.writeFile(path.join(sourceDir, "doc2.md"), "# Second Doc\n\nContent two.");
|
|
121
|
+
const store = new GnosysStore(storeDir);
|
|
122
|
+
await store.init();
|
|
123
|
+
const result = await bootstrap(store, {
|
|
124
|
+
sourceDir,
|
|
125
|
+
defaultCategory: "imported",
|
|
126
|
+
});
|
|
127
|
+
expect(result.totalScanned).toBe(2);
|
|
128
|
+
expect(result.imported).toHaveLength(2);
|
|
129
|
+
expect(result.skipped).toHaveLength(0);
|
|
130
|
+
expect(result.failed).toHaveLength(0);
|
|
131
|
+
// Verify files were written
|
|
132
|
+
const memories = await store.getAllMemories();
|
|
133
|
+
expect(memories).toHaveLength(2);
|
|
134
|
+
});
|
|
135
|
+
it("skips existing memories when skipExisting is true", async () => {
|
|
136
|
+
const store = new GnosysStore(storeDir);
|
|
137
|
+
await store.init();
|
|
138
|
+
// Write a memory first
|
|
139
|
+
await store.writeMemory("imported", "first-doc.md", {
|
|
140
|
+
id: "existing-1",
|
|
141
|
+
title: "First Doc",
|
|
142
|
+
category: "imported",
|
|
143
|
+
tags: { domain: [] },
|
|
144
|
+
relevance: "",
|
|
145
|
+
author: "human",
|
|
146
|
+
authority: "imported",
|
|
147
|
+
confidence: 0.7,
|
|
148
|
+
created: "2026-03-01",
|
|
149
|
+
modified: "2026-03-01",
|
|
150
|
+
status: "active",
|
|
151
|
+
supersedes: null,
|
|
152
|
+
}, "# First Doc\n\nExisting content.");
|
|
153
|
+
// Now try to bootstrap with the same title
|
|
154
|
+
await fs.writeFile(path.join(sourceDir, "doc1.md"), "# First Doc\n\nNew content.");
|
|
155
|
+
await fs.writeFile(path.join(sourceDir, "doc2.md"), "# Second Doc\n\nContent two.");
|
|
156
|
+
const result = await bootstrap(store, {
|
|
157
|
+
sourceDir,
|
|
158
|
+
skipExisting: true,
|
|
159
|
+
defaultCategory: "imported",
|
|
160
|
+
});
|
|
161
|
+
expect(result.imported).toHaveLength(1);
|
|
162
|
+
expect(result.skipped).toHaveLength(1);
|
|
163
|
+
expect(result.skipped[0]).toBe("doc1.md");
|
|
164
|
+
});
|
|
165
|
+
it("supports dry run mode", async () => {
|
|
166
|
+
await fs.writeFile(path.join(sourceDir, "doc1.md"), "# Test\n\nContent.");
|
|
167
|
+
const store = new GnosysStore(storeDir);
|
|
168
|
+
await store.init();
|
|
169
|
+
const result = await bootstrap(store, {
|
|
170
|
+
sourceDir,
|
|
171
|
+
dryRun: true,
|
|
172
|
+
});
|
|
173
|
+
expect(result.imported).toHaveLength(1);
|
|
174
|
+
// Verify nothing was actually written
|
|
175
|
+
const memories = await store.getAllMemories();
|
|
176
|
+
expect(memories).toHaveLength(0);
|
|
177
|
+
});
|
|
178
|
+
it("handles empty source directory", async () => {
|
|
179
|
+
const store = new GnosysStore(storeDir);
|
|
180
|
+
await store.init();
|
|
181
|
+
const result = await bootstrap(store, { sourceDir });
|
|
182
|
+
expect(result.totalScanned).toBe(0);
|
|
183
|
+
expect(result.imported).toHaveLength(0);
|
|
184
|
+
});
|
|
185
|
+
it("respects custom patterns", async () => {
|
|
186
|
+
await fs.writeFile(path.join(sourceDir, "doc.md"), "# MD");
|
|
187
|
+
await fs.writeFile(path.join(sourceDir, "notes.txt"), "TXT content");
|
|
188
|
+
const store = new GnosysStore(storeDir);
|
|
189
|
+
await store.init();
|
|
190
|
+
const result = await bootstrap(store, {
|
|
191
|
+
sourceDir,
|
|
192
|
+
patterns: ["**/*.txt"],
|
|
193
|
+
});
|
|
194
|
+
expect(result.totalScanned).toBe(1);
|
|
195
|
+
expect(result.imported).toHaveLength(1);
|
|
196
|
+
});
|
|
197
|
+
it("preserves category from subdirectory structure", async () => {
|
|
198
|
+
await fs.mkdir(path.join(sourceDir, "architecture"), { recursive: true });
|
|
199
|
+
await fs.writeFile(path.join(sourceDir, "architecture", "layers.md"), "# Three Layers\n\nContent.");
|
|
200
|
+
const store = new GnosysStore(storeDir);
|
|
201
|
+
await store.init();
|
|
202
|
+
await bootstrap(store, { sourceDir });
|
|
203
|
+
const memories = await store.getAllMemories();
|
|
204
|
+
expect(memories).toHaveLength(1);
|
|
205
|
+
expect(memories[0].frontmatter.category).toBe("architecture");
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
//# sourceMappingURL=bootstrap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.test.js","sourceRoot":"","sources":["../../src/test/bootstrap.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.test.d.ts","sourceRoot":"","sources":["../../src/test/history.test.ts"],"names":[],"mappings":""}
|