@danielmarbach/mnemonic-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.
Files changed (64) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +201 -0
  3. package/README.md +395 -0
  4. package/build/config.d.ts +34 -0
  5. package/build/config.d.ts.map +1 -0
  6. package/build/config.js +141 -0
  7. package/build/config.js.map +1 -0
  8. package/build/consolidate.d.ts +7 -0
  9. package/build/consolidate.d.ts.map +1 -0
  10. package/build/consolidate.js +42 -0
  11. package/build/consolidate.js.map +1 -0
  12. package/build/embeddings.d.ts +4 -0
  13. package/build/embeddings.d.ts.map +1 -0
  14. package/build/embeddings.js +32 -0
  15. package/build/embeddings.js.map +1 -0
  16. package/build/git.d.ts +70 -0
  17. package/build/git.d.ts.map +1 -0
  18. package/build/git.js +196 -0
  19. package/build/git.js.map +1 -0
  20. package/build/import.d.ts +14 -0
  21. package/build/import.d.ts.map +1 -0
  22. package/build/import.js +41 -0
  23. package/build/import.js.map +1 -0
  24. package/build/index.d.ts +3 -0
  25. package/build/index.d.ts.map +1 -0
  26. package/build/index.js +2753 -0
  27. package/build/index.js.map +1 -0
  28. package/build/markdown.d.ts +6 -0
  29. package/build/markdown.d.ts.map +1 -0
  30. package/build/markdown.js +51 -0
  31. package/build/markdown.js.map +1 -0
  32. package/build/migration.d.ts +65 -0
  33. package/build/migration.d.ts.map +1 -0
  34. package/build/migration.js +372 -0
  35. package/build/migration.js.map +1 -0
  36. package/build/project-introspection.d.ts +5 -0
  37. package/build/project-introspection.d.ts.map +1 -0
  38. package/build/project-introspection.js +28 -0
  39. package/build/project-introspection.js.map +1 -0
  40. package/build/project-memory-policy.d.ts +17 -0
  41. package/build/project-memory-policy.d.ts.map +1 -0
  42. package/build/project-memory-policy.js +16 -0
  43. package/build/project-memory-policy.js.map +1 -0
  44. package/build/project.d.ts +32 -0
  45. package/build/project.d.ts.map +1 -0
  46. package/build/project.js +125 -0
  47. package/build/project.js.map +1 -0
  48. package/build/recall.d.ts +10 -0
  49. package/build/recall.d.ts.map +1 -0
  50. package/build/recall.js +18 -0
  51. package/build/recall.js.map +1 -0
  52. package/build/storage.d.ts +58 -0
  53. package/build/storage.d.ts.map +1 -0
  54. package/build/storage.js +269 -0
  55. package/build/storage.js.map +1 -0
  56. package/build/structured-content.d.ts +1818 -0
  57. package/build/structured-content.d.ts.map +1 -0
  58. package/build/structured-content.js +267 -0
  59. package/build/structured-content.js.map +1 -0
  60. package/build/vault.d.ts +54 -0
  61. package/build/vault.d.ts.map +1 -0
  62. package/build/vault.js +144 -0
  63. package/build/vault.js.map +1 -0
  64. package/package.json +46 -0
@@ -0,0 +1,141 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ const defaultConfig = {
4
+ // Keep this at the latest schema version. When adding a new latest-schema
5
+ // migration, bump this value in the same change so fresh installs start at
6
+ // the current schema instead of missing that migration.
7
+ schemaVersion: "1.1",
8
+ reindexEmbedConcurrency: 4,
9
+ mutationPushMode: "main-only",
10
+ projectMemoryPolicies: {},
11
+ projectIdentityOverrides: {},
12
+ };
13
+ function normalizeSchemaVersion(value) {
14
+ if (typeof value !== "string") {
15
+ return defaultConfig.schemaVersion;
16
+ }
17
+ const trimmed = value.trim();
18
+ return /^\d+(\.\d+)*$/.test(trimmed) ? trimmed : defaultConfig.schemaVersion;
19
+ }
20
+ function normalizeConcurrency(value) {
21
+ if (typeof value !== "number" || !Number.isFinite(value)) {
22
+ return defaultConfig.reindexEmbedConcurrency;
23
+ }
24
+ return Math.min(16, Math.max(1, Math.floor(value)));
25
+ }
26
+ function normalizeMutationPushMode(value) {
27
+ switch (value) {
28
+ case "all":
29
+ case "main-only":
30
+ case "none":
31
+ return value;
32
+ default:
33
+ return defaultConfig.mutationPushMode;
34
+ }
35
+ }
36
+ function normalizeProjectIdentityOverrides(value) {
37
+ if (!value || typeof value !== "object") {
38
+ return {};
39
+ }
40
+ const normalized = {};
41
+ for (const [projectId, override] of Object.entries(value)) {
42
+ if (!override || typeof override !== "object") {
43
+ continue;
44
+ }
45
+ const remoteName = override.remoteName;
46
+ if (typeof remoteName !== "string" || remoteName.trim().length === 0) {
47
+ continue;
48
+ }
49
+ const updatedAt = override.updatedAt;
50
+ normalized[projectId] = {
51
+ remoteName: remoteName.trim(),
52
+ updatedAt: typeof updatedAt === "string" ? updatedAt : "",
53
+ };
54
+ }
55
+ return normalized;
56
+ }
57
+ /**
58
+ * Read the schema version from a vault's config.json.
59
+ * Works for both main vault and project vaults.
60
+ * Returns the default schema version if no config exists.
61
+ */
62
+ export async function readVaultSchemaVersion(vaultPath) {
63
+ const filePath = path.join(path.resolve(vaultPath), "config.json");
64
+ try {
65
+ const raw = await fs.readFile(filePath, "utf-8");
66
+ const parsed = JSON.parse(raw);
67
+ return normalizeSchemaVersion(parsed.schemaVersion);
68
+ }
69
+ catch {
70
+ return defaultConfig.schemaVersion;
71
+ }
72
+ }
73
+ /**
74
+ * Write the schema version to a vault's config.json.
75
+ * Preserves any existing fields in the file.
76
+ */
77
+ export async function writeVaultSchemaVersion(vaultPath, schemaVersion) {
78
+ const filePath = path.join(path.resolve(vaultPath), "config.json");
79
+ let existing = {};
80
+ try {
81
+ const raw = await fs.readFile(filePath, "utf-8");
82
+ existing = JSON.parse(raw);
83
+ }
84
+ catch {
85
+ // No existing config — start fresh
86
+ }
87
+ existing.schemaVersion = normalizeSchemaVersion(schemaVersion);
88
+ await fs.writeFile(filePath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
89
+ }
90
+ export class MnemonicConfigStore {
91
+ filePath;
92
+ constructor(mainVaultPath) {
93
+ this.filePath = path.join(path.resolve(mainVaultPath), "config.json");
94
+ }
95
+ async load() {
96
+ return this.readAll();
97
+ }
98
+ async getProjectPolicy(projectId) {
99
+ const config = await this.readAll();
100
+ return config.projectMemoryPolicies[projectId];
101
+ }
102
+ async getProjectIdentityOverride(projectId) {
103
+ const config = await this.readAll();
104
+ return config.projectIdentityOverrides[projectId];
105
+ }
106
+ async setProjectPolicy(policy) {
107
+ const config = await this.readAll();
108
+ config.projectMemoryPolicies[policy.projectId] = policy;
109
+ await this.writeAll(config);
110
+ }
111
+ async setProjectIdentityOverride(projectId, override) {
112
+ const config = await this.readAll();
113
+ config.projectIdentityOverrides[projectId] = override;
114
+ await this.writeAll(config);
115
+ }
116
+ async setSchemaVersion(schemaVersion) {
117
+ const config = await this.readAll();
118
+ config.schemaVersion = normalizeSchemaVersion(schemaVersion);
119
+ await this.writeAll(config);
120
+ }
121
+ async readAll() {
122
+ try {
123
+ const raw = await fs.readFile(this.filePath, "utf-8");
124
+ const parsed = JSON.parse(raw);
125
+ return {
126
+ schemaVersion: normalizeSchemaVersion(parsed.schemaVersion),
127
+ reindexEmbedConcurrency: normalizeConcurrency(parsed.reindexEmbedConcurrency),
128
+ mutationPushMode: normalizeMutationPushMode(parsed.mutationPushMode),
129
+ projectMemoryPolicies: parsed.projectMemoryPolicies ?? {},
130
+ projectIdentityOverrides: normalizeProjectIdentityOverrides(parsed.projectIdentityOverrides),
131
+ };
132
+ }
133
+ catch {
134
+ return { ...defaultConfig };
135
+ }
136
+ }
137
+ async writeAll(config) {
138
+ await fs.writeFile(this.filePath, JSON.stringify(config, null, 2) + "\n", "utf-8");
139
+ }
140
+ }
141
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Note, Relationship } from "./storage.js";
2
+ import type { ConsolidationMode } from "./project-memory-policy.js";
3
+ export declare function normalizeMergePlanSourceIds(sourceIds: string[]): string[];
4
+ export declare function mergeRelationshipsFromNotes(notes: Array<Pick<Note, "relatedTo">>, sourceIds: Set<string>): Relationship[];
5
+ export declare function filterRelationships(relationships: Relationship[] | undefined, noteIds: Iterable<string>): Relationship[] | undefined;
6
+ export declare function resolveEffectiveConsolidationMode(sourceNotes: Array<Pick<Note, "lifecycle">>, fallbackMode: ConsolidationMode, explicitMode?: ConsolidationMode): ConsolidationMode;
7
+ //# sourceMappingURL=consolidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.d.ts","sourceRoot":"","sources":["../src/consolidate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EACrC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,YAAY,EAAE,CAqBhB;AAED,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,YAAY,EAAE,GAAG,SAAS,EACzC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,GACxB,YAAY,EAAE,GAAG,SAAS,CAY5B;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAC3C,YAAY,EAAE,iBAAiB,EAC/B,YAAY,CAAC,EAAE,iBAAiB,GAC/B,iBAAiB,CAUnB"}
@@ -0,0 +1,42 @@
1
+ export function normalizeMergePlanSourceIds(sourceIds) {
2
+ return Array.from(new Set(sourceIds));
3
+ }
4
+ export function mergeRelationshipsFromNotes(notes, sourceIds) {
5
+ const seen = new Set();
6
+ const merged = [];
7
+ for (const note of notes) {
8
+ for (const rel of note.relatedTo ?? []) {
9
+ if (sourceIds.has(rel.id)) {
10
+ continue;
11
+ }
12
+ const key = `${rel.id}:${rel.type}`;
13
+ if (seen.has(key)) {
14
+ continue;
15
+ }
16
+ seen.add(key);
17
+ merged.push(rel);
18
+ }
19
+ }
20
+ return merged;
21
+ }
22
+ export function filterRelationships(relationships, noteIds) {
23
+ if (!relationships || relationships.length === 0) {
24
+ return undefined;
25
+ }
26
+ const blocked = new Set(noteIds);
27
+ const filtered = relationships.filter((rel) => !blocked.has(rel.id));
28
+ if (filtered.length === relationships.length) {
29
+ return relationships;
30
+ }
31
+ return filtered.length > 0 ? filtered : undefined;
32
+ }
33
+ export function resolveEffectiveConsolidationMode(sourceNotes, fallbackMode, explicitMode) {
34
+ if (explicitMode) {
35
+ return explicitMode;
36
+ }
37
+ if (sourceNotes.length > 0 && sourceNotes.every((note) => note.lifecycle === "temporary")) {
38
+ return "delete";
39
+ }
40
+ return fallbackMode;
41
+ }
42
+ //# sourceMappingURL=consolidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../src/consolidate.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,2BAA2B,CAAC,SAAmB;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAqC,EACrC,SAAsB;IAEtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,aAAyC,EACzC,OAAyB;IAEzB,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,WAA2C,EAC3C,YAA+B,EAC/B,YAAgC;IAEhC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,EAAE,CAAC;QAC1F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function embed(text: string): Promise<number[]>;
2
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
3
+ export declare const embedModel: string;
4
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAGA,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB3D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASjE;AAED,eAAO,MAAM,UAAU,QAAc,CAAC"}
@@ -0,0 +1,32 @@
1
+ const OLLAMA_URL = process.env["OLLAMA_URL"] ?? "http://localhost:11434";
2
+ const EMBED_MODEL = process.env["EMBED_MODEL"] ?? "nomic-embed-text-v2-moe";
3
+ export async function embed(text) {
4
+ const res = await fetch(`${OLLAMA_URL}/api/embed`, {
5
+ method: "POST",
6
+ headers: { "Content-Type": "application/json" },
7
+ body: JSON.stringify({ model: EMBED_MODEL, input: text, truncate: true }),
8
+ });
9
+ if (!res.ok) {
10
+ throw new Error(`Ollama embedding failed: ${res.status} ${res.statusText}. ` +
11
+ `Is Ollama running at ${OLLAMA_URL} with model '${EMBED_MODEL}' pulled?`);
12
+ }
13
+ const data = (await res.json());
14
+ const embedding = data.embeddings?.[0];
15
+ if (!embedding) {
16
+ throw new Error(`Ollama embedding response did not include an embedding for model '${EMBED_MODEL}'`);
17
+ }
18
+ return embedding;
19
+ }
20
+ export function cosineSimilarity(a, b) {
21
+ let dot = 0, normA = 0, normB = 0;
22
+ for (let i = 0; i < a.length; i++) {
23
+ dot += a[i] * b[i];
24
+ normA += a[i] * a[i];
25
+ normB += b[i] * b[i];
26
+ }
27
+ if (normA === 0 || normB === 0)
28
+ return 0;
29
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
30
+ }
31
+ export const embedModel = EMBED_MODEL;
32
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,wBAAwB,CAAC;AACzE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,yBAAyB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,YAAY,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC1E,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI;YAC5D,wBAAwB,UAAU,gBAAgB,WAAW,WAAW,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qEAAqE,WAAW,GAAG,CAAC,CAAC;IACvG,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC"}
package/build/git.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ export declare class GitOperationError extends Error {
2
+ constructor(operation: "commit" | "push", cause: unknown);
3
+ }
4
+ export interface SyncResult {
5
+ hasRemote: boolean;
6
+ /** Note ids that arrived or changed during pull (need re-embedding) */
7
+ pulledNoteIds: string[];
8
+ /** Note ids that were deleted on remote */
9
+ deletedNoteIds: string[];
10
+ /** Number of local commits pushed to remote */
11
+ pushedCommits: number;
12
+ }
13
+ export interface CommitResult {
14
+ status: "committed" | "skipped";
15
+ reason?: "git-disabled" | "no-changes";
16
+ }
17
+ export interface PushResult {
18
+ status: "pushed" | "skipped";
19
+ reason?: "git-disabled" | "no-remote" | "auto-push-disabled";
20
+ }
21
+ export declare class GitOps {
22
+ private git;
23
+ private readonly gitRoot;
24
+ /**
25
+ * Notes directory path relative to gitRoot used by diffNotesSince.
26
+ * "notes" for main vault, ".mnemonic/notes" for project vaults.
27
+ */
28
+ private readonly notesRelDir;
29
+ private enabled;
30
+ constructor(gitRoot: string, notesRelDir?: string);
31
+ init(): Promise<void>;
32
+ /**
33
+ * Commit files to the git repo. Files should be paths relative to gitRoot.
34
+ * Callers are responsible for building the correct paths (including any
35
+ * .mnemonic/ prefix for project vaults).
36
+ *
37
+ * Message format protocol:
38
+ * - First line: tool(action): Brief description (50 chars max recommended)
39
+ * - Body (optional): Additional details with standardized fields
40
+ *
41
+ * Standard body fields:
42
+ * - Note: <id> (<title>)
43
+ * - Notes: <count> notes affected
44
+ * - Project: <project-name>
45
+ * - Scope: project|global
46
+ * - Tags: <tag1>, <tag2>
47
+ * - Relationship: <from-id> <type> <to-id>
48
+ * - Mode: <mode> (for consolidation)
49
+ * - Files: <file1>, <file2>
50
+ */
51
+ commit(message: string, files: string[], body?: string): Promise<boolean>;
52
+ commitWithStatus(message: string, files: string[], body?: string): Promise<CommitResult>;
53
+ /**
54
+ * Bidirectional sync: fetch → count unpushed local commits → pull (rebase)
55
+ * → push. Returns details about what changed so callers can trigger
56
+ * re-embedding for notes that arrived from the remote.
57
+ */
58
+ sync(): Promise<SyncResult>;
59
+ /** Push only — used after individual remember/update/forget commits */
60
+ push(): Promise<void>;
61
+ pushWithStatus(): Promise<PushResult>;
62
+ private currentHead;
63
+ private countUnpushedCommits;
64
+ /**
65
+ * Returns note ids added/modified/deleted between sinceHash and HEAD,
66
+ * scoped to this vault's notesRelDir.
67
+ */
68
+ private diffNotesSince;
69
+ }
70
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,SAAS,EAAE,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO;CAKzD;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,cAAc,GAAG,YAAY,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG,oBAAoB,CAAC;CAC9D;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAgB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB9F;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IA6BjC,uEAAuE;IACjE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC;YAgB7B,WAAW;YASX,oBAAoB;IASlC;;;OAGG;YACW,cAAc;CAuC7B"}
package/build/git.js ADDED
@@ -0,0 +1,196 @@
1
+ import { simpleGit } from "simple-git";
2
+ export class GitOperationError extends Error {
3
+ constructor(operation, cause) {
4
+ const detail = cause instanceof Error ? cause.message : String(cause);
5
+ super(`Git ${operation} failed: ${detail}`);
6
+ this.name = "GitOperationError";
7
+ }
8
+ }
9
+ export class GitOps {
10
+ git;
11
+ gitRoot;
12
+ /**
13
+ * Notes directory path relative to gitRoot used by diffNotesSince.
14
+ * "notes" for main vault, ".mnemonic/notes" for project vaults.
15
+ */
16
+ notesRelDir;
17
+ enabled;
18
+ constructor(gitRoot, notesRelDir = "notes") {
19
+ this.gitRoot = gitRoot;
20
+ this.notesRelDir = notesRelDir;
21
+ this.enabled = process.env["DISABLE_GIT"] !== "true";
22
+ }
23
+ async init() {
24
+ // Defer simpleGit construction until here — the vault directory is
25
+ // created by Storage.init() before GitOps.init() is called.
26
+ this.git = simpleGit(this.gitRoot);
27
+ if (!this.enabled)
28
+ return;
29
+ const isRepo = await this.git.checkIsRepo().catch(() => false);
30
+ if (!isRepo) {
31
+ await this.git.init();
32
+ console.error("[git] Initialized new repository");
33
+ }
34
+ }
35
+ /**
36
+ * Commit files to the git repo. Files should be paths relative to gitRoot.
37
+ * Callers are responsible for building the correct paths (including any
38
+ * .mnemonic/ prefix for project vaults).
39
+ *
40
+ * Message format protocol:
41
+ * - First line: tool(action): Brief description (50 chars max recommended)
42
+ * - Body (optional): Additional details with standardized fields
43
+ *
44
+ * Standard body fields:
45
+ * - Note: <id> (<title>)
46
+ * - Notes: <count> notes affected
47
+ * - Project: <project-name>
48
+ * - Scope: project|global
49
+ * - Tags: <tag1>, <tag2>
50
+ * - Relationship: <from-id> <type> <to-id>
51
+ * - Mode: <mode> (for consolidation)
52
+ * - Files: <file1>, <file2>
53
+ */
54
+ async commit(message, files, body) {
55
+ const result = await this.commitWithStatus(message, files, body);
56
+ return result.status === "committed";
57
+ }
58
+ async commitWithStatus(message, files, body) {
59
+ if (!this.enabled)
60
+ return { status: "skipped", reason: "git-disabled" };
61
+ try {
62
+ if (files.length > 0) {
63
+ await this.git.add(files);
64
+ }
65
+ else {
66
+ await this.git.add(`${this.notesRelDir}/`);
67
+ }
68
+ const status = await this.git.status();
69
+ if (status.staged.length === 0)
70
+ return { status: "skipped", reason: "no-changes" };
71
+ // Build commit message with optional body
72
+ const fullMessage = body ? `${message}\n\n${body}` : message;
73
+ await this.git.commit(fullMessage);
74
+ const displayMessage = body ? `${message} [...]` : message;
75
+ console.error(`[git] Committed: ${displayMessage}`);
76
+ return { status: "committed" };
77
+ }
78
+ catch (err) {
79
+ console.error(`[git] Commit failed: ${err}`);
80
+ throw new GitOperationError("commit", err);
81
+ }
82
+ }
83
+ /**
84
+ * Bidirectional sync: fetch → count unpushed local commits → pull (rebase)
85
+ * → push. Returns details about what changed so callers can trigger
86
+ * re-embedding for notes that arrived from the remote.
87
+ */
88
+ async sync() {
89
+ const empty = {
90
+ hasRemote: false,
91
+ pulledNoteIds: [],
92
+ deletedNoteIds: [],
93
+ pushedCommits: 0,
94
+ };
95
+ if (!this.enabled)
96
+ return empty;
97
+ const remotes = await this.git.getRemotes();
98
+ if (remotes.length === 0)
99
+ return empty;
100
+ try {
101
+ await this.git.fetch();
102
+ const unpushed = await this.countUnpushedCommits();
103
+ const localHead = await this.currentHead();
104
+ await this.git.pull(["--rebase"]);
105
+ console.error("[git] Pulled (rebase)");
106
+ const { pulledNoteIds, deletedNoteIds } = await this.diffNotesSince(localHead);
107
+ await this.git.push();
108
+ console.error(`[git] Pushed ${unpushed} local commit(s)`);
109
+ return { hasRemote: true, pulledNoteIds, deletedNoteIds, pushedCommits: unpushed };
110
+ }
111
+ catch (err) {
112
+ console.error(`[git] Sync failed: ${err}`);
113
+ return { hasRemote: true, pulledNoteIds: [], deletedNoteIds: [], pushedCommits: 0 };
114
+ }
115
+ }
116
+ /** Push only — used after individual remember/update/forget commits */
117
+ async push() {
118
+ await this.pushWithStatus();
119
+ }
120
+ async pushWithStatus() {
121
+ if (!this.enabled)
122
+ return { status: "skipped", reason: "git-disabled" };
123
+ try {
124
+ const remotes = await this.git.getRemotes();
125
+ if (remotes.length === 0)
126
+ return { status: "skipped", reason: "no-remote" };
127
+ await this.git.push();
128
+ console.error("[git] Pushed");
129
+ return { status: "pushed" };
130
+ }
131
+ catch (err) {
132
+ console.error(`[git] Push failed: ${err}`);
133
+ throw new GitOperationError("push", err);
134
+ }
135
+ }
136
+ // ── Private helpers ──────────────────────────────────────────────────────────
137
+ async currentHead() {
138
+ try {
139
+ const log = await this.git.log({ maxCount: 1 });
140
+ return log.latest?.hash ?? "";
141
+ }
142
+ catch {
143
+ return "";
144
+ }
145
+ }
146
+ async countUnpushedCommits() {
147
+ try {
148
+ const result = await this.git.raw(["rev-list", "--count", "@{u}..HEAD"]);
149
+ return parseInt(result.trim(), 10) || 0;
150
+ }
151
+ catch {
152
+ return 0;
153
+ }
154
+ }
155
+ /**
156
+ * Returns note ids added/modified/deleted between sinceHash and HEAD,
157
+ * scoped to this vault's notesRelDir.
158
+ */
159
+ async diffNotesSince(sinceHash) {
160
+ if (!sinceHash)
161
+ return { pulledNoteIds: [], deletedNoteIds: [] };
162
+ try {
163
+ const diff = await this.git.raw([
164
+ "diff",
165
+ "--name-status",
166
+ sinceHash,
167
+ "HEAD",
168
+ "--",
169
+ `${this.notesRelDir}/`,
170
+ ]);
171
+ const pulledNoteIds = [];
172
+ const deletedNoteIds = [];
173
+ const prefix = `${this.notesRelDir}/`;
174
+ for (const line of diff.split("\n")) {
175
+ const parts = line.trim().split(/\s+/);
176
+ if (parts.length < 2)
177
+ continue;
178
+ const [status, filePath] = parts;
179
+ if (!filePath?.endsWith(".md"))
180
+ continue;
181
+ const id = filePath.replace(prefix, "").replace(/\.md$/, "");
182
+ if (status === "D") {
183
+ deletedNoteIds.push(id);
184
+ }
185
+ else if (status === "A" || status === "M" || status.startsWith("R")) {
186
+ pulledNoteIds.push(id);
187
+ }
188
+ }
189
+ return { pulledNoteIds, deletedNoteIds };
190
+ }
191
+ catch {
192
+ return { pulledNoteIds: [], deletedNoteIds: [] };
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Parses a Claude Code auto-memory file into importable sections.
3
+ *
4
+ * Claude Code MEMORY.md files may contain multiple `# Project` blocks,
5
+ * each with `##` subsections. Each subsection becomes one mnemonic note.
6
+ * The H1 project heading is prepended to the section title so notes are
7
+ * self-identifying: "DocsEngine: Key Architecture" rather than just
8
+ * "Key Architecture".
9
+ */
10
+ export declare function parseMemorySections(content: string): Array<{
11
+ title: string;
12
+ content: string;
13
+ }>;
14
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC9F"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Parses a Claude Code auto-memory file into importable sections.
3
+ *
4
+ * Claude Code MEMORY.md files may contain multiple `# Project` blocks,
5
+ * each with `##` subsections. Each subsection becomes one mnemonic note.
6
+ * The H1 project heading is prepended to the section title so notes are
7
+ * self-identifying: "DocsEngine: Key Architecture" rather than just
8
+ * "Key Architecture".
9
+ */
10
+ export function parseMemorySections(content) {
11
+ const lines = content.split("\n");
12
+ const sections = [];
13
+ let currentH1 = "";
14
+ let currentTitle = "";
15
+ let currentLines = [];
16
+ const flush = () => {
17
+ if (currentTitle) {
18
+ const title = currentH1 ? `${currentH1}: ${currentTitle}` : currentTitle;
19
+ sections.push({ title, content: currentLines.join("\n").trim() });
20
+ }
21
+ };
22
+ for (const line of lines) {
23
+ if (line.startsWith("# ") && !line.startsWith("## ")) {
24
+ flush();
25
+ currentH1 = line.slice(2).trim();
26
+ currentTitle = "";
27
+ currentLines = [];
28
+ }
29
+ else if (line.startsWith("## ")) {
30
+ flush();
31
+ currentTitle = line.slice(3).trim();
32
+ currentLines = [];
33
+ }
34
+ else if (currentTitle) {
35
+ currentLines.push(line);
36
+ }
37
+ }
38
+ flush();
39
+ return sections.filter(s => s.content.length > 0);
40
+ }
41
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAA8C,EAAE,CAAC;IAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;YACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,EAAE,CAAC;YACR,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,YAAY,GAAG,EAAE,CAAC;YAClB,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,EAAE,CAAC;IAER,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}