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.
Files changed (50) hide show
  1. package/dist/cli/index.js +32 -26
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/loader/custom-pipeline-loader.d.ts +15 -0
  4. package/dist/loader/custom-pipeline-loader.d.ts.map +1 -0
  5. package/dist/loader/custom-pipeline-loader.js +131 -0
  6. package/dist/loader/custom-pipeline-loader.js.map +1 -0
  7. package/dist/loader/custom-skill-loader.d.ts +7 -2
  8. package/dist/loader/custom-skill-loader.d.ts.map +1 -1
  9. package/dist/loader/custom-skill-loader.js +112 -3
  10. package/dist/loader/custom-skill-loader.js.map +1 -1
  11. package/dist/loader/custom-skill-loader.test.d.ts +2 -0
  12. package/dist/loader/custom-skill-loader.test.d.ts.map +1 -0
  13. package/dist/loader/custom-skill-loader.test.js +201 -0
  14. package/dist/loader/custom-skill-loader.test.js.map +1 -0
  15. package/dist/skills/11-api-design.d.ts +3 -0
  16. package/dist/skills/11-api-design.d.ts.map +1 -0
  17. package/dist/skills/11-api-design.js +214 -0
  18. package/dist/skills/11-api-design.js.map +1 -0
  19. package/dist/skills/12-security-review.d.ts +3 -0
  20. package/dist/skills/12-security-review.d.ts.map +1 -0
  21. package/dist/skills/12-security-review.js +194 -0
  22. package/dist/skills/12-security-review.js.map +1 -0
  23. package/dist/skills/13-deployment.d.ts +3 -0
  24. package/dist/skills/13-deployment.d.ts.map +1 -0
  25. package/dist/skills/13-deployment.js +189 -0
  26. package/dist/skills/13-deployment.js.map +1 -0
  27. package/dist/skills/14-prd.d.ts +3 -0
  28. package/dist/skills/14-prd.d.ts.map +1 -0
  29. package/dist/skills/14-prd.js +214 -0
  30. package/dist/skills/14-prd.js.map +1 -0
  31. package/dist/skills/index.d.ts +4 -0
  32. package/dist/skills/index.d.ts.map +1 -1
  33. package/dist/skills/index.js +17 -1
  34. package/dist/skills/index.js.map +1 -1
  35. package/dist/skills/pipeline.d.ts +2 -1
  36. package/dist/skills/pipeline.d.ts.map +1 -1
  37. package/dist/skills/pipeline.js +41 -3
  38. package/dist/skills/pipeline.js.map +1 -1
  39. package/package.json +1 -1
  40. package/rules/claude-code/CLAUDE.md +641 -3
  41. package/rules/cline/.clinerules +578 -2
  42. package/rules/codebuddy/CODEBUDDY.md +618 -2
  43. package/rules/continue/.continuerules +578 -2
  44. package/rules/copilot/copilot-instructions.md +606 -2
  45. package/rules/cursor/.cursorrules +636 -2
  46. package/rules/cursor/smart-flow.mdc +636 -2
  47. package/rules/jetbrains/smart-flow.md +606 -2
  48. package/rules/lingma/smart-flow.md +615 -3
  49. package/rules/windsurf/.windsurf/rules/smart-flow.md +607 -3
  50. 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 YAML 模板')
314
- .action(async (name) => {
315
- const { generateSkillTemplate } = await Promise.resolve().then(() => __importStar(require('../loader/custom-skill-loader')));
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 filename = name ? `${name}.yaml` : 'my-skill.yaml';
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
- fs.writeFileSync(filePath, generateSkillTemplate(), 'utf-8');
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 PIPELINES) {
644
- console.log(`\n${p.id}`);
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 resolved = resolvePipeline(name);
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 { PIPELINES } = await Promise.resolve().then(() => __importStar(require('../skills/pipeline')));
672
+ const allIds = [...PIPELINES.map((p) => p.id), ...customPipelines.map((p) => p.id)];
661
673
  console.error(`Unknown pipeline: ${name}`);
662
- console.error(`Available: ${PIPELINES.map((p) => p.id).join(' | ')}`);
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
- # 可用 Skill ID:requirement-understanding | task-breakdown | solution-design
3132
- # implementation | progress-tracking | task-report | weekly-report
3133
- # code-review | debug | tech-research
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}`);