opentasks 0.0.4 → 0.0.6

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 (373) hide show
  1. package/README.md +40 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +183 -21
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/client.d.ts.map +1 -1
  6. package/dist/client/client.js +14 -1
  7. package/dist/client/client.js.map +1 -1
  8. package/dist/config/schema.d.ts +139 -3
  9. package/dist/config/schema.d.ts.map +1 -1
  10. package/dist/config/schema.js +118 -2
  11. package/dist/config/schema.js.map +1 -1
  12. package/dist/core/discover.d.ts.map +1 -1
  13. package/dist/core/discover.js +55 -39
  14. package/dist/core/discover.js.map +1 -1
  15. package/dist/core/init.js +1 -1
  16. package/dist/core/init.js.map +1 -1
  17. package/dist/core/merge-driver.d.ts +6 -2
  18. package/dist/core/merge-driver.d.ts.map +1 -1
  19. package/dist/core/merge-driver.js +11 -7
  20. package/dist/core/merge-driver.js.map +1 -1
  21. package/dist/core/worktree.js +1 -1
  22. package/dist/core/worktree.js.map +1 -1
  23. package/dist/daemon/entire-linker.d.ts.map +1 -1
  24. package/dist/daemon/entire-linker.js +48 -42
  25. package/dist/daemon/entire-linker.js.map +1 -1
  26. package/dist/daemon/entire-watcher.d.ts +12 -1
  27. package/dist/daemon/entire-watcher.d.ts.map +1 -1
  28. package/dist/daemon/entire-watcher.js +34 -3
  29. package/dist/daemon/entire-watcher.js.map +1 -1
  30. package/dist/daemon/ipc.d.ts +9 -1
  31. package/dist/daemon/ipc.d.ts.map +1 -1
  32. package/dist/daemon/ipc.js +45 -2
  33. package/dist/daemon/ipc.js.map +1 -1
  34. package/dist/daemon/lifecycle.d.ts.map +1 -1
  35. package/dist/daemon/lifecycle.js +77 -3
  36. package/dist/daemon/lifecycle.js.map +1 -1
  37. package/dist/daemon/location-state.d.ts +3 -0
  38. package/dist/daemon/location-state.d.ts.map +1 -1
  39. package/dist/daemon/location-state.js +49 -2
  40. package/dist/daemon/location-state.js.map +1 -1
  41. package/dist/daemon/methods/watch.d.ts +23 -0
  42. package/dist/daemon/methods/watch.d.ts.map +1 -0
  43. package/dist/daemon/methods/watch.js +172 -0
  44. package/dist/daemon/methods/watch.js.map +1 -0
  45. package/dist/daemon/registry.d.ts.map +1 -1
  46. package/dist/daemon/registry.js +2 -1
  47. package/dist/daemon/registry.js.map +1 -1
  48. package/dist/entire/index.d.ts +1 -0
  49. package/dist/entire/index.d.ts.map +1 -1
  50. package/dist/entire/index.js.map +1 -1
  51. package/dist/entire/store/native-store.d.ts +1 -1
  52. package/dist/entire/store/native-store.d.ts.map +1 -1
  53. package/dist/entire/store/provider-types.d.ts +78 -0
  54. package/dist/entire/store/provider-types.d.ts.map +1 -0
  55. package/dist/entire/store/provider-types.js +12 -0
  56. package/dist/entire/store/provider-types.js.map +1 -0
  57. package/dist/graph/expansion.d.ts +3 -1
  58. package/dist/graph/expansion.d.ts.map +1 -1
  59. package/dist/graph/expansion.js +32 -2
  60. package/dist/graph/expansion.js.map +1 -1
  61. package/dist/graph/git-graph-syncer.d.ts +72 -0
  62. package/dist/graph/git-graph-syncer.d.ts.map +1 -0
  63. package/dist/graph/git-graph-syncer.js +205 -0
  64. package/dist/graph/git-graph-syncer.js.map +1 -0
  65. package/dist/graph/store.d.ts +4 -0
  66. package/dist/graph/store.d.ts.map +1 -1
  67. package/dist/graph/store.js +97 -2
  68. package/dist/graph/store.js.map +1 -1
  69. package/dist/providers/entire.d.ts +34 -69
  70. package/dist/providers/entire.d.ts.map +1 -1
  71. package/dist/providers/entire.js +63 -9
  72. package/dist/providers/entire.js.map +1 -1
  73. package/dist/providers/from-config.d.ts +3 -0
  74. package/dist/providers/from-config.d.ts.map +1 -1
  75. package/dist/providers/from-config.js +45 -20
  76. package/dist/providers/from-config.js.map +1 -1
  77. package/dist/providers/global.d.ts +2 -1
  78. package/dist/providers/global.d.ts.map +1 -1
  79. package/dist/providers/global.js +52 -1
  80. package/dist/providers/global.js.map +1 -1
  81. package/dist/providers/index.d.ts +3 -0
  82. package/dist/providers/index.d.ts.map +1 -1
  83. package/dist/providers/index.js +6 -0
  84. package/dist/providers/index.js.map +1 -1
  85. package/dist/providers/map-client-factory.d.ts +55 -0
  86. package/dist/providers/map-client-factory.d.ts.map +1 -0
  87. package/dist/providers/map-client-factory.js +123 -0
  88. package/dist/providers/map-client-factory.js.map +1 -0
  89. package/dist/providers/map-event-bridge.d.ts +146 -0
  90. package/dist/providers/map-event-bridge.d.ts.map +1 -0
  91. package/dist/providers/map-event-bridge.js +208 -0
  92. package/dist/providers/map-event-bridge.js.map +1 -0
  93. package/dist/providers/map.d.ts +115 -0
  94. package/dist/providers/map.d.ts.map +1 -0
  95. package/dist/providers/map.js +376 -0
  96. package/dist/providers/map.js.map +1 -0
  97. package/dist/tracking/index.d.ts +0 -4
  98. package/dist/tracking/index.d.ts.map +1 -1
  99. package/dist/tracking/index.js +0 -2
  100. package/dist/tracking/index.js.map +1 -1
  101. package/dist/tracking/transcript-extractor.d.ts +0 -6
  102. package/dist/tracking/transcript-extractor.d.ts.map +1 -1
  103. package/dist/tracking/transcript-extractor.js +3 -12
  104. package/dist/tracking/transcript-extractor.js.map +1 -1
  105. package/package.json +3 -1
  106. package/dist/__tests__/cli-tools.test.d.ts +0 -8
  107. package/dist/__tests__/cli-tools.test.d.ts.map +0 -1
  108. package/dist/__tests__/cli-tools.test.js +0 -546
  109. package/dist/__tests__/cli-tools.test.js.map +0 -1
  110. package/dist/__tests__/cli.test.d.ts +0 -5
  111. package/dist/__tests__/cli.test.d.ts.map +0 -1
  112. package/dist/__tests__/cli.test.js +0 -77
  113. package/dist/__tests__/cli.test.js.map +0 -1
  114. package/dist/__tests__/p1-p3-gaps.test.d.ts +0 -2
  115. package/dist/__tests__/p1-p3-gaps.test.d.ts.map +0 -1
  116. package/dist/__tests__/p1-p3-gaps.test.js +0 -463
  117. package/dist/__tests__/p1-p3-gaps.test.js.map +0 -1
  118. package/dist/client/__tests__/client-crud.test.d.ts +0 -7
  119. package/dist/client/__tests__/client-crud.test.d.ts.map +0 -1
  120. package/dist/client/__tests__/client-crud.test.js +0 -404
  121. package/dist/client/__tests__/client-crud.test.js.map +0 -1
  122. package/dist/client/__tests__/client.test.d.ts +0 -5
  123. package/dist/client/__tests__/client.test.d.ts.map +0 -1
  124. package/dist/client/__tests__/client.test.js +0 -518
  125. package/dist/client/__tests__/client.test.js.map +0 -1
  126. package/dist/config/__tests__/defaults.test.d.ts +0 -2
  127. package/dist/config/__tests__/defaults.test.d.ts.map +0 -1
  128. package/dist/config/__tests__/defaults.test.js +0 -57
  129. package/dist/config/__tests__/defaults.test.js.map +0 -1
  130. package/dist/config/__tests__/env.test.d.ts +0 -2
  131. package/dist/config/__tests__/env.test.d.ts.map +0 -1
  132. package/dist/config/__tests__/env.test.js +0 -136
  133. package/dist/config/__tests__/env.test.js.map +0 -1
  134. package/dist/config/__tests__/index.test.d.ts +0 -2
  135. package/dist/config/__tests__/index.test.d.ts.map +0 -1
  136. package/dist/config/__tests__/index.test.js +0 -113
  137. package/dist/config/__tests__/index.test.js.map +0 -1
  138. package/dist/config/__tests__/loader.test.d.ts +0 -2
  139. package/dist/config/__tests__/loader.test.d.ts.map +0 -1
  140. package/dist/config/__tests__/loader.test.js +0 -128
  141. package/dist/config/__tests__/loader.test.js.map +0 -1
  142. package/dist/config/__tests__/merge.test.d.ts +0 -2
  143. package/dist/config/__tests__/merge.test.d.ts.map +0 -1
  144. package/dist/config/__tests__/merge.test.js +0 -79
  145. package/dist/config/__tests__/merge.test.js.map +0 -1
  146. package/dist/config/__tests__/schema.test.d.ts +0 -2
  147. package/dist/config/__tests__/schema.test.d.ts.map +0 -1
  148. package/dist/config/__tests__/schema.test.js +0 -300
  149. package/dist/config/__tests__/schema.test.js.map +0 -1
  150. package/dist/core/__tests__/conditional-redirects.test.d.ts +0 -2
  151. package/dist/core/__tests__/conditional-redirects.test.d.ts.map +0 -1
  152. package/dist/core/__tests__/conditional-redirects.test.js +0 -83
  153. package/dist/core/__tests__/conditional-redirects.test.js.map +0 -1
  154. package/dist/core/__tests__/connections.test.d.ts +0 -2
  155. package/dist/core/__tests__/connections.test.d.ts.map +0 -1
  156. package/dist/core/__tests__/connections.test.js +0 -158
  157. package/dist/core/__tests__/connections.test.js.map +0 -1
  158. package/dist/core/__tests__/hash.test.d.ts +0 -2
  159. package/dist/core/__tests__/hash.test.d.ts.map +0 -1
  160. package/dist/core/__tests__/hash.test.js +0 -139
  161. package/dist/core/__tests__/hash.test.js.map +0 -1
  162. package/dist/core/__tests__/id.test.d.ts +0 -2
  163. package/dist/core/__tests__/id.test.d.ts.map +0 -1
  164. package/dist/core/__tests__/id.test.js +0 -142
  165. package/dist/core/__tests__/id.test.js.map +0 -1
  166. package/dist/core/__tests__/location.test.d.ts +0 -2
  167. package/dist/core/__tests__/location.test.d.ts.map +0 -1
  168. package/dist/core/__tests__/location.test.js +0 -77
  169. package/dist/core/__tests__/location.test.js.map +0 -1
  170. package/dist/core/__tests__/merge-driver.test.d.ts +0 -2
  171. package/dist/core/__tests__/merge-driver.test.d.ts.map +0 -1
  172. package/dist/core/__tests__/merge-driver.test.js +0 -218
  173. package/dist/core/__tests__/merge-driver.test.js.map +0 -1
  174. package/dist/core/__tests__/redirects.test.d.ts +0 -2
  175. package/dist/core/__tests__/redirects.test.d.ts.map +0 -1
  176. package/dist/core/__tests__/redirects.test.js +0 -123
  177. package/dist/core/__tests__/redirects.test.js.map +0 -1
  178. package/dist/core/__tests__/resolve-location-target.test.d.ts +0 -8
  179. package/dist/core/__tests__/resolve-location-target.test.d.ts.map +0 -1
  180. package/dist/core/__tests__/resolve-location-target.test.js +0 -303
  181. package/dist/core/__tests__/resolve-location-target.test.js.map +0 -1
  182. package/dist/core/__tests__/uri.test.d.ts +0 -2
  183. package/dist/core/__tests__/uri.test.d.ts.map +0 -1
  184. package/dist/core/__tests__/uri.test.js +0 -159
  185. package/dist/core/__tests__/uri.test.js.map +0 -1
  186. package/dist/core/__tests__/worktree.test.d.ts +0 -2
  187. package/dist/core/__tests__/worktree.test.d.ts.map +0 -1
  188. package/dist/core/__tests__/worktree.test.js +0 -120
  189. package/dist/core/__tests__/worktree.test.js.map +0 -1
  190. package/dist/daemon/__tests__/flush.test.d.ts +0 -5
  191. package/dist/daemon/__tests__/flush.test.d.ts.map +0 -1
  192. package/dist/daemon/__tests__/flush.test.js +0 -213
  193. package/dist/daemon/__tests__/flush.test.js.map +0 -1
  194. package/dist/daemon/__tests__/integration.test.d.ts +0 -7
  195. package/dist/daemon/__tests__/integration.test.d.ts.map +0 -1
  196. package/dist/daemon/__tests__/integration.test.js +0 -276
  197. package/dist/daemon/__tests__/integration.test.js.map +0 -1
  198. package/dist/daemon/__tests__/ipc.test.d.ts +0 -5
  199. package/dist/daemon/__tests__/ipc.test.d.ts.map +0 -1
  200. package/dist/daemon/__tests__/ipc.test.js +0 -314
  201. package/dist/daemon/__tests__/ipc.test.js.map +0 -1
  202. package/dist/daemon/__tests__/lifecycle.test.d.ts +0 -5
  203. package/dist/daemon/__tests__/lifecycle.test.d.ts.map +0 -1
  204. package/dist/daemon/__tests__/lifecycle.test.js +0 -301
  205. package/dist/daemon/__tests__/lifecycle.test.js.map +0 -1
  206. package/dist/daemon/__tests__/lock.test.d.ts +0 -5
  207. package/dist/daemon/__tests__/lock.test.d.ts.map +0 -1
  208. package/dist/daemon/__tests__/lock.test.js +0 -192
  209. package/dist/daemon/__tests__/lock.test.js.map +0 -1
  210. package/dist/daemon/__tests__/methods/graph.test.d.ts +0 -5
  211. package/dist/daemon/__tests__/methods/graph.test.d.ts.map +0 -1
  212. package/dist/daemon/__tests__/methods/graph.test.js +0 -309
  213. package/dist/daemon/__tests__/methods/graph.test.js.map +0 -1
  214. package/dist/daemon/__tests__/methods/provider.test.d.ts +0 -7
  215. package/dist/daemon/__tests__/methods/provider.test.d.ts.map +0 -1
  216. package/dist/daemon/__tests__/methods/provider.test.js +0 -181
  217. package/dist/daemon/__tests__/methods/provider.test.js.map +0 -1
  218. package/dist/daemon/__tests__/methods/tools.test.d.ts +0 -5
  219. package/dist/daemon/__tests__/methods/tools.test.d.ts.map +0 -1
  220. package/dist/daemon/__tests__/methods/tools.test.js +0 -587
  221. package/dist/daemon/__tests__/methods/tools.test.js.map +0 -1
  222. package/dist/daemon/__tests__/multi-location.test.d.ts +0 -8
  223. package/dist/daemon/__tests__/multi-location.test.d.ts.map +0 -1
  224. package/dist/daemon/__tests__/multi-location.test.js +0 -669
  225. package/dist/daemon/__tests__/multi-location.test.js.map +0 -1
  226. package/dist/daemon/__tests__/registry.test.d.ts +0 -5
  227. package/dist/daemon/__tests__/registry.test.d.ts.map +0 -1
  228. package/dist/daemon/__tests__/registry.test.js +0 -208
  229. package/dist/daemon/__tests__/registry.test.js.map +0 -1
  230. package/dist/daemon/__tests__/watcher.test.d.ts +0 -5
  231. package/dist/daemon/__tests__/watcher.test.d.ts.map +0 -1
  232. package/dist/daemon/__tests__/watcher.test.js +0 -234
  233. package/dist/daemon/__tests__/watcher.test.js.map +0 -1
  234. package/dist/daemon/methods/__tests__/graph.test.d.ts +0 -5
  235. package/dist/daemon/methods/__tests__/graph.test.d.ts.map +0 -1
  236. package/dist/daemon/methods/__tests__/graph.test.js +0 -274
  237. package/dist/daemon/methods/__tests__/graph.test.js.map +0 -1
  238. package/dist/daemon/methods/__tests__/provider.test.d.ts +0 -5
  239. package/dist/daemon/methods/__tests__/provider.test.d.ts.map +0 -1
  240. package/dist/daemon/methods/__tests__/provider.test.js +0 -184
  241. package/dist/daemon/methods/__tests__/provider.test.js.map +0 -1
  242. package/dist/daemon/methods/__tests__/tools.test.d.ts +0 -5
  243. package/dist/daemon/methods/__tests__/tools.test.d.ts.map +0 -1
  244. package/dist/daemon/methods/__tests__/tools.test.js +0 -295
  245. package/dist/daemon/methods/__tests__/tools.test.js.map +0 -1
  246. package/dist/graph/__tests__/EdgeTypeRegistry.test.d.ts +0 -2
  247. package/dist/graph/__tests__/EdgeTypeRegistry.test.d.ts.map +0 -1
  248. package/dist/graph/__tests__/EdgeTypeRegistry.test.js +0 -212
  249. package/dist/graph/__tests__/EdgeTypeRegistry.test.js.map +0 -1
  250. package/dist/graph/__tests__/FederatedGraph.test.d.ts +0 -2
  251. package/dist/graph/__tests__/FederatedGraph.test.d.ts.map +0 -1
  252. package/dist/graph/__tests__/FederatedGraph.test.js +0 -661
  253. package/dist/graph/__tests__/FederatedGraph.test.js.map +0 -1
  254. package/dist/graph/__tests__/GraphologyAdapter.test.d.ts +0 -2
  255. package/dist/graph/__tests__/GraphologyAdapter.test.d.ts.map +0 -1
  256. package/dist/graph/__tests__/GraphologyAdapter.test.js +0 -326
  257. package/dist/graph/__tests__/GraphologyAdapter.test.js.map +0 -1
  258. package/dist/graph/__tests__/HydratingFederatedGraph.test.d.ts +0 -2
  259. package/dist/graph/__tests__/HydratingFederatedGraph.test.d.ts.map +0 -1
  260. package/dist/graph/__tests__/HydratingFederatedGraph.test.js +0 -587
  261. package/dist/graph/__tests__/HydratingFederatedGraph.test.js.map +0 -1
  262. package/dist/graph/__tests__/debounce.test.d.ts +0 -5
  263. package/dist/graph/__tests__/debounce.test.d.ts.map +0 -1
  264. package/dist/graph/__tests__/debounce.test.js +0 -195
  265. package/dist/graph/__tests__/debounce.test.js.map +0 -1
  266. package/dist/graph/__tests__/edge-cases.test.d.ts +0 -8
  267. package/dist/graph/__tests__/edge-cases.test.d.ts.map +0 -1
  268. package/dist/graph/__tests__/edge-cases.test.js +0 -472
  269. package/dist/graph/__tests__/edge-cases.test.js.map +0 -1
  270. package/dist/graph/__tests__/expansion.test.d.ts +0 -2
  271. package/dist/graph/__tests__/expansion.test.d.ts.map +0 -1
  272. package/dist/graph/__tests__/expansion.test.js +0 -105
  273. package/dist/graph/__tests__/expansion.test.js.map +0 -1
  274. package/dist/graph/__tests__/provider-store.test.d.ts +0 -5
  275. package/dist/graph/__tests__/provider-store.test.d.ts.map +0 -1
  276. package/dist/graph/__tests__/provider-store.test.js +0 -791
  277. package/dist/graph/__tests__/provider-store.test.js.map +0 -1
  278. package/dist/graph/__tests__/query.test.d.ts +0 -5
  279. package/dist/graph/__tests__/query.test.d.ts.map +0 -1
  280. package/dist/graph/__tests__/query.test.js +0 -774
  281. package/dist/graph/__tests__/query.test.js.map +0 -1
  282. package/dist/graph/__tests__/store.test.d.ts +0 -5
  283. package/dist/graph/__tests__/store.test.d.ts.map +0 -1
  284. package/dist/graph/__tests__/store.test.js +0 -489
  285. package/dist/graph/__tests__/store.test.js.map +0 -1
  286. package/dist/graph/__tests__/sync.test.d.ts +0 -5
  287. package/dist/graph/__tests__/sync.test.d.ts.map +0 -1
  288. package/dist/graph/__tests__/sync.test.js +0 -129
  289. package/dist/graph/__tests__/sync.test.js.map +0 -1
  290. package/dist/graph/__tests__/validation.test.d.ts +0 -2
  291. package/dist/graph/__tests__/validation.test.d.ts.map +0 -1
  292. package/dist/graph/__tests__/validation.test.js +0 -521
  293. package/dist/graph/__tests__/validation.test.js.map +0 -1
  294. package/dist/providers/__tests__/beads.test.d.ts +0 -5
  295. package/dist/providers/__tests__/beads.test.d.ts.map +0 -1
  296. package/dist/providers/__tests__/beads.test.js +0 -591
  297. package/dist/providers/__tests__/beads.test.js.map +0 -1
  298. package/dist/providers/__tests__/claude-tasks.test.d.ts +0 -5
  299. package/dist/providers/__tests__/claude-tasks.test.d.ts.map +0 -1
  300. package/dist/providers/__tests__/claude-tasks.test.js +0 -392
  301. package/dist/providers/__tests__/claude-tasks.test.js.map +0 -1
  302. package/dist/providers/__tests__/from-config.test.d.ts +0 -5
  303. package/dist/providers/__tests__/from-config.test.d.ts.map +0 -1
  304. package/dist/providers/__tests__/from-config.test.js +0 -152
  305. package/dist/providers/__tests__/from-config.test.js.map +0 -1
  306. package/dist/providers/__tests__/materialization.test.d.ts +0 -5
  307. package/dist/providers/__tests__/materialization.test.d.ts.map +0 -1
  308. package/dist/providers/__tests__/materialization.test.js +0 -407
  309. package/dist/providers/__tests__/materialization.test.js.map +0 -1
  310. package/dist/providers/__tests__/native.test.d.ts +0 -5
  311. package/dist/providers/__tests__/native.test.d.ts.map +0 -1
  312. package/dist/providers/__tests__/native.test.js +0 -566
  313. package/dist/providers/__tests__/native.test.js.map +0 -1
  314. package/dist/providers/__tests__/registry.test.d.ts +0 -5
  315. package/dist/providers/__tests__/registry.test.d.ts.map +0 -1
  316. package/dist/providers/__tests__/registry.test.js +0 -183
  317. package/dist/providers/__tests__/registry.test.js.map +0 -1
  318. package/dist/providers/traits/__tests__/RelationshipQueryable.test.d.ts +0 -2
  319. package/dist/providers/traits/__tests__/RelationshipQueryable.test.d.ts.map +0 -1
  320. package/dist/providers/traits/__tests__/RelationshipQueryable.test.js +0 -169
  321. package/dist/providers/traits/__tests__/RelationshipQueryable.test.js.map +0 -1
  322. package/dist/providers/traits/__tests__/TaskManageable.test.d.ts +0 -2
  323. package/dist/providers/traits/__tests__/TaskManageable.test.d.ts.map +0 -1
  324. package/dist/providers/traits/__tests__/TaskManageable.test.js +0 -172
  325. package/dist/providers/traits/__tests__/TaskManageable.test.js.map +0 -1
  326. package/dist/schema/__tests__/validation.test.d.ts +0 -2
  327. package/dist/schema/__tests__/validation.test.d.ts.map +0 -1
  328. package/dist/schema/__tests__/validation.test.js +0 -241
  329. package/dist/schema/__tests__/validation.test.js.map +0 -1
  330. package/dist/storage/__tests__/atomic-write.test.d.ts +0 -5
  331. package/dist/storage/__tests__/atomic-write.test.d.ts.map +0 -1
  332. package/dist/storage/__tests__/atomic-write.test.js +0 -170
  333. package/dist/storage/__tests__/atomic-write.test.js.map +0 -1
  334. package/dist/storage/__tests__/file-lock.test.d.ts +0 -2
  335. package/dist/storage/__tests__/file-lock.test.d.ts.map +0 -1
  336. package/dist/storage/__tests__/file-lock.test.js +0 -89
  337. package/dist/storage/__tests__/file-lock.test.js.map +0 -1
  338. package/dist/storage/__tests__/jsonl.test.d.ts +0 -2
  339. package/dist/storage/__tests__/jsonl.test.d.ts.map +0 -1
  340. package/dist/storage/__tests__/jsonl.test.js +0 -228
  341. package/dist/storage/__tests__/jsonl.test.js.map +0 -1
  342. package/dist/storage/__tests__/locked-writer.test.d.ts +0 -2
  343. package/dist/storage/__tests__/locked-writer.test.d.ts.map +0 -1
  344. package/dist/storage/__tests__/locked-writer.test.js +0 -109
  345. package/dist/storage/__tests__/locked-writer.test.js.map +0 -1
  346. package/dist/storage/__tests__/sqlite.test.d.ts +0 -2
  347. package/dist/storage/__tests__/sqlite.test.d.ts.map +0 -1
  348. package/dist/storage/__tests__/sqlite.test.js +0 -470
  349. package/dist/storage/__tests__/sqlite.test.js.map +0 -1
  350. package/dist/tools/__tests__/annotate.test.d.ts +0 -5
  351. package/dist/tools/__tests__/annotate.test.d.ts.map +0 -1
  352. package/dist/tools/__tests__/annotate.test.js +0 -314
  353. package/dist/tools/__tests__/annotate.test.js.map +0 -1
  354. package/dist/tools/__tests__/link.test.d.ts +0 -5
  355. package/dist/tools/__tests__/link.test.d.ts.map +0 -1
  356. package/dist/tools/__tests__/link.test.js +0 -245
  357. package/dist/tools/__tests__/link.test.js.map +0 -1
  358. package/dist/tools/__tests__/query.test.d.ts +0 -5
  359. package/dist/tools/__tests__/query.test.d.ts.map +0 -1
  360. package/dist/tools/__tests__/query.test.js +0 -288
  361. package/dist/tools/__tests__/query.test.js.map +0 -1
  362. package/dist/tools/__tests__/task.test.d.ts +0 -5
  363. package/dist/tools/__tests__/task.test.d.ts.map +0 -1
  364. package/dist/tools/__tests__/task.test.js +0 -178
  365. package/dist/tools/__tests__/task.test.js.map +0 -1
  366. package/dist/tracking/claude-task-reconstructor.d.ts +0 -41
  367. package/dist/tracking/claude-task-reconstructor.d.ts.map +0 -1
  368. package/dist/tracking/claude-task-reconstructor.js +0 -91
  369. package/dist/tracking/claude-task-reconstructor.js.map +0 -1
  370. package/dist/tracking/plan-mode-tracker.d.ts +0 -20
  371. package/dist/tracking/plan-mode-tracker.d.ts.map +0 -1
  372. package/dist/tracking/plan-mode-tracker.js +0 -35
  373. package/dist/tracking/plan-mode-tracker.js.map +0 -1
@@ -1,661 +0,0 @@
1
- import { describe, it, expect, beforeEach } from 'vitest';
2
- import { createFederatedGraph, } from '../FederatedGraph.js';
3
- import { createGraphologyAdapter } from '../GraphologyAdapter.js';
4
- describe('FederatedGraph', () => {
5
- let adapter;
6
- let graph;
7
- beforeEach(() => {
8
- adapter = createGraphologyAdapter();
9
- graph = createFederatedGraph(adapter);
10
- });
11
- // Test fixtures - a simple graph:
12
- //
13
- // s-spec1 ──implements──> i-issue1 ──blocks──> i-issue2 ──blocks──> i-issue3
14
- // │
15
- // └──blocks──> i-issue4
16
- //
17
- const spec1 = {
18
- id: 's-spec1',
19
- uuid: 'uuid-spec1',
20
- type: 'spec',
21
- title: 'Spec 1',
22
- created_at: '2025-01-01T00:00:00Z',
23
- updated_at: '2025-01-01T00:00:00Z',
24
- };
25
- const issue1 = {
26
- id: 'i-issue1',
27
- uuid: 'uuid-issue1',
28
- type: 'issue',
29
- title: 'Issue 1',
30
- status: 'open',
31
- created_at: '2025-01-01T00:00:00Z',
32
- updated_at: '2025-01-01T00:00:00Z',
33
- };
34
- const issue2 = {
35
- id: 'i-issue2',
36
- uuid: 'uuid-issue2',
37
- type: 'issue',
38
- title: 'Issue 2',
39
- status: 'open',
40
- created_at: '2025-01-01T00:00:00Z',
41
- updated_at: '2025-01-01T00:00:00Z',
42
- };
43
- const issue3 = {
44
- id: 'i-issue3',
45
- uuid: 'uuid-issue3',
46
- type: 'issue',
47
- title: 'Issue 3',
48
- status: 'closed',
49
- created_at: '2025-01-01T00:00:00Z',
50
- updated_at: '2025-01-01T00:00:00Z',
51
- };
52
- const issue4 = {
53
- id: 'i-issue4',
54
- uuid: 'uuid-issue4',
55
- type: 'issue',
56
- title: 'Issue 4',
57
- status: 'open',
58
- created_at: '2025-01-01T00:00:00Z',
59
- updated_at: '2025-01-01T00:00:00Z',
60
- };
61
- const edgeImplements = {
62
- id: 'e-impl',
63
- uuid: 'uuid-impl',
64
- from_id: 'i-issue1',
65
- to_id: 's-spec1',
66
- type: 'implements',
67
- created_at: '2025-01-01T00:00:00Z',
68
- };
69
- const edgeBlocks1 = {
70
- id: 'e-blocks1',
71
- uuid: 'uuid-blocks1',
72
- from_id: 'i-issue1',
73
- to_id: 'i-issue2',
74
- type: 'blocks',
75
- created_at: '2025-01-01T00:00:00Z',
76
- };
77
- const edgeBlocks2 = {
78
- id: 'e-blocks2',
79
- uuid: 'uuid-blocks2',
80
- from_id: 'i-issue2',
81
- to_id: 'i-issue3',
82
- type: 'blocks',
83
- created_at: '2025-01-01T00:00:00Z',
84
- };
85
- const edgeBlocks3 = {
86
- id: 'e-blocks3',
87
- uuid: 'uuid-blocks3',
88
- from_id: 'i-issue1',
89
- to_id: 'i-issue4',
90
- type: 'blocks',
91
- created_at: '2025-01-01T00:00:00Z',
92
- };
93
- function setupGraph() {
94
- adapter.onNodeCreated(spec1);
95
- adapter.onNodeCreated(issue1);
96
- adapter.onNodeCreated(issue2);
97
- adapter.onNodeCreated(issue3);
98
- adapter.onNodeCreated(issue4);
99
- adapter.onEdgeCreated(edgeImplements);
100
- adapter.onEdgeCreated(edgeBlocks1);
101
- adapter.onEdgeCreated(edgeBlocks2);
102
- adapter.onEdgeCreated(edgeBlocks3);
103
- }
104
- describe('related()', () => {
105
- beforeEach(setupGraph);
106
- it('returns outgoing neighbors', () => {
107
- const result = graph.related('native://i-issue1', { direction: 'out' });
108
- expect(result).toHaveLength(3);
109
- expect(result).toContain('native://s-spec1');
110
- expect(result).toContain('native://i-issue2');
111
- expect(result).toContain('native://i-issue4');
112
- });
113
- it('returns incoming neighbors', () => {
114
- const result = graph.related('native://i-issue2', { direction: 'in' });
115
- expect(result).toHaveLength(1);
116
- expect(result).toContain('native://i-issue1');
117
- });
118
- it('returns both directions by default', () => {
119
- const result = graph.related('native://i-issue2');
120
- expect(result).toHaveLength(2);
121
- expect(result).toContain('native://i-issue1'); // incoming
122
- expect(result).toContain('native://i-issue3'); // outgoing
123
- });
124
- it('filters by edge type (string)', () => {
125
- const result = graph.related('native://i-issue1', {
126
- direction: 'out',
127
- edgeType: 'blocks',
128
- });
129
- expect(result).toHaveLength(2);
130
- expect(result).toContain('native://i-issue2');
131
- expect(result).toContain('native://i-issue4');
132
- expect(result).not.toContain('native://s-spec1');
133
- });
134
- it('filters by edge type (array)', () => {
135
- const result = graph.related('native://i-issue1', {
136
- direction: 'out',
137
- edgeType: ['implements'],
138
- });
139
- expect(result).toHaveLength(1);
140
- expect(result).toContain('native://s-spec1');
141
- });
142
- it('returns empty for non-existent node', () => {
143
- const result = graph.related('native://non-existent');
144
- expect(result).toHaveLength(0);
145
- });
146
- it('removes duplicates with both direction', () => {
147
- // Create a bidirectional relationship
148
- adapter.onEdgeCreated({
149
- id: 'e-related1',
150
- uuid: 'uuid-related1',
151
- from_id: 'i-issue2',
152
- to_id: 'i-issue1',
153
- type: 'related',
154
- created_at: '2025-01-01T00:00:00Z',
155
- });
156
- const result = graph.related('native://i-issue1', {
157
- direction: 'both',
158
- edgeType: ['blocks', 'related'],
159
- });
160
- // issue2 should only appear once even though there are edges in both directions
161
- const issue2Count = result.filter((r) => r === 'native://i-issue2').length;
162
- expect(issue2Count).toBe(1);
163
- });
164
- });
165
- describe('reachable()', () => {
166
- beforeEach(setupGraph);
167
- it('returns transitively reachable nodes (out)', () => {
168
- const result = graph.reachable('native://i-issue1', {
169
- direction: 'out',
170
- edgeType: 'blocks',
171
- });
172
- expect(result).toHaveLength(3);
173
- expect(result).toContain('native://i-issue2');
174
- expect(result).toContain('native://i-issue3');
175
- expect(result).toContain('native://i-issue4');
176
- });
177
- it('returns transitively reachable nodes (in)', () => {
178
- const result = graph.reachable('native://i-issue3', {
179
- direction: 'in',
180
- edgeType: 'blocks',
181
- });
182
- expect(result).toHaveLength(2);
183
- expect(result).toContain('native://i-issue2');
184
- expect(result).toContain('native://i-issue1');
185
- });
186
- it('respects maxDepth', () => {
187
- const result = graph.reachable('native://i-issue1', {
188
- direction: 'out',
189
- edgeType: 'blocks',
190
- maxDepth: 1,
191
- });
192
- expect(result).toHaveLength(2);
193
- expect(result).toContain('native://i-issue2');
194
- expect(result).toContain('native://i-issue4');
195
- expect(result).not.toContain('native://i-issue3'); // 2 hops away
196
- });
197
- it('does not include start node', () => {
198
- const result = graph.reachable('native://i-issue1', { direction: 'out' });
199
- expect(result).not.toContain('native://i-issue1');
200
- });
201
- it('handles cycles without infinite loop', () => {
202
- // Create a cycle: issue3 -> issue1
203
- adapter.onEdgeCreated({
204
- id: 'e-cycle',
205
- uuid: 'uuid-cycle',
206
- from_id: 'i-issue3',
207
- to_id: 'i-issue1',
208
- type: 'blocks',
209
- created_at: '2025-01-01T00:00:00Z',
210
- });
211
- const result = graph.reachable('native://i-issue1', {
212
- direction: 'out',
213
- edgeType: 'blocks',
214
- });
215
- // Should terminate and include all reachable nodes exactly once
216
- expect(result).toHaveLength(3);
217
- });
218
- it('returns empty for non-existent node', () => {
219
- const result = graph.reachable('native://non-existent');
220
- expect(result).toHaveLength(0);
221
- });
222
- it('filters by multiple edge types', () => {
223
- const result = graph.reachable('native://i-issue1', {
224
- direction: 'out',
225
- edgeType: ['blocks', 'implements'],
226
- });
227
- expect(result).toHaveLength(4);
228
- expect(result).toContain('native://s-spec1');
229
- expect(result).toContain('native://i-issue2');
230
- expect(result).toContain('native://i-issue3');
231
- expect(result).toContain('native://i-issue4');
232
- });
233
- });
234
- describe('shortestPath()', () => {
235
- beforeEach(setupGraph);
236
- it('finds shortest path', () => {
237
- const result = graph.shortestPath('native://i-issue1', 'native://i-issue3');
238
- expect(result).not.toBeNull();
239
- expect(result).toHaveLength(3);
240
- expect(result[0]).toBe('native://i-issue1');
241
- expect(result[1]).toBe('native://i-issue2');
242
- expect(result[2]).toBe('native://i-issue3');
243
- });
244
- it('returns path of length 1 for adjacent nodes', () => {
245
- const result = graph.shortestPath('native://i-issue1', 'native://i-issue2');
246
- expect(result).toHaveLength(2);
247
- });
248
- it('returns path of length 0 for same node', () => {
249
- const result = graph.shortestPath('native://i-issue1', 'native://i-issue1');
250
- expect(result).toHaveLength(1);
251
- expect(result[0]).toBe('native://i-issue1');
252
- });
253
- it('returns null for non-existent start node', () => {
254
- const result = graph.shortestPath('native://non-existent', 'native://i-issue1');
255
- expect(result).toBeNull();
256
- });
257
- it('returns null for non-existent end node', () => {
258
- const result = graph.shortestPath('native://i-issue1', 'native://non-existent');
259
- expect(result).toBeNull();
260
- });
261
- it('returns null when no path exists', () => {
262
- // Create an isolated node
263
- adapter.onNodeCreated({
264
- id: 'i-isolated',
265
- uuid: 'uuid-isolated',
266
- type: 'issue',
267
- title: 'Isolated',
268
- created_at: '2025-01-01T00:00:00Z',
269
- updated_at: '2025-01-01T00:00:00Z',
270
- });
271
- const result = graph.shortestPath('native://i-issue1', 'native://i-isolated');
272
- expect(result).toBeNull();
273
- });
274
- it('filters by edge types', () => {
275
- // issue1 -> issue2 is via 'blocks'
276
- // There's no 'implements' path from issue1 to issue2
277
- const result = graph.shortestPath('native://i-issue1', 'native://i-issue2', {
278
- edgeTypes: ['implements'],
279
- });
280
- expect(result).toBeNull();
281
- });
282
- });
283
- describe('hasPath()', () => {
284
- beforeEach(setupGraph);
285
- it('returns true when path exists', () => {
286
- expect(graph.hasPath('native://i-issue1', 'native://i-issue3')).toBe(true);
287
- });
288
- it('returns false when no path exists', () => {
289
- adapter.onNodeCreated({
290
- id: 'i-isolated',
291
- uuid: 'uuid-isolated',
292
- type: 'issue',
293
- title: 'Isolated',
294
- created_at: '2025-01-01T00:00:00Z',
295
- updated_at: '2025-01-01T00:00:00Z',
296
- });
297
- expect(graph.hasPath('native://i-issue1', 'native://i-isolated')).toBe(false);
298
- });
299
- });
300
- describe('getNode()', () => {
301
- beforeEach(setupGraph);
302
- it('returns node attributes', () => {
303
- const node = graph.getNode('native://i-issue1');
304
- expect(node).not.toBeNull();
305
- expect(node.title).toBe('Issue 1');
306
- expect(node.type).toBe('issue');
307
- });
308
- it('returns null for non-existent node', () => {
309
- expect(graph.getNode('native://non-existent')).toBeNull();
310
- });
311
- });
312
- describe('hasNode()', () => {
313
- beforeEach(setupGraph);
314
- it('returns true for existing node', () => {
315
- expect(graph.hasNode('native://i-issue1')).toBe(true);
316
- });
317
- it('returns false for non-existent node', () => {
318
- expect(graph.hasNode('native://non-existent')).toBe(false);
319
- });
320
- });
321
- describe('nodes()', () => {
322
- beforeEach(setupGraph);
323
- it('returns all node URIs', () => {
324
- const nodes = graph.nodes();
325
- expect(nodes).toHaveLength(5);
326
- expect(nodes).toContain('native://s-spec1');
327
- expect(nodes).toContain('native://i-issue1');
328
- expect(nodes).toContain('native://i-issue2');
329
- expect(nodes).toContain('native://i-issue3');
330
- expect(nodes).toContain('native://i-issue4');
331
- });
332
- });
333
- describe('stats()', () => {
334
- beforeEach(setupGraph);
335
- it('returns correct node and edge counts', () => {
336
- const stats = graph.stats();
337
- expect(stats.nodes).toBe(5);
338
- expect(stats.edges).toBe(4);
339
- });
340
- });
341
- describe('traverse()', () => {
342
- beforeEach(setupGraph);
343
- it('traverses single step pattern', async () => {
344
- const results = [];
345
- for await (const result of graph.traverse('native://i-issue1', {
346
- steps: [{ type: 'blocks', direction: 'out' }],
347
- })) {
348
- results.push(result.uri);
349
- }
350
- expect(results).toContain('native://i-issue2');
351
- expect(results).toContain('native://i-issue4');
352
- expect(results).not.toContain('native://s-spec1'); // implements, not blocks
353
- });
354
- it('traverses multi-step pattern', async () => {
355
- // First find specs, then issues that implement them
356
- const results = [];
357
- for await (const result of graph.traverse('native://i-issue1', {
358
- steps: [
359
- { type: 'implements', direction: 'out' }, // i-issue1 -> s-spec1
360
- { type: 'implements', direction: 'in' }, // s-spec1 <- other issues
361
- ],
362
- })) {
363
- results.push(result.uri);
364
- }
365
- // Should find s-spec1 first, then back to i-issue1
366
- expect(results).toContain('native://s-spec1');
367
- expect(results).toContain('native://i-issue1');
368
- });
369
- it('traverses with maxHops=Infinity for transitive closure', async () => {
370
- const results = [];
371
- for await (const result of graph.traverse('native://i-issue1', {
372
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
373
- })) {
374
- results.push(result.uri);
375
- }
376
- // Should find all transitively blocked issues
377
- expect(results).toContain('native://i-issue2');
378
- expect(results).toContain('native://i-issue3');
379
- expect(results).toContain('native://i-issue4');
380
- });
381
- it('respects limit option', async () => {
382
- const results = [];
383
- for await (const result of graph.traverse('native://i-issue1', {
384
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
385
- limit: 2,
386
- })) {
387
- results.push(result.uri);
388
- }
389
- expect(results).toHaveLength(2);
390
- });
391
- it('tracks depth correctly', async () => {
392
- const depths = [];
393
- for await (const result of graph.traverse('native://i-issue1', {
394
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
395
- })) {
396
- depths.push(result.depth);
397
- }
398
- // issue2 and issue4 are depth 1, issue3 is depth 2
399
- expect(depths).toContain(1);
400
- expect(depths).toContain(2);
401
- });
402
- it('tracks path correctly', async () => {
403
- let issue3Path = [];
404
- for await (const result of graph.traverse('native://i-issue1', {
405
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
406
- })) {
407
- if (result.uri === 'native://i-issue3') {
408
- issue3Path = result.path;
409
- break;
410
- }
411
- }
412
- // Path should be: issue1 -> issue2 -> issue3
413
- expect(issue3Path).toEqual([
414
- 'native://i-issue1',
415
- 'native://i-issue2',
416
- 'native://i-issue3',
417
- ]);
418
- });
419
- it('handles multiple start URIs', async () => {
420
- const results = [];
421
- for await (const result of graph.traverse(['native://i-issue1', 'native://i-issue2'], { steps: [{ type: 'blocks', direction: 'out' }] })) {
422
- results.push(result.uri);
423
- }
424
- // issue1 blocks issue2 and issue4
425
- // issue2 blocks issue3
426
- expect(results).toContain('native://i-issue2');
427
- expect(results).toContain('native://i-issue3');
428
- expect(results).toContain('native://i-issue4');
429
- });
430
- it('handles non-existent start URI', async () => {
431
- const results = [];
432
- for await (const result of graph.traverse('native://non-existent', {
433
- steps: [{ type: 'blocks', direction: 'out' }],
434
- })) {
435
- results.push(result.uri);
436
- }
437
- expect(results).toHaveLength(0);
438
- });
439
- it('handles empty steps', async () => {
440
- const results = [];
441
- for await (const result of graph.traverse('native://i-issue1', {
442
- steps: [],
443
- })) {
444
- results.push(result.uri);
445
- }
446
- expect(results).toHaveLength(0);
447
- });
448
- it('respects minHops option', async () => {
449
- const results = [];
450
- for await (const result of graph.traverse('native://i-issue1', {
451
- steps: [{ type: 'blocks', direction: 'out', minHops: 2, maxHops: 2 }],
452
- })) {
453
- results.push(result.uri);
454
- }
455
- // Only issue3 is exactly 2 hops away via blocks
456
- expect(results).toContain('native://i-issue3');
457
- expect(results).not.toContain('native://i-issue2'); // 1 hop
458
- expect(results).not.toContain('native://i-issue4'); // 1 hop
459
- });
460
- it('handles cycles without infinite loop', async () => {
461
- // Add a cycle: issue3 -> issue1
462
- adapter.onEdgeCreated({
463
- id: 'e-cycle',
464
- uuid: 'uuid-cycle',
465
- from_id: 'i-issue3',
466
- to_id: 'i-issue1',
467
- type: 'blocks',
468
- created_at: '2025-01-01T00:00:00Z',
469
- });
470
- const results = [];
471
- for await (const result of graph.traverse('native://i-issue1', {
472
- steps: [{ type: 'blocks', direction: 'out', maxHops: 10 }],
473
- })) {
474
- results.push(result.uri);
475
- }
476
- // Should not hang, and should not include duplicates
477
- expect(results.length).toBeLessThanOrEqual(4);
478
- });
479
- it('includes stepIndex and edgeType in results', async () => {
480
- for await (const result of graph.traverse('native://i-issue1', {
481
- steps: [{ type: 'blocks', direction: 'out' }],
482
- })) {
483
- expect(result.stepIndex).toBe(0);
484
- expect(result.edgeType).toBe('blocks');
485
- break;
486
- }
487
- });
488
- it('applies filter predicate to exclude nodes', async () => {
489
- const results = [];
490
- for await (const result of graph.traverse('native://i-issue1', {
491
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
492
- filter: (uri, attrs) => {
493
- // Only include open issues
494
- return attrs?.data?.status === 'open';
495
- },
496
- })) {
497
- results.push(result.uri);
498
- }
499
- // Should include issue2 and issue4 (open) but not issue3 (closed)
500
- expect(results).toContain('native://i-issue2');
501
- expect(results).toContain('native://i-issue4');
502
- expect(results).not.toContain('native://i-issue3');
503
- });
504
- it('filter continues traversal through filtered nodes', async () => {
505
- // Add another edge: issue3 -> issue5
506
- adapter.onNodeCreated({
507
- id: 'i-issue5',
508
- uuid: 'uuid-issue5',
509
- type: 'issue',
510
- title: 'Issue 5',
511
- status: 'open',
512
- created_at: '2025-01-01T00:00:00Z',
513
- updated_at: '2025-01-01T00:00:00Z',
514
- });
515
- adapter.onEdgeCreated({
516
- id: 'e-blocks4',
517
- uuid: 'uuid-blocks4',
518
- from_id: 'i-issue3',
519
- to_id: 'i-issue5',
520
- type: 'blocks',
521
- created_at: '2025-01-01T00:00:00Z',
522
- });
523
- const results = [];
524
- for await (const result of graph.traverse('native://i-issue1', {
525
- steps: [{ type: 'blocks', direction: 'out', maxHops: Infinity }],
526
- filter: (uri, attrs) => attrs?.data?.status === 'open',
527
- })) {
528
- results.push(result.uri);
529
- }
530
- // Should find issue5 even though it goes through filtered issue3
531
- expect(results).toContain('native://i-issue5');
532
- expect(results).not.toContain('native://i-issue3');
533
- });
534
- });
535
- describe('parseSelector()', () => {
536
- it('parses children selector (+uri)', () => {
537
- const result = graph.parseSelector('+native://s-spec1');
538
- expect(result.type).toBe('children');
539
- expect(result.uri).toBe('native://s-spec1');
540
- expect(result.original).toBe('+native://s-spec1');
541
- });
542
- it('parses descendants selector (uri+)', () => {
543
- const result = graph.parseSelector('native://i-issue1+');
544
- expect(result.type).toBe('descendants');
545
- expect(result.uri).toBe('native://i-issue1');
546
- expect(result.original).toBe('native://i-issue1+');
547
- });
548
- it('parses neighbors selector (@uri)', () => {
549
- const result = graph.parseSelector('@native://i-issue2');
550
- expect(result.type).toBe('neighbors');
551
- expect(result.uri).toBe('native://i-issue2');
552
- expect(result.original).toBe('@native://i-issue2');
553
- });
554
- it('parses literal URI', () => {
555
- const result = graph.parseSelector('native://i-issue1');
556
- expect(result.type).toBe('literal');
557
- expect(result.uri).toBe('native://i-issue1');
558
- expect(result.original).toBe('native://i-issue1');
559
- });
560
- });
561
- describe('expandSelector()', () => {
562
- beforeEach(setupGraph);
563
- it('expands literal to the node if exists', () => {
564
- const result = graph.expandSelector('native://i-issue1');
565
- expect(result).toEqual(['native://i-issue1']);
566
- });
567
- it('expands literal to empty if not exists', () => {
568
- const result = graph.expandSelector('native://non-existent');
569
- expect(result).toEqual([]);
570
- });
571
- it('expands children selector to direct outgoing neighbors', () => {
572
- const result = graph.expandSelector('+native://i-issue1');
573
- expect(result).toHaveLength(3);
574
- expect(result).toContain('native://s-spec1');
575
- expect(result).toContain('native://i-issue2');
576
- expect(result).toContain('native://i-issue4');
577
- });
578
- it('expands children selector with edge type filter', () => {
579
- const result = graph.expandSelector('+native://i-issue1', { edgeType: 'blocks' });
580
- expect(result).toHaveLength(2);
581
- expect(result).toContain('native://i-issue2');
582
- expect(result).toContain('native://i-issue4');
583
- expect(result).not.toContain('native://s-spec1');
584
- });
585
- it('expands descendants selector transitively', () => {
586
- const result = graph.expandSelector('native://i-issue1+');
587
- // Should include all transitively reachable nodes
588
- expect(result).toContain('native://s-spec1');
589
- expect(result).toContain('native://i-issue2');
590
- expect(result).toContain('native://i-issue3');
591
- expect(result).toContain('native://i-issue4');
592
- });
593
- it('expands descendants with edge type filter', () => {
594
- const result = graph.expandSelector('native://i-issue1+', { edgeType: 'blocks' });
595
- expect(result).toHaveLength(3);
596
- expect(result).toContain('native://i-issue2');
597
- expect(result).toContain('native://i-issue3');
598
- expect(result).toContain('native://i-issue4');
599
- expect(result).not.toContain('native://s-spec1');
600
- });
601
- it('expands neighbors selector to all connected nodes', () => {
602
- const result = graph.expandSelector('@native://i-issue2');
603
- expect(result).toHaveLength(2);
604
- expect(result).toContain('native://i-issue1'); // incoming
605
- expect(result).toContain('native://i-issue3'); // outgoing
606
- });
607
- it('expands neighbors with edge type filter', () => {
608
- const result = graph.expandSelector('@native://i-issue1', { edgeType: 'implements' });
609
- expect(result).toHaveLength(1);
610
- expect(result).toContain('native://s-spec1');
611
- });
612
- it('returns empty for non-existent node selectors', () => {
613
- expect(graph.expandSelector('+native://non-existent')).toEqual([]);
614
- expect(graph.expandSelector('native://non-existent+')).toEqual([]);
615
- expect(graph.expandSelector('@native://non-existent')).toEqual([]);
616
- });
617
- });
618
- describe('edgeTypes()', () => {
619
- it('returns all registered edge types', () => {
620
- const types = graph.edgeTypes();
621
- expect(types.length).toBeGreaterThan(0);
622
- // Should include built-in types
623
- const typeNames = types.map((t) => t.name);
624
- expect(typeNames).toContain('blocks');
625
- expect(typeNames).toContain('implements');
626
- expect(typeNames).toContain('parent-of');
627
- expect(typeNames).toContain('related');
628
- });
629
- it('includes edge type metadata', () => {
630
- const types = graph.edgeTypes();
631
- const blocksType = types.find((t) => t.name === 'blocks');
632
- expect(blocksType).toBeDefined();
633
- expect(blocksType.description).toBeDefined();
634
- expect(blocksType.inverseOf).toBe('blocked-by');
635
- expect(blocksType.affectsReady).toBe(true);
636
- expect(blocksType.direction).toBe('directed');
637
- });
638
- });
639
- describe('capabilities()', () => {
640
- it('returns graph capabilities', () => {
641
- const caps = graph.capabilities();
642
- expect(caps.edgeTypes).toBeDefined();
643
- expect(caps.edgeTypes.length).toBeGreaterThan(0);
644
- });
645
- it('includes ready-affecting types', () => {
646
- const caps = graph.capabilities();
647
- expect(caps.readyAffectingTypes).toContain('blocks');
648
- expect(caps.readyAffectingTypes).toContain('blocked-by');
649
- });
650
- it('includes provider-specific capabilities', () => {
651
- const caps = graph.capabilities();
652
- expect(caps.providers).toBeDefined();
653
- expect(caps.providers.get('native')).toBeDefined();
654
- const nativeTypes = caps.providers.get('native');
655
- const nativeTypeNames = nativeTypes.map((t) => t.name);
656
- expect(nativeTypeNames).toContain('blocks');
657
- expect(nativeTypeNames).toContain('implements');
658
- });
659
- });
660
- });
661
- //# sourceMappingURL=FederatedGraph.test.js.map