@danielmarbach/mnemonic-mcp 0.27.2 → 0.29.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 (250) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +7 -0
  3. package/build/auto-relate.d.ts.map +1 -1
  4. package/build/auto-relate.js +11 -5
  5. package/build/auto-relate.js.map +1 -1
  6. package/build/brands.d.ts +38 -0
  7. package/build/brands.d.ts.map +1 -0
  8. package/build/brands.js +51 -0
  9. package/build/brands.js.map +1 -0
  10. package/build/cache.d.ts.map +1 -1
  11. package/build/cache.js +10 -12
  12. package/build/cache.js.map +1 -1
  13. package/build/cli/import-claude-memory.d.ts +4 -0
  14. package/build/cli/import-claude-memory.d.ts.map +1 -0
  15. package/build/cli/import-claude-memory.js +146 -0
  16. package/build/cli/import-claude-memory.js.map +1 -0
  17. package/build/cli/migrate.d.ts +2 -0
  18. package/build/cli/migrate.d.ts.map +1 -0
  19. package/build/cli/migrate.js +104 -0
  20. package/build/cli/migrate.js.map +1 -0
  21. package/build/config.d.ts +2 -0
  22. package/build/config.d.ts.map +1 -1
  23. package/build/config.js +52 -23
  24. package/build/config.js.map +1 -1
  25. package/build/consolidate.d.ts +2 -1
  26. package/build/consolidate.d.ts.map +1 -1
  27. package/build/consolidate.js +3 -6
  28. package/build/consolidate.js.map +1 -1
  29. package/build/context.d.ts +5 -0
  30. package/build/context.d.ts.map +1 -0
  31. package/build/context.js +47 -0
  32. package/build/context.js.map +1 -0
  33. package/build/date-utils.d.ts +3 -0
  34. package/build/date-utils.d.ts.map +1 -0
  35. package/build/date-utils.js +10 -0
  36. package/build/date-utils.js.map +1 -0
  37. package/build/domain-errors.d.ts +49 -0
  38. package/build/domain-errors.d.ts.map +1 -0
  39. package/build/domain-errors.js +99 -0
  40. package/build/domain-errors.js.map +1 -0
  41. package/build/embeddings.d.ts +2 -1
  42. package/build/embeddings.d.ts.map +1 -1
  43. package/build/embeddings.js +39 -9
  44. package/build/embeddings.js.map +1 -1
  45. package/build/error-utils.d.ts +33 -0
  46. package/build/error-utils.d.ts.map +1 -0
  47. package/build/error-utils.js +65 -0
  48. package/build/error-utils.js.map +1 -0
  49. package/build/git-constants.d.ts +2 -0
  50. package/build/git-constants.d.ts.map +1 -0
  51. package/build/git-constants.js +2 -0
  52. package/build/git-constants.js.map +1 -0
  53. package/build/git.d.ts +27 -18
  54. package/build/git.d.ts.map +1 -1
  55. package/build/git.js +45 -24
  56. package/build/git.js.map +1 -1
  57. package/build/helpers/embed.d.ts +13 -0
  58. package/build/helpers/embed.d.ts.map +1 -0
  59. package/build/helpers/embed.js +68 -0
  60. package/build/helpers/embed.js.map +1 -0
  61. package/build/helpers/git-commit.d.ts +43 -0
  62. package/build/helpers/git-commit.d.ts.map +1 -0
  63. package/build/helpers/git-commit.js +129 -0
  64. package/build/helpers/git-commit.js.map +1 -0
  65. package/build/helpers/index.d.ts +19 -0
  66. package/build/helpers/index.d.ts.map +1 -0
  67. package/build/helpers/index.js +83 -0
  68. package/build/helpers/index.js.map +1 -0
  69. package/build/helpers/persistence.d.ts +34 -0
  70. package/build/helpers/persistence.d.ts.map +1 -0
  71. package/build/helpers/persistence.js +177 -0
  72. package/build/helpers/persistence.js.map +1 -0
  73. package/build/helpers/project.d.ts +21 -0
  74. package/build/helpers/project.d.ts.map +1 -0
  75. package/build/helpers/project.js +75 -0
  76. package/build/helpers/project.js.map +1 -0
  77. package/build/helpers/vault.d.ts +50 -0
  78. package/build/helpers/vault.d.ts.map +1 -0
  79. package/build/helpers/vault.js +196 -0
  80. package/build/helpers/vault.js.map +1 -0
  81. package/build/index.js +12 -5467
  82. package/build/index.js.map +1 -1
  83. package/build/lexical.d.ts +1 -1
  84. package/build/lexical.d.ts.map +1 -1
  85. package/build/lexical.js +2 -3
  86. package/build/lexical.js.map +1 -1
  87. package/build/markdown-ast.d.ts.map +1 -1
  88. package/build/markdown-ast.js +4 -2
  89. package/build/markdown-ast.js.map +1 -1
  90. package/build/migration.d.ts.map +1 -1
  91. package/build/migration.js +12 -8
  92. package/build/migration.js.map +1 -1
  93. package/build/project-introspection.d.ts +4 -4
  94. package/build/project-introspection.d.ts.map +1 -1
  95. package/build/project-introspection.js +71 -27
  96. package/build/project-introspection.js.map +1 -1
  97. package/build/project-memory-policy.d.ts.map +1 -1
  98. package/build/project-memory-policy.js +38 -3
  99. package/build/project-memory-policy.js.map +1 -1
  100. package/build/project.d.ts +2 -1
  101. package/build/project.d.ts.map +1 -1
  102. package/build/project.js +29 -41
  103. package/build/project.js.map +1 -1
  104. package/build/projections.d.ts.map +1 -1
  105. package/build/projections.js +3 -2
  106. package/build/projections.js.map +1 -1
  107. package/build/prompts.d.ts +3 -0
  108. package/build/prompts.d.ts.map +1 -0
  109. package/build/prompts.js +138 -0
  110. package/build/prompts.js.map +1 -0
  111. package/build/provenance.d.ts +9 -3
  112. package/build/provenance.d.ts.map +1 -1
  113. package/build/provenance.js +46 -15
  114. package/build/provenance.js.map +1 -1
  115. package/build/recall.d.ts +2 -1
  116. package/build/recall.d.ts.map +1 -1
  117. package/build/recall.js +30 -14
  118. package/build/recall.js.map +1 -1
  119. package/build/relationships.d.ts +2 -2
  120. package/build/relationships.d.ts.map +1 -1
  121. package/build/relationships.js +39 -43
  122. package/build/relationships.js.map +1 -1
  123. package/build/semantic-patch.d.ts.map +1 -1
  124. package/build/semantic-patch.js +16 -9
  125. package/build/semantic-patch.js.map +1 -1
  126. package/build/server-context.d.ts +18 -0
  127. package/build/server-context.d.ts.map +1 -0
  128. package/build/server-context.js +2 -0
  129. package/build/server-context.js.map +1 -0
  130. package/build/startup.d.ts +5 -0
  131. package/build/startup.d.ts.map +1 -0
  132. package/build/startup.js +37 -0
  133. package/build/startup.js.map +1 -0
  134. package/build/storage.d.ts +17 -15
  135. package/build/storage.d.ts.map +1 -1
  136. package/build/storage.js +67 -93
  137. package/build/storage.js.map +1 -1
  138. package/build/structured-content.d.ts +115 -74
  139. package/build/structured-content.d.ts.map +1 -1
  140. package/build/structured-content.js +41 -17
  141. package/build/structured-content.js.map +1 -1
  142. package/build/temporal-interpretation.d.ts +2 -1
  143. package/build/temporal-interpretation.d.ts.map +1 -1
  144. package/build/temporal-interpretation.js +15 -8
  145. package/build/temporal-interpretation.js.map +1 -1
  146. package/build/tools/consolidate-helpers.d.ts +55 -0
  147. package/build/tools/consolidate-helpers.d.ts.map +1 -0
  148. package/build/tools/consolidate-helpers.js +815 -0
  149. package/build/tools/consolidate-helpers.js.map +1 -0
  150. package/build/tools/consolidate.d.ts +4 -0
  151. package/build/tools/consolidate.d.ts.map +1 -0
  152. package/build/tools/consolidate.js +127 -0
  153. package/build/tools/consolidate.js.map +1 -0
  154. package/build/tools/detect-project.d.ts +6 -0
  155. package/build/tools/detect-project.d.ts.map +1 -0
  156. package/build/tools/detect-project.js +79 -0
  157. package/build/tools/detect-project.js.map +1 -0
  158. package/build/tools/discover-tags.d.ts +4 -0
  159. package/build/tools/discover-tags.d.ts.map +1 -0
  160. package/build/tools/discover-tags.js +236 -0
  161. package/build/tools/discover-tags.js.map +1 -0
  162. package/build/tools/forget.d.ts +4 -0
  163. package/build/tools/forget.d.ts.map +1 -0
  164. package/build/tools/forget.js +123 -0
  165. package/build/tools/forget.js.map +1 -0
  166. package/build/tools/get-project-identity.d.ts +4 -0
  167. package/build/tools/get-project-identity.d.ts.map +1 -0
  168. package/build/tools/get-project-identity.js +59 -0
  169. package/build/tools/get-project-identity.js.map +1 -0
  170. package/build/tools/get.d.ts +4 -0
  171. package/build/tools/get.d.ts.map +1 -0
  172. package/build/tools/get.js +115 -0
  173. package/build/tools/get.js.map +1 -0
  174. package/build/tools/index.d.ts +4 -0
  175. package/build/tools/index.d.ts.map +1 -0
  176. package/build/tools/index.js +47 -0
  177. package/build/tools/index.js.map +1 -0
  178. package/build/tools/list.d.ts +4 -0
  179. package/build/tools/list.d.ts.map +1 -0
  180. package/build/tools/list.js +95 -0
  181. package/build/tools/list.js.map +1 -0
  182. package/build/tools/memory-graph.d.ts +4 -0
  183. package/build/tools/memory-graph.d.ts.map +1 -0
  184. package/build/tools/memory-graph.js +84 -0
  185. package/build/tools/memory-graph.js.map +1 -0
  186. package/build/tools/migration.d.ts +5 -0
  187. package/build/tools/migration.d.ts.map +1 -0
  188. package/build/tools/migration.js +158 -0
  189. package/build/tools/migration.js.map +1 -0
  190. package/build/tools/move-memory.d.ts +4 -0
  191. package/build/tools/move-memory.d.ts.map +1 -0
  192. package/build/tools/move-memory.js +170 -0
  193. package/build/tools/move-memory.js.map +1 -0
  194. package/build/tools/policy.d.ts +5 -0
  195. package/build/tools/policy.d.ts.map +1 -0
  196. package/build/tools/policy.js +195 -0
  197. package/build/tools/policy.js.map +1 -0
  198. package/build/tools/project-memory-summary.d.ts +4 -0
  199. package/build/tools/project-memory-summary.d.ts.map +1 -0
  200. package/build/tools/project-memory-summary.js +477 -0
  201. package/build/tools/project-memory-summary.js.map +1 -0
  202. package/build/tools/recall-helpers.d.ts +40 -0
  203. package/build/tools/recall-helpers.d.ts.map +1 -0
  204. package/build/tools/recall-helpers.js +217 -0
  205. package/build/tools/recall-helpers.js.map +1 -0
  206. package/build/tools/recall.d.ts +4 -0
  207. package/build/tools/recall.d.ts.map +1 -0
  208. package/build/tools/recall.js +413 -0
  209. package/build/tools/recall.js.map +1 -0
  210. package/build/tools/recent-memories.d.ts +4 -0
  211. package/build/tools/recent-memories.d.ts.map +1 -0
  212. package/build/tools/recent-memories.js +79 -0
  213. package/build/tools/recent-memories.js.map +1 -0
  214. package/build/tools/relate.d.ts +4 -0
  215. package/build/tools/relate.d.ts.map +1 -0
  216. package/build/tools/relate.js +180 -0
  217. package/build/tools/relate.js.map +1 -0
  218. package/build/tools/remember.d.ts +4 -0
  219. package/build/tools/remember.d.ts.map +1 -0
  220. package/build/tools/remember.js +219 -0
  221. package/build/tools/remember.js.map +1 -0
  222. package/build/tools/set-project-identity.d.ts +4 -0
  223. package/build/tools/set-project-identity.d.ts.map +1 -0
  224. package/build/tools/set-project-identity.js +113 -0
  225. package/build/tools/set-project-identity.js.map +1 -0
  226. package/build/tools/sync.d.ts +4 -0
  227. package/build/tools/sync.d.ts.map +1 -0
  228. package/build/tools/sync.js +127 -0
  229. package/build/tools/sync.js.map +1 -0
  230. package/build/tools/unrelate.d.ts +4 -0
  231. package/build/tools/unrelate.d.ts.map +1 -0
  232. package/build/tools/unrelate.js +179 -0
  233. package/build/tools/unrelate.js.map +1 -0
  234. package/build/tools/update.d.ts +4 -0
  235. package/build/tools/update.d.ts.map +1 -0
  236. package/build/tools/update.js +364 -0
  237. package/build/tools/update.js.map +1 -0
  238. package/build/tools/where-is-memory.d.ts +4 -0
  239. package/build/tools/where-is-memory.d.ts.map +1 -0
  240. package/build/tools/where-is-memory.js +61 -0
  241. package/build/tools/where-is-memory.js.map +1 -0
  242. package/build/validation.d.ts +24 -0
  243. package/build/validation.d.ts.map +1 -0
  244. package/build/validation.js +62 -0
  245. package/build/validation.js.map +1 -0
  246. package/build/vault.d.ts.map +1 -1
  247. package/build/vault.js +38 -47
  248. package/build/vault.js.map +1 -1
  249. package/package.json +5 -2
  250. package/skills/mnemonic-rpi-workflow/SKILL.md +48 -17
@@ -0,0 +1,113 @@
1
+ import { z } from "zod";
2
+ import { resolveProjectIdentity } from "../project.js";
3
+ import { projectNotFoundResponse } from "../helpers/vault.js";
4
+ import { formatCommitBody } from "../helpers/git-commit.js";
5
+ import { pushAfterMutation as pushAfterMutationFromModule, buildMutationRetryContract, formatRetrySummary } from "../helpers/persistence.js";
6
+ import { RemoteNameSchema, ProjectIdentityResultSchema } from "../structured-content.js";
7
+ export function registerSetProjectIdentityTool(server, ctx) {
8
+ server.registerTool("set_project_identity", {
9
+ title: "Set Project Identity",
10
+ description: "Override which git remote defines project identity for a repo.\n\n" +
11
+ "Use this when:\n" +
12
+ "- A fork should associate memory with the upstream project rather than the fork remote\n" +
13
+ "- Project detection is resolving to the wrong canonical repo\n\n" +
14
+ "Do not use this when:\n" +
15
+ "- The default remote already identifies the correct project\n\n" +
16
+ "Returns:\n" +
17
+ "- The new effective project identity after applying the override\n\n" +
18
+ "Side effects: writes config, git commits, and may push.\n\n" +
19
+ "Typical next step:\n" +
20
+ "- Re-run `detect_project` or `get_project_identity` to verify the result.",
21
+ annotations: {
22
+ readOnlyHint: false,
23
+ destructiveHint: false,
24
+ idempotentHint: true,
25
+ openWorldHint: false,
26
+ },
27
+ inputSchema: z.object({
28
+ cwd: z.string().describe("Absolute project working directory. Pass this whenever the task is project-related so routing, search boosting, policy, and vault selection work correctly."),
29
+ remoteName: RemoteNameSchema.describe("Git remote name to use as the canonical project identity, such as `upstream`")
30
+ }),
31
+ outputSchema: ProjectIdentityResultSchema,
32
+ }, async ({ cwd, remoteName }) => {
33
+ const defaultIdentity = await resolveProjectIdentity(cwd);
34
+ if (!defaultIdentity) {
35
+ return projectNotFoundResponse(cwd);
36
+ }
37
+ const defaultProject = defaultIdentity.project;
38
+ if (defaultProject.source !== "git-remote") {
39
+ return {
40
+ content: [{
41
+ type: "text",
42
+ text: `Project identity override requires a git remote. Current source: ${defaultProject.source}`,
43
+ }],
44
+ };
45
+ }
46
+ const now = new Date().toISOString();
47
+ const candidateIdentity = await resolveProjectIdentity(cwd, {
48
+ getProjectIdentityOverride: async () => ({ remoteName, updatedAt: now }),
49
+ });
50
+ if (!candidateIdentity || !candidateIdentity.identityOverrideApplied) {
51
+ return {
52
+ content: [{
53
+ type: "text",
54
+ text: `Could not resolve git remote '${remoteName}' for ${defaultProject.name}.`,
55
+ }],
56
+ };
57
+ }
58
+ await ctx.configStore.setProjectIdentityOverride(defaultProject.id, { remoteName, updatedAt: now });
59
+ const commitBody = formatCommitBody({
60
+ summary: `Use ${remoteName} as canonical project identity`,
61
+ projectName: defaultProject.name,
62
+ description: `Default identity: ${defaultProject.id}\n` +
63
+ `Resolved identity: ${candidateIdentity.project.id}\n` +
64
+ `Remote: ${remoteName}`,
65
+ });
66
+ const commitMessage = `identity: ${defaultProject.name} use remote ${remoteName}`;
67
+ const commitFiles = ["config.json"];
68
+ const commitStatus = await ctx.vaultManager.main.git.commitWithStatus(commitMessage, commitFiles, commitBody);
69
+ const pushStatus = commitStatus.status === "committed"
70
+ ? await pushAfterMutationFromModule(ctx, ctx.vaultManager.main)
71
+ : { status: "skipped", reason: "commit-failed" };
72
+ const retry = buildMutationRetryContract({
73
+ commit: commitStatus,
74
+ commitMessage,
75
+ commitBody,
76
+ files: commitFiles,
77
+ cwd,
78
+ vault: ctx.vaultManager.main,
79
+ mutationApplied: true,
80
+ });
81
+ const structuredContent = {
82
+ action: "project_identity_set",
83
+ project: {
84
+ id: candidateIdentity.project.id,
85
+ name: candidateIdentity.project.name,
86
+ source: candidateIdentity.project.source,
87
+ remoteName: candidateIdentity.project.remoteName,
88
+ },
89
+ defaultProject: {
90
+ id: defaultProject.id,
91
+ name: defaultProject.name,
92
+ remoteName: defaultProject.remoteName,
93
+ },
94
+ identityOverride: {
95
+ remoteName,
96
+ updatedAt: now,
97
+ },
98
+ retry,
99
+ };
100
+ return {
101
+ content: [{
102
+ type: "text",
103
+ text: `Project identity override set for ${defaultProject.name}: ` +
104
+ `default=\`${defaultProject.id}\`, effective=\`${candidateIdentity.project.id}\`, remote=${remoteName}` +
105
+ `${commitStatus.status === "failed"
106
+ ? `\n${formatRetrySummary(retry) ?? `Commit failed. Push status: ${pushStatus.status}.`}`
107
+ : ""}`,
108
+ }],
109
+ structuredContent,
110
+ };
111
+ });
112
+ }
113
+ //# sourceMappingURL=set-project-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-project-identity.js","sourceRoot":"","sources":["../../src/tools/set-project-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerSyncTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA8C1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAgG5E"}
@@ -0,0 +1,127 @@
1
+ import { z } from "zod";
2
+ import { SyncResultSchema, } from "../structured-content.js";
3
+ import { projectParam } from "../helpers/project.js";
4
+ import { invalidateActiveProjectCache } from "../cache.js";
5
+ import { backfillEmbeddingsAfterSync, removeStaleEmbeddings, } from "../helpers/embed.js";
6
+ function formatSyncResult(result, label, vaultPath) {
7
+ if (!result.hasRemote)
8
+ return [`${label}: no remote configured — git sync skipped.`];
9
+ const lines = [];
10
+ if (result.gitError) {
11
+ const { phase, message, isConflict } = result.gitError;
12
+ if (isConflict) {
13
+ lines.push(`${label}: ✗ merge conflict during ${phase}.`);
14
+ if (result.gitError.conflictFiles.length > 0) {
15
+ lines.push(`${label}: conflicted files: ${result.gitError.conflictFiles.join(", ")}`);
16
+ }
17
+ const where = vaultPath ?? label;
18
+ lines.push(`${label}: resolve conflicts in ${where}, then run sync again.`);
19
+ }
20
+ else {
21
+ lines.push(`${label}: ✗ git ${phase} failed: ${message}`);
22
+ }
23
+ // Still report any partial pull results that came through before the failure
24
+ if (result.pulledNoteIds.length > 0)
25
+ lines.push(`${label}: ↓ ${result.pulledNoteIds.length} note(s) pulled before failure.`);
26
+ return lines;
27
+ }
28
+ lines.push(result.pushedCommits > 0
29
+ ? `${label}: ↑ pushed ${result.pushedCommits} commit(s).`
30
+ : `${label}: ↑ nothing to push.`);
31
+ if (result.deletedNoteIds.length > 0)
32
+ lines.push(`${label}: ✕ ${result.deletedNoteIds.length} note(s) deleted on remote.`);
33
+ lines.push(result.pulledNoteIds.length > 0
34
+ ? `${label}: ↓ ${result.pulledNoteIds.length} note(s) pulled.`
35
+ : `${label}: ↓ no new notes from remote.`);
36
+ return lines;
37
+ }
38
+ export function registerSyncTool(server, ctx) {
39
+ server.registerTool("sync", {
40
+ title: "Sync",
41
+ description: "Sync mnemonic vaults with their git remotes and repair local embedding coverage as needed.\n\n" +
42
+ "Use this when:\n" +
43
+ "- You want the local vault state aligned with remote changes\n" +
44
+ "- You suspect another machine or collaborator updated the vaults\n\n" +
45
+ "Do not use this when:\n" +
46
+ "- You only need to inspect or edit a single memory\n\n" +
47
+ "Returns:\n" +
48
+ "- Per-vault pull/push results, deletions, additions, and embedding rebuild info\n\n" +
49
+ "Side effects: performs git sync and may rebuild local embeddings.\n\n" +
50
+ "Typical next step:\n" +
51
+ "- Use `recent_memories`, `list`, or `recall` to inspect newly synced changes.",
52
+ annotations: {
53
+ readOnlyHint: false,
54
+ destructiveHint: false,
55
+ idempotentHint: true,
56
+ openWorldHint: true,
57
+ },
58
+ inputSchema: z.object({
59
+ cwd: projectParam,
60
+ force: z.boolean().optional().default(false).describe("Rebuild all embeddings even if the current model already generated them"),
61
+ }),
62
+ outputSchema: SyncResultSchema,
63
+ }, async ({ cwd, force }) => {
64
+ const lines = [];
65
+ const vaultResults = [];
66
+ // Always sync main vault
67
+ const mainVaultPath = ctx.vaultManager.main.storage.vaultPath;
68
+ const mainResult = await ctx.vaultManager.main.git.sync();
69
+ lines.push(...formatSyncResult(mainResult, "main vault", mainVaultPath));
70
+ let mainEmbedded = 0;
71
+ let mainFailed = [];
72
+ const mainBackfill = await backfillEmbeddingsAfterSync(ctx, ctx.vaultManager.main.storage, "main vault", lines, force);
73
+ mainEmbedded = mainBackfill.embedded;
74
+ mainFailed = mainBackfill.failed;
75
+ if (mainResult.deletedNoteIds.length > 0) {
76
+ await removeStaleEmbeddings(ctx.vaultManager.main.storage, mainResult.deletedNoteIds);
77
+ }
78
+ vaultResults.push({
79
+ vault: "main",
80
+ hasRemote: mainResult.hasRemote,
81
+ pulled: mainResult.pulledNoteIds.length,
82
+ deleted: mainResult.deletedNoteIds.length,
83
+ pushed: mainResult.pushedCommits,
84
+ embedded: mainEmbedded,
85
+ failed: mainFailed,
86
+ gitError: mainResult.gitError,
87
+ });
88
+ // Optionally sync project vault
89
+ if (cwd) {
90
+ const projectVault = await ctx.vaultManager.getProjectVaultIfExists(cwd);
91
+ if (projectVault) {
92
+ const projectVaultPath = projectVault.storage.vaultPath;
93
+ const projectResult = await projectVault.git.sync();
94
+ lines.push(...formatSyncResult(projectResult, "project vault", projectVaultPath));
95
+ let projEmbedded = 0;
96
+ let projFailed = [];
97
+ const projectBackfill = await backfillEmbeddingsAfterSync(ctx, projectVault.storage, "project vault", lines, force);
98
+ projEmbedded = projectBackfill.embedded;
99
+ projFailed = projectBackfill.failed;
100
+ if (projectResult.deletedNoteIds.length > 0) {
101
+ await removeStaleEmbeddings(projectVault.storage, projectResult.deletedNoteIds);
102
+ }
103
+ vaultResults.push({
104
+ vault: "project",
105
+ hasRemote: projectResult.hasRemote,
106
+ pulled: projectResult.pulledNoteIds.length,
107
+ deleted: projectResult.deletedNoteIds.length,
108
+ pushed: projectResult.pushedCommits,
109
+ embedded: projEmbedded,
110
+ failed: projFailed,
111
+ gitError: projectResult.gitError,
112
+ });
113
+ }
114
+ else {
115
+ lines.push("project vault: no .mnemonic/ found — skipped.");
116
+ }
117
+ }
118
+ const structuredContent = {
119
+ action: "synced",
120
+ vaults: vaultResults,
121
+ };
122
+ // Vault contents may have changed via pull — discard session cache
123
+ invalidateActiveProjectCache();
124
+ return { content: [{ type: "text", text: lines.join("\n") }], structuredContent };
125
+ });
126
+ }
127
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/tools/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,SAAS,gBAAgB,CAAC,MAAkB,EAAE,KAAa,EAAE,SAAkB;IAC7E,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAC;IACrF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,6BAA6B,KAAK,GAAG,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,IAAI,KAAK,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,0BAA0B,KAAK,wBAAwB,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,WAAW,KAAK,YAAY,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,6EAA6E;QAC7E,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,iCAAiC,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC;QACjC,CAAC,CAAC,GAAG,KAAK,cAAc,MAAM,CAAC,aAAa,aAAa;QACzD,CAAC,CAAC,GAAG,KAAK,sBAAsB,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,6BAA6B,CAAC,CAAC;IACvF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QACxC,CAAC,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,kBAAkB;QAC9D,CAAC,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,GAAkB;IACpE,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EACT,gGAAgG;YAChG,kBAAkB;YAClB,gEAAgE;YAChE,sEAAsE;YACtE,yBAAyB;YACzB,wDAAwD;YACxD,YAAY;YACZ,qFAAqF;YACrF,uEAAuE;YACvE,sBAAsB;YACtB,+EAA+E;QACjF,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;QACD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,yEAAyE,CAAC;SACjI,CAAC;QACF,YAAY,EAAE,gBAAgB;KAC/B,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAkD,EAAE,CAAC;QAEvE,yBAAyB;QACzB,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;QACzE,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAa,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACvH,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC;QACrC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;QACjC,IAAI,UAAU,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;QACxF,CAAC;QACD,YAAY,CAAC,IAAI,CAAC;YAChB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM;YACvC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,MAAM;YACzC,MAAM,EAAE,UAAU,CAAC,aAAa;YAChC,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;YACzE,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;gBACxD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,aAAa,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBAClF,IAAI,YAAY,GAAG,CAAC,CAAC;gBACrB,IAAI,UAAU,GAAa,EAAE,CAAC;gBAC9B,MAAM,eAAe,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACpH,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC;gBACxC,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC;gBACpC,IAAI,aAAa,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,MAAM,qBAAqB,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;gBAClF,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa,CAAC,SAAS;oBAClC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM;oBAC1C,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,MAAM;oBAC5C,MAAM,EAAE,aAAa,CAAC,aAAa;oBACnC,QAAQ,EAAE,YAAY;oBACtB,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,aAAa,CAAC,QAAQ;iBACjC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAyB;YAC9C,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,YAAY;SACrB,CAAC;QAEF,mEAAmE;QACnE,4BAA4B,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACpF,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerUnrelateTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=unrelate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unrelate.d.ts","sourceRoot":"","sources":["../../src/tools/unrelate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAkB1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CA2LhF"}
@@ -0,0 +1,179 @@
1
+ import { z } from "zod";
2
+ import { projectParam, ensureBranchSynced } from "../helpers/project.js";
3
+ import { isoDateString } from "../brands.js";
4
+ import { RelateResultSchema, } from "../structured-content.js";
5
+ import { formatCommitBody } from "../helpers/git-commit.js";
6
+ import { buildMutationRetryContract, formatRetrySummary, pushAfterMutation, } from "../helpers/persistence.js";
7
+ import { invalidateActiveProjectCache } from "../cache.js";
8
+ import path from "path";
9
+ export function registerUnrelateTool(server, ctx) {
10
+ server.registerTool("unrelate", {
11
+ title: "Remove Relationship",
12
+ description: "Remove a relationship between two memories.\n\n" +
13
+ "Use this when:\n" +
14
+ "- A previously created relationship is no longer accurate\n" +
15
+ "- Two notes should remain independent\n\n" +
16
+ "Do not use this when:\n" +
17
+ "- You are adding a new connection; use `relate`\n\n" +
18
+ "Returns:\n" +
19
+ "- Both memory ids and the removed relationship details\n\n" +
20
+ "Side effects: modifies both notes, git commits per affected vault, and may push.\n\n" +
21
+ "Typical next step:\n" +
22
+ "- Use `get` to verify both notes now stand on their own.",
23
+ annotations: {
24
+ readOnlyHint: false,
25
+ destructiveHint: true,
26
+ idempotentHint: true,
27
+ openWorldHint: false,
28
+ },
29
+ inputSchema: z.object({
30
+ fromId: z.string().describe("Source memory id"),
31
+ toId: z.string().describe("Target memory id"),
32
+ bidirectional: z.boolean().optional().default(true).describe("Remove relationship in both directions (default: true)"),
33
+ cwd: projectParam,
34
+ }),
35
+ outputSchema: RelateResultSchema,
36
+ }, async ({ fromId, toId, bidirectional, cwd }) => {
37
+ await ensureBranchSynced(ctx, cwd);
38
+ const [foundFrom, foundTo] = await Promise.all([
39
+ ctx.vaultManager.findNote(fromId, cwd),
40
+ ctx.vaultManager.findNote(toId, cwd),
41
+ ]);
42
+ const now = isoDateString(new Date().toISOString());
43
+ const vaultChanges = new Map();
44
+ if (foundFrom) {
45
+ const { note: fromNote, vault: fromVault } = foundFrom;
46
+ const filtered = (fromNote.relatedTo ?? []).filter((r) => r.id !== toId);
47
+ const fromRelExisted = (fromNote.relatedTo?.length ?? 0) > filtered.length;
48
+ if (fromRelExisted) {
49
+ await fromVault.storage.writeNote({ ...fromNote, relatedTo: filtered, updatedAt: now });
50
+ const files = vaultChanges.get(fromVault) ?? [];
51
+ files.push(ctx.vaultManager.noteRelPath(fromVault, fromId));
52
+ vaultChanges.set(fromVault, files);
53
+ }
54
+ }
55
+ if (bidirectional && foundTo) {
56
+ const { note: toNote, vault: toVault } = foundTo;
57
+ const filtered = (toNote.relatedTo ?? []).filter((r) => r.id !== fromId);
58
+ const toRelExisted = (toNote.relatedTo?.length ?? 0) > filtered.length;
59
+ if (toRelExisted) {
60
+ await toVault.storage.writeNote({ ...toNote, relatedTo: filtered, updatedAt: now });
61
+ const files = vaultChanges.get(toVault) ?? [];
62
+ files.push(ctx.vaultManager.noteRelPath(toVault, toId));
63
+ vaultChanges.set(toVault, files);
64
+ }
65
+ }
66
+ // Check for uncommitted changes from a previous failed attempt
67
+ if (vaultChanges.size === 0) {
68
+ // If no relationships were found in note content, check git status for pending changes
69
+ const allVaults = new Set();
70
+ if (foundFrom)
71
+ allVaults.add(foundFrom.vault);
72
+ if (bidirectional && foundTo)
73
+ allVaults.add(foundTo.vault);
74
+ for (const vault of allVaults) {
75
+ const noteIds = [];
76
+ if (foundFrom && foundFrom.vault === vault)
77
+ noteIds.push(fromId);
78
+ if (bidirectional && foundTo && foundTo.vault === vault)
79
+ noteIds.push(toId);
80
+ const pendingFiles = await ctx.vaultManager.getPendingNoteFiles(vault, noteIds);
81
+ if (pendingFiles.length > 0) {
82
+ // Commit the pending changes from previous failed attempt
83
+ const found = foundFrom?.vault === vault ? foundFrom : foundTo;
84
+ const commitBody = found
85
+ ? formatCommitBody({
86
+ noteId: found.note.id,
87
+ noteTitle: found.note.title,
88
+ projectName: found.note.projectName,
89
+ })
90
+ : undefined;
91
+ const commitMessage = `unrelate: ${fromId} ↔ ${toId}`;
92
+ const commitStatus = await vault.git.commitWithStatus(commitMessage, pendingFiles, commitBody);
93
+ if (commitStatus.status === "committed") {
94
+ await pushAfterMutation(ctx, vault);
95
+ }
96
+ const retry = buildMutationRetryContract({
97
+ commit: commitStatus,
98
+ commitMessage,
99
+ commitBody,
100
+ files: pendingFiles,
101
+ cwd,
102
+ vault,
103
+ mutationApplied: true,
104
+ preferredRecovery: "rerun-tool-call-serial",
105
+ });
106
+ const structuredContent = {
107
+ action: "unrelated",
108
+ fromId,
109
+ toId,
110
+ type: "related-to",
111
+ bidirectional,
112
+ notesModified: pendingFiles.map((f) => path.basename(f, '.md')),
113
+ retry,
114
+ };
115
+ const retrySummary = formatRetrySummary(retry);
116
+ return {
117
+ content: [{
118
+ type: "text",
119
+ text: `Reconciled pending commit for relationship removal between \`${fromId}\` and \`${toId}\`${retrySummary ? `\n${retrySummary}` : ""}`,
120
+ }],
121
+ structuredContent,
122
+ };
123
+ }
124
+ }
125
+ return { content: [{ type: "text", text: `No relationship found between '${fromId}' and '${toId}'` }], isError: true };
126
+ }
127
+ let retry;
128
+ for (const [vault, files] of vaultChanges) {
129
+ const found = foundFrom?.vault === vault ? foundFrom : foundTo;
130
+ const commitBody = found
131
+ ? formatCommitBody({
132
+ noteId: found.note.id,
133
+ noteTitle: found.note.title,
134
+ projectName: found.note.projectName,
135
+ })
136
+ : undefined;
137
+ const commitMessage = `unrelate: ${fromId} ↔ ${toId}`;
138
+ const commitStatus = await vault.git.commitWithStatus(commitMessage, files, commitBody);
139
+ if (!retry) {
140
+ retry = buildMutationRetryContract({
141
+ commit: commitStatus,
142
+ commitMessage,
143
+ commitBody,
144
+ files,
145
+ cwd,
146
+ vault,
147
+ mutationApplied: true,
148
+ preferredRecovery: "rerun-tool-call-serial",
149
+ });
150
+ }
151
+ if (commitStatus.status === "committed") {
152
+ await pushAfterMutation(ctx, vault);
153
+ }
154
+ }
155
+ const modifiedNoteIds = [];
156
+ for (const [, files] of vaultChanges) {
157
+ modifiedNoteIds.push(...files.map(f => path.basename(f, '.md')));
158
+ }
159
+ const structuredContent = {
160
+ action: "unrelated",
161
+ fromId,
162
+ toId,
163
+ type: "related-to", // not tracked for unrelate
164
+ bidirectional,
165
+ notesModified: modifiedNoteIds,
166
+ retry,
167
+ };
168
+ const retrySummary = formatRetrySummary(retry);
169
+ invalidateActiveProjectCache();
170
+ return {
171
+ content: [{
172
+ type: "text",
173
+ text: `Removed relationship between \`${fromId}\` and \`${toId}\`${retrySummary ? `\n${retrySummary}` : ""}`,
174
+ }],
175
+ structuredContent,
176
+ };
177
+ });
178
+ }
179
+ //# sourceMappingURL=unrelate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unrelate.js","sourceRoot":"","sources":["../../src/tools/unrelate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../server-context.js";
3
+ export declare function registerUpdateTool(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/tools/update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgD1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAuX9E"}