obsidian-accomplishments-mcp 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -271
- 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 -293
- 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 -26
- package/dist/tools/get-accomplishment.d.ts.map +0 -1
- package/dist/tools/get-accomplishment.js +0 -53
- 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 -34
- package/dist/tools/list-accomplishments.d.ts.map +0 -1
- package/dist/tools/list-accomplishments.js +0 -34
- 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,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V2 Search Service
|
|
3
|
+
*
|
|
4
|
+
* Provides token-based inverted index for full-text search across entities.
|
|
5
|
+
*/
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Search Index Class
|
|
8
|
+
// =============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Token-based inverted index for full-text search.
|
|
11
|
+
*/
|
|
12
|
+
export class SearchIndex {
|
|
13
|
+
/** Inverted index: token -> Set of entity IDs */
|
|
14
|
+
titleIndex = new Map();
|
|
15
|
+
contentIndex = new Map();
|
|
16
|
+
/** Document frequency for TF-IDF scoring */
|
|
17
|
+
documentCount = 0;
|
|
18
|
+
tokenDocFreq = new Map();
|
|
19
|
+
/** Entity metadata cache for filtering */
|
|
20
|
+
entityMeta = new Map();
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Indexing Operations
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** Add or update entity in search index */
|
|
25
|
+
index(id, title, content, type, archived) {
|
|
26
|
+
// Remove existing entry if updating
|
|
27
|
+
this.remove(id);
|
|
28
|
+
// Tokenize and index title
|
|
29
|
+
const titleTokens = this.tokenize(title);
|
|
30
|
+
for (const token of titleTokens) {
|
|
31
|
+
this.addToIndex(this.titleIndex, token, id);
|
|
32
|
+
this.incrementDocFreq(token);
|
|
33
|
+
}
|
|
34
|
+
// Tokenize and index content
|
|
35
|
+
const contentTokens = this.tokenize(content);
|
|
36
|
+
for (const token of contentTokens) {
|
|
37
|
+
this.addToIndex(this.contentIndex, token, id);
|
|
38
|
+
this.incrementDocFreq(token);
|
|
39
|
+
}
|
|
40
|
+
// Store metadata
|
|
41
|
+
this.entityMeta.set(id, { type, archived });
|
|
42
|
+
this.documentCount++;
|
|
43
|
+
}
|
|
44
|
+
/** Remove entity from search index */
|
|
45
|
+
remove(id) {
|
|
46
|
+
if (!this.entityMeta.has(id))
|
|
47
|
+
return;
|
|
48
|
+
// Remove from title index
|
|
49
|
+
for (const [token, ids] of this.titleIndex) {
|
|
50
|
+
if (ids.delete(id)) {
|
|
51
|
+
this.decrementDocFreq(token);
|
|
52
|
+
if (ids.size === 0)
|
|
53
|
+
this.titleIndex.delete(token);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Remove from content index
|
|
57
|
+
for (const [token, ids] of this.contentIndex) {
|
|
58
|
+
if (ids.delete(id)) {
|
|
59
|
+
this.decrementDocFreq(token);
|
|
60
|
+
if (ids.size === 0)
|
|
61
|
+
this.contentIndex.delete(token);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
this.entityMeta.delete(id);
|
|
65
|
+
this.documentCount--;
|
|
66
|
+
}
|
|
67
|
+
/** Clear all indexes */
|
|
68
|
+
clear() {
|
|
69
|
+
this.titleIndex.clear();
|
|
70
|
+
this.contentIndex.clear();
|
|
71
|
+
this.tokenDocFreq.clear();
|
|
72
|
+
this.entityMeta.clear();
|
|
73
|
+
this.documentCount = 0;
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Search Operations
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/** Search for entities matching query */
|
|
79
|
+
search(query, options = {}) {
|
|
80
|
+
const { fields = ['title', 'content'], limit = 50, minScore = 0.1, types, includeArchived = false } = options;
|
|
81
|
+
const queryTokens = this.tokenize(query);
|
|
82
|
+
if (queryTokens.length === 0)
|
|
83
|
+
return [];
|
|
84
|
+
// Collect matching entity IDs with scores
|
|
85
|
+
const scores = new Map();
|
|
86
|
+
const matches = new Map();
|
|
87
|
+
for (const token of queryTokens) {
|
|
88
|
+
const idf = this.calculateIDF(token);
|
|
89
|
+
if (fields.includes('title')) {
|
|
90
|
+
const titleMatches = this.titleIndex.get(token);
|
|
91
|
+
if (titleMatches) {
|
|
92
|
+
for (const id of titleMatches) {
|
|
93
|
+
const currentScore = scores.get(id) || 0;
|
|
94
|
+
scores.set(id, currentScore + idf * 2); // Title matches weighted 2x
|
|
95
|
+
this.addMatch(matches, id, 'title', token);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (fields.includes('content')) {
|
|
100
|
+
const contentMatches = this.contentIndex.get(token);
|
|
101
|
+
if (contentMatches) {
|
|
102
|
+
for (const id of contentMatches) {
|
|
103
|
+
const currentScore = scores.get(id) || 0;
|
|
104
|
+
scores.set(id, currentScore + idf);
|
|
105
|
+
this.addMatch(matches, id, 'content', token);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Filter and sort results
|
|
111
|
+
const results = [];
|
|
112
|
+
for (const [id, score] of scores) {
|
|
113
|
+
if (score < minScore)
|
|
114
|
+
continue;
|
|
115
|
+
const meta = this.entityMeta.get(id);
|
|
116
|
+
if (!meta)
|
|
117
|
+
continue;
|
|
118
|
+
if (!includeArchived && meta.archived)
|
|
119
|
+
continue;
|
|
120
|
+
if (types && !types.includes(meta.type))
|
|
121
|
+
continue;
|
|
122
|
+
results.push({ id, score, matches: matches.get(id) || [] });
|
|
123
|
+
}
|
|
124
|
+
return results.sort((a, b) => b.score - a.score).slice(0, limit);
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Helper Methods
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
/** Tokenize text into searchable tokens */
|
|
130
|
+
tokenize(text) {
|
|
131
|
+
if (!text)
|
|
132
|
+
return [];
|
|
133
|
+
return text
|
|
134
|
+
.toLowerCase()
|
|
135
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
136
|
+
.split(/\s+/)
|
|
137
|
+
.filter(token => token.length >= 2)
|
|
138
|
+
.map(token => token.trim());
|
|
139
|
+
}
|
|
140
|
+
/** Add entity to token index */
|
|
141
|
+
addToIndex(index, token, id) {
|
|
142
|
+
let ids = index.get(token);
|
|
143
|
+
if (!ids) {
|
|
144
|
+
ids = new Set();
|
|
145
|
+
index.set(token, ids);
|
|
146
|
+
}
|
|
147
|
+
ids.add(id);
|
|
148
|
+
}
|
|
149
|
+
/** Increment document frequency for token */
|
|
150
|
+
incrementDocFreq(token) {
|
|
151
|
+
this.tokenDocFreq.set(token, (this.tokenDocFreq.get(token) || 0) + 1);
|
|
152
|
+
}
|
|
153
|
+
/** Decrement document frequency for token */
|
|
154
|
+
decrementDocFreq(token) {
|
|
155
|
+
const freq = this.tokenDocFreq.get(token) || 0;
|
|
156
|
+
if (freq <= 1) {
|
|
157
|
+
this.tokenDocFreq.delete(token);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.tokenDocFreq.set(token, freq - 1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/** Calculate IDF (Inverse Document Frequency) for token */
|
|
164
|
+
calculateIDF(token) {
|
|
165
|
+
const docFreq = this.tokenDocFreq.get(token) || 0;
|
|
166
|
+
if (docFreq === 0 || this.documentCount === 0)
|
|
167
|
+
return 0;
|
|
168
|
+
return Math.log(this.documentCount / docFreq) + 1;
|
|
169
|
+
}
|
|
170
|
+
/** Add match info to results */
|
|
171
|
+
addMatch(matches, id, field, token) {
|
|
172
|
+
let entityMatches = matches.get(id);
|
|
173
|
+
if (!entityMatches) {
|
|
174
|
+
entityMatches = [];
|
|
175
|
+
matches.set(id, entityMatches);
|
|
176
|
+
}
|
|
177
|
+
let fieldMatch = entityMatches.find(m => m.field === field);
|
|
178
|
+
if (!fieldMatch) {
|
|
179
|
+
fieldMatch = { field, positions: [] };
|
|
180
|
+
entityMatches.push(fieldMatch);
|
|
181
|
+
}
|
|
182
|
+
// Position tracking simplified - just count matches
|
|
183
|
+
fieldMatch.positions.push(fieldMatch.positions.length);
|
|
184
|
+
}
|
|
185
|
+
/** Get index statistics */
|
|
186
|
+
getStats() {
|
|
187
|
+
return {
|
|
188
|
+
documentCount: this.documentCount,
|
|
189
|
+
titleTokens: this.titleIndex.size,
|
|
190
|
+
contentTokens: this.contentIndex.size,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=search-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-service.js","sourceRoot":"","sources":["../../../src/services/v2/search-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transitive Dependency Remover Service
|
|
3
|
+
*
|
|
4
|
+
* Removes redundant transitive dependencies from entity dependency graphs.
|
|
5
|
+
* If A depends on B and B depends on C, then A→C is transitive and can be removed.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Build dependency graph from all entities
|
|
9
|
+
* 2. For each entity, compute transitive closure of its dependencies
|
|
10
|
+
* 3. Remove direct dependencies that are reachable through other paths
|
|
11
|
+
* 4. Return list of removed dependencies for Agent feedback
|
|
12
|
+
*/
|
|
13
|
+
import { EntityId, Entity } from '../../models/v2-types.js';
|
|
14
|
+
export interface TransitiveRemovalResult {
|
|
15
|
+
/** Entity that had dependencies removed */
|
|
16
|
+
entityId: EntityId;
|
|
17
|
+
/** Dependencies that were removed (transitive) */
|
|
18
|
+
removedDependencies: EntityId[];
|
|
19
|
+
/** Message describing the removal (for Agent feedback) */
|
|
20
|
+
message: string;
|
|
21
|
+
}
|
|
22
|
+
export interface TransitiveRemovalSummary {
|
|
23
|
+
/** Total number of entities processed */
|
|
24
|
+
entitiesProcessed: number;
|
|
25
|
+
/** Total number of transitive dependencies removed */
|
|
26
|
+
totalRemoved: number;
|
|
27
|
+
/** Details of each removal */
|
|
28
|
+
removals: TransitiveRemovalResult[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Service for removing transitive dependencies from entities.
|
|
32
|
+
*/
|
|
33
|
+
export declare class TransitiveDependencyRemover {
|
|
34
|
+
/**
|
|
35
|
+
* Analyze an entity's dependencies and find transitive ones.
|
|
36
|
+
* Does not modify the entity - returns what would be removed.
|
|
37
|
+
*/
|
|
38
|
+
analyzeEntity(entity: Entity, getDependencies: (id: EntityId) => EntityId[]): TransitiveRemovalResult | null;
|
|
39
|
+
/**
|
|
40
|
+
* Remove transitive dependencies from an entity.
|
|
41
|
+
* Returns the modified entity and removal result.
|
|
42
|
+
*/
|
|
43
|
+
removeTransitiveDependencies(entity: Entity, getDependencies: (id: EntityId) => EntityId[]): {
|
|
44
|
+
entity: Entity;
|
|
45
|
+
result: TransitiveRemovalResult | null;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Process multiple entities and remove transitive dependencies.
|
|
49
|
+
*/
|
|
50
|
+
processEntities(entities: Entity[], getDependencies: (id: EntityId) => EntityId[]): TransitiveRemovalSummary;
|
|
51
|
+
}
|
|
52
|
+
/** Default remover instance */
|
|
53
|
+
export declare const transitiveDependencyRemover: TransitiveDependencyRemover;
|
|
54
|
+
//# sourceMappingURL=transitive-dependency-remover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitive-dependency-remover.d.ts","sourceRoot":"","sources":["../../../src/services/v2/transitive-dependency-remover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,kDAAkD;IAClD,mBAAmB,EAAE,QAAQ,EAAE,CAAC;IAChC,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;CACrC;AAiFD;;GAEG;AACH,qBAAa,2BAA2B;IACtC;;;OAGG;IACH,aAAa,CACX,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,QAAQ,EAAE,GAC5C,uBAAuB,GAAG,IAAI;IAqCjC;;;OAGG;IACH,4BAA4B,CAC1B,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,QAAQ,EAAE,GAC5C;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAA;KAAE;IAqB7D;;OAEG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAAE,EAClB,eAAe,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,QAAQ,EAAE,GAC5C,wBAAwB;CAgB5B;AAED,+BAA+B;AAC/B,eAAO,MAAM,2BAA2B,6BAAoC,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transitive Dependency Remover Service
|
|
3
|
+
*
|
|
4
|
+
* Removes redundant transitive dependencies from entity dependency graphs.
|
|
5
|
+
* If A depends on B and B depends on C, then A→C is transitive and can be removed.
|
|
6
|
+
*
|
|
7
|
+
* Algorithm:
|
|
8
|
+
* 1. Build dependency graph from all entities
|
|
9
|
+
* 2. For each entity, compute transitive closure of its dependencies
|
|
10
|
+
* 3. Remove direct dependencies that are reachable through other paths
|
|
11
|
+
* 4. Return list of removed dependencies for Agent feedback
|
|
12
|
+
*/
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Dependency Graph
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Simple dependency graph for transitive analysis.
|
|
18
|
+
*/
|
|
19
|
+
class DependencyGraph {
|
|
20
|
+
adjacency = new Map();
|
|
21
|
+
addNode(id) {
|
|
22
|
+
if (!this.adjacency.has(id)) {
|
|
23
|
+
this.adjacency.set(id, new Set());
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
addEdge(from, to) {
|
|
27
|
+
this.addNode(from);
|
|
28
|
+
this.addNode(to);
|
|
29
|
+
this.adjacency.get(from).add(to);
|
|
30
|
+
}
|
|
31
|
+
getDirectDependencies(id) {
|
|
32
|
+
return this.adjacency.get(id) || new Set();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compute transitive closure for a node using BFS.
|
|
36
|
+
* Returns all nodes reachable from the given node.
|
|
37
|
+
*/
|
|
38
|
+
getTransitiveClosure(id) {
|
|
39
|
+
const reachable = new Set();
|
|
40
|
+
const queue = [...this.getDirectDependencies(id)];
|
|
41
|
+
while (queue.length > 0) {
|
|
42
|
+
const current = queue.shift();
|
|
43
|
+
if (reachable.has(current))
|
|
44
|
+
continue;
|
|
45
|
+
reachable.add(current);
|
|
46
|
+
for (const dep of this.getDirectDependencies(current)) {
|
|
47
|
+
if (!reachable.has(dep)) {
|
|
48
|
+
queue.push(dep);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return reachable;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find transitive dependencies for a node.
|
|
56
|
+
* A dependency is transitive if it's reachable through another direct dependency.
|
|
57
|
+
*/
|
|
58
|
+
findTransitiveDependencies(id) {
|
|
59
|
+
const direct = this.getDirectDependencies(id);
|
|
60
|
+
const transitive = [];
|
|
61
|
+
for (const dep of direct) {
|
|
62
|
+
// Check if this dependency is reachable through any other direct dependency
|
|
63
|
+
for (const otherDep of direct) {
|
|
64
|
+
if (otherDep === dep)
|
|
65
|
+
continue;
|
|
66
|
+
// Get transitive closure of otherDep
|
|
67
|
+
const reachableFromOther = this.getTransitiveClosure(otherDep);
|
|
68
|
+
if (reachableFromOther.has(dep)) {
|
|
69
|
+
transitive.push(dep);
|
|
70
|
+
break; // Found one path, no need to check others
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return transitive;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Transitive Dependency Remover
|
|
79
|
+
// =============================================================================
|
|
80
|
+
/**
|
|
81
|
+
* Service for removing transitive dependencies from entities.
|
|
82
|
+
*/
|
|
83
|
+
export class TransitiveDependencyRemover {
|
|
84
|
+
/**
|
|
85
|
+
* Analyze an entity's dependencies and find transitive ones.
|
|
86
|
+
* Does not modify the entity - returns what would be removed.
|
|
87
|
+
*/
|
|
88
|
+
analyzeEntity(entity, getDependencies) {
|
|
89
|
+
const dependsOn = entity.depends_on;
|
|
90
|
+
if (!dependsOn || dependsOn.length < 2) {
|
|
91
|
+
return null; // Need at least 2 dependencies for transitivity
|
|
92
|
+
}
|
|
93
|
+
// Build local graph for this entity's dependencies
|
|
94
|
+
const graph = new DependencyGraph();
|
|
95
|
+
graph.addNode(entity.id);
|
|
96
|
+
// Add direct dependencies
|
|
97
|
+
for (const dep of dependsOn) {
|
|
98
|
+
graph.addEdge(entity.id, dep);
|
|
99
|
+
}
|
|
100
|
+
// Add dependencies of dependencies (one level deep for efficiency)
|
|
101
|
+
for (const dep of dependsOn) {
|
|
102
|
+
const depDeps = getDependencies(dep);
|
|
103
|
+
for (const depDep of depDeps) {
|
|
104
|
+
graph.addEdge(dep, depDep);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Find transitive dependencies
|
|
108
|
+
const transitive = graph.findTransitiveDependencies(entity.id);
|
|
109
|
+
if (transitive.length === 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
entityId: entity.id,
|
|
114
|
+
removedDependencies: transitive,
|
|
115
|
+
message: `Removed ${transitive.length} transitive dependenc${transitive.length === 1 ? 'y' : 'ies'} from ${entity.id}: ${transitive.join(', ')}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Remove transitive dependencies from an entity.
|
|
120
|
+
* Returns the modified entity and removal result.
|
|
121
|
+
*/
|
|
122
|
+
removeTransitiveDependencies(entity, getDependencies) {
|
|
123
|
+
const analysis = this.analyzeEntity(entity, getDependencies);
|
|
124
|
+
if (!analysis) {
|
|
125
|
+
return { entity, result: null };
|
|
126
|
+
}
|
|
127
|
+
// Create a copy of the entity with transitive dependencies removed
|
|
128
|
+
const modifiedEntity = { ...entity };
|
|
129
|
+
const dependsOn = modifiedEntity.depends_on;
|
|
130
|
+
if (dependsOn) {
|
|
131
|
+
const removedSet = new Set(analysis.removedDependencies);
|
|
132
|
+
modifiedEntity.depends_on = dependsOn.filter((dep) => !removedSet.has(dep));
|
|
133
|
+
}
|
|
134
|
+
return { entity: modifiedEntity, result: analysis };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Process multiple entities and remove transitive dependencies.
|
|
138
|
+
*/
|
|
139
|
+
processEntities(entities, getDependencies) {
|
|
140
|
+
const removals = [];
|
|
141
|
+
for (const entity of entities) {
|
|
142
|
+
const result = this.analyzeEntity(entity, getDependencies);
|
|
143
|
+
if (result) {
|
|
144
|
+
removals.push(result);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
entitiesProcessed: entities.length,
|
|
149
|
+
totalRemoved: removals.reduce((sum, r) => sum + r.removedDependencies.length, 0),
|
|
150
|
+
removals,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** Default remover instance */
|
|
155
|
+
export const transitiveDependencyRemover = new TransitiveDependencyRemover();
|
|
156
|
+
//# sourceMappingURL=transitive-dependency-remover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitive-dependency-remover.js","sourceRoot":"","sources":["../../../src/services/v2/transitive-dependency-remover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitive-dependency-remover.test.d.ts","sourceRoot":"","sources":["../../../src/services/v2/transitive-dependency-remover.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Transitive Dependency Remover Service
|
|
3
|
+
*
|
|
4
|
+
* Tests transitive removal algorithm as specified in MCP_PLUGIN_ALIGNMENT.md Section 9.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { transitiveDependencyRemover, } from './transitive-dependency-remover.js';
|
|
8
|
+
// Helper to create a minimal story entity for testing
|
|
9
|
+
function createStory(id, dependsOn = []) {
|
|
10
|
+
return {
|
|
11
|
+
id: id,
|
|
12
|
+
type: 'story',
|
|
13
|
+
title: `Story ${id}`,
|
|
14
|
+
workstream: 'default',
|
|
15
|
+
status: 'Not Started',
|
|
16
|
+
priority: 'Medium',
|
|
17
|
+
depends_on: dependsOn,
|
|
18
|
+
archived: false,
|
|
19
|
+
canvas_source: '',
|
|
20
|
+
vault_path: '',
|
|
21
|
+
cssclasses: [],
|
|
22
|
+
created_at: new Date().toISOString(),
|
|
23
|
+
updated_at: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
describe('TransitiveDependencyRemover', () => {
|
|
27
|
+
describe('analyzeEntity', () => {
|
|
28
|
+
it('should detect transitive dependency A→B→C when A also depends on C', () => {
|
|
29
|
+
// A depends on B and C
|
|
30
|
+
// B depends on C
|
|
31
|
+
// Therefore A→C is transitive (reachable through B)
|
|
32
|
+
const entityA = createStory('S-001', ['S-002', 'S-003']);
|
|
33
|
+
const getDependencies = (id) => {
|
|
34
|
+
if (id === 'S-002')
|
|
35
|
+
return ['S-003'];
|
|
36
|
+
return [];
|
|
37
|
+
};
|
|
38
|
+
const result = transitiveDependencyRemover.analyzeEntity(entityA, getDependencies);
|
|
39
|
+
expect(result).not.toBeNull();
|
|
40
|
+
expect(result.removedDependencies).toContain('S-003');
|
|
41
|
+
expect(result.message).toContain('transitive');
|
|
42
|
+
});
|
|
43
|
+
it('should return null when no transitive dependencies exist', () => {
|
|
44
|
+
// A depends on B and C
|
|
45
|
+
// B and C are independent
|
|
46
|
+
const entityA = createStory('S-001', ['S-002', 'S-003']);
|
|
47
|
+
const getDependencies = (id) => {
|
|
48
|
+
return []; // No dependencies
|
|
49
|
+
};
|
|
50
|
+
const result = transitiveDependencyRemover.analyzeEntity(entityA, getDependencies);
|
|
51
|
+
expect(result).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
it('should return null when entity has fewer than 2 dependencies', () => {
|
|
54
|
+
const entityA = createStory('S-001', ['S-002']);
|
|
55
|
+
const getDependencies = (id) => {
|
|
56
|
+
return [];
|
|
57
|
+
};
|
|
58
|
+
const result = transitiveDependencyRemover.analyzeEntity(entityA, getDependencies);
|
|
59
|
+
expect(result).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
it('should handle multiple transitive dependencies', () => {
|
|
62
|
+
// A depends on B, C, D
|
|
63
|
+
// B depends on C and D
|
|
64
|
+
// Therefore A→C and A→D are both transitive
|
|
65
|
+
const entityA = createStory('S-001', ['S-002', 'S-003', 'S-004']);
|
|
66
|
+
const getDependencies = (id) => {
|
|
67
|
+
if (id === 'S-002')
|
|
68
|
+
return ['S-003', 'S-004'];
|
|
69
|
+
return [];
|
|
70
|
+
};
|
|
71
|
+
const result = transitiveDependencyRemover.analyzeEntity(entityA, getDependencies);
|
|
72
|
+
expect(result).not.toBeNull();
|
|
73
|
+
expect(result.removedDependencies).toHaveLength(2);
|
|
74
|
+
expect(result.removedDependencies).toContain('S-003');
|
|
75
|
+
expect(result.removedDependencies).toContain('S-004');
|
|
76
|
+
});
|
|
77
|
+
it('should handle diamond dependency pattern', () => {
|
|
78
|
+
// A depends on B, C, D
|
|
79
|
+
// B depends on D
|
|
80
|
+
// C depends on D
|
|
81
|
+
// Therefore A→D is transitive (reachable through both B and C)
|
|
82
|
+
const entityA = createStory('S-001', ['S-002', 'S-003', 'S-004']);
|
|
83
|
+
const getDependencies = (id) => {
|
|
84
|
+
if (id === 'S-002')
|
|
85
|
+
return ['S-004'];
|
|
86
|
+
if (id === 'S-003')
|
|
87
|
+
return ['S-004'];
|
|
88
|
+
return [];
|
|
89
|
+
};
|
|
90
|
+
const result = transitiveDependencyRemover.analyzeEntity(entityA, getDependencies);
|
|
91
|
+
expect(result).not.toBeNull();
|
|
92
|
+
expect(result.removedDependencies).toContain('S-004');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('removeTransitiveDependencies', () => {
|
|
96
|
+
it('should return modified entity with transitive dependencies removed', () => {
|
|
97
|
+
const entityA = createStory('S-001', ['S-002', 'S-003']);
|
|
98
|
+
const getDependencies = (id) => {
|
|
99
|
+
if (id === 'S-002')
|
|
100
|
+
return ['S-003'];
|
|
101
|
+
return [];
|
|
102
|
+
};
|
|
103
|
+
const { entity, result } = transitiveDependencyRemover.removeTransitiveDependencies(entityA, getDependencies);
|
|
104
|
+
expect(result).not.toBeNull();
|
|
105
|
+
expect(entity.depends_on).toEqual(['S-002']);
|
|
106
|
+
expect(entity.depends_on).not.toContain('S-003');
|
|
107
|
+
});
|
|
108
|
+
it('should not modify entity when no transitive dependencies exist', () => {
|
|
109
|
+
const entityA = createStory('S-001', ['S-002', 'S-003']);
|
|
110
|
+
const getDependencies = (id) => {
|
|
111
|
+
return [];
|
|
112
|
+
};
|
|
113
|
+
const { entity, result } = transitiveDependencyRemover.removeTransitiveDependencies(entityA, getDependencies);
|
|
114
|
+
expect(result).toBeNull();
|
|
115
|
+
expect(entity.depends_on).toEqual(['S-002', 'S-003']);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=transitive-dependency-remover.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transitive-dependency-remover.test.js","sourceRoot":"","sources":["../../../src/services/v2/transitive-dependency-remover.test.ts"],"names":[],"mappings":"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"}
|