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.
- package/README.md +154 -182
- package/dist/index.js +207 -38
- package/dist/index.js.map +1 -1
- package/dist/integration.test.d.ts +8 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +979 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/models/types.d.ts +1 -2
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js.map +1 -1
- package/dist/models/v2-types.d.ts +460 -0
- package/dist/models/v2-types.d.ts.map +1 -0
- package/dist/models/v2-types.js +137 -0
- package/dist/models/v2-types.js.map +1 -0
- package/dist/models/v2-types.test.d.ts +5 -0
- package/dist/models/v2-types.test.d.ts.map +1 -0
- package/dist/models/v2-types.test.js +133 -0
- package/dist/models/v2-types.test.js.map +1 -0
- package/dist/parsers/canvas-parser.d.ts +1 -1
- package/dist/parsers/canvas-parser.d.ts.map +1 -1
- package/dist/parsers/canvas-parser.js +1 -1
- package/dist/parsers/canvas-parser.js.map +1 -1
- package/dist/parsers/markdown-parser.js +9 -9
- package/dist/parsers/markdown-parser.js.map +1 -1
- package/dist/services/v2/archive-manager.d.ts +96 -0
- package/dist/services/v2/archive-manager.d.ts.map +1 -0
- package/dist/services/v2/archive-manager.js +281 -0
- package/dist/services/v2/archive-manager.js.map +1 -0
- package/dist/services/v2/canvas-manager.d.ts +155 -0
- package/dist/services/v2/canvas-manager.d.ts.map +1 -0
- package/dist/services/v2/canvas-manager.js +540 -0
- package/dist/services/v2/canvas-manager.js.map +1 -0
- package/dist/services/v2/canvas-manager.test.d.ts +5 -0
- package/dist/services/v2/canvas-manager.test.d.ts.map +1 -0
- package/dist/services/v2/canvas-manager.test.js +327 -0
- package/dist/services/v2/canvas-manager.test.js.map +1 -0
- package/dist/services/v2/cascade-manager.d.ts +54 -0
- package/dist/services/v2/cascade-manager.d.ts.map +1 -0
- package/dist/services/v2/cascade-manager.js +220 -0
- package/dist/services/v2/cascade-manager.js.map +1 -0
- package/dist/services/v2/cycle-detector.d.ts +76 -0
- package/dist/services/v2/cycle-detector.d.ts.map +1 -0
- package/dist/services/v2/cycle-detector.js +183 -0
- package/dist/services/v2/cycle-detector.js.map +1 -0
- package/dist/services/v2/cycle-detector.test.d.ts +7 -0
- package/dist/services/v2/cycle-detector.test.d.ts.map +1 -0
- package/dist/services/v2/cycle-detector.test.js +125 -0
- package/dist/services/v2/cycle-detector.test.js.map +1 -0
- package/dist/services/v2/entity-parser.d.ts +54 -0
- package/dist/services/v2/entity-parser.d.ts.map +1 -0
- package/dist/services/v2/entity-parser.js +418 -0
- package/dist/services/v2/entity-parser.js.map +1 -0
- package/dist/services/v2/entity-parser.test.d.ts +5 -0
- package/dist/services/v2/entity-parser.test.d.ts.map +1 -0
- package/dist/services/v2/entity-parser.test.js +637 -0
- package/dist/services/v2/entity-parser.test.js.map +1 -0
- package/dist/services/v2/entity-serializer.d.ts +94 -0
- package/dist/services/v2/entity-serializer.d.ts.map +1 -0
- package/dist/services/v2/entity-serializer.js +583 -0
- package/dist/services/v2/entity-serializer.js.map +1 -0
- package/dist/services/v2/entity-serializer.test.d.ts +5 -0
- package/dist/services/v2/entity-serializer.test.d.ts.map +1 -0
- package/dist/services/v2/entity-serializer.test.js +241 -0
- package/dist/services/v2/entity-serializer.test.js.map +1 -0
- package/dist/services/v2/entity-validator.d.ts +65 -0
- package/dist/services/v2/entity-validator.d.ts.map +1 -0
- package/dist/services/v2/entity-validator.js +573 -0
- package/dist/services/v2/entity-validator.js.map +1 -0
- package/dist/services/v2/entity-validator.test.d.ts +5 -0
- package/dist/services/v2/entity-validator.test.d.ts.map +1 -0
- package/dist/services/v2/entity-validator.test.js +519 -0
- package/dist/services/v2/entity-validator.test.js.map +1 -0
- package/dist/services/v2/file-manager.d.ts +73 -0
- package/dist/services/v2/file-manager.d.ts.map +1 -0
- package/dist/services/v2/file-manager.js +310 -0
- package/dist/services/v2/file-manager.js.map +1 -0
- package/dist/services/v2/file-manager.test.d.ts +5 -0
- package/dist/services/v2/file-manager.test.d.ts.map +1 -0
- package/dist/services/v2/file-manager.test.js +339 -0
- package/dist/services/v2/file-manager.test.js.map +1 -0
- package/dist/services/v2/index-manager.d.ts +68 -0
- package/dist/services/v2/index-manager.d.ts.map +1 -0
- package/dist/services/v2/index-manager.js +228 -0
- package/dist/services/v2/index-manager.js.map +1 -0
- package/dist/services/v2/index-manager.test.d.ts +5 -0
- package/dist/services/v2/index-manager.test.d.ts.map +1 -0
- package/dist/services/v2/index-manager.test.js +386 -0
- package/dist/services/v2/index-manager.test.js.map +1 -0
- package/dist/services/v2/index-service.d.ts +82 -0
- package/dist/services/v2/index-service.d.ts.map +1 -0
- package/dist/services/v2/index-service.js +274 -0
- package/dist/services/v2/index-service.js.map +1 -0
- package/dist/services/v2/index-service.test.d.ts +5 -0
- package/dist/services/v2/index-service.test.d.ts.map +1 -0
- package/dist/services/v2/index-service.test.js +117 -0
- package/dist/services/v2/index-service.test.js.map +1 -0
- package/dist/services/v2/lifecycle-manager.d.ts +59 -0
- package/dist/services/v2/lifecycle-manager.d.ts.map +1 -0
- package/dist/services/v2/lifecycle-manager.js +310 -0
- package/dist/services/v2/lifecycle-manager.js.map +1 -0
- package/dist/services/v2/lifecycle-manager.test.d.ts +5 -0
- package/dist/services/v2/lifecycle-manager.test.d.ts.map +1 -0
- package/dist/services/v2/lifecycle-manager.test.js +141 -0
- package/dist/services/v2/lifecycle-manager.test.js.map +1 -0
- package/dist/services/v2/path-resolver.d.ts +64 -0
- package/dist/services/v2/path-resolver.d.ts.map +1 -0
- package/dist/services/v2/path-resolver.js +174 -0
- package/dist/services/v2/path-resolver.js.map +1 -0
- package/dist/services/v2/progress-computer.d.ts +46 -0
- package/dist/services/v2/progress-computer.d.ts.map +1 -0
- package/dist/services/v2/progress-computer.js +200 -0
- package/dist/services/v2/progress-computer.js.map +1 -0
- package/dist/services/v2/search-service.d.ts +68 -0
- package/dist/services/v2/search-service.d.ts.map +1 -0
- package/dist/services/v2/search-service.js +194 -0
- package/dist/services/v2/search-service.js.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.d.ts +54 -0
- package/dist/services/v2/transitive-dependency-remover.d.ts.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.js +156 -0
- package/dist/services/v2/transitive-dependency-remover.js.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.test.d.ts +7 -0
- package/dist/services/v2/transitive-dependency-remover.test.d.ts.map +1 -0
- package/dist/services/v2/transitive-dependency-remover.test.js +119 -0
- package/dist/services/v2/transitive-dependency-remover.test.js.map +1 -0
- package/dist/services/v2/v2-runtime.d.ts +374 -0
- package/dist/services/v2/v2-runtime.d.ts.map +1 -0
- package/dist/services/v2/v2-runtime.js +1908 -0
- package/dist/services/v2/v2-runtime.js.map +1 -0
- package/dist/services/v2/v2-runtime.test.d.ts +5 -0
- package/dist/services/v2/v2-runtime.test.d.ts.map +1 -0
- package/dist/services/v2/v2-runtime.test.js +658 -0
- package/dist/services/v2/v2-runtime.test.js.map +1 -0
- package/dist/services/v2/workstream-normalizer.d.ts +59 -0
- package/dist/services/v2/workstream-normalizer.d.ts.map +1 -0
- package/dist/services/v2/workstream-normalizer.js +137 -0
- package/dist/services/v2/workstream-normalizer.js.map +1 -0
- package/dist/services/v2/workstream-normalizer.test.d.ts +7 -0
- package/dist/services/v2/workstream-normalizer.test.d.ts.map +1 -0
- package/dist/services/v2/workstream-normalizer.test.js +130 -0
- package/dist/services/v2/workstream-normalizer.test.js.map +1 -0
- package/dist/test-runner.d.ts +4 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +44 -249
- package/dist/test-runner.js.map +1 -1
- package/dist/tools/batch-operations-tools.d.ts +54 -0
- package/dist/tools/batch-operations-tools.d.ts.map +1 -0
- package/dist/tools/batch-operations-tools.js +370 -0
- package/dist/tools/batch-operations-tools.js.map +1 -0
- package/dist/tools/decision-document-tools.d.ts +78 -0
- package/dist/tools/decision-document-tools.d.ts.map +1 -0
- package/dist/tools/decision-document-tools.js +260 -0
- package/dist/tools/decision-document-tools.js.map +1 -0
- package/dist/tools/entity-management-tools.d.ts +79 -0
- package/dist/tools/entity-management-tools.d.ts.map +1 -0
- package/dist/tools/entity-management-tools.js +851 -0
- package/dist/tools/entity-management-tools.js.map +1 -0
- package/dist/tools/entity-management-tools.test.d.ts +5 -0
- package/dist/tools/entity-management-tools.test.d.ts.map +1 -0
- package/dist/tools/entity-management-tools.test.js +530 -0
- package/dist/tools/entity-management-tools.test.js.map +1 -0
- package/dist/tools/index.d.ts +15 -331
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +510 -47
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/index.test.d.ts +8 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +429 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/project-understanding-tools.d.ts +75 -0
- package/dist/tools/project-understanding-tools.d.ts.map +1 -0
- package/dist/tools/project-understanding-tools.js +751 -0
- package/dist/tools/project-understanding-tools.js.map +1 -0
- package/dist/tools/search-navigation-tools.d.ts +77 -0
- package/dist/tools/search-navigation-tools.d.ts.map +1 -0
- package/dist/tools/search-navigation-tools.js +379 -0
- package/dist/tools/search-navigation-tools.js.map +1 -0
- package/dist/tools/tool-types.d.ts +703 -0
- package/dist/tools/tool-types.d.ts.map +1 -0
- package/dist/tools/tool-types.js +7 -0
- package/dist/tools/tool-types.js.map +1 -0
- package/dist/utils/config.d.ts +0 -4
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +2 -19
- package/dist/utils/config.js.map +1 -1
- package/package.json +16 -1
- package/dist/services/accomplishment-service.d.ts +0 -33
- package/dist/services/accomplishment-service.d.ts.map +0 -1
- package/dist/services/accomplishment-service.js +0 -296
- package/dist/services/accomplishment-service.js.map +0 -1
- package/dist/services/canvas-service.d.ts +0 -96
- package/dist/services/canvas-service.d.ts.map +0 -1
- package/dist/services/canvas-service.js +0 -231
- package/dist/services/canvas-service.js.map +0 -1
- package/dist/services/context-doc-service.d.ts +0 -70
- package/dist/services/context-doc-service.d.ts.map +0 -1
- package/dist/services/context-doc-service.js +0 -229
- package/dist/services/context-doc-service.js.map +0 -1
- package/dist/services/dependency-service.d.ts +0 -22
- package/dist/services/dependency-service.d.ts.map +0 -1
- package/dist/services/dependency-service.js +0 -99
- package/dist/services/dependency-service.js.map +0 -1
- package/dist/services/status-indicator-service.d.ts +0 -40
- package/dist/services/status-indicator-service.d.ts.map +0 -1
- package/dist/services/status-indicator-service.js +0 -173
- package/dist/services/status-indicator-service.js.map +0 -1
- package/dist/services/task-service.d.ts +0 -32
- package/dist/services/task-service.d.ts.map +0 -1
- package/dist/services/task-service.js +0 -152
- package/dist/services/task-service.js.map +0 -1
- package/dist/test-real-vault.d.ts +0 -6
- package/dist/test-real-vault.d.ts.map +0 -1
- package/dist/test-real-vault.js +0 -30
- package/dist/test-real-vault.js.map +0 -1
- package/dist/tools/batch-operations.d.ts +0 -246
- package/dist/tools/batch-operations.d.ts.map +0 -1
- package/dist/tools/batch-operations.js +0 -235
- package/dist/tools/batch-operations.js.map +0 -1
- package/dist/tools/get-accomplishment.d.ts +0 -42
- package/dist/tools/get-accomplishment.d.ts.map +0 -1
- package/dist/tools/get-accomplishment.js +0 -93
- package/dist/tools/get-accomplishment.js.map +0 -1
- package/dist/tools/get-accomplishments-graph.d.ts +0 -26
- package/dist/tools/get-accomplishments-graph.d.ts.map +0 -1
- package/dist/tools/get-accomplishments-graph.js +0 -137
- package/dist/tools/get-accomplishments-graph.js.map +0 -1
- package/dist/tools/get-blocked-items.d.ts +0 -15
- package/dist/tools/get-blocked-items.d.ts.map +0 -1
- package/dist/tools/get-blocked-items.js +0 -73
- package/dist/tools/get-blocked-items.js.map +0 -1
- package/dist/tools/get-current-work.d.ts +0 -15
- package/dist/tools/get-current-work.d.ts.map +0 -1
- package/dist/tools/get-current-work.js +0 -68
- package/dist/tools/get-current-work.js.map +0 -1
- package/dist/tools/get-project-status.d.ts +0 -26
- package/dist/tools/get-project-status.d.ts.map +0 -1
- package/dist/tools/get-project-status.js +0 -98
- package/dist/tools/get-project-status.js.map +0 -1
- package/dist/tools/get-ready-to-start.d.ts +0 -15
- package/dist/tools/get-ready-to-start.d.ts.map +0 -1
- package/dist/tools/get-ready-to-start.js +0 -47
- package/dist/tools/get-ready-to-start.js.map +0 -1
- package/dist/tools/list-accomplishments.d.ts +0 -42
- package/dist/tools/list-accomplishments.d.ts.map +0 -1
- package/dist/tools/list-accomplishments.js +0 -40
- package/dist/tools/list-accomplishments.js.map +0 -1
- package/dist/tools/manage-accomplishment.d.ts +0 -147
- package/dist/tools/manage-accomplishment.d.ts.map +0 -1
- package/dist/tools/manage-accomplishment.js +0 -153
- package/dist/tools/manage-accomplishment.js.map +0 -1
- package/dist/tools/manage-dependency.d.ts +0 -41
- package/dist/tools/manage-dependency.d.ts.map +0 -1
- package/dist/tools/manage-dependency.js +0 -66
- package/dist/tools/manage-dependency.js.map +0 -1
- package/dist/tools/manage-task.d.ts +0 -119
- package/dist/tools/manage-task.d.ts.map +0 -1
- package/dist/tools/manage-task.js +0 -126
- package/dist/tools/manage-task.js.map +0 -1
- package/dist/tools/reconcile-canvas.d.ts +0 -33
- package/dist/tools/reconcile-canvas.d.ts.map +0 -1
- package/dist/tools/reconcile-canvas.js +0 -41
- package/dist/tools/reconcile-canvas.js.map +0 -1
- package/dist/tools/set-work-focus.d.ts +0 -48
- package/dist/tools/set-work-focus.d.ts.map +0 -1
- package/dist/tools/set-work-focus.js +0 -78
- package/dist/tools/set-work-focus.js.map +0 -1
- package/dist/tools/sync-dependencies.d.ts +0 -33
- package/dist/tools/sync-dependencies.d.ts.map +0 -1
- package/dist/tools/sync-dependencies.js +0 -144
- 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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"}
|