@wenaixi/dsh-superpower 7.0.0 → 7.0.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.
Files changed (57) hide show
  1. package/README.md +3 -3
  2. package/lib/catalog.d.ts +83 -0
  3. package/lib/catalog.d.ts.map +1 -0
  4. package/lib/catalog.js +231 -0
  5. package/lib/catalog.js.map +1 -0
  6. package/lib/document.d.ts +52 -0
  7. package/lib/document.d.ts.map +1 -0
  8. package/lib/document.js +196 -0
  9. package/lib/document.js.map +1 -0
  10. package/lib/superpowers.d.ts +6 -0
  11. package/lib/superpowers.d.ts.map +1 -1
  12. package/lib/superpowers.js +27 -250
  13. package/lib/superpowers.js.map +1 -1
  14. package/package.json +1 -1
  15. package/skills/brainstorming/SKILL.md +1 -1
  16. package/skills/brainstorming/scripts/server.cjs +6 -14
  17. package/skills/brainstorming/scripts/start-server.sh +1 -6
  18. package/skills/brainstorming/spec-document-reviewer-prompt.md +1 -1
  19. package/skills/brainstorming/visual-companion.md +5 -31
  20. package/skills/diagnosing-superpowers/SKILL.md +1 -1
  21. package/skills/diagnosing-superpowers/prompts/request-conflicts.md +1 -1
  22. package/skills/diagnosing-superpowers/templates/issue.md +1 -1
  23. package/skills/dispatching-parallel-agents/SKILL.md +4 -4
  24. package/skills/executing-plans/SKILL.md +5 -5
  25. package/skills/finishing-a-development-branch/SKILL.md +5 -5
  26. package/skills/receiving-code-review/SKILL.md +1 -1
  27. package/skills/requesting-code-review/SKILL.md +1 -1
  28. package/skills/requesting-code-review/code-reviewer.md +1 -1
  29. package/skills/subagent-driven-development/SKILL.md +2 -2
  30. package/skills/subagent-driven-development/implementer-prompt.md +1 -1
  31. package/skills/subagent-driven-development/re-review-prompt.md +1 -1
  32. package/skills/subagent-driven-development/scripts/sdd-workspace +2 -2
  33. package/skills/subagent-driven-development/task-reviewer-prompt.md +1 -1
  34. package/skills/systematic-debugging/CREATION-LOG.md +2 -2
  35. package/skills/systematic-debugging/SKILL.md +2 -2
  36. package/skills/systematic-debugging/condition-based-waiting.md +3 -3
  37. package/skills/systematic-debugging/defense-in-depth.md +1 -1
  38. package/skills/systematic-debugging/root-cause-tracing.md +1 -1
  39. package/skills/systematic-debugging/test-pressure-3.md +1 -1
  40. package/skills/test-driven-development/SKILL.md +1 -1
  41. package/skills/test-driven-development/writing-good-tests.md +1 -1
  42. package/skills/using-git-worktrees/SKILL.md +1 -1
  43. package/skills/using-superpowers/SKILL.md +4 -10
  44. package/skills/using-superpowers/references/dsh-tools.md +3 -3
  45. package/skills/verification-before-completion/SKILL.md +1 -1
  46. package/skills/writing-plans/SKILL.md +1 -1
  47. package/skills/writing-skills/SKILL.md +6 -6
  48. package/skills/writing-skills/testing-skills-with-subagents.md +1 -1
  49. package/skills/using-superpowers/references/antigravity-tools.md +0 -23
  50. package/skills/using-superpowers/references/claude-code-tools.md +0 -11
  51. package/skills/using-superpowers/references/codex-tools.md +0 -108
  52. package/skills/using-superpowers/references/gemini-tools.md +0 -63
  53. package/skills/using-superpowers/references/hermes-tools.md +0 -56
  54. package/skills/using-superpowers/references/muse-tools.md +0 -35
  55. package/skills/using-superpowers/references/pi-tools.md +0 -16
  56. package/skills/writing-skills/anthropic-best-practices.md +0 -1146
  57. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -188
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](./LICENSE)
5
5
  [![DSH](https://img.shields.io/badge/DSH-Plugin-7c3aed)](https://github.com/deepseek-ai/deepseek-harness)
6
6
 
7
- [obra/superpowers](https://github.com/obra/superpowers) 的 DSH 完整移植 — 15 个技能注入 `ctx.skills`,开箱即用,全中文。
7
+ [obra/superpowers](https://github.com/obra/superpowers) 的 DSH 专属移植版 — 15 个技能注入 `ctx.skills`,开箱即用,全中文,**仅支持 DSH (DeepSeek Harness) 平台**,不提供其它 AI 宿主适配。
8
8
 
9
9
  ## 安装
10
10
 
@@ -26,7 +26,7 @@ dsh --profile web --dump-config | grep -A2 "@wenaixi/dsh-superpower"
26
26
  dsh --profile web # 进会话,技能自动可用
27
27
  ```
28
28
 
29
- > 如需锁定版本,在包名后追加 `@<version>`(如 `@wenaixi/dsh-superpower@7.0.0`)或 `#v7.0.0`(GitHub 形式)。
29
+ > 如需锁定版本,在包名后追加 `@<version>`(如 `@wenaixi/dsh-superpower@7.0.1`)或 `#v7.0.1`(GitHub 形式)。
30
30
  >
31
31
  > > 旧名 `dsh-superpower`(无 scope)已废弃并 `npm deprecate`,请改用 `@wenaixi/dsh-superpower`。
32
32
 
@@ -96,7 +96,7 @@ skills/ # 15 技能(中文化,v7.0.0 起无 superpower- 前缀
96
96
  lib/ # 已提交,GitHub 直装零构建
97
97
  ```
98
98
 
99
- 版本:`v7.0.0` 起技能名回归上游命名(无 `superpower-` 前缀)并整批同步上游 `obra/superpowers v6.4.2`;本插件技能优先级最高(rank 10),同名技能本包胜出。详见 `CHANGELOG.md`。
99
+ 版本:`v7.0.0` 起技能名回归上游命名(无 `superpower-` 前缀)并整批同步上游 `obra/superpowers v6.4.2`;本插件技能优先级最高(rank 10),同名技能本包胜出。`v7.0.0` 起本插件为 **DSH 专属**,已移除全部非 DSH 平台(Claude Code、Codex、Gemini CLI、Hermes、Muse、Pi、Antigravity、Copilot CLI)的参考文档与兼容层;`v7.0.1` 为修复版,重发干净 tarball(npm `7.0.0` 发布于专属化前、已废弃,勿使用)。详见 `CHANGELOG.md`。
100
100
 
101
101
  ## 常见问题
102
102
 
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @wenaixi/dsh-superpower — SkillCatalog 深度模块
3
+ *
4
+ * 封装技能目录的发现、遍历、健康探测、排重、名称漂移校验与版本化快照索引。
5
+ *
6
+ * 核心设计:
7
+ * - Depth: 将文件系统遍历、mtime 存活检测、去重、状态回写与快照复用隐藏在极简接口之后;
8
+ * - Locality: 集中管理技能目录发现逻辑、缓存一致性与规范合规规则;
9
+ * - Leverage: 同时支撑 SuperpowersProvider 高性能运行时与 verify.mjs 质检治理。
10
+ */
11
+ import type { SkillCandidate, SkillDefinition } from '@deepseek-ai/dsh-skill';
12
+ import { SkillDocument } from './document.js';
13
+ export interface CatalogLogger {
14
+ warn(msg: string): void;
15
+ debug?(msg: string): void;
16
+ info?(msg: string): void;
17
+ }
18
+ export interface CatalogLookupOptions {
19
+ signal?: AbortSignal;
20
+ logger?: CatalogLogger;
21
+ forceScan?: boolean;
22
+ }
23
+ export interface CatalogEntry {
24
+ directoryName: string;
25
+ skillPath: string;
26
+ document: SkillDocument;
27
+ nameDrift: boolean;
28
+ }
29
+ export interface CatalogIntegrityReport {
30
+ total: number;
31
+ entries: CatalogEntry[];
32
+ duplicates: string[];
33
+ missingSkillMd: string[];
34
+ errors: {
35
+ path: string;
36
+ error: string;
37
+ }[];
38
+ ok: boolean;
39
+ }
40
+ export declare class SkillCatalog {
41
+ readonly skillDir: string;
42
+ private readonly entriesByName;
43
+ private readonly entriesByDir;
44
+ private readonly duplicates;
45
+ private readonly missingSkillMd;
46
+ private readonly loadErrors;
47
+ private cachedCandidates;
48
+ private lastScannedMtimeMs;
49
+ private lastScanProviderName?;
50
+ private lastScanRank?;
51
+ constructor(skillDir: string);
52
+ /**
53
+ * 从指定目录异步扫描并构建已预热的 SkillCatalog 深度实例。
54
+ */
55
+ static fromDirectory(skillDir: string, options?: CatalogLookupOptions): Promise<SkillCatalog>;
56
+ /**
57
+ * 清空快照与索引,强制下一轮查询重新从磁盘装载。
58
+ */
59
+ invalidate(): void;
60
+ /**
61
+ * 探测目录是否发生变动。
62
+ */
63
+ private isDirModified;
64
+ /**
65
+ * 执行全量目录遍历与技能索引构建。
66
+ */
67
+ scan(options?: CatalogLookupOptions): Promise<void>;
68
+ /**
69
+ * 映射当前有效技能为 DSH SkillCandidate 快照。
70
+ * 自动按 mtime 评估有效性,未变动时直接复用不可变快照,零重复读盘。
71
+ */
72
+ listCandidates(providerName: string, rank: number, options?: CatalogLookupOptions): Promise<readonly SkillCandidate[]>;
73
+ /**
74
+ * 根据候选技能的 locator 与名称解析出完整 SkillDefinition。
75
+ * 优先命中内存缓存;若发生热重读,自动自愈更新回内存映射,消除状态撕裂缝隙。
76
+ */
77
+ getDefinition(candidate: SkillCandidate, providerName: string, options?: CatalogLookupOptions): Promise<SkillDefinition | undefined>;
78
+ /**
79
+ * 生成目录健康度与一致性完整体检报告(供 verify 脚本与 CI 质量门禁复用)。
80
+ */
81
+ verifyIntegrity(): CatalogIntegrityReport;
82
+ }
83
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,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,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;IACH,eAAe,IAAI,sBAAsB;CAY1C"}
package/lib/catalog.js ADDED
@@ -0,0 +1,231 @@
1
+ /**
2
+ * @wenaixi/dsh-superpower — SkillCatalog 深度模块
3
+ *
4
+ * 封装技能目录的发现、遍历、健康探测、排重、名称漂移校验与版本化快照索引。
5
+ *
6
+ * 核心设计:
7
+ * - Depth: 将文件系统遍历、mtime 存活检测、去重、状态回写与快照复用隐藏在极简接口之后;
8
+ * - Locality: 集中管理技能目录发现逻辑、缓存一致性与规范合规规则;
9
+ * - Leverage: 同时支撑 SuperpowersProvider 高性能运行时与 verify.mjs 质检治理。
10
+ */
11
+ import { readdir, stat } from 'node:fs/promises';
12
+ import { join } from 'node:path';
13
+ import { SkillDocument } from './document.js';
14
+ export class SkillCatalog {
15
+ skillDir;
16
+ entriesByName = new Map();
17
+ entriesByDir = new Map();
18
+ duplicates = [];
19
+ missingSkillMd = [];
20
+ loadErrors = [];
21
+ // 快照缓存与版本探测状态
22
+ cachedCandidates = null;
23
+ lastScannedMtimeMs = 0;
24
+ lastScanProviderName;
25
+ lastScanRank;
26
+ constructor(skillDir) {
27
+ this.skillDir = skillDir;
28
+ }
29
+ /**
30
+ * 从指定目录异步扫描并构建已预热的 SkillCatalog 深度实例。
31
+ */
32
+ static async fromDirectory(skillDir, options) {
33
+ options?.signal?.throwIfAborted();
34
+ const catalog = new SkillCatalog(skillDir);
35
+ await catalog.scan(options);
36
+ return catalog;
37
+ }
38
+ /**
39
+ * 清空快照与索引,强制下一轮查询重新从磁盘装载。
40
+ */
41
+ invalidate() {
42
+ this.cachedCandidates = null;
43
+ this.lastScannedMtimeMs = 0;
44
+ this.entriesByName.clear();
45
+ this.entriesByDir.clear();
46
+ this.duplicates.length = 0;
47
+ this.missingSkillMd.length = 0;
48
+ this.loadErrors.length = 0;
49
+ }
50
+ /**
51
+ * 探测目录是否发生变动。
52
+ */
53
+ async isDirModified(signal) {
54
+ if (this.lastScannedMtimeMs === 0 || this.entriesByName.size === 0)
55
+ return true;
56
+ try {
57
+ signal?.throwIfAborted();
58
+ const dirStat = await stat(this.skillDir);
59
+ return dirStat.mtimeMs > this.lastScannedMtimeMs;
60
+ }
61
+ catch {
62
+ return true;
63
+ }
64
+ }
65
+ /**
66
+ * 执行全量目录遍历与技能索引构建。
67
+ */
68
+ async scan(options) {
69
+ const signal = options?.signal;
70
+ const logger = options?.logger;
71
+ let dirStat;
72
+ try {
73
+ dirStat = await stat(this.skillDir);
74
+ }
75
+ catch (err) {
76
+ const code = err?.code;
77
+ if (code === 'ENOENT' || code === 'ENOTDIR') {
78
+ logger?.warn(`[SkillCatalog] skillDir not found: ${this.skillDir}`);
79
+ this.invalidate();
80
+ return;
81
+ }
82
+ throw err;
83
+ }
84
+ let dirents;
85
+ try {
86
+ dirents = await readdir(this.skillDir, { withFileTypes: true, signal });
87
+ }
88
+ catch (err) {
89
+ const code = err?.code;
90
+ if (code === 'ENOENT' || code === 'ENOTDIR') {
91
+ logger?.warn(`[SkillCatalog] skillDir not found: ${this.skillDir}`);
92
+ this.invalidate();
93
+ return;
94
+ }
95
+ throw err;
96
+ }
97
+ // 重置内存临时状态
98
+ this.entriesByName.clear();
99
+ this.entriesByDir.clear();
100
+ this.duplicates.length = 0;
101
+ this.missingSkillMd.length = 0;
102
+ this.loadErrors.length = 0;
103
+ this.cachedCandidates = null;
104
+ const sorted = dirents.filter((e) => e.isDirectory() && !e.name.startsWith('.')).sort((a, b) => a.name.localeCompare(b.name));
105
+ for (const entry of sorted) {
106
+ signal?.throwIfAborted();
107
+ const skillPath = join(this.skillDir, entry.name, 'SKILL.md');
108
+ try {
109
+ await stat(skillPath);
110
+ }
111
+ catch (err) {
112
+ const code = err?.code;
113
+ logger?.debug?.(`[SkillCatalog] skip ${entry.name}: no SKILL.md (${code ?? String(err)})`);
114
+ this.missingSkillMd.push(entry.name);
115
+ continue;
116
+ }
117
+ let doc;
118
+ try {
119
+ doc = await SkillDocument.fromFile(skillPath, signal);
120
+ }
121
+ catch (err) {
122
+ const msg = String(err?.message ?? err);
123
+ logger?.warn(`[SkillCatalog] skip ${skillPath}: parse failed — ${msg}`);
124
+ this.loadErrors.push({ path: skillPath, error: msg });
125
+ continue;
126
+ }
127
+ if (this.entriesByName.has(doc.name)) {
128
+ logger?.warn(`[SkillCatalog] skip ${skillPath}: duplicate skill name "${doc.name}"`);
129
+ this.duplicates.push(doc.name);
130
+ continue;
131
+ }
132
+ const nameDrift = doc.name !== entry.name;
133
+ if (nameDrift) {
134
+ logger?.warn(`[SkillCatalog] skill name "${doc.name}" != directory "${entry.name}" (using frontmatter)`);
135
+ }
136
+ const catalogEntry = {
137
+ directoryName: entry.name,
138
+ skillPath,
139
+ document: doc,
140
+ nameDrift,
141
+ };
142
+ this.entriesByName.set(doc.name, catalogEntry);
143
+ this.entriesByDir.set(entry.name, catalogEntry);
144
+ }
145
+ this.lastScannedMtimeMs = dirStat.mtimeMs;
146
+ }
147
+ /**
148
+ * 映射当前有效技能为 DSH SkillCandidate 快照。
149
+ * 自动按 mtime 评估有效性,未变动时直接复用不可变快照,零重复读盘。
150
+ */
151
+ async listCandidates(providerName, rank, options) {
152
+ options?.signal?.throwIfAborted();
153
+ const needsScan = options?.forceScan ||
154
+ this.cachedCandidates === null ||
155
+ this.lastScanProviderName !== providerName ||
156
+ this.lastScanRank !== rank ||
157
+ (await this.isDirModified(options?.signal));
158
+ if (needsScan) {
159
+ await this.scan(options);
160
+ const list = [];
161
+ for (const entry of this.entriesByName.values()) {
162
+ list.push(entry.document.toCandidate(providerName, rank));
163
+ }
164
+ this.cachedCandidates = Object.freeze(list);
165
+ this.lastScanProviderName = providerName;
166
+ this.lastScanRank = rank;
167
+ }
168
+ return this.cachedCandidates;
169
+ }
170
+ /**
171
+ * 根据候选技能的 locator 与名称解析出完整 SkillDefinition。
172
+ * 优先命中内存缓存;若发生热重读,自动自愈更新回内存映射,消除状态撕裂缝隙。
173
+ */
174
+ async getDefinition(candidate, providerName, options) {
175
+ options?.signal?.throwIfAborted();
176
+ const locator = candidate.locator;
177
+ if (!locator?.path)
178
+ return undefined;
179
+ // 优先命中内存缓存
180
+ const cached = this.entriesByName.get(candidate.name);
181
+ if (cached && cached.skillPath === locator.path) {
182
+ return cached.document.toDefinition(providerName);
183
+ }
184
+ // 若缓存未命中则重新从文件读取
185
+ let doc;
186
+ try {
187
+ doc = await SkillDocument.fromFile(locator.path, options?.signal);
188
+ }
189
+ catch (err) {
190
+ if (err?.name === 'AbortError')
191
+ throw err;
192
+ const code = err?.code;
193
+ if (code === 'ENOENT')
194
+ return undefined;
195
+ options?.logger?.warn(`[SkillCatalog] get ${candidate.name}: read failed (${code ?? String(err)})`);
196
+ return undefined;
197
+ }
198
+ if (doc.name !== candidate.name) {
199
+ options?.logger?.warn(`[SkillCatalog] get ${candidate.name}: name drift "${doc.name}" != "${candidate.name}"`);
200
+ return undefined;
201
+ }
202
+ // 自愈回写:将重新读取解析出的文档更新进内部索引,保持状态严格一致
203
+ const dirName = cached?.directoryName ?? candidate.name;
204
+ const updatedEntry = {
205
+ directoryName: dirName,
206
+ skillPath: locator.path,
207
+ document: doc,
208
+ nameDrift: doc.name !== dirName,
209
+ };
210
+ this.entriesByName.set(doc.name, updatedEntry);
211
+ this.entriesByDir.set(dirName, updatedEntry);
212
+ this.cachedCandidates = null; // 快照失效,以便下一轮刷新
213
+ return doc.toDefinition(providerName);
214
+ }
215
+ /**
216
+ * 生成目录健康度与一致性完整体检报告(供 verify 脚本与 CI 质量门禁复用)。
217
+ */
218
+ verifyIntegrity() {
219
+ const entries = Array.from(this.entriesByName.values());
220
+ const ok = this.duplicates.length === 0 && this.loadErrors.length === 0 && entries.every((e) => !e.nameDrift);
221
+ return {
222
+ total: entries.length,
223
+ entries,
224
+ duplicates: [...this.duplicates],
225
+ missingSkillMd: [...this.missingSkillMd],
226
+ errors: [...this.loadErrors],
227
+ ok,
228
+ };
229
+ }
230
+ }
231
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @wenaixi/dsh-superpower — SkillDocument 深度模块
3
+ *
4
+ * 封装单个技能文档的读取、BOM/CRLF 归一化、YAML frontmatter 解析、
5
+ * 规范字段与调用策略校验,以及向 SkillCandidate 和 SkillDefinition 的契约映射。
6
+ *
7
+ * 核心原则:
8
+ * - Depth: 将大量文件 I/O、边界扫描、YAML 解析与类型收敛封装在紧凑的小接口后;
9
+ * - Locality: 所有 frontmatter 规则与校验逻辑内聚于此;
10
+ * - Test Surface: 对外暴露规范接口,成为运行时与验证脚本的共同测试表面。
11
+ */
12
+ import type { SkillCandidate, SkillDefinition } from '@deepseek-ai/dsh-skill';
13
+ export interface SkillInvocationPolicy {
14
+ modelInvocable: boolean;
15
+ userInvocable: boolean;
16
+ }
17
+ export interface SkillDocumentData {
18
+ name: string;
19
+ description: string;
20
+ whenToUse?: string;
21
+ invocation: SkillInvocationPolicy;
22
+ metadata?: Record<string, unknown>;
23
+ extra: Record<string, unknown>;
24
+ }
25
+ export declare class SkillDocument {
26
+ readonly path: string;
27
+ readonly name: string;
28
+ readonly description: string;
29
+ readonly whenToUse?: string;
30
+ readonly invocation: SkillInvocationPolicy;
31
+ readonly metadata?: Record<string, unknown>;
32
+ readonly body: string;
33
+ readonly rawFrontmatterData: Record<string, unknown>;
34
+ private constructor();
35
+ /**
36
+ * 从指定文件路径异步解析 SkillDocument。
37
+ */
38
+ static fromFile(filePath: string, signal?: AbortSignal): Promise<SkillDocument>;
39
+ /**
40
+ * 从内存中的原始 markdown 字符串直接解析(用于测试或动态构建)。
41
+ */
42
+ static fromString(raw: string, filePath?: string): SkillDocument;
43
+ /**
44
+ * 映射为 DSH SkillCandidate 契约对象。
45
+ */
46
+ toCandidate(providerName: string, rank: number): SkillCandidate;
47
+ /**
48
+ * 映射为 DSH SkillDefinition 契约对象。
49
+ */
50
+ toDefinition(providerName: string): SkillDefinition;
51
+ }
52
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAG7E,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,qBAAqB,CAAA;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AA+FD,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEpD,OAAO;IA6BP;;OAEG;WACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAWrF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,aAAa;IAKpE;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;IAiB/D;;OAEG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe;CAepD"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * @wenaixi/dsh-superpower — SkillDocument 深度模块
3
+ *
4
+ * 封装单个技能文档的读取、BOM/CRLF 归一化、YAML frontmatter 解析、
5
+ * 规范字段与调用策略校验,以及向 SkillCandidate 和 SkillDefinition 的契约映射。
6
+ *
7
+ * 核心原则:
8
+ * - Depth: 将大量文件 I/O、边界扫描、YAML 解析与类型收敛封装在紧凑的小接口后;
9
+ * - Locality: 所有 frontmatter 规则与校验逻辑内聚于此;
10
+ * - Test Surface: 对外暴露规范接口,成为运行时与验证脚本的共同测试表面。
11
+ */
12
+ import { readFile } from 'node:fs/promises';
13
+ import { dirname } from 'node:path';
14
+ import { parse } from 'yaml';
15
+ import { isSkillName } from '@deepseek-ai/dsh-skill';
16
+ // ---------------------------------------------------------------------------
17
+ // 内部纯工具函数(封装在模块内部,不泄漏给外部调用方)
18
+ // ---------------------------------------------------------------------------
19
+ function stringField(data, key) {
20
+ const v = data[key];
21
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
22
+ }
23
+ function optionalString(data, key) {
24
+ const v = data[key];
25
+ return typeof v === 'string' && v.length > 0 ? { [key]: v } : {};
26
+ }
27
+ function frontmatterBoolean(data, key) {
28
+ if (!Object.hasOwn(data, key))
29
+ return undefined;
30
+ const v = data[key];
31
+ if (typeof v === 'boolean')
32
+ return v;
33
+ if (v === 1 || v === '1')
34
+ return true;
35
+ if (v === 0 || v === '0')
36
+ return false;
37
+ if (typeof v === 'string') {
38
+ switch (v.toLowerCase()) {
39
+ case 'true':
40
+ case 'yes':
41
+ case 'on':
42
+ return true;
43
+ case 'false':
44
+ case 'no':
45
+ case 'off':
46
+ return false;
47
+ }
48
+ }
49
+ throw new TypeError(`frontmatter field "${key}" must be a boolean`);
50
+ }
51
+ function rejectLegacyKey(data, legacy, canonical) {
52
+ if (Object.hasOwn(data, legacy)) {
53
+ throw new Error(`frontmatter field "${legacy}" is unsupported; use "${canonical}"`);
54
+ }
55
+ }
56
+ function parseInvocationPolicy(data) {
57
+ rejectLegacyKey(data, 'disableModelInvocation', 'disable-model-invocation');
58
+ rejectLegacyKey(data, 'modelInvocable', 'disable-model-invocation');
59
+ rejectLegacyKey(data, 'userInvocable', 'user-invocable');
60
+ const disableModelInvocation = frontmatterBoolean(data, 'disable-model-invocation');
61
+ const userInvocable = frontmatterBoolean(data, 'user-invocable');
62
+ return {
63
+ modelInvocable: disableModelInvocation !== true,
64
+ userInvocable: userInvocable !== false,
65
+ };
66
+ }
67
+ function findClosingFrontmatter(raw, start) {
68
+ let lineStart = start;
69
+ while (lineStart <= raw.length) {
70
+ const nl = raw.indexOf('\n', lineStart);
71
+ const lineEnd = nl < 0 ? raw.length : nl;
72
+ if (raw.slice(lineStart, lineEnd).replace(/\r$/, '') === '---') {
73
+ return { start: lineStart, bodyStart: nl < 0 ? raw.length : nl + 1 };
74
+ }
75
+ if (nl < 0)
76
+ return undefined;
77
+ lineStart = nl + 1;
78
+ }
79
+ return undefined;
80
+ }
81
+ function extractFrontmatter(raw) {
82
+ // 去除 Windows 编辑器易带的 UTF-8 BOM 头
83
+ let content = raw.charCodeAt(0) === 0xfeff ? raw.slice(1) : raw;
84
+ const firstNl = content.indexOf('\n');
85
+ if (firstNl < 0 || content.slice(0, firstNl).replace(/\r$/, '') !== '---') {
86
+ throw new Error('missing opening frontmatter delimiter "---"');
87
+ }
88
+ const start = firstNl + 1;
89
+ const closing = findClosingFrontmatter(content, start);
90
+ if (!closing) {
91
+ throw new Error('missing closing frontmatter delimiter "---"');
92
+ }
93
+ const parsed = parse(content.slice(start, closing.start));
94
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
95
+ throw new Error('frontmatter must be a YAML object mapping');
96
+ }
97
+ return {
98
+ data: parsed,
99
+ body: content.slice(closing.bodyStart),
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // SkillDocument 深度模块
104
+ // ---------------------------------------------------------------------------
105
+ export class SkillDocument {
106
+ path;
107
+ name;
108
+ description;
109
+ whenToUse;
110
+ invocation;
111
+ metadata;
112
+ body;
113
+ rawFrontmatterData;
114
+ constructor(filePath, extracted) {
115
+ this.path = filePath;
116
+ this.rawFrontmatterData = extracted.data;
117
+ this.body = extracted.body;
118
+ const skillName = stringField(extracted.data, 'name');
119
+ if (!skillName) {
120
+ throw new Error(`skill at "${filePath}" is missing required frontmatter field "name"`);
121
+ }
122
+ if (!isSkillName(skillName)) {
123
+ throw new Error(`invalid skill name "${skillName}" at "${filePath}" (must be kebab-case)`);
124
+ }
125
+ this.name = skillName;
126
+ const desc = stringField(extracted.data, 'description');
127
+ if (!desc) {
128
+ throw new Error(`skill "${skillName}" at "${filePath}" is missing required frontmatter field "description"`);
129
+ }
130
+ this.description = desc;
131
+ this.whenToUse = stringField(extracted.data, 'whenToUse');
132
+ this.invocation = parseInvocationPolicy(extracted.data);
133
+ const meta = extracted.data['metadata'];
134
+ if (typeof meta === 'object' && meta !== null && !Array.isArray(meta)) {
135
+ this.metadata = meta;
136
+ }
137
+ }
138
+ /**
139
+ * 从指定文件路径异步解析 SkillDocument。
140
+ */
141
+ static async fromFile(filePath, signal) {
142
+ signal?.throwIfAborted();
143
+ const raw = await readFile(filePath, {
144
+ encoding: 'utf8',
145
+ signal,
146
+ });
147
+ signal?.throwIfAborted();
148
+ const extracted = extractFrontmatter(raw);
149
+ return new SkillDocument(filePath, extracted);
150
+ }
151
+ /**
152
+ * 从内存中的原始 markdown 字符串直接解析(用于测试或动态构建)。
153
+ */
154
+ static fromString(raw, filePath = 'SKILL.md') {
155
+ const extracted = extractFrontmatter(raw);
156
+ return new SkillDocument(filePath, extracted);
157
+ }
158
+ /**
159
+ * 映射为 DSH SkillCandidate 契约对象。
160
+ */
161
+ toCandidate(providerName, rank) {
162
+ const dir = dirname(this.path);
163
+ return {
164
+ name: this.name,
165
+ description: this.description,
166
+ ...(this.whenToUse ? { whenToUse: this.whenToUse } : {}),
167
+ invocation: this.invocation,
168
+ source: 'bundled',
169
+ provider: providerName,
170
+ rank,
171
+ locator: { path: this.path, directory: dir },
172
+ resourceBase: { kind: 'directory', path: dir },
173
+ path: this.path,
174
+ ...(this.metadata ? { metadata: this.metadata } : {}),
175
+ };
176
+ }
177
+ /**
178
+ * 映射为 DSH SkillDefinition 契约对象。
179
+ */
180
+ toDefinition(providerName) {
181
+ const dir = dirname(this.path);
182
+ return {
183
+ name: this.name,
184
+ description: this.description,
185
+ ...(this.whenToUse ? { whenToUse: this.whenToUse } : {}),
186
+ invocation: this.invocation,
187
+ source: 'bundled',
188
+ provider: providerName,
189
+ resourceBase: { kind: 'directory', path: dir },
190
+ path: this.path,
191
+ ...(this.metadata ? { metadata: this.metadata } : {}),
192
+ content: this.body.trim(),
193
+ };
194
+ }
195
+ }
196
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@
7
7
  */
8
8
  import type { Context } from '@deepseek-ai/cordis';
9
9
  import Schema from '@deepseek-ai/schemastery';
10
+ import { SkillCatalog } from './catalog.js';
11
+ import { SkillDocument } from './document.js';
12
+ export { SkillCatalog } from './catalog.js';
13
+ export { SkillDocument } from './document.js';
10
14
  export declare const Config: Schema<Schemastery.ObjectS<{
11
15
  /** 注册到 ctx.skills 的 provider 名称,默认为 superpowers;不可为保留名 runtime */
12
16
  providerName: Schema<string, string>;
@@ -40,6 +44,8 @@ declare const _default: {
40
44
  skillDir: Schema<string, string>;
41
45
  }>>;
42
46
  apply: typeof apply;
47
+ SkillDocument: typeof SkillDocument;
48
+ SkillCatalog: typeof SkillCatalog;
43
49
  };
44
50
  export default _default;
45
51
  //# sourceMappingURL=superpowers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AASlD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAM7C,eAAO,MAAM,MAAM;IACjB,kEAAkE;;IAElE,8CAA8C;;;IAF9C,kEAAkE;;IAElE,8CAA8C;;GAEF,CAAA;AAE9C,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,MAAM,qBAAsB,CAAA;AA4RzC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqBxD;;;;;QAjUC,kEAAkE;;QAElE,8CAA8C;;;QAF9C,kEAAkE;;QAElE,8CAA8C;;;;;AAiUhD,wBAA8C"}
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;AAQlD,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAM7C,eAAO,MAAM,MAAM;IACjB,kEAAkE;;IAElE,8CAA8C;;;IAF9C,kEAAkE;;IAElE,8CAA8C;;GAEF,CAAA;AAE9C,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,IAAI,gBAAgB,CAAA;AACjC,eAAO,MAAM,MAAM,qBAAsB,CAAA;AA6DzC,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0BxD;;;;;QAvGC,kEAAkE;;QAElE,8CAA8C;;;QAF9C,kEAAkE;;QAElE,8CAA8C;;;;;;;AAuGhD,wBAA2E"}