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,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for V2 Atomic File Manager
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { AtomicFileManager } from './file-manager.js';
|
|
6
|
+
import { FileOperationError } from '../../models/v2-types.js';
|
|
7
|
+
import * as fs from 'fs/promises';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as os from 'os';
|
|
10
|
+
describe('AtomicFileManager', () => {
|
|
11
|
+
let tempDir;
|
|
12
|
+
let fileManager;
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
// Create a unique temp directory for each test
|
|
15
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'file-manager-test-'));
|
|
16
|
+
fileManager = new AtomicFileManager(tempDir);
|
|
17
|
+
});
|
|
18
|
+
afterEach(async () => {
|
|
19
|
+
// Clean up temp directory
|
|
20
|
+
try {
|
|
21
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Ignore cleanup errors
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
describe('read', () => {
|
|
28
|
+
it('should read file contents', async () => {
|
|
29
|
+
const filePath = 'test.md';
|
|
30
|
+
const content = '# Test Content\n\nSome text here.';
|
|
31
|
+
await fs.writeFile(path.join(tempDir, filePath), content, 'utf-8');
|
|
32
|
+
const result = await fileManager.read(filePath);
|
|
33
|
+
expect(result).toBe(content);
|
|
34
|
+
});
|
|
35
|
+
it('should throw FileOperationError for non-existent file', async () => {
|
|
36
|
+
await expect(fileManager.read('nonexistent.md')).rejects.toThrow(FileOperationError);
|
|
37
|
+
});
|
|
38
|
+
it('should read with custom encoding', async () => {
|
|
39
|
+
const filePath = 'test.txt';
|
|
40
|
+
const content = 'Test content';
|
|
41
|
+
await fs.writeFile(path.join(tempDir, filePath), content, 'utf-8');
|
|
42
|
+
const result = await fileManager.read(filePath, { encoding: 'utf-8' });
|
|
43
|
+
expect(result).toBe(content);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('exists', () => {
|
|
47
|
+
it('should return true for existing file', async () => {
|
|
48
|
+
const filePath = 'exists.md';
|
|
49
|
+
await fs.writeFile(path.join(tempDir, filePath), 'content', 'utf-8');
|
|
50
|
+
const result = await fileManager.exists(filePath);
|
|
51
|
+
expect(result).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it('should return false for non-existent file', async () => {
|
|
54
|
+
const result = await fileManager.exists('nonexistent.md');
|
|
55
|
+
expect(result).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('stat', () => {
|
|
59
|
+
it('should return stats for existing file', async () => {
|
|
60
|
+
const filePath = 'stats.md';
|
|
61
|
+
await fs.writeFile(path.join(tempDir, filePath), 'content', 'utf-8');
|
|
62
|
+
const result = await fileManager.stat(filePath);
|
|
63
|
+
expect(result).not.toBeNull();
|
|
64
|
+
});
|
|
65
|
+
it('should return null for non-existent file', async () => {
|
|
66
|
+
const result = await fileManager.stat('nonexistent.md');
|
|
67
|
+
expect(result).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('getMtime', () => {
|
|
71
|
+
it('should return modification time for existing file', async () => {
|
|
72
|
+
const filePath = 'mtime.md';
|
|
73
|
+
await fs.writeFile(path.join(tempDir, filePath), 'content', 'utf-8');
|
|
74
|
+
const result = await fileManager.getMtime(filePath);
|
|
75
|
+
expect(result).toBeTypeOf('number');
|
|
76
|
+
expect(result).toBeGreaterThan(0);
|
|
77
|
+
});
|
|
78
|
+
it('should return null for non-existent file', async () => {
|
|
79
|
+
const result = await fileManager.getMtime('nonexistent.md');
|
|
80
|
+
expect(result).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('write', () => {
|
|
84
|
+
it('should write file atomically', async () => {
|
|
85
|
+
const filePath = 'write-test.md';
|
|
86
|
+
const content = '# New Content';
|
|
87
|
+
await fileManager.write(filePath, content);
|
|
88
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
89
|
+
expect(result).toBe(content);
|
|
90
|
+
});
|
|
91
|
+
it('should create parent directories', async () => {
|
|
92
|
+
const filePath = 'subdir/nested/write-test.md';
|
|
93
|
+
const content = '# Nested Content';
|
|
94
|
+
await fileManager.write(filePath, content, { createDirs: true });
|
|
95
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
96
|
+
expect(result).toBe(content);
|
|
97
|
+
});
|
|
98
|
+
it('should overwrite existing file', async () => {
|
|
99
|
+
const filePath = 'overwrite.md';
|
|
100
|
+
await fs.writeFile(path.join(tempDir, filePath), 'old content', 'utf-8');
|
|
101
|
+
await fileManager.write(filePath, 'new content');
|
|
102
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
103
|
+
expect(result).toBe('new content');
|
|
104
|
+
});
|
|
105
|
+
it('should backup file before overwrite when requested', async () => {
|
|
106
|
+
const filePath = 'backup-test.md';
|
|
107
|
+
await fs.writeFile(path.join(tempDir, filePath), 'original content', 'utf-8');
|
|
108
|
+
await fileManager.write(filePath, 'new content', { backup: true });
|
|
109
|
+
// Check new content
|
|
110
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
111
|
+
expect(result).toBe('new content');
|
|
112
|
+
// Check backup exists
|
|
113
|
+
const backupDir = path.join(tempDir, '.obsidian', 'mcp-backup');
|
|
114
|
+
const backupFiles = await fs.readdir(backupDir);
|
|
115
|
+
expect(backupFiles.length).toBeGreaterThan(0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('append', () => {
|
|
119
|
+
it('should append to existing file', async () => {
|
|
120
|
+
const filePath = 'append-test.md';
|
|
121
|
+
await fs.writeFile(path.join(tempDir, filePath), 'line 1\n', 'utf-8');
|
|
122
|
+
await fileManager.append(filePath, 'line 2\n');
|
|
123
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
124
|
+
expect(result).toBe('line 1\nline 2\n');
|
|
125
|
+
});
|
|
126
|
+
it('should create file if it does not exist', async () => {
|
|
127
|
+
const filePath = 'new-append.md';
|
|
128
|
+
await fileManager.append(filePath, 'first line\n');
|
|
129
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
130
|
+
expect(result).toBe('first line\n');
|
|
131
|
+
});
|
|
132
|
+
it('should create parent directories when appending', async () => {
|
|
133
|
+
const filePath = 'subdir/append.md';
|
|
134
|
+
await fileManager.append(filePath, 'content', { createDirs: true });
|
|
135
|
+
const result = await fs.readFile(path.join(tempDir, filePath), 'utf-8');
|
|
136
|
+
expect(result).toBe('content');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('delete', () => {
|
|
140
|
+
it('should delete existing file', async () => {
|
|
141
|
+
const filePath = 'delete-test.md';
|
|
142
|
+
await fs.writeFile(path.join(tempDir, filePath), 'content', 'utf-8');
|
|
143
|
+
await fileManager.delete(filePath);
|
|
144
|
+
const exists = await fileManager.exists(filePath);
|
|
145
|
+
expect(exists).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
it('should not throw for non-existent file', async () => {
|
|
148
|
+
await expect(fileManager.delete('nonexistent.md')).resolves.not.toThrow();
|
|
149
|
+
});
|
|
150
|
+
it('should backup before delete when requested', async () => {
|
|
151
|
+
const filePath = 'delete-backup.md';
|
|
152
|
+
await fs.writeFile(path.join(tempDir, filePath), 'content to backup', 'utf-8');
|
|
153
|
+
await fileManager.delete(filePath, true);
|
|
154
|
+
// File should be deleted
|
|
155
|
+
const exists = await fileManager.exists(filePath);
|
|
156
|
+
expect(exists).toBe(false);
|
|
157
|
+
// Backup should exist
|
|
158
|
+
const backupDir = path.join(tempDir, '.obsidian', 'mcp-backup');
|
|
159
|
+
const backupFiles = await fs.readdir(backupDir);
|
|
160
|
+
expect(backupFiles.length).toBeGreaterThan(0);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('move', () => {
|
|
164
|
+
it('should move file to new location', async () => {
|
|
165
|
+
const sourcePath = 'source.md';
|
|
166
|
+
const destPath = 'dest.md';
|
|
167
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'content', 'utf-8');
|
|
168
|
+
await fileManager.move(sourcePath, destPath);
|
|
169
|
+
expect(await fileManager.exists(sourcePath)).toBe(false);
|
|
170
|
+
expect(await fileManager.exists(destPath)).toBe(true);
|
|
171
|
+
expect(await fileManager.read(destPath)).toBe('content');
|
|
172
|
+
});
|
|
173
|
+
it('should throw when destination exists and overwrite is false', async () => {
|
|
174
|
+
const sourcePath = 'source.md';
|
|
175
|
+
const destPath = 'dest.md';
|
|
176
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'source content', 'utf-8');
|
|
177
|
+
await fs.writeFile(path.join(tempDir, destPath), 'dest content', 'utf-8');
|
|
178
|
+
await expect(fileManager.move(sourcePath, destPath, { overwrite: false }))
|
|
179
|
+
.rejects.toThrow(FileOperationError);
|
|
180
|
+
});
|
|
181
|
+
it('should overwrite when overwrite is true', async () => {
|
|
182
|
+
const sourcePath = 'source.md';
|
|
183
|
+
const destPath = 'dest.md';
|
|
184
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'source content', 'utf-8');
|
|
185
|
+
await fs.writeFile(path.join(tempDir, destPath), 'dest content', 'utf-8');
|
|
186
|
+
await fileManager.move(sourcePath, destPath, { overwrite: true });
|
|
187
|
+
expect(await fileManager.read(destPath)).toBe('source content');
|
|
188
|
+
});
|
|
189
|
+
it('should create destination directories', async () => {
|
|
190
|
+
const sourcePath = 'source.md';
|
|
191
|
+
const destPath = 'subdir/nested/dest.md';
|
|
192
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'content', 'utf-8');
|
|
193
|
+
await fileManager.move(sourcePath, destPath, { createDirs: true });
|
|
194
|
+
expect(await fileManager.exists(destPath)).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe('copy', () => {
|
|
198
|
+
it('should copy file to new location', async () => {
|
|
199
|
+
const sourcePath = 'source.md';
|
|
200
|
+
const destPath = 'copy.md';
|
|
201
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'content', 'utf-8');
|
|
202
|
+
await fileManager.copy(sourcePath, destPath);
|
|
203
|
+
expect(await fileManager.exists(sourcePath)).toBe(true);
|
|
204
|
+
expect(await fileManager.exists(destPath)).toBe(true);
|
|
205
|
+
expect(await fileManager.read(destPath)).toBe('content');
|
|
206
|
+
});
|
|
207
|
+
it('should throw when destination exists and overwrite is false', async () => {
|
|
208
|
+
const sourcePath = 'source.md';
|
|
209
|
+
const destPath = 'dest.md';
|
|
210
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'source', 'utf-8');
|
|
211
|
+
await fs.writeFile(path.join(tempDir, destPath), 'dest', 'utf-8');
|
|
212
|
+
await expect(fileManager.copy(sourcePath, destPath, { overwrite: false }))
|
|
213
|
+
.rejects.toThrow(FileOperationError);
|
|
214
|
+
});
|
|
215
|
+
it('should overwrite when overwrite is true', async () => {
|
|
216
|
+
const sourcePath = 'source.md';
|
|
217
|
+
const destPath = 'dest.md';
|
|
218
|
+
await fs.writeFile(path.join(tempDir, sourcePath), 'source', 'utf-8');
|
|
219
|
+
await fs.writeFile(path.join(tempDir, destPath), 'dest', 'utf-8');
|
|
220
|
+
await fileManager.copy(sourcePath, destPath, { overwrite: true });
|
|
221
|
+
expect(await fileManager.read(destPath)).toBe('source');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe('ensureDir', () => {
|
|
225
|
+
it('should create directory', async () => {
|
|
226
|
+
const dirPath = path.join(tempDir, 'new-dir');
|
|
227
|
+
await fileManager.ensureDir(dirPath);
|
|
228
|
+
const stats = await fs.stat(dirPath);
|
|
229
|
+
expect(stats.isDirectory()).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it('should create nested directories', async () => {
|
|
232
|
+
const dirPath = path.join(tempDir, 'a', 'b', 'c');
|
|
233
|
+
await fileManager.ensureDir(dirPath);
|
|
234
|
+
const stats = await fs.stat(dirPath);
|
|
235
|
+
expect(stats.isDirectory()).toBe(true);
|
|
236
|
+
});
|
|
237
|
+
it('should not throw if directory already exists', async () => {
|
|
238
|
+
const dirPath = path.join(tempDir, 'existing-dir');
|
|
239
|
+
await fs.mkdir(dirPath);
|
|
240
|
+
await expect(fileManager.ensureDir(dirPath)).resolves.not.toThrow();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('listFiles', () => {
|
|
244
|
+
it('should list files in directory', async () => {
|
|
245
|
+
await fs.writeFile(path.join(tempDir, 'file1.md'), 'content', 'utf-8');
|
|
246
|
+
await fs.writeFile(path.join(tempDir, 'file2.md'), 'content', 'utf-8');
|
|
247
|
+
const files = await fileManager.listFiles('.');
|
|
248
|
+
expect(files).toContain('file1.md');
|
|
249
|
+
expect(files).toContain('file2.md');
|
|
250
|
+
});
|
|
251
|
+
it('should list files recursively', async () => {
|
|
252
|
+
await fs.mkdir(path.join(tempDir, 'subdir'));
|
|
253
|
+
await fs.writeFile(path.join(tempDir, 'root.md'), 'content', 'utf-8');
|
|
254
|
+
await fs.writeFile(path.join(tempDir, 'subdir', 'nested.md'), 'content', 'utf-8');
|
|
255
|
+
const files = await fileManager.listFiles('.');
|
|
256
|
+
expect(files).toContain('root.md');
|
|
257
|
+
expect(files.some(f => f.includes('nested.md'))).toBe(true);
|
|
258
|
+
});
|
|
259
|
+
it('should filter files by pattern', async () => {
|
|
260
|
+
await fs.writeFile(path.join(tempDir, 'file.md'), 'content', 'utf-8');
|
|
261
|
+
await fs.writeFile(path.join(tempDir, 'file.txt'), 'content', 'utf-8');
|
|
262
|
+
const files = await fileManager.listFiles('.', /\.md$/);
|
|
263
|
+
expect(files).toContain('file.md');
|
|
264
|
+
expect(files).not.toContain('file.txt');
|
|
265
|
+
});
|
|
266
|
+
it('should return empty array for non-existent directory', async () => {
|
|
267
|
+
const files = await fileManager.listFiles('nonexistent');
|
|
268
|
+
expect(files).toEqual([]);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe('listDirs', () => {
|
|
272
|
+
it('should list subdirectories', async () => {
|
|
273
|
+
await fs.mkdir(path.join(tempDir, 'dir1'));
|
|
274
|
+
await fs.mkdir(path.join(tempDir, 'dir2'));
|
|
275
|
+
await fs.writeFile(path.join(tempDir, 'file.md'), 'content', 'utf-8');
|
|
276
|
+
const dirs = await fileManager.listDirs('.');
|
|
277
|
+
expect(dirs.some(d => d.includes('dir1'))).toBe(true);
|
|
278
|
+
expect(dirs.some(d => d.includes('dir2'))).toBe(true);
|
|
279
|
+
expect(dirs.some(d => d.includes('file.md'))).toBe(false);
|
|
280
|
+
});
|
|
281
|
+
it('should return empty array for non-existent directory', async () => {
|
|
282
|
+
const dirs = await fileManager.listDirs('nonexistent');
|
|
283
|
+
expect(dirs).toEqual([]);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('backup', () => {
|
|
287
|
+
it('should create backup of file', async () => {
|
|
288
|
+
const filePath = 'to-backup.md';
|
|
289
|
+
await fs.writeFile(path.join(tempDir, filePath), 'backup content', 'utf-8');
|
|
290
|
+
const backupPath = await fileManager.backup(filePath);
|
|
291
|
+
expect(backupPath).toContain('to-backup');
|
|
292
|
+
expect(backupPath).toContain('.md');
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe('restore', () => {
|
|
296
|
+
it('should restore file from backup', async () => {
|
|
297
|
+
// Create original and backup
|
|
298
|
+
const originalPath = 'original.md';
|
|
299
|
+
await fs.writeFile(path.join(tempDir, originalPath), 'original content', 'utf-8');
|
|
300
|
+
const backupPath = await fileManager.backup(originalPath);
|
|
301
|
+
// Modify original
|
|
302
|
+
await fileManager.write(originalPath, 'modified content');
|
|
303
|
+
// Restore from backup
|
|
304
|
+
await fileManager.restore(backupPath, originalPath);
|
|
305
|
+
const result = await fileManager.read(originalPath);
|
|
306
|
+
expect(result).toBe('original content');
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('cleanupTemp', () => {
|
|
310
|
+
it('should clean up temp files', async () => {
|
|
311
|
+
// Create temp directory and files
|
|
312
|
+
const mcpTempDir = path.join(tempDir, '.obsidian', 'mcp-temp');
|
|
313
|
+
await fs.mkdir(mcpTempDir, { recursive: true });
|
|
314
|
+
await fs.writeFile(path.join(mcpTempDir, 'temp1.tmp'), 'temp', 'utf-8');
|
|
315
|
+
await fs.writeFile(path.join(mcpTempDir, 'temp2.tmp'), 'temp', 'utf-8');
|
|
316
|
+
const cleaned = await fileManager.cleanupTemp();
|
|
317
|
+
expect(cleaned).toBe(2);
|
|
318
|
+
});
|
|
319
|
+
it('should return 0 when temp directory does not exist', async () => {
|
|
320
|
+
const cleaned = await fileManager.cleanupTemp();
|
|
321
|
+
expect(cleaned).toBe(0);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
describe('path handling', () => {
|
|
325
|
+
it('should handle absolute paths', async () => {
|
|
326
|
+
const absolutePath = path.join(tempDir, 'absolute.md');
|
|
327
|
+
await fs.writeFile(absolutePath, 'content', 'utf-8');
|
|
328
|
+
const result = await fileManager.read(absolutePath);
|
|
329
|
+
expect(result).toBe('content');
|
|
330
|
+
});
|
|
331
|
+
it('should handle relative paths', async () => {
|
|
332
|
+
const relativePath = 'relative.md';
|
|
333
|
+
await fs.writeFile(path.join(tempDir, relativePath), 'content', 'utf-8');
|
|
334
|
+
const result = await fileManager.read(relativePath);
|
|
335
|
+
expect(result).toBe('content');
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
//# sourceMappingURL=file-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-manager.test.js","sourceRoot":"","sources":["../../../src/services/v2/file-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Index Manager
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates index building, updates, and cache invalidation.
|
|
5
|
+
* Provides unified interface for entity lookups and queries.
|
|
6
|
+
*/
|
|
7
|
+
import { EntityId, EntityType, EntityStatus, EntityMetadata, Entity, VaultPath, CanvasPath, Priority } from '../../models/v2-types.js';
|
|
8
|
+
import { RelationshipType } from './index-service.js';
|
|
9
|
+
import { SearchIndex, SearchResult, SearchOptions } from './search-service.js';
|
|
10
|
+
export interface IndexManagerOptions {
|
|
11
|
+
/** Auto-rebuild interval in ms (0 = disabled) */
|
|
12
|
+
autoRebuildInterval?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface EntityQuery {
|
|
15
|
+
types?: EntityType[];
|
|
16
|
+
statuses?: EntityStatus[];
|
|
17
|
+
workstreams?: string[];
|
|
18
|
+
priorities?: Priority[];
|
|
19
|
+
parentId?: EntityId;
|
|
20
|
+
canvasPath?: CanvasPath;
|
|
21
|
+
archived?: boolean;
|
|
22
|
+
inProgress?: boolean;
|
|
23
|
+
limit?: number;
|
|
24
|
+
offset?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Central manager for all entity indexes.
|
|
28
|
+
* Coordinates ProjectIndex and SearchIndex.
|
|
29
|
+
*/
|
|
30
|
+
export declare class IndexManager {
|
|
31
|
+
private projectIndex;
|
|
32
|
+
private searchIndex;
|
|
33
|
+
constructor(_options?: IndexManagerOptions);
|
|
34
|
+
/** Stop any running timers (no-op now, kept for API compatibility) */
|
|
35
|
+
stop(): void;
|
|
36
|
+
/** Index a single entity */
|
|
37
|
+
indexEntity(entity: Entity, fileMtime: number): void;
|
|
38
|
+
/** Remove entity from all indexes */
|
|
39
|
+
removeEntity(id: EntityId): void;
|
|
40
|
+
/** Clear all indexes */
|
|
41
|
+
clearAll(): void;
|
|
42
|
+
private createMetadata;
|
|
43
|
+
private isInProgress;
|
|
44
|
+
private extractSearchableContent;
|
|
45
|
+
private indexRelationships;
|
|
46
|
+
/** Get entity metadata by ID */
|
|
47
|
+
getMetadata(id: EntityId): EntityMetadata | undefined;
|
|
48
|
+
/** Check if entity exists in index */
|
|
49
|
+
hasMetadata(id: EntityId): boolean;
|
|
50
|
+
/** Check if entity exists */
|
|
51
|
+
hasEntity(id: EntityId): boolean;
|
|
52
|
+
/** Query entities with filters */
|
|
53
|
+
query(q: EntityQuery): EntityMetadata[];
|
|
54
|
+
/** Search entities */
|
|
55
|
+
search(query: string, options?: SearchOptions): SearchResult[];
|
|
56
|
+
/** Get related entities */
|
|
57
|
+
getRelated(id: EntityId, type: RelationshipType): EntityId[];
|
|
58
|
+
/** Get children of entity */
|
|
59
|
+
getChildren(parentId: EntityId): EntityMetadata[];
|
|
60
|
+
/** Get entity by file path */
|
|
61
|
+
getByPath(path: VaultPath): EntityMetadata | undefined;
|
|
62
|
+
getStats(): {
|
|
63
|
+
entityCount: number;
|
|
64
|
+
searchStats: ReturnType<SearchIndex['getStats']>;
|
|
65
|
+
indexVersion: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-manager.d.ts","sourceRoot":"","sources":["../../../src/services/v2/index-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,cAAc,EACd,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAM/E,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAUD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;gBAErB,QAAQ,GAAE,mBAAwB;IAS9C,sEAAsE;IACtE,IAAI,IAAI,IAAI;IAQZ,4BAA4B;IAC5B,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAapD,qCAAqC;IACrC,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKhC,wBAAwB;IACxB,QAAQ,IAAI,IAAI;IAShB,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,kBAAkB;IAiC1B,gCAAgC;IAChC,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,cAAc,GAAG,SAAS;IAIrD,sCAAsC;IACtC,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAIlC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO;IAIhC,kCAAkC;IAClC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,cAAc,EAAE;IAoCvC,sBAAsB;IACtB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,EAAE;IAI9D,2BAA2B;IAC3B,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,GAAG,QAAQ,EAAE;IAI5D,6BAA6B;IAC7B,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,EAAE;IAIjD,8BAA8B;IAC9B,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS;IAStD,QAAQ,IAAI;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,YAAY,EAAE,MAAM,CAAC;KACtB;CAOF"}
|