obsidian-accomplishments-mcp 0.1.9 → 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 -271
  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 -293
  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 -26
  219. package/dist/tools/get-accomplishment.d.ts.map +0 -1
  220. package/dist/tools/get-accomplishment.js +0 -53
  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 -34
  243. package/dist/tools/list-accomplishments.d.ts.map +0 -1
  244. package/dist/tools/list-accomplishments.js +0 -34
  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,281 @@
1
+ /**
2
+ * V2 Archive Manager
3
+ *
4
+ * Handles archive and restore operations for entities.
5
+ * Archives are organized by entity type in a flat structure: archive/{type}/
6
+ * Supports reading from legacy quarter-based structure for backwards compatibility.
7
+ */
8
+ // =============================================================================
9
+ // Archive Manager Class
10
+ // =============================================================================
11
+ /**
12
+ * Manages entity archival and restoration.
13
+ */
14
+ export class ArchiveManager {
15
+ basePath;
16
+ // Callbacks for external dependencies
17
+ getEntity = () => undefined;
18
+ getChildren = () => [];
19
+ moveFile = async () => { };
20
+ getEntityPath = () => undefined;
21
+ constructor(basePath) {
22
+ this.basePath = basePath;
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Configuration
26
+ // ---------------------------------------------------------------------------
27
+ setEntityCallback(fn) {
28
+ this.getEntity = fn;
29
+ }
30
+ setChildrenCallback(fn) {
31
+ this.getChildren = fn;
32
+ }
33
+ setMoveFileCallback(fn) {
34
+ this.moveFile = fn;
35
+ }
36
+ setEntityPathCallback(fn) {
37
+ this.getEntityPath = fn;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Archive Operations
41
+ // ---------------------------------------------------------------------------
42
+ /** Archive a milestone and all its children */
43
+ async archiveMilestone(milestoneId) {
44
+ const milestone = this.getEntity(milestoneId);
45
+ if (!milestone || milestone.type !== 'milestone') {
46
+ throw new Error(`Milestone not found: ${milestoneId}`);
47
+ }
48
+ if (milestone.status !== 'Completed') {
49
+ throw new Error(`Cannot archive incomplete milestone: ${milestoneId}`);
50
+ }
51
+ const archived = [];
52
+ const timestamp = new Date().toISOString();
53
+ // Archive stories and their tasks (each to their type-specific archive folder)
54
+ const stories = this.getChildren(milestoneId, 'story');
55
+ for (const story of stories) {
56
+ const tasks = this.getChildren(story.id, 'task');
57
+ for (const task of tasks) {
58
+ await this.archiveEntity(task.id);
59
+ archived.push(task.id);
60
+ }
61
+ await this.archiveEntity(story.id);
62
+ archived.push(story.id);
63
+ }
64
+ // Archive related decisions and documents
65
+ const decisions = this.getChildren(milestoneId, 'decision');
66
+ for (const decision of decisions) {
67
+ await this.archiveEntity(decision.id);
68
+ archived.push(decision.id);
69
+ }
70
+ const documents = this.getChildren(milestoneId, 'document');
71
+ for (const doc of documents) {
72
+ await this.archiveEntity(doc.id);
73
+ archived.push(doc.id);
74
+ }
75
+ // Archive the milestone itself
76
+ await this.archiveEntity(milestoneId);
77
+ archived.push(milestoneId);
78
+ // Return the milestone archive path as the primary path
79
+ const archivePath = this.getArchivePathForType('milestone');
80
+ return {
81
+ archived_entities: archived,
82
+ archive_path: archivePath,
83
+ timestamp,
84
+ };
85
+ }
86
+ /** Archive a single entity to the flat archive structure: archive/{type}/ */
87
+ async archiveEntity(entityId, archivePath) {
88
+ const entity = this.getEntity(entityId);
89
+ if (!entity) {
90
+ throw new Error(`Entity not found: ${entityId}`);
91
+ }
92
+ const originalPath = this.getEntityPath(entityId);
93
+ if (!originalPath) {
94
+ throw new Error(`Entity path not found: ${entityId}`);
95
+ }
96
+ // Use flat archive structure: archive/{type}/
97
+ const targetPath = archivePath || this.getArchivePathForType(entity.type);
98
+ const newPath = `${targetPath}/${this.getFilename(entity)}`;
99
+ await this.moveFile(originalPath, newPath);
100
+ return {
101
+ entity_id: entityId,
102
+ entity_type: entity.type,
103
+ archived_at: new Date().toISOString(),
104
+ archive_path: newPath,
105
+ original_path: originalPath,
106
+ };
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Restore Operations
110
+ // ---------------------------------------------------------------------------
111
+ /** Restore an entity from archive */
112
+ async restoreFromArchive(entityId, archivePath) {
113
+ const entity = this.getEntity(entityId);
114
+ if (!entity) {
115
+ throw new Error(`Entity not found in archive: ${entityId}`);
116
+ }
117
+ const restored = [];
118
+ const timestamp = new Date().toISOString();
119
+ // Determine restore path based on entity type
120
+ const restorePath = this.getRestorePath(entity);
121
+ // If milestone, restore all children first
122
+ if (entity.type === 'milestone') {
123
+ const stories = this.getChildren(entityId, 'story');
124
+ for (const story of stories) {
125
+ const tasks = this.getChildren(story.id, 'task');
126
+ for (const task of tasks) {
127
+ await this.restoreEntity(task.id, archivePath);
128
+ restored.push(task.id);
129
+ }
130
+ await this.restoreEntity(story.id, archivePath);
131
+ restored.push(story.id);
132
+ }
133
+ }
134
+ // Restore the entity itself
135
+ await this.restoreEntity(entityId, archivePath);
136
+ restored.push(entityId);
137
+ return {
138
+ restored_entities: restored,
139
+ restore_path: restorePath,
140
+ timestamp,
141
+ };
142
+ }
143
+ /** Restore a single entity */
144
+ async restoreEntity(entityId, archivePath) {
145
+ const entity = this.getEntity(entityId);
146
+ if (!entity) {
147
+ throw new Error(`Entity not found: ${entityId}`);
148
+ }
149
+ const currentPath = `${archivePath}/${this.getFilename(entity)}`;
150
+ const restorePath = this.getRestorePath(entity);
151
+ const newPath = `${restorePath}/${this.getFilename(entity)}`;
152
+ await this.moveFile(currentPath, newPath);
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Helper Methods
156
+ // ---------------------------------------------------------------------------
157
+ /**
158
+ * Get archive path for entity type using flat structure: archive/{type}/
159
+ * This is the new archive structure aligned with the Canvas Project Manager Plugin.
160
+ */
161
+ getArchivePathForType(type) {
162
+ return `${this.basePath}/archive/${type}`;
163
+ }
164
+ /**
165
+ * @deprecated Use getArchivePathForType instead.
166
+ * Get current quarter string (e.g., "2024-Q1") - kept for backwards compatibility
167
+ */
168
+ getQuarter(date) {
169
+ const year = date.getFullYear();
170
+ const quarter = Math.ceil((date.getMonth() + 1) / 3);
171
+ return `${year}-Q${quarter}`;
172
+ }
173
+ /**
174
+ * @deprecated Use getArchivePathForType instead.
175
+ * Get archive path for a quarter and optional milestone - kept for backwards compatibility
176
+ */
177
+ getLegacyArchivePath(quarter, milestoneId) {
178
+ const base = `${this.basePath}/archive/${quarter}`;
179
+ return milestoneId ? `${base}/${milestoneId}` : base;
180
+ }
181
+ /** Get restore path for an entity */
182
+ getRestorePath(entity) {
183
+ switch (entity.type) {
184
+ case 'milestone':
185
+ return `${this.basePath}/milestones`;
186
+ case 'story':
187
+ return `${this.basePath}/stories`;
188
+ case 'task':
189
+ return `${this.basePath}/tasks`;
190
+ case 'decision':
191
+ return `${this.basePath}/decisions`;
192
+ case 'document':
193
+ return `${this.basePath}/documents`;
194
+ case 'feature':
195
+ return `${this.basePath}/features`;
196
+ }
197
+ }
198
+ /**
199
+ * Try to find an entity in the archive, checking both new flat structure
200
+ * and legacy quarter-based structure for backwards compatibility.
201
+ */
202
+ findInArchive(entityId, entityType) {
203
+ // First check new flat structure: archive/{type}/
204
+ const flatPath = `${this.getArchivePathForType(entityType)}`;
205
+ // If not found, check legacy quarter-based structure
206
+ // This would require file system scanning which is handled by the caller
207
+ // Return the flat path as the primary location
208
+ return flatPath;
209
+ }
210
+ /** Get filename for an entity */
211
+ getFilename(entity) {
212
+ const sanitizedTitle = entity.title
213
+ .toLowerCase()
214
+ .replace(/[^a-z0-9]+/g, '-')
215
+ .replace(/^-|-$/g, '');
216
+ return `${entity.id}-${sanitizedTitle}.md`;
217
+ }
218
+ /** Check if an entity is eligible for archival */
219
+ canArchive(entity) {
220
+ switch (entity.type) {
221
+ case 'milestone':
222
+ if (entity.status !== 'Completed') {
223
+ return { eligible: false, reason: 'Milestone must be completed' };
224
+ }
225
+ break;
226
+ case 'story':
227
+ if (entity.status !== 'Completed') {
228
+ return { eligible: false, reason: 'Story must be completed' };
229
+ }
230
+ break;
231
+ case 'task':
232
+ if (entity.status !== 'Completed') {
233
+ return { eligible: false, reason: 'Task must be completed' };
234
+ }
235
+ break;
236
+ case 'decision':
237
+ if (entity.status !== 'Decided' && entity.status !== 'Superseded') {
238
+ return { eligible: false, reason: 'Decision must be decided or superseded' };
239
+ }
240
+ break;
241
+ case 'document':
242
+ if (entity.status !== 'Approved' && entity.status !== 'Superseded') {
243
+ return { eligible: false, reason: 'Document must be approved or superseded' };
244
+ }
245
+ break;
246
+ }
247
+ return { eligible: true };
248
+ }
249
+ /**
250
+ * @deprecated Use getArchivedEntitiesByType instead.
251
+ * List archived entities for a quarter (legacy structure)
252
+ */
253
+ getArchivedEntities(_quarter) {
254
+ // This would be implemented with actual file system scanning
255
+ // For now, return empty array as placeholder
256
+ return [];
257
+ }
258
+ /**
259
+ * List archived entities by type from the flat archive structure.
260
+ * This is the preferred method for the new archive structure.
261
+ */
262
+ getArchivedEntitiesByType(_type) {
263
+ // This would be implemented with actual file system scanning
264
+ // For now, return empty array as placeholder
265
+ return [];
266
+ }
267
+ /**
268
+ * Get all possible archive paths for an entity (both new and legacy structures).
269
+ * Useful for finding entities that may have been archived with either structure.
270
+ */
271
+ getPossibleArchivePaths(entityId, entityType) {
272
+ const paths = [];
273
+ // New flat structure: archive/{type}/
274
+ paths.push(this.getArchivePathForType(entityType));
275
+ // Legacy quarter-based structure: archive/{quarter}/ and archive/{quarter}/{milestone}/
276
+ // Would need to scan for existing quarters
277
+ // For now, just return the flat path
278
+ return paths;
279
+ }
280
+ }
281
+ //# sourceMappingURL=archive-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-manager.js","sourceRoot":"","sources":["../../../src/services/v2/archive-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmCH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,QAAQ,CAAS;IAEzB,sCAAsC;IAC9B,SAAS,GAAyC,GAAG,EAAE,CAAC,SAAS,CAAC;IAClE,WAAW,GAAkD,GAAG,EAAE,CAAC,EAAE,CAAC;IACtE,QAAQ,GAAgD,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACvE,aAAa,GAAyC,GAAG,EAAE,CAAC,SAAS,CAAC;IAE9E,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;IAChB,8EAA8E;IAE9E,iBAAiB,CAAC,EAAwC;QACxD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,EAAiD;QACnE,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,mBAAmB,CAAC,EAA+C;QACjE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,qBAAqB,CAAC,EAAwC;QAC5D,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E,+CAA+C;IAC/C,KAAK,CAAC,gBAAgB,CAAC,WAAqB;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,wCAAwC,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,+EAA+E;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,0CAA0C;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC5D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,+BAA+B;QAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3B,wDAAwD;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAE5D,OAAO;YACL,iBAAiB,EAAE,QAAQ;YAC3B,YAAY,EAAE,WAAW;YACzB,SAAS;SACV,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,aAAa,CAAC,QAAkB,EAAE,WAAoB;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,8CAA8C;QAC9C,MAAM,UAAU,GAAG,WAAW,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAE5D,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE3C,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,YAAY;SAC5B,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E,qCAAqC;IACrC,KAAK,CAAC,kBAAkB,CAAC,QAAkB,EAAE,WAAmB;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,8CAA8C;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAEhD,2CAA2C;QAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExB,OAAO;YACL,iBAAiB,EAAE,QAAQ;YAC3B,YAAY,EAAE,WAAW;YACzB,SAAS;SACV,CAAC;IACJ,CAAC;IAED,8BAA8B;IACtB,KAAK,CAAC,aAAa,CAAC,QAAkB,EAAE,WAAmB;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QAE7D,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,8EAA8E;IAC9E,iBAAiB;IACjB,8EAA8E;IAE9E;;;OAGG;IACK,qBAAqB,CAAC,IAAgB;QAC5C,OAAO,GAAG,IAAI,CAAC,QAAQ,YAAY,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACK,UAAU,CAAC,IAAU;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,OAAe,EAAE,WAAsB;QAClE,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,YAAY,OAAO,EAAE,CAAC;QACnD,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,qCAAqC;IAC7B,cAAc,CAAC,MAAc;QACnC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,WAAW;gBACd,OAAO,GAAG,IAAI,CAAC,QAAQ,aAAa,CAAC;YACvC,KAAK,OAAO;gBACV,OAAO,GAAG,IAAI,CAAC,QAAQ,UAAU,CAAC;YACpC,KAAK,MAAM;gBACT,OAAO,GAAG,IAAI,CAAC,QAAQ,QAAQ,CAAC;YAClC,KAAK,UAAU;gBACb,OAAO,GAAG,IAAI,CAAC,QAAQ,YAAY,CAAC;YACtC,KAAK,UAAU;gBACb,OAAO,GAAG,IAAI,CAAC,QAAQ,YAAY,CAAC;YACtC,KAAK,SAAS;gBACZ,OAAO,GAAG,IAAI,CAAC,QAAQ,WAAW,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,QAAkB,EAAE,UAAsB;QACtD,kDAAkD;QAClD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE7D,qDAAqD;QACrD,yEAAyE;QACzE,+CAA+C;QAC/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iCAAiC;IACzB,WAAW,CAAC,MAAc;QAChC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK;aAChC,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,GAAG,MAAM,CAAC,EAAE,IAAI,cAAc,KAAK,CAAC;IAC7C,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,MAAc;QACvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,WAAW;gBACd,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;gBACpE,CAAC;gBACD,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;gBAChE,CAAC;gBACD,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;gBAC/D,CAAC;gBACD,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;oBAClE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;gBAC/E,CAAC;gBACD,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;oBACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;gBAChF,CAAC;gBACD,MAAM;QACV,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,QAAgB;QAClC,6DAA6D;QAC7D,6CAA6C;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,yBAAyB,CAAC,KAAiB;QACzC,6DAA6D;QAC7D,6CAA6C;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,QAAkB,EAAE,UAAsB;QAChE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,sCAAsC;QACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;QAEnD,wFAAwF;QACxF,2CAA2C;QAC3C,qCAAqC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,155 @@
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 type { EntityId, CanvasNode, CanvasPath, VaultPath } from '../../models/v2-types.js';
12
+ export interface Position {
13
+ x: number;
14
+ y: number;
15
+ }
16
+ export interface NodeDimensions {
17
+ width: number;
18
+ height: number;
19
+ }
20
+ export type CanvasOperation = {
21
+ type: 'add_node';
22
+ filePath: string;
23
+ position?: Position;
24
+ dimensions?: NodeDimensions;
25
+ } | {
26
+ type: 'remove_node';
27
+ filePath: string;
28
+ } | {
29
+ type: 'update_node_path';
30
+ oldPath: string;
31
+ newPath: string;
32
+ } | {
33
+ type: 'add_edge';
34
+ fromFilePath: string;
35
+ toFilePath: string;
36
+ } | {
37
+ type: 'remove_edge';
38
+ fromFilePath: string;
39
+ toFilePath: string;
40
+ };
41
+ export interface BatchResult {
42
+ success: boolean;
43
+ nodesAdded: number;
44
+ nodesRemoved: number;
45
+ nodesUpdated: number;
46
+ edgesAdded: number;
47
+ edgesRemoved: number;
48
+ errors: string[];
49
+ }
50
+ export interface LayoutConfig {
51
+ /** Horizontal spacing between dependency stages */
52
+ stageSpacing: number;
53
+ /** Vertical spacing between items in same lane */
54
+ itemSpacing: number;
55
+ /** Padding around lanes */
56
+ lanePadding: number;
57
+ /** Starting X position */
58
+ startX: number;
59
+ /** Starting Y position */
60
+ startY: number;
61
+ }
62
+ export interface WorkstreamLane {
63
+ name: string;
64
+ yStart: number;
65
+ }
66
+ export interface LayoutResult {
67
+ success: boolean;
68
+ nodesRepositioned: number;
69
+ errors: string[];
70
+ }
71
+ export declare class CanvasManager {
72
+ private vaultPath;
73
+ private defaultCanvas;
74
+ private entityPathResolver;
75
+ constructor(vaultPath: string, defaultCanvas: string, entityPathResolver: (entityId: EntityId) => Promise<VaultPath | null>);
76
+ private readCanvas;
77
+ private writeCanvas;
78
+ private findNodeByFile;
79
+ private generateNodeId;
80
+ private generateEdgeId;
81
+ /**
82
+ * Add a node to canvas for an entity file.
83
+ * Returns the node ID if successful.
84
+ */
85
+ addNode(filePath: VaultPath, canvasPath?: CanvasPath, position?: Position, dimensions?: NodeDimensions): Promise<string | null>;
86
+ /**
87
+ * Remove a node from canvas by file path.
88
+ * Also removes any edges connected to the node.
89
+ */
90
+ removeNode(filePath: VaultPath, canvasPath?: CanvasPath): Promise<boolean>;
91
+ /**
92
+ * Update a node's file path (used when files are moved/renamed).
93
+ */
94
+ updateNodePath(oldPath: VaultPath, newPath: VaultPath, canvasPath?: CanvasPath): Promise<boolean>;
95
+ /**
96
+ * Add an edge between two nodes (for dependencies).
97
+ * Returns the edge ID if successful.
98
+ */
99
+ addEdge(fromFilePath: VaultPath, toFilePath: VaultPath, canvasPath?: CanvasPath): Promise<string | null>;
100
+ /**
101
+ * Remove an edge between two nodes.
102
+ */
103
+ removeEdge(fromFilePath: VaultPath, toFilePath: VaultPath, canvasPath?: CanvasPath): Promise<boolean>;
104
+ /**
105
+ * Apply multiple operations atomically (single read/write).
106
+ */
107
+ batchUpdate(operations: CanvasOperation[], canvasPath?: CanvasPath): Promise<BatchResult>;
108
+ /**
109
+ * Get a node by entity file path.
110
+ */
111
+ getNodeByFilePath(filePath: VaultPath, canvasPath?: CanvasPath): Promise<CanvasNode | null>;
112
+ /**
113
+ * Get all file nodes from canvas.
114
+ */
115
+ getAllFileNodes(canvasPath?: CanvasPath): Promise<CanvasNode[]>;
116
+ /**
117
+ * Check if canvas file exists.
118
+ */
119
+ canvasExists(canvasPath?: CanvasPath): Promise<boolean>;
120
+ /**
121
+ * Auto-layout canvas nodes using dependency-driven horizontal flow with workstream lanes.
122
+ *
123
+ * Strategy:
124
+ * - X position = topological order (distance from root nodes based on edges)
125
+ * - Y position = workstream lane
126
+ *
127
+ * @param entityMetadataResolver - Function to get entity metadata (workstream, type) from file path
128
+ * @param canvasPath - Optional canvas path (uses default if not specified)
129
+ * @param config - Optional layout configuration
130
+ */
131
+ autoLayout(entityMetadataResolver: (filePath: string) => Promise<{
132
+ workstream?: string;
133
+ entityType?: string;
134
+ } | null>, canvasPath?: CanvasPath, config?: Partial<LayoutConfig>): Promise<LayoutResult>;
135
+ /**
136
+ * Calculate the topological depth of each node based on edges.
137
+ * Nodes with no incoming edges have depth 0.
138
+ * Depth = max(depth of all predecessors) + 1
139
+ */
140
+ private calculateNodeDepths;
141
+ /**
142
+ * Calculate Y positions for workstream lanes.
143
+ */
144
+ private calculateWorkstreamLanes;
145
+ /**
146
+ * Get the maximum number of nodes in any single column (depth level).
147
+ */
148
+ private getMaxNodesInColumn;
149
+ private calculateNextPosition;
150
+ /**
151
+ * Get dimensions for a specific entity type.
152
+ */
153
+ getDimensionsForType(entityType: string): NodeDimensions;
154
+ }
155
+ //# sourceMappingURL=canvas-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-manager.d.ts","sourceRoot":"","sources":["../../../src/services/v2/canvas-manager.ts"],"names":[],"mappings":"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"}