@wenaixi/dsh-superpower 7.6.0 → 7.7.1

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.
@@ -10,11 +10,11 @@ import { fileURLToPath } from 'node:url';
10
10
  import Schema from '@deepseek-ai/schemastery';
11
11
  import { SkillCatalog } from './catalog.js';
12
12
  import { SkillDocument } from './document.js';
13
- import { applySwitches, readSwitches } from './switches.js';
13
+ import { extractCleanDisabled, extractCleanLanguage, readSwitches, } from './switches.js';
14
14
  // 具名导出深度模块,为验证治理与测试表面提供统一深度接口
15
15
  export { SkillCatalog, EXPECTED_SKILL_COUNT } from './catalog.js';
16
16
  export { SkillDocument } from './document.js';
17
- export { SkillSwitches, applySwitches, readSwitches } from './switches.js';
17
+ export { SkillSwitches, applySwitches, extractCleanDisabled, extractCleanLanguage, extractCleanSwitches, isConfigCorrupted, readSwitches, } from './switches.js';
18
18
  // ---------------------------------------------------------------------------
19
19
  // Config — 默认值写在 schema 里;可选字段用可选属性声明
20
20
  // ---------------------------------------------------------------------------
@@ -28,14 +28,20 @@ export const Config = Schema.object({
28
28
  *
29
29
  * 这是唯一写入目标。面板完成一次写入时会顺手 unset 下面两个已废弃字段,
30
30
  * 所以 profile 里最终只剩这一张表。
31
+ *
32
+ * 容灾自愈:经 Schema.transform 拦截,任何非对象、数字布尔值或脏键均被自动清洗为
33
+ * 纯净合法的 Record<string, boolean>,彻底消除 Cordis Loader 的 invalid config 崩溃。
31
34
  */
32
- disabled: Schema.dict(Schema.boolean()).default({}).volatile(),
35
+ disabled: Schema.transform(Schema.any(), (val) => extractCleanDisabled(val)).default({}).volatile(),
33
36
  /**
34
37
  * 技能正文与描述的显示语言偏好:'zh' 中文(默认)或 'en' 英文。
35
38
  * volatile 字段:面板可经 ConfigForm 通道写入,改后随 loader/volatile-update 事件
36
39
  * 让 Provider 在下轮 list/get 读到新语言。
40
+ *
41
+ * 容灾自愈:经 Schema.transform 拦截,支持从非标区域语言代码(如 'zh-CN', 'en-US')
42
+ * 中自愈归一化,无效输入自动回退为 undefined(跟随宿主)。
37
43
  */
38
- language: Schema.union(['zh', 'en']).required(false).volatile(),
44
+ language: Schema.transform(Schema.any(), (val) => extractCleanLanguage(val)).default(undefined).volatile(),
39
45
  /**
40
46
  * 已废弃的模型侧禁言表,面板不再写入,只在迁移批里被 unset 清空。
41
47
  *
@@ -45,9 +51,9 @@ export const Config = Schema.object({
45
51
  * volatile 节点下,命中不了就抛 `Config field "modelDisabled" is not volatile`
46
52
  * 并让整批 mutate 失败。少一个 volatile,整条迁移批连同主写入一起被拒。
47
53
  */
48
- modelDisabled: Schema.dict(Schema.boolean()).default({}).volatile(),
54
+ modelDisabled: Schema.any().default({}).volatile(),
49
55
  /** 已废弃的用户侧禁言表,理由同 modelDisabled。 */
50
- userDisabled: Schema.dict(Schema.boolean()).default({}).volatile(),
56
+ userDisabled: Schema.any().default({}).volatile(),
51
57
  })
52
58
  // 断言为 Schema<Config>:volatile() 的输出类型来自 schemastery 的传递依赖 cosmokit,
53
59
  // 在 pnpm isolated 布局下它只能经 .pnpm 内部路径引用,tsc 的声明发射拒绝写出这种
@@ -136,23 +142,21 @@ class SuperpowersProvider {
136
142
  }
137
143
  async list(options) {
138
144
  const switches = this.currentSwitches();
139
- const candidates = await this.catalog.listCandidates(this.name, SUPERPOWERS_RANK, {
145
+ return this.catalog.listCandidates(this.name, SUPERPOWERS_RANK, {
140
146
  signal: options.signal,
141
147
  logger: this.ctx.logger,
142
148
  language: switches.language ?? this.hostLanguage(),
149
+ switches,
143
150
  });
144
- return candidates.map((candidate) => applySwitches(candidate, switches));
145
151
  }
146
152
  async get(candidate, options) {
147
153
  const switches = this.currentSwitches();
148
- const definition = await this.catalog.getDefinition(candidate, this.name, {
154
+ return this.catalog.getDefinition(candidate, this.name, {
149
155
  signal: options.signal,
150
156
  logger: this.ctx.logger,
151
157
  language: switches.language ?? this.hostLanguage(),
158
+ switches,
152
159
  });
153
- // 加载路径同样套用:skill 工具在 get 之后二次校验 isModelInvocable,
154
- // 只改 list 的候选会让模型目录消失但工具调用仍成功,语义撕裂。
155
- return definition === undefined ? undefined : applySwitches(definition, switches);
156
160
  }
157
161
  }
158
162
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AASxC,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAsB,MAAM,eAAe,CAAA;AAE/E,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAA4B,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,aAAa,EAAgC,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAwB1E,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IACpD,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;IACzB;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9D;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IAC/D;;;;;;;;OAQG;IACH,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACnE,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CACnE,CAAC;IACA,oEAAoE;IACpE,uDAAuD;IACvD,4DAA4D;IAC5D,sCAAsC;KACrC,WAAW,CAAC,8BAA8B,CAA8B,CAAA;AAe3E,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAA;AACjC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAU,CAAA;AAEzC,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,uCAAuC;AACvC,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAC3B,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAElC,SAAS,wBAAwB,CAAC,YAAoB;IACpD,IAAI,YAAY,KAAK,gBAAgB,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,+BAA+B,gBAAgB,YAAY,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAuB;IACrD,IAAI,cAAc;QAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAA;IAClD,uDAAuD;IACvD,kDAAkD;IAClD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC/C,CAAC;AAED,8EAA8E;AAC9E,6DAA6D;AAC7D,8EAA8E;AAE9E,MAAM,mBAAmB;IACd,IAAI,CAAQ;IACZ,OAAO,CAAc;IACb,GAAG,CAAS;IACZ,OAAO,CAAsB;IAC7B,eAAe,CAAqB;IAC7C,iBAAiB,CAAyB;IAC1C,oBAAoB,GAAG,KAAK,CAAA;IAEpC,YAAY,GAAY,EAAE,OAA6B,EAAE,MAAc;QACrE,wBAAwB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAA;QAC/B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACxD,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAA;QACzC,uCAAuC;QACvC,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,oBAAoB;YAAE,OAAO,IAAI,CAAC,iBAAiB,CAAA;QAC5D,IAAI,MAA+B,CAAA;QACnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;YACtD,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAAsC,EAAE,UAAU,IAAI,EAAE,CAAuC,CAAA;YACtJ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;YACzF,MAAM,UAAU,GAAI,KAAK,EAAE,KAA8C,EAAE,UAAU,CAAA;YACrF,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,SAAS,CAAA;QACpB,CAAC;QACD,qEAAqE;QACrE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAA;QAC/B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;QAChC,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QACzB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;QACzB,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;QAClC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA2B;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE;YAChF,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;SACnD,CAAC,CAAA;QACF,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAyB,EAAE,OAA2B;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE;YACxE,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;SACnD,CAAC,CAAA;QACF,kDAAkD;QAClD,oCAAoC;QACpC,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACnF,CAAC;CACF;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,wBAAwB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAE7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAA;IAE9E,8CAA8C;IAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,IAAI,cAA+C,CAAA;QAEnD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9D,cAAc,GAAG,IAAI,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YAC9D,OAAO,cAAc,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,0CAA0C;QAC1C,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACnD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;YAC/E,cAAc,EAAE,OAAO,CAAC,UAAU,EAAE,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,uCAAuC;QACvC,iDAAiD;QACjD,MAAM,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAC5D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAA;YAC9E,cAAc,EAAE,UAAU,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,yEAAyE;QACzE,yCAAyC;QACzC,yDAAyD;QACzD,oCAAoC;QACpC,MAAM,aAAa,GAAG,GAAG,CAAC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAC1D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAA;YAC7G,cAAc,EAAE,UAAU,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,kCAAkC;YAClC,aAAa,EAAE,CAAA;YACf,eAAe,EAAE,CAAA;YACjB,eAAe,EAAE,CAAA;YACjB,eAAe,EAAE,CAAA;YACjB,cAAc,EAAE,OAAO,CAAC,UAAU,EAAE,CAAA;QACtC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"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"}
package/lib/switches.d.ts CHANGED
@@ -1,25 +1,20 @@
1
1
  /**
2
- * @wenaixi/dsh-superpower — 技能开关状态深度模块
2
+ * @wenaixi/dsh-superpower — 技能开关状态深度模块 (含容灾自愈提取引擎)
3
3
  *
4
4
  * 封装「哪个技能被关闭」的唯一判据:一张以技能名为键的禁言字典。
5
5
  *
6
6
  * 核心设计:
7
- * - Depth: 把 volatile 引用解包与 invocation 覆盖隐藏在两个纯函数之后;
8
- * - Locality: 所有开关语义内聚于此,Provider 只负责调用;
7
+ * - Depth: 把 volatile 引用解包、Invocation 覆盖、容灾提取与脏数据自愈彻底封装在门后;
8
+ * - Locality: 所有开关语义与配置容错自愈逻辑内聚于此,Provider 与客户端共用;
9
9
  * - Test Surface: selfTest() 是接口即测试表面,随 verifySpecification 一并进门禁。
10
10
  *
11
- * 关闭一个技能会让 DSH 的 SkillInvocationPolicy 两个布尔同时为 false:
12
- * modelInvocable 为 false 时模型目录不再列出该技能且 skill 工具调用被拒;
13
- * userInvocable 为 false 时斜杠命令补全与 CLI 清单都不再列出。
14
- * 技能仍保留在注册表中的存在与同名裁决权,与在 SKILL.md 写
15
- * disable-model-invocation / user-invocable 完全等价。
16
- *
17
- * 历史兼容:v7.3.0 及之前分列 modelDisabled 与 userDisabled 两张表,v7.4.0 起
18
- * 统一为 disabled。旧字段仍在 schema 里声明,所以旧 profile 的值能被解析;
19
- * disabled 为空时取两旧字段的并集,让升级前的开关在用户下一次操作前继续生效。
20
- * 用户一旦在面板做任何一次写入,那两个旧字段就被 unset,此后只剩 disabled。
11
+ * 容灾自愈保证:
12
+ * 无论外部输入遭遇何种程度的破坏(非对象、字符串布尔值、脏区域码、原型污染、未知键残留),
13
+ * 本模块均能安全从中抢救提取有效用户意图,绝不抛出异常崩溃。
21
14
  */
22
15
  import type { SkillInvocationPolicy } from '@deepseek-ai/dsh-skill';
16
+ /** 本包所管理的 15 个标准技能名白名单集合。 */
17
+ export declare const KNOWN_SKILLS: Set<string>;
23
18
  /** 以技能名为键的禁言表:键存在且值为 true 表示该技能被关闭。 */
24
19
  export interface SkillSwitches {
25
20
  /** 关闭的技能名集合,映射为 modelInvocable = userInvocable = false。 */
@@ -27,13 +22,38 @@ export interface SkillSwitches {
27
22
  /** 技能描述显示语言偏好:'zh'/'en' 显式固定;undefined 表示跟随宿主界面语言。 */
28
23
  language: 'zh' | 'en' | undefined;
29
24
  }
25
+ /** 容灾提取结果与自愈判定结果。 */
26
+ export interface CleanSwitchesExtraction {
27
+ switches: SkillSwitches;
28
+ isCorrupted: boolean;
29
+ }
30
+ /**
31
+ * 容灾提取并归一化语言偏好设置。
32
+ * 支持从非标语言码(如 'zh-CN', 'zh_CN', 'en-US', 'chinese' 等)中提取标准三态 ('zh' | 'en' | undefined)。
33
+ */
34
+ export declare function extractCleanLanguage(value: unknown): 'zh' | 'en' | undefined;
35
+ /**
36
+ * 容灾清洗并提取禁言字典。
37
+ * 1. 过滤原型污染(__proto__, constructor)与未知非法键;
38
+ * 2. 宽容识别非标真值(true, "true", 1, "1", "yes", "on", "disabled");
39
+ * 3. 忽略假值(false, "false", 0, "no", "off" 等)。
40
+ */
41
+ export declare function extractCleanDisabled(value: unknown): Record<string, boolean>;
42
+ /**
43
+ * 纯函数探测配置是否包含损坏数据、非标格式或需要自愈修复的结构。
44
+ */
45
+ export declare function isConfigCorrupted(config: unknown): boolean;
46
+ /**
47
+ * 容灾提取完整技能开关与语言偏好。
48
+ * 兼容 volatile 引用、普通对象、新旧表回退以及脏数据自愈清洗。
49
+ */
50
+ export declare function extractCleanSwitches(config: unknown): SkillSwitches;
51
+ /**
52
+ * 读取禁言字典与语言偏好(委托容灾自愈提取引擎)。
53
+ */
30
54
  export declare function readSwitches(config: unknown): SkillSwitches;
31
55
  /**
32
56
  * 用禁言表覆盖一个技能条目的 invocation 策略,返回新对象且不修改入参。
33
- *
34
- * @param entry - SkillCandidate 或 SkillDefinition,二者都带 name 与 invocation
35
- * @param switches - 禁言字典
36
- * @returns 覆盖后的新条目;未被禁言的技能原样返回一份浅拷贝
37
57
  */
38
58
  export declare function applySwitches<T extends {
39
59
  name: string;
@@ -44,9 +64,7 @@ export declare function applySwitches<T extends {
44
64
  */
45
65
  export declare const SkillSwitches: {
46
66
  /**
47
- * 执行五条边界契约断言。
48
- *
49
- * @returns 每条用例的成败与失败原因
67
+ * 执行边界契约与容灾自愈断言。
50
68
  */
51
69
  selfTest(): Promise<{
52
70
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"switches.d.ts","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEnE,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,sDAAsD;IACtD,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;CAClC;AA8BD,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAS3D;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,qBAAqB,CAAA;CAAE,EACzF,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,GACtB,CAAC,CAMH;AAcD;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;;OAIG;gBACe,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CA4E3E,CAAA"}
1
+ {"version":3,"file":"switches.d.ts","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEnE,6BAA6B;AAC7B,eAAO,MAAM,YAAY,aAgBvB,CAAA;AAEF,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,sDAAsD;IACtD,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;CAClC;AAED,qBAAqB;AACrB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,aAAa,CAAA;IACvB,WAAW,EAAE,OAAO,CAAA;CACrB;AAYD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAO5E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAqB1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAuBnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAE3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,qBAAqB,CAAA;CAAE,EACzF,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,aAAa,GACtB,CAAC,CAMH;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;OAEG;gBACe,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CA6H3E,CAAA"}
package/lib/switches.js CHANGED
@@ -1,64 +1,142 @@
1
1
  /**
2
- * @wenaixi/dsh-superpower — 技能开关状态深度模块
2
+ * @wenaixi/dsh-superpower — 技能开关状态深度模块 (含容灾自愈提取引擎)
3
3
  *
4
4
  * 封装「哪个技能被关闭」的唯一判据:一张以技能名为键的禁言字典。
5
5
  *
6
6
  * 核心设计:
7
- * - Depth: 把 volatile 引用解包与 invocation 覆盖隐藏在两个纯函数之后;
8
- * - Locality: 所有开关语义内聚于此,Provider 只负责调用;
7
+ * - Depth: 把 volatile 引用解包、Invocation 覆盖、容灾提取与脏数据自愈彻底封装在门后;
8
+ * - Locality: 所有开关语义与配置容错自愈逻辑内聚于此,Provider 与客户端共用;
9
9
  * - Test Surface: selfTest() 是接口即测试表面,随 verifySpecification 一并进门禁。
10
10
  *
11
- * 关闭一个技能会让 DSH 的 SkillInvocationPolicy 两个布尔同时为 false:
12
- * modelInvocable 为 false 时模型目录不再列出该技能且 skill 工具调用被拒;
13
- * userInvocable 为 false 时斜杠命令补全与 CLI 清单都不再列出。
14
- * 技能仍保留在注册表中的存在与同名裁决权,与在 SKILL.md 写
15
- * disable-model-invocation / user-invocable 完全等价。
16
- *
17
- * 历史兼容:v7.3.0 及之前分列 modelDisabled 与 userDisabled 两张表,v7.4.0 起
18
- * 统一为 disabled。旧字段仍在 schema 里声明,所以旧 profile 的值能被解析;
19
- * disabled 为空时取两旧字段的并集,让升级前的开关在用户下一次操作前继续生效。
20
- * 用户一旦在面板做任何一次写入,那两个旧字段就被 unset,此后只剩 disabled。
11
+ * 容灾自愈保证:
12
+ * 无论外部输入遭遇何种程度的破坏(非对象、字符串布尔值、脏区域码、原型污染、未知键残留),
13
+ * 本模块均能安全从中抢救提取有效用户意图,绝不抛出异常崩溃。
21
14
  */
15
+ /** 本包所管理的 15 个标准技能名白名单集合。 */
16
+ export const KNOWN_SKILLS = new Set([
17
+ 'brainstorming',
18
+ 'diagnosing-superpowers',
19
+ 'dispatching-parallel-agents',
20
+ 'executing-plans',
21
+ 'finishing-a-development-branch',
22
+ 'receiving-code-review',
23
+ 'requesting-code-review',
24
+ 'subagent-driven-development',
25
+ 'systematic-debugging',
26
+ 'test-driven-development',
27
+ 'using-git-worktrees',
28
+ 'using-superpowers',
29
+ 'verification-before-completion',
30
+ 'writing-plans',
31
+ 'writing-skills',
32
+ ]);
33
+ /** 解包单值 volatile 字段。 */
34
+ function unwrapValue(value) {
35
+ return typeof value?.get === 'function' ? value.get() : value;
36
+ }
22
37
  /**
23
- * 读取禁言字典,兼容 volatile 引用与普通对象两种形态。
24
- *
25
- * 合并规则:disabled 非空时只认它(用户已经在新表上操作过,旧值即过期);
26
- * disabled 为空时取两张旧表的并集——任一侧曾被关闭的技能都算关闭,
27
- * 这与升级前的效果一致,不会让已关闭的技能重新冒出来。
28
- *
29
- * @param config - 插件配置容器,通常为 apply 收到的 config 对象
30
- * @returns 已解包并浅拷贝的禁言字典;字段缺失或类型不符时为空字典
38
+ * 容灾提取并归一化语言偏好设置。
39
+ * 支持从非标语言码(如 'zh-CN', 'zh_CN', 'en-US', 'chinese' 等)中提取标准三态 ('zh' | 'en' | undefined)。
31
40
  */
32
- function readLanguage(config) {
33
- const source = (config ?? {});
34
- const raw = unwrapValue(source['language']);
35
- if (raw === 'en')
36
- return 'en';
37
- if (raw === 'zh')
41
+ export function extractCleanLanguage(value) {
42
+ const unwrapped = unwrapValue(value);
43
+ if (typeof unwrapped !== 'string')
44
+ return undefined;
45
+ const lower = unwrapped.trim().toLowerCase().replace(/_/g, '-');
46
+ if (lower === 'zh' || lower.startsWith('zh-') || lower === 'chinese')
38
47
  return 'zh';
48
+ if (lower === 'en' || lower.startsWith('en-') || lower === 'english')
49
+ return 'en';
39
50
  return undefined;
40
51
  }
41
- /** 解包单值 volatile 字段。 */
42
- function unwrapValue(value) {
43
- return typeof value?.get === 'function' ? value.get() : value;
52
+ /**
53
+ * 容灾清洗并提取禁言字典。
54
+ * 1. 过滤原型污染(__proto__, constructor)与未知非法键;
55
+ * 2. 宽容识别非标真值(true, "true", 1, "1", "yes", "on", "disabled");
56
+ * 3. 忽略假值(false, "false", 0, "no", "off" 等)。
57
+ */
58
+ export function extractCleanDisabled(value) {
59
+ const unwrapped = unwrapValue(value);
60
+ if (typeof unwrapped !== 'object' || unwrapped === null || Array.isArray(unwrapped)) {
61
+ return Object.create(null);
62
+ }
63
+ const clean = Object.create(null);
64
+ for (const [key, val] of Object.entries(unwrapped)) {
65
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
66
+ continue;
67
+ if (!KNOWN_SKILLS.has(key))
68
+ continue;
69
+ if (val === true ||
70
+ val === 'true' ||
71
+ val === 1 ||
72
+ val === '1' ||
73
+ val === 'yes' ||
74
+ val === 'on' ||
75
+ val === 'disabled') {
76
+ clean[key] = true;
77
+ }
78
+ }
79
+ return clean;
80
+ }
81
+ /**
82
+ * 纯函数探测配置是否包含损坏数据、非标格式或需要自愈修复的结构。
83
+ */
84
+ export function isConfigCorrupted(config) {
85
+ if (config === null || config === undefined)
86
+ return false;
87
+ const source = unwrapValue(config);
88
+ if (typeof source !== 'object' || Array.isArray(source))
89
+ return true;
90
+ const record = source;
91
+ const rawDisabled = unwrapValue(record['disabled']);
92
+ if (rawDisabled !== undefined && rawDisabled !== null) {
93
+ if (typeof rawDisabled !== 'object' || Array.isArray(rawDisabled))
94
+ return true;
95
+ for (const [k, v] of Object.entries(rawDisabled)) {
96
+ if (!KNOWN_SKILLS.has(k))
97
+ return true;
98
+ if (v !== true)
99
+ return true; // 包含非标准布尔值(如字符串或数字),或者包含 false 残留
100
+ }
101
+ }
102
+ const rawLang = unwrapValue(record['language']);
103
+ if (rawLang !== undefined && rawLang !== null && rawLang !== 'zh' && rawLang !== 'en') {
104
+ return true;
105
+ }
106
+ return false;
44
107
  }
108
+ /**
109
+ * 容灾提取完整技能开关与语言偏好。
110
+ * 兼容 volatile 引用、普通对象、新旧表回退以及脏数据自愈清洗。
111
+ */
112
+ export function extractCleanSwitches(config) {
113
+ if (config === null || config === undefined) {
114
+ return { disabled: {}, language: undefined };
115
+ }
116
+ const source = unwrapValue(config);
117
+ if (typeof source !== 'object' || Array.isArray(source)) {
118
+ return { disabled: {}, language: undefined };
119
+ }
120
+ const record = source;
121
+ const disabled = extractCleanDisabled(record['disabled']);
122
+ const language = extractCleanLanguage(record['language']);
123
+ if (Object.keys(disabled).length > 0) {
124
+ return { disabled, language };
125
+ }
126
+ // 新表为空时,容灾扫描旧表并提取并集
127
+ const legacyModel = extractCleanDisabled(record['modelDisabled']);
128
+ const legacyUser = extractCleanDisabled(record['userDisabled']);
129
+ const legacy = { ...legacyModel, ...legacyUser };
130
+ return { disabled: legacy, language };
131
+ }
132
+ /**
133
+ * 读取禁言字典与语言偏好(委托容灾自愈提取引擎)。
134
+ */
45
135
  export function readSwitches(config) {
46
- const source = (config ?? {});
47
- const disabled = unwrapDictionary(source['disabled']);
48
- if (Object.keys(disabled).length > 0)
49
- return { disabled, language: readLanguage(config) };
50
- const legacy = {
51
- ...unwrapDictionary(source['modelDisabled']),
52
- ...unwrapDictionary(source['userDisabled']),
53
- };
54
- return { disabled: legacy, language: readLanguage(config) };
136
+ return extractCleanSwitches(config);
55
137
  }
56
138
  /**
57
139
  * 用禁言表覆盖一个技能条目的 invocation 策略,返回新对象且不修改入参。
58
- *
59
- * @param entry - SkillCandidate 或 SkillDefinition,二者都带 name 与 invocation
60
- * @param switches - 禁言字典
61
- * @returns 覆盖后的新条目;未被禁言的技能原样返回一份浅拷贝
62
140
  */
63
141
  export function applySwitches(entry, switches) {
64
142
  if (switches.disabled[entry.name] !== true)
@@ -68,26 +146,12 @@ export function applySwitches(entry, switches) {
68
146
  invocation: { modelInvocable: false, userInvocable: false },
69
147
  };
70
148
  }
71
- /**
72
- * 解包一个可能是 volatile 引用、可能是普通对象的字典字段。
73
- *
74
- * @param value - 字段原始值
75
- * @returns 普通对象字典;非对象或缺省时为空字典
76
- */
77
- function unwrapDictionary(value) {
78
- const unwrapped = unwrapValue(value);
79
- if (typeof unwrapped !== 'object' || unwrapped === null || Array.isArray(unwrapped))
80
- return {};
81
- return { ...unwrapped };
82
- }
83
149
  /**
84
150
  * 开关语义自检:随 SkillCatalog.verifySpecification 一并进入质量门禁。
85
151
  */
86
152
  export const SkillSwitches = {
87
153
  /**
88
- * 执行五条边界契约断言。
89
- *
90
- * @returns 每条用例的成败与失败原因
154
+ * 执行边界契约与容灾自愈断言。
91
155
  */
92
156
  async selfTest() {
93
157
  const results = [];
@@ -127,11 +191,11 @@ export const SkillSwitches = {
127
191
  });
128
192
  await run('新表非空时忽略旧表', () => {
129
193
  const out = readSwitches({
130
- disabled: { 'switch-test': true },
131
- modelDisabled: { other: true },
132
- userDisabled: { 'third': true },
194
+ disabled: { 'brainstorming': true },
195
+ modelDisabled: { 'systematic-debugging': true },
196
+ userDisabled: { 'writing-plans': true },
133
197
  });
134
- if (Object.keys(out.disabled).length !== 1 || out.disabled['switch-test'] !== true) {
198
+ if (Object.keys(out.disabled).length !== 1 || out.disabled['brainstorming'] !== true) {
135
199
  throw new Error('disabled 非空却仍读到了旧表的键');
136
200
  }
137
201
  });
@@ -146,21 +210,81 @@ export const SkillSwitches = {
146
210
  throw new Error('language 未读取为 en');
147
211
  });
148
212
  await run('language 不影响禁言表', () => {
149
- const out = readSwitches({ language: 'en', disabled: { a: true } });
213
+ const out = readSwitches({ language: 'en', disabled: { 'brainstorming': true } });
150
214
  if (Object.keys(out.disabled).length !== 1)
151
215
  throw new Error('language 读取影响禁言表');
152
216
  });
153
217
  await run('新表为空时并入两张旧表', () => {
154
218
  const out = readSwitches({
155
219
  disabled: {},
156
- modelDisabled: { a: true },
157
- userDisabled: { b: true, c: true },
220
+ modelDisabled: { 'brainstorming': true },
221
+ userDisabled: { 'writing-plans': true, 'systematic-debugging': true },
158
222
  });
159
223
  const keys = Object.keys(out.disabled).sort();
160
- if (keys.length !== 3 || keys.join(',') !== 'a,b,c') {
224
+ if (keys.length !== 3 || keys.join(',') !== 'brainstorming,systematic-debugging,writing-plans') {
161
225
  throw new Error('旧表并集不完整,实际 ' + keys.join(','));
162
226
  }
163
227
  });
228
+ // -----------------------------------------------------------------------
229
+ // 容灾自愈提取与损坏感知断言
230
+ // -----------------------------------------------------------------------
231
+ await run('容灾自愈:非标布尔值与脏数据精准提取', () => {
232
+ const out = readSwitches({
233
+ disabled: {
234
+ 'brainstorming': 'true',
235
+ 'writing-plans': 1,
236
+ 'executing-plans': 'yes',
237
+ 'systematic-debugging': false,
238
+ 'unknown-skill': true, // 未知键过滤
239
+ },
240
+ });
241
+ if (out.disabled['brainstorming'] !== true)
242
+ throw new Error('未能从字符串 "true" 提取布尔');
243
+ if (out.disabled['writing-plans'] !== true)
244
+ throw new Error('未能从数字 1 提取布尔');
245
+ if (out.disabled['executing-plans'] !== true)
246
+ throw new Error('未能从 "yes" 提取布尔');
247
+ if (out.disabled['systematic-debugging'])
248
+ throw new Error('假值被误判为禁用');
249
+ if (out.disabled['unknown-skill'])
250
+ throw new Error('未知技能名未被过滤');
251
+ });
252
+ await run('容灾自愈:非标区域语言代码归一化', () => {
253
+ if (extractCleanLanguage('zh-CN') !== 'zh')
254
+ throw new Error('zh-CN 未归一化为 zh');
255
+ if (extractCleanLanguage('zh_Hans') !== 'zh')
256
+ throw new Error('zh_Hans 未归一化为 zh');
257
+ if (extractCleanLanguage('en-US') !== 'en')
258
+ throw new Error('en-US 未归一化为 en');
259
+ if (extractCleanLanguage('english') !== 'en')
260
+ throw new Error('english 未归一化为 en');
261
+ if (extractCleanLanguage('invalid-language') !== undefined)
262
+ throw new Error('非法语言未回退至 undefined');
263
+ });
264
+ await run('容灾自愈:原型污染与非对象极值绝对防御', () => {
265
+ const fromString = readSwitches('corrupted-non-object-string');
266
+ if (Object.keys(fromString.disabled).length !== 0)
267
+ throw new Error('字符串输入未安全回退');
268
+ const polluted = JSON.parse('{"disabled": {"__proto__": {"polluted": true}, "brainstorming": true}}');
269
+ const clean = extractCleanDisabled(polluted.disabled);
270
+ if (Object.prototype.hasOwnProperty.call(Object.prototype, 'polluted')) {
271
+ throw new Error('发生原型污染');
272
+ }
273
+ if (clean['brainstorming'] !== true)
274
+ throw new Error('合法技能丢失');
275
+ });
276
+ await run('损坏感知:精准判定配置是否需要自愈', () => {
277
+ if (isConfigCorrupted({ disabled: {}, language: 'zh' }) !== false)
278
+ throw new Error('干净配置被误判为损坏');
279
+ if (isConfigCorrupted({ disabled: 'bad' }) !== true)
280
+ throw new Error('字符串 disabled 未被标记为损坏');
281
+ if (isConfigCorrupted({ language: 'zh-CN' }) !== true)
282
+ throw new Error('非标语言未被标记为损坏');
283
+ if (isConfigCorrupted({ disabled: { 'unknown-bad-skill': true } }) !== true)
284
+ throw new Error('未知脏键未被标记为损坏');
285
+ if (isConfigCorrupted({ disabled: { 'brainstorming': 'true' } }) !== true)
286
+ throw new Error('非标布尔值未被标记为损坏');
287
+ });
164
288
  return results;
165
289
  },
166
290
  };
@@ -1 +1 @@
1
- {"version":3,"file":"switches.js","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAiBH;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,MAAe;IACnC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAA;IACxD,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;IAC3C,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC7B,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,wBAAwB;AACxB,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAQ,KAAmC,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC,CAAE,KAAuB,CAAC,GAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AAClH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAA;IACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;IACrD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAA;IACzF,MAAM,MAAM,GAAG;QACb,GAAG,gBAAgB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC5C,GAAG,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KAC5C,CAAA;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAQ,EACR,QAAuB;IAEvB,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;IAC/D,OAAO;QACL,GAAG,KAAK;QACR,UAAU,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;KAC5D,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAc;IACtC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACpC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAA;IAC9F,OAAO,EAAE,GAAI,SAAqC,EAAE,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;;;;OAIG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAoD,EAAE,CAAA;QACnE,MAAM,GAAG,GAAG,KAAK,EAAE,IAAY,EAAE,EAA8B,EAAE,EAAE;YACjE,IAAI,CAAC;gBACH,MAAM,EAAE,EAAE,CAAA;gBACV,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;YAClC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAClF,CAAC;QACH,CAAC,CAAA;QAED,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC;YACnB,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;SAC1D,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC/B,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;YACxB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1F,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,KAAK,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;YACnF,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,KAAK,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACjF,IAAI,QAAQ,CAAC,UAAU,CAAC,cAAc,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;QAC7E,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE;YACzB,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YACpE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE;YAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YACzF,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,WAAW,EAAE,GAAG,EAAE;YAC1B,MAAM,GAAG,GAAG,YAAY,CAAC;gBACvB,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;gBACjC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC9B,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;aAChC,CAAC,CAAA;YACF,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnF,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACzC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACtC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;YAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QACtF,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,mBAAmB,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAChC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;YACnE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;QAEF,MAAM,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE;YAC5B,MAAM,GAAG,GAAG,YAAY,CAAC;gBACvB,QAAQ,EAAE,EAAE;gBACZ,aAAa,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE;gBAC1B,YAAY,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE;aACnC,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;YAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YACjD,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"switches.js","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wenaixi/dsh-superpower",
3
- "version": "7.6.0",
3
+ "version": "7.7.1",
4
4
  "description": "DeepSeek Harness plugin: 15 obra/superpowers engineering skills, bilingual descriptions, per-skill toggles | DeepSeek Harness 插件:15 个 obra/superpowers 工程纪律技能,技能描述中英双语自由切换,每一个技能本身自由开关",
5
5
  "type": "module",
6
6
  "main": "lib/superpowers.js",
@@ -21,10 +21,11 @@
21
21
  "scripts": {
22
22
  "build": "tsc -p tsconfig.build.json && node scripts/build-client.mjs",
23
23
  "typecheck": "tsc --noEmit",
24
+ "test": "node --test scripts/*.test.mjs",
24
25
  "lint": "eslint src --ext .ts 2>&1 || echo \"(no eslint config — skipped)\"",
25
26
  "prepare": "npm run build",
26
27
  "prepack": "npm run build",
27
- "verify": "node scripts/verify.mjs && node scripts/check-skill-switches.mjs"
28
+ "verify": "pnpm test && node scripts/verify.mjs && node scripts/check-skill-switches.mjs"
28
29
  },
29
30
  "dsh": {
30
31
  "bundle": {