stellavault 0.4.4 → 0.5.0

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 (265) hide show
  1. package/README.md +52 -16
  2. package/SECURITY.md +50 -0
  3. package/dist/stellavault.js +8968 -0
  4. package/package.json +70 -33
  5. package/.env.example +0 -12
  6. package/CHANGELOG.md +0 -106
  7. package/CLAUDE.md +0 -42
  8. package/CONTRIBUTING.md +0 -65
  9. package/index.html +0 -509
  10. package/packages/cli/bin/ekh.js +0 -2
  11. package/packages/cli/bin/stellavault.js +0 -2
  12. package/packages/cli/dist/commands/adr-cmd.d.ts +0 -7
  13. package/packages/cli/dist/commands/adr-cmd.js +0 -45
  14. package/packages/cli/dist/commands/ask-cmd.d.ts +0 -5
  15. package/packages/cli/dist/commands/ask-cmd.js +0 -36
  16. package/packages/cli/dist/commands/autopilot-cmd.d.ts +0 -4
  17. package/packages/cli/dist/commands/autopilot-cmd.js +0 -76
  18. package/packages/cli/dist/commands/brief-cmd.d.ts +0 -2
  19. package/packages/cli/dist/commands/brief-cmd.js +0 -82
  20. package/packages/cli/dist/commands/capture-cmd.d.ts +0 -7
  21. package/packages/cli/dist/commands/capture-cmd.js +0 -31
  22. package/packages/cli/dist/commands/card-cmd.d.ts +0 -4
  23. package/packages/cli/dist/commands/card-cmd.js +0 -26
  24. package/packages/cli/dist/commands/clip-cmd.d.ts +0 -4
  25. package/packages/cli/dist/commands/clip-cmd.js +0 -151
  26. package/packages/cli/dist/commands/cloud-cmd.d.ts +0 -4
  27. package/packages/cli/dist/commands/cloud-cmd.js +0 -64
  28. package/packages/cli/dist/commands/compile-cmd.d.ts +0 -6
  29. package/packages/cli/dist/commands/compile-cmd.js +0 -30
  30. package/packages/cli/dist/commands/contradictions-cmd.d.ts +0 -2
  31. package/packages/cli/dist/commands/contradictions-cmd.js +0 -34
  32. package/packages/cli/dist/commands/decay-cmd.d.ts +0 -2
  33. package/packages/cli/dist/commands/decay-cmd.js +0 -48
  34. package/packages/cli/dist/commands/digest-cmd.d.ts +0 -5
  35. package/packages/cli/dist/commands/digest-cmd.js +0 -136
  36. package/packages/cli/dist/commands/draft-cmd.d.ts +0 -6
  37. package/packages/cli/dist/commands/draft-cmd.js +0 -110
  38. package/packages/cli/dist/commands/duplicates-cmd.d.ts +0 -4
  39. package/packages/cli/dist/commands/duplicates-cmd.js +0 -30
  40. package/packages/cli/dist/commands/federate-cmd.d.ts +0 -5
  41. package/packages/cli/dist/commands/federate-cmd.js +0 -247
  42. package/packages/cli/dist/commands/fleeting-cmd.d.ts +0 -4
  43. package/packages/cli/dist/commands/fleeting-cmd.js +0 -45
  44. package/packages/cli/dist/commands/flush-cmd.d.ts +0 -2
  45. package/packages/cli/dist/commands/flush-cmd.js +0 -58
  46. package/packages/cli/dist/commands/gaps-cmd.d.ts +0 -2
  47. package/packages/cli/dist/commands/gaps-cmd.js +0 -33
  48. package/packages/cli/dist/commands/graph-cmd.d.ts +0 -2
  49. package/packages/cli/dist/commands/graph-cmd.js +0 -89
  50. package/packages/cli/dist/commands/index-cmd.d.ts +0 -2
  51. package/packages/cli/dist/commands/index-cmd.js +0 -57
  52. package/packages/cli/dist/commands/ingest-cmd.d.ts +0 -9
  53. package/packages/cli/dist/commands/ingest-cmd.js +0 -195
  54. package/packages/cli/dist/commands/init-cmd.d.ts +0 -2
  55. package/packages/cli/dist/commands/init-cmd.js +0 -161
  56. package/packages/cli/dist/commands/learn-cmd.d.ts +0 -2
  57. package/packages/cli/dist/commands/learn-cmd.js +0 -48
  58. package/packages/cli/dist/commands/lint-cmd.d.ts +0 -2
  59. package/packages/cli/dist/commands/lint-cmd.js +0 -61
  60. package/packages/cli/dist/commands/pack-cmd.d.ts +0 -15
  61. package/packages/cli/dist/commands/pack-cmd.js +0 -93
  62. package/packages/cli/dist/commands/review-cmd.d.ts +0 -4
  63. package/packages/cli/dist/commands/review-cmd.js +0 -107
  64. package/packages/cli/dist/commands/search-cmd.d.ts +0 -4
  65. package/packages/cli/dist/commands/search-cmd.js +0 -38
  66. package/packages/cli/dist/commands/serve-cmd.d.ts +0 -2
  67. package/packages/cli/dist/commands/serve-cmd.js +0 -14
  68. package/packages/cli/dist/commands/session-cmd.d.ts +0 -7
  69. package/packages/cli/dist/commands/session-cmd.js +0 -95
  70. package/packages/cli/dist/commands/status-cmd.d.ts +0 -2
  71. package/packages/cli/dist/commands/status-cmd.js +0 -33
  72. package/packages/cli/dist/commands/sync-cmd.d.ts +0 -5
  73. package/packages/cli/dist/commands/sync-cmd.js +0 -62
  74. package/packages/cli/dist/commands/vault-cmd.d.ts +0 -10
  75. package/packages/cli/dist/commands/vault-cmd.js +0 -54
  76. package/packages/cli/dist/index.d.ts +0 -2
  77. package/packages/cli/dist/index.js +0 -233
  78. package/packages/cli/package.json +0 -24
  79. package/packages/core/dist/api/dashboard.d.ts +0 -3
  80. package/packages/core/dist/api/dashboard.js +0 -135
  81. package/packages/core/dist/api/graph-data.d.ts +0 -11
  82. package/packages/core/dist/api/graph-data.js +0 -255
  83. package/packages/core/dist/api/pwa.d.ts +0 -3
  84. package/packages/core/dist/api/pwa.js +0 -77
  85. package/packages/core/dist/api/server.d.ts +0 -16
  86. package/packages/core/dist/api/server.js +0 -1122
  87. package/packages/core/dist/capture/voice.d.ts +0 -24
  88. package/packages/core/dist/capture/voice.js +0 -135
  89. package/packages/core/dist/cloud/index.d.ts +0 -3
  90. package/packages/core/dist/cloud/index.js +0 -2
  91. package/packages/core/dist/cloud/sync.d.ts +0 -29
  92. package/packages/core/dist/cloud/sync.js +0 -137
  93. package/packages/core/dist/config.d.ts +0 -35
  94. package/packages/core/dist/config.js +0 -63
  95. package/packages/core/dist/federation/credits.d.ts +0 -26
  96. package/packages/core/dist/federation/credits.js +0 -56
  97. package/packages/core/dist/federation/identity.d.ts +0 -14
  98. package/packages/core/dist/federation/identity.js +0 -74
  99. package/packages/core/dist/federation/index.d.ts +0 -7
  100. package/packages/core/dist/federation/index.js +0 -5
  101. package/packages/core/dist/federation/node.d.ts +0 -31
  102. package/packages/core/dist/federation/node.js +0 -216
  103. package/packages/core/dist/federation/privacy.d.ts +0 -8
  104. package/packages/core/dist/federation/privacy.js +0 -40
  105. package/packages/core/dist/federation/reputation.d.ts +0 -37
  106. package/packages/core/dist/federation/reputation.js +0 -139
  107. package/packages/core/dist/federation/search.d.ts +0 -19
  108. package/packages/core/dist/federation/search.js +0 -101
  109. package/packages/core/dist/federation/sharing.d.ts +0 -72
  110. package/packages/core/dist/federation/sharing.js +0 -246
  111. package/packages/core/dist/federation/trust.d.ts +0 -15
  112. package/packages/core/dist/federation/trust.js +0 -60
  113. package/packages/core/dist/federation/types.d.ts +0 -40
  114. package/packages/core/dist/federation/types.js +0 -3
  115. package/packages/core/dist/i18n/index.d.ts +0 -6
  116. package/packages/core/dist/i18n/index.js +0 -81
  117. package/packages/core/dist/i18n/note-strings.d.ts +0 -5
  118. package/packages/core/dist/i18n/note-strings.js +0 -94
  119. package/packages/core/dist/index.d.ts +0 -123
  120. package/packages/core/dist/index.js +0 -74
  121. package/packages/core/dist/indexer/chunker.d.ts +0 -14
  122. package/packages/core/dist/indexer/chunker.js +0 -148
  123. package/packages/core/dist/indexer/embedder.d.ts +0 -8
  124. package/packages/core/dist/indexer/embedder.js +0 -3
  125. package/packages/core/dist/indexer/index.d.ts +0 -28
  126. package/packages/core/dist/indexer/index.js +0 -74
  127. package/packages/core/dist/indexer/local-embedder.d.ts +0 -3
  128. package/packages/core/dist/indexer/local-embedder.js +0 -29
  129. package/packages/core/dist/indexer/scanner.d.ts +0 -11
  130. package/packages/core/dist/indexer/scanner.js +0 -148
  131. package/packages/core/dist/indexer/watcher.d.ts +0 -19
  132. package/packages/core/dist/indexer/watcher.js +0 -49
  133. package/packages/core/dist/intelligence/ask-engine.d.ts +0 -24
  134. package/packages/core/dist/intelligence/ask-engine.js +0 -142
  135. package/packages/core/dist/intelligence/auto-linker.d.ts +0 -19
  136. package/packages/core/dist/intelligence/auto-linker.js +0 -126
  137. package/packages/core/dist/intelligence/code-linker.d.ts +0 -20
  138. package/packages/core/dist/intelligence/code-linker.js +0 -88
  139. package/packages/core/dist/intelligence/contradiction-detector.d.ts +0 -20
  140. package/packages/core/dist/intelligence/contradiction-detector.js +0 -115
  141. package/packages/core/dist/intelligence/decay-engine.d.ts +0 -27
  142. package/packages/core/dist/intelligence/decay-engine.js +0 -190
  143. package/packages/core/dist/intelligence/draft-generator.d.ts +0 -25
  144. package/packages/core/dist/intelligence/draft-generator.js +0 -277
  145. package/packages/core/dist/intelligence/duplicate-detector.d.ts +0 -20
  146. package/packages/core/dist/intelligence/duplicate-detector.js +0 -55
  147. package/packages/core/dist/intelligence/file-extractors.d.ts +0 -13
  148. package/packages/core/dist/intelligence/file-extractors.js +0 -155
  149. package/packages/core/dist/intelligence/fsrs.d.ts +0 -43
  150. package/packages/core/dist/intelligence/fsrs.js +0 -70
  151. package/packages/core/dist/intelligence/gap-detector.d.ts +0 -25
  152. package/packages/core/dist/intelligence/gap-detector.js +0 -78
  153. package/packages/core/dist/intelligence/ingest-pipeline.d.ts +0 -32
  154. package/packages/core/dist/intelligence/ingest-pipeline.js +0 -245
  155. package/packages/core/dist/intelligence/knowledge-lint.d.ts +0 -27
  156. package/packages/core/dist/intelligence/knowledge-lint.js +0 -132
  157. package/packages/core/dist/intelligence/learning-path.d.ts +0 -31
  158. package/packages/core/dist/intelligence/learning-path.js +0 -53
  159. package/packages/core/dist/intelligence/notifications.d.ts +0 -31
  160. package/packages/core/dist/intelligence/notifications.js +0 -65
  161. package/packages/core/dist/intelligence/predictive-gaps.d.ts +0 -14
  162. package/packages/core/dist/intelligence/predictive-gaps.js +0 -74
  163. package/packages/core/dist/intelligence/semantic-versioning.d.ts +0 -37
  164. package/packages/core/dist/intelligence/semantic-versioning.js +0 -68
  165. package/packages/core/dist/intelligence/types.d.ts +0 -28
  166. package/packages/core/dist/intelligence/types.js +0 -3
  167. package/packages/core/dist/intelligence/wiki-compiler.d.ts +0 -30
  168. package/packages/core/dist/intelligence/wiki-compiler.js +0 -222
  169. package/packages/core/dist/intelligence/youtube-extractor.d.ts +0 -29
  170. package/packages/core/dist/intelligence/youtube-extractor.js +0 -321
  171. package/packages/core/dist/intelligence/zettelkasten.d.ts +0 -59
  172. package/packages/core/dist/intelligence/zettelkasten.js +0 -234
  173. package/packages/core/dist/mcp/custom-tools.d.ts +0 -29
  174. package/packages/core/dist/mcp/custom-tools.js +0 -70
  175. package/packages/core/dist/mcp/index.d.ts +0 -2
  176. package/packages/core/dist/mcp/index.js +0 -2
  177. package/packages/core/dist/mcp/server.d.ts +0 -51
  178. package/packages/core/dist/mcp/server.js +0 -174
  179. package/packages/core/dist/mcp/tools/agentic-graph.d.ts +0 -93
  180. package/packages/core/dist/mcp/tools/agentic-graph.js +0 -116
  181. package/packages/core/dist/mcp/tools/ask.d.ts +0 -29
  182. package/packages/core/dist/mcp/tools/ask.js +0 -43
  183. package/packages/core/dist/mcp/tools/brief.d.ts +0 -31
  184. package/packages/core/dist/mcp/tools/brief.js +0 -39
  185. package/packages/core/dist/mcp/tools/decay.d.ts +0 -33
  186. package/packages/core/dist/mcp/tools/decay.js +0 -32
  187. package/packages/core/dist/mcp/tools/decision-journal.d.ts +0 -78
  188. package/packages/core/dist/mcp/tools/decision-journal.js +0 -79
  189. package/packages/core/dist/mcp/tools/detect-gaps.d.ts +0 -24
  190. package/packages/core/dist/mcp/tools/detect-gaps.js +0 -47
  191. package/packages/core/dist/mcp/tools/export.d.ts +0 -29
  192. package/packages/core/dist/mcp/tools/export.js +0 -60
  193. package/packages/core/dist/mcp/tools/federated-search.d.ts +0 -29
  194. package/packages/core/dist/mcp/tools/federated-search.js +0 -36
  195. package/packages/core/dist/mcp/tools/generate-claude-md.d.ts +0 -35
  196. package/packages/core/dist/mcp/tools/generate-claude-md.js +0 -107
  197. package/packages/core/dist/mcp/tools/generate-draft.d.ts +0 -34
  198. package/packages/core/dist/mcp/tools/generate-draft.js +0 -120
  199. package/packages/core/dist/mcp/tools/get-document.d.ts +0 -35
  200. package/packages/core/dist/mcp/tools/get-document.js +0 -25
  201. package/packages/core/dist/mcp/tools/get-evolution.d.ts +0 -28
  202. package/packages/core/dist/mcp/tools/get-evolution.js +0 -70
  203. package/packages/core/dist/mcp/tools/get-related.d.ts +0 -32
  204. package/packages/core/dist/mcp/tools/get-related.js +0 -33
  205. package/packages/core/dist/mcp/tools/learning-path.d.ts +0 -23
  206. package/packages/core/dist/mcp/tools/learning-path.js +0 -45
  207. package/packages/core/dist/mcp/tools/link-code.d.ts +0 -34
  208. package/packages/core/dist/mcp/tools/link-code.js +0 -44
  209. package/packages/core/dist/mcp/tools/list-topics.d.ts +0 -15
  210. package/packages/core/dist/mcp/tools/list-topics.js +0 -18
  211. package/packages/core/dist/mcp/tools/search.d.ts +0 -39
  212. package/packages/core/dist/mcp/tools/search.js +0 -29
  213. package/packages/core/dist/mcp/tools/snapshot.d.ts +0 -47
  214. package/packages/core/dist/mcp/tools/snapshot.js +0 -84
  215. package/packages/core/dist/multi-vault/index.d.ts +0 -26
  216. package/packages/core/dist/multi-vault/index.js +0 -80
  217. package/packages/core/dist/pack/creator.d.ts +0 -21
  218. package/packages/core/dist/pack/creator.js +0 -105
  219. package/packages/core/dist/pack/exporter.d.ts +0 -4
  220. package/packages/core/dist/pack/exporter.js +0 -18
  221. package/packages/core/dist/pack/importer.d.ts +0 -10
  222. package/packages/core/dist/pack/importer.js +0 -55
  223. package/packages/core/dist/pack/index.d.ts +0 -6
  224. package/packages/core/dist/pack/index.js +0 -5
  225. package/packages/core/dist/pack/marketplace.d.ts +0 -14
  226. package/packages/core/dist/pack/marketplace.js +0 -90
  227. package/packages/core/dist/pack/pii-masker.d.ts +0 -7
  228. package/packages/core/dist/pack/pii-masker.js +0 -29
  229. package/packages/core/dist/pack/types.d.ts +0 -36
  230. package/packages/core/dist/pack/types.js +0 -3
  231. package/packages/core/dist/plugins/index.d.ts +0 -35
  232. package/packages/core/dist/plugins/index.js +0 -57
  233. package/packages/core/dist/plugins/webhooks.d.ts +0 -30
  234. package/packages/core/dist/plugins/webhooks.js +0 -79
  235. package/packages/core/dist/search/adaptive.d.ts +0 -16
  236. package/packages/core/dist/search/adaptive.js +0 -67
  237. package/packages/core/dist/search/bm25.d.ts +0 -4
  238. package/packages/core/dist/search/bm25.js +0 -10
  239. package/packages/core/dist/search/index.d.ts +0 -15
  240. package/packages/core/dist/search/index.js +0 -64
  241. package/packages/core/dist/search/rrf.d.ts +0 -7
  242. package/packages/core/dist/search/rrf.js +0 -21
  243. package/packages/core/dist/search/semantic.d.ts +0 -5
  244. package/packages/core/dist/search/semantic.js +0 -6
  245. package/packages/core/dist/store/index.d.ts +0 -3
  246. package/packages/core/dist/store/index.js +0 -2
  247. package/packages/core/dist/store/sqlite-vec.d.ts +0 -6
  248. package/packages/core/dist/store/sqlite-vec.js +0 -251
  249. package/packages/core/dist/store/types.d.ts +0 -20
  250. package/packages/core/dist/store/types.js +0 -3
  251. package/packages/core/dist/team/index.d.ts +0 -25
  252. package/packages/core/dist/team/index.js +0 -97
  253. package/packages/core/dist/types/chunk.d.ts +0 -23
  254. package/packages/core/dist/types/chunk.js +0 -3
  255. package/packages/core/dist/types/document.d.ts +0 -23
  256. package/packages/core/dist/types/document.js +0 -3
  257. package/packages/core/dist/types/graph.d.ts +0 -39
  258. package/packages/core/dist/types/graph.js +0 -3
  259. package/packages/core/dist/types/index.d.ts +0 -5
  260. package/packages/core/dist/types/index.js +0 -2
  261. package/packages/core/dist/types/search.d.ts +0 -39
  262. package/packages/core/dist/types/search.js +0 -3
  263. package/packages/core/dist/utils/retry.d.ts +0 -25
  264. package/packages/core/dist/utils/retry.js +0 -59
  265. package/packages/core/package.json +0 -67
@@ -1,76 +0,0 @@
1
- // stellavault autopilot — 자율형 지식 플라이휠
2
- // ingest(inbox) → compile → lint → index → 반복
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub, compileWiki, lintKnowledge, getInboxItems, archiveFile } from '@stellavault/core';
5
- import { resolve } from 'node:path';
6
- export async function autopilotCommand(options) {
7
- const config = loadConfig();
8
- const vaultPath = config.vaultPath;
9
- console.log(chalk.bold('\n ✦ Stellavault Autopilot'));
10
- console.log(chalk.dim(' Knowledge flywheel: inbox → compile → lint → repeat\n'));
11
- // Step 1: Inbox 확인
12
- console.log(chalk.cyan('Step 1/4: Checking inbox...'));
13
- const inbox = getInboxItems(vaultPath);
14
- if (inbox.length === 0) {
15
- console.log(chalk.dim(' No new items in raw/ folder.'));
16
- }
17
- else {
18
- console.log(chalk.green(` ${inbox.length} new items found.`));
19
- for (const item of inbox.slice(0, 5)) {
20
- console.log(chalk.dim(` - ${item.title} (${item.wordCount} words)`));
21
- }
22
- if (inbox.length > 5)
23
- console.log(chalk.dim(` ... and ${inbox.length - 5} more`));
24
- }
25
- // Step 2: Compile
26
- console.log(chalk.cyan('\nStep 2/4: Compiling wiki...'));
27
- const rawPath = resolve(vaultPath, 'raw');
28
- const wikiPath = resolve(vaultPath, '_wiki');
29
- const compileResult = compileWiki(rawPath, wikiPath);
30
- if (compileResult.rawDocCount > 0) {
31
- console.log(chalk.green(` Compiled ${compileResult.rawDocCount} raw → ${compileResult.wikiArticles.length} wiki articles`));
32
- console.log(chalk.dim(` Concepts: ${compileResult.concepts.length}`));
33
- // Archive processed raw files
34
- for (const item of inbox) {
35
- try {
36
- archiveFile(resolve(vaultPath, 'raw', item.filePath));
37
- }
38
- catch { /* skip */ }
39
- }
40
- console.log(chalk.dim(` Archived ${inbox.length} processed items.`));
41
- }
42
- else {
43
- console.log(chalk.dim(' No raw documents to compile.'));
44
- }
45
- // Step 3: Lint
46
- console.log(chalk.cyan('\nStep 3/4: Running health check...'));
47
- const hub = createKnowledgeHub(config);
48
- await hub.store.initialize();
49
- const lintResult = await lintKnowledge(hub.store);
50
- const scoreColor = lintResult.score >= 80 ? chalk.green : lintResult.score >= 50 ? chalk.yellow : chalk.red;
51
- console.log(` Health: ${scoreColor(lintResult.score + '/100')}`);
52
- const critical = lintResult.issues.filter(i => i.severity === 'critical').length;
53
- const warnings = lintResult.issues.filter(i => i.severity === 'warning').length;
54
- if (critical > 0)
55
- console.log(chalk.red(` Critical: ${critical}`));
56
- if (warnings > 0)
57
- console.log(chalk.yellow(` Warnings: ${warnings}`));
58
- // Step 4: Summary
59
- console.log(chalk.cyan('\nStep 4/4: Summary'));
60
- console.log(chalk.dim('─'.repeat(40)));
61
- console.log(` Inbox processed: ${inbox.length}`);
62
- console.log(` Wiki articles: ${compileResult.wikiArticles.length}`);
63
- console.log(` Health score: ${lintResult.score}/100`);
64
- console.log(` Issues: ${lintResult.issues.length}`);
65
- if (lintResult.suggestions.length > 0) {
66
- console.log(chalk.cyan('\n Suggestions:'));
67
- for (const s of lintResult.suggestions.slice(0, 3)) {
68
- console.log(chalk.dim(` → ${s}`));
69
- }
70
- }
71
- console.log(chalk.dim('\n─'.repeat(40)));
72
- console.log(chalk.dim('\n Next: run `stellavault index` to update search vectors.'));
73
- console.log(chalk.green(' Autopilot complete.\n'));
74
- await hub.store.close?.();
75
- }
76
- //# sourceMappingURL=autopilot-cmd.js.map
@@ -1,2 +0,0 @@
1
- export declare function briefCommand(): Promise<void>;
2
- //# sourceMappingURL=brief-cmd.d.ts.map
@@ -1,82 +0,0 @@
1
- // stellavault brief — 아침 브리핑 (decay + gaps + streak 통합)
2
- import chalk from 'chalk';
3
- import { loadConfig, createKnowledgeHub, DecayEngine, detectKnowledgeGaps } from '@stellavault/core';
4
- export async function briefCommand() {
5
- const config = loadConfig();
6
- const hub = createKnowledgeHub(config);
7
- await hub.store.initialize();
8
- await hub.embedder.initialize();
9
- const db = hub.store.getDb();
10
- if (!db) {
11
- console.error(chalk.red('❌ DB 접근 불가'));
12
- process.exit(1);
13
- }
14
- const decayEngine = new DecayEngine(db);
15
- const stats = await hub.store.getStats();
16
- console.log(chalk.green('\n☀️ Good morning! 오늘의 지식 브리핑'));
17
- console.log(chalk.dim('─'.repeat(50)));
18
- // 1. 전체 상태
19
- console.log(`\n📚 ${chalk.bold(String(stats.documentCount))}개 노트 | ${stats.chunkCount} 청크`);
20
- // 2. 감쇠 요약
21
- const report = await decayEngine.computeAll();
22
- const avgRColor = report.averageR >= 0.7 ? chalk.green : report.averageR >= 0.5 ? chalk.yellow : chalk.red;
23
- console.log(`🧠 전체 건강도: ${avgRColor('R=' + report.averageR)} | 감쇠 ${chalk.yellow(String(report.decayingCount))}개 | 위험 ${chalk.red(String(report.criticalCount))}개`);
24
- // 3. 리뷰 대상 Top 5
25
- if (report.topDecaying.length > 0) {
26
- console.log(chalk.yellow('\n📋 리뷰 추천:'));
27
- for (const d of report.topDecaying.slice(0, 5)) {
28
- const bar = '█'.repeat(Math.round(d.retrievability * 10)) + '░'.repeat(10 - Math.round(d.retrievability * 10));
29
- console.log(` ${chalk.dim(bar)} R=${d.retrievability.toFixed(2)} ${d.title}`);
30
- }
31
- console.log(chalk.dim(' → stellavault review 로 리뷰 시작'));
32
- }
33
- // 4. 갭 요약
34
- try {
35
- const gapReport = await detectKnowledgeGaps(hub.store);
36
- const highGaps = gapReport.gaps.filter(g => g.severity === 'high');
37
- if (highGaps.length > 0) {
38
- console.log(chalk.yellow(`\n🕳️ 지식 갭 ${highGaps.length}개:`));
39
- for (const g of highGaps.slice(0, 3)) {
40
- console.log(` 🔴 ${g.clusterA.replace(/\s*\(\d+\)$/, '')} ↔ ${g.clusterB.replace(/\s*\(\d+\)$/, '')}`);
41
- }
42
- }
43
- }
44
- catch { /* gaps 실패해도 무시 */ }
45
- // 5. Streak
46
- try {
47
- const days = db.prepare(`
48
- SELECT DISTINCT date(accessed_at) as d FROM access_log
49
- WHERE access_type = 'view' ORDER BY d DESC LIMIT 30
50
- `).all();
51
- let streak = 0;
52
- for (let i = 0; i < days.length; i++) {
53
- const expected = new Date(Date.now() - i * 86400000).toISOString().slice(0, 10);
54
- if (days[i]?.d === expected)
55
- streak++;
56
- else
57
- break;
58
- }
59
- if (streak > 0)
60
- console.log(chalk.yellow(`\n🔥 ${streak}일 연속 리뷰!`));
61
- }
62
- catch { }
63
- // 6. 최근 활동
64
- try {
65
- const recent = db.prepare(`
66
- SELECT document_id, COUNT(*) as cnt FROM access_log
67
- WHERE accessed_at > datetime('now', '-7 days')
68
- GROUP BY document_id ORDER BY cnt DESC LIMIT 3
69
- `).all();
70
- if (recent.length > 0) {
71
- console.log(chalk.dim('\n📊 이번 주 가장 많이 본 노트:'));
72
- for (const r of recent) {
73
- const doc = db.prepare('SELECT title FROM documents WHERE id = ?').get(r.document_id);
74
- console.log(` ${r.cnt}회 — ${doc?.title ?? r.document_id}`);
75
- }
76
- }
77
- }
78
- catch { }
79
- console.log('\n' + chalk.dim('─'.repeat(50)));
80
- console.log(chalk.dim('💡 stellavault review | stellavault gaps | stellavault graph'));
81
- }
82
- //# sourceMappingURL=brief-cmd.js.map
@@ -1,7 +0,0 @@
1
- export declare function captureCommand(audioFile: string, options: {
2
- model?: string;
3
- language?: string;
4
- tags?: string;
5
- folder?: string;
6
- }): Promise<void>;
7
- //# sourceMappingURL=capture-cmd.d.ts.map
@@ -1,31 +0,0 @@
1
- // sv capture <audio-file> — Voice Knowledge Capture (P3)
2
- import chalk from 'chalk';
3
- import { loadConfig, captureVoice, isWhisperAvailable } from '@stellavault/core';
4
- export async function captureCommand(audioFile, options) {
5
- if (!isWhisperAvailable()) {
6
- console.log(chalk.red('\n Whisper not installed.'));
7
- console.log(chalk.dim(' Install: pip install openai-whisper'));
8
- console.log(chalk.dim(' Or: brew install whisper-cpp\n'));
9
- return;
10
- }
11
- const config = loadConfig();
12
- console.log(chalk.dim(`\n Transcribing ${audioFile}...`));
13
- const result = await captureVoice(audioFile, {
14
- vaultPath: config.vaultPath,
15
- model: options.model,
16
- language: options.language,
17
- tags: options.tags?.split(',').map(t => t.trim()),
18
- folder: options.folder,
19
- });
20
- if (result.success) {
21
- console.log(chalk.green(`\n ✅ Captured: "${result.title}"`));
22
- console.log(` Tags: ${result.tags.join(', ')}`);
23
- console.log(` File: ${result.filePath}`);
24
- console.log(chalk.dim(` Transcript: ${result.transcript.slice(0, 100)}...`));
25
- console.log(chalk.dim('\n 💡 Run stellavault index to add to the graph\n'));
26
- }
27
- else {
28
- console.log(chalk.red(`\n ❌ Capture failed: ${result.error}\n`));
29
- }
30
- }
31
- //# sourceMappingURL=capture-cmd.js.map
@@ -1,4 +0,0 @@
1
- export declare function cardCommand(options: {
2
- output?: string;
3
- }): Promise<void>;
4
- //# sourceMappingURL=card-cmd.d.ts.map
@@ -1,26 +0,0 @@
1
- // stellavault card — SVG 프로필 카드 생성
2
- import chalk from 'chalk';
3
- import { writeFileSync } from 'node:fs';
4
- import { resolve } from 'node:path';
5
- export async function cardCommand(options) {
6
- const output = options.output ?? 'knowledge-card.svg';
7
- const outPath = resolve(process.cwd(), output);
8
- console.error(chalk.dim('⏳ Generating profile card...'));
9
- try {
10
- // API 서버에서 SVG 가져오기 (서버가 실행 중이어야 함)
11
- const res = await fetch('http://127.0.0.1:3333/api/profile-card');
12
- if (!res.ok)
13
- throw new Error(`API error: ${res.status}. Is 'stellavault graph' running?`);
14
- const svg = await res.text();
15
- writeFileSync(outPath, svg, 'utf-8');
16
- console.error(chalk.green(`✅ Profile card saved: ${outPath}`));
17
- console.error(chalk.dim(' Embed in GitHub README:'));
18
- console.error(chalk.dim(` ![Knowledge Card](${output})`));
19
- }
20
- catch (err) {
21
- console.error(chalk.red(`❌ Failed: ${err}`));
22
- console.error(chalk.dim(' Make sure API server is running: stellavault graph'));
23
- process.exit(1);
24
- }
25
- }
26
- //# sourceMappingURL=card-cmd.js.map
@@ -1,4 +0,0 @@
1
- export declare function clipCommand(url: string, options: {
2
- folder?: string;
3
- }): Promise<void>;
4
- //# sourceMappingURL=clip-cmd.d.ts.map
@@ -1,151 +0,0 @@
1
- // Design Ref: stellavault clip — 웹 페이지/YouTube를 Obsidian에 클리핑
2
- import chalk from 'chalk';
3
- import { writeFileSync, mkdirSync } from 'node:fs';
4
- import { join } from 'node:path';
5
- import { loadConfig } from '@stellavault/core';
6
- export async function clipCommand(url, options) {
7
- if (!url) {
8
- console.error(chalk.red('❌ URL을 입력하세요: stellavault clip <url>'));
9
- process.exit(1);
10
- }
11
- const config = loadConfig();
12
- const vaultPath = config.vaultPath;
13
- if (!vaultPath) {
14
- console.error(chalk.red('❌ vaultPath not configured'));
15
- process.exit(1);
16
- }
17
- const folder = options.folder ?? '06_Research/clips';
18
- const targetDir = join(vaultPath, folder);
19
- mkdirSync(targetDir, { recursive: true });
20
- console.error(chalk.dim(`📎 Clipping: ${url}`));
21
- try {
22
- // URL 유형 감지
23
- const isYouTube = /youtube\.com\/watch|youtu\.be\//.test(url);
24
- let title;
25
- let content;
26
- if (isYouTube) {
27
- // YouTube — 메타데이터 + 설명 추출
28
- const result = await clipYouTube(url);
29
- title = result.title;
30
- content = result.content;
31
- }
32
- else {
33
- // 일반 웹페이지 — HTML → Markdown
34
- const result = await clipWebPage(url);
35
- title = result.title;
36
- content = result.content;
37
- }
38
- // 파일명 생성 (안전한 문자만)
39
- const safeTitle = title
40
- .replace(/[<>:"/\\|?*]/g, '')
41
- .replace(/\s+/g, ' ')
42
- .trim()
43
- .slice(0, 80);
44
- const date = new Date().toISOString().slice(0, 10);
45
- const fileName = `${date} ${safeTitle}.md`;
46
- const filePath = join(targetDir, fileName);
47
- // Frontmatter + 내용 조합
48
- const md = [
49
- '---',
50
- `title: "${safeTitle}"`,
51
- `source: "${url}"`,
52
- `clipped: ${date}`,
53
- `tags: [clip${isYouTube ? ', youtube' : ''}]`,
54
- '---',
55
- '',
56
- `# ${safeTitle}`,
57
- '',
58
- `> Source: ${url}`,
59
- `> Clipped: ${date}`,
60
- '',
61
- content,
62
- ].join('\n');
63
- writeFileSync(filePath, md, 'utf-8');
64
- console.log(chalk.green(`✅ Saved: ${fileName}`));
65
- console.log(chalk.dim(` → ${filePath}`));
66
- console.log(chalk.dim(' 💡 stellavault index로 재인덱싱하면 검색 가능'));
67
- }
68
- catch (err) {
69
- console.error(chalk.red(`❌ Clip failed: ${err.message}`));
70
- process.exit(1);
71
- }
72
- }
73
- async function clipWebPage(url) {
74
- const res = await fetch(url, {
75
- headers: { 'User-Agent': 'Mozilla/5.0 stellavault-clipper/1.0' },
76
- });
77
- const html = await res.text();
78
- // 제목 추출
79
- const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
80
- const title = titleMatch ? titleMatch[1].trim() : new URL(url).hostname;
81
- // HTML → 간단한 마크다운 변환
82
- let content = html
83
- // 스크립트/스타일 제거
84
- .replace(/<script[\s\S]*?<\/script>/gi, '')
85
- .replace(/<style[\s\S]*?<\/style>/gi, '')
86
- // 헤딩
87
- .replace(/<h1[^>]*>([\s\S]*?)<\/h1>/gi, '\n# $1\n')
88
- .replace(/<h2[^>]*>([\s\S]*?)<\/h2>/gi, '\n## $1\n')
89
- .replace(/<h3[^>]*>([\s\S]*?)<\/h3>/gi, '\n### $1\n')
90
- // 단락/줄바꿈
91
- .replace(/<p[^>]*>([\s\S]*?)<\/p>/gi, '\n$1\n')
92
- .replace(/<br\s*\/?>/gi, '\n')
93
- // 링크
94
- .replace(/<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>/gi, '[$2]($1)')
95
- // 리스트
96
- .replace(/<li[^>]*>([\s\S]*?)<\/li>/gi, '- $1\n')
97
- // 강조
98
- .replace(/<(strong|b)[^>]*>([\s\S]*?)<\/\1>/gi, '**$2**')
99
- .replace(/<(em|i)[^>]*>([\s\S]*?)<\/\1>/gi, '*$2*')
100
- // 코드
101
- .replace(/<code[^>]*>([\s\S]*?)<\/code>/gi, '`$1`')
102
- .replace(/<pre[^>]*>([\s\S]*?)<\/pre>/gi, '\n```\n$1\n```\n')
103
- // 나머지 태그 제거
104
- .replace(/<[^>]+>/g, '')
105
- // HTML 엔티티
106
- .replace(/&amp;/g, '&')
107
- .replace(/&lt;/g, '<')
108
- .replace(/&gt;/g, '>')
109
- .replace(/&quot;/g, '"')
110
- .replace(/&#39;/g, "'")
111
- .replace(/&nbsp;/g, ' ')
112
- // 다중 줄바꿈 정리
113
- .replace(/\n{3,}/g, '\n\n')
114
- .trim();
115
- // 너무 길면 자르기
116
- if (content.length > 10000) {
117
- content = content.slice(0, 10000) + '\n\n...(truncated)';
118
- }
119
- return { title, content };
120
- }
121
- async function clipYouTube(url) {
122
- // YouTube 페이지에서 메타데이터 추출
123
- const res = await fetch(url, {
124
- headers: { 'User-Agent': 'Mozilla/5.0 stellavault-clipper/1.0' },
125
- });
126
- const html = await res.text();
127
- const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
128
- const title = (titleMatch ? titleMatch[1] : 'YouTube Video')
129
- .replace(/ - YouTube$/, '')
130
- .trim();
131
- // 비디오 설명 추출 시도
132
- const descMatch = html.match(/"shortDescription":"([\s\S]*?)"/);
133
- const description = descMatch
134
- ? descMatch[1].replace(/\\n/g, '\n').replace(/\\"/g, '"').slice(0, 3000)
135
- : '(설명 없음)';
136
- const videoId = url.match(/(?:v=|youtu\.be\/)([a-zA-Z0-9_-]+)/)?.[1] ?? '';
137
- const content = [
138
- `![thumbnail](https://img.youtube.com/vi/${videoId}/maxresdefault.jpg)`,
139
- '',
140
- '## 설명',
141
- '',
142
- description,
143
- '',
144
- `## 링크`,
145
- '',
146
- `- [YouTube](${url})`,
147
- videoId ? `- [Embed](https://www.youtube.com/embed/${videoId})` : '',
148
- ].filter(Boolean).join('\n');
149
- return { title, content };
150
- }
151
- //# sourceMappingURL=clip-cmd.js.map
@@ -1,4 +0,0 @@
1
- export declare function cloudSyncCommand(): Promise<void>;
2
- export declare function cloudRestoreCommand(): Promise<void>;
3
- export declare function cloudStatusCommand(): Promise<void>;
4
- //# sourceMappingURL=cloud-cmd.d.ts.map
@@ -1,64 +0,0 @@
1
- // sv cloud sync/restore/status — E2E encrypted cloud backup (F-A04)
2
- import chalk from 'chalk';
3
- import { loadConfig } from '@stellavault/core';
4
- import { syncToCloud, restoreFromCloud, getSyncState } from '@stellavault/core';
5
- function getCloudConfig() {
6
- const endpoint = process.env.SV_CLOUD_ENDPOINT;
7
- const bucket = process.env.SV_CLOUD_BUCKET ?? 'stellavault';
8
- const accessKeyId = process.env.SV_CLOUD_ACCESS_KEY ?? '';
9
- const secretAccessKey = process.env.SV_CLOUD_SECRET_KEY ?? '';
10
- const encryptionKey = process.env.SV_CLOUD_ENCRYPTION_KEY;
11
- if (!endpoint || !secretAccessKey)
12
- return null;
13
- return { endpoint, bucket, accessKeyId, secretAccessKey, encryptionKey };
14
- }
15
- export async function cloudSyncCommand() {
16
- const cloudConfig = getCloudConfig();
17
- if (!cloudConfig) {
18
- console.log(chalk.red('\n Cloud not configured. Set environment variables:'));
19
- console.log(chalk.dim(' SV_CLOUD_ENDPOINT=https://xxx.r2.cloudflarestorage.com'));
20
- console.log(chalk.dim(' SV_CLOUD_SECRET_KEY=your_api_token'));
21
- console.log(chalk.dim(' SV_CLOUD_ENCRYPTION_KEY=your_passphrase (optional)\n'));
22
- return;
23
- }
24
- const config = loadConfig();
25
- console.log(chalk.dim('\n Encrypting and uploading...'));
26
- const result = await syncToCloud(config.dbPath, cloudConfig);
27
- if (result.success) {
28
- console.log(chalk.green('\n ✅ Cloud sync complete'));
29
- console.log(` DB: ${(result.dbSize / 1024).toFixed(0)}KB → Encrypted: ${(result.encryptedSize / 1024).toFixed(0)}KB`);
30
- console.log(chalk.dim(` ${result.timestamp}\n`));
31
- }
32
- else {
33
- console.log(chalk.red(`\n ❌ Sync failed: ${result.error}\n`));
34
- }
35
- }
36
- export async function cloudRestoreCommand() {
37
- const cloudConfig = getCloudConfig();
38
- if (!cloudConfig) {
39
- console.log(chalk.red('\n Cloud not configured. See: sv cloud sync --help\n'));
40
- return;
41
- }
42
- const config = loadConfig();
43
- console.log(chalk.dim('\n Downloading and decrypting...'));
44
- const result = await restoreFromCloud(config.dbPath, cloudConfig);
45
- if (result.success) {
46
- console.log(chalk.green('\n ✅ Restore complete'));
47
- console.log(` Encrypted: ${(result.encryptedSize / 1024).toFixed(0)}KB → DB: ${(result.dbSize / 1024).toFixed(0)}KB`);
48
- console.log(chalk.dim(' Previous DB backed up as .backup\n'));
49
- }
50
- else {
51
- console.log(chalk.red(`\n ❌ Restore failed: ${result.error}\n`));
52
- }
53
- }
54
- export async function cloudStatusCommand() {
55
- const state = getSyncState();
56
- if (!state) {
57
- console.log(chalk.yellow('\n No cloud sync history. Run: sv cloud sync\n'));
58
- return;
59
- }
60
- console.log(chalk.bold('\n ☁️ Cloud Sync Status'));
61
- console.log(` Last sync: ${state.lastSync}`);
62
- console.log(` DB size: ${(state.dbSize / 1024).toFixed(0)}KB\n`);
63
- }
64
- //# sourceMappingURL=cloud-cmd.js.map
@@ -1,6 +0,0 @@
1
- export declare function compileCommand(options: {
2
- raw?: string;
3
- wiki?: string;
4
- force?: boolean;
5
- }): Promise<void>;
6
- //# sourceMappingURL=compile-cmd.d.ts.map
@@ -1,30 +0,0 @@
1
- // stellavault compile — raw → wiki 컴파일 CLI
2
- import chalk from 'chalk';
3
- import { loadConfig, compileWiki } from '@stellavault/core';
4
- import { resolve } from 'node:path';
5
- export async function compileCommand(options) {
6
- const config = loadConfig();
7
- const vaultPath = config.vaultPath;
8
- const rawPath = resolve(vaultPath, options.raw ?? 'raw');
9
- const wikiPath = resolve(vaultPath, options.wiki ?? '_wiki');
10
- console.error(chalk.dim(`Raw: ${rawPath}`));
11
- console.error(chalk.dim(`Wiki: ${wikiPath}`));
12
- console.error('');
13
- const result = compileWiki(rawPath, wikiPath, { force: options.force });
14
- if (result.rawDocCount === 0) {
15
- console.error(chalk.yellow(`No documents found in ${rawPath}`));
16
- console.error(chalk.dim('Create a raw/ folder in your vault and add .md/.txt files.'));
17
- return;
18
- }
19
- console.log(chalk.green(`Compiled ${result.rawDocCount} raw docs → ${result.wikiArticles.length} wiki articles`));
20
- console.log(chalk.dim(`Concepts: ${result.concepts.length}`));
21
- console.log(chalk.dim(`Index: ${result.indexFile}`));
22
- if (result.concepts.length > 0) {
23
- console.log('');
24
- console.log(chalk.cyan('Top concepts:'));
25
- for (const c of result.concepts.slice(0, 10)) {
26
- console.log(` ${c}`);
27
- }
28
- }
29
- }
30
- //# sourceMappingURL=compile-cmd.js.map
@@ -1,2 +0,0 @@
1
- export declare function contradictionsCommand(_opts: any, cmd: any): Promise<void>;
2
- //# sourceMappingURL=contradictions-cmd.d.ts.map
@@ -1,34 +0,0 @@
1
- // stellavault contradictions — detect contradicting statements (F-A12)
2
- import chalk from 'chalk';
3
- import { loadConfig, createKnowledgeHub } from '@stellavault/core';
4
- import { detectContradictions } from '@stellavault/core';
5
- export async function contradictionsCommand(_opts, cmd) {
6
- const globalOpts = cmd?.parent?.opts?.() ?? {};
7
- const jsonMode = globalOpts.json;
8
- const config = loadConfig();
9
- const hub = createKnowledgeHub(config);
10
- console.error(chalk.dim('Scanning for contradictions...'));
11
- await hub.store.initialize();
12
- await hub.embedder.initialize();
13
- const pairs = await detectContradictions(hub.store, 20);
14
- await hub.store.close();
15
- if (jsonMode) {
16
- console.log(JSON.stringify({ count: pairs.length, contradictions: pairs }, null, 2));
17
- return;
18
- }
19
- console.log('');
20
- console.log(chalk.bold(` ⚡ ${pairs.length} potential contradictions found`));
21
- console.log('');
22
- for (const p of pairs) {
23
- const confColor = p.confidence >= 0.8 ? chalk.red : p.confidence >= 0.6 ? chalk.yellow : chalk.dim;
24
- console.log(` ${confColor(`${Math.round(p.confidence * 100)}%`)} ${chalk.dim(`[${p.type}]`)} ${chalk.bold(p.docA.title)} vs ${chalk.bold(p.docB.title)}`);
25
- console.log(` A: ${chalk.dim(p.docA.statement.slice(0, 80))}`);
26
- console.log(` B: ${chalk.dim(p.docB.statement.slice(0, 80))}`);
27
- console.log('');
28
- }
29
- if (pairs.length === 0) {
30
- console.log(chalk.green(' No contradictions detected. Your knowledge is consistent!'));
31
- console.log('');
32
- }
33
- }
34
- //# sourceMappingURL=contradictions-cmd.js.map
@@ -1,2 +0,0 @@
1
- export declare function decayCommand(_opts: any, cmd: any): Promise<void>;
2
- //# sourceMappingURL=decay-cmd.d.ts.map
@@ -1,48 +0,0 @@
1
- // Design Ref: §4.2 — CLI stellavault decay 명령
2
- // Plan SC: SC-03
3
- import chalk from 'chalk';
4
- import { loadConfig, createKnowledgeHub, DecayEngine } from '@stellavault/core';
5
- export async function decayCommand(_opts, cmd) {
6
- const globalOpts = cmd?.parent?.opts?.() ?? {};
7
- const jsonMode = globalOpts.json;
8
- const config = loadConfig();
9
- const hub = createKnowledgeHub(config);
10
- console.error(chalk.dim('⏳ Initializing...'));
11
- await hub.store.initialize();
12
- const db = hub.store.getDb();
13
- if (!db) {
14
- console.error(chalk.red('❌ Cannot access database'));
15
- process.exit(1);
16
- }
17
- const decayEngine = new DecayEngine(db);
18
- const report = await decayEngine.computeAll();
19
- if (jsonMode) {
20
- console.log(JSON.stringify(report, null, 2));
21
- await hub.store.close();
22
- return;
23
- }
24
- console.log(chalk.green('\n🧠 Knowledge Decay Report'));
25
- console.log(chalk.dim('─'.repeat(50)));
26
- console.log(` 📄 Total documents: ${report.totalDocuments}`);
27
- console.log(` ⚠️ Decaying (R<0.5): ${chalk.yellow(String(report.decayingCount))}`);
28
- console.log(` 🔴 Critical (R<0.3): ${chalk.red(String(report.criticalCount))}`);
29
- console.log(` 📊 Average R: ${report.averageR}`);
30
- console.log(chalk.dim('─'.repeat(50)));
31
- if (report.topDecaying.length > 0) {
32
- console.log(chalk.yellow('\n📋 Top Decaying Notes (리마인드 필요):'));
33
- for (const d of report.topDecaying.slice(0, 20)) {
34
- const rBar = '█'.repeat(Math.round(d.retrievability * 10)) + '░'.repeat(10 - Math.round(d.retrievability * 10));
35
- const color = d.retrievability < 0.3 ? chalk.red : chalk.yellow;
36
- console.log(` ${color(rBar)} R=${d.retrievability.toFixed(2)} | ${d.daysSinceAccess}d ago | ${d.title}`);
37
- }
38
- }
39
- if (report.clusterHealth.length > 0) {
40
- console.log(chalk.dim('\n📊 Cluster Health:'));
41
- for (const c of report.clusterHealth.slice(0, 10)) {
42
- const color = c.avgR < 0.3 ? chalk.red : c.avgR < 0.5 ? chalk.yellow : chalk.green;
43
- console.log(` ${color(`R=${c.avgR.toFixed(2)}`)} | ${c.count} docs | ${c.label}`);
44
- }
45
- }
46
- console.log(chalk.dim('\n💡 Tip: stellavault search <topic> to refresh decaying knowledge'));
47
- }
48
- //# sourceMappingURL=decay-cmd.js.map
@@ -1,5 +0,0 @@
1
- export declare function digestCommand(options: {
2
- days?: string;
3
- visual?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=digest-cmd.d.ts.map