@yixinkj/priority-buyer-alert-cli 0.1.40 → 0.1.42

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/index.js CHANGED
@@ -684,9 +684,89 @@ function prepareMacBinaries(target) {
684
684
  }
685
685
  }
686
686
 
687
+ /// 同机保留的运行时版本数(含当前正在用的这一版)。
688
+ ///
689
+ /// 每升一版就多留一份二进制,从来没人删。真机上 public-customer-reactivation 攒了 16 份
690
+ /// 共 94M,三个 Skill 合计 164M,而任何时刻真正被执行的只有一份。
691
+ /// 不设成 1 是因为同一台机器会交替跑不同 dist-tag(例如 latest 与 beta),
692
+ /// 只留当前版会让每次切换都重新下载一遍。
693
+ const RUNTIME_VERSIONS_TO_KEEP = 2;
694
+
695
+ /**
696
+ * 清理旧版本运行时目录,按最近使用时间保留最新的若干份。
697
+ *
698
+ * 尽力而为:删不掉就算了,绝不因为清理失败影响本次运行。
699
+ * @returns {string[]} 实际删掉的版本目录名。
700
+ */
701
+ function pruneOldRuntimeVersions(
702
+ versionsRoot = path.dirname(VERSION_ROOT),
703
+ active = path.basename(VERSION_ROOT),
704
+ keepCount = RUNTIME_VERSIONS_TO_KEEP
705
+ ) {
706
+ let entries;
707
+ try {
708
+ entries = fs.readdirSync(versionsRoot, { withFileTypes: true });
709
+ } catch {
710
+ return [];
711
+ }
712
+ // 先把当前版本的时间戳刷新成现在:保留依据是「最近用过」而不是「最近装的」,
713
+ // 否则交替使用两个版本时,先装的那个会被误判成最旧的。
714
+ try {
715
+ const now = new Date();
716
+ fs.utimesSync(path.join(versionsRoot, active), now, now);
717
+ } catch {
718
+ // 目录还没建好(首次安装前)就跳过,不影响后面的判断。
719
+ }
720
+ const ranked = entries
721
+ .filter((entry) => entry.isDirectory())
722
+ .map((entry) => entry.name)
723
+ // 排除 v<版本>.staging-<pid>:那可能是另一个进程正在写的半成品。
724
+ .filter((name) => /^v\d/.test(name) && !name.includes('.staging-'))
725
+ .map((name) => {
726
+ let usedAt = 0;
727
+ try {
728
+ usedAt = fs.statSync(path.join(versionsRoot, name)).mtimeMs;
729
+ } catch {
730
+ usedAt = 0;
731
+ }
732
+ return { name, usedAt };
733
+ })
734
+ .sort((a, b) => b.usedAt - a.usedAt);
735
+
736
+ const keep = new Set(ranked.slice(0, keepCount).map((item) => item.name));
737
+ keep.add(active);
738
+
739
+ const removed = [];
740
+ for (const { name } of ranked) {
741
+ if (keep.has(name)) continue;
742
+ try {
743
+ fs.rmSync(path.join(versionsRoot, name), { recursive: true, force: true });
744
+ removed.push(name);
745
+ } catch {
746
+ // 正被占用或权限不足都不是本次运行该处理的问题,留到下次。
747
+ }
748
+ }
749
+ return removed;
750
+ }
751
+
752
+ /**
753
+ * 每次启动都清理一次旧版本,并把删掉的版本写到 stderr。
754
+ *
755
+ * 放在「已安装」的快路径上也要跑:只在新装时清理的话,一台停止升级的机器会把
756
+ * 历史版本永远留着。
757
+ */
758
+ function reportPrunedRuntimeVersions(...args) {
759
+ const removed = pruneOldRuntimeVersions(...args);
760
+ if (removed.length > 0) {
761
+ console.error(`[${SKILL_ID}] 已清理旧版本运行时:${removed.join('、')}`);
762
+ }
763
+ return removed;
764
+ }
765
+
687
766
  async function ensureInstalled(target) {
688
767
  if (isInstalled(target)) {
689
768
  prepareMacBinaries(target);
769
+ reportPrunedRuntimeVersions();
690
770
  return;
691
771
  }
692
772
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), `${SKILL_ID}-install-`));
@@ -713,6 +793,7 @@ async function ensureInstalled(target) {
713
793
  fs.rmSync(VERSION_ROOT, { recursive: true, force: true });
714
794
  fs.renameSync(stagingRoot, VERSION_ROOT);
715
795
  prepareMacBinaries(target);
796
+ reportPrunedRuntimeVersions();
716
797
  } finally {
717
798
  fs.rmSync(stagingRoot, { recursive: true, force: true });
718
799
  fs.rmSync(tempRoot, { recursive: true, force: true });
@@ -926,6 +1007,8 @@ export {
926
1007
  isHelpRequest,
927
1008
  isInstalled,
928
1009
  parseSkillMetadata,
1010
+ pruneOldRuntimeVersions,
1011
+ reportPrunedRuntimeVersions,
929
1012
  releaseUrls,
930
1013
  resolveSkillGate,
931
1014
  runtimeManifestUrl,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yixinkj/priority-buyer-alert-cli",
3
- "version": "0.1.40",
3
+ "version": "0.1.42",
4
4
  "description": "重点买家未回复预警独立启动器,只读扫描询盘并提醒,不发送任何消息。",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: 哨兵预警-0812
3
3
  description: 重点买家未回复预警。只读扫描阿里国际站询盘列表,挑出重点买家(金品店铺为 L2 及以上真实档;出口通店铺只有 L1+ 一个值,它是 L1–L4 的合集,必然包含 L1),判断买家最后一句是否超过 SLA 仍没有真人业务员回复,并输出中文预警清单;机器人自动接待不算人工回复。Use when 用户要求检查重点买家有没有超时未回复、查询盘超时提醒、看 L3/L4 有没有快凉的,或要求运行重点买家预警。
4
- version: "0.1.40"
4
+ version: "0.1.42"
5
5
  ---
6
6
 
7
7
  # 重点买家预警
@@ -19,7 +19,7 @@ version: "0.1.40"
19
19
  ## 运行入口
20
20
 
21
21
  ```bash
22
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
22
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
23
23
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
24
24
  --start
25
25
  ```
@@ -68,7 +68,7 @@ npx -y @yixinkj/priority-buyer-alert-cli@beta \
68
68
  按返回的 `poll_after_seconds` 静默轮询,不逐条播报进度:
69
69
 
70
70
  ```bash
71
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
71
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
72
72
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
73
73
  --poll-run "run_id"
74
74
  ```
@@ -98,7 +98,7 @@ npx -y @yixinkj/priority-buyer-alert-cli@beta \
98
98
  Skill 起草第一次回复。
99
99
 
100
100
  ```bash
101
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
101
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
102
102
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
103
103
  --first-response-scan --since 24
104
104
  ```
@@ -161,12 +161,12 @@ npx -y @yixinkj/priority-buyer-alert-cli@beta \
161
161
 
162
162
  ```bash
163
163
  # 排查预警判定
164
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
164
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
165
165
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
166
166
  --start --explain 10
167
167
 
168
168
  # 排查新询盘判定
169
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
169
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
170
170
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
171
171
  --first-response-scan --since 24 --explain 10
172
172
  ```
@@ -194,7 +194,7 @@ npx -y @yixinkj/priority-buyer-alert-cli@beta \
194
194
  ```
195
195
 
196
196
  ```bash
197
- npx -y @yixinkj/priority-buyer-alert-cli@beta \
197
+ npx -y @yixinkj/priority-buyer-alert-cli@latest \
198
198
  --skill-path "本次实际读取的 SKILL.md 绝对路径" \
199
199
  --start --minutes 30 --re-alert 30 --mark
200
200
  ```
package/skills.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "runtimeVersion": "0.1.32",
2
+ "runtimeVersion": "0.1.33",
3
3
  "platforms": {
4
4
  "darwin-arm64": {
5
5
  "id": "mac-arm64",
@@ -19,12 +19,12 @@
19
19
  },
20
20
  "bridge": {
21
21
  "package": "@yixinkj/yixin-bridge-cli",
22
- "minVersion": "1.0.6"
22
+ "minVersion": "1.0.7"
23
23
  },
24
24
  "skill": {
25
25
  "name": "哨兵预警-0812",
26
26
  "id": "priority-buyer-alert",
27
- "version": "0.1.40",
27
+ "version": "0.1.42",
28
28
  "bin": "priority-buyer-alert-cli"
29
29
  }
30
30
  }