obsidian-accomplishments-mcp 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/README.md +154 -182
  2. package/dist/index.js +207 -38
  3. package/dist/index.js.map +1 -1
  4. package/dist/integration.test.d.ts +8 -0
  5. package/dist/integration.test.d.ts.map +1 -0
  6. package/dist/integration.test.js +979 -0
  7. package/dist/integration.test.js.map +1 -0
  8. package/dist/models/types.d.ts +1 -2
  9. package/dist/models/types.d.ts.map +1 -1
  10. package/dist/models/types.js.map +1 -1
  11. package/dist/models/v2-types.d.ts +460 -0
  12. package/dist/models/v2-types.d.ts.map +1 -0
  13. package/dist/models/v2-types.js +137 -0
  14. package/dist/models/v2-types.js.map +1 -0
  15. package/dist/models/v2-types.test.d.ts +5 -0
  16. package/dist/models/v2-types.test.d.ts.map +1 -0
  17. package/dist/models/v2-types.test.js +133 -0
  18. package/dist/models/v2-types.test.js.map +1 -0
  19. package/dist/parsers/canvas-parser.d.ts +1 -1
  20. package/dist/parsers/canvas-parser.d.ts.map +1 -1
  21. package/dist/parsers/canvas-parser.js +1 -1
  22. package/dist/parsers/canvas-parser.js.map +1 -1
  23. package/dist/parsers/markdown-parser.js +9 -9
  24. package/dist/parsers/markdown-parser.js.map +1 -1
  25. package/dist/services/v2/archive-manager.d.ts +96 -0
  26. package/dist/services/v2/archive-manager.d.ts.map +1 -0
  27. package/dist/services/v2/archive-manager.js +281 -0
  28. package/dist/services/v2/archive-manager.js.map +1 -0
  29. package/dist/services/v2/canvas-manager.d.ts +155 -0
  30. package/dist/services/v2/canvas-manager.d.ts.map +1 -0
  31. package/dist/services/v2/canvas-manager.js +540 -0
  32. package/dist/services/v2/canvas-manager.js.map +1 -0
  33. package/dist/services/v2/canvas-manager.test.d.ts +5 -0
  34. package/dist/services/v2/canvas-manager.test.d.ts.map +1 -0
  35. package/dist/services/v2/canvas-manager.test.js +327 -0
  36. package/dist/services/v2/canvas-manager.test.js.map +1 -0
  37. package/dist/services/v2/cascade-manager.d.ts +54 -0
  38. package/dist/services/v2/cascade-manager.d.ts.map +1 -0
  39. package/dist/services/v2/cascade-manager.js +220 -0
  40. package/dist/services/v2/cascade-manager.js.map +1 -0
  41. package/dist/services/v2/cycle-detector.d.ts +76 -0
  42. package/dist/services/v2/cycle-detector.d.ts.map +1 -0
  43. package/dist/services/v2/cycle-detector.js +183 -0
  44. package/dist/services/v2/cycle-detector.js.map +1 -0
  45. package/dist/services/v2/cycle-detector.test.d.ts +7 -0
  46. package/dist/services/v2/cycle-detector.test.d.ts.map +1 -0
  47. package/dist/services/v2/cycle-detector.test.js +125 -0
  48. package/dist/services/v2/cycle-detector.test.js.map +1 -0
  49. package/dist/services/v2/entity-parser.d.ts +54 -0
  50. package/dist/services/v2/entity-parser.d.ts.map +1 -0
  51. package/dist/services/v2/entity-parser.js +418 -0
  52. package/dist/services/v2/entity-parser.js.map +1 -0
  53. package/dist/services/v2/entity-parser.test.d.ts +5 -0
  54. package/dist/services/v2/entity-parser.test.d.ts.map +1 -0
  55. package/dist/services/v2/entity-parser.test.js +637 -0
  56. package/dist/services/v2/entity-parser.test.js.map +1 -0
  57. package/dist/services/v2/entity-serializer.d.ts +94 -0
  58. package/dist/services/v2/entity-serializer.d.ts.map +1 -0
  59. package/dist/services/v2/entity-serializer.js +583 -0
  60. package/dist/services/v2/entity-serializer.js.map +1 -0
  61. package/dist/services/v2/entity-serializer.test.d.ts +5 -0
  62. package/dist/services/v2/entity-serializer.test.d.ts.map +1 -0
  63. package/dist/services/v2/entity-serializer.test.js +241 -0
  64. package/dist/services/v2/entity-serializer.test.js.map +1 -0
  65. package/dist/services/v2/entity-validator.d.ts +65 -0
  66. package/dist/services/v2/entity-validator.d.ts.map +1 -0
  67. package/dist/services/v2/entity-validator.js +573 -0
  68. package/dist/services/v2/entity-validator.js.map +1 -0
  69. package/dist/services/v2/entity-validator.test.d.ts +5 -0
  70. package/dist/services/v2/entity-validator.test.d.ts.map +1 -0
  71. package/dist/services/v2/entity-validator.test.js +519 -0
  72. package/dist/services/v2/entity-validator.test.js.map +1 -0
  73. package/dist/services/v2/file-manager.d.ts +73 -0
  74. package/dist/services/v2/file-manager.d.ts.map +1 -0
  75. package/dist/services/v2/file-manager.js +310 -0
  76. package/dist/services/v2/file-manager.js.map +1 -0
  77. package/dist/services/v2/file-manager.test.d.ts +5 -0
  78. package/dist/services/v2/file-manager.test.d.ts.map +1 -0
  79. package/dist/services/v2/file-manager.test.js +339 -0
  80. package/dist/services/v2/file-manager.test.js.map +1 -0
  81. package/dist/services/v2/index-manager.d.ts +68 -0
  82. package/dist/services/v2/index-manager.d.ts.map +1 -0
  83. package/dist/services/v2/index-manager.js +228 -0
  84. package/dist/services/v2/index-manager.js.map +1 -0
  85. package/dist/services/v2/index-manager.test.d.ts +5 -0
  86. package/dist/services/v2/index-manager.test.d.ts.map +1 -0
  87. package/dist/services/v2/index-manager.test.js +386 -0
  88. package/dist/services/v2/index-manager.test.js.map +1 -0
  89. package/dist/services/v2/index-service.d.ts +82 -0
  90. package/dist/services/v2/index-service.d.ts.map +1 -0
  91. package/dist/services/v2/index-service.js +274 -0
  92. package/dist/services/v2/index-service.js.map +1 -0
  93. package/dist/services/v2/index-service.test.d.ts +5 -0
  94. package/dist/services/v2/index-service.test.d.ts.map +1 -0
  95. package/dist/services/v2/index-service.test.js +117 -0
  96. package/dist/services/v2/index-service.test.js.map +1 -0
  97. package/dist/services/v2/lifecycle-manager.d.ts +59 -0
  98. package/dist/services/v2/lifecycle-manager.d.ts.map +1 -0
  99. package/dist/services/v2/lifecycle-manager.js +310 -0
  100. package/dist/services/v2/lifecycle-manager.js.map +1 -0
  101. package/dist/services/v2/lifecycle-manager.test.d.ts +5 -0
  102. package/dist/services/v2/lifecycle-manager.test.d.ts.map +1 -0
  103. package/dist/services/v2/lifecycle-manager.test.js +141 -0
  104. package/dist/services/v2/lifecycle-manager.test.js.map +1 -0
  105. package/dist/services/v2/path-resolver.d.ts +64 -0
  106. package/dist/services/v2/path-resolver.d.ts.map +1 -0
  107. package/dist/services/v2/path-resolver.js +174 -0
  108. package/dist/services/v2/path-resolver.js.map +1 -0
  109. package/dist/services/v2/progress-computer.d.ts +46 -0
  110. package/dist/services/v2/progress-computer.d.ts.map +1 -0
  111. package/dist/services/v2/progress-computer.js +200 -0
  112. package/dist/services/v2/progress-computer.js.map +1 -0
  113. package/dist/services/v2/search-service.d.ts +68 -0
  114. package/dist/services/v2/search-service.d.ts.map +1 -0
  115. package/dist/services/v2/search-service.js +194 -0
  116. package/dist/services/v2/search-service.js.map +1 -0
  117. package/dist/services/v2/transitive-dependency-remover.d.ts +54 -0
  118. package/dist/services/v2/transitive-dependency-remover.d.ts.map +1 -0
  119. package/dist/services/v2/transitive-dependency-remover.js +156 -0
  120. package/dist/services/v2/transitive-dependency-remover.js.map +1 -0
  121. package/dist/services/v2/transitive-dependency-remover.test.d.ts +7 -0
  122. package/dist/services/v2/transitive-dependency-remover.test.d.ts.map +1 -0
  123. package/dist/services/v2/transitive-dependency-remover.test.js +119 -0
  124. package/dist/services/v2/transitive-dependency-remover.test.js.map +1 -0
  125. package/dist/services/v2/v2-runtime.d.ts +374 -0
  126. package/dist/services/v2/v2-runtime.d.ts.map +1 -0
  127. package/dist/services/v2/v2-runtime.js +1908 -0
  128. package/dist/services/v2/v2-runtime.js.map +1 -0
  129. package/dist/services/v2/v2-runtime.test.d.ts +5 -0
  130. package/dist/services/v2/v2-runtime.test.d.ts.map +1 -0
  131. package/dist/services/v2/v2-runtime.test.js +658 -0
  132. package/dist/services/v2/v2-runtime.test.js.map +1 -0
  133. package/dist/services/v2/workstream-normalizer.d.ts +59 -0
  134. package/dist/services/v2/workstream-normalizer.d.ts.map +1 -0
  135. package/dist/services/v2/workstream-normalizer.js +137 -0
  136. package/dist/services/v2/workstream-normalizer.js.map +1 -0
  137. package/dist/services/v2/workstream-normalizer.test.d.ts +7 -0
  138. package/dist/services/v2/workstream-normalizer.test.d.ts.map +1 -0
  139. package/dist/services/v2/workstream-normalizer.test.js +130 -0
  140. package/dist/services/v2/workstream-normalizer.test.js.map +1 -0
  141. package/dist/test-runner.d.ts +4 -1
  142. package/dist/test-runner.d.ts.map +1 -1
  143. package/dist/test-runner.js +44 -249
  144. package/dist/test-runner.js.map +1 -1
  145. package/dist/tools/batch-operations-tools.d.ts +54 -0
  146. package/dist/tools/batch-operations-tools.d.ts.map +1 -0
  147. package/dist/tools/batch-operations-tools.js +370 -0
  148. package/dist/tools/batch-operations-tools.js.map +1 -0
  149. package/dist/tools/decision-document-tools.d.ts +78 -0
  150. package/dist/tools/decision-document-tools.d.ts.map +1 -0
  151. package/dist/tools/decision-document-tools.js +260 -0
  152. package/dist/tools/decision-document-tools.js.map +1 -0
  153. package/dist/tools/entity-management-tools.d.ts +79 -0
  154. package/dist/tools/entity-management-tools.d.ts.map +1 -0
  155. package/dist/tools/entity-management-tools.js +851 -0
  156. package/dist/tools/entity-management-tools.js.map +1 -0
  157. package/dist/tools/entity-management-tools.test.d.ts +5 -0
  158. package/dist/tools/entity-management-tools.test.d.ts.map +1 -0
  159. package/dist/tools/entity-management-tools.test.js +530 -0
  160. package/dist/tools/entity-management-tools.test.js.map +1 -0
  161. package/dist/tools/index.d.ts +15 -271
  162. package/dist/tools/index.d.ts.map +1 -1
  163. package/dist/tools/index.js +510 -47
  164. package/dist/tools/index.js.map +1 -1
  165. package/dist/tools/index.test.d.ts +8 -0
  166. package/dist/tools/index.test.d.ts.map +1 -0
  167. package/dist/tools/index.test.js +429 -0
  168. package/dist/tools/index.test.js.map +1 -0
  169. package/dist/tools/project-understanding-tools.d.ts +75 -0
  170. package/dist/tools/project-understanding-tools.d.ts.map +1 -0
  171. package/dist/tools/project-understanding-tools.js +751 -0
  172. package/dist/tools/project-understanding-tools.js.map +1 -0
  173. package/dist/tools/search-navigation-tools.d.ts +77 -0
  174. package/dist/tools/search-navigation-tools.d.ts.map +1 -0
  175. package/dist/tools/search-navigation-tools.js +379 -0
  176. package/dist/tools/search-navigation-tools.js.map +1 -0
  177. package/dist/tools/tool-types.d.ts +703 -0
  178. package/dist/tools/tool-types.d.ts.map +1 -0
  179. package/dist/tools/tool-types.js +7 -0
  180. package/dist/tools/tool-types.js.map +1 -0
  181. package/dist/utils/config.d.ts +0 -4
  182. package/dist/utils/config.d.ts.map +1 -1
  183. package/dist/utils/config.js +2 -19
  184. package/dist/utils/config.js.map +1 -1
  185. package/package.json +16 -1
  186. package/dist/services/accomplishment-service.d.ts +0 -33
  187. package/dist/services/accomplishment-service.d.ts.map +0 -1
  188. package/dist/services/accomplishment-service.js +0 -293
  189. package/dist/services/accomplishment-service.js.map +0 -1
  190. package/dist/services/canvas-service.d.ts +0 -96
  191. package/dist/services/canvas-service.d.ts.map +0 -1
  192. package/dist/services/canvas-service.js +0 -231
  193. package/dist/services/canvas-service.js.map +0 -1
  194. package/dist/services/context-doc-service.d.ts +0 -70
  195. package/dist/services/context-doc-service.d.ts.map +0 -1
  196. package/dist/services/context-doc-service.js +0 -229
  197. package/dist/services/context-doc-service.js.map +0 -1
  198. package/dist/services/dependency-service.d.ts +0 -22
  199. package/dist/services/dependency-service.d.ts.map +0 -1
  200. package/dist/services/dependency-service.js +0 -99
  201. package/dist/services/dependency-service.js.map +0 -1
  202. package/dist/services/status-indicator-service.d.ts +0 -40
  203. package/dist/services/status-indicator-service.d.ts.map +0 -1
  204. package/dist/services/status-indicator-service.js +0 -173
  205. package/dist/services/status-indicator-service.js.map +0 -1
  206. package/dist/services/task-service.d.ts +0 -32
  207. package/dist/services/task-service.d.ts.map +0 -1
  208. package/dist/services/task-service.js +0 -152
  209. package/dist/services/task-service.js.map +0 -1
  210. package/dist/test-real-vault.d.ts +0 -6
  211. package/dist/test-real-vault.d.ts.map +0 -1
  212. package/dist/test-real-vault.js +0 -30
  213. package/dist/test-real-vault.js.map +0 -1
  214. package/dist/tools/batch-operations.d.ts +0 -246
  215. package/dist/tools/batch-operations.d.ts.map +0 -1
  216. package/dist/tools/batch-operations.js +0 -235
  217. package/dist/tools/batch-operations.js.map +0 -1
  218. package/dist/tools/get-accomplishment.d.ts +0 -26
  219. package/dist/tools/get-accomplishment.d.ts.map +0 -1
  220. package/dist/tools/get-accomplishment.js +0 -53
  221. package/dist/tools/get-accomplishment.js.map +0 -1
  222. package/dist/tools/get-accomplishments-graph.d.ts +0 -26
  223. package/dist/tools/get-accomplishments-graph.d.ts.map +0 -1
  224. package/dist/tools/get-accomplishments-graph.js +0 -137
  225. package/dist/tools/get-accomplishments-graph.js.map +0 -1
  226. package/dist/tools/get-blocked-items.d.ts +0 -15
  227. package/dist/tools/get-blocked-items.d.ts.map +0 -1
  228. package/dist/tools/get-blocked-items.js +0 -73
  229. package/dist/tools/get-blocked-items.js.map +0 -1
  230. package/dist/tools/get-current-work.d.ts +0 -15
  231. package/dist/tools/get-current-work.d.ts.map +0 -1
  232. package/dist/tools/get-current-work.js +0 -68
  233. package/dist/tools/get-current-work.js.map +0 -1
  234. package/dist/tools/get-project-status.d.ts +0 -26
  235. package/dist/tools/get-project-status.d.ts.map +0 -1
  236. package/dist/tools/get-project-status.js +0 -98
  237. package/dist/tools/get-project-status.js.map +0 -1
  238. package/dist/tools/get-ready-to-start.d.ts +0 -15
  239. package/dist/tools/get-ready-to-start.d.ts.map +0 -1
  240. package/dist/tools/get-ready-to-start.js +0 -47
  241. package/dist/tools/get-ready-to-start.js.map +0 -1
  242. package/dist/tools/list-accomplishments.d.ts +0 -34
  243. package/dist/tools/list-accomplishments.d.ts.map +0 -1
  244. package/dist/tools/list-accomplishments.js +0 -34
  245. package/dist/tools/list-accomplishments.js.map +0 -1
  246. package/dist/tools/manage-accomplishment.d.ts +0 -147
  247. package/dist/tools/manage-accomplishment.d.ts.map +0 -1
  248. package/dist/tools/manage-accomplishment.js +0 -153
  249. package/dist/tools/manage-accomplishment.js.map +0 -1
  250. package/dist/tools/manage-dependency.d.ts +0 -41
  251. package/dist/tools/manage-dependency.d.ts.map +0 -1
  252. package/dist/tools/manage-dependency.js +0 -66
  253. package/dist/tools/manage-dependency.js.map +0 -1
  254. package/dist/tools/manage-task.d.ts +0 -119
  255. package/dist/tools/manage-task.d.ts.map +0 -1
  256. package/dist/tools/manage-task.js +0 -126
  257. package/dist/tools/manage-task.js.map +0 -1
  258. package/dist/tools/reconcile-canvas.d.ts +0 -33
  259. package/dist/tools/reconcile-canvas.d.ts.map +0 -1
  260. package/dist/tools/reconcile-canvas.js +0 -41
  261. package/dist/tools/reconcile-canvas.js.map +0 -1
  262. package/dist/tools/set-work-focus.d.ts +0 -48
  263. package/dist/tools/set-work-focus.d.ts.map +0 -1
  264. package/dist/tools/set-work-focus.js +0 -78
  265. package/dist/tools/set-work-focus.js.map +0 -1
  266. package/dist/tools/sync-dependencies.d.ts +0 -33
  267. package/dist/tools/sync-dependencies.d.ts.map +0 -1
  268. package/dist/tools/sync-dependencies.js +0 -144
  269. package/dist/tools/sync-dependencies.js.map +0 -1
@@ -0,0 +1,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,7 @@
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
+ export {};
7
+ //# sourceMappingURL=transitive-dependency-remover.test.d.ts.map
@@ -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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"}