echoes-vault-opencode 1.1.5 → 1.1.7

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 (3) hide show
  1. package/index.ts +48 -0
  2. package/package.json +1 -1
  3. package/tui.tsx +5 -0
package/index.ts CHANGED
@@ -19,6 +19,12 @@ type VaultPaths = {
19
19
  assets: string
20
20
  }
21
21
 
22
+ type VaultStats = {
23
+ totalPages: number
24
+ totalDailyLogs: number
25
+ deprecatedPages: number
26
+ }
27
+
22
28
  type EchoesState = {
23
29
  version: number
24
30
  pluginVersion: string
@@ -29,6 +35,7 @@ type EchoesState = {
29
35
  lastStart: string | null
30
36
  lastSave: string | null
31
37
  }
38
+ stats: VaultStats
32
39
  }
33
40
 
34
41
  const STATE_FILENAME = ".opencode/echoes-state.json"
@@ -53,6 +60,11 @@ const defaultState = (): EchoesState => ({
53
60
  lastStart: null,
54
61
  lastSave: null,
55
62
  },
63
+ stats: {
64
+ totalPages: 0,
65
+ totalDailyLogs: 0,
66
+ deprecatedPages: 0,
67
+ },
56
68
  })
57
69
 
58
70
  const readState = async (directory: string): Promise<EchoesState> => {
@@ -88,6 +100,36 @@ const ensureVaultDirs = async (paths: VaultPaths): Promise<void> => {
88
100
  await fs.mkdir(paths.assets, { recursive: true })
89
101
  }
90
102
 
103
+ const collectStats = async (vaultPaths: VaultPaths): Promise<VaultStats> => {
104
+ let totalPages = 0
105
+ let totalDailyLogs = 0
106
+ let deprecatedPages = 0
107
+
108
+ try {
109
+ const pageFiles = (await fs.readdir(vaultPaths.pages)).filter((f) => f.endsWith(".md"))
110
+ totalPages = pageFiles.length
111
+ for (const file of pageFiles) {
112
+ const content = await fs.readFile(path.join(vaultPaths.pages, file), "utf-8")
113
+ if (content.includes("DEPRECATED")) {
114
+ deprecatedPages++
115
+ }
116
+ }
117
+ } catch { /* pages dir may not exist yet */ }
118
+
119
+ try {
120
+ const dailyFiles = (await fs.readdir(vaultPaths.daily)).filter((f) => f.endsWith(".md"))
121
+ totalDailyLogs = dailyFiles.length
122
+ } catch { /* daily dir may not exist yet */ }
123
+
124
+ return { totalPages, totalDailyLogs, deprecatedPages }
125
+ }
126
+
127
+ const updateStats = async (directory: string, vaultPaths: VaultPaths): Promise<void> => {
128
+ const st = await readState(directory)
129
+ st.stats = await collectStats(vaultPaths)
130
+ await writeState(directory, st)
131
+ }
132
+
91
133
  const DEFAULT_INDEX = `# EchoesVault Index
92
134
 
93
135
  Welcome to the EchoesVault knowledge base.
@@ -375,6 +417,7 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
375
417
  state.pluginVersion = await getPluginVersion()
376
418
  state.session.started = false
377
419
  state.session.saved = false
420
+ state.stats = await collectStats(paths)
378
421
  await writeState(directory, state)
379
422
 
380
423
  return {
@@ -479,6 +522,7 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
479
522
  const st = await readState(directory)
480
523
  st.session.saved = true
481
524
  st.session.lastSave = new Date().toISOString()
525
+ st.stats = await collectStats(paths)
482
526
  await writeState(directory, st)
483
527
 
484
528
  return [
@@ -506,6 +550,7 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
506
550
  const timestamp = new Date().toISOString()
507
551
  const entry = `### Scratchpad — ${timestamp}\n\n${args.logEntry}\n\n`
508
552
  await fs.appendFile(dailyFile, entry)
553
+ await updateStats(directory, paths)
509
554
  return `✅ Scratchpad note saved to EchoesVault/daily/${today}.md`
510
555
  },
511
556
  }),
@@ -587,6 +632,8 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
587
632
  }
588
633
  }
589
634
 
635
+ await updateStats(directory, paths)
636
+
590
637
  const action = existed ? "updated" : "created"
591
638
  const parts = [`✅ Page ${action}: EchoesVault/pages/${fileName}`]
592
639
  if (!existed && args.indexDescription) {
@@ -602,6 +649,7 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
602
649
  async execute(_args, _ctx) {
603
650
  const st = await readState(directory)
604
651
  st.initialized = true
652
+ st.stats = await collectStats(paths)
605
653
  await writeState(directory, st)
606
654
  return "EchoesVault activated."
607
655
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "echoes-vault-opencode",
3
- "version": "1.1.5",
3
+ "version": "1.1.7",
4
4
  "description": "EchoesVault — persistent memory plugin for OpenCode. Obsidian-style knowledge base with daily logs, encyclopedia pages, and session resumption.",
5
5
  "type": "module",
6
6
  "main": "index.ts",
package/tui.tsx CHANGED
@@ -14,6 +14,11 @@ type EchoesState = {
14
14
  lastStart: string | null
15
15
  lastSave: string | null
16
16
  }
17
+ stats?: {
18
+ totalPages: number
19
+ totalDailyLogs: number
20
+ deprecatedPages: number
21
+ }
17
22
  }
18
23
 
19
24
  const STATE_PATH = path.join(process.cwd(), ".opencode", "echoes-state.json")