ethan-skill 1.5.9 → 1.7.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/dist/cli/index.js +32 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/loader/custom-pipeline-loader.d.ts +15 -0
- package/dist/loader/custom-pipeline-loader.d.ts.map +1 -0
- package/dist/loader/custom-pipeline-loader.js +131 -0
- package/dist/loader/custom-pipeline-loader.js.map +1 -0
- package/dist/loader/custom-skill-loader.d.ts +7 -2
- package/dist/loader/custom-skill-loader.d.ts.map +1 -1
- package/dist/loader/custom-skill-loader.js +112 -3
- package/dist/loader/custom-skill-loader.js.map +1 -1
- package/dist/loader/custom-skill-loader.test.d.ts +2 -0
- package/dist/loader/custom-skill-loader.test.d.ts.map +1 -0
- package/dist/loader/custom-skill-loader.test.js +201 -0
- package/dist/loader/custom-skill-loader.test.js.map +1 -0
- package/dist/skills/11-api-design.d.ts +3 -0
- package/dist/skills/11-api-design.d.ts.map +1 -0
- package/dist/skills/11-api-design.js +214 -0
- package/dist/skills/11-api-design.js.map +1 -0
- package/dist/skills/12-security-review.d.ts +3 -0
- package/dist/skills/12-security-review.d.ts.map +1 -0
- package/dist/skills/12-security-review.js +194 -0
- package/dist/skills/12-security-review.js.map +1 -0
- package/dist/skills/13-deployment.d.ts +3 -0
- package/dist/skills/13-deployment.d.ts.map +1 -0
- package/dist/skills/13-deployment.js +189 -0
- package/dist/skills/13-deployment.js.map +1 -0
- package/dist/skills/14-prd.d.ts +3 -0
- package/dist/skills/14-prd.d.ts.map +1 -0
- package/dist/skills/14-prd.js +214 -0
- package/dist/skills/14-prd.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +17 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/pipeline.d.ts +2 -1
- package/dist/skills/pipeline.d.ts.map +1 -1
- package/dist/skills/pipeline.js +41 -3
- package/dist/skills/pipeline.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +641 -3
- package/rules/cline/.clinerules +578 -2
- package/rules/codebuddy/CODEBUDDY.md +618 -2
- package/rules/continue/.continuerules +578 -2
- package/rules/copilot/copilot-instructions.md +606 -2
- package/rules/cursor/.cursorrules +636 -2
- package/rules/cursor/smart-flow.mdc +636 -2
- package/rules/jetbrains/smart-flow.md +606 -2
- package/rules/lingma/smart-flow.md +615 -3
- package/rules/windsurf/.windsurf/rules/smart-flow.md +607 -3
- package/rules/zed/smart-flow.rules +573 -1
package/dist/cli/index.js
CHANGED
|
@@ -310,20 +310,26 @@ program
|
|
|
310
310
|
const skillCmd = program.command('skill').description('自定义 Skill 管理');
|
|
311
311
|
skillCmd
|
|
312
312
|
.command('new [name]')
|
|
313
|
-
.description('在 .ethan/skills/ 目录生成自定义 Skill
|
|
314
|
-
.
|
|
315
|
-
|
|
313
|
+
.description('在 .ethan/skills/ 目录生成自定义 Skill 模板')
|
|
314
|
+
.option('--format <format>', '文件格式:yaml 或 md(默认 yaml)', 'yaml')
|
|
315
|
+
.action(async (name, options) => {
|
|
316
|
+
const { generateSkillTemplate, generateMdSkillTemplate } = await Promise.resolve().then(() => __importStar(require('../loader/custom-skill-loader')));
|
|
316
317
|
const skillsDir = path.join(process.cwd(), '.ethan/skills');
|
|
317
318
|
if (!fs.existsSync(skillsDir))
|
|
318
319
|
fs.mkdirSync(skillsDir, { recursive: true });
|
|
319
|
-
const
|
|
320
|
+
const format = options?.format === 'md' ? 'md' : 'yaml';
|
|
321
|
+
const filename = name ? `${name}.${format}` : `my-skill.${format}`;
|
|
320
322
|
const filePath = path.join(skillsDir, filename);
|
|
321
323
|
if (fs.existsSync(filePath)) {
|
|
322
324
|
console.log(`⚠️ 文件已存在:${filePath}`);
|
|
323
325
|
return;
|
|
324
326
|
}
|
|
325
|
-
|
|
327
|
+
const template = format === 'md' ? generateMdSkillTemplate() : generateSkillTemplate();
|
|
328
|
+
fs.writeFileSync(filePath, template, 'utf-8');
|
|
326
329
|
console.log(`\n✅ 已创建自定义 Skill 模板:${filePath}`);
|
|
330
|
+
if (format === 'md') {
|
|
331
|
+
console.log(' 在 --- frontmatter 中填写元数据,在正文用 ## 标题定义步骤');
|
|
332
|
+
}
|
|
327
333
|
console.log(' 编辑该文件后运行 ethan list 验证加载结果\n');
|
|
328
334
|
});
|
|
329
335
|
skillCmd
|
|
@@ -635,31 +641,37 @@ const pipelineCmd = program
|
|
|
635
641
|
.description('Pipeline 链式执行管理');
|
|
636
642
|
pipelineCmd
|
|
637
643
|
.command('list')
|
|
638
|
-
.description('列出所有可用 Pipeline')
|
|
644
|
+
.description('列出所有可用 Pipeline(内置 + 自定义)')
|
|
639
645
|
.action(async () => {
|
|
640
646
|
const { PIPELINES } = await Promise.resolve().then(() => __importStar(require('../skills/pipeline')));
|
|
647
|
+
const customPipelines = loadCustomPipelines(process.cwd());
|
|
648
|
+
const all = [...PIPELINES, ...customPipelines];
|
|
641
649
|
console.log('\nEthan Pipelines\n');
|
|
642
650
|
console.log('─'.repeat(60));
|
|
643
|
-
for (const p of
|
|
644
|
-
|
|
651
|
+
for (const p of all) {
|
|
652
|
+
const isCustom = !PIPELINES.find((bp) => bp.id === p.id);
|
|
653
|
+
const tag = isCustom ? ' 🔧 自定义' : '';
|
|
654
|
+
console.log(`\n${p.id}${tag}`);
|
|
645
655
|
console.log(` 名称:${p.name}`);
|
|
646
656
|
console.log(` 描述:${p.description}`);
|
|
647
657
|
console.log(` Skills:${p.skillIds.join(' → ')}`);
|
|
648
658
|
}
|
|
649
659
|
console.log('\n' + '─'.repeat(60));
|
|
650
|
-
console.log(`Total: ${PIPELINES.length} pipelines`);
|
|
660
|
+
console.log(`Total: ${PIPELINES.length} 内置 + ${customPipelines.length} 自定义 = ${all.length} pipelines`);
|
|
651
661
|
});
|
|
652
662
|
pipelineCmd
|
|
653
663
|
.command('run <name>')
|
|
654
664
|
.description('按 Pipeline 顺序执行各 Skill 提示')
|
|
655
665
|
.option('-c, --context <context>', '输入上下文', '')
|
|
656
666
|
.action(async (name, options) => {
|
|
657
|
-
const { resolvePipeline } = await Promise.resolve().then(() => __importStar(require('../skills/pipeline')));
|
|
658
|
-
const
|
|
667
|
+
const { resolvePipeline, PIPELINES } = await Promise.resolve().then(() => __importStar(require('../skills/pipeline')));
|
|
668
|
+
const customPipelines = loadCustomPipelines(process.cwd());
|
|
669
|
+
const activeSkills = await getActiveSkills();
|
|
670
|
+
const resolved = resolvePipeline(name, customPipelines, activeSkills);
|
|
659
671
|
if (!resolved) {
|
|
660
|
-
const
|
|
672
|
+
const allIds = [...PIPELINES.map((p) => p.id), ...customPipelines.map((p) => p.id)];
|
|
661
673
|
console.error(`Unknown pipeline: ${name}`);
|
|
662
|
-
console.error(`Available: ${
|
|
674
|
+
console.error(`Available: ${allIds.join(' | ')}`);
|
|
663
675
|
process.exit(1);
|
|
664
676
|
}
|
|
665
677
|
const { pipeline, skills } = resolved;
|
|
@@ -3128,23 +3140,17 @@ name: 自定义工作流名称
|
|
|
3128
3140
|
description: 这个 Pipeline 的描述
|
|
3129
3141
|
|
|
3130
3142
|
# 引用的 Skill ID 列表(按执行顺序)
|
|
3131
|
-
#
|
|
3132
|
-
#
|
|
3133
|
-
#
|
|
3143
|
+
# 内置 Skill ID:
|
|
3144
|
+
# 需求侧: requirement-understanding, prd
|
|
3145
|
+
# 执行侧: task-breakdown, solution-design, api-design, implementation, deployment
|
|
3146
|
+
# 跟踪侧: progress-tracking
|
|
3147
|
+
# 输出侧: task-report, weekly-report
|
|
3148
|
+
# 质量侧: code-review, debug, tech-research, security-review
|
|
3149
|
+
# 也可以引用 .ethan/skills/ 中的自定义 Skill ID
|
|
3134
3150
|
skillIds:
|
|
3135
3151
|
- requirement-understanding
|
|
3136
3152
|
- solution-design
|
|
3137
3153
|
- implementation
|
|
3138
|
-
|
|
3139
|
-
# (可选)输出结构定义:每个字段对应 AI 需要输出的内容
|
|
3140
|
-
# outputSchema:
|
|
3141
|
-
# featureSpec:
|
|
3142
|
-
# type: string
|
|
3143
|
-
# description: 需求规格说明书
|
|
3144
|
-
# required: true
|
|
3145
|
-
# designDoc:
|
|
3146
|
-
# type: string
|
|
3147
|
-
# description: 技术方案设计文档
|
|
3148
3154
|
`;
|
|
3149
3155
|
fs.writeFileSync(filePath, template, 'utf-8');
|
|
3150
3156
|
console.log(`\n✅ 自定义 Pipeline 模板已生成:${filePath}`);
|