opencode-metrics-plugin 0.3.1 → 0.3.3

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.
@@ -8,10 +8,52 @@ export function setLogLevel(level) {
8
8
  }
9
9
  const DEFAULT_LOG_FILE = path.join(envPaths('opencode-metrics-plugin', { suffix: '' }).log, 'plugin.log');
10
10
  let logFile = DEFAULT_LOG_FILE;
11
- /** 设置运行日志落盘文件;传 null 关闭文件输出(仅 console)。 */
11
+ /** 设置运行日志基准文件;实际写入 <所在目录>/log/plugin/YYYYMMDD.log;传 null 关闭文件输出(仅 console)。 */
12
12
  export function setLogFile(file) {
13
13
  logFile = file;
14
+ resolvedFile = null;
14
15
  }
16
+ // ─── 按日期归档(0.3.2):进程首写时按当天定死目标文件,跨午夜不切换 ───
17
+ /** 运行日志保留天数,超期文件启动清理时删除 */
18
+ const MAX_AGE_DAYS = 30;
19
+ /** 缓存的目标文件(基准 + log/plugin/日期 推导);null 表示尚未解析或未启用 */
20
+ let resolvedFile = null;
21
+ /**
22
+ * 解析当天目标日志文件:<基准所在目录>/log/plugin/YYYYMMDD.log。
23
+ * 进程生命周期内锁定(跨午夜不切换),下次进程自然写新日期文件。
24
+ */
25
+ function resolveTargetFile(base) {
26
+ const now = new Date();
27
+ const pad = (n) => String(n).padStart(2, '0');
28
+ const date = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}`;
29
+ return path.join(path.dirname(base), 'log', 'plugin', `${date}.log`);
30
+ }
31
+ /**
32
+ * 清理过期运行日志:只删基准同目录 log/plugin/ 下严格 YYYYMMDD.log
33
+ * 且 mtime 超过保留天数的文件;其余任何文件一概不碰。幂等,可反复调用。
34
+ */
35
+ export function cleanupOldLogFiles() {
36
+ if (logFile == null)
37
+ return;
38
+ try {
39
+ const dir = path.join(path.dirname(logFile), 'log', 'plugin');
40
+ if (!fs.existsSync(dir))
41
+ return;
42
+ const maxAgeMs = MAX_AGE_DAYS * 24 * 60 * 60 * 1000;
43
+ for (const entry of fs.readdirSync(dir)) {
44
+ if (!/^\d{8}\.log$/.test(entry))
45
+ continue;
46
+ const full = path.join(dir, entry);
47
+ try {
48
+ if (Date.now() - fs.statSync(full).mtimeMs > maxAgeMs)
49
+ fs.unlinkSync(full);
50
+ }
51
+ catch { }
52
+ }
53
+ }
54
+ catch { }
55
+ }
56
+ setImmediate(cleanupOldLogFiles);
15
57
  let buffer = [];
16
58
  let flushTimer = null;
17
59
  const FLUSH_INTERVAL_MS = 500;
@@ -20,8 +62,10 @@ function writeLine(line) {
20
62
  if (logFile == null)
21
63
  return;
22
64
  try {
23
- fs.mkdirSync(path.dirname(logFile), { recursive: true });
24
- fs.appendFileSync(logFile, line + '\n');
65
+ if (resolvedFile == null)
66
+ resolvedFile = resolveTargetFile(logFile);
67
+ fs.mkdirSync(path.dirname(resolvedFile), { recursive: true });
68
+ fs.appendFileSync(resolvedFile, line + '\n');
25
69
  }
26
70
  catch {
27
71
  // 文件不可写时回退 console,避免静默吞日志
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
- {
1
+ {
2
2
  "name": "opencode-metrics-plugin",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "opencode plugin: auto-records every session's metrics (tokens/rounds/steps/sub-agents/hvigor builds) to snapshot JSON. Zero DB, zero config. Pair with session-viewer for visualization.",
5
5
  "type": "module",
6
6
  "license": "MIT",