opencode-metrics-plugin 0.3.3 → 0.3.4

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.4(2026-09-14)
4
+
5
+ - 修复 0.3.3 发布事故:package.json 误带 UTF-8 BOM,npm 可安装但 opencode 解析插件清单失败并**静默跳过加载**——所有 0.3.3 用户完全不采集、不上传、日志无任何痕迹。升级本版后必须删除插件缓存并重启 opencode(Windows `%USERPROFILE%\.cache\opencode\packages\opencode-metrics-plugin*`,macOS `~/Library/Caches/opencode/packages/` 同名目录);事故期间未采集的会话无法补录,装好后孤儿补传会自动补传 7 天内未上终态的历史快照。
6
+ - 用户可编辑文件读取容忍 BOM:`opencode-metrics.json(.jsonc)` 与 `agc-apiclient.json` 用 Windows PowerShell 或旧版编辑器保存不再静默失效。
7
+ - 发布防复发:`prepublishOnly` 增加 package.json BOM 守卫,命中即发布失败。
8
+
3
9
  ## 0.3.3(2026-09-12)
4
10
 
5
11
  - session-end 三层保障,修复宿主进程突然死亡导致会话终态包永不产出的问题:
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  - **开箱即用**:宿主只需在 `opencode.json` 加一行,无需任何配置
6
6
  - **实时落盘**:会话进行中每 2s 增量写盘,中途退出不丢数据
7
- - **开箱即传**:上传默认开启(包内 AGC 凭证),`git commit` / 会话结束自动打包上传,安卓源码工程自动剔除,`upload.enabled: false` 可关
7
+ - **开箱即传**:上传默认开启(包内 AGC 凭证),`git commit` / 根会话 task 完成 / 会话结束自动打包上传,安卓源码工程自动剔除,`upload.enabled: false` 可关
8
8
  - **独立配置文件**:`.opencode/opencode-metrics.json(.jsonc)` 支持注释,存在即完全接管内联配置;用户目录 `~/.config/opencode/` 可放全局兜底配置
9
9
  - **失败不丢**:上传失败的包保留在 `failed/`(与云端路径同构,可手动上传),下次启动自动补偿重传
10
10
  - **零打扰**:不修改工作区、不执行 clean
@@ -71,10 +71,16 @@
71
71
 
72
72
  | 平台 | 路径 |
73
73
  |---|---|
74
- | Windows | `%LOCALAPPDATA%\opencode-metrics-plugin\Log\{metrics,events}`、`...\Log\log\plugin\YYYYMMDD.log`(运行日志按日期归档,保留 30 天)、`...\Data\upload-staging` |
74
+ | Windows | `%LOCALAPPDATA%\opencode-metrics-plugin\Log\{metrics,events}`(metrics 下另有 `.sent/` 已传终态标记)、`...\Log\log\plugin\YYYYMMDD.log`(运行日志按日期归档,保留 30 天)、`...\Data\upload-staging` |
75
75
  | Linux | `~/.local/state/opencode-metrics-plugin/{metrics,events}` |
76
76
  | macOS | `~/Library/Logs/opencode-metrics-plugin/{metrics,events}` |
77
77
 
78
+ ## 升级与排障
79
+
80
+ - **升级不生效**:opencode 将插件缓存在本机且不自动更新,升级后须删缓存再重启——Windows `%USERPROFILE%\.cache\opencode\packages\` 下的 `opencode-metrics-plugin*` 目录,macOS `~/Library/Caches/opencode/packages/` 下同名目录。
81
+ - **装上完全没反应(日志无 `[MetricsPlugin] started`)**:若装的是 0.3.3,系发布事故——该版 package.json 误带 UTF-8 BOM,opencode 静默跳过插件(不采集、不上传、无报错)。升级 0.3.4+ 并删缓存即恢复;期间丢的会话无法补录,装好后 7 天内未上终态的老快照会被孤儿补传自动救回。
82
+ - **验证插件已加载**:插件日志(`log/plugin/YYYYMMDD.log`)首屏出现 `[MetricsPlugin] started` 行。
83
+
78
84
  ## 配置项速查
79
85
 
80
86
  全部可选;独立文件与内联第二参字段相同。
@@ -58,7 +58,7 @@ function readFirstExisting(baseDirectory, names) {
58
58
  for (const name of names) {
59
59
  const candidate = path.join(baseDirectory, name);
60
60
  try {
61
- return { configPath: candidate, raw: fs.readFileSync(candidate, "utf-8") };
61
+ return { configPath: candidate, raw: fs.readFileSync(candidate, "utf-8").replace(/^\uFEFF/, "") };
62
62
  }
63
63
  catch {
64
64
  // 该名字的文件不存在,尝试下一个
@@ -31,7 +31,7 @@ export function defaultAgcConfigPath() {
31
31
  export function loadAgcCredentials(configPath, tokenCacheDir) {
32
32
  let raw;
33
33
  try {
34
- raw = fs.readFileSync(configPath, "utf-8");
34
+ raw = fs.readFileSync(configPath, "utf-8").replace(/^\uFEFF/, "");
35
35
  }
36
36
  catch (err) {
37
37
  return { ok: false, reason: `读取配置失败 ${configPath}: ${String(err)}` };
@@ -258,9 +258,9 @@ export function createUploadManager(options) {
258
258
  return scenarios.find((s) => s.enabled && s.events.includes("session.deleted"))?.label ?? "session-end";
259
259
  }
260
260
  /**
261
- * 扫描 metrics 目录孤儿快照并补打 session-end 包:mtime 静默 [idleMs, maxAgeMs]
262
- * 且不属于本进程活跃会话的快照视为孤儿。上传成功后快照即被删除,
263
- * "文件仍在"天然等价于"终态未传出",无需额外标记。
261
+ * 扫描 metrics 目录孤儿快照并补打 session-end 包:mtime 静默 [idleMs, maxAgeMs]
262
+ * 无已传标记(metrics/.sent/<sessionId>)且不属于本进程活跃会话的快照视为孤儿。
263
+ * 快照原件永久保留为本地记录,已传标记才是防重复补传的依据。
264
264
  *
265
265
  * @param idleMs 静默下限(毫秒)
266
266
  * @param maxAgeMs 年龄上限(毫秒)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
- {
1
+ {
2
2
  "name": "opencode-metrics-plugin",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
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",
@@ -33,7 +33,7 @@
33
33
  "build": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" && tsc",
34
34
  "typecheck": "tsc --noEmit",
35
35
  "test": "tsx example/smoke.mts",
36
- "prepublishOnly": "npm run build && npm test"
36
+ "prepublishOnly": "node -e \"if(require('fs').readFileSync('package.json','utf8').charCodeAt(0)===0xFEFF){console.error('package.json 含 BOM,禁止发布');process.exit(1)}\" && npm run build && npm test"
37
37
  },
38
38
  "engines": {
39
39
  "node": ">=18"