@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.
- package/README.md +3 -3
- package/lib/catalog.d.ts +83 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +231 -0
- package/lib/catalog.js.map +1 -0
- package/lib/document.d.ts +52 -0
- package/lib/document.d.ts.map +1 -0
- package/lib/document.js +196 -0
- package/lib/document.js.map +1 -0
- package/lib/superpowers.d.ts +6 -0
- package/lib/superpowers.d.ts.map +1 -1
- package/lib/superpowers.js +27 -250
- package/lib/superpowers.js.map +1 -1
- package/package.json +1 -1
- package/skills/brainstorming/SKILL.md +1 -1
- package/skills/brainstorming/scripts/server.cjs +6 -14
- package/skills/brainstorming/scripts/start-server.sh +1 -6
- package/skills/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/skills/brainstorming/visual-companion.md +5 -31
- package/skills/diagnosing-superpowers/SKILL.md +1 -1
- package/skills/diagnosing-superpowers/prompts/request-conflicts.md +1 -1
- package/skills/diagnosing-superpowers/templates/issue.md +1 -1
- package/skills/dispatching-parallel-agents/SKILL.md +4 -4
- package/skills/executing-plans/SKILL.md +5 -5
- package/skills/finishing-a-development-branch/SKILL.md +5 -5
- package/skills/receiving-code-review/SKILL.md +1 -1
- package/skills/requesting-code-review/SKILL.md +1 -1
- package/skills/requesting-code-review/code-reviewer.md +1 -1
- package/skills/subagent-driven-development/SKILL.md +2 -2
- package/skills/subagent-driven-development/implementer-prompt.md +1 -1
- package/skills/subagent-driven-development/re-review-prompt.md +1 -1
- package/skills/subagent-driven-development/scripts/sdd-workspace +2 -2
- package/skills/subagent-driven-development/task-reviewer-prompt.md +1 -1
- package/skills/systematic-debugging/CREATION-LOG.md +2 -2
- package/skills/systematic-debugging/SKILL.md +2 -2
- package/skills/systematic-debugging/condition-based-waiting.md +3 -3
- package/skills/systematic-debugging/defense-in-depth.md +1 -1
- package/skills/systematic-debugging/root-cause-tracing.md +1 -1
- package/skills/systematic-debugging/test-pressure-3.md +1 -1
- package/skills/test-driven-development/SKILL.md +1 -1
- package/skills/test-driven-development/writing-good-tests.md +1 -1
- package/skills/using-git-worktrees/SKILL.md +1 -1
- package/skills/using-superpowers/SKILL.md +4 -10
- package/skills/using-superpowers/references/dsh-tools.md +3 -3
- package/skills/verification-before-completion/SKILL.md +1 -1
- package/skills/writing-plans/SKILL.md +1 -1
- package/skills/writing-skills/SKILL.md +6 -6
- package/skills/writing-skills/testing-skills-with-subagents.md +1 -1
- package/skills/using-superpowers/references/antigravity-tools.md +0 -23
- package/skills/using-superpowers/references/claude-code-tools.md +0 -11
- package/skills/using-superpowers/references/codex-tools.md +0 -108
- package/skills/using-superpowers/references/gemini-tools.md +0 -63
- package/skills/using-superpowers/references/hermes-tools.md +0 -56
- package/skills/using-superpowers/references/muse-tools.md +0 -35
- package/skills/using-superpowers/references/pi-tools.md +0 -16
- package/skills/writing-skills/anthropic-best-practices.md +0 -1146
- package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -188
package/lib/superpowers.js
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* 通过 ctx.skills.registerProvider 注入全局层,rank 10 使本插件技能优先级最高:
|
|
6
6
|
* 小于 dsh-skill-filesystem 的项目/用户根(100–500)与官方 bundled(600)。
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import { dirname, join, resolve } from 'node:path';
|
|
8
|
+
import { dirname, resolve } from 'node:path';
|
|
10
9
|
import { fileURLToPath } from 'node:url';
|
|
11
|
-
import { parse } from 'yaml';
|
|
12
|
-
import { isSkillName } from '@deepseek-ai/dsh-skill';
|
|
13
10
|
import Schema from '@deepseek-ai/schemastery';
|
|
11
|
+
import { SkillCatalog } from './catalog.js';
|
|
12
|
+
import { SkillDocument } from './document.js';
|
|
13
|
+
// 具名导出深度模块,为验证治理与测试表面提供统一深度接口
|
|
14
|
+
export { SkillCatalog } from './catalog.js';
|
|
15
|
+
export { SkillDocument } from './document.js';
|
|
14
16
|
// ---------------------------------------------------------------------------
|
|
15
17
|
// Config — 默认值写在 schema 里;可选字段用可选属性声明
|
|
16
18
|
// ---------------------------------------------------------------------------
|
|
@@ -26,7 +28,7 @@ export const Config = Schema.object({
|
|
|
26
28
|
export const name = 'superpowers';
|
|
27
29
|
export const inject = ['skills'];
|
|
28
30
|
// ---------------------------------------------------------------------------
|
|
29
|
-
//
|
|
31
|
+
// 常量与校验
|
|
30
32
|
// ---------------------------------------------------------------------------
|
|
31
33
|
// 本插件技能优先级最高:rank 值越小优先级越高(官方注册表升序裁决),
|
|
32
34
|
// 10 低于 filesystem 项目/用户根(100–500) 与官方 bundled(600)。
|
|
@@ -37,92 +39,6 @@ function assertNotRuntimeProvider(providerName) {
|
|
|
37
39
|
throw new Error(`[superpowers] providerName "${RUNTIME_PROVIDER}" 为保留名,不可用`);
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
|
-
function stringField(data, key) {
|
|
41
|
-
const v = data[key];
|
|
42
|
-
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
43
|
-
}
|
|
44
|
-
function optionalString(data, key) {
|
|
45
|
-
const v = data[key];
|
|
46
|
-
return typeof v === 'string' && v.length > 0 ? { [key]: v } : {};
|
|
47
|
-
}
|
|
48
|
-
function frontmatterBoolean(data, key) {
|
|
49
|
-
if (!Object.hasOwn(data, key))
|
|
50
|
-
return undefined;
|
|
51
|
-
const v = data[key];
|
|
52
|
-
if (typeof v === 'boolean')
|
|
53
|
-
return v;
|
|
54
|
-
if (v === 1 || v === '1')
|
|
55
|
-
return true;
|
|
56
|
-
if (v === 0 || v === '0')
|
|
57
|
-
return false;
|
|
58
|
-
if (typeof v === 'string') {
|
|
59
|
-
switch (v.toLowerCase()) {
|
|
60
|
-
case 'true':
|
|
61
|
-
case 'yes':
|
|
62
|
-
case 'on':
|
|
63
|
-
return true;
|
|
64
|
-
case 'false':
|
|
65
|
-
case 'no':
|
|
66
|
-
case 'off':
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
throw new TypeError(`frontmatter field "${key}" must be a boolean`);
|
|
71
|
-
}
|
|
72
|
-
function rejectLegacyKey(data, legacy, canonical) {
|
|
73
|
-
if (Object.hasOwn(data, legacy)) {
|
|
74
|
-
throw new Error(`frontmatter field "${legacy}" is unsupported; use "${canonical}"`);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function parseInvocationPolicy(data) {
|
|
78
|
-
rejectLegacyKey(data, 'disableModelInvocation', 'disable-model-invocation');
|
|
79
|
-
rejectLegacyKey(data, 'modelInvocable', 'disable-model-invocation');
|
|
80
|
-
rejectLegacyKey(data, 'userInvocable', 'user-invocable');
|
|
81
|
-
const disableModelInvocation = frontmatterBoolean(data, 'disable-model-invocation');
|
|
82
|
-
const userInvocable = frontmatterBoolean(data, 'user-invocable');
|
|
83
|
-
return {
|
|
84
|
-
modelInvocable: disableModelInvocation !== true,
|
|
85
|
-
userInvocable: userInvocable !== false,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
function optionalMetadata(data) {
|
|
89
|
-
const v = data['metadata'];
|
|
90
|
-
if (typeof v === 'object' && v !== null && !Array.isArray(v))
|
|
91
|
-
return { metadata: v };
|
|
92
|
-
return {};
|
|
93
|
-
}
|
|
94
|
-
function findClosingFrontmatter(raw, start) {
|
|
95
|
-
let lineStart = start;
|
|
96
|
-
while (lineStart <= raw.length) {
|
|
97
|
-
const nl = raw.indexOf('\n', lineStart);
|
|
98
|
-
const lineEnd = nl < 0 ? raw.length : nl;
|
|
99
|
-
if (raw.slice(lineStart, lineEnd).replace(/\r$/, '') === '---') {
|
|
100
|
-
return { start: lineStart, bodyStart: nl < 0 ? raw.length : nl + 1 };
|
|
101
|
-
}
|
|
102
|
-
if (nl < 0)
|
|
103
|
-
return undefined;
|
|
104
|
-
lineStart = nl + 1;
|
|
105
|
-
}
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
function parseFrontmatter(raw) {
|
|
109
|
-
// 去 BOM:Windows 编辑器易带 \uFEFF,导致首行非 --- 而被静默跳过
|
|
110
|
-
if (raw.charCodeAt(0) === 0xfeff)
|
|
111
|
-
raw = raw.slice(1);
|
|
112
|
-
const firstNl = raw.indexOf('\n');
|
|
113
|
-
if (firstNl < 0)
|
|
114
|
-
return undefined;
|
|
115
|
-
if (raw.slice(0, firstNl).replace(/\r$/, '') !== '---')
|
|
116
|
-
return undefined;
|
|
117
|
-
const start = firstNl + 1;
|
|
118
|
-
const closing = findClosingFrontmatter(raw, start);
|
|
119
|
-
if (!closing)
|
|
120
|
-
return undefined;
|
|
121
|
-
const parsed = parse(raw.slice(start, closing.start));
|
|
122
|
-
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
123
|
-
return undefined;
|
|
124
|
-
return { data: parsed, body: raw.slice(closing.bodyStart) };
|
|
125
|
-
}
|
|
126
42
|
function resolveDefaultSkillDir(configSkillDir) {
|
|
127
43
|
if (configSkillDir)
|
|
128
44
|
return resolve(configSkillDir);
|
|
@@ -132,175 +48,32 @@ function resolveDefaultSkillDir(configSkillDir) {
|
|
|
132
48
|
return resolve(dirname(here), '..', 'skills');
|
|
133
49
|
}
|
|
134
50
|
// ---------------------------------------------------------------------------
|
|
135
|
-
// Provider
|
|
51
|
+
// Provider 实现 — 纯调度与生命周期治理,具体编目、快照与文档解析委托给 SkillCatalog 深度模块
|
|
136
52
|
// ---------------------------------------------------------------------------
|
|
137
53
|
class SuperpowersProvider {
|
|
138
54
|
name;
|
|
139
|
-
|
|
55
|
+
catalog;
|
|
140
56
|
ctx;
|
|
141
57
|
constructor(ctx, _control, config) {
|
|
142
58
|
assertNotRuntimeProvider(config.providerName);
|
|
143
59
|
this.ctx = ctx;
|
|
144
60
|
this.name = config.providerName;
|
|
145
|
-
|
|
61
|
+
const skillDir = resolveDefaultSkillDir(config.skillDir);
|
|
62
|
+
this.catalog = new SkillCatalog(skillDir);
|
|
146
63
|
}
|
|
147
64
|
async list(options) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
entries = await readdir(this.skillDir, { withFileTypes: true, signal: options.signal });
|
|
154
|
-
}
|
|
155
|
-
catch (err) {
|
|
156
|
-
const code = err?.code;
|
|
157
|
-
if (code === 'ENOENT' || code === 'ENOTDIR') {
|
|
158
|
-
this.ctx.logger.warn(`[superpowers] skillDir not found: ${this.skillDir}`);
|
|
159
|
-
return [];
|
|
160
|
-
}
|
|
161
|
-
throw err;
|
|
162
|
-
}
|
|
163
|
-
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
164
|
-
options.signal?.throwIfAborted();
|
|
165
|
-
if (!entry.isDirectory())
|
|
166
|
-
continue;
|
|
167
|
-
if (entry.name.startsWith('.'))
|
|
168
|
-
continue;
|
|
169
|
-
const skillPath = join(this.skillDir, entry.name, 'SKILL.md');
|
|
170
|
-
try {
|
|
171
|
-
await stat(skillPath);
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
const code = err?.code;
|
|
175
|
-
this.ctx.logger.debug(`[superpowers] skip ${entry.name}: no SKILL.md (${code ?? String(err)})`);
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
let parsed;
|
|
179
|
-
try {
|
|
180
|
-
parsed = await parseSkillFile(skillPath);
|
|
181
|
-
}
|
|
182
|
-
catch (err) {
|
|
183
|
-
this.ctx.logger.warn(`[superpowers] skip ${skillPath}: YAML 解析失败 — ${String(err)}`);
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
if (!parsed) {
|
|
187
|
-
this.ctx.logger.warn(`[superpowers] skip ${entry.name}: missing or invalid frontmatter`);
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
const { data } = parsed;
|
|
191
|
-
const skillName = stringField(data, 'name');
|
|
192
|
-
const description = stringField(data, 'description');
|
|
193
|
-
if (!skillName || !description) {
|
|
194
|
-
this.ctx.logger.warn(`[superpowers] skip ${skillPath}: frontmatter requires name and description`);
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
if (!isSkillName(skillName)) {
|
|
198
|
-
this.ctx.logger.warn(`[superpowers] skip ${skillPath}: invalid skill name "${skillName}"`);
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
if (seen.has(skillName)) {
|
|
202
|
-
this.ctx.logger.warn(`[superpowers] skip ${skillPath}: duplicate skill name "${skillName}"`);
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
205
|
-
// 目录名与 skill name 不一致时以 frontmatter 为准,但打印提示
|
|
206
|
-
if (skillName !== entry.name) {
|
|
207
|
-
this.ctx.logger.warn(`[superpowers] skill name "${skillName}" != directory "${entry.name}" (using frontmatter)`);
|
|
208
|
-
}
|
|
209
|
-
let invocation;
|
|
210
|
-
try {
|
|
211
|
-
invocation = parseInvocationPolicy(data);
|
|
212
|
-
}
|
|
213
|
-
catch (e) {
|
|
214
|
-
this.ctx.logger.warn(`[superpowers] skip ${skillPath}: ${String(e)}`);
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
seen.add(skillName);
|
|
218
|
-
candidates.push({
|
|
219
|
-
name: skillName,
|
|
220
|
-
description,
|
|
221
|
-
...optionalString(data, 'whenToUse'),
|
|
222
|
-
invocation,
|
|
223
|
-
source: 'bundled',
|
|
224
|
-
provider: this.name,
|
|
225
|
-
rank: SUPERPOWERS_RANK,
|
|
226
|
-
locator: { path: skillPath, directory: dirname(skillPath) },
|
|
227
|
-
resourceBase: { kind: 'directory', path: dirname(skillPath) },
|
|
228
|
-
path: skillPath,
|
|
229
|
-
...optionalMetadata(data),
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
return candidates;
|
|
65
|
+
return this.catalog.listCandidates(this.name, SUPERPOWERS_RANK, {
|
|
66
|
+
signal: options.signal,
|
|
67
|
+
logger: this.ctx.logger,
|
|
68
|
+
});
|
|
233
69
|
}
|
|
234
70
|
async get(candidate, options) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
let raw;
|
|
240
|
-
try {
|
|
241
|
-
raw = await readFile(locator.path, {
|
|
242
|
-
encoding: 'utf8',
|
|
243
|
-
signal: options.signal,
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
catch (err) {
|
|
247
|
-
if (err?.name === 'AbortError')
|
|
248
|
-
throw err;
|
|
249
|
-
const code = err?.code;
|
|
250
|
-
if (code === 'ENOENT')
|
|
251
|
-
return undefined;
|
|
252
|
-
this.ctx.logger.warn(`[superpowers] get ${candidate.name}: read failed (${code ?? String(err)})`);
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
if (raw === undefined)
|
|
256
|
-
return undefined;
|
|
257
|
-
options.signal?.throwIfAborted();
|
|
258
|
-
const parsed = parseFrontmatter(raw);
|
|
259
|
-
if (!parsed) {
|
|
260
|
-
this.ctx.logger.warn(`[superpowers] get ${candidate.name}: missing or invalid frontmatter`);
|
|
261
|
-
return undefined;
|
|
262
|
-
}
|
|
263
|
-
const data = parsed.data;
|
|
264
|
-
const skillName = stringField(data, 'name');
|
|
265
|
-
const description = stringField(data, 'description');
|
|
266
|
-
if (!skillName || !description) {
|
|
267
|
-
this.ctx.logger.warn(`[superpowers] get ${candidate.name}: frontmatter requires name and description`);
|
|
268
|
-
return undefined;
|
|
269
|
-
}
|
|
270
|
-
if (skillName !== candidate.name) {
|
|
271
|
-
// 名称漂移视为失效,触发上层 invalidate
|
|
272
|
-
this.ctx.logger.warn(`[superpowers] get ${candidate.name}: name drift "${skillName}" != "${candidate.name}"`);
|
|
273
|
-
return undefined;
|
|
274
|
-
}
|
|
275
|
-
let invocation;
|
|
276
|
-
try {
|
|
277
|
-
invocation = parseInvocationPolicy(data);
|
|
278
|
-
}
|
|
279
|
-
catch (e) {
|
|
280
|
-
this.ctx.logger.warn(`[superpowers] get ${candidate.name}: ${String(e)}`);
|
|
281
|
-
return undefined;
|
|
282
|
-
}
|
|
283
|
-
return {
|
|
284
|
-
name: skillName,
|
|
285
|
-
description,
|
|
286
|
-
...optionalString(data, 'whenToUse'),
|
|
287
|
-
invocation,
|
|
288
|
-
source: 'bundled',
|
|
289
|
-
provider: this.name,
|
|
290
|
-
resourceBase: { kind: 'directory', path: locator.directory },
|
|
291
|
-
path: locator.path,
|
|
292
|
-
...optionalMetadata(data),
|
|
293
|
-
content: parsed.body.trim(),
|
|
294
|
-
};
|
|
71
|
+
return this.catalog.getDefinition(candidate, this.name, {
|
|
72
|
+
signal: options.signal,
|
|
73
|
+
logger: this.ctx.logger,
|
|
74
|
+
});
|
|
295
75
|
}
|
|
296
76
|
}
|
|
297
|
-
async function parseSkillFile(path) {
|
|
298
|
-
const raw = await readFile(path, 'utf8');
|
|
299
|
-
const parsed = parseFrontmatter(raw);
|
|
300
|
-
if (!parsed)
|
|
301
|
-
return undefined;
|
|
302
|
-
return parsed;
|
|
303
|
-
}
|
|
304
77
|
// ---------------------------------------------------------------------------
|
|
305
78
|
// 插件入口 — 所有副作用走 ctx 注册,随 fiber 卸载自动清理
|
|
306
79
|
// ---------------------------------------------------------------------------
|
|
@@ -309,18 +82,22 @@ export function apply(ctx, config) {
|
|
|
309
82
|
ctx.logger.info(`[superpowers] registering provider "${config.providerName}"`);
|
|
310
83
|
// 将 provider 注册与事件监听放入同一个 effect,保证卸载时的清理顺序可控
|
|
311
84
|
ctx.effect(() => {
|
|
85
|
+
let activeProvider;
|
|
312
86
|
const disposeProvider = ctx.skills.registerProvider((control) => {
|
|
313
|
-
|
|
87
|
+
activeProvider = new SuperpowersProvider(ctx, control, config);
|
|
88
|
+
return activeProvider;
|
|
314
89
|
});
|
|
315
|
-
// skills/change 为 emit
|
|
90
|
+
// skills/change 为 emit 模式,感知外部变更并精准失效内存快照
|
|
316
91
|
const disposeListener = ctx.on('skills/change', () => {
|
|
317
|
-
ctx.logger.debug('[superpowers] skills catalog changed');
|
|
92
|
+
ctx.logger.debug('[superpowers] skills catalog changed, invalidating snapshot');
|
|
93
|
+
activeProvider?.catalog.invalidate();
|
|
318
94
|
});
|
|
319
95
|
return () => {
|
|
320
96
|
disposeListener();
|
|
321
97
|
disposeProvider();
|
|
98
|
+
activeProvider?.catalog.invalidate();
|
|
322
99
|
};
|
|
323
100
|
});
|
|
324
101
|
}
|
|
325
|
-
export default { name, inject, Config, apply };
|
|
102
|
+
export default { name, inject, Config, apply, SkillDocument, SkillCatalog };
|
|
326
103
|
//# sourceMappingURL=superpowers.js.map
|
package/lib/superpowers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../src/superpowers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -106,8 +106,7 @@ const SUPERPOWERS_VERSION = readSuperpowersVersion();
|
|
|
106
106
|
const SUPERPOWERS_BRAND_IMAGE_URL = 'https://primeradiant.com/brand/superpowers-visual-brainstorming-logo.png';
|
|
107
107
|
const TELEMETRY_DISABLE_ENV_VARS = [
|
|
108
108
|
'SUPERPOWERS_DISABLE_TELEMETRY',
|
|
109
|
-
'DISABLE_TELEMETRY'
|
|
110
|
-
'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'
|
|
109
|
+
'DISABLE_TELEMETRY'
|
|
111
110
|
];
|
|
112
111
|
const SUPERPOWERS_TELEMETRY_DISABLED = TELEMETRY_DISABLE_ENV_VARS.some(name => isTruthyEnv(process.env[name]));
|
|
113
112
|
let ownerPid = process.env.BRAINSTORM_OWNER_PID ? Number(process.env.BRAINSTORM_OWNER_PID) : null;
|
|
@@ -207,18 +206,11 @@ const helperInjection = '<script>\n' + helperScript + '\n</script>';
|
|
|
207
206
|
|
|
208
207
|
function readSuperpowersVersion() {
|
|
209
208
|
const root = path.join(__dirname, '../../..');
|
|
210
|
-
|
|
211
|
-
path.join(root, 'package.json'),
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
for (const manifest of manifests) {
|
|
216
|
-
try {
|
|
217
|
-
const data = JSON.parse(fs.readFileSync(manifest, 'utf-8'));
|
|
218
|
-
if (data.version) return String(data.version);
|
|
219
|
-
} catch (e) {
|
|
220
|
-
// Packaged Codex plugins omit package.json; try the next manifest.
|
|
221
|
-
}
|
|
209
|
+
try {
|
|
210
|
+
const data = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8'));
|
|
211
|
+
if (data.version) return String(data.version);
|
|
212
|
+
} catch (e) {
|
|
213
|
+
// DSH bundle reads version directly from root package.json
|
|
222
214
|
}
|
|
223
215
|
|
|
224
216
|
return 'unknown';
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
# --open Auto-open the browser on the first screen (use only
|
|
16
16
|
# after the user approves the visual companion).
|
|
17
17
|
# --foreground Run server in the current terminal (no backgrounding).
|
|
18
|
-
# --background Force background mode
|
|
18
|
+
# --background Force background mode.
|
|
19
19
|
|
|
20
20
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
21
21
|
|
|
@@ -94,11 +94,6 @@ is_windows_like_shell() {
|
|
|
94
94
|
return 1
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
# Some environments reap detached/background processes. Auto-foreground when detected.
|
|
98
|
-
if [[ -n "${CODEX_CI:-}" && "$FOREGROUND" != "true" && "$FORCE_BACKGROUND" != "true" ]]; then
|
|
99
|
-
FOREGROUND="true"
|
|
100
|
-
fi
|
|
101
|
-
|
|
102
97
|
# Windows/Git Bash reaps nohup background processes. Auto-foreground when detected.
|
|
103
98
|
if [[ "$FOREGROUND" != "true" && "$FORCE_BACKGROUND" != "true" ]]; then
|
|
104
99
|
if is_windows_like_shell; then
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
## 启动会话
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
#
|
|
37
|
-
#
|
|
36
|
+
# 在用户批准 companion 后启动。--open 会在首屏自动打开其浏览器;
|
|
37
|
+
# --project-dir 持久化原型并支持同端口重启。
|
|
38
38
|
bash scripts/start-server.sh --project-dir /path/to/project --open
|
|
39
39
|
|
|
40
40
|
# Returns: {"type":"server-started","port":52341,
|
|
@@ -51,40 +51,14 @@ bash scripts/start-server.sh --project-dir /path/to/project --open
|
|
|
51
51
|
|
|
52
52
|
**注意:** 将项目根目录作为 `--project-dir` 传入,这样原型会持久化到 `.superpowers/brainstorm/` 并在服务器重启后依然保留。若不传,文件会写入 `/tmp` 并被清理。如果 `.gitignore` 中尚未包含 `.superpowers/`,请提醒用户添加。
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
**在 DSH 中启动服务器:**
|
|
55
55
|
|
|
56
|
-
**Claude Code:**
|
|
57
56
|
```bash
|
|
58
|
-
#
|
|
59
|
-
bash scripts/start-server.sh --project-dir /path/to/project --open
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
在 Windows 上,脚本会自动检测并切换到前台模式(会阻塞工具调用)。请在 Bash 工具调用上使用 `run_in_background: true`,使服务器在对话轮次之间保持运行,然后在下一轮读取 `$STATE_DIR/server-info` 以获取 URL 和端口。
|
|
63
|
-
|
|
64
|
-
**Codex:**
|
|
65
|
-
```bash
|
|
66
|
-
# Codex reaps background processes. The script auto-detects CODEX_CI and
|
|
67
|
-
# switches to foreground mode. Run it normally — no extra flags needed.
|
|
68
|
-
bash scripts/start-server.sh --project-dir /path/to/project --open
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Gemini CLI:**
|
|
72
|
-
```bash
|
|
73
|
-
# Use --foreground and set is_background: true on your shell tool call
|
|
74
|
-
# so the process survives across turns
|
|
75
|
-
bash scripts/start-server.sh --project-dir /path/to/project --open --foreground
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**Copilot CLI:**
|
|
79
|
-
```bash
|
|
80
|
-
# Start it with Copilot CLI's non-blocking/background shell mechanism so the
|
|
81
|
-
# server survives across turns. Keep --foreground so the harness, not the
|
|
82
|
-
# script, owns backgrounding. The launcher is a .sh, so invoke it via bash
|
|
83
|
-
# (on Windows, call Git Bash's bash.exe from the PowerShell tool).
|
|
57
|
+
# 在 DSH 中使用 pwsh(Windows 首选)或 bash 工具,传入 run_in_background: true
|
|
84
58
|
bash scripts/start-server.sh --project-dir /path/to/project --open --foreground
|
|
85
59
|
```
|
|
86
60
|
|
|
87
|
-
|
|
61
|
+
服务器必须在后台持续运行并跨越 turn。在 DSH 工具调用中使用 `run_in_background: true`,然后在下一轮读取 `$STATE_DIR/server-info` 以获取 URL 和端口。
|
|
88
62
|
|
|
89
63
|
如果 URL 在你的浏览器中无法访问(在远程/容器化环境中很常见),请绑定非回环地址:
|
|
90
64
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: diagnosing-superpowers
|
|
3
|
-
description: "Superpower Skill
|
|
3
|
+
description: "Superpower Skill:当 superpowers 会话出错、human partner 想查原因(重复工作、忽略计划、技能未触发、耗时过长、成本过高、结果不佳)或想为维护者建缺陷报告时,适用当前或历史会话。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 诊断 superpowers
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
1. 列出每条人类 prompt 及其行与回合。对每条,提取其包含的指令(祈使句、约束、"don't"、"always"、"never"、"only"、范围陈述)。
|
|
6
6
|
2. 报告:
|
|
7
7
|
- 两条无法同时遵守的人类指令(两处都引用并附行),以及助手做了什么;
|
|
8
|
-
- 与会话中加载的指令文件(
|
|
8
|
+
- 与会话中加载的指令文件(AGENTS.md、CLAUDE.md 等;路径在 case 文件中)冲突的人类指令,两处都引用;
|
|
9
9
|
- 人类指令要求跳过、忽略或覆盖某步骤、技能或规则,以及之后发生了什么;
|
|
10
10
|
- 助手请求澄清的指令及回答(当回答改变了范围时)。
|
|
11
11
|
3. 不要评判你的 human partner 是否正确。报告冲突与助手的解决方式。
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
| 字段 | 值 | 来源 / 支撑证据 |
|
|
8
8
|
|-------|-------|-------------------------------|
|
|
9
9
|
| superpowers 版本 | <version>(<sha 或 "not a checkout">) | <历史证据 / 未验证快照 / 当前观察 / 未知>;<位置> |
|
|
10
|
-
| harness
|
|
10
|
+
| harness (DSH) | <harness> | <标签>;<位置> |
|
|
11
11
|
| harness 版本 | <version> | <标签>;<位置> |
|
|
12
12
|
| 你的模型 + 版本 | <所见 model ids> | <标签>;<位置> |
|
|
13
13
|
| 已安装的全部插件 | <列表> | <标签>;<位置> |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dispatching-parallel-agents
|
|
3
|
-
description: "Superpower Skill
|
|
3
|
+
description: "Superpower Skill:面向 2 个以上无共享状态、无前后依赖的独立任务,并行委派多个 subagent 协同处理的高效分发模式。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 并行分发 agent
|
|
@@ -71,7 +71,7 @@ digraph when_to_use {
|
|
|
71
71
|
Subagent (general-purpose): "Fix agent-tool-abort.test.ts failures"
|
|
72
72
|
Subagent (general-purpose): "Fix batch-completion-behavior.test.ts failures"
|
|
73
73
|
Subagent (general-purpose): "Fix tool-approval-race-conditions.test.ts failures"
|
|
74
|
-
#
|
|
74
|
+
# 全部三个并发执行。
|
|
75
75
|
```
|
|
76
76
|
|
|
77
77
|
在同一条回复中发起多次分发调用 = 并行执行。每条回复只发一次 = 串行执行。
|
|
@@ -84,9 +84,9 @@ Subagent (general-purpose): "Fix tool-approval-race-conditions.test.ts failures"
|
|
|
84
84
|
- 运行完整测试套件
|
|
85
85
|
- 整合所有变更
|
|
86
86
|
|
|
87
|
-
## agent
|
|
87
|
+
## agent prompt 结构
|
|
88
88
|
|
|
89
|
-
优秀的 agent
|
|
89
|
+
优秀的 agent prompt应具备:
|
|
90
90
|
1. **聚焦** - 一个清晰的问题域
|
|
91
91
|
2. **自包含** - 包含理解问题所需的全部上下文
|
|
92
92
|
3. **输出明确** - agent 应该返回什么?
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: executing-plans
|
|
3
|
-
description: "Superpower Skill
|
|
3
|
+
description: "Superpower Skill:当你在本会话中亲自作为实现者执行实施计划时使用——human partner 选择了内联执行,或环境不提供 subagent 工具。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 执行计划
|
|
@@ -79,7 +79,7 @@ digraph process {
|
|
|
79
79
|
|
|
80
80
|
workspace 与 ledger 与 subagent-driven-development 共用——同一个目录、同一种格式——所以一份计划可以在执行中途换执行者,新执行者从同一份 ledger 接着往下做。
|
|
81
81
|
|
|
82
|
-
- 每份计划拥有一个 workspace:技能开始时运行
|
|
82
|
+
- 每份计划拥有一个 workspace:技能开始时运行 `bash ../subagent-driven-development/scripts/sdd-workspace PLAN_FILE`——它会打印本计划的 git 忽略目录(`<repo-root>/.superpowers/sdd/<plan-basename>/`),该目录是这份计划所有产物的家:ledger、brief、review package。别的计划的目录永远不归你读写。
|
|
83
83
|
- 在本计划的 `<workspace>/progress.md` 检查 ledger。如果它的第一行点名的是你的计划文件,那么带 `Task <N>: complete` 行的任务就是已完成的——不要重做;从第一个没有该行的任务继续。即使你的上下文已不记得做过,它们的提交也确实存在于 git 中:压缩之后,宁可相信 ledger 与 `git log`,也不要相信自己的回忆。第一行点名了另一份计划文件的 ledger,是别的计划的进度:别动它,另起一份全新的。
|
|
84
84
|
- 创建 ledger,第一行写身份:`# SDD ledger — plan: <plan file path>`。
|
|
85
85
|
- `git clean -fdx` 会摧毁 workspace(它是 git 忽略的临时区);真要发生,从 `git log` 恢复。
|
|
@@ -96,7 +96,7 @@ workspace 与 ledger 与 subagent-driven-development 共用——同一个目录
|
|
|
96
96
|
|
|
97
97
|
### 1. 接手任务
|
|
98
98
|
|
|
99
|
-
- 运行本技能的 `scripts/task-start PLAN_FILE N`。它在一次调用中打印 brief 路径与 BASE(该任务评审区间的起点提交)。每个任务都要读 brief,包括你在准备阶段记得的那些:你记得的是摘要,brief 里才是精确的取值、签名与测试用例。
|
|
99
|
+
- 运行本技能的 `bash scripts/task-start PLAN_FILE N`。它在一次调用中打印 brief 路径与 BASE(该任务评审区间的起点提交)。每个任务都要读 brief,包括你在准备阶段记得的那些:你记得的是摘要,brief 里才是精确的取值、签名与测试用例。
|
|
100
100
|
- 把该任务的 todo 标为 in_progress。
|
|
101
101
|
|
|
102
102
|
每一次工具调用都是一轮重新读取你全部上下文的过程。记账要搭着干活一起走——追加 ledger 与提交放在同一次调用里,绝不单独花一次调用。
|
|
@@ -126,7 +126,7 @@ workspace 与 ledger 与 subagent-driven-development 共用——同一个目录
|
|
|
126
126
|
|
|
127
127
|
### 4. 完成任务
|
|
128
128
|
|
|
129
|
-
运行本技能的 `scripts/task-done PLAN_FILE N BASE -- <测试命令>`,测试命令用 brief 为整个任务点名的那条。它会运行测试,把完整输出留在 workspace,打印尾部,并且——只在测试通过时——把完成行追加到 ledger:
|
|
129
|
+
运行本技能的 `bash scripts/task-done PLAN_FILE N BASE -- <测试命令>`,测试命令用 brief 为整个任务点名的那条。它会运行测试,把完整输出留在 workspace,打印尾部,并且——只在测试通过时——把完成行追加到 ledger:
|
|
130
130
|
|
|
131
131
|
`Task <N>: complete (commits <base7>..<head7>, tests: <command> → <result>)`
|
|
132
132
|
|
|
@@ -134,7 +134,7 @@ workspace 与 ledger 与 subagent-driven-development 共用——同一个目录
|
|
|
134
134
|
|
|
135
135
|
## 最终评审
|
|
136
136
|
|
|
137
|
-
运行
|
|
137
|
+
运行 `bash ../subagent-driven-development/scripts/review-package PLAN_FILE MERGE_BASE HEAD`(MERGE_BASE = 分支起点的提交,例如 `git merge-base main HEAD`),并从它打印出的文件出发评审。
|
|
138
138
|
|
|
139
139
|
**有 subagent 工具时:** 用可用的最强模型派发 reviewer——全分支评审是一项判断题——使用 requesting-code-review 的 [code-reviewer.md](../requesting-code-review/code-reviewer.md),并把包路径、计划与规格路径、计划的 Review Focus 段(若存在)逐字交给它(该段列出计划的测试未覆盖的输入类别与失败模式——reviewer 要逐条刻意检查),再加一个指向 ledger 中 `Ruling:` 行的提示,让它能权衡你所做的决定。明确指定模型;省略模型会继承本会话的模型,而它未必是最强的。这是整轮执行唯一买到的一份全新上下文。不要跳过它,也不要用你自己读 diff 来代替它。
|
|
140
140
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: finishing-a-development-branch
|
|
3
|
-
description: "Superpower Skill
|
|
3
|
+
description: "Superpower Skill:实现完成且全部测试通过后,用于决定分支集成方式,支持本地合并、创建 PR 或保留分支等完整收尾流程。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 完成开发分支
|
|
@@ -30,8 +30,8 @@ description: "Superpower Skill(最高优先级):实现完成且全部测
|
|
|
30
30
|
```bash
|
|
31
31
|
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
32
32
|
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
33
|
-
#
|
|
34
|
-
#
|
|
33
|
+
# 此时仍在工作区内,立即捕获此值——步骤 5 会切换目录,
|
|
34
|
+
# 而后清理阶段(步骤 6)需要该值
|
|
35
35
|
WORKTREE_PATH=$(git rev-parse --show-toplevel)
|
|
36
36
|
```
|
|
37
37
|
|
|
@@ -45,7 +45,7 @@ WORKTREE_PATH=$(git rev-parse --show-toplevel)
|
|
|
45
45
|
|
|
46
46
|
## 步骤 3:确定基线分支
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
基线分支即本次工作 fork 时的来源分支——通常在计划、对话记录或分支的上游中已注明。若尚未明确,请询问:“该分支是从 <你的最佳推测> fork 出来的,这样对吗?” 合并前务必确认:合错基线分支的回滚成本很高。
|
|
49
49
|
|
|
50
50
|
## 步骤 4:提供选项
|
|
51
51
|
|
|
@@ -198,5 +198,5 @@ worktree 移除被拒绝——以下文件尚未提交:
|
|
|
198
198
|
| “这个 worktree 看起来废弃了——顺手一起清理” | 仅清理位于 `.worktrees/` 或 `worktrees/` 下的 worktree,其余均归宿主环境所有。 |
|
|
199
199
|
| “移除被拒——用 `--force` 收个尾就行” | 拒绝意味着文件仅存在于该 worktree,`--force` 会永久销毁它们,请向 human partner 展示并征询意见。 |
|
|
200
200
|
| “合并后失败大概是偶发问题” | 合并结果失败则立即中止,保留分支与 worktree 以便排查。 |
|
|
201
|
-
| “基线分支显然是 main” |
|
|
201
|
+
| “基线分支显然是 main” | 请确认fork 点或主动询问,合错基线的回滚成本很高。 |
|
|
202
202
|
| “推送被拒——强制推送就能解决” | 推送被拒说明远端已有更新,请先排查;仅在 human partner 明确要求时才执行强制推送。 |
|