stellavault 0.2.0 → 0.2.1

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 (390) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/api/dashboard.d.ts +3 -0
  3. package/packages/core/{src/api/dashboard.ts → dist/api/dashboard.js} +8 -11
  4. package/packages/core/dist/api/graph-data.d.ts +11 -0
  5. package/packages/core/dist/api/graph-data.js +255 -0
  6. package/packages/core/dist/api/pwa.d.ts +3 -0
  7. package/packages/core/{src/api/pwa.ts → dist/api/pwa.js} +27 -32
  8. package/packages/core/dist/api/server.d.ts +16 -0
  9. package/packages/core/dist/api/server.js +647 -0
  10. package/packages/core/dist/capture/voice.d.ts +24 -0
  11. package/packages/core/dist/capture/voice.js +135 -0
  12. package/packages/core/{src/cloud/index.ts → dist/cloud/index.d.ts} +1 -0
  13. package/packages/core/dist/cloud/index.js +2 -0
  14. package/packages/core/dist/cloud/sync.d.ts +29 -0
  15. package/packages/core/dist/cloud/sync.js +137 -0
  16. package/packages/core/dist/config.d.ts +27 -0
  17. package/packages/core/dist/config.js +55 -0
  18. package/packages/core/dist/federation/credits.d.ts +26 -0
  19. package/packages/core/dist/federation/credits.js +56 -0
  20. package/packages/core/dist/federation/identity.d.ts +14 -0
  21. package/packages/core/dist/federation/identity.js +74 -0
  22. package/packages/core/{src/federation/index.ts → dist/federation/index.d.ts} +1 -2
  23. package/packages/core/dist/federation/index.js +5 -0
  24. package/packages/core/dist/federation/node.d.ts +31 -0
  25. package/packages/core/dist/federation/node.js +216 -0
  26. package/packages/core/dist/federation/privacy.d.ts +8 -0
  27. package/packages/core/dist/federation/privacy.js +40 -0
  28. package/packages/core/dist/federation/reputation.d.ts +37 -0
  29. package/packages/core/dist/federation/reputation.js +139 -0
  30. package/packages/core/dist/federation/search.d.ts +19 -0
  31. package/packages/core/dist/federation/search.js +101 -0
  32. package/packages/core/dist/federation/sharing.d.ts +72 -0
  33. package/packages/core/dist/federation/sharing.js +246 -0
  34. package/packages/core/dist/federation/trust.d.ts +15 -0
  35. package/packages/core/dist/federation/trust.js +60 -0
  36. package/packages/core/dist/federation/types.d.ts +40 -0
  37. package/packages/core/dist/federation/types.js +3 -0
  38. package/packages/core/dist/i18n/index.d.ts +6 -0
  39. package/packages/core/dist/i18n/index.js +81 -0
  40. package/packages/core/{src/index.ts → dist/index.d.ts} +46 -65
  41. package/packages/core/dist/index.js +69 -0
  42. package/packages/core/dist/indexer/chunker.d.ts +14 -0
  43. package/packages/core/dist/indexer/chunker.js +148 -0
  44. package/packages/core/dist/indexer/embedder.d.ts +8 -0
  45. package/packages/core/dist/indexer/embedder.js +3 -0
  46. package/packages/core/dist/indexer/index.d.ts +28 -0
  47. package/packages/core/dist/indexer/index.js +74 -0
  48. package/packages/core/dist/indexer/local-embedder.d.ts +3 -0
  49. package/packages/core/dist/indexer/local-embedder.js +29 -0
  50. package/packages/core/dist/indexer/scanner.d.ts +11 -0
  51. package/packages/core/dist/indexer/scanner.js +137 -0
  52. package/packages/core/dist/indexer/watcher.d.ts +19 -0
  53. package/packages/core/dist/indexer/watcher.js +49 -0
  54. package/packages/core/dist/intelligence/contradiction-detector.d.ts +20 -0
  55. package/packages/core/dist/intelligence/contradiction-detector.js +115 -0
  56. package/packages/core/dist/intelligence/decay-engine.d.ts +27 -0
  57. package/packages/core/dist/intelligence/decay-engine.js +190 -0
  58. package/packages/core/dist/intelligence/duplicate-detector.d.ts +20 -0
  59. package/packages/core/dist/intelligence/duplicate-detector.js +55 -0
  60. package/packages/core/dist/intelligence/fsrs.d.ts +43 -0
  61. package/packages/core/dist/intelligence/fsrs.js +70 -0
  62. package/packages/core/dist/intelligence/gap-detector.d.ts +25 -0
  63. package/packages/core/dist/intelligence/gap-detector.js +78 -0
  64. package/packages/core/dist/intelligence/learning-path.d.ts +31 -0
  65. package/packages/core/dist/intelligence/learning-path.js +53 -0
  66. package/packages/core/dist/intelligence/notifications.d.ts +31 -0
  67. package/packages/core/dist/intelligence/notifications.js +65 -0
  68. package/packages/core/dist/intelligence/predictive-gaps.d.ts +14 -0
  69. package/packages/core/dist/intelligence/predictive-gaps.js +74 -0
  70. package/packages/core/dist/intelligence/semantic-versioning.d.ts +37 -0
  71. package/packages/core/dist/intelligence/semantic-versioning.js +68 -0
  72. package/packages/core/dist/intelligence/types.d.ts +28 -0
  73. package/packages/core/dist/intelligence/types.js +3 -0
  74. package/packages/core/dist/mcp/custom-tools.d.ts +29 -0
  75. package/packages/core/dist/mcp/custom-tools.js +70 -0
  76. package/packages/core/{src/mcp/index.ts → dist/mcp/index.d.ts} +1 -0
  77. package/packages/core/dist/mcp/index.js +2 -0
  78. package/packages/core/dist/mcp/server.d.ts +49 -0
  79. package/packages/core/dist/mcp/server.js +133 -0
  80. package/packages/core/dist/mcp/tools/agentic-graph.d.ts +87 -0
  81. package/packages/core/dist/mcp/tools/agentic-graph.js +88 -0
  82. package/packages/core/dist/mcp/tools/brief.d.ts +31 -0
  83. package/packages/core/dist/mcp/tools/brief.js +39 -0
  84. package/packages/core/dist/mcp/tools/decay.d.ts +33 -0
  85. package/packages/core/dist/mcp/tools/decay.js +32 -0
  86. package/packages/core/dist/mcp/tools/decision-journal.d.ts +78 -0
  87. package/packages/core/dist/mcp/tools/decision-journal.js +79 -0
  88. package/packages/core/dist/mcp/tools/export.d.ts +29 -0
  89. package/packages/core/dist/mcp/tools/export.js +60 -0
  90. package/packages/core/dist/mcp/tools/federated-search.d.ts +29 -0
  91. package/packages/core/dist/mcp/tools/federated-search.js +36 -0
  92. package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +35 -0
  93. package/packages/core/dist/mcp/tools/generate-claude-md.js +107 -0
  94. package/packages/core/dist/mcp/tools/get-document.d.ts +35 -0
  95. package/packages/core/dist/mcp/tools/get-document.js +25 -0
  96. package/packages/core/dist/mcp/tools/get-related.d.ts +32 -0
  97. package/packages/core/dist/mcp/tools/get-related.js +33 -0
  98. package/packages/core/dist/mcp/tools/learning-path.d.ts +23 -0
  99. package/packages/core/dist/mcp/tools/learning-path.js +45 -0
  100. package/packages/core/dist/mcp/tools/list-topics.d.ts +15 -0
  101. package/packages/core/dist/mcp/tools/list-topics.js +18 -0
  102. package/packages/core/dist/mcp/tools/search.d.ts +39 -0
  103. package/packages/core/dist/mcp/tools/search.js +29 -0
  104. package/packages/core/dist/mcp/tools/snapshot.d.ts +47 -0
  105. package/packages/core/dist/mcp/tools/snapshot.js +84 -0
  106. package/packages/core/dist/multi-vault/index.d.ts +26 -0
  107. package/packages/core/dist/multi-vault/index.js +80 -0
  108. package/packages/core/dist/pack/creator.d.ts +21 -0
  109. package/packages/core/dist/pack/creator.js +105 -0
  110. package/packages/core/dist/pack/exporter.d.ts +4 -0
  111. package/packages/core/dist/pack/exporter.js +18 -0
  112. package/packages/core/dist/pack/importer.d.ts +10 -0
  113. package/packages/core/dist/pack/importer.js +55 -0
  114. package/packages/core/{src/pack/index.ts → dist/pack/index.d.ts} +1 -0
  115. package/packages/core/dist/pack/index.js +5 -0
  116. package/packages/core/dist/pack/marketplace.d.ts +14 -0
  117. package/packages/core/dist/pack/marketplace.js +90 -0
  118. package/packages/core/dist/pack/pii-masker.d.ts +7 -0
  119. package/packages/core/dist/pack/pii-masker.js +29 -0
  120. package/packages/core/dist/pack/types.d.ts +36 -0
  121. package/packages/core/dist/pack/types.js +3 -0
  122. package/packages/core/dist/plugins/index.d.ts +35 -0
  123. package/packages/core/dist/plugins/index.js +57 -0
  124. package/packages/core/dist/plugins/webhooks.d.ts +30 -0
  125. package/packages/core/dist/plugins/webhooks.js +79 -0
  126. package/packages/core/dist/search/bm25.d.ts +4 -0
  127. package/packages/core/dist/search/bm25.js +10 -0
  128. package/packages/core/dist/search/index.d.ts +13 -0
  129. package/packages/core/dist/search/index.js +63 -0
  130. package/packages/core/dist/search/rrf.d.ts +7 -0
  131. package/packages/core/dist/search/rrf.js +21 -0
  132. package/packages/core/dist/search/semantic.d.ts +5 -0
  133. package/packages/core/dist/search/semantic.js +6 -0
  134. package/packages/core/{src/store/index.ts → dist/store/index.d.ts} +1 -0
  135. package/packages/core/dist/store/index.js +2 -0
  136. package/packages/core/dist/store/sqlite-vec.d.ts +6 -0
  137. package/packages/core/dist/store/sqlite-vec.js +251 -0
  138. package/packages/core/dist/store/types.d.ts +20 -0
  139. package/packages/core/dist/store/types.js +3 -0
  140. package/packages/core/dist/team/index.d.ts +25 -0
  141. package/packages/core/dist/team/index.js +97 -0
  142. package/packages/core/dist/types/chunk.d.ts +23 -0
  143. package/packages/core/dist/types/chunk.js +3 -0
  144. package/packages/core/dist/types/document.d.ts +23 -0
  145. package/packages/core/dist/types/document.js +3 -0
  146. package/packages/core/dist/types/graph.d.ts +39 -0
  147. package/packages/core/dist/types/graph.js +3 -0
  148. package/packages/core/dist/types/index.d.ts +5 -0
  149. package/packages/core/dist/types/index.js +2 -0
  150. package/packages/core/dist/types/search.d.ts +39 -0
  151. package/packages/core/dist/types/search.js +3 -0
  152. package/packages/core/dist/utils/retry.d.ts +25 -0
  153. package/packages/core/dist/utils/retry.js +59 -0
  154. package/.github/workflows/pages.yml +0 -37
  155. package/memory/MEMORY.md +0 -25
  156. package/packages/cli/dist/commands/brief-cmd.d.ts.map +0 -1
  157. package/packages/cli/dist/commands/brief-cmd.js.map +0 -1
  158. package/packages/cli/dist/commands/capture-cmd.d.ts.map +0 -1
  159. package/packages/cli/dist/commands/capture-cmd.js.map +0 -1
  160. package/packages/cli/dist/commands/card-cmd.d.ts.map +0 -1
  161. package/packages/cli/dist/commands/card-cmd.js.map +0 -1
  162. package/packages/cli/dist/commands/clip-cmd.d.ts.map +0 -1
  163. package/packages/cli/dist/commands/clip-cmd.js.map +0 -1
  164. package/packages/cli/dist/commands/cloud-cmd.d.ts.map +0 -1
  165. package/packages/cli/dist/commands/cloud-cmd.js.map +0 -1
  166. package/packages/cli/dist/commands/contradictions-cmd.d.ts.map +0 -1
  167. package/packages/cli/dist/commands/contradictions-cmd.js.map +0 -1
  168. package/packages/cli/dist/commands/decay-cmd.d.ts.map +0 -1
  169. package/packages/cli/dist/commands/decay-cmd.js.map +0 -1
  170. package/packages/cli/dist/commands/digest-cmd.d.ts.map +0 -1
  171. package/packages/cli/dist/commands/digest-cmd.js.map +0 -1
  172. package/packages/cli/dist/commands/duplicates-cmd.d.ts.map +0 -1
  173. package/packages/cli/dist/commands/duplicates-cmd.js.map +0 -1
  174. package/packages/cli/dist/commands/federate-cmd.d.ts.map +0 -1
  175. package/packages/cli/dist/commands/federate-cmd.js.map +0 -1
  176. package/packages/cli/dist/commands/gaps-cmd.d.ts.map +0 -1
  177. package/packages/cli/dist/commands/gaps-cmd.js.map +0 -1
  178. package/packages/cli/dist/commands/graph-cmd.d.ts.map +0 -1
  179. package/packages/cli/dist/commands/graph-cmd.js.map +0 -1
  180. package/packages/cli/dist/commands/index-cmd.d.ts.map +0 -1
  181. package/packages/cli/dist/commands/index-cmd.js.map +0 -1
  182. package/packages/cli/dist/commands/init-cmd.d.ts.map +0 -1
  183. package/packages/cli/dist/commands/init-cmd.js.map +0 -1
  184. package/packages/cli/dist/commands/learn-cmd.d.ts.map +0 -1
  185. package/packages/cli/dist/commands/learn-cmd.js.map +0 -1
  186. package/packages/cli/dist/commands/pack-cmd.d.ts.map +0 -1
  187. package/packages/cli/dist/commands/pack-cmd.js.map +0 -1
  188. package/packages/cli/dist/commands/review-cmd.d.ts.map +0 -1
  189. package/packages/cli/dist/commands/review-cmd.js.map +0 -1
  190. package/packages/cli/dist/commands/search-cmd.d.ts.map +0 -1
  191. package/packages/cli/dist/commands/search-cmd.js.map +0 -1
  192. package/packages/cli/dist/commands/serve-cmd.d.ts.map +0 -1
  193. package/packages/cli/dist/commands/serve-cmd.js.map +0 -1
  194. package/packages/cli/dist/commands/status-cmd.d.ts.map +0 -1
  195. package/packages/cli/dist/commands/status-cmd.js.map +0 -1
  196. package/packages/cli/dist/commands/sync-cmd.d.ts.map +0 -1
  197. package/packages/cli/dist/commands/sync-cmd.js.map +0 -1
  198. package/packages/cli/dist/commands/vault-cmd.d.ts.map +0 -1
  199. package/packages/cli/dist/commands/vault-cmd.js.map +0 -1
  200. package/packages/cli/dist/index.d.ts.map +0 -1
  201. package/packages/cli/dist/index.js.map +0 -1
  202. package/packages/cli/src/commands/brief-cmd.ts +0 -87
  203. package/packages/cli/src/commands/capture-cmd.ts +0 -34
  204. package/packages/cli/src/commands/card-cmd.ts +0 -29
  205. package/packages/cli/src/commands/clip-cmd.ts +0 -172
  206. package/packages/cli/src/commands/cloud-cmd.ts +0 -75
  207. package/packages/cli/src/commands/contradictions-cmd.ts +0 -41
  208. package/packages/cli/src/commands/decay-cmd.ts +0 -57
  209. package/packages/cli/src/commands/digest-cmd.ts +0 -89
  210. package/packages/cli/src/commands/duplicates-cmd.ts +0 -38
  211. package/packages/cli/src/commands/federate-cmd.ts +0 -256
  212. package/packages/cli/src/commands/gaps-cmd.ts +0 -40
  213. package/packages/cli/src/commands/graph-cmd.ts +0 -88
  214. package/packages/cli/src/commands/index-cmd.ts +0 -65
  215. package/packages/cli/src/commands/init-cmd.ts +0 -145
  216. package/packages/cli/src/commands/learn-cmd.ts +0 -56
  217. package/packages/cli/src/commands/pack-cmd.ts +0 -121
  218. package/packages/cli/src/commands/review-cmd.ts +0 -125
  219. package/packages/cli/src/commands/search-cmd.ts +0 -45
  220. package/packages/cli/src/commands/serve-cmd.ts +0 -17
  221. package/packages/cli/src/commands/status-cmd.ts +0 -37
  222. package/packages/cli/src/commands/sync-cmd.ts +0 -68
  223. package/packages/cli/src/commands/vault-cmd.ts +0 -64
  224. package/packages/cli/src/index.ts +0 -187
  225. package/packages/core/src/api/graph-data.ts +0 -286
  226. package/packages/core/src/api/server.ts +0 -660
  227. package/packages/core/src/capture/voice.ts +0 -168
  228. package/packages/core/src/cloud/sync.ts +0 -167
  229. package/packages/core/src/config.ts +0 -82
  230. package/packages/core/src/federation/credits.ts +0 -80
  231. package/packages/core/src/federation/hyperswarm.d.ts +0 -19
  232. package/packages/core/src/federation/identity.ts +0 -90
  233. package/packages/core/src/federation/node.ts +0 -235
  234. package/packages/core/src/federation/privacy.ts +0 -52
  235. package/packages/core/src/federation/reputation.ts +0 -202
  236. package/packages/core/src/federation/search.ts +0 -129
  237. package/packages/core/src/federation/sharing.ts +0 -315
  238. package/packages/core/src/federation/trust.ts +0 -76
  239. package/packages/core/src/federation/types.ts +0 -25
  240. package/packages/core/src/i18n/index.ts +0 -85
  241. package/packages/core/src/indexer/chunker.ts +0 -180
  242. package/packages/core/src/indexer/embedder.ts +0 -9
  243. package/packages/core/src/indexer/index.ts +0 -113
  244. package/packages/core/src/indexer/local-embedder.ts +0 -35
  245. package/packages/core/src/indexer/scanner.ts +0 -142
  246. package/packages/core/src/indexer/watcher.ts +0 -62
  247. package/packages/core/src/intelligence/contradiction-detector.ts +0 -134
  248. package/packages/core/src/intelligence/decay-engine.ts +0 -229
  249. package/packages/core/src/intelligence/duplicate-detector.ts +0 -71
  250. package/packages/core/src/intelligence/fsrs.ts +0 -79
  251. package/packages/core/src/intelligence/gap-detector.ts +0 -109
  252. package/packages/core/src/intelligence/learning-path.ts +0 -86
  253. package/packages/core/src/intelligence/notifications.ts +0 -106
  254. package/packages/core/src/intelligence/predictive-gaps.ts +0 -94
  255. package/packages/core/src/intelligence/semantic-versioning.ts +0 -97
  256. package/packages/core/src/intelligence/types.ts +0 -28
  257. package/packages/core/src/mcp/custom-tools.ts +0 -97
  258. package/packages/core/src/mcp/server.ts +0 -142
  259. package/packages/core/src/mcp/tools/agentic-graph.ts +0 -96
  260. package/packages/core/src/mcp/tools/brief.ts +0 -49
  261. package/packages/core/src/mcp/tools/decay.ts +0 -40
  262. package/packages/core/src/mcp/tools/decision-journal.ts +0 -95
  263. package/packages/core/src/mcp/tools/export.ts +0 -72
  264. package/packages/core/src/mcp/tools/federated-search.ts +0 -43
  265. package/packages/core/src/mcp/tools/generate-claude-md.ts +0 -130
  266. package/packages/core/src/mcp/tools/get-document.ts +0 -26
  267. package/packages/core/src/mcp/tools/get-related.ts +0 -41
  268. package/packages/core/src/mcp/tools/learning-path.ts +0 -52
  269. package/packages/core/src/mcp/tools/list-topics.ts +0 -20
  270. package/packages/core/src/mcp/tools/search.ts +0 -35
  271. package/packages/core/src/mcp/tools/snapshot.ts +0 -98
  272. package/packages/core/src/multi-vault/index.ts +0 -118
  273. package/packages/core/src/pack/creator.ts +0 -127
  274. package/packages/core/src/pack/exporter.ts +0 -21
  275. package/packages/core/src/pack/importer.ts +0 -82
  276. package/packages/core/src/pack/marketplace.ts +0 -103
  277. package/packages/core/src/pack/pii-masker.ts +0 -38
  278. package/packages/core/src/pack/types.ts +0 -39
  279. package/packages/core/src/plugins/index.ts +0 -100
  280. package/packages/core/src/plugins/webhooks.ts +0 -110
  281. package/packages/core/src/search/bm25.ts +0 -16
  282. package/packages/core/src/search/index.ts +0 -83
  283. package/packages/core/src/search/rrf.ts +0 -31
  284. package/packages/core/src/search/semantic.ts +0 -15
  285. package/packages/core/src/store/sqlite-vec.ts +0 -290
  286. package/packages/core/src/store/types.ts +0 -22
  287. package/packages/core/src/team/index.ts +0 -126
  288. package/packages/core/src/types/chunk.ts +0 -25
  289. package/packages/core/src/types/document.ts +0 -24
  290. package/packages/core/src/types/graph.ts +0 -44
  291. package/packages/core/src/types/index.ts +0 -15
  292. package/packages/core/src/types/search.ts +0 -38
  293. package/packages/core/src/utils/retry.ts +0 -85
  294. package/packages/core/tests/api-card.test.ts +0 -60
  295. package/packages/core/tests/api-routes.test.ts +0 -98
  296. package/packages/core/tests/bm25.test.ts +0 -87
  297. package/packages/core/tests/chunker.test.ts +0 -48
  298. package/packages/core/tests/cluster.test.ts +0 -75
  299. package/packages/core/tests/constellation.test.ts +0 -77
  300. package/packages/core/tests/export-utils.test.ts +0 -97
  301. package/packages/core/tests/fsrs.test.ts +0 -96
  302. package/packages/core/tests/gesture-detector.test.ts +0 -45
  303. package/packages/core/tests/graph-data.test.ts +0 -87
  304. package/packages/core/tests/layout.test.ts +0 -83
  305. package/packages/core/tests/mcp.test.ts +0 -148
  306. package/packages/core/tests/pack.test.ts +0 -127
  307. package/packages/core/tests/pii-masker.test.ts +0 -42
  308. package/packages/core/tests/profile-card.test.ts +0 -62
  309. package/packages/core/tests/rrf.test.ts +0 -29
  310. package/packages/core/tests/search-integration.test.ts +0 -139
  311. package/packages/core/tests/store.test.ts +0 -80
  312. package/packages/graph/click-result.png +0 -0
  313. package/packages/graph/dist/assets/camera_utils-BMxqtvoZ.js +0 -1
  314. package/packages/graph/dist/assets/hands-DXA01_mx.js +0 -18
  315. package/packages/graph/dist/assets/index-DMEe2diW.js +0 -4192
  316. package/packages/graph/dist/assets/layout.worker-DbKCEFTz.js +0 -1
  317. package/packages/graph/dist/index.html +0 -17
  318. package/packages/graph/index.html +0 -17
  319. package/packages/graph/package.json +0 -32
  320. package/packages/graph/src/App.tsx +0 -7
  321. package/packages/graph/src/api/client.ts +0 -39
  322. package/packages/graph/src/components/ClusterFilter.tsx +0 -73
  323. package/packages/graph/src/components/ConstellationView.tsx +0 -232
  324. package/packages/graph/src/components/ExportPanel.tsx +0 -177
  325. package/packages/graph/src/components/Graph3D.tsx +0 -230
  326. package/packages/graph/src/components/GraphEdges.tsx +0 -100
  327. package/packages/graph/src/components/GraphNodes.tsx +0 -386
  328. package/packages/graph/src/components/HealthDashboard.tsx +0 -173
  329. package/packages/graph/src/components/Layout.tsx +0 -214
  330. package/packages/graph/src/components/MotionOverlay.tsx +0 -81
  331. package/packages/graph/src/components/MotionToggle.tsx +0 -33
  332. package/packages/graph/src/components/MultiverseView.tsx +0 -286
  333. package/packages/graph/src/components/NodeDetail.tsx +0 -232
  334. package/packages/graph/src/components/PulseParticle.tsx +0 -232
  335. package/packages/graph/src/components/SearchBar.tsx +0 -107
  336. package/packages/graph/src/components/StarField.tsx +0 -197
  337. package/packages/graph/src/components/StatusBar.tsx +0 -53
  338. package/packages/graph/src/components/Timeline.tsx +0 -148
  339. package/packages/graph/src/components/ToolsPanel.tsx +0 -512
  340. package/packages/graph/src/components/Tooltip.tsx +0 -100
  341. package/packages/graph/src/components/TypeFilter.tsx +0 -131
  342. package/packages/graph/src/embed/EmbedGraph.tsx +0 -144
  343. package/packages/graph/src/hooks/useConstellationLOD.ts +0 -76
  344. package/packages/graph/src/hooks/useDecay.ts +0 -37
  345. package/packages/graph/src/hooks/useExport.ts +0 -165
  346. package/packages/graph/src/hooks/useGraph.ts +0 -69
  347. package/packages/graph/src/hooks/useKeyboardNav.ts +0 -122
  348. package/packages/graph/src/hooks/useLayout.ts +0 -45
  349. package/packages/graph/src/hooks/useMotion.ts +0 -120
  350. package/packages/graph/src/hooks/usePulse.ts +0 -58
  351. package/packages/graph/src/hooks/useSearch.ts +0 -71
  352. package/packages/graph/src/lib/constellation.ts +0 -107
  353. package/packages/graph/src/lib/export-utils.ts +0 -48
  354. package/packages/graph/src/lib/gesture-detector.ts +0 -123
  355. package/packages/graph/src/lib/layout.worker.ts +0 -153
  356. package/packages/graph/src/lib/motion-controller.ts +0 -83
  357. package/packages/graph/src/lib/profile-card.ts +0 -122
  358. package/packages/graph/src/main.tsx +0 -4
  359. package/packages/graph/src/stores/graph-store.ts +0 -155
  360. package/packages/graph/success.png +0 -0
  361. package/packages/graph/test-click.mjs +0 -49
  362. package/packages/graph/test-explore.mjs +0 -102
  363. package/packages/graph/test-final.mjs +0 -61
  364. package/packages/graph/test-graph.mjs +0 -139
  365. package/packages/graph/test-hover.mjs +0 -48
  366. package/packages/graph/test-pulse.mjs +0 -68
  367. package/packages/graph/test-screenshot.mjs +0 -56
  368. package/packages/graph/test-v2.mjs +0 -97
  369. package/packages/graph/tsconfig.tsbuildinfo +0 -1
  370. package/packages/graph/vite.config.ts +0 -15
  371. package/packages/sync/.env.example +0 -11
  372. package/packages/sync/.sync-state.json +0 -317
  373. package/packages/sync/.upload-state.json +0 -1009
  374. package/packages/sync/create-stella-network-notion.mjs +0 -151
  375. package/packages/sync/create-stellavault-project-notion.mjs +0 -322
  376. package/packages/sync/logs/sync-2026-03-28.log +0 -6
  377. package/packages/sync/logs/sync-2026-03-29.log +0 -12
  378. package/packages/sync/logs/sync-2026-03-30.log +0 -6
  379. package/packages/sync/logs/sync-2026-03-31.log +0 -6
  380. package/packages/sync/logs/sync-2026-04-01.log +0 -6
  381. package/packages/sync/logs/sync-2026-04-02.log +0 -6
  382. package/packages/sync/package-lock.json +0 -373
  383. package/packages/sync/package.json +0 -16
  384. package/packages/sync/run-sync.bat +0 -18
  385. package/packages/sync/run-sync.mjs +0 -46
  386. package/packages/sync/setup-scheduler.mjs +0 -119
  387. package/packages/sync/structured-sync.mjs +0 -187
  388. package/packages/sync/sync-to-obsidian.mjs +0 -264
  389. package/packages/sync/upload-pdca-to-notion.mjs +0 -495
  390. package/tsconfig.base.json +0 -18
@@ -1,87 +0,0 @@
1
- // stellavault brief — 아침 브리핑 (decay + gaps + streak 통합)
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub, DecayEngine, detectKnowledgeGaps } from '@stellavault/core';
5
-
6
- export async function briefCommand() {
7
- const config = loadConfig();
8
- const hub = createKnowledgeHub(config);
9
-
10
- await hub.store.initialize();
11
- await hub.embedder.initialize();
12
-
13
- const db = hub.store.getDb() as any;
14
- if (!db) { console.error(chalk.red('❌ DB 접근 불가')); process.exit(1); }
15
-
16
- const decayEngine = new DecayEngine(db);
17
- const stats = await hub.store.getStats();
18
-
19
- console.log(chalk.green('\n☀️ Good morning! 오늘의 지식 브리핑'));
20
- console.log(chalk.dim('─'.repeat(50)));
21
-
22
- // 1. 전체 상태
23
- console.log(`\n📚 ${chalk.bold(String(stats.documentCount))}개 노트 | ${stats.chunkCount} 청크`);
24
-
25
- // 2. 감쇠 요약
26
- const report = await decayEngine.computeAll();
27
- const avgRColor = report.averageR >= 0.7 ? chalk.green : report.averageR >= 0.5 ? chalk.yellow : chalk.red;
28
- console.log(`🧠 전체 건강도: ${avgRColor('R=' + report.averageR)} | 감쇠 ${chalk.yellow(String(report.decayingCount))}개 | 위험 ${chalk.red(String(report.criticalCount))}개`);
29
-
30
- // 3. 리뷰 대상 Top 5
31
- if (report.topDecaying.length > 0) {
32
- console.log(chalk.yellow('\n📋 리뷰 추천:'));
33
- for (const d of report.topDecaying.slice(0, 5)) {
34
- const bar = '█'.repeat(Math.round(d.retrievability * 10)) + '░'.repeat(10 - Math.round(d.retrievability * 10));
35
- console.log(` ${chalk.dim(bar)} R=${d.retrievability.toFixed(2)} ${d.title}`);
36
- }
37
- console.log(chalk.dim(' → stellavault review 로 리뷰 시작'));
38
- }
39
-
40
- // 4. 갭 요약
41
- try {
42
- const gapReport = await detectKnowledgeGaps(hub.store);
43
- const highGaps = gapReport.gaps.filter(g => g.severity === 'high');
44
- if (highGaps.length > 0) {
45
- console.log(chalk.yellow(`\n🕳️ 지식 갭 ${highGaps.length}개:`));
46
- for (const g of highGaps.slice(0, 3)) {
47
- console.log(` 🔴 ${g.clusterA.replace(/\s*\(\d+\)$/, '')} ↔ ${g.clusterB.replace(/\s*\(\d+\)$/, '')}`);
48
- }
49
- }
50
- } catch { /* gaps 실패해도 무시 */ }
51
-
52
- // 5. Streak
53
- try {
54
- const days = db.prepare(`
55
- SELECT DISTINCT date(accessed_at) as d FROM access_log
56
- WHERE access_type = 'view' ORDER BY d DESC LIMIT 30
57
- `).all() as any[];
58
-
59
- let streak = 0;
60
- for (let i = 0; i < days.length; i++) {
61
- const expected = new Date(Date.now() - i * 86400000).toISOString().slice(0, 10);
62
- if (days[i]?.d === expected) streak++;
63
- else break;
64
- }
65
- if (streak > 0) console.log(chalk.yellow(`\n🔥 ${streak}일 연속 리뷰!`));
66
- } catch {}
67
-
68
- // 6. 최근 활동
69
- try {
70
- const recent = db.prepare(`
71
- SELECT document_id, COUNT(*) as cnt FROM access_log
72
- WHERE accessed_at > datetime('now', '-7 days')
73
- GROUP BY document_id ORDER BY cnt DESC LIMIT 3
74
- `).all() as any[];
75
-
76
- if (recent.length > 0) {
77
- console.log(chalk.dim('\n📊 이번 주 가장 많이 본 노트:'));
78
- for (const r of recent) {
79
- const doc = db.prepare('SELECT title FROM documents WHERE id = ?').get(r.document_id) as any;
80
- console.log(` ${r.cnt}회 — ${doc?.title ?? r.document_id}`);
81
- }
82
- }
83
- } catch {}
84
-
85
- console.log('\n' + chalk.dim('─'.repeat(50)));
86
- console.log(chalk.dim('💡 stellavault review | stellavault gaps | stellavault graph'));
87
- }
@@ -1,34 +0,0 @@
1
- // sv capture <audio-file> — Voice Knowledge Capture (P3)
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig, captureVoice, isWhisperAvailable } from '@stellavault/core';
5
-
6
- export async function captureCommand(audioFile: string, options: { model?: string; language?: string; tags?: string; folder?: string }) {
7
- if (!isWhisperAvailable()) {
8
- console.log(chalk.red('\n Whisper not installed.'));
9
- console.log(chalk.dim(' Install: pip install openai-whisper'));
10
- console.log(chalk.dim(' Or: brew install whisper-cpp\n'));
11
- return;
12
- }
13
-
14
- const config = loadConfig();
15
- console.log(chalk.dim(`\n Transcribing ${audioFile}...`));
16
-
17
- const result = await captureVoice(audioFile, {
18
- vaultPath: config.vaultPath,
19
- model: options.model,
20
- language: options.language,
21
- tags: options.tags?.split(',').map(t => t.trim()),
22
- folder: options.folder,
23
- });
24
-
25
- if (result.success) {
26
- console.log(chalk.green(`\n ✅ Captured: "${result.title}"`));
27
- console.log(` Tags: ${result.tags.join(', ')}`);
28
- console.log(` File: ${result.filePath}`);
29
- console.log(chalk.dim(` Transcript: ${result.transcript.slice(0, 100)}...`));
30
- console.log(chalk.dim('\n 💡 Run stellavault index to add to the graph\n'));
31
- } else {
32
- console.log(chalk.red(`\n ❌ Capture failed: ${result.error}\n`));
33
- }
34
- }
@@ -1,29 +0,0 @@
1
- // stellavault card — SVG 프로필 카드 생성
2
-
3
- import chalk from 'chalk';
4
- import { writeFileSync } from 'node:fs';
5
- import { resolve } from 'node:path';
6
-
7
- export async function cardCommand(options: { output?: string }) {
8
- const output = options.output ?? 'knowledge-card.svg';
9
- const outPath = resolve(process.cwd(), output);
10
-
11
- console.error(chalk.dim('⏳ Generating profile card...'));
12
-
13
- try {
14
- // API 서버에서 SVG 가져오기 (서버가 실행 중이어야 함)
15
- const res = await fetch('http://127.0.0.1:3333/api/profile-card');
16
- if (!res.ok) throw new Error(`API error: ${res.status}. Is 'stellavault graph' running?`);
17
-
18
- const svg = await res.text();
19
- writeFileSync(outPath, svg, 'utf-8');
20
-
21
- console.error(chalk.green(`✅ Profile card saved: ${outPath}`));
22
- console.error(chalk.dim(' Embed in GitHub README:'));
23
- console.error(chalk.dim(` ![Knowledge Card](${output})`));
24
- } catch (err) {
25
- console.error(chalk.red(`❌ Failed: ${err}`));
26
- console.error(chalk.dim(' Make sure API server is running: stellavault graph'));
27
- process.exit(1);
28
- }
29
- }
@@ -1,172 +0,0 @@
1
- // Design Ref: stellavault clip — 웹 페이지/YouTube를 Obsidian에 클리핑
2
-
3
- import chalk from 'chalk';
4
- import { writeFileSync, mkdirSync } from 'node:fs';
5
- import { join } from 'node:path';
6
- import { loadConfig } from '@stellavault/core';
7
-
8
- export async function clipCommand(url: string, options: { folder?: string }) {
9
- if (!url) {
10
- console.error(chalk.red('❌ URL을 입력하세요: stellavault clip <url>'));
11
- process.exit(1);
12
- }
13
-
14
- const config = loadConfig();
15
- const vaultPath = config.vaultPath;
16
- if (!vaultPath) {
17
- console.error(chalk.red('❌ vaultPath not configured'));
18
- process.exit(1);
19
- }
20
-
21
- const folder = options.folder ?? '06_Research/clips';
22
- const targetDir = join(vaultPath, folder);
23
- mkdirSync(targetDir, { recursive: true });
24
-
25
- console.error(chalk.dim(`📎 Clipping: ${url}`));
26
-
27
- try {
28
- // URL 유형 감지
29
- const isYouTube = /youtube\.com\/watch|youtu\.be\//.test(url);
30
-
31
- let title: string;
32
- let content: string;
33
-
34
- if (isYouTube) {
35
- // YouTube — 메타데이터 + 설명 추출
36
- const result = await clipYouTube(url);
37
- title = result.title;
38
- content = result.content;
39
- } else {
40
- // 일반 웹페이지 — HTML → Markdown
41
- const result = await clipWebPage(url);
42
- title = result.title;
43
- content = result.content;
44
- }
45
-
46
- // 파일명 생성 (안전한 문자만)
47
- const safeTitle = title
48
- .replace(/[<>:"/\\|?*]/g, '')
49
- .replace(/\s+/g, ' ')
50
- .trim()
51
- .slice(0, 80);
52
-
53
- const date = new Date().toISOString().slice(0, 10);
54
- const fileName = `${date} ${safeTitle}.md`;
55
- const filePath = join(targetDir, fileName);
56
-
57
- // Frontmatter + 내용 조합
58
- const md = [
59
- '---',
60
- `title: "${safeTitle}"`,
61
- `source: "${url}"`,
62
- `clipped: ${date}`,
63
- `tags: [clip${isYouTube ? ', youtube' : ''}]`,
64
- '---',
65
- '',
66
- `# ${safeTitle}`,
67
- '',
68
- `> Source: ${url}`,
69
- `> Clipped: ${date}`,
70
- '',
71
- content,
72
- ].join('\n');
73
-
74
- writeFileSync(filePath, md, 'utf-8');
75
-
76
- console.log(chalk.green(`✅ Saved: ${fileName}`));
77
- console.log(chalk.dim(` → ${filePath}`));
78
- console.log(chalk.dim(' 💡 stellavault index로 재인덱싱하면 검색 가능'));
79
- } catch (err) {
80
- console.error(chalk.red(`❌ Clip failed: ${(err as Error).message}`));
81
- process.exit(1);
82
- }
83
- }
84
-
85
- async function clipWebPage(url: string): Promise<{ title: string; content: string }> {
86
- const res = await fetch(url, {
87
- headers: { 'User-Agent': 'Mozilla/5.0 stellavault-clipper/1.0' },
88
- });
89
- const html = await res.text();
90
-
91
- // 제목 추출
92
- const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
93
- const title = titleMatch ? titleMatch[1].trim() : new URL(url).hostname;
94
-
95
- // HTML → 간단한 마크다운 변환
96
- let content = html
97
- // 스크립트/스타일 제거
98
- .replace(/<script[\s\S]*?<\/script>/gi, '')
99
- .replace(/<style[\s\S]*?<\/style>/gi, '')
100
- // 헤딩
101
- .replace(/<h1[^>]*>([\s\S]*?)<\/h1>/gi, '\n# $1\n')
102
- .replace(/<h2[^>]*>([\s\S]*?)<\/h2>/gi, '\n## $1\n')
103
- .replace(/<h3[^>]*>([\s\S]*?)<\/h3>/gi, '\n### $1\n')
104
- // 단락/줄바꿈
105
- .replace(/<p[^>]*>([\s\S]*?)<\/p>/gi, '\n$1\n')
106
- .replace(/<br\s*\/?>/gi, '\n')
107
- // 링크
108
- .replace(/<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, '[$2]($1)')
109
- // 리스트
110
- .replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, '- $1\n')
111
- // 강조
112
- .replace(/<(strong|b)[^>]*>([\s\S]*?)<\/\1>/gi, '**$2**')
113
- .replace(/<(em|i)[^>]*>([\s\S]*?)<\/\1>/gi, '*$2*')
114
- // 코드
115
- .replace(/<code[^>]*>([\s\S]*?)<\/code>/gi, '`$1`')
116
- .replace(/<pre[^>]*>([\s\S]*?)<\/pre>/gi, '\n```\n$1\n```\n')
117
- // 나머지 태그 제거
118
- .replace(/<[^>]+>/g, '')
119
- // HTML 엔티티
120
- .replace(/&amp;/g, '&')
121
- .replace(/&lt;/g, '<')
122
- .replace(/&gt;/g, '>')
123
- .replace(/&quot;/g, '"')
124
- .replace(/&#39;/g, "'")
125
- .replace(/&nbsp;/g, ' ')
126
- // 다중 줄바꿈 정리
127
- .replace(/\n{3,}/g, '\n\n')
128
- .trim();
129
-
130
- // 너무 길면 자르기
131
- if (content.length > 10000) {
132
- content = content.slice(0, 10000) + '\n\n...(truncated)';
133
- }
134
-
135
- return { title, content };
136
- }
137
-
138
- async function clipYouTube(url: string): Promise<{ title: string; content: string }> {
139
- // YouTube 페이지에서 메타데이터 추출
140
- const res = await fetch(url, {
141
- headers: { 'User-Agent': 'Mozilla/5.0 stellavault-clipper/1.0' },
142
- });
143
- const html = await res.text();
144
-
145
- const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
146
- const title = (titleMatch ? titleMatch[1] : 'YouTube Video')
147
- .replace(/ - YouTube$/, '')
148
- .trim();
149
-
150
- // 비디오 설명 추출 시도
151
- const descMatch = html.match(/"shortDescription":"([\s\S]*?)"/);
152
- const description = descMatch
153
- ? descMatch[1].replace(/\\n/g, '\n').replace(/\\"/g, '"').slice(0, 3000)
154
- : '(설명 없음)';
155
-
156
- const videoId = url.match(/(?:v=|youtu\.be\/)([a-zA-Z0-9_-]+)/)?.[1] ?? '';
157
-
158
- const content = [
159
- `![thumbnail](https://img.youtube.com/vi/${videoId}/maxresdefault.jpg)`,
160
- '',
161
- '## 설명',
162
- '',
163
- description,
164
- '',
165
- `## 링크`,
166
- '',
167
- `- [YouTube](${url})`,
168
- videoId ? `- [Embed](https://www.youtube.com/embed/${videoId})` : '',
169
- ].filter(Boolean).join('\n');
170
-
171
- return { title, content };
172
- }
@@ -1,75 +0,0 @@
1
- // sv cloud sync/restore/status — E2E encrypted cloud backup (F-A04)
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig } from '@stellavault/core';
5
- import { syncToCloud, restoreFromCloud, getSyncState } from '@stellavault/core';
6
- import type { CloudConfig } from '@stellavault/core';
7
-
8
- function getCloudConfig(): CloudConfig | null {
9
- const endpoint = process.env.SV_CLOUD_ENDPOINT;
10
- const bucket = process.env.SV_CLOUD_BUCKET ?? 'stellavault';
11
- const accessKeyId = process.env.SV_CLOUD_ACCESS_KEY ?? '';
12
- const secretAccessKey = process.env.SV_CLOUD_SECRET_KEY ?? '';
13
- const encryptionKey = process.env.SV_CLOUD_ENCRYPTION_KEY;
14
-
15
- if (!endpoint || !secretAccessKey) return null;
16
-
17
- return { endpoint, bucket, accessKeyId, secretAccessKey, encryptionKey };
18
- }
19
-
20
- export async function cloudSyncCommand() {
21
- const cloudConfig = getCloudConfig();
22
- if (!cloudConfig) {
23
- console.log(chalk.red('\n Cloud not configured. Set environment variables:'));
24
- console.log(chalk.dim(' SV_CLOUD_ENDPOINT=https://xxx.r2.cloudflarestorage.com'));
25
- console.log(chalk.dim(' SV_CLOUD_SECRET_KEY=your_api_token'));
26
- console.log(chalk.dim(' SV_CLOUD_ENCRYPTION_KEY=your_passphrase (optional)\n'));
27
- return;
28
- }
29
-
30
- const config = loadConfig();
31
- console.log(chalk.dim('\n Encrypting and uploading...'));
32
-
33
- const result = await syncToCloud(config.dbPath, cloudConfig);
34
-
35
- if (result.success) {
36
- console.log(chalk.green('\n ✅ Cloud sync complete'));
37
- console.log(` DB: ${(result.dbSize / 1024).toFixed(0)}KB → Encrypted: ${(result.encryptedSize / 1024).toFixed(0)}KB`);
38
- console.log(chalk.dim(` ${result.timestamp}\n`));
39
- } else {
40
- console.log(chalk.red(`\n ❌ Sync failed: ${result.error}\n`));
41
- }
42
- }
43
-
44
- export async function cloudRestoreCommand() {
45
- const cloudConfig = getCloudConfig();
46
- if (!cloudConfig) {
47
- console.log(chalk.red('\n Cloud not configured. See: sv cloud sync --help\n'));
48
- return;
49
- }
50
-
51
- const config = loadConfig();
52
- console.log(chalk.dim('\n Downloading and decrypting...'));
53
-
54
- const result = await restoreFromCloud(config.dbPath, cloudConfig);
55
-
56
- if (result.success) {
57
- console.log(chalk.green('\n ✅ Restore complete'));
58
- console.log(` Encrypted: ${(result.encryptedSize / 1024).toFixed(0)}KB → DB: ${(result.dbSize / 1024).toFixed(0)}KB`);
59
- console.log(chalk.dim(' Previous DB backed up as .backup\n'));
60
- } else {
61
- console.log(chalk.red(`\n ❌ Restore failed: ${result.error}\n`));
62
- }
63
- }
64
-
65
- export async function cloudStatusCommand() {
66
- const state = getSyncState();
67
- if (!state) {
68
- console.log(chalk.yellow('\n No cloud sync history. Run: sv cloud sync\n'));
69
- return;
70
- }
71
-
72
- console.log(chalk.bold('\n ☁️ Cloud Sync Status'));
73
- console.log(` Last sync: ${state.lastSync}`);
74
- console.log(` DB size: ${(state.dbSize / 1024).toFixed(0)}KB\n`);
75
- }
@@ -1,41 +0,0 @@
1
- // stellavault contradictions — detect contradicting statements (F-A12)
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub } from '@stellavault/core';
5
- import { detectContradictions } from '@stellavault/core';
6
-
7
- export async function contradictionsCommand(_opts: any, cmd: any) {
8
- const globalOpts = cmd?.parent?.opts?.() ?? {};
9
- const jsonMode = globalOpts.json;
10
- const config = loadConfig();
11
- const hub = createKnowledgeHub(config);
12
-
13
- console.error(chalk.dim('Scanning for contradictions...'));
14
- await hub.store.initialize();
15
- await hub.embedder.initialize();
16
-
17
- const pairs = await detectContradictions(hub.store, 20);
18
- await hub.store.close();
19
-
20
- if (jsonMode) {
21
- console.log(JSON.stringify({ count: pairs.length, contradictions: pairs }, null, 2));
22
- return;
23
- }
24
-
25
- console.log('');
26
- console.log(chalk.bold(` ⚡ ${pairs.length} potential contradictions found`));
27
- console.log('');
28
-
29
- for (const p of pairs) {
30
- const confColor = p.confidence >= 0.8 ? chalk.red : p.confidence >= 0.6 ? chalk.yellow : chalk.dim;
31
- console.log(` ${confColor(`${Math.round(p.confidence * 100)}%`)} ${chalk.dim(`[${p.type}]`)} ${chalk.bold(p.docA.title)} vs ${chalk.bold(p.docB.title)}`);
32
- console.log(` A: ${chalk.dim(p.docA.statement.slice(0, 80))}`);
33
- console.log(` B: ${chalk.dim(p.docB.statement.slice(0, 80))}`);
34
- console.log('');
35
- }
36
-
37
- if (pairs.length === 0) {
38
- console.log(chalk.green(' No contradictions detected. Your knowledge is consistent!'));
39
- console.log('');
40
- }
41
- }
@@ -1,57 +0,0 @@
1
- // Design Ref: §4.2 — CLI stellavault decay 명령
2
- // Plan SC: SC-03
3
-
4
- import chalk from 'chalk';
5
- import { loadConfig, createKnowledgeHub, DecayEngine } from '@stellavault/core';
6
-
7
- export async function decayCommand(_opts: any, cmd: any) {
8
- const globalOpts = cmd?.parent?.opts?.() ?? {};
9
- const jsonMode = globalOpts.json;
10
- const config = loadConfig();
11
- const hub = createKnowledgeHub(config);
12
-
13
- console.error(chalk.dim('⏳ Initializing...'));
14
- await hub.store.initialize();
15
-
16
- const db = hub.store.getDb() as any;
17
- if (!db) {
18
- console.error(chalk.red('❌ Cannot access database'));
19
- process.exit(1);
20
- }
21
-
22
- const decayEngine = new DecayEngine(db);
23
- const report = await decayEngine.computeAll();
24
-
25
- if (jsonMode) {
26
- console.log(JSON.stringify(report, null, 2));
27
- await hub.store.close();
28
- return;
29
- }
30
-
31
- console.log(chalk.green('\n🧠 Knowledge Decay Report'));
32
- console.log(chalk.dim('─'.repeat(50)));
33
- console.log(` 📄 Total documents: ${report.totalDocuments}`);
34
- console.log(` ⚠️ Decaying (R<0.5): ${chalk.yellow(String(report.decayingCount))}`);
35
- console.log(` 🔴 Critical (R<0.3): ${chalk.red(String(report.criticalCount))}`);
36
- console.log(` 📊 Average R: ${report.averageR}`);
37
- console.log(chalk.dim('─'.repeat(50)));
38
-
39
- if (report.topDecaying.length > 0) {
40
- console.log(chalk.yellow('\n📋 Top Decaying Notes (리마인드 필요):'));
41
- for (const d of report.topDecaying.slice(0, 20)) {
42
- const rBar = '█'.repeat(Math.round(d.retrievability * 10)) + '░'.repeat(10 - Math.round(d.retrievability * 10));
43
- const color = d.retrievability < 0.3 ? chalk.red : chalk.yellow;
44
- console.log(` ${color(rBar)} R=${d.retrievability.toFixed(2)} | ${d.daysSinceAccess}d ago | ${d.title}`);
45
- }
46
- }
47
-
48
- if (report.clusterHealth.length > 0) {
49
- console.log(chalk.dim('\n📊 Cluster Health:'));
50
- for (const c of report.clusterHealth.slice(0, 10)) {
51
- const color = c.avgR < 0.3 ? chalk.red : c.avgR < 0.5 ? chalk.yellow : chalk.green;
52
- console.log(` ${color(`R=${c.avgR.toFixed(2)}`)} | ${c.count} docs | ${c.label}`);
53
- }
54
- }
55
-
56
- console.log(chalk.dim('\n💡 Tip: stellavault search <topic> to refresh decaying knowledge'));
57
- }
@@ -1,89 +0,0 @@
1
- // stellavault digest — 주간 지식 활동 리포트
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub, DecayEngine } from '@stellavault/core';
5
-
6
- export async function digestCommand(options: { days?: string }) {
7
- const config = loadConfig();
8
- const hub = createKnowledgeHub(config);
9
- const days = parseInt(options.days ?? '7', 10);
10
-
11
- await hub.store.initialize();
12
- const db = hub.store.getDb() as any;
13
- if (!db) { console.error(chalk.red('❌ DB 접근 불가')); process.exit(1); }
14
-
15
- console.log(chalk.green(`\n📊 지식 활동 리포트 (최근 ${days}일)`));
16
- console.log(chalk.dim('─'.repeat(50)));
17
-
18
- // 1. 접근 통계
19
- const accessStats = db.prepare(`
20
- SELECT access_type, COUNT(*) as cnt
21
- FROM access_log WHERE accessed_at > datetime('now', '-${days} days')
22
- GROUP BY access_type
23
- `).all() as any[];
24
-
25
- const totalAccess = accessStats.reduce((s: number, r: any) => s + r.cnt, 0);
26
- console.log(`\n🔍 총 접근: ${chalk.bold(String(totalAccess))}회`);
27
- for (const r of accessStats) {
28
- const icon = r.access_type === 'view' ? '👁️' : r.access_type === 'search' ? '🔍' : '🤖';
29
- console.log(` ${icon} ${r.access_type}: ${r.cnt}회`);
30
- }
31
-
32
- // 2. 가장 많이 본 노트
33
- const topDocs = db.prepare(`
34
- SELECT al.document_id, d.title, COUNT(*) as cnt
35
- FROM access_log al
36
- JOIN documents d ON d.id = al.document_id
37
- WHERE al.accessed_at > datetime('now', '-${days} days')
38
- GROUP BY al.document_id
39
- ORDER BY cnt DESC LIMIT 10
40
- `).all() as any[];
41
-
42
- if (topDocs.length > 0) {
43
- console.log(chalk.dim(`\n📄 가장 많이 접근한 노트:`));
44
- for (const d of topDocs) {
45
- const bar = '█'.repeat(Math.min(d.cnt, 20));
46
- console.log(` ${chalk.cyan(bar)} ${d.cnt}회 ${d.title}`);
47
- }
48
- }
49
-
50
- // 3. 일별 활동량
51
- const dailyActivity = db.prepare(`
52
- SELECT date(accessed_at) as day, COUNT(*) as cnt
53
- FROM access_log WHERE accessed_at > datetime('now', '-${days} days')
54
- GROUP BY day ORDER BY day
55
- `).all() as any[];
56
-
57
- if (dailyActivity.length > 0) {
58
- console.log(chalk.dim('\n📅 일별 활동:'));
59
- const maxCnt = Math.max(...dailyActivity.map((d: any) => d.cnt));
60
- for (const d of dailyActivity) {
61
- const barLen = Math.round((d.cnt / maxCnt) * 20);
62
- const bar = '█'.repeat(barLen) + '░'.repeat(20 - barLen);
63
- console.log(` ${d.day.slice(5)} ${chalk.green(bar)} ${d.cnt}`);
64
- }
65
- }
66
-
67
- // 4. type별 분포
68
- const typeStats = db.prepare(`
69
- SELECT d.type, COUNT(DISTINCT al.document_id) as cnt
70
- FROM access_log al
71
- JOIN documents d ON d.id = al.document_id
72
- WHERE al.accessed_at > datetime('now', '-${days} days')
73
- GROUP BY d.type ORDER BY cnt DESC
74
- `).all() as any[];
75
-
76
- if (typeStats.length > 0) {
77
- console.log(chalk.dim('\n📊 접근한 노트 유형:'));
78
- for (const t of typeStats) {
79
- console.log(` ${t.type}: ${t.cnt}개`);
80
- }
81
- }
82
-
83
- // 5. 감쇠 변화
84
- const decayEngine = new DecayEngine(db);
85
- const report = await decayEngine.computeAll();
86
- console.log(`\n🧠 건강도: R=${report.averageR} | 감쇠 ${report.decayingCount}개 | 위험 ${report.criticalCount}개`);
87
-
88
- console.log(chalk.dim('\n═'.repeat(50)));
89
- }
@@ -1,38 +0,0 @@
1
- // Design Ref: stellavault duplicates — 중복/유사 노트 탐지 CLI
2
-
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub, detectDuplicates } from '@stellavault/core';
5
-
6
- export async function duplicatesCommand(options: { threshold?: string }) {
7
- const config = loadConfig();
8
- const hub = createKnowledgeHub(config);
9
- const threshold = parseFloat(options.threshold ?? '0.88');
10
-
11
- console.error(chalk.dim('⏳ Scanning for duplicates...'));
12
- await hub.store.initialize();
13
- await hub.embedder.initialize();
14
-
15
- const pairs = await detectDuplicates(hub.store, threshold, 20);
16
-
17
- if (pairs.length === 0) {
18
- console.log(chalk.green('\n✨ 중복 노트가 없습니다!'));
19
- return;
20
- }
21
-
22
- console.log(chalk.yellow(`\n🔍 유사 노트 ${pairs.length}쌍 발견 (threshold: ${threshold})`));
23
- console.log(chalk.dim('─'.repeat(60)));
24
-
25
- for (let i = 0; i < pairs.length; i++) {
26
- const p = pairs[i];
27
- const pct = Math.round(p.similarity * 100);
28
- const color = pct >= 95 ? chalk.red : chalk.yellow;
29
-
30
- console.log(`\n${chalk.bold(`[${i + 1}]`)} ${color(`${pct}% 유사`)}`);
31
- console.log(` A: ${chalk.cyan(p.docA.title)}`);
32
- console.log(` ${chalk.dim(p.docA.filePath)}`);
33
- console.log(` B: ${chalk.cyan(p.docB.title)}`);
34
- console.log(` ${chalk.dim(p.docB.filePath)}`);
35
- }
36
-
37
- console.log(chalk.dim('\n💡 Obsidian에서 직접 병합하거나 삭제하세요'));
38
- }