obsidian-accomplishments-mcp 0.1.10 → 0.1.11

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 (269) hide show
  1. package/README.md +154 -182
  2. package/dist/index.js +207 -38
  3. package/dist/index.js.map +1 -1
  4. package/dist/integration.test.d.ts +8 -0
  5. package/dist/integration.test.d.ts.map +1 -0
  6. package/dist/integration.test.js +979 -0
  7. package/dist/integration.test.js.map +1 -0
  8. package/dist/models/types.d.ts +1 -2
  9. package/dist/models/types.d.ts.map +1 -1
  10. package/dist/models/types.js.map +1 -1
  11. package/dist/models/v2-types.d.ts +460 -0
  12. package/dist/models/v2-types.d.ts.map +1 -0
  13. package/dist/models/v2-types.js +137 -0
  14. package/dist/models/v2-types.js.map +1 -0
  15. package/dist/models/v2-types.test.d.ts +5 -0
  16. package/dist/models/v2-types.test.d.ts.map +1 -0
  17. package/dist/models/v2-types.test.js +133 -0
  18. package/dist/models/v2-types.test.js.map +1 -0
  19. package/dist/parsers/canvas-parser.d.ts +1 -1
  20. package/dist/parsers/canvas-parser.d.ts.map +1 -1
  21. package/dist/parsers/canvas-parser.js +1 -1
  22. package/dist/parsers/canvas-parser.js.map +1 -1
  23. package/dist/parsers/markdown-parser.js +9 -9
  24. package/dist/parsers/markdown-parser.js.map +1 -1
  25. package/dist/services/v2/archive-manager.d.ts +96 -0
  26. package/dist/services/v2/archive-manager.d.ts.map +1 -0
  27. package/dist/services/v2/archive-manager.js +281 -0
  28. package/dist/services/v2/archive-manager.js.map +1 -0
  29. package/dist/services/v2/canvas-manager.d.ts +155 -0
  30. package/dist/services/v2/canvas-manager.d.ts.map +1 -0
  31. package/dist/services/v2/canvas-manager.js +540 -0
  32. package/dist/services/v2/canvas-manager.js.map +1 -0
  33. package/dist/services/v2/canvas-manager.test.d.ts +5 -0
  34. package/dist/services/v2/canvas-manager.test.d.ts.map +1 -0
  35. package/dist/services/v2/canvas-manager.test.js +327 -0
  36. package/dist/services/v2/canvas-manager.test.js.map +1 -0
  37. package/dist/services/v2/cascade-manager.d.ts +54 -0
  38. package/dist/services/v2/cascade-manager.d.ts.map +1 -0
  39. package/dist/services/v2/cascade-manager.js +220 -0
  40. package/dist/services/v2/cascade-manager.js.map +1 -0
  41. package/dist/services/v2/cycle-detector.d.ts +76 -0
  42. package/dist/services/v2/cycle-detector.d.ts.map +1 -0
  43. package/dist/services/v2/cycle-detector.js +183 -0
  44. package/dist/services/v2/cycle-detector.js.map +1 -0
  45. package/dist/services/v2/cycle-detector.test.d.ts +7 -0
  46. package/dist/services/v2/cycle-detector.test.d.ts.map +1 -0
  47. package/dist/services/v2/cycle-detector.test.js +125 -0
  48. package/dist/services/v2/cycle-detector.test.js.map +1 -0
  49. package/dist/services/v2/entity-parser.d.ts +54 -0
  50. package/dist/services/v2/entity-parser.d.ts.map +1 -0
  51. package/dist/services/v2/entity-parser.js +418 -0
  52. package/dist/services/v2/entity-parser.js.map +1 -0
  53. package/dist/services/v2/entity-parser.test.d.ts +5 -0
  54. package/dist/services/v2/entity-parser.test.d.ts.map +1 -0
  55. package/dist/services/v2/entity-parser.test.js +637 -0
  56. package/dist/services/v2/entity-parser.test.js.map +1 -0
  57. package/dist/services/v2/entity-serializer.d.ts +94 -0
  58. package/dist/services/v2/entity-serializer.d.ts.map +1 -0
  59. package/dist/services/v2/entity-serializer.js +583 -0
  60. package/dist/services/v2/entity-serializer.js.map +1 -0
  61. package/dist/services/v2/entity-serializer.test.d.ts +5 -0
  62. package/dist/services/v2/entity-serializer.test.d.ts.map +1 -0
  63. package/dist/services/v2/entity-serializer.test.js +241 -0
  64. package/dist/services/v2/entity-serializer.test.js.map +1 -0
  65. package/dist/services/v2/entity-validator.d.ts +65 -0
  66. package/dist/services/v2/entity-validator.d.ts.map +1 -0
  67. package/dist/services/v2/entity-validator.js +573 -0
  68. package/dist/services/v2/entity-validator.js.map +1 -0
  69. package/dist/services/v2/entity-validator.test.d.ts +5 -0
  70. package/dist/services/v2/entity-validator.test.d.ts.map +1 -0
  71. package/dist/services/v2/entity-validator.test.js +519 -0
  72. package/dist/services/v2/entity-validator.test.js.map +1 -0
  73. package/dist/services/v2/file-manager.d.ts +73 -0
  74. package/dist/services/v2/file-manager.d.ts.map +1 -0
  75. package/dist/services/v2/file-manager.js +310 -0
  76. package/dist/services/v2/file-manager.js.map +1 -0
  77. package/dist/services/v2/file-manager.test.d.ts +5 -0
  78. package/dist/services/v2/file-manager.test.d.ts.map +1 -0
  79. package/dist/services/v2/file-manager.test.js +339 -0
  80. package/dist/services/v2/file-manager.test.js.map +1 -0
  81. package/dist/services/v2/index-manager.d.ts +68 -0
  82. package/dist/services/v2/index-manager.d.ts.map +1 -0
  83. package/dist/services/v2/index-manager.js +228 -0
  84. package/dist/services/v2/index-manager.js.map +1 -0
  85. package/dist/services/v2/index-manager.test.d.ts +5 -0
  86. package/dist/services/v2/index-manager.test.d.ts.map +1 -0
  87. package/dist/services/v2/index-manager.test.js +386 -0
  88. package/dist/services/v2/index-manager.test.js.map +1 -0
  89. package/dist/services/v2/index-service.d.ts +82 -0
  90. package/dist/services/v2/index-service.d.ts.map +1 -0
  91. package/dist/services/v2/index-service.js +274 -0
  92. package/dist/services/v2/index-service.js.map +1 -0
  93. package/dist/services/v2/index-service.test.d.ts +5 -0
  94. package/dist/services/v2/index-service.test.d.ts.map +1 -0
  95. package/dist/services/v2/index-service.test.js +117 -0
  96. package/dist/services/v2/index-service.test.js.map +1 -0
  97. package/dist/services/v2/lifecycle-manager.d.ts +59 -0
  98. package/dist/services/v2/lifecycle-manager.d.ts.map +1 -0
  99. package/dist/services/v2/lifecycle-manager.js +310 -0
  100. package/dist/services/v2/lifecycle-manager.js.map +1 -0
  101. package/dist/services/v2/lifecycle-manager.test.d.ts +5 -0
  102. package/dist/services/v2/lifecycle-manager.test.d.ts.map +1 -0
  103. package/dist/services/v2/lifecycle-manager.test.js +141 -0
  104. package/dist/services/v2/lifecycle-manager.test.js.map +1 -0
  105. package/dist/services/v2/path-resolver.d.ts +64 -0
  106. package/dist/services/v2/path-resolver.d.ts.map +1 -0
  107. package/dist/services/v2/path-resolver.js +174 -0
  108. package/dist/services/v2/path-resolver.js.map +1 -0
  109. package/dist/services/v2/progress-computer.d.ts +46 -0
  110. package/dist/services/v2/progress-computer.d.ts.map +1 -0
  111. package/dist/services/v2/progress-computer.js +200 -0
  112. package/dist/services/v2/progress-computer.js.map +1 -0
  113. package/dist/services/v2/search-service.d.ts +68 -0
  114. package/dist/services/v2/search-service.d.ts.map +1 -0
  115. package/dist/services/v2/search-service.js +194 -0
  116. package/dist/services/v2/search-service.js.map +1 -0
  117. package/dist/services/v2/transitive-dependency-remover.d.ts +54 -0
  118. package/dist/services/v2/transitive-dependency-remover.d.ts.map +1 -0
  119. package/dist/services/v2/transitive-dependency-remover.js +156 -0
  120. package/dist/services/v2/transitive-dependency-remover.js.map +1 -0
  121. package/dist/services/v2/transitive-dependency-remover.test.d.ts +7 -0
  122. package/dist/services/v2/transitive-dependency-remover.test.d.ts.map +1 -0
  123. package/dist/services/v2/transitive-dependency-remover.test.js +119 -0
  124. package/dist/services/v2/transitive-dependency-remover.test.js.map +1 -0
  125. package/dist/services/v2/v2-runtime.d.ts +374 -0
  126. package/dist/services/v2/v2-runtime.d.ts.map +1 -0
  127. package/dist/services/v2/v2-runtime.js +1908 -0
  128. package/dist/services/v2/v2-runtime.js.map +1 -0
  129. package/dist/services/v2/v2-runtime.test.d.ts +5 -0
  130. package/dist/services/v2/v2-runtime.test.d.ts.map +1 -0
  131. package/dist/services/v2/v2-runtime.test.js +658 -0
  132. package/dist/services/v2/v2-runtime.test.js.map +1 -0
  133. package/dist/services/v2/workstream-normalizer.d.ts +59 -0
  134. package/dist/services/v2/workstream-normalizer.d.ts.map +1 -0
  135. package/dist/services/v2/workstream-normalizer.js +137 -0
  136. package/dist/services/v2/workstream-normalizer.js.map +1 -0
  137. package/dist/services/v2/workstream-normalizer.test.d.ts +7 -0
  138. package/dist/services/v2/workstream-normalizer.test.d.ts.map +1 -0
  139. package/dist/services/v2/workstream-normalizer.test.js +130 -0
  140. package/dist/services/v2/workstream-normalizer.test.js.map +1 -0
  141. package/dist/test-runner.d.ts +4 -1
  142. package/dist/test-runner.d.ts.map +1 -1
  143. package/dist/test-runner.js +44 -249
  144. package/dist/test-runner.js.map +1 -1
  145. package/dist/tools/batch-operations-tools.d.ts +54 -0
  146. package/dist/tools/batch-operations-tools.d.ts.map +1 -0
  147. package/dist/tools/batch-operations-tools.js +370 -0
  148. package/dist/tools/batch-operations-tools.js.map +1 -0
  149. package/dist/tools/decision-document-tools.d.ts +78 -0
  150. package/dist/tools/decision-document-tools.d.ts.map +1 -0
  151. package/dist/tools/decision-document-tools.js +260 -0
  152. package/dist/tools/decision-document-tools.js.map +1 -0
  153. package/dist/tools/entity-management-tools.d.ts +79 -0
  154. package/dist/tools/entity-management-tools.d.ts.map +1 -0
  155. package/dist/tools/entity-management-tools.js +851 -0
  156. package/dist/tools/entity-management-tools.js.map +1 -0
  157. package/dist/tools/entity-management-tools.test.d.ts +5 -0
  158. package/dist/tools/entity-management-tools.test.d.ts.map +1 -0
  159. package/dist/tools/entity-management-tools.test.js +530 -0
  160. package/dist/tools/entity-management-tools.test.js.map +1 -0
  161. package/dist/tools/index.d.ts +15 -331
  162. package/dist/tools/index.d.ts.map +1 -1
  163. package/dist/tools/index.js +510 -47
  164. package/dist/tools/index.js.map +1 -1
  165. package/dist/tools/index.test.d.ts +8 -0
  166. package/dist/tools/index.test.d.ts.map +1 -0
  167. package/dist/tools/index.test.js +429 -0
  168. package/dist/tools/index.test.js.map +1 -0
  169. package/dist/tools/project-understanding-tools.d.ts +75 -0
  170. package/dist/tools/project-understanding-tools.d.ts.map +1 -0
  171. package/dist/tools/project-understanding-tools.js +751 -0
  172. package/dist/tools/project-understanding-tools.js.map +1 -0
  173. package/dist/tools/search-navigation-tools.d.ts +77 -0
  174. package/dist/tools/search-navigation-tools.d.ts.map +1 -0
  175. package/dist/tools/search-navigation-tools.js +379 -0
  176. package/dist/tools/search-navigation-tools.js.map +1 -0
  177. package/dist/tools/tool-types.d.ts +703 -0
  178. package/dist/tools/tool-types.d.ts.map +1 -0
  179. package/dist/tools/tool-types.js +7 -0
  180. package/dist/tools/tool-types.js.map +1 -0
  181. package/dist/utils/config.d.ts +0 -4
  182. package/dist/utils/config.d.ts.map +1 -1
  183. package/dist/utils/config.js +2 -19
  184. package/dist/utils/config.js.map +1 -1
  185. package/package.json +16 -1
  186. package/dist/services/accomplishment-service.d.ts +0 -33
  187. package/dist/services/accomplishment-service.d.ts.map +0 -1
  188. package/dist/services/accomplishment-service.js +0 -296
  189. package/dist/services/accomplishment-service.js.map +0 -1
  190. package/dist/services/canvas-service.d.ts +0 -96
  191. package/dist/services/canvas-service.d.ts.map +0 -1
  192. package/dist/services/canvas-service.js +0 -231
  193. package/dist/services/canvas-service.js.map +0 -1
  194. package/dist/services/context-doc-service.d.ts +0 -70
  195. package/dist/services/context-doc-service.d.ts.map +0 -1
  196. package/dist/services/context-doc-service.js +0 -229
  197. package/dist/services/context-doc-service.js.map +0 -1
  198. package/dist/services/dependency-service.d.ts +0 -22
  199. package/dist/services/dependency-service.d.ts.map +0 -1
  200. package/dist/services/dependency-service.js +0 -99
  201. package/dist/services/dependency-service.js.map +0 -1
  202. package/dist/services/status-indicator-service.d.ts +0 -40
  203. package/dist/services/status-indicator-service.d.ts.map +0 -1
  204. package/dist/services/status-indicator-service.js +0 -173
  205. package/dist/services/status-indicator-service.js.map +0 -1
  206. package/dist/services/task-service.d.ts +0 -32
  207. package/dist/services/task-service.d.ts.map +0 -1
  208. package/dist/services/task-service.js +0 -152
  209. package/dist/services/task-service.js.map +0 -1
  210. package/dist/test-real-vault.d.ts +0 -6
  211. package/dist/test-real-vault.d.ts.map +0 -1
  212. package/dist/test-real-vault.js +0 -30
  213. package/dist/test-real-vault.js.map +0 -1
  214. package/dist/tools/batch-operations.d.ts +0 -246
  215. package/dist/tools/batch-operations.d.ts.map +0 -1
  216. package/dist/tools/batch-operations.js +0 -235
  217. package/dist/tools/batch-operations.js.map +0 -1
  218. package/dist/tools/get-accomplishment.d.ts +0 -42
  219. package/dist/tools/get-accomplishment.d.ts.map +0 -1
  220. package/dist/tools/get-accomplishment.js +0 -93
  221. package/dist/tools/get-accomplishment.js.map +0 -1
  222. package/dist/tools/get-accomplishments-graph.d.ts +0 -26
  223. package/dist/tools/get-accomplishments-graph.d.ts.map +0 -1
  224. package/dist/tools/get-accomplishments-graph.js +0 -137
  225. package/dist/tools/get-accomplishments-graph.js.map +0 -1
  226. package/dist/tools/get-blocked-items.d.ts +0 -15
  227. package/dist/tools/get-blocked-items.d.ts.map +0 -1
  228. package/dist/tools/get-blocked-items.js +0 -73
  229. package/dist/tools/get-blocked-items.js.map +0 -1
  230. package/dist/tools/get-current-work.d.ts +0 -15
  231. package/dist/tools/get-current-work.d.ts.map +0 -1
  232. package/dist/tools/get-current-work.js +0 -68
  233. package/dist/tools/get-current-work.js.map +0 -1
  234. package/dist/tools/get-project-status.d.ts +0 -26
  235. package/dist/tools/get-project-status.d.ts.map +0 -1
  236. package/dist/tools/get-project-status.js +0 -98
  237. package/dist/tools/get-project-status.js.map +0 -1
  238. package/dist/tools/get-ready-to-start.d.ts +0 -15
  239. package/dist/tools/get-ready-to-start.d.ts.map +0 -1
  240. package/dist/tools/get-ready-to-start.js +0 -47
  241. package/dist/tools/get-ready-to-start.js.map +0 -1
  242. package/dist/tools/list-accomplishments.d.ts +0 -42
  243. package/dist/tools/list-accomplishments.d.ts.map +0 -1
  244. package/dist/tools/list-accomplishments.js +0 -40
  245. package/dist/tools/list-accomplishments.js.map +0 -1
  246. package/dist/tools/manage-accomplishment.d.ts +0 -147
  247. package/dist/tools/manage-accomplishment.d.ts.map +0 -1
  248. package/dist/tools/manage-accomplishment.js +0 -153
  249. package/dist/tools/manage-accomplishment.js.map +0 -1
  250. package/dist/tools/manage-dependency.d.ts +0 -41
  251. package/dist/tools/manage-dependency.d.ts.map +0 -1
  252. package/dist/tools/manage-dependency.js +0 -66
  253. package/dist/tools/manage-dependency.js.map +0 -1
  254. package/dist/tools/manage-task.d.ts +0 -119
  255. package/dist/tools/manage-task.d.ts.map +0 -1
  256. package/dist/tools/manage-task.js +0 -126
  257. package/dist/tools/manage-task.js.map +0 -1
  258. package/dist/tools/reconcile-canvas.d.ts +0 -33
  259. package/dist/tools/reconcile-canvas.d.ts.map +0 -1
  260. package/dist/tools/reconcile-canvas.js +0 -41
  261. package/dist/tools/reconcile-canvas.js.map +0 -1
  262. package/dist/tools/set-work-focus.d.ts +0 -48
  263. package/dist/tools/set-work-focus.d.ts.map +0 -1
  264. package/dist/tools/set-work-focus.js +0 -78
  265. package/dist/tools/set-work-focus.js.map +0 -1
  266. package/dist/tools/sync-dependencies.d.ts +0 -33
  267. package/dist/tools/sync-dependencies.d.ts.map +0 -1
  268. package/dist/tools/sync-dependencies.js +0 -144
  269. package/dist/tools/sync-dependencies.js.map +0 -1
@@ -0,0 +1,540 @@
1
+ /**
2
+ * V2 Canvas Manager
3
+ *
4
+ * Centralized service for managing Obsidian canvas files.
5
+ * Handles node and edge operations with atomic batch updates.
6
+ *
7
+ * Key features:
8
+ * - Atomic file writes (temp file + rename) to prevent corruption
9
+ * - Obsidian reload trigger to sync UI after file changes
10
+ */
11
+ import * as fs from 'fs/promises';
12
+ import * as path from 'path';
13
+ import * as crypto from 'crypto';
14
+ import { writeFileAtomic, triggerObsidianReload } from '../../utils/file-utils.js';
15
+ // Default layout configuration
16
+ const DEFAULT_LAYOUT_CONFIG = {
17
+ stageSpacing: 400,
18
+ itemSpacing: 120,
19
+ lanePadding: 50,
20
+ startX: 0,
21
+ startY: 0,
22
+ };
23
+ // Default node dimensions by entity type
24
+ const DEFAULT_DIMENSIONS = {
25
+ milestone: { width: 500, height: 400 },
26
+ story: { width: 400, height: 300 },
27
+ task: { width: 350, height: 250 },
28
+ decision: { width: 400, height: 300 },
29
+ document: { width: 400, height: 350 },
30
+ default: { width: 400, height: 300 },
31
+ };
32
+ // =============================================================================
33
+ // Canvas Manager Class
34
+ // =============================================================================
35
+ export class CanvasManager {
36
+ vaultPath;
37
+ defaultCanvas;
38
+ entityPathResolver;
39
+ constructor(vaultPath, defaultCanvas, entityPathResolver) {
40
+ this.vaultPath = vaultPath;
41
+ this.defaultCanvas = defaultCanvas;
42
+ this.entityPathResolver = entityPathResolver;
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Canvas I/O
46
+ // ---------------------------------------------------------------------------
47
+ async readCanvas(canvasPath) {
48
+ const fullPath = path.join(this.vaultPath, canvasPath);
49
+ try {
50
+ const content = await fs.readFile(fullPath, 'utf-8');
51
+ const data = JSON.parse(content);
52
+ return {
53
+ nodes: data.nodes || [],
54
+ edges: data.edges || [],
55
+ };
56
+ }
57
+ catch (error) {
58
+ if (error.code === 'ENOENT') {
59
+ // Canvas doesn't exist, return empty
60
+ return { nodes: [], edges: [] };
61
+ }
62
+ throw error;
63
+ }
64
+ }
65
+ async writeCanvas(canvasPath, canvas) {
66
+ const fullPath = path.join(this.vaultPath, canvasPath);
67
+ const content = JSON.stringify(canvas, null, 2);
68
+ // Use atomic write (temp file + rename) to prevent corruption from concurrent access
69
+ await writeFileAtomic(fullPath, content);
70
+ // Trigger Obsidian to reload the canvas so UI stays in sync
71
+ triggerObsidianReload(this.vaultPath, canvasPath);
72
+ }
73
+ findNodeByFile(canvas, filePath) {
74
+ return canvas.nodes.find(n => n.type === 'file' && n.file === filePath);
75
+ }
76
+ generateNodeId() {
77
+ return crypto.randomBytes(8).toString('hex');
78
+ }
79
+ generateEdgeId() {
80
+ return crypto.randomBytes(8).toString('hex');
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Single Operations
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Add a node to canvas for an entity file.
87
+ * Returns the node ID if successful.
88
+ */
89
+ async addNode(filePath, canvasPath, position, dimensions) {
90
+ const targetCanvas = canvasPath || this.defaultCanvas;
91
+ const canvas = await this.readCanvas(targetCanvas);
92
+ // Check if node already exists
93
+ const existing = this.findNodeByFile(canvas, filePath);
94
+ if (existing) {
95
+ return existing.id;
96
+ }
97
+ // Calculate position (simple grid layout if not specified)
98
+ const pos = position || this.calculateNextPosition(canvas);
99
+ const dims = dimensions || DEFAULT_DIMENSIONS.default;
100
+ const node = {
101
+ id: this.generateNodeId(),
102
+ type: 'file',
103
+ file: filePath,
104
+ x: pos.x,
105
+ y: pos.y,
106
+ width: dims.width,
107
+ height: dims.height,
108
+ };
109
+ canvas.nodes.push(node);
110
+ await this.writeCanvas(targetCanvas, canvas);
111
+ return node.id;
112
+ }
113
+ /**
114
+ * Remove a node from canvas by file path.
115
+ * Also removes any edges connected to the node.
116
+ */
117
+ async removeNode(filePath, canvasPath) {
118
+ const targetCanvas = canvasPath || this.defaultCanvas;
119
+ const canvas = await this.readCanvas(targetCanvas);
120
+ const node = this.findNodeByFile(canvas, filePath);
121
+ if (!node) {
122
+ return false;
123
+ }
124
+ // Remove node
125
+ canvas.nodes = canvas.nodes.filter(n => n.id !== node.id);
126
+ // Remove connected edges
127
+ canvas.edges = canvas.edges.filter(e => e.fromNode !== node.id && e.toNode !== node.id);
128
+ await this.writeCanvas(targetCanvas, canvas);
129
+ return true;
130
+ }
131
+ /**
132
+ * Update a node's file path (used when files are moved/renamed).
133
+ */
134
+ async updateNodePath(oldPath, newPath, canvasPath) {
135
+ const targetCanvas = canvasPath || this.defaultCanvas;
136
+ const canvas = await this.readCanvas(targetCanvas);
137
+ const node = this.findNodeByFile(canvas, oldPath);
138
+ if (!node) {
139
+ return false;
140
+ }
141
+ node.file = newPath;
142
+ await this.writeCanvas(targetCanvas, canvas);
143
+ return true;
144
+ }
145
+ /**
146
+ * Add an edge between two nodes (for dependencies).
147
+ * Returns the edge ID if successful.
148
+ */
149
+ async addEdge(fromFilePath, toFilePath, canvasPath) {
150
+ const targetCanvas = canvasPath || this.defaultCanvas;
151
+ const canvas = await this.readCanvas(targetCanvas);
152
+ const fromNode = this.findNodeByFile(canvas, fromFilePath);
153
+ const toNode = this.findNodeByFile(canvas, toFilePath);
154
+ if (!fromNode || !toNode) {
155
+ return null;
156
+ }
157
+ // Check if edge already exists
158
+ const existing = canvas.edges.find(e => e.fromNode === fromNode.id && e.toNode === toNode.id);
159
+ if (existing) {
160
+ return existing.id;
161
+ }
162
+ const edge = {
163
+ id: this.generateEdgeId(),
164
+ fromNode: fromNode.id,
165
+ toNode: toNode.id,
166
+ fromSide: 'right',
167
+ toSide: 'left',
168
+ };
169
+ canvas.edges.push(edge);
170
+ await this.writeCanvas(targetCanvas, canvas);
171
+ return edge.id;
172
+ }
173
+ /**
174
+ * Remove an edge between two nodes.
175
+ */
176
+ async removeEdge(fromFilePath, toFilePath, canvasPath) {
177
+ const targetCanvas = canvasPath || this.defaultCanvas;
178
+ const canvas = await this.readCanvas(targetCanvas);
179
+ const fromNode = this.findNodeByFile(canvas, fromFilePath);
180
+ const toNode = this.findNodeByFile(canvas, toFilePath);
181
+ if (!fromNode || !toNode) {
182
+ return false;
183
+ }
184
+ const initialLength = canvas.edges.length;
185
+ canvas.edges = canvas.edges.filter(e => !(e.fromNode === fromNode.id && e.toNode === toNode.id));
186
+ if (canvas.edges.length === initialLength) {
187
+ return false; // No edge was removed
188
+ }
189
+ await this.writeCanvas(targetCanvas, canvas);
190
+ return true;
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Batch Operations
194
+ // ---------------------------------------------------------------------------
195
+ /**
196
+ * Apply multiple operations atomically (single read/write).
197
+ */
198
+ async batchUpdate(operations, canvasPath) {
199
+ const targetCanvas = canvasPath || this.defaultCanvas;
200
+ const canvas = await this.readCanvas(targetCanvas);
201
+ const result = {
202
+ success: true,
203
+ nodesAdded: 0,
204
+ nodesRemoved: 0,
205
+ nodesUpdated: 0,
206
+ edgesAdded: 0,
207
+ edgesRemoved: 0,
208
+ errors: [],
209
+ };
210
+ for (const op of operations) {
211
+ try {
212
+ switch (op.type) {
213
+ case 'add_node': {
214
+ const existing = this.findNodeByFile(canvas, op.filePath);
215
+ if (!existing) {
216
+ const pos = op.position || this.calculateNextPosition(canvas);
217
+ const dims = op.dimensions || DEFAULT_DIMENSIONS.default;
218
+ canvas.nodes.push({
219
+ id: this.generateNodeId(),
220
+ type: 'file',
221
+ file: op.filePath,
222
+ x: pos.x,
223
+ y: pos.y,
224
+ width: dims.width,
225
+ height: dims.height,
226
+ });
227
+ result.nodesAdded++;
228
+ }
229
+ break;
230
+ }
231
+ case 'remove_node': {
232
+ const node = this.findNodeByFile(canvas, op.filePath);
233
+ if (node) {
234
+ canvas.nodes = canvas.nodes.filter(n => n.id !== node.id);
235
+ canvas.edges = canvas.edges.filter(e => e.fromNode !== node.id && e.toNode !== node.id);
236
+ result.nodesRemoved++;
237
+ }
238
+ break;
239
+ }
240
+ case 'update_node_path': {
241
+ const node = this.findNodeByFile(canvas, op.oldPath);
242
+ if (node) {
243
+ node.file = op.newPath;
244
+ result.nodesUpdated++;
245
+ }
246
+ break;
247
+ }
248
+ case 'add_edge': {
249
+ const fromNode = this.findNodeByFile(canvas, op.fromFilePath);
250
+ const toNode = this.findNodeByFile(canvas, op.toFilePath);
251
+ if (fromNode && toNode) {
252
+ const exists = canvas.edges.some(e => e.fromNode === fromNode.id && e.toNode === toNode.id);
253
+ if (!exists) {
254
+ canvas.edges.push({
255
+ id: this.generateEdgeId(),
256
+ fromNode: fromNode.id,
257
+ toNode: toNode.id,
258
+ fromSide: 'right',
259
+ toSide: 'left',
260
+ });
261
+ result.edgesAdded++;
262
+ }
263
+ }
264
+ break;
265
+ }
266
+ case 'remove_edge': {
267
+ const fromNode = this.findNodeByFile(canvas, op.fromFilePath);
268
+ const toNode = this.findNodeByFile(canvas, op.toFilePath);
269
+ if (fromNode && toNode) {
270
+ const initialLength = canvas.edges.length;
271
+ canvas.edges = canvas.edges.filter(e => !(e.fromNode === fromNode.id && e.toNode === toNode.id));
272
+ if (canvas.edges.length < initialLength) {
273
+ result.edgesRemoved++;
274
+ }
275
+ }
276
+ break;
277
+ }
278
+ }
279
+ }
280
+ catch (error) {
281
+ result.errors.push(`Operation ${op.type} failed: ${error}`);
282
+ result.success = false;
283
+ }
284
+ }
285
+ await this.writeCanvas(targetCanvas, canvas);
286
+ return result;
287
+ }
288
+ // ---------------------------------------------------------------------------
289
+ // Query Methods
290
+ // ---------------------------------------------------------------------------
291
+ /**
292
+ * Get a node by entity file path.
293
+ */
294
+ async getNodeByFilePath(filePath, canvasPath) {
295
+ const targetCanvas = canvasPath || this.defaultCanvas;
296
+ const canvas = await this.readCanvas(targetCanvas);
297
+ return this.findNodeByFile(canvas, filePath) || null;
298
+ }
299
+ /**
300
+ * Get all file nodes from canvas.
301
+ */
302
+ async getAllFileNodes(canvasPath) {
303
+ const targetCanvas = canvasPath || this.defaultCanvas;
304
+ const canvas = await this.readCanvas(targetCanvas);
305
+ return canvas.nodes.filter(n => n.type === 'file');
306
+ }
307
+ /**
308
+ * Check if canvas file exists.
309
+ */
310
+ async canvasExists(canvasPath) {
311
+ const targetCanvas = canvasPath || this.defaultCanvas;
312
+ const fullPath = path.join(this.vaultPath, targetCanvas);
313
+ try {
314
+ await fs.access(fullPath);
315
+ return true;
316
+ }
317
+ catch {
318
+ return false;
319
+ }
320
+ }
321
+ // ---------------------------------------------------------------------------
322
+ // Auto-Layout
323
+ // ---------------------------------------------------------------------------
324
+ /**
325
+ * Auto-layout canvas nodes using dependency-driven horizontal flow with workstream lanes.
326
+ *
327
+ * Strategy:
328
+ * - X position = topological order (distance from root nodes based on edges)
329
+ * - Y position = workstream lane
330
+ *
331
+ * @param entityMetadataResolver - Function to get entity metadata (workstream, type) from file path
332
+ * @param canvasPath - Optional canvas path (uses default if not specified)
333
+ * @param config - Optional layout configuration
334
+ */
335
+ async autoLayout(entityMetadataResolver, canvasPath, config = {}) {
336
+ const layoutConfig = { ...DEFAULT_LAYOUT_CONFIG, ...config };
337
+ const targetCanvas = canvasPath || this.defaultCanvas;
338
+ const result = {
339
+ success: true,
340
+ nodesRepositioned: 0,
341
+ errors: [],
342
+ };
343
+ try {
344
+ const canvas = await this.readCanvas(targetCanvas);
345
+ const fileNodes = canvas.nodes.filter(n => n.type === 'file');
346
+ if (fileNodes.length === 0) {
347
+ return result;
348
+ }
349
+ // Step 1: Build dependency graph and calculate topological order
350
+ const nodeDepths = this.calculateNodeDepths(canvas);
351
+ // Step 2: Group nodes by workstream
352
+ const nodesByWorkstream = new Map();
353
+ const unknownWorkstream = [];
354
+ for (const node of fileNodes) {
355
+ if (!node.file)
356
+ continue;
357
+ const metadata = await entityMetadataResolver(node.file);
358
+ const workstream = metadata?.workstream || 'Unknown';
359
+ if (workstream === 'Unknown') {
360
+ unknownWorkstream.push(node);
361
+ }
362
+ else {
363
+ if (!nodesByWorkstream.has(workstream)) {
364
+ nodesByWorkstream.set(workstream, []);
365
+ }
366
+ nodesByWorkstream.get(workstream).push(node);
367
+ }
368
+ }
369
+ // Add unknown workstream if there are nodes
370
+ if (unknownWorkstream.length > 0) {
371
+ nodesByWorkstream.set('Unknown', unknownWorkstream);
372
+ }
373
+ // Step 3: Calculate workstream lanes
374
+ const workstreamLanes = this.calculateWorkstreamLanes(nodesByWorkstream, layoutConfig);
375
+ // Step 4: Position nodes within their lanes
376
+ for (const [workstream, nodes] of nodesByWorkstream) {
377
+ const lane = workstreamLanes.get(workstream);
378
+ if (!lane)
379
+ continue;
380
+ // Sort nodes by their dependency depth (topological order)
381
+ nodes.sort((a, b) => {
382
+ const depthA = nodeDepths.get(a.id) || 0;
383
+ const depthB = nodeDepths.get(b.id) || 0;
384
+ return depthA - depthB;
385
+ });
386
+ // Group nodes by depth for column layout
387
+ const nodesByDepth = new Map();
388
+ for (const node of nodes) {
389
+ const depth = nodeDepths.get(node.id) || 0;
390
+ if (!nodesByDepth.has(depth)) {
391
+ nodesByDepth.set(depth, []);
392
+ }
393
+ nodesByDepth.get(depth).push(node);
394
+ }
395
+ // Position nodes column by column
396
+ const depths = Array.from(nodesByDepth.keys()).sort((a, b) => a - b);
397
+ for (const depth of depths) {
398
+ const depthNodes = nodesByDepth.get(depth);
399
+ const xPos = layoutConfig.startX + layoutConfig.lanePadding +
400
+ depth * layoutConfig.stageSpacing;
401
+ for (let i = 0; i < depthNodes.length; i++) {
402
+ const node = depthNodes[i];
403
+ const nodeHeight = node.height || DEFAULT_DIMENSIONS.default.height;
404
+ node.x = xPos;
405
+ node.y = lane.yStart + layoutConfig.lanePadding +
406
+ i * (nodeHeight + layoutConfig.itemSpacing);
407
+ result.nodesRepositioned++;
408
+ }
409
+ }
410
+ }
411
+ // Write updated canvas
412
+ await this.writeCanvas(targetCanvas, canvas);
413
+ }
414
+ catch (err) {
415
+ result.success = false;
416
+ result.errors.push(`Layout failed: ${err instanceof Error ? err.message : String(err)}`);
417
+ }
418
+ return result;
419
+ }
420
+ /**
421
+ * Calculate the topological depth of each node based on edges.
422
+ * Nodes with no incoming edges have depth 0.
423
+ * Depth = max(depth of all predecessors) + 1
424
+ */
425
+ calculateNodeDepths(canvas) {
426
+ const depths = new Map();
427
+ const incomingEdges = new Map();
428
+ const outgoingEdges = new Map();
429
+ // Build adjacency lists
430
+ for (const node of canvas.nodes) {
431
+ incomingEdges.set(node.id, []);
432
+ outgoingEdges.set(node.id, []);
433
+ }
434
+ for (const edge of canvas.edges) {
435
+ const incoming = incomingEdges.get(edge.toNode);
436
+ if (incoming)
437
+ incoming.push(edge.fromNode);
438
+ const outgoing = outgoingEdges.get(edge.fromNode);
439
+ if (outgoing)
440
+ outgoing.push(edge.toNode);
441
+ }
442
+ // Find root nodes (no incoming edges)
443
+ const roots = [];
444
+ for (const [nodeId, incoming] of incomingEdges) {
445
+ if (incoming.length === 0) {
446
+ roots.push(nodeId);
447
+ depths.set(nodeId, 0);
448
+ }
449
+ }
450
+ // BFS to calculate depths
451
+ const queue = [...roots];
452
+ while (queue.length > 0) {
453
+ const nodeId = queue.shift();
454
+ const currentDepth = depths.get(nodeId) || 0;
455
+ for (const childId of outgoingEdges.get(nodeId) || []) {
456
+ const existingDepth = depths.get(childId);
457
+ const newDepth = currentDepth + 1;
458
+ if (existingDepth === undefined || newDepth > existingDepth) {
459
+ depths.set(childId, newDepth);
460
+ queue.push(childId);
461
+ }
462
+ }
463
+ }
464
+ // Handle disconnected nodes (no edges)
465
+ for (const node of canvas.nodes) {
466
+ if (!depths.has(node.id)) {
467
+ depths.set(node.id, 0);
468
+ }
469
+ }
470
+ return depths;
471
+ }
472
+ /**
473
+ * Calculate Y positions for workstream lanes.
474
+ */
475
+ calculateWorkstreamLanes(nodesByWorkstream, config) {
476
+ const lanes = new Map();
477
+ let currentY = config.startY;
478
+ // Sort workstreams for consistent ordering
479
+ const workstreams = Array.from(nodesByWorkstream.keys()).sort();
480
+ for (const workstream of workstreams) {
481
+ const nodes = nodesByWorkstream.get(workstream);
482
+ // Calculate lane height based on max nodes at any depth
483
+ const maxNodesInColumn = this.getMaxNodesInColumn(nodes);
484
+ const nodeHeight = DEFAULT_DIMENSIONS.default.height;
485
+ const laneHeight = config.lanePadding * 2 +
486
+ maxNodesInColumn * (nodeHeight + config.itemSpacing);
487
+ lanes.set(workstream, {
488
+ name: workstream,
489
+ yStart: currentY,
490
+ });
491
+ currentY += laneHeight + config.itemSpacing;
492
+ }
493
+ return lanes;
494
+ }
495
+ /**
496
+ * Get the maximum number of nodes in any single column (depth level).
497
+ */
498
+ getMaxNodesInColumn(nodes) {
499
+ // This is a simplified calculation - in practice we'd need the depth info
500
+ // For now, estimate based on total nodes
501
+ return Math.min(nodes.length, 5);
502
+ }
503
+ // ---------------------------------------------------------------------------
504
+ // Helper Methods
505
+ // ---------------------------------------------------------------------------
506
+ calculateNextPosition(canvas) {
507
+ // Simple grid layout: find rightmost node and place next to it
508
+ if (canvas.nodes.length === 0) {
509
+ return { x: 0, y: 0 };
510
+ }
511
+ const fileNodes = canvas.nodes.filter(n => n.type === 'file');
512
+ if (fileNodes.length === 0) {
513
+ return { x: 0, y: 0 };
514
+ }
515
+ // Find the rightmost node
516
+ let maxX = -Infinity;
517
+ let maxXNode = null;
518
+ for (const node of fileNodes) {
519
+ if (node.x > maxX) {
520
+ maxX = node.x;
521
+ maxXNode = node;
522
+ }
523
+ }
524
+ if (!maxXNode) {
525
+ return { x: 0, y: 0 };
526
+ }
527
+ // Place new node to the right with some padding
528
+ return {
529
+ x: maxXNode.x + (maxXNode.width || 400) + 50,
530
+ y: maxXNode.y,
531
+ };
532
+ }
533
+ /**
534
+ * Get dimensions for a specific entity type.
535
+ */
536
+ getDimensionsForType(entityType) {
537
+ return DEFAULT_DIMENSIONS[entityType] || DEFAULT_DIMENSIONS.default;
538
+ }
539
+ }
540
+ //# sourceMappingURL=canvas-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-manager.js","sourceRoot":"","sources":["../../../src/services/v2/canvas-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for V2 Canvas Manager
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=canvas-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-manager.test.d.ts","sourceRoot":"","sources":["../../../src/services/v2/canvas-manager.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}