@rubytech/create-maxy-code 0.1.138 → 0.1.140
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/package.json +1 -1
- package/payload/platform/config/brand.json +1 -1
- package/payload/platform/lib/obsidian-parser/dist/index.d.ts +98 -0
- package/payload/platform/lib/obsidian-parser/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/obsidian-parser/dist/index.js +480 -0
- package/payload/platform/lib/obsidian-parser/dist/index.js.map +1 -0
- package/payload/platform/lib/obsidian-parser/src/index.ts +572 -0
- package/payload/platform/lib/obsidian-parser/tsconfig.json +8 -0
- package/payload/platform/neo4j/schema.cypher +6 -0
- package/payload/platform/package.json +2 -2
- package/payload/platform/plugins/.claude-plugin/marketplace.json +10 -0
- package/payload/platform/plugins/docs/references/plugins-guide.md +2 -0
- package/payload/platform/plugins/memory/PLUGIN.md +3 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js +89 -2
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts +64 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js +258 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/memory-archive-write.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/obsidian-vault-import.d.ts +127 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/obsidian-vault-import.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/obsidian-vault-import.js +477 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/obsidian-vault-import.js.map +1 -0
- package/payload/platform/plugins/notion-import/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/notion-import/PLUGIN.md +27 -0
- package/payload/platform/plugins/notion-import/skills/notion-import/SKILL.md +110 -0
- package/payload/platform/plugins/notion-import/skills/notion-import/references/attachments.md +55 -0
- package/payload/platform/plugins/notion-import/skills/notion-import/references/databases.md +81 -0
- package/payload/platform/plugins/notion-import/skills/notion-import/references/page-tree.md +61 -0
- package/payload/platform/plugins/notion-import/skills/notion-import/references/workspace-export.md +41 -0
- package/payload/platform/plugins/obsidian-import/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/obsidian-import/PLUGIN.md +39 -0
- package/payload/platform/plugins/obsidian-import/skills/obsidian-import/SKILL.md +92 -0
- package/payload/platform/plugins/obsidian-import/skills/obsidian-import/references/attachments.md +80 -0
- package/payload/platform/plugins/obsidian-import/skills/obsidian-import/references/daily-notes.md +31 -0
- package/payload/platform/plugins/obsidian-import/skills/obsidian-import/references/vault-structure.md +46 -0
- package/payload/platform/plugins/obsidian-import/skills/obsidian-import/references/wikilinks.md +70 -0
- package/payload/platform/templates/specialists/agents/database-operator.md +13 -1
package/package.json
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"plugins": {
|
|
51
51
|
"core": ["admin", "memory", "docs", "cloudflare", "anthropic", "workflows", "work", "scheduling", "email", "contacts", "projects"],
|
|
52
52
|
"defaultEnabled": ["business-assistant", "sales"],
|
|
53
|
-
"available": ["telegram", "deep-research", "whatsapp", "replicate", "linkedin-import"],
|
|
53
|
+
"available": ["telegram", "deep-research", "whatsapp", "replicate", "linkedin-import", "notion-import", "obsidian-import"],
|
|
54
54
|
"excluded": []
|
|
55
55
|
},
|
|
56
56
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* obsidian-parser — pure functions for parsing an Obsidian vault on disk.
|
|
3
|
+
*
|
|
4
|
+
* No DB access, no MCP, no I/O side effects other than fs reads. Composed by
|
|
5
|
+
* the `obsidian-vault-import` MCP tool in the memory plugin.
|
|
6
|
+
*
|
|
7
|
+
* Doctrine: every regex is linear-time (no catastrophic backtracking), every
|
|
8
|
+
* function is deterministic. The agent never calls this code; the server does.
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedPage {
|
|
11
|
+
/** Path relative to the vault root, with forward slashes. The MERGE natural key. */
|
|
12
|
+
obsidianPath: string;
|
|
13
|
+
/** Filename without `.md` — the default wikilink target form. */
|
|
14
|
+
title: string;
|
|
15
|
+
/** Aliases declared in frontmatter (`aliases:` array). */
|
|
16
|
+
aliases: string[];
|
|
17
|
+
/** Tag tokens (without `#`), unioned from frontmatter `tags:` and inline `#tag` body matches. */
|
|
18
|
+
tags: string[];
|
|
19
|
+
/** Body text (frontmatter stripped). Stored verbatim. */
|
|
20
|
+
body: string;
|
|
21
|
+
/** SHA-256 of the on-disk file bytes — idempotency key. */
|
|
22
|
+
contentHash: string;
|
|
23
|
+
/** Detected daily-note date (YYYY-MM-DD) or null. */
|
|
24
|
+
noteDate: string | null;
|
|
25
|
+
/** Wikilinks emitted by this page. */
|
|
26
|
+
wikilinks: WikilinkOccurrence[];
|
|
27
|
+
/** Embedded attachments declared via `![[file.png]]` or ``. */
|
|
28
|
+
attachments: AttachmentOccurrence[];
|
|
29
|
+
/** Last-modified timestamp from fs stat — used for modified-since filtering. */
|
|
30
|
+
mtimeMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface WikilinkOccurrence {
|
|
33
|
+
/** The exact text inside `[[…]]` before any alias `|`. May contain `#anchor`. */
|
|
34
|
+
rawTarget: string;
|
|
35
|
+
/** Target after stripping `#anchor`. */
|
|
36
|
+
target: string;
|
|
37
|
+
/** Anchor portion (after `#`) or null. */
|
|
38
|
+
anchor: string | null;
|
|
39
|
+
/** Alias text after `|`, or null when absent. The display text. */
|
|
40
|
+
alias: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface AttachmentOccurrence {
|
|
43
|
+
/** Path as written in the markdown. May be relative to the page or to the vault root. */
|
|
44
|
+
rawPath: string;
|
|
45
|
+
/** Resolved path relative to vault root, normalised. May not exist on disk yet. */
|
|
46
|
+
resolvedPath: string;
|
|
47
|
+
/** Display alt text (from `` form) or null for embed-syntax `![[file]]`. */
|
|
48
|
+
alt: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface VaultWalkOptions {
|
|
51
|
+
/** Filter: only pages whose path starts with one of these folder prefixes. */
|
|
52
|
+
folderPrefixes?: string[];
|
|
53
|
+
/** Filter: only pages whose tags intersect with this set. */
|
|
54
|
+
tagFilter?: string[];
|
|
55
|
+
/** Filter: only pages modified at or after this epoch-ms. */
|
|
56
|
+
modifiedSinceMs?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Walk the vault directory and return one ParsedPage per `.md` file that
|
|
60
|
+
* survives the optional filter set.
|
|
61
|
+
*
|
|
62
|
+
* Path-traversal defence: paths containing `..` segments are rejected at
|
|
63
|
+
* entry. The `vaultRoot` passed in is assumed to have already been verified
|
|
64
|
+
* by the caller as living under the account's archive directory.
|
|
65
|
+
*/
|
|
66
|
+
export declare function walkVault(vaultRoot: string, opts?: VaultWalkOptions): Promise<ParsedPage[]>;
|
|
67
|
+
export declare function parsePage(obsidianPath: string, bytes: Buffer, mtimeMs: number): ParsedPage;
|
|
68
|
+
interface ParsedFrontmatter {
|
|
69
|
+
raw: string;
|
|
70
|
+
/** Map of top-level key → raw value string. Arrays are returned as the
|
|
71
|
+
* block following the key (caller parses per-key). */
|
|
72
|
+
fields: Map<string, string>;
|
|
73
|
+
}
|
|
74
|
+
export declare function splitFrontmatter(text: string): {
|
|
75
|
+
frontmatter: ParsedFrontmatter;
|
|
76
|
+
body: string;
|
|
77
|
+
};
|
|
78
|
+
export declare function normalizeTag(tag: string): string;
|
|
79
|
+
export declare function detectDailyNote(obsidianPath: string, fm: ParsedFrontmatter): string | null;
|
|
80
|
+
export interface VaultIndex {
|
|
81
|
+
/** Lowercased title (without `.md`) → set of `obsidianPath` candidates. */
|
|
82
|
+
byTitle: Map<string, string[]>;
|
|
83
|
+
/** Lowercased alias → set of `obsidianPath` candidates. */
|
|
84
|
+
byAlias: Map<string, string[]>;
|
|
85
|
+
}
|
|
86
|
+
export declare function buildVaultIndex(pages: ParsedPage[]): VaultIndex;
|
|
87
|
+
/**
|
|
88
|
+
* Look up a wikilink target inside the vault, returning candidate page paths.
|
|
89
|
+
*
|
|
90
|
+
* The target is matched against (a) page titles and (b) declared aliases.
|
|
91
|
+
* Path-form targets (`Folder/Page`) match directly. Returns an empty array
|
|
92
|
+
* when no intra-vault candidate exists — the caller falls through to entity
|
|
93
|
+
* resolution.
|
|
94
|
+
*/
|
|
95
|
+
export declare function resolveWikilinkInVault(target: string, index: VaultIndex, knownPaths: Set<string>): string[];
|
|
96
|
+
export declare function makeImportId(): string;
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,UAAU;IACzB,oFAAoF;IACpF,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iGAAiG;IACjG,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sCAAsC;IACtC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,+EAA+E;IAC/E,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mEAAmE;IACnE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CA6EvB;AAoBD,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,UAAU,CA6BZ;AAMD,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ;2DACuD;IACvD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAID,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GACX;IAAE,WAAW,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoDlD;AAiKD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAmBD,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,iBAAiB,GACpB,MAAM,GAAG,IAAI,CAyBf;AAMD,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAU/D;AAWD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,EAAE,CAmBV;AAMD,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* obsidian-parser — pure functions for parsing an Obsidian vault on disk.
|
|
4
|
+
*
|
|
5
|
+
* No DB access, no MCP, no I/O side effects other than fs reads. Composed by
|
|
6
|
+
* the `obsidian-vault-import` MCP tool in the memory plugin.
|
|
7
|
+
*
|
|
8
|
+
* Doctrine: every regex is linear-time (no catastrophic backtracking), every
|
|
9
|
+
* function is deterministic. The agent never calls this code; the server does.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.walkVault = walkVault;
|
|
46
|
+
exports.parsePage = parsePage;
|
|
47
|
+
exports.splitFrontmatter = splitFrontmatter;
|
|
48
|
+
exports.normalizeTag = normalizeTag;
|
|
49
|
+
exports.detectDailyNote = detectDailyNote;
|
|
50
|
+
exports.buildVaultIndex = buildVaultIndex;
|
|
51
|
+
exports.resolveWikilinkInVault = resolveWikilinkInVault;
|
|
52
|
+
exports.makeImportId = makeImportId;
|
|
53
|
+
const node_crypto_1 = require("node:crypto");
|
|
54
|
+
const node_fs_1 = require("node:fs");
|
|
55
|
+
const path = __importStar(require("node:path"));
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Vault walk
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Walk the vault directory and return one ParsedPage per `.md` file that
|
|
61
|
+
* survives the optional filter set.
|
|
62
|
+
*
|
|
63
|
+
* Path-traversal defence: paths containing `..` segments are rejected at
|
|
64
|
+
* entry. The `vaultRoot` passed in is assumed to have already been verified
|
|
65
|
+
* by the caller as living under the account's archive directory.
|
|
66
|
+
*/
|
|
67
|
+
async function walkVault(vaultRoot, opts = {}) {
|
|
68
|
+
const pages = [];
|
|
69
|
+
const queue = [vaultRoot];
|
|
70
|
+
while (queue.length > 0) {
|
|
71
|
+
const dir = queue.shift();
|
|
72
|
+
let entries;
|
|
73
|
+
try {
|
|
74
|
+
entries = await node_fs_1.promises.readdir(dir, { withFileTypes: true });
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
throw new Error(`obsidian-parser: cannot read directory ${dir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
78
|
+
}
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
if (entry.name.startsWith("."))
|
|
81
|
+
continue;
|
|
82
|
+
const abs = path.join(dir, entry.name);
|
|
83
|
+
if (entry.isDirectory()) {
|
|
84
|
+
queue.push(abs);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (!entry.isFile())
|
|
88
|
+
continue;
|
|
89
|
+
if (!entry.name.toLowerCase().endsWith(".md"))
|
|
90
|
+
continue;
|
|
91
|
+
const rel = toPosixRelative(vaultRoot, abs);
|
|
92
|
+
if (rel.split("/").includes(".."))
|
|
93
|
+
continue;
|
|
94
|
+
if (opts.folderPrefixes && opts.folderPrefixes.length > 0) {
|
|
95
|
+
const matchesPrefix = opts.folderPrefixes.some((p) => rel === p || rel.startsWith(p.replace(/\/?$/, "/")));
|
|
96
|
+
if (!matchesPrefix)
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
let stat;
|
|
100
|
+
let bytes;
|
|
101
|
+
try {
|
|
102
|
+
stat = await node_fs_1.promises.stat(abs);
|
|
103
|
+
bytes = await node_fs_1.promises.readFile(abs);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
// Per-file isolation — log and skip, don't abort the walk.
|
|
107
|
+
process.stderr.write(`[obsidian-parser] event=read-failed file=${rel} reason=${err instanceof Error ? err.message : String(err)}\n`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (opts.modifiedSinceMs && stat.mtimeMs < opts.modifiedSinceMs)
|
|
111
|
+
continue;
|
|
112
|
+
let parsed;
|
|
113
|
+
try {
|
|
114
|
+
parsed = parsePage(rel, bytes, stat.mtimeMs);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
process.stderr.write(`[obsidian-parser] event=parse-failed file=${rel} reason=${err instanceof Error ? err.message : String(err)}\n`);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (opts.tagFilter && opts.tagFilter.length > 0) {
|
|
121
|
+
const wanted = new Set(opts.tagFilter.map(normalizeTag));
|
|
122
|
+
const hit = parsed.tags.some((t) => wanted.has(normalizeTag(t)));
|
|
123
|
+
if (!hit)
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
pages.push(parsed);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
pages.sort((a, b) => a.obsidianPath.localeCompare(b.obsidianPath));
|
|
130
|
+
return pages;
|
|
131
|
+
}
|
|
132
|
+
function toPosixRelative(root, abs) {
|
|
133
|
+
const rel = path.relative(root, abs);
|
|
134
|
+
return rel.split(path.sep).join("/");
|
|
135
|
+
}
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Page parser
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
const DAILY_NOTE_FILENAME_RE = /^(\d{4})-(\d{2})-(\d{2})(?:\.md)?$/;
|
|
140
|
+
const DAILY_NOTE_FOLDER_NAMES = new Set([
|
|
141
|
+
"daily",
|
|
142
|
+
"daily-notes",
|
|
143
|
+
"daily notes",
|
|
144
|
+
"journal",
|
|
145
|
+
"journals",
|
|
146
|
+
]);
|
|
147
|
+
function parsePage(obsidianPath, bytes, mtimeMs) {
|
|
148
|
+
const contentHash = (0, node_crypto_1.createHash)("sha256").update(bytes).digest("hex");
|
|
149
|
+
const text = bytes.toString("utf8");
|
|
150
|
+
const { frontmatter, body } = splitFrontmatter(text);
|
|
151
|
+
const title = path
|
|
152
|
+
.basename(obsidianPath)
|
|
153
|
+
.replace(/\.md$/i, "")
|
|
154
|
+
.normalize("NFC");
|
|
155
|
+
const aliases = extractAliases(frontmatter);
|
|
156
|
+
const frontmatterTags = extractFrontmatterTags(frontmatter);
|
|
157
|
+
const { bodyTags, wikilinks, attachments } = scanBody(body, obsidianPath);
|
|
158
|
+
const tags = dedupeNormalized([...frontmatterTags, ...bodyTags]);
|
|
159
|
+
const noteDate = detectDailyNote(obsidianPath, frontmatter);
|
|
160
|
+
return {
|
|
161
|
+
obsidianPath,
|
|
162
|
+
title,
|
|
163
|
+
aliases: aliases.map((a) => a.normalize("NFC")),
|
|
164
|
+
tags,
|
|
165
|
+
body,
|
|
166
|
+
contentHash,
|
|
167
|
+
noteDate,
|
|
168
|
+
wikilinks,
|
|
169
|
+
attachments,
|
|
170
|
+
mtimeMs,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
|
|
174
|
+
function splitFrontmatter(text) {
|
|
175
|
+
const match = text.match(FRONTMATTER_RE);
|
|
176
|
+
if (!match) {
|
|
177
|
+
return { frontmatter: { raw: "", fields: new Map() }, body: text };
|
|
178
|
+
}
|
|
179
|
+
const raw = match[1];
|
|
180
|
+
const body = text.slice(match[0].length);
|
|
181
|
+
// Minimal YAML-subset parser: top-level `key: value` and `key:` followed by
|
|
182
|
+
// ` - item` lines. Not a full YAML — we explicitly limit the surface so a
|
|
183
|
+
// malformed frontmatter degrades to "no fields found" rather than throwing.
|
|
184
|
+
const fields = new Map();
|
|
185
|
+
const lines = raw.split(/\r?\n/);
|
|
186
|
+
let currentKey = null;
|
|
187
|
+
let currentBlock = [];
|
|
188
|
+
for (const line of lines) {
|
|
189
|
+
if (/^[#]/.test(line.trim()))
|
|
190
|
+
continue; // comment
|
|
191
|
+
const flush = () => {
|
|
192
|
+
if (currentKey !== null) {
|
|
193
|
+
const existing = fields.get(currentKey);
|
|
194
|
+
const next = currentBlock.join("\n");
|
|
195
|
+
fields.set(currentKey, existing ? existing + "\n" + next : next);
|
|
196
|
+
}
|
|
197
|
+
currentKey = null;
|
|
198
|
+
currentBlock = [];
|
|
199
|
+
};
|
|
200
|
+
const topMatch = line.match(/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/);
|
|
201
|
+
if (topMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
|
|
202
|
+
flush();
|
|
203
|
+
currentKey = topMatch[1];
|
|
204
|
+
const value = topMatch[2];
|
|
205
|
+
if (value.trim() === "") {
|
|
206
|
+
currentBlock = [];
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
currentBlock = [value];
|
|
210
|
+
flush();
|
|
211
|
+
}
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (currentKey !== null) {
|
|
215
|
+
currentBlock.push(line);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (currentKey !== null) {
|
|
219
|
+
const existing = fields.get(currentKey);
|
|
220
|
+
const next = currentBlock.join("\n");
|
|
221
|
+
fields.set(currentKey, existing ? existing + "\n" + next : next);
|
|
222
|
+
}
|
|
223
|
+
return { frontmatter: { raw, fields }, body };
|
|
224
|
+
}
|
|
225
|
+
function extractAliases(fm) {
|
|
226
|
+
return parseYamlList(fm.fields.get("aliases"));
|
|
227
|
+
}
|
|
228
|
+
function extractFrontmatterTags(fm) {
|
|
229
|
+
return parseYamlList(fm.fields.get("tags")).map(normalizeTag);
|
|
230
|
+
}
|
|
231
|
+
function parseYamlList(value) {
|
|
232
|
+
if (!value)
|
|
233
|
+
return [];
|
|
234
|
+
const trimmed = value.trim();
|
|
235
|
+
if (!trimmed)
|
|
236
|
+
return [];
|
|
237
|
+
// Flow-style: [a, b, c]
|
|
238
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
239
|
+
return trimmed
|
|
240
|
+
.slice(1, -1)
|
|
241
|
+
.split(",")
|
|
242
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
243
|
+
.filter(Boolean);
|
|
244
|
+
}
|
|
245
|
+
// Block-style: - item per line, or single scalar
|
|
246
|
+
const lines = trimmed.split(/\r?\n/);
|
|
247
|
+
if (lines.length === 1 && !lines[0].startsWith("-")) {
|
|
248
|
+
return [lines[0].replace(/^["']|["']$/g, "").trim()].filter(Boolean);
|
|
249
|
+
}
|
|
250
|
+
const out = [];
|
|
251
|
+
for (const line of lines) {
|
|
252
|
+
const m = line.match(/^\s*-\s*(.*?)\s*$/);
|
|
253
|
+
if (m) {
|
|
254
|
+
const v = m[1].replace(/^["']|["']$/g, "").trim();
|
|
255
|
+
if (v)
|
|
256
|
+
out.push(v);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Body scan: wikilinks, tags, attachments — all code-fence-aware
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
const WIKILINK_RE = /\[\[([^\]\r\n]+)\]\]/g;
|
|
265
|
+
const EMBED_RE = /!\[\[([^\]\r\n]+)\]\]/g;
|
|
266
|
+
const IMAGE_RE = /!\[([^\]\r\n]*)\]\(([^)\r\n]+)\)/g;
|
|
267
|
+
const INLINE_TAG_RE = /(^|[\s(])#([A-Za-z][\w/-]*)/g;
|
|
268
|
+
const ATTACHMENT_EXT_RE = /\.(png|jpe?g|gif|webp|svg|pdf|mp3|mp4|mov|wav|m4a|webm)$/i;
|
|
269
|
+
function scanBody(body, obsidianPath) {
|
|
270
|
+
const bodyTags = [];
|
|
271
|
+
const wikilinks = [];
|
|
272
|
+
const attachments = [];
|
|
273
|
+
for (const segment of splitOnCodeFences(body)) {
|
|
274
|
+
if (segment.isCode)
|
|
275
|
+
continue;
|
|
276
|
+
const text = segment.text;
|
|
277
|
+
// Embeds first — they share `[[…]]` with wikilinks but the `!` prefix
|
|
278
|
+
// routes them to attachments.
|
|
279
|
+
const embedSpans = [];
|
|
280
|
+
for (const m of text.matchAll(EMBED_RE)) {
|
|
281
|
+
const inner = m[1].trim();
|
|
282
|
+
const resolved = resolveAttachmentPath(inner, obsidianPath);
|
|
283
|
+
if (resolved && ATTACHMENT_EXT_RE.test(resolved)) {
|
|
284
|
+
attachments.push({ rawPath: inner, resolvedPath: resolved, alt: null });
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
// Non-attachment embed (e.g. another note transclusion). Treat as a
|
|
288
|
+
// wikilink so the cross-reference is preserved.
|
|
289
|
+
wikilinks.push(parseWikilinkInner(inner));
|
|
290
|
+
}
|
|
291
|
+
embedSpans.push([m.index ?? 0, (m.index ?? 0) + m[0].length]);
|
|
292
|
+
}
|
|
293
|
+
for (const m of text.matchAll(WIKILINK_RE)) {
|
|
294
|
+
const start = m.index ?? 0;
|
|
295
|
+
if (embedSpans.some(([s, e]) => start >= s - 1 && start < e))
|
|
296
|
+
continue;
|
|
297
|
+
wikilinks.push(parseWikilinkInner(m[1]));
|
|
298
|
+
}
|
|
299
|
+
for (const m of text.matchAll(IMAGE_RE)) {
|
|
300
|
+
const rawPath = m[2].trim();
|
|
301
|
+
const alt = m[1].trim() || null;
|
|
302
|
+
if (/^https?:\/\//i.test(rawPath))
|
|
303
|
+
continue; // remote
|
|
304
|
+
const resolved = resolveAttachmentPath(rawPath, obsidianPath);
|
|
305
|
+
if (resolved && ATTACHMENT_EXT_RE.test(resolved)) {
|
|
306
|
+
attachments.push({ rawPath, resolvedPath: resolved, alt });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
for (const m of text.matchAll(INLINE_TAG_RE)) {
|
|
310
|
+
bodyTags.push(normalizeTag(m[2]));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
bodyTags: dedupeNormalized(bodyTags),
|
|
315
|
+
wikilinks,
|
|
316
|
+
attachments,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function parseWikilinkInner(inner) {
|
|
320
|
+
const trimmed = inner.trim();
|
|
321
|
+
const aliasIdx = trimmed.indexOf("|");
|
|
322
|
+
let raw = trimmed;
|
|
323
|
+
let alias = null;
|
|
324
|
+
if (aliasIdx >= 0) {
|
|
325
|
+
raw = trimmed.slice(0, aliasIdx).trim();
|
|
326
|
+
alias = trimmed.slice(aliasIdx + 1).trim() || null;
|
|
327
|
+
}
|
|
328
|
+
const anchorIdx = raw.indexOf("#");
|
|
329
|
+
let target = raw;
|
|
330
|
+
let anchor = null;
|
|
331
|
+
if (anchorIdx >= 0) {
|
|
332
|
+
target = raw.slice(0, anchorIdx).trim();
|
|
333
|
+
anchor = raw.slice(anchorIdx + 1).trim() || null;
|
|
334
|
+
}
|
|
335
|
+
return { rawTarget: raw, target: target.normalize("NFC"), anchor, alias };
|
|
336
|
+
}
|
|
337
|
+
function resolveAttachmentPath(rawPath, obsidianPath) {
|
|
338
|
+
if (!rawPath)
|
|
339
|
+
return null;
|
|
340
|
+
if (rawPath.startsWith("/") || /^[A-Za-z]:[\\/]/.test(rawPath))
|
|
341
|
+
return null;
|
|
342
|
+
if (rawPath.split("/").includes(".."))
|
|
343
|
+
return null;
|
|
344
|
+
// Obsidian's default: vault-root relative. We also accept page-relative.
|
|
345
|
+
// For the resolved form we prefer vault-root-relative (more deterministic
|
|
346
|
+
// for MERGE), normalising path separators.
|
|
347
|
+
const norm = rawPath.replace(/\\/g, "/");
|
|
348
|
+
if (norm.includes("/"))
|
|
349
|
+
return norm;
|
|
350
|
+
// Bare filename — could be in any attachments folder. Caller's index does
|
|
351
|
+
// the lookup; we record the bare form.
|
|
352
|
+
return norm;
|
|
353
|
+
}
|
|
354
|
+
function splitOnCodeFences(text) {
|
|
355
|
+
const out = [];
|
|
356
|
+
const fenceRe = /(^|\n)(```|~~~)[^\n]*\n([\s\S]*?)\n(```|~~~)/g;
|
|
357
|
+
let lastIdx = 0;
|
|
358
|
+
for (const m of text.matchAll(fenceRe)) {
|
|
359
|
+
const start = (m.index ?? 0) + (m[1] ? m[1].length : 0);
|
|
360
|
+
out.push({ text: text.slice(lastIdx, start), isCode: false });
|
|
361
|
+
out.push({ text: m[0], isCode: true });
|
|
362
|
+
lastIdx = start + m[0].length - (m[1] ? m[1].length : 0);
|
|
363
|
+
}
|
|
364
|
+
out.push({ text: text.slice(lastIdx), isCode: false });
|
|
365
|
+
return out;
|
|
366
|
+
}
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
// Tag normalization
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
function normalizeTag(tag) {
|
|
371
|
+
return tag
|
|
372
|
+
.replace(/^#/, "")
|
|
373
|
+
.normalize("NFC")
|
|
374
|
+
.trim()
|
|
375
|
+
.toLowerCase();
|
|
376
|
+
}
|
|
377
|
+
function dedupeNormalized(values) {
|
|
378
|
+
const seen = new Set();
|
|
379
|
+
const out = [];
|
|
380
|
+
for (const v of values) {
|
|
381
|
+
const k = v.normalize("NFC").trim().toLowerCase();
|
|
382
|
+
if (!k)
|
|
383
|
+
continue;
|
|
384
|
+
if (seen.has(k))
|
|
385
|
+
continue;
|
|
386
|
+
seen.add(k);
|
|
387
|
+
out.push(v);
|
|
388
|
+
}
|
|
389
|
+
return out;
|
|
390
|
+
}
|
|
391
|
+
// ---------------------------------------------------------------------------
|
|
392
|
+
// Daily-notes detection
|
|
393
|
+
// ---------------------------------------------------------------------------
|
|
394
|
+
function detectDailyNote(obsidianPath, fm) {
|
|
395
|
+
// 1. Frontmatter `date:` or `created:` wins if it's an ISO date.
|
|
396
|
+
for (const key of ["date", "created"]) {
|
|
397
|
+
const v = fm.fields.get(key);
|
|
398
|
+
if (v) {
|
|
399
|
+
const m = v.trim().match(/^(\d{4}-\d{2}-\d{2})/);
|
|
400
|
+
if (m)
|
|
401
|
+
return m[1];
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// 2. Filename matches YYYY-MM-DD.md.
|
|
405
|
+
const basename = path.basename(obsidianPath);
|
|
406
|
+
const fileMatch = basename.match(DAILY_NOTE_FILENAME_RE);
|
|
407
|
+
if (fileMatch)
|
|
408
|
+
return `${fileMatch[1]}-${fileMatch[2]}-${fileMatch[3]}`;
|
|
409
|
+
// 3. Filename is YYYY-MM-DD inside a known daily-notes folder.
|
|
410
|
+
const parts = obsidianPath.split("/");
|
|
411
|
+
const inDailyFolder = parts
|
|
412
|
+
.slice(0, -1)
|
|
413
|
+
.some((p) => DAILY_NOTE_FOLDER_NAMES.has(p.toLowerCase()));
|
|
414
|
+
if (inDailyFolder) {
|
|
415
|
+
const stem = basename.replace(/\.md$/i, "");
|
|
416
|
+
const m = stem.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
|
417
|
+
if (m)
|
|
418
|
+
return `${m[1]}-${m[2]}-${m[3]}`;
|
|
419
|
+
}
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
function buildVaultIndex(pages) {
|
|
423
|
+
const byTitle = new Map();
|
|
424
|
+
const byAlias = new Map();
|
|
425
|
+
for (const p of pages) {
|
|
426
|
+
pushKey(byTitle, p.title.toLowerCase(), p.obsidianPath);
|
|
427
|
+
for (const a of p.aliases) {
|
|
428
|
+
pushKey(byAlias, a.toLowerCase(), p.obsidianPath);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return { byTitle, byAlias };
|
|
432
|
+
}
|
|
433
|
+
function pushKey(m, k, v) {
|
|
434
|
+
const arr = m.get(k);
|
|
435
|
+
if (arr) {
|
|
436
|
+
if (!arr.includes(v))
|
|
437
|
+
arr.push(v);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
m.set(k, [v]);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Look up a wikilink target inside the vault, returning candidate page paths.
|
|
445
|
+
*
|
|
446
|
+
* The target is matched against (a) page titles and (b) declared aliases.
|
|
447
|
+
* Path-form targets (`Folder/Page`) match directly. Returns an empty array
|
|
448
|
+
* when no intra-vault candidate exists — the caller falls through to entity
|
|
449
|
+
* resolution.
|
|
450
|
+
*/
|
|
451
|
+
function resolveWikilinkInVault(target, index, knownPaths) {
|
|
452
|
+
const t = target.normalize("NFC").trim();
|
|
453
|
+
if (!t)
|
|
454
|
+
return [];
|
|
455
|
+
// Path-form: contains a slash or ends with `.md`.
|
|
456
|
+
if (t.includes("/") || t.toLowerCase().endsWith(".md")) {
|
|
457
|
+
const norm = t.replace(/\\/g, "/").replace(/\.md$/i, "") + ".md";
|
|
458
|
+
if (knownPaths.has(norm))
|
|
459
|
+
return [norm];
|
|
460
|
+
return [];
|
|
461
|
+
}
|
|
462
|
+
const titleHits = index.byTitle.get(t.toLowerCase()) ?? [];
|
|
463
|
+
const aliasHits = index.byAlias.get(t.toLowerCase()) ?? [];
|
|
464
|
+
const seen = new Set();
|
|
465
|
+
const out = [];
|
|
466
|
+
for (const p of [...titleHits, ...aliasHits]) {
|
|
467
|
+
if (seen.has(p))
|
|
468
|
+
continue;
|
|
469
|
+
seen.add(p);
|
|
470
|
+
out.push(p);
|
|
471
|
+
}
|
|
472
|
+
return out;
|
|
473
|
+
}
|
|
474
|
+
// ---------------------------------------------------------------------------
|
|
475
|
+
// Import-id helper
|
|
476
|
+
// ---------------------------------------------------------------------------
|
|
477
|
+
function makeImportId() {
|
|
478
|
+
return `obs-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|