@shgroup/dsh-serenity-hooks 1.42.0 → 1.44.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.
@@ -1,3 +1,21 @@
1
+ import { dirname, join } from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ //#region src/constants.ts
5
+ /** 常量(纯模块,零 DSH 依赖) */
6
+ /**
7
+ * ACC 版本:自动从 package.json 读取(单一真相源,消除与 CHANGELOG 的漂移)。
8
+ * 发布时只需改 package.json 的 version。
9
+ */
10
+ const ACC_VERSION = (() => {
11
+ try {
12
+ const here = dirname(fileURLToPath(import.meta.url));
13
+ return JSON.parse(readFileSync(join(here, "..", "package.json"), "utf-8")).version ?? "0.0.0";
14
+ } catch {
15
+ return "0.0.0";
16
+ }
17
+ })();
18
+ //#endregion
1
19
  //#region src/skiff-registry.ts
2
20
  const skiffSessions = /* @__PURE__ */ new Map();
3
21
  /** 查 sessionId 的 Skiff 角色名(无 → null)——向后兼容(guards/seams 依赖) */
@@ -22,4 +40,4 @@ function skiffSessionSnapshot() {
22
40
  return new Map(skiffSessions);
23
41
  }
24
42
  //#endregion
25
- export { unregisterSkiffSession as a, skiffSessionSnapshot as i, skiffRoleFor as n, skiffSessionInfo as r, registerSkiffSession as t };
43
+ export { unregisterSkiffSession as a, skiffSessionSnapshot as i, skiffRoleFor as n, ACC_VERSION as o, skiffSessionInfo as r, registerSkiffSession as t };
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
- import { h as resolveInside, m as readUtf8, s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-NlLr_sxy.js";
2
+ import { g as resolveInside, h as readUtf8, s as loadSerenityConfig, t as DEFAULT_SERENITY_CONFIG_PATHS } from "./ccc-DG4Oc7I1.js";
3
3
  import { existsSync, statSync } from "node:fs";
4
4
  //#region src/skiff-role.ts
5
5
  /**
@@ -4,7 +4,7 @@
4
4
  * v1.33(S142 §32 用户裁决):由 `logbook` **更名并收敛为 `trajectory`**(v1.34:工具名再硬切为
5
5
  * `container_trajectory`,无别名)——trajectory 是一等概念
6
6
  * (SESSION.md 是它的持久身体),本工具管它的**载体生命周期 + 一次性时间安排**。
7
- * 动作面现行 **7 个**:list / show / create / use / rebuild / **`send-now`** / **`send-later`**。
7
+ * 动作面现行 **8 个**:list / show / create / use / rebuild / **`send-now`** / **`send-later`** / **`cro-guide`**。
8
8
  * 🔴 2026-09-16(所有者裁决):**第 7 个动作 `send-message`(即时投递)**
9
9
  * ——与 `wake-later` 共用取用通路,差别只在**时刻**(现在 vs 未来)与**回执**(有 vs 无);
10
10
  * 实现落在 `wake-scheduler.ts` 的 `sendToTrajectory()`("怎么把一句话送到一条轨迹"是调度器的知识)。
@@ -27,6 +27,9 @@
27
27
  * `systemPrompt.section` 注入,见 `docs/trajectory-skill-injection.md`)
28
28
  * · autopilot 面(all/init/random/diag/doc/check/status/guide)→ `container_admin` 的 autopilot 域
29
29
  * · `wake-add`/`wake-list`/`wake-rm` → **`wake-later`**(v1.33 收敛;**2026-09-17 更名 `send-later`**)
30
+ * · 2026-09-20(CRO 落地):新增 **`cro-guide`** —— CRO 编写指南的出口(纯读)。
31
+ * 判据(R↓,为何在此而不新增域):CRO 程序放在**轨迹自己的目录**里 ⇒ "怎么写它"是
32
+ * **逐轨迹**的知识,而管轨迹的人正是用本工具的人(设计 §9-5「既有 guide 位置,不新增域」)。
30
33
  *
31
34
  * 保留 osp 对齐语义的部分:create 的 `--desc`/`--issue` 二选一、use 激活即重命名 dsh 会话标题(F3)。
32
35
  * 活跃会话跟踪:内存 Map(按 dsh 会话 id 隔离)+ 从 events 恢复(S134)。
@@ -1,4 +1,4 @@
1
- import { r as cccRootForCwd } from "./ccc-roots-Bd_SjEs7.js";
1
+ import { r as cccRootForCwd } from "./ccc-roots-FxWXuZPw.js";
2
2
  import { basename, dirname, join } from "node:path";
3
3
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync } from "node:fs";
4
4
  //#region src/time.ts
@@ -94,7 +94,7 @@ function localIdStamp(value = Date.now()) {
94
94
  * 行为对齐 osp(opencode-serenity-plugin/src/session/lib.ts)——osp 是 ACC 工具 spec。
95
95
  *
96
96
  * v1.33 收敛(S142 §32):本文件只服务 `container_trajectory` 的动作面
97
- * (现行 **7 个**:list / show / create / use / rebuild / **send-now** / **send-later**)。旧 `logbook` 面里
97
+ * (现行 **8 个**:list / show / create / use / rebuild / **send-now** / **send-later** / **cro-guide**)。旧 `logbook` 面里
98
98
  * **close / archive / health / qa 四个动作已删**(用户裁决「功能上废弃,实际上没用」),
99
99
  * 其函数(closeSession / archiveSessions / healthCheck / qaCheck)**同批删除**——
100
100
  * 保留下来的只有:create(--desc / --issue 二选一、dry-run 预览)、
@@ -108,7 +108,8 @@ const TRAJECTORY_ACTIONS = [
108
108
  "use",
109
109
  "rebuild",
110
110
  "send-now",
111
- "send-later"
111
+ "send-later",
112
+ "cro-guide"
112
113
  ];
113
114
  /**
114
115
  * 读取 Session 事件序列(v1.28.1 适配 0.1.2-rc.1 补齐):rc.1 起官方 Session 类
@@ -4,7 +4,7 @@
4
4
  * 行为对齐 osp(opencode-serenity-plugin/src/session/lib.ts)——osp 是 ACC 工具 spec。
5
5
  *
6
6
  * v1.33 收敛(S142 §32):本文件只服务 `container_trajectory` 的动作面
7
- * (现行 **7 个**:list / show / create / use / rebuild / **send-now** / **send-later**)。旧 `logbook` 面里
7
+ * (现行 **8 个**:list / show / create / use / rebuild / **send-now** / **send-later** / **cro-guide**)。旧 `logbook` 面里
8
8
  * **close / archive / health / qa 四个动作已删**(用户裁决「功能上废弃,实际上没用」),
9
9
  * 其函数(closeSession / archiveSessions / healthCheck / qaCheck)**同批删除**——
10
10
  * 保留下来的只有:create(--desc / --issue 二选一、dry-run 预览)、
@@ -29,8 +29,14 @@
29
29
  * 同落点语义),只差**时刻**;而「唤醒(冷载入)」是**两条路径共有**的属性,不配做区分
30
30
  * ⇒ 族名取共享词干 **`send-`**、轴取 **`-now` / `-later`**(同构)。**硬切无别名**;
31
31
  * 机制层词汇(`wake-registry.json` / `w-*` id / `WakeEntry` / 调度器名)**一律不动**(分层命名)。
32
+ * 2026-09-20(CRO 落地,owner 令「搞定了发一版」):新增 **`cro-guide`** —— CRO
33
+ * (Continuous Re-Occurrence,`docs/cro-design.md`)的**编写指南**出口。
34
+ * 判据(R↓,为何挂在本工具而不新增域):CRO 程序**放在轨迹自己的目录里**
35
+ * (`<轨迹目录>/continuous-re-occurrence.ts`)⇒ 「怎么写它」是**逐轨迹**的知识,
36
+ * 而**管轨迹的人正是用本工具的人**;挂这儿 = 设计 §9-5 的"**既有 guide 位置、不新增域**"。
37
+ * ⚠️ 本动作**纯读**(输出指南正文,不碰 fs、不碰注册表)。
32
38
  */
33
- type TrajectoryAction = 'list' | 'show' | 'create' | 'use' | 'rebuild' | 'send-now' | 'send-later';
39
+ type TrajectoryAction = 'list' | 'show' | 'create' | 'use' | 'rebuild' | 'send-now' | 'send-later' | 'cro-guide';
34
40
  export declare const TRAJECTORY_ACTIONS: readonly TrajectoryAction[];
35
41
  /**
36
42
  * 读取 Session 事件序列(v1.28.1 适配 0.1.2-rc.1 补齐):rc.1 起官方 Session 类
@@ -55,17 +55,34 @@ export declare function parseDeclaredSkills(sessionMd: string): string[];
55
55
  */
56
56
  export declare function hasTrajectorySkillsDeclaration(root: string, mdPath: string): boolean;
57
57
  /**
58
- * 装配注入正文(规格 §3):按声明顺序拼接各 skill 的 `SKILL.md` 全文,每段带来源抬头
58
+ * 合并两条声明来源(v1.44.0):**CCC 级在前,轨迹级追加**,同名去重取首次位置。
59
+ *
60
+ * 两条来源(owner 令 2026-09-20):
61
+ * · **CCC 级** = `.opencode/serenity.json` 的 `trajectory.skills`(本 CCC 所有轨迹共有的底座);
62
+ * · **轨迹级** = 该轨迹 `SESSION.md` frontmatter 的 `skills:`(这条轨迹额外的)。
63
+ *
64
+ * 为什么是**并集**而不是二选一(R↓):C1 设计当初否决"纯 CCC 全局"的理由是"会**丢掉
65
+ * per-trajectory**";并集把两侧都保住——容器给底座,单条轨迹仍可加自己的额外项。
66
+ * 为什么 CCC 级**在前**:底座先立、增量随后,与"入口身份块 order=-50 → 本 section order=-45"
67
+ * 的既有先后观感一致。
68
+ */
69
+ export declare function mergeSkillNames(cccSkills: readonly string[], trajSkills: readonly string[]): string[];
70
+ /**
71
+ * 装配注入正文(规格 §3):按**合并后的**顺序拼接各 skill 的 `SKILL.md` 全文,每段带来源抬头
59
72
  * `=== skill: <name> ===`;拿不到全文的一律以 `[缺失]` 响亮提示占位(**不静默**)。
60
73
  *
61
- * 安全(规格 §3 🔒):名字来自 CCC 数据(frontmatter)⇒ **先过 `isSafeSkillName`**;
74
+ * 安全(规格 §3 🔒):名字来自 CCC 数据(frontmatter / CCC 配置)⇒ **先过 `isSafeSkillName`**;
62
75
  * 不安全 ⇒ 按缺失处理,且不调用 `findSkillMd` ⇒ **不发生任何以该名拼出的 fs 访问**。
63
76
  *
64
- * 长度守卫:复用已导出的 `truncateContent`,超限截断并在末尾写明 `truncated`。
77
+ * 长度守卫:复用已导出的 `truncateContent`,**在合并之后**统一截断(两条来源共享同一上限,
78
+ * 不是各给 32 KB——否则上限会随来源数翻倍)。
65
79
  *
66
80
  * @param root CCC 根
67
81
  * @param mdPath 轨迹的 SESSION.md 路径(**来自绑定的 `mdPath`**,不用 label 拼)
68
82
  * @param maxChars 总长上限(字符)
69
- * @returns 注入正文;无声明 `''`(空串 = 宿主不产出该 section 块);SESSION.md 缺失 → 响亮提示
83
+ * @param cccSkills CCC 级声明(`readTrajectorySkills`;缺省空 = 只有轨迹级,行为与 v1.43 一致)
84
+ * @returns 注入正文;两条来源皆无声明 → `''`(空串 = 宿主不产出该 section 块);
85
+ * SESSION.md 缺失/读失败 → 响亮提示(若同时有 CCC 级声明,则提示在前、正文随后——
86
+ * **提示不因"别处有内容"而被吞掉**)
70
87
  */
71
- export declare function buildTrajectorySkillsSection(root: string, mdPath: string, maxChars?: number): string;
88
+ export declare function buildTrajectorySkillsSection(root: string, mdPath: string, maxChars?: number, cccSkills?: readonly string[]): string;