@wenaixi/dsh-superpower 6.3.1 → 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 (93) hide show
  1. package/README.md +30 -24
  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 +9 -2
  11. package/lib/superpowers.d.ts.map +1 -1
  12. package/lib/superpowers.js +33 -253
  13. package/lib/superpowers.js.map +1 -1
  14. package/package.json +4 -4
  15. package/skills/{superpower-brainstorming → brainstorming}/SKILL.md +51 -35
  16. package/skills/{superpower-brainstorming → brainstorming}/scripts/server.cjs +6 -14
  17. package/skills/{superpower-brainstorming → brainstorming}/scripts/start-server.sh +1 -6
  18. package/skills/{superpower-brainstorming → brainstorming}/spec-document-reviewer-prompt.md +4 -4
  19. package/skills/{superpower-brainstorming → brainstorming}/visual-companion.md +8 -34
  20. package/skills/diagnosing-superpowers/SKILL.md +58 -0
  21. package/skills/diagnosing-superpowers/prompts/analyst-common.md +24 -0
  22. package/skills/diagnosing-superpowers/prompts/cost-and-time.md +12 -0
  23. package/skills/diagnosing-superpowers/prompts/plan-adherence.md +15 -0
  24. package/skills/diagnosing-superpowers/prompts/quality-evidence.md +11 -0
  25. package/skills/diagnosing-superpowers/prompts/repeated-work.md +19 -0
  26. package/skills/diagnosing-superpowers/prompts/request-conflicts.md +11 -0
  27. package/skills/diagnosing-superpowers/prompts/scrub-audit.md +20 -0
  28. package/skills/diagnosing-superpowers/prompts/scrub.md +16 -0
  29. package/skills/diagnosing-superpowers/prompts/similar-session.md +30 -0
  30. package/skills/diagnosing-superpowers/prompts/skill-timeline.md +16 -0
  31. package/skills/diagnosing-superpowers/prompts/stumbles.md +16 -0
  32. package/skills/diagnosing-superpowers/references/context-safety.md +14 -0
  33. package/skills/diagnosing-superpowers/references/github-issues.md +39 -0
  34. package/skills/diagnosing-superpowers/references/redaction-policy.md +22 -0
  35. package/skills/diagnosing-superpowers/references/session-discovery.md +20 -0
  36. package/skills/diagnosing-superpowers/templates/bundle-README.md +51 -0
  37. package/skills/diagnosing-superpowers/templates/case.md +57 -0
  38. package/skills/diagnosing-superpowers/templates/issue.md +45 -0
  39. package/skills/diagnosing-superpowers/templates/report.md +76 -0
  40. package/skills/{superpower-dispatching-parallel-agents → dispatching-parallel-agents}/SKILL.md +31 -31
  41. package/skills/executing-plans/SKILL.md +227 -0
  42. package/skills/executing-plans/scripts/task-done +52 -0
  43. package/skills/executing-plans/scripts/task-start +28 -0
  44. package/skills/{superpower-finishing-a-development-branch → finishing-a-development-branch}/SKILL.md +18 -18
  45. package/skills/{superpower-receiving-code-review → receiving-code-review}/SKILL.md +39 -39
  46. package/skills/{superpower-requesting-code-review → requesting-code-review}/SKILL.md +11 -11
  47. package/skills/{superpower-requesting-code-review → requesting-code-review}/code-reviewer.md +15 -7
  48. package/skills/subagent-driven-development/SKILL.md +355 -0
  49. package/skills/{superpower-subagent-driven-development → subagent-driven-development}/implementer-prompt.md +10 -10
  50. package/skills/subagent-driven-development/re-review-prompt.md +83 -0
  51. package/skills/{superpower-subagent-driven-development → subagent-driven-development}/scripts/review-package +8 -1
  52. package/skills/subagent-driven-development/scripts/sdd-workspace +82 -0
  53. package/skills/{superpower-subagent-driven-development → subagent-driven-development}/scripts/task-brief +3 -1
  54. package/skills/{superpower-subagent-driven-development → subagent-driven-development}/task-reviewer-prompt.md +27 -27
  55. package/skills/{superpower-systematic-debugging → systematic-debugging}/CREATION-LOG.md +9 -9
  56. package/skills/{superpower-systematic-debugging → systematic-debugging}/SKILL.md +8 -8
  57. package/skills/{superpower-systematic-debugging → systematic-debugging}/condition-based-waiting.md +9 -9
  58. package/skills/{superpower-systematic-debugging → systematic-debugging}/defense-in-depth.md +1 -1
  59. package/skills/{superpower-systematic-debugging → systematic-debugging}/find-polluter.sh +4 -4
  60. package/skills/{superpower-systematic-debugging → systematic-debugging}/root-cause-tracing.md +2 -2
  61. package/skills/{superpower-systematic-debugging → systematic-debugging}/test-pressure-1.md +1 -1
  62. package/skills/{superpower-systematic-debugging → systematic-debugging}/test-pressure-3.md +1 -1
  63. package/skills/{superpower-test-driven-development → test-driven-development}/SKILL.md +16 -14
  64. package/skills/{superpower-test-driven-development → test-driven-development}/writing-good-tests.md +29 -29
  65. package/skills/{superpower-using-git-worktrees → using-git-worktrees}/SKILL.md +12 -12
  66. package/skills/{superpower-using-superpowers → using-superpowers}/SKILL.md +8 -12
  67. package/skills/{superpower-using-superpowers → using-superpowers}/references/dsh-tools.md +8 -8
  68. package/skills/{superpower-verification-before-completion → verification-before-completion}/SKILL.md +17 -17
  69. package/skills/writing-plans/SKILL.md +167 -0
  70. package/skills/{superpower-writing-skills → writing-skills}/SKILL.md +75 -73
  71. package/skills/{superpower-writing-skills → writing-skills}/persuasion-principles.md +10 -10
  72. package/skills/{superpower-writing-skills → writing-skills}/testing-skills-with-subagents.md +53 -53
  73. package/skills/superpower-executing-plans/SKILL.md +0 -64
  74. package/skills/superpower-subagent-driven-development/SKILL.md +0 -347
  75. package/skills/superpower-subagent-driven-development/re-review-prompt.md +0 -83
  76. package/skills/superpower-subagent-driven-development/scripts/sdd-workspace +0 -40
  77. package/skills/superpower-using-superpowers/references/antigravity-tools.md +0 -23
  78. package/skills/superpower-using-superpowers/references/codex-tools.md +0 -108
  79. package/skills/superpower-using-superpowers/references/gemini-tools.md +0 -63
  80. package/skills/superpower-using-superpowers/references/hermes-tools.md +0 -56
  81. package/skills/superpower-using-superpowers/references/pi-tools.md +0 -16
  82. package/skills/superpower-writing-plans/SKILL.md +0 -160
  83. package/skills/superpower-writing-plans/plan-document-reviewer-prompt.md +0 -49
  84. package/skills/superpower-writing-skills/anthropic-best-practices.md +0 -1146
  85. package/skills/superpower-writing-skills/examples/CLAUDE_MD_TESTING.md +0 -188
  86. /package/skills/{superpower-brainstorming → brainstorming}/scripts/frame-template.html +0 -0
  87. /package/skills/{superpower-brainstorming → brainstorming}/scripts/helper.js +0 -0
  88. /package/skills/{superpower-brainstorming → brainstorming}/scripts/stop-server.sh +0 -0
  89. /package/skills/{superpower-systematic-debugging → systematic-debugging}/condition-based-waiting-example.ts +0 -0
  90. /package/skills/{superpower-systematic-debugging → systematic-debugging}/test-academic.md +0 -0
  91. /package/skills/{superpower-systematic-debugging → systematic-debugging}/test-pressure-2.md +0 -0
  92. /package/skills/{superpower-writing-skills → writing-skills}/graphviz-conventions.dot +0 -0
  93. /package/skills/{superpower-writing-skills → writing-skills}/render-graphs.js +0 -0
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 完整移植 — 14 个技能注入 `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,15 +26,15 @@ dsh --profile web --dump-config | grep -A2 "@wenaixi/dsh-superpower"
26
26
  dsh --profile web # 进会话,技能自动可用
27
27
  ```
28
28
 
29
- > 如需锁定版本,在包名后追加 `@<version>`(如 `@wenaixi/dsh-superpower@<version>`)或 `#v<version>`(GitHub 形式)。
29
+ > 如需锁定版本,在包名后追加 `@<version>`(如 `@wenaixi/dsh-superpower@7.0.1`)或 `#v7.0.1`(GitHub 形式)。
30
30
  >
31
- > > ⚠️ 旧名 `dsh-superpower`(无 scope)已废弃并 `npm deprecate`,请改用 `@wenaixi/dsh-superpower`。
31
+ > > 旧名 `dsh-superpower`(无 scope)已废弃并 `npm deprecate`,请改用 `@wenaixi/dsh-superpower`。
32
32
 
33
33
  其它:
34
34
 
35
35
  ```bash
36
36
  git clone https://github.com/Wenaixi/dsh-superpower.git && cd dsh-superpower
37
- pnpm install && pnpm build && node scripts/verify.mjs # 14/14 PASS
37
+ pnpm install && pnpm build && node scripts/verify.mjs # 15/15 PASS
38
38
  dsh plugin --profile web add ./ # 本地路径安装
39
39
  pnpm pack && dsh plugin --profile web add ./wenaixi-dsh-superpower-*.tgz # 离线 tarball
40
40
 
@@ -51,46 +51,52 @@ dsh plugin --profile web remove @wenaixi/dsh-superpower
51
51
 
52
52
  | 技能 | 触发时机 |
53
53
  |---|---|
54
- | `superpower-using-superpowers` | 任意会话起点(1% 原则) |
55
- | `superpower-brainstorming` | 新功能前,Spike / Bounded / Architectural 分级 |
56
- | `superpower-writing-plans` | 设计获批后,切 2–5 分钟任务 |
57
- | `superpower-using-git-worktrees` | 隔离分支 |
58
- | `superpower-executing-plans` / `superpower-subagent-driven-development` | 按计划执行,后者每任务一子智能体 + 两阶段评审 |
59
- | `superpower-dispatching-parallel-agents` | 并行分发 |
60
- | `superpower-test-driven-development` | RED-GREEN-REFACTOR |
61
- | `superpower-systematic-debugging` / `superpower-verification-before-completion` | 调试闭环 |
62
- | `superpower-requesting-code-review` / `superpower-receiving-code-review` | 评审 |
63
- | `superpower-finishing-a-development-branch` | 集成 |
64
- | `superpower-writing-skills` | 写新技能 |
65
-
66
- 映射:`Bash→pwsh`、`Read/Write→fs` 等见 `skills/superpower-using-superpowers/references/dsh-tools.md`。
54
+ | `using-superpowers` | 任意会话起点(1% 原则) |
55
+ | `brainstorming` | 新功能前,Spike / Bounded / Architectural 分级 |
56
+ | `writing-plans` | 设计获批后,切"一项可校验结果的动作"任务 |
57
+ | `using-git-worktrees` | 隔离分支 |
58
+ | `executing-plans` / `subagent-driven-development` | 按计划执行,前者内联整跑一次终审,后者每任务一 subagent + 两阶段评审 |
59
+ | `dispatching-parallel-agents` | 并行分发 |
60
+ | `test-driven-development` | RED-GREEN-REFACTOR |
61
+ | `systematic-debugging` / `verification-before-completion` | 调试闭环 |
62
+ | `requesting-code-review` / `receiving-code-review` | 评审 |
63
+ | `diagnosing-superpowers` | 会话出问题后定位根因(`path:line` 证据) |
64
+ | `finishing-a-development-branch` | 集成 |
65
+ | `writing-skills` | 写新技能 |
66
+
67
+ 映射:`Bash→pwsh`、`Read/Write→fs` 等见 `skills/using-superpowers/references/dsh-tools.md`。
68
+
69
+ > **同名技能优先(本插件优先级最高)**:官方注册表同层重名按 `rank → 提供方顺序 → 本地顺序` 裁决,**rank 越小优先级越高**;本包 rank 10 小于 `dsh-skill-filesystem` 的项目/用户根(100–500)与官方内置 bundled(600),因此与本包同名的本地技能(`~/.dsh/skills`、项目 `.dsh/skills` 等)或官方 bundled 技能均由本包胜出,本插件技能唯一生效。
67
70
 
68
71
  ## 使用
69
72
 
70
73
  ```
71
- “帮我做 XXX” → superpower-brainstorming → superpower-writing-plans → superpower-subagent-driven-development
72
- “修这个缺陷” → superpower-systematic-debugging
73
- “帮我评审” → superpower-requesting-code-review
74
+ “帮我做 XXX” → brainstorming → writing-plans → subagent-driven-development
75
+ “修这个缺陷” → systematic-debugging
76
+ “帮我评审” → requesting-code-review
77
+ “刚才会话出问题了” → diagnosing-superpowers
74
78
  ```
75
79
 
76
- 校验:`await ctx.skills.list({cwd})` 应有 14 条 `provider: superpowers`。
80
+ 校验:`await ctx.skills.list({cwd})` 应有 15 条 `provider: superpowers`。
77
81
 
78
82
  ## 开发
79
83
 
80
84
  ```bash
81
85
  pnpm install && pnpm build && pnpm typecheck && node scripts/verify.mjs
86
+ node scripts/check-same-name-priority.mjs # 同名优先实测一:自研桩(rank 100/300/500/600 均不抢 / rank 0 可抢)
87
+ node scripts/check-same-name-priority-fs.mjs # 同名优先实测二:官方 dsh-skill-filesystem 同层实测(rank 300 不抢)
82
88
  dsh --profile web --dump-config # 断言 "# == @wenaixi/dsh-superpower"
83
89
  ```
84
90
 
85
91
  ## 目录
86
92
 
87
93
  ```
88
- src/superpowers.ts # SkillProvider rank 550
89
- skills/ # 14 技能(中文化)
94
+ src/superpowers.ts # SkillProvider rank 10(本插件技能优先级最高)
95
+ skills/ # 15 技能(中文化,v7.0.0 起无 superpower- 前缀)
90
96
  lib/ # 已提交,GitHub 直装零构建
91
97
  ```
92
98
 
93
- 版本:`v6.3.1` 起本仓库脱离上游独立演进(上游基准锁定 `obra/superpowers v6.3.0`),后续变更以正式版本线发布;`tag v*` 触发发布,`push` 仅跑 CI。详见 `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`。
94
100
 
95
101
  ## 常见问题
96
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"}