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,637 @@
1
+ /**
2
+ * Tests for V2 Entity Parser
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { EntityParser } from './entity-parser.js';
6
+ import { ValidationError } from '../../models/v2-types.js';
7
+ describe('EntityParser', () => {
8
+ const parser = new EntityParser();
9
+ describe('Frontmatter Extraction', () => {
10
+ it('should parse basic frontmatter', () => {
11
+ const content = `---
12
+ id: M-001
13
+ title: Test Milestone
14
+ workstream: engineering
15
+ status: In Progress
16
+ ---
17
+ # Content here`;
18
+ const result = parser.parse(content, '/vault/M-001.md');
19
+ expect(result.entity.id).toBe('M-001');
20
+ expect(result.entity.title).toBe('Test Milestone');
21
+ expect(result.entity.workstream).toBe('engineering');
22
+ });
23
+ it('should throw error when ID is missing from frontmatter', () => {
24
+ const content = `---
25
+ title: Test
26
+ workstream: engineering
27
+ status: In Progress
28
+ ---
29
+ # Just content`;
30
+ // ID must be in frontmatter - filenames no longer contain IDs
31
+ expect(() => parser.parse(content, '/vault/milestones/Test.md'))
32
+ .toThrow('Entity ID not found in frontmatter or filename');
33
+ });
34
+ it('should parse arrays in frontmatter', () => {
35
+ const content = `---
36
+ id: M-001
37
+ title: Test
38
+ workstream: engineering
39
+ status: In Progress
40
+ depends_on:
41
+ - M-002
42
+ - M-003
43
+ ---
44
+ Content`;
45
+ const result = parser.parse(content, '/vault/M-001.md');
46
+ const milestone = result.entity;
47
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
48
+ });
49
+ it('should handle content without frontmatter', () => {
50
+ const content = `# Just a title
51
+
52
+ Some content without frontmatter`;
53
+ // Should throw because no ID can be extracted
54
+ expect(() => parser.parse(content, '/vault/random.md')).toThrow(ValidationError);
55
+ });
56
+ it('should handle empty frontmatter arrays', () => {
57
+ const content = `---
58
+ id: M-001
59
+ title: Test
60
+ workstream: engineering
61
+ status: In Progress
62
+ depends_on: []
63
+ ---
64
+ Content`;
65
+ const result = parser.parse(content, '/vault/M-001.md');
66
+ const milestone = result.entity;
67
+ expect(milestone.depends_on).toEqual([]);
68
+ });
69
+ it('should skip comments in frontmatter', () => {
70
+ const content = `---
71
+ id: M-001
72
+ # This is a comment
73
+ title: Test
74
+ workstream: engineering
75
+ status: In Progress
76
+ ---
77
+ Content`;
78
+ const result = parser.parse(content, '/vault/M-001.md');
79
+ expect(result.entity.title).toBe('Test');
80
+ });
81
+ it('should parse inline arrays', () => {
82
+ const content = `---
83
+ id: M-001
84
+ title: Test
85
+ workstream: engineering
86
+ status: In Progress
87
+ depends_on: [M-002, M-003]
88
+ ---
89
+ Content`;
90
+ const result = parser.parse(content, '/vault/M-001.md');
91
+ const milestone = result.entity;
92
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
93
+ });
94
+ it('should parse quoted values', () => {
95
+ const content = `---
96
+ id: M-001
97
+ title: "Test with quotes"
98
+ workstream: 'engineering'
99
+ status: In Progress
100
+ ---
101
+ Content`;
102
+ const result = parser.parse(content, '/vault/M-001.md');
103
+ expect(result.entity.title).toBe('Test with quotes');
104
+ expect(result.entity.workstream).toBe('engineering');
105
+ });
106
+ it('should parse boolean values', () => {
107
+ const content = `---
108
+ id: M-001
109
+ title: Test
110
+ workstream: engineering
111
+ status: In Progress
112
+ archived: true
113
+ ---
114
+ Content`;
115
+ const result = parser.parse(content, '/vault/M-001.md');
116
+ expect(result.entity.archived).toBe(true);
117
+ });
118
+ it('should parse null values', () => {
119
+ const content = `---
120
+ id: M-001
121
+ title: Test
122
+ workstream: engineering
123
+ status: In Progress
124
+ owner: null
125
+ ---
126
+ Content`;
127
+ const result = parser.parse(content, '/vault/M-001.md');
128
+ const milestone = result.entity;
129
+ expect(milestone.owner).toBeNull();
130
+ });
131
+ it('should parse tilde as null', () => {
132
+ const content = `---
133
+ id: M-001
134
+ title: Test
135
+ workstream: engineering
136
+ status: In Progress
137
+ owner: ~
138
+ ---
139
+ Content`;
140
+ const result = parser.parse(content, '/vault/M-001.md');
141
+ const milestone = result.entity;
142
+ expect(milestone.owner).toBeNull();
143
+ });
144
+ it('should parse numeric values', () => {
145
+ const content = `---
146
+ id: T-001
147
+ title: Test Task
148
+ workstream: engineering
149
+ status: In Progress
150
+ parent: S-001
151
+ goal: Test goal
152
+ estimate_hrs: 4.5
153
+ actual_hrs: 2
154
+ ---
155
+ Content`;
156
+ const result = parser.parse(content, '/vault/T-001.md');
157
+ const task = result.entity;
158
+ expect(task.estimate_hrs).toBe(4.5);
159
+ expect(task.actual_hrs).toBe(2);
160
+ });
161
+ it('should handle corrupted inline arrays with valid IDs', () => {
162
+ const content = `---
163
+ id: M-001
164
+ title: Test
165
+ workstream: engineering
166
+ status: In Progress
167
+ depends_on: [M-002, invalid, M-003]
168
+ ---
169
+ Content`;
170
+ const result = parser.parse(content, '/vault/M-001.md');
171
+ const milestone = result.entity;
172
+ // Should extract only valid IDs
173
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
174
+ });
175
+ it('should extract valid IDs from corrupted elements', () => {
176
+ const content = `---
177
+ id: M-001
178
+ title: Test
179
+ workstream: engineering
180
+ status: In Progress
181
+ depends_on: [corruptedM-002text, M-003]
182
+ ---
183
+ Content`;
184
+ const result = parser.parse(content, '/vault/M-001.md');
185
+ const milestone = result.entity;
186
+ // Should extract M-002 from corrupted element
187
+ expect(milestone.depends_on).toContain('M-002');
188
+ expect(milestone.depends_on).toContain('M-003');
189
+ });
190
+ it('should remove duplicate IDs from arrays', () => {
191
+ const content = `---
192
+ id: M-001
193
+ title: Test
194
+ workstream: engineering
195
+ status: In Progress
196
+ depends_on: [M-002, M-002, M-003]
197
+ ---
198
+ Content`;
199
+ const result = parser.parse(content, '/vault/M-001.md');
200
+ const milestone = result.entity;
201
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
202
+ });
203
+ });
204
+ describe('Milestone Parsing', () => {
205
+ it('should parse a complete milestone', () => {
206
+ const content = `---
207
+ id: M-001
208
+ title: Q1 Release
209
+ workstream: engineering
210
+ status: In Progress
211
+ archived: false
212
+ created: 2024-01-01
213
+ modified: 2024-01-15
214
+ target_date: 2024-03-31
215
+ owner: john
216
+ priority: High
217
+ canvas_source: /vault/canvas.canvas
218
+ ---
219
+ # Q1 Release
220
+
221
+ This is the milestone content.`;
222
+ const result = parser.parse(content, '/vault/milestones/M-001.md');
223
+ const milestone = result.entity;
224
+ expect(milestone.type).toBe('milestone');
225
+ expect(milestone.id).toBe('M-001');
226
+ expect(milestone.title).toBe('Q1 Release');
227
+ expect(milestone.target_date).toBe('2024-03-31');
228
+ expect(milestone.owner).toBe('john');
229
+ expect(milestone.priority).toBe('High');
230
+ });
231
+ });
232
+ describe('Story Parsing', () => {
233
+ it('should parse a complete story', () => {
234
+ const content = `---
235
+ id: S-001
236
+ title: User Authentication
237
+ workstream: engineering
238
+ status: In Progress
239
+ parent: M-001
240
+ priority: High
241
+ ---
242
+ # User Authentication
243
+
244
+ Story content here.`;
245
+ const result = parser.parse(content, '/vault/stories/S-001.md');
246
+ const story = result.entity;
247
+ expect(story.type).toBe('story');
248
+ expect(story.id).toBe('S-001');
249
+ expect(story.parent).toBe('M-001');
250
+ expect(story.workstream).toBe('engineering');
251
+ expect(story.priority).toBe('High');
252
+ });
253
+ });
254
+ describe('Task Parsing', () => {
255
+ it('should parse a complete task', () => {
256
+ const content = `---
257
+ id: T-001
258
+ title: Implement login form
259
+ workstream: engineering
260
+ status: In Progress
261
+ parent: S-001
262
+ goal: Create the login form UI
263
+ estimate_hrs: 4
264
+ actual_hrs: 2
265
+ assignee: jane
266
+ ---
267
+ # Implement login form
268
+
269
+ Task details.`;
270
+ const result = parser.parse(content, '/vault/tasks/T-001.md');
271
+ const task = result.entity;
272
+ expect(task.type).toBe('task');
273
+ expect(task.id).toBe('T-001');
274
+ expect(task.parent).toBe('S-001');
275
+ expect(task.goal).toBe('Create the login form UI');
276
+ expect(task.estimate_hrs).toBe(4);
277
+ expect(task.actual_hrs).toBe(2);
278
+ expect(task.assignee).toBe('jane');
279
+ });
280
+ });
281
+ describe('Decision Parsing', () => {
282
+ it('should parse a complete decision', () => {
283
+ const content = `---
284
+ id: DEC-001
285
+ title: Use React for frontend
286
+ workstream: engineering
287
+ status: Decided
288
+ context: Need to choose a frontend framework
289
+ decision: Use React
290
+ rationale: Team expertise and ecosystem
291
+ decided_by: tech-lead
292
+ decided_on: 2024-01-10
293
+ ---
294
+ # Use React for frontend
295
+
296
+ Decision details.`;
297
+ const result = parser.parse(content, '/vault/decisions/DEC-001.md');
298
+ const decision = result.entity;
299
+ expect(decision.type).toBe('decision');
300
+ expect(decision.id).toBe('DEC-001');
301
+ expect(decision.context).toBe('Need to choose a frontend framework');
302
+ expect(decision.decision).toBe('Use React');
303
+ expect(decision.decided_by).toBe('tech-lead');
304
+ });
305
+ it('should parse decision with supersedes field', () => {
306
+ const content = `---
307
+ id: DEC-002
308
+ title: Switch to Vue
309
+ workstream: engineering
310
+ status: Decided
311
+ supersedes: DEC-001
312
+ ---
313
+ # Switch to Vue`;
314
+ const result = parser.parse(content, '/vault/decisions/DEC-002.md');
315
+ const decision = result.entity;
316
+ expect(decision.supersedes).toBe('DEC-001');
317
+ });
318
+ it('should parse decision with affects array', () => {
319
+ const content = `---
320
+ id: DEC-001
321
+ title: Use React
322
+ workstream: engineering
323
+ status: Decided
324
+ affects:
325
+ - DOC-001
326
+ - S-001
327
+ ---
328
+ # Use React`;
329
+ const result = parser.parse(content, '/vault/decisions/DEC-001.md');
330
+ const decision = result.entity;
331
+ expect(decision.affects).toEqual(['DOC-001', 'S-001']);
332
+ });
333
+ it('should migrate legacy blocks field to affects', () => {
334
+ const content = `---
335
+ id: DEC-001
336
+ title: Use React
337
+ workstream: engineering
338
+ status: Decided
339
+ blocks:
340
+ - DOC-001
341
+ - S-001
342
+ ---
343
+ # Use React`;
344
+ const result = parser.parse(content, '/vault/decisions/DEC-001.md');
345
+ const decision = result.entity;
346
+ // Legacy blocks should be migrated to affects
347
+ expect(decision.affects).toEqual(['DOC-001', 'S-001']);
348
+ });
349
+ });
350
+ describe('Document Parsing', () => {
351
+ it('should parse a complete document', () => {
352
+ const content = `---
353
+ id: DOC-001
354
+ title: API Specification
355
+ workstream: engineering
356
+ status: Draft
357
+ doc_type: spec
358
+ version: 1.0.0
359
+ ---
360
+ # API Specification
361
+
362
+ ## Overview
363
+ This document describes the API.
364
+
365
+ ## Endpoints
366
+ - GET /users
367
+ - POST /users`;
368
+ const result = parser.parse(content, '/vault/documents/DOC-001.md');
369
+ const doc = result.entity;
370
+ expect(doc.type).toBe('document');
371
+ expect(doc.id).toBe('DOC-001');
372
+ expect(doc.doc_type).toBe('spec');
373
+ expect(doc.version).toBe('1.0.0');
374
+ });
375
+ it('should parse document with previous_versions array', () => {
376
+ const content = `---
377
+ id: DOC-003
378
+ title: API Spec v3
379
+ workstream: engineering
380
+ status: Draft
381
+ doc_type: spec
382
+ previous_version:
383
+ - DOC-001
384
+ - DOC-002
385
+ ---
386
+ # API Spec v3`;
387
+ const result = parser.parse(content, '/vault/documents/DOC-003.md');
388
+ const doc = result.entity;
389
+ expect(doc.previous_version).toEqual(['DOC-001', 'DOC-002']);
390
+ });
391
+ it('should parse document with implemented_by array', () => {
392
+ const content = `---
393
+ id: DOC-001
394
+ title: API Spec
395
+ workstream: engineering
396
+ status: Draft
397
+ doc_type: spec
398
+ implemented_by:
399
+ - S-001
400
+ - T-001
401
+ ---
402
+ # API Spec`;
403
+ const result = parser.parse(content, '/vault/documents/DOC-001.md');
404
+ const doc = result.entity;
405
+ expect(doc.implemented_by).toEqual(['S-001', 'T-001']);
406
+ });
407
+ it('should parse document with version field', () => {
408
+ const content = `---
409
+ id: DOC-001
410
+ title: API Spec
411
+ workstream: engineering
412
+ status: Draft
413
+ doc_type: spec
414
+ version: "2.0.0"
415
+ ---
416
+ # API Spec`;
417
+ const result = parser.parse(content, '/vault/documents/DOC-001.md');
418
+ const doc = result.entity;
419
+ expect(doc.version).toBe('2.0.0');
420
+ });
421
+ });
422
+ describe('Error Handling', () => {
423
+ it('should throw ValidationError for missing ID', () => {
424
+ const content = `---
425
+ title: Test
426
+ workstream: engineering
427
+ status: In Progress
428
+ ---
429
+ Content`;
430
+ expect(() => parser.parse(content, '/vault/random.md')).toThrow(ValidationError);
431
+ });
432
+ it('should throw ValidationError for invalid ID format', () => {
433
+ const content = `---
434
+ id: INVALID-001
435
+ title: Test
436
+ workstream: engineering
437
+ status: In Progress
438
+ ---
439
+ Content`;
440
+ expect(() => parser.parse(content, '/vault/INVALID-001.md')).toThrow(ValidationError);
441
+ });
442
+ it('should throw ValidationError for unknown entity type', () => {
443
+ const content = `---
444
+ id: X-001
445
+ title: Test
446
+ workstream: engineering
447
+ status: In Progress
448
+ ---
449
+ Content`;
450
+ expect(() => parser.parse(content, '/vault/X-001.md')).toThrow(ValidationError);
451
+ });
452
+ it('should handle malformed frontmatter gracefully', () => {
453
+ const content = `---
454
+ id: M-001
455
+ title: Test
456
+ workstream: engineering
457
+ status: In Progress
458
+ malformed: [unclosed bracket
459
+ ---
460
+ Content`;
461
+ // Should still parse the valid fields
462
+ const result = parser.parse(content, '/vault/M-001.md');
463
+ expect(result.entity.id).toBe('M-001');
464
+ });
465
+ it('should handle empty content', () => {
466
+ const content = `---
467
+ id: M-001
468
+ title: Test
469
+ workstream: engineering
470
+ status: In Progress
471
+ ---`;
472
+ const result = parser.parse(content, '/vault/M-001.md');
473
+ expect(result.entity.id).toBe('M-001');
474
+ });
475
+ });
476
+ describe('Section Extraction', () => {
477
+ it('should extract sections from content', () => {
478
+ const content = `---
479
+ id: T-001
480
+ title: Test Task
481
+ workstream: engineering
482
+ status: In Progress
483
+ parent: S-001
484
+ goal: Test goal
485
+ ---
486
+ # Test Task
487
+
488
+ ## Description
489
+ This is the description section.
490
+
491
+ ## Technical Notes
492
+ These are technical notes.
493
+
494
+ ## Notes
495
+ General notes here.`;
496
+ const result = parser.parse(content, '/vault/T-001.md');
497
+ const task = result.entity;
498
+ expect(task.description).toBe('This is the description section.');
499
+ expect(task.technical_notes).toBe('These are technical notes.');
500
+ expect(task.notes).toBe('General notes here.');
501
+ });
502
+ it('should handle sections with multiple paragraphs', () => {
503
+ const content = `---
504
+ id: T-001
505
+ title: Test Task
506
+ workstream: engineering
507
+ status: In Progress
508
+ parent: S-001
509
+ goal: Test goal
510
+ ---
511
+ # Test Task
512
+
513
+ ## Description
514
+ First paragraph.
515
+
516
+ Second paragraph.
517
+
518
+ ## Notes
519
+ Notes here.`;
520
+ const result = parser.parse(content, '/vault/T-001.md');
521
+ const task = result.entity;
522
+ expect(task.description).toContain('First paragraph.');
523
+ expect(task.description).toContain('Second paragraph.');
524
+ });
525
+ it('should extract objective from body content before sections for milestones', () => {
526
+ // The parser extracts body content BEFORE any section headers as the objective
527
+ // (not the content of an ## Objective section)
528
+ const content = `---
529
+ id: M-001
530
+ title: Q1 Release
531
+ workstream: engineering
532
+ status: In Progress
533
+ ---
534
+ Deliver the Q1 release with all planned features.
535
+
536
+ ## Details
537
+ Some additional details here.`;
538
+ const result = parser.parse(content, '/vault/M-001.md');
539
+ const milestone = result.entity;
540
+ expect(milestone.objective).toBe('Deliver the Q1 release with all planned features.');
541
+ });
542
+ it('should extract outcome section for stories', () => {
543
+ const content = `---
544
+ id: S-001
545
+ title: User Auth
546
+ workstream: engineering
547
+ status: In Progress
548
+ parent: M-001
549
+ ---
550
+ # User Auth
551
+
552
+ ## Outcome
553
+ Users can securely log in and out.`;
554
+ const result = parser.parse(content, '/vault/S-001.md');
555
+ const story = result.entity;
556
+ expect(story.outcome).toBe('Users can securely log in and out.');
557
+ });
558
+ it('should store entire body as content for documents', () => {
559
+ // The parser stores the entire body (after frontmatter) as content
560
+ const content = `---
561
+ id: DOC-001
562
+ title: API Spec
563
+ workstream: engineering
564
+ status: Draft
565
+ doc_type: spec
566
+ ---
567
+ # API Spec
568
+
569
+ This is the main content of the document.`;
570
+ const result = parser.parse(content, '/vault/DOC-001.md');
571
+ const doc = result.entity;
572
+ expect(doc.content).toBe('# API Spec\n\nThis is the main content of the document.');
573
+ });
574
+ });
575
+ // NOTE: ID Extraction from Filename tests removed - IDs are now required in frontmatter
576
+ // The filename no longer contains the entity ID (e.g., "Test.md" instead of "M-001_Test.md")
577
+ describe('Array Field Handling', () => {
578
+ it('should handle YAML multi-line arrays', () => {
579
+ const content = `---
580
+ id: T-001
581
+ title: Test
582
+ workstream: engineering
583
+ status: In Progress
584
+ parent: S-001
585
+ goal: Test
586
+ depends_on:
587
+ - T-002
588
+ - T-003
589
+ - DEC-001
590
+ ---
591
+ Content`;
592
+ const result = parser.parse(content, '/vault/T-001.md');
593
+ const task = result.entity;
594
+ expect(task.depends_on).toEqual(['T-002', 'T-003', 'DEC-001']);
595
+ });
596
+ it('should handle empty inline array', () => {
597
+ const content = `---
598
+ id: M-001
599
+ title: Test
600
+ workstream: engineering
601
+ status: In Progress
602
+ depends_on: []
603
+ ---
604
+ Content`;
605
+ const result = parser.parse(content, '/vault/M-001.md');
606
+ const milestone = result.entity;
607
+ expect(milestone.depends_on).toEqual([]);
608
+ });
609
+ it('should handle inline array with spaces', () => {
610
+ const content = `---
611
+ id: M-001
612
+ title: Test
613
+ workstream: engineering
614
+ status: In Progress
615
+ depends_on: [ M-002 , M-003 ]
616
+ ---
617
+ Content`;
618
+ const result = parser.parse(content, '/vault/M-001.md');
619
+ const milestone = result.entity;
620
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
621
+ });
622
+ it('should handle inline array with quoted values', () => {
623
+ const content = `---
624
+ id: M-001
625
+ title: Test
626
+ workstream: engineering
627
+ status: In Progress
628
+ depends_on: ["M-002", 'M-003']
629
+ ---
630
+ Content`;
631
+ const result = parser.parse(content, '/vault/M-001.md');
632
+ const milestone = result.entity;
633
+ expect(milestone.depends_on).toEqual(['M-002', 'M-003']);
634
+ });
635
+ });
636
+ });
637
+ //# sourceMappingURL=entity-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-parser.test.js","sourceRoot":"","sources":["../../../src/services/v2/entity-parser.test.ts"],"names":[],"mappings":"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"}