@wenaixi/dsh-superpower 7.1.1 → 7.2.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.
- package/README.md +117 -57
- package/icon.png +0 -0
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +4 -2
- package/lib/catalog.js.map +1 -1
- package/lib/client.js +350 -0
- package/lib/superpowers.d.ts +16 -23
- package/lib/superpowers.d.ts.map +1 -1
- package/lib/superpowers.js +41 -4
- package/lib/superpowers.js.map +1 -1
- package/lib/switches.d.ts +58 -0
- package/lib/switches.d.ts.map +1 -0
- package/lib/switches.js +118 -0
- package/lib/switches.js.map +1 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +37 -10
- package/skills/using-superpowers/SKILL.md +9 -0
package/README.md
CHANGED
|
@@ -4,24 +4,19 @@
|
|
|
4
4
|
[](./LICENSE)
|
|
5
5
|
[](https://github.com/deepseek-ai/deepseek-harness)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
<img src="./icon.png" alt="@wenaixi/dsh-superpower" width="128" height="128">
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
[obra/superpowers](https://github.com/obra/superpowers) 的 DSH 移植版。15 个技能注入 `ctx.skills`,装上就能用,正文全中文。
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## 安装
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
>
|
|
15
|
-
> pnpm 版本说明:DSH 官方设计面向 pnpm 11+(`nodeLinker: isolated` 符号链接隔离 +
|
|
16
|
-
> `allowBuilds` 构建审批)。pnpm 10.x 在规模较大的 profile 上处理依赖图时会触发
|
|
17
|
-
> `FATAL ERROR: invalid array length` 而崩溃(与机器内存无关,8 GB 堆仍崩),
|
|
18
|
-
> 遇到该报错请先升级 pnpm。
|
|
13
|
+
需要 Node 20 以上、pnpm 11 以上,以及 dsh 本体(`npm i -g @deepseek-ai/dsh`)。下面以 `web` profile 为例,换个 profile 名字即可。
|
|
19
14
|
|
|
20
15
|
```bash
|
|
21
|
-
# A — npm
|
|
16
|
+
# A — npm(推荐,自动装最新)
|
|
22
17
|
dsh plugin --profile web add @wenaixi/dsh-superpower
|
|
23
18
|
|
|
24
|
-
# B — GitHub
|
|
19
|
+
# B — GitHub 直装(绕过镜像延迟)
|
|
25
20
|
dsh plugin --profile web add github:Wenaixi/dsh-superpower
|
|
26
21
|
|
|
27
22
|
# 验证
|
|
@@ -31,112 +26,177 @@ dsh --profile web --dump-config | grep -A2 "@wenaixi/dsh-superpower"
|
|
|
31
26
|
dsh --profile web # 进会话,技能自动可用
|
|
32
27
|
```
|
|
33
28
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
要锁版本就在包名后加 `@<version>`(`@wenaixi/dsh-superpower@7.2.0`)或 `#v7.2.0`。
|
|
30
|
+
|
|
31
|
+
旧包名 `dsh-superpower`(不带 scope)已经废弃并 `npm deprecate`,请换成带 scope 的。
|
|
37
32
|
|
|
38
|
-
|
|
33
|
+
本地开发或离线安装:
|
|
39
34
|
|
|
40
35
|
```bash
|
|
41
36
|
git clone https://github.com/Wenaixi/dsh-superpower.git && cd dsh-superpower
|
|
42
37
|
pnpm install && pnpm build && node scripts/verify.mjs # 15/15 PASS
|
|
43
38
|
dsh plugin --profile web add ./ # 本地路径安装
|
|
44
|
-
pnpm pack && dsh plugin --profile web add ./wenaixi-dsh-superpower-*.tgz
|
|
39
|
+
pnpm pack && dsh plugin --profile web add ./wenaixi-dsh-superpower-*.tgz
|
|
45
40
|
|
|
46
|
-
# 更新 /
|
|
41
|
+
# 更新 / 卸载
|
|
47
42
|
dsh plugin --profile web add @wenaixi/dsh-superpower
|
|
48
43
|
dsh plugin --profile web remove @wenaixi/dsh-superpower
|
|
49
44
|
```
|
|
50
45
|
|
|
51
46
|
## 是什么
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
一套强制的工程方法论,模型不按顺序走就会做错:先设计,再把计划切成可校验的小步,然后测试驱动,调试时先找根因,收尾前必须跑验证命令。装在 `dsh.bundle` 里,不往用户目录里写东西,卸载干净,HMR 会自动重建。
|
|
54
49
|
|
|
55
50
|
## 包含技能
|
|
56
51
|
|
|
57
|
-
| 技能 |
|
|
52
|
+
| 技能 | 什么时候用 |
|
|
58
53
|
|---|---|
|
|
59
|
-
| `using-superpowers` |
|
|
60
|
-
| `brainstorming` |
|
|
61
|
-
| `writing-plans` |
|
|
62
|
-
| `using-git-worktrees` |
|
|
63
|
-
| `executing-plans`
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
70
|
-
| `
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
| `using-superpowers` | 每次会话开头,先查有没有该用的技能 |
|
|
55
|
+
| `brainstorming` | 新功能动手前,把需求和设计问清楚 |
|
|
56
|
+
| `writing-plans` | 设计定了,拆成一项一项能验证的任务 |
|
|
57
|
+
| `using-git-worktrees` | 需要和当前工作区隔离 |
|
|
58
|
+
| `executing-plans` | 在当前会话里亲自把计划跑完 |
|
|
59
|
+
| `subagent-driven-development` | 计划里有多件独立的事,交给 subagent 分头做 |
|
|
60
|
+
| `dispatching-parallel-agents` | 两件以上互不依赖的事并行分发 |
|
|
61
|
+
| `test-driven-development` | 先写测试再写实现 |
|
|
62
|
+
| `systematic-debugging` | 出了 bug,先定位根因再改 |
|
|
63
|
+
| `verification-before-completion` | 说「完成」之前必须跑验证命令 |
|
|
64
|
+
| `requesting-code-review` | 任务做完、发 PR 前求评审 |
|
|
65
|
+
| `receiving-code-review` | 收到评审意见,先技术核实再改 |
|
|
66
|
+
| `diagnosing-superpowers` | 会话出问题或成本异常时定位原因 |
|
|
67
|
+
| `finishing-a-development-branch` | 决定合并、发 PR 还是留着分支 |
|
|
68
|
+
| `writing-skills` | 新建或改技能 |
|
|
69
|
+
|
|
70
|
+
工具映射(`Bash` 到 `pwsh`、`Read/Write` 到 `fs` 等)在 `skills/using-superpowers/references/dsh-tools.md`。
|
|
71
|
+
|
|
72
|
+
### 同名技能谁生效
|
|
73
|
+
|
|
74
|
+
官方注册表在同层重名时按 `rank` 从小到大裁决。本包 rank 是 10,比 `dsh-skill-filesystem` 的项目级和用户级(100–500)以及官方内置 bundled(600)都小,所以只要有同名技能,本包这份生效,不会有两套规则打架。
|
|
75
|
+
|
|
76
|
+
## 技能开关
|
|
77
|
+
|
|
78
|
+
插件管理页里点开 `@wenaixi/dsh-superpower` 卡片,详情页底部就是开关面板。每个技能两个开关:
|
|
79
|
+
|
|
80
|
+
| 开关 | 关掉之后 |
|
|
81
|
+
|---|---|
|
|
82
|
+
| 模型可调用 | 技能不再出现在模型的可用技能目录里,`skill` 工具调用也会被拒 |
|
|
83
|
+
| 用户可调用 | 技能不再出现在斜杠命令补全和命令行技能清单里 |
|
|
84
|
+
|
|
85
|
+
面板上方还有全部开启、全部关闭、恢复默认三个批量操作和一个搜索框。三个批量按钮都同时作用于两侧,所以「全部关闭」会让这 15 个技能既不被模型看到,你也没法手动调用。
|
|
86
|
+
|
|
87
|
+
页头标着本包的 `provider`、`rank`、`source`,排查同名覆盖时用得上。
|
|
88
|
+
|
|
89
|
+
- 拨动后立即生效,模型的下一轮对话就能看到新目录;当前这一轮不受影响。
|
|
90
|
+
- 状态写在 profile 的 `cordis.patch.yml` 里,跟着 profile 一起备份迁移,重装插件不丢。
|
|
91
|
+
- 只影响本包这 15 个技能,不碰官方和第三方插件提供的技能。
|
|
75
92
|
|
|
76
93
|
## 使用
|
|
77
94
|
|
|
78
95
|
```
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
96
|
+
「帮我做 XXX」 → brainstorming → writing-plans → subagent-driven-development
|
|
97
|
+
「修这个缺陷」 → systematic-debugging
|
|
98
|
+
「帮我评审」 → requesting-code-review
|
|
99
|
+
「刚才会话出问题了」 → diagnosing-superpowers
|
|
83
100
|
```
|
|
84
101
|
|
|
85
|
-
校验:`await ctx.skills.list({cwd})`
|
|
102
|
+
校验:`await ctx.skills.list({cwd})` 应该返回 15 条 `provider: superpowers`。
|
|
86
103
|
|
|
87
104
|
## 开发
|
|
88
105
|
|
|
89
106
|
```bash
|
|
90
107
|
pnpm install && pnpm build && pnpm typecheck && node scripts/verify.mjs
|
|
91
108
|
|
|
92
|
-
#
|
|
109
|
+
# 同名优先实测一:自研桩对照,无外部依赖,任何环境可跑
|
|
93
110
|
node scripts/check-same-name-priority.mjs
|
|
94
111
|
|
|
95
112
|
# 同名优先实测二:加载官方 @deepseek-ai/dsh-skill-filesystem 做同层实测
|
|
96
113
|
# 该包不在 profile 的直接依赖里,脚本会依次尝试 profile 入口、pnpm store
|
|
97
114
|
# 内 .pnpm 真实目录、全局 dsh 本体三处候选路径。
|
|
98
|
-
#
|
|
115
|
+
# 本机没装 dsh(比如纯 CI)就用上面的自研桩脚本做等价验证。
|
|
99
116
|
node scripts/check-same-name-priority-fs.mjs
|
|
100
117
|
|
|
118
|
+
# 技能开关端到端实测:真实 SkillRegistry 上验证默认全开、禁言生效、热失效闭环
|
|
119
|
+
node scripts/check-skill-switches.mjs
|
|
120
|
+
|
|
101
121
|
# 上游同步全量复核(deep + tokens 双绿)
|
|
102
122
|
node scripts/review-sync.mjs
|
|
103
123
|
|
|
104
124
|
dsh --profile web --dump-config # 断言 "# == @wenaixi/dsh-superpower"
|
|
105
125
|
```
|
|
106
126
|
|
|
127
|
+
### 浏览器端验证
|
|
128
|
+
|
|
129
|
+
可选,需要本机装好 dsh 和 Python 的 playwright。两个脚本只做验证,地址和路径都从命令行传:
|
|
130
|
+
|
|
131
|
+
| 脚本 | 验什么 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| `scripts/browser/verify-switch-ui.py` | 真机 Web UI 里点开插件卡片,逐个拨开关、点批量按钮、搜索过滤,再回读 `cordis.patch.yml` 确认落盘 |
|
|
134
|
+
| `scripts/browser/verify-model-perception.py` | 四阶段闭环:UI 写完用宿主真实 `SkillRegistry` 复核两侧可见性,并逐行比对 UI 显示与宿主目录 |
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# 1. 起一个装了本插件的 profile 的 Web 服务,记下启动日志里的 token
|
|
138
|
+
dsh --profile <profile> --no-open --port 3199
|
|
139
|
+
|
|
140
|
+
# 2. 面板全量操作
|
|
141
|
+
python scripts/browser/verify-switch-ui.py \
|
|
142
|
+
http://127.0.0.1:3199 <token> .verify-shots <profile>/cordis.patch.yml .verify-shots/expected.json
|
|
143
|
+
|
|
144
|
+
# 3. UI 与宿主的四阶段闭环
|
|
145
|
+
python scripts/browser/verify-model-perception.py \
|
|
146
|
+
http://127.0.0.1:3199 <token> <profile 目录> <profile>/cordis.patch.yml .verify-shots
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
`expected.json` 是 15 个技能名的数组,用来断言 UI 行序和 `skills/` 目录一致:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
node -e "import('./lib/superpowers.js').then(async m=>{const c=await m.SkillCatalog.fromDirectory('skills');require('fs').writeFileSync('expected.json',JSON.stringify(c.verifyIntegrity().entries.map(e=>e.document.name)))})"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
截图落在 `.verify-shots/`,已在 `.gitignore` 里。
|
|
156
|
+
|
|
107
157
|
## 目录
|
|
108
158
|
|
|
109
159
|
```
|
|
110
|
-
src/superpowers.ts #
|
|
160
|
+
src/superpowers.ts # 插件入口,SkillProvider rank 10
|
|
111
161
|
src/catalog.ts # SkillCatalog:技能编目、mtime 探测、快照复用、规范自检
|
|
112
162
|
src/document.ts # SkillDocument:frontmatter 解析、契约转换、内建 selfTest
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
163
|
+
src/switches.ts # 技能开关:禁言表解包与 invocation 覆盖,内建 selfTest
|
|
164
|
+
src/client.js # 浏览器半侧:插件卡片详情页的技能开关面板,手写 CJS factory
|
|
165
|
+
skills/ # 15 个技能正文与资源
|
|
166
|
+
lib/ # 已提交的构建产物,GitHub 直装免构建
|
|
167
|
+
locale/ # 插件卡片的标题与描述(中英)
|
|
168
|
+
icon.png # 插件卡片、README 顶部、GitHub 头像共用
|
|
169
|
+
scripts/ # 门禁、同名裁决实测、开关实测、上游同步复核、浏览器验证
|
|
170
|
+
scripts/build-client.mjs # 复制客户端产物前校验内联清单与 skills/ 目录一致
|
|
116
171
|
```
|
|
117
172
|
|
|
118
|
-
|
|
173
|
+
## 版本沿革
|
|
174
|
+
|
|
175
|
+
`v7.0.0` 起技能名回归上游命名(去掉 `superpower-` 前缀)并整批同步上游 `obra/superpowers v6.4.2`;插件变成 DSH 专属,移除了 Claude Code、Codex、Gemini CLI 等其它宿主的兼容层。npm 上的 `7.0.0` 发布在专属化改造之前,已废弃。
|
|
119
176
|
|
|
120
|
-
`v7.1.0`
|
|
121
|
-
|
|
122
|
-
`
|
|
123
|
-
|
|
124
|
-
`v7.
|
|
125
|
-
|
|
177
|
+
`v7.1.0` 提炼 `SkillCatalog` 与 `SkillDocument` 两个深度模块,把边界自检下沉进模块自身。
|
|
178
|
+
|
|
179
|
+
`v7.1.1` 修复官方 filesystem 同名实测脚本在 pnpm isolated 布局下定位不到 `@deepseek-ai/dsh-skill-filesystem` 的问题。
|
|
180
|
+
|
|
181
|
+
`v7.2.0` 加入技能开关面板,插件升级为双面形态(宿主侧注册技能,浏览器侧渲染开关面板),并补上图标与插件卡片元数据。
|
|
182
|
+
|
|
183
|
+
完整变更见 [CHANGELOG.md](./CHANGELOG.md)。
|
|
126
184
|
|
|
127
185
|
## 常见问题
|
|
128
186
|
|
|
129
|
-
404
|
|
187
|
+
**装完 404 或者版本不对?** 换 GitHub 形式安装,或者加 `--registry https://registry.npmjs.org` 走官方源。不需要配置白名单。查最新版本用 `npm view @wenaixi/dsh-superpower --registry https://registry.npmjs.org`。
|
|
188
|
+
|
|
189
|
+
**卡片标题、描述或图标是空的?** 根因通常是 `package.json` 的 `exports` 没放行 `./package.json` 和 `./locale/*.json`,或者 `icon` 指向了包外的绝对路径。`node scripts/verify.mjs` 会把这两类问题连同 `files` 是否放行图标一起断言掉。
|
|
130
190
|
|
|
131
191
|
## 协议
|
|
132
192
|
|
|
133
|
-
MIT,与上游 [obra/superpowers](https://github.com/obra/superpowers)
|
|
193
|
+
MIT,与上游 [obra/superpowers](https://github.com/obra/superpowers) 一致。详见 [LICENSE](./LICENSE)。
|
|
134
194
|
|
|
135
195
|
## 贡献
|
|
136
196
|
|
|
137
|
-
|
|
197
|
+
Issue 和 PR 都欢迎。详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
138
198
|
|
|
139
199
|
## 致谢
|
|
140
200
|
|
|
141
201
|
- 上游作者 [Jesse Vincent](https://blog.fsck.com) 与 [Prime Radiant](https://primeradiant.com)
|
|
142
|
-
- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)
|
|
202
|
+
- [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的三角色插件架构
|
package/icon.png
ADDED
|
Binary file
|
package/lib/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAG3E,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,uBAAuB,EAAE,CAAA;IAClC,EAAE,EAAE,OAAO,CAAA;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,EAAE,EAAE,OAAO,CAAA;CACZ;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwC;IAGnE,OAAO,CAAC,gBAAgB,CAAyC;IACjE,OAAO,CAAC,kBAAkB,CAAI;IAC9B,OAAO,CAAC,oBAAoB,CAAC,CAAQ;IACrC,OAAO,CAAC,YAAY,CAAC,CAAQ;gBAEjB,QAAQ,EAAE,MAAM;IAI5B;;OAEG;WACU,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnG;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2FzD;;;OAGG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAwB5H;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IA2C1I;;OAEG;WACU,QAAQ,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAwC3D;;OAEG;WACU,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAkBhE;;OAEG;IACH,eAAe,IAAI,sBAAsB;CAY1C"}
|
package/lib/catalog.js
CHANGED
|
@@ -12,6 +12,7 @@ import { mkdtemp, mkdir, readdir, rm, stat, writeFile } from 'node:fs/promises';
|
|
|
12
12
|
import { tmpdir } from 'node:os';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
import { SkillDocument } from './document.js';
|
|
15
|
+
import { SkillSwitches } from './switches.js';
|
|
15
16
|
export class SkillCatalog {
|
|
16
17
|
skillDir;
|
|
17
18
|
entriesByName = new Map();
|
|
@@ -261,11 +262,12 @@ export class SkillCatalog {
|
|
|
261
262
|
* 执行完整的核心规范测试套件,返回聚合体检报告(测试表面即接口)。
|
|
262
263
|
*/
|
|
263
264
|
static async verifySpecification() {
|
|
264
|
-
const [docResults, catResults] = await Promise.all([
|
|
265
|
+
const [docResults, catResults, switchResults] = await Promise.all([
|
|
265
266
|
SkillDocument.selfTest(),
|
|
266
267
|
SkillCatalog.selfTest(),
|
|
268
|
+
SkillSwitches.selfTest(),
|
|
267
269
|
]);
|
|
268
|
-
const results = [...docResults, ...catResults];
|
|
270
|
+
const results = [...docResults, ...catResults, ...switchResults];
|
|
269
271
|
const passed = results.filter((r) => r.ok).length;
|
|
270
272
|
const failed = results.length - passed;
|
|
271
273
|
return {
|
package/lib/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAgC,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @wenaixi/dsh-superpower — 浏览器半侧:技能开关面板
|
|
3
|
+
*
|
|
4
|
+
* 本文件是手写的 CJS factory 源,由 scripts/build-client.mjs 原样复制到 lib/client.js。
|
|
5
|
+
* 不经 tsc 编译:DSH 客户端要求工厂形态的同步导出,tsc 无法产出;且一旦存在两个产物
|
|
6
|
+
* 来源,两份产物必然漂移,且漂移时机取决于构建顺序。
|
|
7
|
+
*
|
|
8
|
+
* 面板落在插件管理页中本包卡片的详情页(plugins.bundle.config 插槽,key 为包名)。
|
|
9
|
+
* 开关状态经官方 configForms 通道读写:ctx.configForms.get('superpowers') 返回的
|
|
10
|
+
* ConfigForm 与本包 Config 的 volatile 字段一一对应,mutate 落盘到 profile 的
|
|
11
|
+
* cordis.patch.yml,热生效且带乐观并发栅栏。
|
|
12
|
+
*
|
|
13
|
+
* 注意:bundle 详情页渲染本插槽时不传 owner 的 form 属性,只有 row/item 页才传。
|
|
14
|
+
* 因此这里绝不读 props.form,一律走 inject 面自取的 ConfigForm。
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
window.__ModuleLoader__.load({
|
|
18
|
+
id: '@wenaixi/dsh-superpower',
|
|
19
|
+
factory: (require) => {
|
|
20
|
+
var module = { exports: {} };
|
|
21
|
+
var exports = module.exports;
|
|
22
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
23
|
+
|
|
24
|
+
var React = require('react');
|
|
25
|
+
var h = React.createElement;
|
|
26
|
+
var P = require('@deepseek-ai/dsh-client-ui-primitives');
|
|
27
|
+
|
|
28
|
+
// 宿主条目 id,同时也是 settings 命名空间键;与 cordis.patch.yml 的 id 逐字相同
|
|
29
|
+
var SETTINGS_NAMESPACE = 'superpowers';
|
|
30
|
+
var PACKAGE_NAME = '@wenaixi/dsh-superpower';
|
|
31
|
+
var PROVIDER_NAME = 'superpowers';
|
|
32
|
+
var PROVIDER_RANK = 10;
|
|
33
|
+
var SKILL_SOURCE = 'bundled';
|
|
34
|
+
var NS = 'dsh-superpower';
|
|
35
|
+
var MODEL_FIELD = 'modelDisabled';
|
|
36
|
+
var USER_FIELD = 'userDisabled';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 面板渲染所需的技能清单,按 skills/ 目录名升序。
|
|
40
|
+
*
|
|
41
|
+
* 浏览器读不到 skills/ 目录,只能内联;scripts/lib/client-manifest.mjs 在构建期
|
|
42
|
+
* 逐项比对本清单与磁盘编目,任何漂移都会让构建失败。
|
|
43
|
+
*/
|
|
44
|
+
const SKILL_CATALOG = [
|
|
45
|
+
{ name: 'brainstorming', description: 'Superpower Skill:创意工作前必用——创建功能、构建组件、新增能力或变更行为前,先澄清用户意图、需求与设计,再进入实现。' },
|
|
46
|
+
{ name: 'diagnosing-superpowers', description: 'Superpower Skill:当 superpowers 会话出错、human partner 想查原因(重复工作、忽略计划、技能未触发、耗时过长、成本过高、结果不佳)或想为维护者建缺陷报告时,适用当前或历史会话。' },
|
|
47
|
+
{ name: 'dispatching-parallel-agents', description: 'Superpower Skill:面向 2 个以上无共享状态、无前后依赖的独立任务,并行委派多个 subagent 协同处理的高效分发模式。' },
|
|
48
|
+
{ name: 'executing-plans', description: 'Superpower Skill:当你在本会话中亲自作为实现者执行实施计划时使用——human partner 选择了内联执行,或环境不提供 subagent 工具。' },
|
|
49
|
+
{ name: 'finishing-a-development-branch', description: 'Superpower Skill:实现完成且全部测试通过后,用于决定分支集成方式,支持本地合并、创建 PR 或保留分支等完整收尾流程。' },
|
|
50
|
+
{ name: 'receiving-code-review', description: 'Superpower Skill:收到代码评审意见时使用,实施建议前需技术验证与澄清,适用于反馈模糊或存疑场景,强调严谨核实而非盲从。' },
|
|
51
|
+
{ name: 'requesting-code-review', description: 'Superpower Skill:在任务完成、重大功能实现或准备合并到主分支时发起,用于校验实现是否符合需求与质量标准,建议定期执行。' },
|
|
52
|
+
{ name: 'subagent-driven-development', description: 'Superpower Skill:在当前会话内执行包含独立任务的实现计划时使用,基于 subagent 分发与逐任务评审保障质量。' },
|
|
53
|
+
{ name: 'systematic-debugging', description: 'Superpower Skill:遇到缺陷、测试失败或异常行为时使用,要求先完成根因分析再提出修复,确保系统化调试。' },
|
|
54
|
+
{ name: 'test-driven-development', description: 'Superpower Skill:实现新功能或修复缺陷时,编写实现代码前先写测试的测试驱动开发完整指南与流程约束规范。' },
|
|
55
|
+
{ name: 'using-git-worktrees', description: 'Superpower Skill:适用于需与当前 worktree 隔离的功能开发或执行实现计划前,通过原生工具优先、git worktree 兜底的方式确保独立 worktree 就绪。' },
|
|
56
|
+
{ name: 'using-superpowers', description: 'Superpower Skill:适用于任何对话开始前,建立技能查找与调用规范,要求在任何回复前优先调用相关技能,包括澄清问题。' },
|
|
57
|
+
{ name: 'verification-before-completion', description: 'Superpower Skill:在声称完成、修复或通过前强制执行校验,用于提交或创建 PR 前必须运行验证命令并确认输出,始终以证据为准而非断言。' },
|
|
58
|
+
{ name: 'writing-plans', description: 'Superpower Skill:当已具备清晰的需求规格或多步骤 task description 且尚未开始编码时使用,用于把需求拆解为结构清晰、粒度可控、可直接执行、可测试与可验证的完整实施计划。' },
|
|
59
|
+
{ name: 'writing-skills', description: 'Superpower Skill:在创建新技能、编辑或重构现有技能,以及在部署前验证技能可用性、合规性与实际生效情况时使用。' },
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
var zh = {
|
|
63
|
+
title: '技能开关',
|
|
64
|
+
intro: '逐个控制本包 15 个技能对模型与对人类是否可见。关闭后立即生效,当前进行中的这一轮不受影响。',
|
|
65
|
+
modelInvocable: '模型可调用',
|
|
66
|
+
userInvocable: '用户可调用',
|
|
67
|
+
modelHint: '关闭后该技能不再出现在模型可用技能目录中,skill 工具调用也会被拒绝',
|
|
68
|
+
userHint: '关闭后该技能不再出现在斜杠命令补全与命令行技能清单中',
|
|
69
|
+
search: '按名称或描述过滤技能',
|
|
70
|
+
enableAll: '全部开启',
|
|
71
|
+
disableAll: '全部关闭',
|
|
72
|
+
resetAll: '恢复默认',
|
|
73
|
+
resetHint: '清空两侧的覆盖记录,15 个技能全部回到默认开启',
|
|
74
|
+
disableAllHint: '关闭两侧:模型不再看到这些技能,用户也不再能在命令行调用',
|
|
75
|
+
empty: '没有匹配的技能',
|
|
76
|
+
writeFailed: '保存失败',
|
|
77
|
+
hostUnavailable: '当前宿主未提供本插件的配置通道,开关暂不可用',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
var en = {
|
|
81
|
+
title: 'Skill switches',
|
|
82
|
+
intro: 'Control per-skill visibility for the model and for humans across the 15 skills in this bundle. Changes take effect immediately; the running turn is unaffected.',
|
|
83
|
+
modelInvocable: 'Model invocable',
|
|
84
|
+
userInvocable: 'User invocable',
|
|
85
|
+
modelHint: 'Off removes the skill from the model catalog and rejects skill tool calls',
|
|
86
|
+
userHint: 'Off removes the skill from slash-command completion and the CLI skill list',
|
|
87
|
+
search: 'Filter skills by name or description',
|
|
88
|
+
enableAll: 'Enable all',
|
|
89
|
+
disableAll: 'Disable all',
|
|
90
|
+
resetAll: 'Restore defaults',
|
|
91
|
+
resetHint: 'Clear both override tables; all 15 skills return to enabled by default',
|
|
92
|
+
disableAllHint: 'Turn off both sides: the model no longer sees these skills and you cannot invoke them by hand',
|
|
93
|
+
empty: 'No matching skill',
|
|
94
|
+
writeFailed: 'Save failed',
|
|
95
|
+
hostUnavailable: 'The Host does not expose this bundle configuration channel; switches are unavailable',
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/* 官方样式注入契约:style[data-plugin-css="<包名>/<文件名>"],宿主据此在
|
|
99
|
+
插件卸载时回收。tagId 用包名当前缀,避免与其它插件的模块化类名撞车。 */
|
|
100
|
+
var CSS_ID = PACKAGE_NAME + '/SkillSwitchPanel.module.css';
|
|
101
|
+
var CSS = [
|
|
102
|
+
/* @wenaixi/dsh-superpower 技能开关面板:配色与字阶全部取自 DSH 语义别名,随主题自动切换 */
|
|
103
|
+
'.spSw{display:flex;flex-direction:column;gap:12px;color:var(--dsw-alias-label-primary);font:var(--dsw-font-s-14)}',
|
|
104
|
+
'.spSwTitle{margin:0;font:var(--dsw-font-s-strong-14);color:var(--dsw-alias-label-primary)}',
|
|
105
|
+
'.spSwIntro{margin:0;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-secondary)}',
|
|
106
|
+
/* 只读标注:三段等宽小字,tertiary 表示非交互信息 */
|
|
107
|
+
'.spSwMeta{display:flex;flex-wrap:wrap;gap:6px 14px;margin:0;padding:0;list-style:none}',
|
|
108
|
+
'.spSwMetaItem{display:inline-flex;gap:6px;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}',
|
|
109
|
+
'.spSwMetaItem code{padding:1px 6px;border-radius:var(--dsw-radius-xs);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font:inherit}',
|
|
110
|
+
/* 工具条:左按钮右搜索框 */
|
|
111
|
+
'.spSwBar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}',
|
|
112
|
+
'.spSwSearch{flex:1 1 220px;min-width:0}',
|
|
113
|
+
'.spSwSearch input[type=search]{border-radius:var(--dsw-radius-md)}',
|
|
114
|
+
/* 技能列表:行分隔用相邻兄弟选择器,末行不会多出一条线 */
|
|
115
|
+
'.spSwList{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}',
|
|
116
|
+
'.spSwItem{display:flex;align-items:flex-start;gap:24px;padding:12px 0;border-top:0.5px solid var(--dsw-alias-border-l2)}',
|
|
117
|
+
'.spSwItem:first-child{border-top:0}',
|
|
118
|
+
'.spSwMain{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}',
|
|
119
|
+
'.spSwName{margin:0;font:var(--dsw-font-xs-strong-13);color:var(--dsw-alias-label-primary);word-break:break-word}',
|
|
120
|
+
'.spSwDesc{margin:0;font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-tertiary)}',
|
|
121
|
+
'.spSwErr{margin:4px 0 0;font:var(--dsw-font-xxxs-11);color:var(--dsw-alias-state-error-primary)}',
|
|
122
|
+
/* 右侧两列开关:标签在左、开关在右,两行竖排对齐 */
|
|
123
|
+
'.spSwToggles{flex:none;display:grid;grid-template-columns:1fr auto;gap:6px 16px;align-items:center}',
|
|
124
|
+
'.spSwToggle{font:var(--dsw-font-xxs-12);color:var(--dsw-alias-label-secondary)}',
|
|
125
|
+
'.spSwToggleLabel{white-space:nowrap}',
|
|
126
|
+
'.spSwEmpty{margin:0;padding:24px 0;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary);text-align:center}',
|
|
127
|
+
/* 窄屏:开关区落到文字下方 */
|
|
128
|
+
'@media (max-width:600px){.spSwItem{flex-direction:column;gap:8px}}',
|
|
129
|
+
'@media (prefers-reduced-motion:reduce){.spSw *{transition:none!important}}',
|
|
130
|
+
].join('\n');
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 读取禁言字典里某个技能是否被关闭。缺项与 falsy 一律视为开启。
|
|
134
|
+
*/
|
|
135
|
+
function isBlocked(dictionary, name) {
|
|
136
|
+
return !!dictionary && dictionary[name] === true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 把一条路径写入 ConfigForm。op 为 enable 时 unset 路径即恢复继承的默认值。
|
|
141
|
+
*/
|
|
142
|
+
function writeSwitch(form, field, name, op) {
|
|
143
|
+
var ops = op === 'disable'
|
|
144
|
+
? [{ op: 'set', path: [field, name], value: true }]
|
|
145
|
+
: [{ op: 'unset', path: [field, name] }];
|
|
146
|
+
return form.mutate(ops);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 提交一批写入并按技能名归集失败原因。settle 后清掉这些技能的忙碌态。
|
|
151
|
+
*
|
|
152
|
+
* fields 传数组:一次「两侧恢复默认」要同时清 modelDisabled 与 userDisabled,
|
|
153
|
+
* 传单字段会留下一侧残值,而残值在 UI 上与「已开启」无法区分。
|
|
154
|
+
*/
|
|
155
|
+
function submit(form, t, names, fields, op, setPending, setFailures) {
|
|
156
|
+
var clear = function (prev) {
|
|
157
|
+
var next = {};
|
|
158
|
+
Object.keys(prev).forEach(function (key) {
|
|
159
|
+
if (names.indexOf(key) < 0) next[key] = prev[key];
|
|
160
|
+
});
|
|
161
|
+
return next;
|
|
162
|
+
};
|
|
163
|
+
setPending(function (prev) {
|
|
164
|
+
var next = clear(prev);
|
|
165
|
+
names.forEach(function (name) { next[name] = true; });
|
|
166
|
+
return next;
|
|
167
|
+
});
|
|
168
|
+
var work = Promise.all(names.map(function (name) {
|
|
169
|
+
return Promise.all(fields.map(function (field) {
|
|
170
|
+
return writeSwitch(form, field, name, op).then(function (accepted) {
|
|
171
|
+
if (accepted === false) throw new Error(t('writeFailed'));
|
|
172
|
+
});
|
|
173
|
+
}));
|
|
174
|
+
}));
|
|
175
|
+
work.then(function () {
|
|
176
|
+
setFailures(clear);
|
|
177
|
+
}, function (error) {
|
|
178
|
+
setFailures(function (prev) {
|
|
179
|
+
var next = clear(prev);
|
|
180
|
+
var message = t('writeFailed') + ': ' + String(error && error.message ? error.message : error);
|
|
181
|
+
names.forEach(function (name) { next[name] = message; });
|
|
182
|
+
return next;
|
|
183
|
+
});
|
|
184
|
+
}).then(function () {
|
|
185
|
+
setPending(clear);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 技能开关面板。每个技能两个原生开关,对应 DSH 的 modelInvocable 与 userInvocable。
|
|
191
|
+
*
|
|
192
|
+
* props.useSwitches 来自 inject 面绑定好的 ConfigForm 选择器 hook;
|
|
193
|
+
* props.actions 是本面板独占的写操作面。
|
|
194
|
+
*/
|
|
195
|
+
function SkillSwitchPanel(props) {
|
|
196
|
+
var t = props.t;
|
|
197
|
+
var form = props.actions.form;
|
|
198
|
+
var state = props.useSwitches(function (value) { return value; });
|
|
199
|
+
|
|
200
|
+
var keywordState = React.useState('');
|
|
201
|
+
var keyword = keywordState[0];
|
|
202
|
+
var setKeyword = keywordState[1];
|
|
203
|
+
var pendingState = React.useState({});
|
|
204
|
+
var pending = pendingState[0];
|
|
205
|
+
var setPending = pendingState[1];
|
|
206
|
+
var failuresState = React.useState({});
|
|
207
|
+
var failures = failuresState[0];
|
|
208
|
+
var setFailures = failuresState[1];
|
|
209
|
+
|
|
210
|
+
if (state.status !== 'ready') {
|
|
211
|
+
return h('div', { className: 'spSw' },
|
|
212
|
+
h('h4', { className: 'spSwTitle' }, t('title')),
|
|
213
|
+
h('p', { className: 'spSwIntro' }, t('hostUnavailable')));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
var value = state.value || {};
|
|
217
|
+
var modelDisabled = value[MODEL_FIELD] || {};
|
|
218
|
+
var userDisabled = value[USER_FIELD] || {};
|
|
219
|
+
var writable = state.writable !== false && state.mode !== 'memory';
|
|
220
|
+
|
|
221
|
+
var lower = keyword.trim().toLowerCase();
|
|
222
|
+
var shown = lower === ''
|
|
223
|
+
? SKILL_CATALOG
|
|
224
|
+
: SKILL_CATALOG.filter(function (skill) {
|
|
225
|
+
var name = skill.name.toLowerCase();
|
|
226
|
+
return name.indexOf(lower) >= 0 || skill.description.toLowerCase().indexOf(lower) >= 0;
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
var allNames = SKILL_CATALOG.map(function (skill) { return skill.name; });
|
|
230
|
+
|
|
231
|
+
var rows = shown.map(function (skill) {
|
|
232
|
+
var busy = !!pending[skill.name] || !writable;
|
|
233
|
+
var failure = failures[skill.name];
|
|
234
|
+
var modelOn = !isBlocked(modelDisabled, skill.name);
|
|
235
|
+
var userOn = !isBlocked(userDisabled, skill.name);
|
|
236
|
+
return h('li', { key: skill.name, className: 'spSwItem' },
|
|
237
|
+
h('div', { className: 'spSwMain' },
|
|
238
|
+
h('div', { className: 'spSwName' }, skill.name),
|
|
239
|
+
h('p', { className: 'spSwDesc' }, skill.description),
|
|
240
|
+
failure ? h('p', { className: 'spSwErr', role: 'alert' }, failure) : null),
|
|
241
|
+
h('div', { className: 'spSwToggles' },
|
|
242
|
+
h('span', { className: 'spSwToggle spSwToggleLabel' }, t('modelInvocable')),
|
|
243
|
+
h(P.Switch, {
|
|
244
|
+
checked: modelOn,
|
|
245
|
+
disabled: busy,
|
|
246
|
+
label: t('modelInvocable') + ' ' + skill.name,
|
|
247
|
+
title: t('modelHint'),
|
|
248
|
+
onChange: function (next) {
|
|
249
|
+
submit(form, t, [skill.name], [MODEL_FIELD], next ? 'enable' : 'disable', setPending, setFailures);
|
|
250
|
+
},
|
|
251
|
+
}),
|
|
252
|
+
h('span', { className: 'spSwToggle spSwToggleLabel' }, t('userInvocable')),
|
|
253
|
+
h(P.Switch, {
|
|
254
|
+
checked: userOn,
|
|
255
|
+
disabled: busy,
|
|
256
|
+
label: t('userInvocable') + ' ' + skill.name,
|
|
257
|
+
title: t('userHint'),
|
|
258
|
+
onChange: function (next) {
|
|
259
|
+
submit(form, t, [skill.name], [USER_FIELD], next ? 'enable' : 'disable', setPending, setFailures);
|
|
260
|
+
},
|
|
261
|
+
})));
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
return h('div', { className: 'spSw' },
|
|
265
|
+
h('h4', { className: 'spSwTitle' }, t('title')),
|
|
266
|
+
h('p', { className: 'spSwIntro' }, t('intro')),
|
|
267
|
+
h('ul', { className: 'spSwMeta' },
|
|
268
|
+
h('li', { className: 'spSwMetaItem' }, 'provider', h('code', null, PROVIDER_NAME)),
|
|
269
|
+
h('li', { className: 'spSwMetaItem' }, 'rank', h('code', null, String(PROVIDER_RANK))),
|
|
270
|
+
h('li', { className: 'spSwMetaItem' }, 'source', h('code', null, SKILL_SOURCE))),
|
|
271
|
+
h('div', { className: 'spSwBar' },
|
|
272
|
+
h(P.Button, {
|
|
273
|
+
variant: 'outline',
|
|
274
|
+
size: 'sm',
|
|
275
|
+
disabled: !writable,
|
|
276
|
+
title: t('resetHint'),
|
|
277
|
+
onClick: function () {
|
|
278
|
+
submit(form, t, allNames, [MODEL_FIELD, USER_FIELD], 'enable', setPending, setFailures);
|
|
279
|
+
},
|
|
280
|
+
}, t('enableAll')),
|
|
281
|
+
h(P.Button, {
|
|
282
|
+
variant: 'outline',
|
|
283
|
+
size: 'sm',
|
|
284
|
+
disabled: !writable,
|
|
285
|
+
title: t('disableAllHint'),
|
|
286
|
+
onClick: function () {
|
|
287
|
+
submit(form, t, allNames, [MODEL_FIELD, USER_FIELD], 'disable', setPending, setFailures);
|
|
288
|
+
},
|
|
289
|
+
}, t('disableAll')),
|
|
290
|
+
h(P.Button, {
|
|
291
|
+
variant: 'ghost',
|
|
292
|
+
size: 'sm',
|
|
293
|
+
disabled: !writable,
|
|
294
|
+
title: t('resetHint'),
|
|
295
|
+
onClick: function () {
|
|
296
|
+
submit(form, t, allNames, [MODEL_FIELD, USER_FIELD], 'enable', setPending, setFailures);
|
|
297
|
+
},
|
|
298
|
+
}, t('resetAll')),
|
|
299
|
+
h(P.Input, {
|
|
300
|
+
className: 'spSwSearch',
|
|
301
|
+
type: 'search',
|
|
302
|
+
value: keyword,
|
|
303
|
+
placeholder: t('search'),
|
|
304
|
+
'aria-label': t('search'),
|
|
305
|
+
onChange: function (event) { setKeyword(event.target.value); },
|
|
306
|
+
})),
|
|
307
|
+
shown.length === 0
|
|
308
|
+
? h('p', { className: 'spSwEmpty' }, t('empty'))
|
|
309
|
+
: h('ul', { className: 'spSwList' }, rows));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* 注册面板到插件管理页的 bundle 配置插槽。
|
|
314
|
+
*
|
|
315
|
+
* inject 面自带 ConfigForm:bundle 详情页渲染本插槽时不传 form 属性,
|
|
316
|
+
* 只能在这里向宿主取,随后经 hooks 区间合成 useSwitches 选择器 hook。
|
|
317
|
+
*/
|
|
318
|
+
function apply(ctx) {
|
|
319
|
+
ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'superpowers: dictionaries');
|
|
320
|
+
|
|
321
|
+
/* 注入面板样式。必须真注入:类名只写在 CSS 字符串里而不落进 <head>,
|
|
322
|
+
面板会退回浏览器默认样式(16px 正文、无行高、无分隔线),且无任何报错。 */
|
|
323
|
+
if (typeof document !== 'undefined' && !document.querySelector('style[data-plugin-css=' + JSON.stringify(CSS_ID) + ']')) {
|
|
324
|
+
var tag = document.createElement('style');
|
|
325
|
+
tag.dataset.plugin = PACKAGE_NAME;
|
|
326
|
+
tag.dataset.pluginCss = CSS_ID;
|
|
327
|
+
tag.textContent = CSS;
|
|
328
|
+
document.head.appendChild(tag);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
var form = ctx.configForms.get(SETTINGS_NAMESPACE);
|
|
332
|
+
|
|
333
|
+
ctx.slots.inject('plugins.bundle.config', () =>
|
|
334
|
+
ctx.slots.register(
|
|
335
|
+
{
|
|
336
|
+
name: 'plugins.bundle.config',
|
|
337
|
+
key: PACKAGE_NAME,
|
|
338
|
+
locale: NS,
|
|
339
|
+
inject: () => ({ hooks: { switches: form }, actions: { form } }),
|
|
340
|
+
},
|
|
341
|
+
SkillSwitchPanel,
|
|
342
|
+
),
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
exports.apply = apply;
|
|
347
|
+
exports.inject = ['slots', 'configForms', 'locale'];
|
|
348
|
+
return module.exports;
|
|
349
|
+
},
|
|
350
|
+
});
|
package/lib/superpowers.d.ts
CHANGED
|
@@ -5,26 +5,29 @@
|
|
|
5
5
|
* 通过 ctx.skills.registerProvider 注入全局层,rank 10 使本插件技能优先级最高:
|
|
6
6
|
* 小于 dsh-skill-filesystem 的项目/用户根(100–500)与官方 bundled(600)。
|
|
7
7
|
*/
|
|
8
|
-
import type { Context } from '@deepseek-ai/cordis';
|
|
8
|
+
import type { Context, Volatile } from '@deepseek-ai/cordis';
|
|
9
9
|
import Schema from '@deepseek-ai/schemastery';
|
|
10
10
|
import { SkillCatalog } from './catalog.js';
|
|
11
11
|
import { SkillDocument } from './document.js';
|
|
12
12
|
export { SkillCatalog, type SpecificationReport } from './catalog.js';
|
|
13
13
|
export { SkillDocument, type SpecificationTestResult } from './document.js';
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
14
|
+
export { SkillSwitches, applySwitches, readSwitches } from './switches.js';
|
|
15
|
+
declare module '@deepseek-ai/cordis' {
|
|
16
|
+
interface Events {
|
|
17
|
+
/**
|
|
18
|
+
* volatile 配置值已在不重挂载的情况下提交给运行中的 fiber;派发给所属 fiber。
|
|
19
|
+
* @param paths - 变更的配置路径数组
|
|
20
|
+
* @mode emit
|
|
21
|
+
*/
|
|
22
|
+
'loader/volatile-update'(paths: readonly (readonly string[])[]): void;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export declare const Config: Schema<Config>;
|
|
25
26
|
export interface Config {
|
|
26
27
|
providerName: string;
|
|
27
28
|
skillDir?: string;
|
|
29
|
+
modelDisabled: Volatile<Record<string, boolean>>;
|
|
30
|
+
userDisabled: Volatile<Record<string, boolean>>;
|
|
28
31
|
}
|
|
29
32
|
export declare const name = "superpowers";
|
|
30
33
|
export declare const inject: readonly ["skills"];
|
|
@@ -32,17 +35,7 @@ export declare function apply(ctx: Context, config: Config): void;
|
|
|
32
35
|
declare const _default: {
|
|
33
36
|
name: string;
|
|
34
37
|
inject: readonly ["skills"];
|
|
35
|
-
Config: Schema<
|
|
36
|
-
/** 注册到 ctx.skills 的 provider 名称,默认为 superpowers;不可为保留名 runtime */
|
|
37
|
-
providerName: Schema<string, string>;
|
|
38
|
-
/** skill 目录绝对路径,默认取包内 skills/;便于本地调试指向其他目录 */
|
|
39
|
-
skillDir: Schema<string, string>;
|
|
40
|
-
}>, Schemastery.ObjectT<{
|
|
41
|
-
/** 注册到 ctx.skills 的 provider 名称,默认为 superpowers;不可为保留名 runtime */
|
|
42
|
-
providerName: Schema<string, string>;
|
|
43
|
-
/** skill 目录绝对路径,默认取包内 skills/;便于本地调试指向其他目录 */
|
|
44
|
-
skillDir: Schema<string, string>;
|
|
45
|
-
}>>;
|
|
38
|
+
Config: Schema<Config>;
|
|
46
39
|
apply: typeof apply;
|
|
47
40
|
SkillDocument: typeof SkillDocument;
|
|
48
41
|
SkillCatalog: typeof SkillCatalog;
|
package/lib/superpowers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAQ5D,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAI7C,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAQ1E,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,MAAM;QACd;;;;WAIG;QACH,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAA;KACtE;CACF;AAMD,eAAO,MAAM,MAAM,EAc0C,MAAM,CAAC,MAAM,CAAC,CAAA;AAa3E,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAChD,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAChD;AAMD,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,MAAM,qBAAsB,CAAA;AAgFzC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmCxD;;;;;;;;;AAED,wBAA2E"}
|
package/lib/superpowers.js
CHANGED
|
@@ -10,9 +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
14
|
// 具名导出深度模块,为验证治理与测试表面提供统一深度接口
|
|
14
15
|
export { SkillCatalog } from './catalog.js';
|
|
15
16
|
export { SkillDocument } from './document.js';
|
|
17
|
+
export { SkillSwitches, applySwitches, readSwitches } from './switches.js';
|
|
16
18
|
// ---------------------------------------------------------------------------
|
|
17
19
|
// Config — 默认值写在 schema 里;可选字段用可选属性声明
|
|
18
20
|
// ---------------------------------------------------------------------------
|
|
@@ -21,7 +23,16 @@ export const Config = Schema.object({
|
|
|
21
23
|
providerName: Schema.string().default('superpowers'),
|
|
22
24
|
/** skill 目录绝对路径,默认取包内 skills/;便于本地调试指向其他目录 */
|
|
23
25
|
skillDir: Schema.string(),
|
|
24
|
-
|
|
26
|
+
/** 模型侧禁言表:键为技能名,值为 true 时该技能不再进入模型目录且工具调用被拒 */
|
|
27
|
+
modelDisabled: Schema.dict(Schema.boolean()).default({}).volatile(),
|
|
28
|
+
/** 用户侧禁言表:键为技能名,值为 true 时该技能不再出现在斜杠命令与 CLI 清单中 */
|
|
29
|
+
userDisabled: Schema.dict(Schema.boolean()).default({}).volatile(),
|
|
30
|
+
})
|
|
31
|
+
// 断言为 Schema<Config>:volatile() 的输出类型来自 schemastery 的传递依赖 cosmokit,
|
|
32
|
+
// 在 pnpm isolated 布局下它只能经 .pnpm 内部路径引用,tsc 的声明发射拒绝写出这种
|
|
33
|
+
// 不可移植路径(TS2742)。Config 接口已用 cordis 重导出的 Volatile 精确描述同一形状,
|
|
34
|
+
// 断言只是让声明发射改写这个 specifier,不改变任何运行时行为。
|
|
35
|
+
.description('@wenaixi/dsh-superpower 插件配置');
|
|
25
36
|
// ---------------------------------------------------------------------------
|
|
26
37
|
// 插件元信息
|
|
27
38
|
// ---------------------------------------------------------------------------
|
|
@@ -54,24 +65,42 @@ class SuperpowersProvider {
|
|
|
54
65
|
name;
|
|
55
66
|
catalog;
|
|
56
67
|
ctx;
|
|
57
|
-
|
|
68
|
+
control;
|
|
69
|
+
currentSwitches;
|
|
70
|
+
constructor(ctx, control, config) {
|
|
58
71
|
assertNotRuntimeProvider(config.providerName);
|
|
59
72
|
this.ctx = ctx;
|
|
73
|
+
this.control = control;
|
|
60
74
|
this.name = config.providerName;
|
|
61
75
|
const skillDir = resolveDefaultSkillDir(config.skillDir);
|
|
62
76
|
this.catalog = new SkillCatalog(skillDir);
|
|
77
|
+
// 每次调用重新解包 volatile 引用,保证开关在运行中被改后立即可见
|
|
78
|
+
this.currentSwitches = () => readSwitches(config);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 让宿主注册表丢弃本 provider 的编目缓存并广播 skills/change,
|
|
82
|
+
* 同时让本包自己的候选快照重算。缺任一方都会导致开关显示已更新而模型侧目录不变。
|
|
83
|
+
*/
|
|
84
|
+
invalidate() {
|
|
85
|
+
this.control.invalidate();
|
|
86
|
+
this.catalog.invalidate();
|
|
63
87
|
}
|
|
64
88
|
async list(options) {
|
|
65
|
-
|
|
89
|
+
const switches = this.currentSwitches();
|
|
90
|
+
const candidates = await this.catalog.listCandidates(this.name, SUPERPOWERS_RANK, {
|
|
66
91
|
signal: options.signal,
|
|
67
92
|
logger: this.ctx.logger,
|
|
68
93
|
});
|
|
94
|
+
return candidates.map((candidate) => applySwitches(candidate, switches));
|
|
69
95
|
}
|
|
70
96
|
async get(candidate, options) {
|
|
71
|
-
|
|
97
|
+
const definition = await this.catalog.getDefinition(candidate, this.name, {
|
|
72
98
|
signal: options.signal,
|
|
73
99
|
logger: this.ctx.logger,
|
|
74
100
|
});
|
|
101
|
+
// 加载路径同样套用:skill 工具在 get 之后二次校验 isModelInvocable,
|
|
102
|
+
// 只改 list 的候选会让模型目录消失但工具调用仍成功,语义撕裂。
|
|
103
|
+
return definition === undefined ? undefined : applySwitches(definition, this.currentSwitches());
|
|
75
104
|
}
|
|
76
105
|
}
|
|
77
106
|
// ---------------------------------------------------------------------------
|
|
@@ -92,7 +121,15 @@ export function apply(ctx, config) {
|
|
|
92
121
|
ctx.logger.debug('[superpowers] skills catalog changed, invalidating snapshot');
|
|
93
122
|
activeProvider?.catalog.invalidate();
|
|
94
123
|
});
|
|
124
|
+
// 技能开关是 volatile 配置字段,改动不重挂载插件但会派发此事件。
|
|
125
|
+
// 借它让宿主注册表丢弃编目缓存并广播 skills/change,模型侧下一轮即可拿到新目录。
|
|
126
|
+
const disposeVolatile = ctx.on('loader/volatile-update', () => {
|
|
127
|
+
ctx.logger.debug('[superpowers] skill switches updated, invalidating catalog');
|
|
128
|
+
activeProvider?.invalidate();
|
|
129
|
+
});
|
|
95
130
|
return () => {
|
|
131
|
+
// 逆序释放:先摘监听,再注销 provider,最后清理自身快照
|
|
132
|
+
disposeVolatile();
|
|
96
133
|
disposeListener();
|
|
97
134
|
disposeProvider();
|
|
98
135
|
activeProvider?.catalog.invalidate();
|
package/lib/superpowers.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @wenaixi/dsh-superpower — 技能开关状态深度模块
|
|
3
|
+
*
|
|
4
|
+
* 封装「哪个技能对哪一侧可见」的唯一判据:两个以技能名为键的禁言字典。
|
|
5
|
+
*
|
|
6
|
+
* 核心设计:
|
|
7
|
+
* - Depth: 把 volatile 引用解包与 invocation 覆盖隐藏在两个纯函数之后;
|
|
8
|
+
* - Locality: 所有开关语义内聚于此,Provider 只负责调用;
|
|
9
|
+
* - Test Surface: selfTest() 是接口即测试表面,随 verifySpecification 一并进门禁。
|
|
10
|
+
*
|
|
11
|
+
* DSH 的 SkillInvocationPolicy 只有 modelInvocable 与 userInvocable 两个布尔,
|
|
12
|
+
* 这是平台唯一的官方屏蔽通道:模型目录由 dsh-tool-skill 按 isModelInvocable 过滤,
|
|
13
|
+
* skill 工具加载时二次校验;userInvocable 为 false 时斜杠命令与 CLI 清单都不再列出。
|
|
14
|
+
* 两种组合都保留技能在注册表中的存在与同名裁决权,与在 SKILL.md 写
|
|
15
|
+
* disable-model-invocation / user-invocable 完全等价。
|
|
16
|
+
*/
|
|
17
|
+
import type { SkillInvocationPolicy } from '@deepseek-ai/dsh-skill';
|
|
18
|
+
/** 以技能名为键的禁言表:键存在且值为 true 表示该技能在该侧被关闭。 */
|
|
19
|
+
export interface SkillSwitches {
|
|
20
|
+
/** 关闭模型自动触发的技能名集合(映射为 modelInvocable = false)。 */
|
|
21
|
+
modelDisabled: Record<string, boolean>;
|
|
22
|
+
/** 关闭用户 /name 显式调用的技能名集合(映射为 userInvocable = false)。 */
|
|
23
|
+
userDisabled: Record<string, boolean>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 从任意配置容器读取两个禁言字典,兼容 volatile 引用与普通对象两种形态。
|
|
27
|
+
*
|
|
28
|
+
* @param config - 插件配置容器,通常为 apply 收到的 config 对象
|
|
29
|
+
* @returns 两个已解包并浅拷贝的普通禁言字典;字段缺失或类型不符时为空字典
|
|
30
|
+
*/
|
|
31
|
+
export declare function readSwitches(config: unknown): SkillSwitches;
|
|
32
|
+
/**
|
|
33
|
+
* 用禁言表覆盖一个技能条目的 invocation 策略,返回新对象且不修改入参。
|
|
34
|
+
*
|
|
35
|
+
* @param entry - SkillCandidate 或 SkillDefinition,二者都带 name 与 invocation
|
|
36
|
+
* @param switches - 两个禁言字典
|
|
37
|
+
* @returns 覆盖后的新条目;未被禁言的技能原样返回一份浅拷贝
|
|
38
|
+
*/
|
|
39
|
+
export declare function applySwitches<T extends {
|
|
40
|
+
name: string;
|
|
41
|
+
invocation: SkillInvocationPolicy;
|
|
42
|
+
}>(entry: T, switches: SkillSwitches): T;
|
|
43
|
+
/**
|
|
44
|
+
* 开关语义自检:随 SkillCatalog.verifySpecification 一并进入质量门禁。
|
|
45
|
+
*/
|
|
46
|
+
export declare const SkillSwitches: {
|
|
47
|
+
/**
|
|
48
|
+
* 执行三条边界契约断言。
|
|
49
|
+
*
|
|
50
|
+
* @returns 每条用例的成败与失败原因
|
|
51
|
+
*/
|
|
52
|
+
selfTest(): Promise<{
|
|
53
|
+
name: string;
|
|
54
|
+
ok: boolean;
|
|
55
|
+
error?: string;
|
|
56
|
+
}[]>;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=switches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switches.d.ts","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEnE,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACtC;AAOD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAM3D;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,CAWH;AAiBD;;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;CA4C3E,CAAA"}
|
package/lib/switches.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @wenaixi/dsh-superpower — 技能开关状态深度模块
|
|
3
|
+
*
|
|
4
|
+
* 封装「哪个技能对哪一侧可见」的唯一判据:两个以技能名为键的禁言字典。
|
|
5
|
+
*
|
|
6
|
+
* 核心设计:
|
|
7
|
+
* - Depth: 把 volatile 引用解包与 invocation 覆盖隐藏在两个纯函数之后;
|
|
8
|
+
* - Locality: 所有开关语义内聚于此,Provider 只负责调用;
|
|
9
|
+
* - Test Surface: selfTest() 是接口即测试表面,随 verifySpecification 一并进门禁。
|
|
10
|
+
*
|
|
11
|
+
* DSH 的 SkillInvocationPolicy 只有 modelInvocable 与 userInvocable 两个布尔,
|
|
12
|
+
* 这是平台唯一的官方屏蔽通道:模型目录由 dsh-tool-skill 按 isModelInvocable 过滤,
|
|
13
|
+
* skill 工具加载时二次校验;userInvocable 为 false 时斜杠命令与 CLI 清单都不再列出。
|
|
14
|
+
* 两种组合都保留技能在注册表中的存在与同名裁决权,与在 SKILL.md 写
|
|
15
|
+
* disable-model-invocation / user-invocable 完全等价。
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* 从任意配置容器读取两个禁言字典,兼容 volatile 引用与普通对象两种形态。
|
|
19
|
+
*
|
|
20
|
+
* @param config - 插件配置容器,通常为 apply 收到的 config 对象
|
|
21
|
+
* @returns 两个已解包并浅拷贝的普通禁言字典;字段缺失或类型不符时为空字典
|
|
22
|
+
*/
|
|
23
|
+
export function readSwitches(config) {
|
|
24
|
+
const source = (config ?? {});
|
|
25
|
+
return {
|
|
26
|
+
modelDisabled: unwrapDictionary(source['modelDisabled']),
|
|
27
|
+
userDisabled: unwrapDictionary(source['userDisabled']),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 用禁言表覆盖一个技能条目的 invocation 策略,返回新对象且不修改入参。
|
|
32
|
+
*
|
|
33
|
+
* @param entry - SkillCandidate 或 SkillDefinition,二者都带 name 与 invocation
|
|
34
|
+
* @param switches - 两个禁言字典
|
|
35
|
+
* @returns 覆盖后的新条目;未被禁言的技能原样返回一份浅拷贝
|
|
36
|
+
*/
|
|
37
|
+
export function applySwitches(entry, switches) {
|
|
38
|
+
const modelBlocked = switches.modelDisabled[entry.name] === true;
|
|
39
|
+
const userBlocked = switches.userDisabled[entry.name] === true;
|
|
40
|
+
if (!modelBlocked && !userBlocked)
|
|
41
|
+
return { ...entry };
|
|
42
|
+
return {
|
|
43
|
+
...entry,
|
|
44
|
+
invocation: {
|
|
45
|
+
modelInvocable: entry.invocation.modelInvocable && !modelBlocked,
|
|
46
|
+
userInvocable: entry.invocation.userInvocable && !userBlocked,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 解包一个可能是 volatile 引用、可能是普通对象的字典字段。
|
|
52
|
+
*
|
|
53
|
+
* @param value - 字段原始值
|
|
54
|
+
* @returns 普通对象字典;非对象或缺省时为空字典
|
|
55
|
+
*/
|
|
56
|
+
function unwrapDictionary(value) {
|
|
57
|
+
const unwrapped = typeof value?.get === 'function'
|
|
58
|
+
? value.get()
|
|
59
|
+
: value;
|
|
60
|
+
if (typeof unwrapped !== 'object' || unwrapped === null || Array.isArray(unwrapped))
|
|
61
|
+
return {};
|
|
62
|
+
return { ...unwrapped };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 开关语义自检:随 SkillCatalog.verifySpecification 一并进入质量门禁。
|
|
66
|
+
*/
|
|
67
|
+
export const SkillSwitches = {
|
|
68
|
+
/**
|
|
69
|
+
* 执行三条边界契约断言。
|
|
70
|
+
*
|
|
71
|
+
* @returns 每条用例的成败与失败原因
|
|
72
|
+
*/
|
|
73
|
+
async selfTest() {
|
|
74
|
+
const results = [];
|
|
75
|
+
const run = async (name, fn) => {
|
|
76
|
+
try {
|
|
77
|
+
await fn();
|
|
78
|
+
results.push({ name, ok: true });
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
results.push({ name, ok: false, error: err?.message ?? String(err) });
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const entry = () => ({
|
|
85
|
+
name: 'switch-test',
|
|
86
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
87
|
+
});
|
|
88
|
+
await run('模型禁用且入参不变', () => {
|
|
89
|
+
const original = entry();
|
|
90
|
+
const out = applySwitches(original, {
|
|
91
|
+
modelDisabled: { 'switch-test': true },
|
|
92
|
+
userDisabled: {},
|
|
93
|
+
});
|
|
94
|
+
if (out.invocation.modelInvocable !== false)
|
|
95
|
+
throw new Error('modelInvocable 未被关闭');
|
|
96
|
+
if (out.invocation.userInvocable !== true)
|
|
97
|
+
throw new Error('userInvocable 被误伤');
|
|
98
|
+
if (original.invocation.modelInvocable !== true)
|
|
99
|
+
throw new Error('入参被就地修改');
|
|
100
|
+
});
|
|
101
|
+
await run('字典缺项视为启用', () => {
|
|
102
|
+
const out = applySwitches(entry(), { modelDisabled: {}, userDisabled: {} });
|
|
103
|
+
if (!out.invocation.modelInvocable || !out.invocation.userInvocable) {
|
|
104
|
+
throw new Error('缺项被误判为禁用');
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
await run('无关技能名不影响他人', () => {
|
|
108
|
+
const out = applySwitches(entry(), {
|
|
109
|
+
modelDisabled: { 'other-skill': true },
|
|
110
|
+
userDisabled: {},
|
|
111
|
+
});
|
|
112
|
+
if (!out.invocation.modelInvocable)
|
|
113
|
+
throw new Error('无关键误伤了本技能');
|
|
114
|
+
});
|
|
115
|
+
return results;
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=switches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switches.js","sourceRoot":"","sources":["../src/switches.ts"],"names":[],"mappings":"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"}
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
package/package.json
CHANGED
|
@@ -1,28 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wenaixi/dsh-superpower",
|
|
3
|
-
"version": "7.
|
|
4
|
-
"description": "obra/superpowers 的 DSH
|
|
3
|
+
"version": "7.2.0",
|
|
4
|
+
"description": "obra/superpowers 的 DSH 移植版:15 个工程纪律技能注入 ctx.skills,含技能开关面板",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/superpowers.js",
|
|
7
7
|
"types": "lib/superpowers.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"lib/",
|
|
10
10
|
"skills/",
|
|
11
|
+
"locale/",
|
|
12
|
+
"icon.png",
|
|
11
13
|
"cordis.patch.yml",
|
|
12
14
|
"README.md",
|
|
13
15
|
"LICENSE"
|
|
14
16
|
],
|
|
15
17
|
"scripts": {
|
|
16
|
-
"build": "tsc -p tsconfig.build.json",
|
|
18
|
+
"build": "tsc -p tsconfig.build.json && node scripts/build-client.mjs",
|
|
17
19
|
"typecheck": "tsc --noEmit",
|
|
18
20
|
"lint": "eslint src --ext .ts 2>&1 || echo \"(no eslint config — skipped)\"",
|
|
19
21
|
"prepare": "npm run build",
|
|
20
22
|
"prepack": "npm run build",
|
|
21
|
-
"verify": "node scripts/verify.mjs"
|
|
23
|
+
"verify": "node scripts/verify.mjs && node scripts/check-skill-switches.mjs"
|
|
22
24
|
},
|
|
23
25
|
"dsh": {
|
|
24
26
|
"bundle": {
|
|
25
27
|
"patch": "./cordis.patch.yml"
|
|
28
|
+
},
|
|
29
|
+
"client": {
|
|
30
|
+
"platform": "web",
|
|
31
|
+
"inject": [
|
|
32
|
+
"@deepseek-ai/dsh-client-ui-primitives",
|
|
33
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
34
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
35
|
+
"@deepseek-ai/dsh-client-locale"
|
|
36
|
+
]
|
|
26
37
|
}
|
|
27
38
|
},
|
|
28
39
|
"dependencies": {
|
|
@@ -31,14 +42,20 @@
|
|
|
31
42
|
"peerDependencies": {
|
|
32
43
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
33
44
|
"@deepseek-ai/dsh-skill": ">=0.1.0-rc.1 <0.3.0-0",
|
|
34
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
45
|
+
"@deepseek-ai/schemastery": "^3.18.4",
|
|
46
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.2.0-rc.1 <0.3.0-0",
|
|
47
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.2.0-rc.1 <0.3.0-0",
|
|
48
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.2.0-rc.1 <0.3.0-0",
|
|
49
|
+
"@deepseek-ai/dsh-client-locale": ">=0.2.0-rc.1 <0.3.0-0",
|
|
50
|
+
"react": "^18.2.0"
|
|
35
51
|
},
|
|
36
52
|
"devDependencies": {
|
|
37
53
|
"@deepseek-ai/cordis": "4.0.4",
|
|
54
|
+
"@deepseek-ai/cosmokit": "~1.8.5",
|
|
38
55
|
"@deepseek-ai/dsh-skill": "0.2.0-rc.2",
|
|
39
|
-
"@deepseek-ai/schemastery": "
|
|
40
|
-
"
|
|
41
|
-
"
|
|
56
|
+
"@deepseek-ai/schemastery": "3.18.4",
|
|
57
|
+
"@types/node": "^22.0.0",
|
|
58
|
+
"typescript": "^5.6.0"
|
|
42
59
|
},
|
|
43
60
|
"license": "MIT",
|
|
44
61
|
"repository": {
|
|
@@ -62,5 +79,15 @@
|
|
|
62
79
|
},
|
|
63
80
|
"publishConfig": {
|
|
64
81
|
"access": "public"
|
|
65
|
-
}
|
|
66
|
-
|
|
82
|
+
},
|
|
83
|
+
"exports": {
|
|
84
|
+
".": {
|
|
85
|
+
"types": "./lib/superpowers.d.ts",
|
|
86
|
+
"default": "./lib/superpowers.js"
|
|
87
|
+
},
|
|
88
|
+
"./client": "./lib/client.js",
|
|
89
|
+
"./locale/*.json": "./locale/*.json",
|
|
90
|
+
"./package.json": "./package.json"
|
|
91
|
+
},
|
|
92
|
+
"icon": "./icon.png"
|
|
93
|
+
}
|
|
@@ -49,6 +49,15 @@ description: "Superpower Skill:适用于任何对话开始前,建立技能
|
|
|
49
49
|
| "这样做感觉很高效" | 无章法的行动只会浪费时间,技能可以避免。 |
|
|
50
50
|
| "我知道那是什么意思" | 知道概念不等于会用技能,请调用它。 |
|
|
51
51
|
|
|
52
|
+
## 技能开关
|
|
53
|
+
|
|
54
|
+
本套件的 15 个技能各自带两个开关,位于 DSH Web GUI 插件管理页中 `@wenaixi/dsh-superpower` 卡片的详情页:
|
|
55
|
+
|
|
56
|
+
- **模型可调用**:关闭后该技能不再出现在模型的可用技能目录中,`skill` 工具调用也会被拒绝。
|
|
57
|
+
- **用户可调用**:关闭后该技能不再出现在斜杠命令补全与命令行技能清单中。
|
|
58
|
+
|
|
59
|
+
开关拨动后立即生效,状态落在 profile 的 `cordis.patch.yml` 里;当前进行中的这一轮对话不受影响,下一轮才会看到新的目录。
|
|
60
|
+
|
|
52
61
|
## 平台适配
|
|
53
62
|
|
|
54
63
|
本套件专为 **DSH (DeepSeek Harness)** 原生环境设计,仅支持 DSH 平台:
|