ethan-skill 1.5.5 → 1.5.7
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/autopilot.d.ts +18 -0
- package/dist/cli/autopilot.d.ts.map +1 -0
- package/dist/cli/autopilot.js +161 -0
- package/dist/cli/autopilot.js.map +1 -0
- package/dist/cli/autopilot.test.d.ts +2 -0
- package/dist/cli/autopilot.test.d.ts.map +1 -0
- package/dist/cli/autopilot.test.js +113 -0
- package/dist/cli/autopilot.test.js.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/templates/copilot-md.template.d.ts.map +1 -1
- package/dist/templates/copilot-md.template.js +116 -9
- package/dist/templates/copilot-md.template.js.map +1 -1
- package/package.json +1 -1
- package/rules/claude-code/CLAUDE.md +51 -2
- package/rules/cline/.clinerules +51 -2
- package/rules/codebuddy/CODEBUDDY.md +51 -2
- package/rules/continue/.continuerules +2 -2
- package/rules/copilot/copilot-instructions.md +51 -2
- package/rules/cursor/.cursorrules +2 -2
- package/rules/cursor/smart-flow.mdc +2 -2
- package/rules/jetbrains/smart-flow.md +51 -2
- package/rules/lingma/smart-flow.md +51 -2
- package/rules/windsurf/.windsurf/rules/smart-flow.md +51 -2
- package/rules/zed/smart-flow.rules +52 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Pilot 超级 Prompt 生成器
|
|
3
|
+
* 将 Pipeline 的所有步骤打包成单次可执行的链式指令
|
|
4
|
+
* 粘贴到 AI 编辑器后,AI 自动链式执行所有步骤,无需手动推进
|
|
5
|
+
*/
|
|
6
|
+
import type { PipelineDefinition, SkillDefinition } from '../skills/types';
|
|
7
|
+
export interface AutopilotOptions {
|
|
8
|
+
context: string;
|
|
9
|
+
isEn?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** 生成单条 Pipeline 的超级 prompt */
|
|
12
|
+
export declare function buildAutopilotPrompt(pipeline: PipelineDefinition, skills: SkillDefinition[], options: AutopilotOptions): string;
|
|
13
|
+
/** 生成全部 Pipeline 的超级 prompt(依次串联所有 Pipeline) */
|
|
14
|
+
export declare function buildAllPipelinesAutopilotPrompt(pipelines: Array<{
|
|
15
|
+
pipeline: PipelineDefinition;
|
|
16
|
+
skills: SkillDefinition[];
|
|
17
|
+
}>, options: AutopilotOptions): string;
|
|
18
|
+
//# sourceMappingURL=autopilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/cli/autopilot.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,+BAA+B;AAC/B,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAsHR;AAwCD,gDAAgD;AAChD,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,EAC7E,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAeR"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Pilot 超级 Prompt 生成器
|
|
4
|
+
* 将 Pipeline 的所有步骤打包成单次可执行的链式指令
|
|
5
|
+
* 粘贴到 AI 编辑器后,AI 自动链式执行所有步骤,无需手动推进
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.buildAutopilotPrompt = buildAutopilotPrompt;
|
|
9
|
+
exports.buildAllPipelinesAutopilotPrompt = buildAllPipelinesAutopilotPrompt;
|
|
10
|
+
/** 生成单条 Pipeline 的超级 prompt */
|
|
11
|
+
function buildAutopilotPrompt(pipeline, skills, options) {
|
|
12
|
+
const { context, isEn = false } = options;
|
|
13
|
+
const total = skills.length;
|
|
14
|
+
if (isEn) {
|
|
15
|
+
const header = `# Auto-Pilot Workflow Instruction
|
|
16
|
+
|
|
17
|
+
**Context**: ${context}
|
|
18
|
+
**Pipeline**: ${pipeline.name} (\`${pipeline.id}\`)
|
|
19
|
+
**Total Steps**: ${total}
|
|
20
|
+
**Mode**: Fully automatic — no user confirmation between steps`;
|
|
21
|
+
const rules = `## Execution Rules (Must Follow)
|
|
22
|
+
|
|
23
|
+
1. Execute all ${total} steps below **in order without waiting for user confirmation**
|
|
24
|
+
2. After each step completes, wrap the output with \`<details>\` collapse tags (see format below)
|
|
25
|
+
3. Pass each step's **core output** (≤200 word summary) as background context to the next step
|
|
26
|
+
4. After all steps complete, output a single merged final report`;
|
|
27
|
+
const foldFormat = `## Output Format for Each Step
|
|
28
|
+
|
|
29
|
+
After each step completes, use this exact format:
|
|
30
|
+
|
|
31
|
+
\`\`\`
|
|
32
|
+
<details>
|
|
33
|
+
<summary>✅ Step N: [Skill Name] — Completed</summary>
|
|
34
|
+
|
|
35
|
+
[Full output of this step]
|
|
36
|
+
|
|
37
|
+
</details>
|
|
38
|
+
\`\`\``;
|
|
39
|
+
const stepsSection = skills.map((skill, i) => {
|
|
40
|
+
const stepNum = i + 1;
|
|
41
|
+
const prevNote = i > 0
|
|
42
|
+
? `**Prior Input**: Use the core output of Step ${i} as background context for this step.\n\n`
|
|
43
|
+
: '';
|
|
44
|
+
const stepsContent = skill.steps
|
|
45
|
+
.map((s, si) => {
|
|
46
|
+
const title = s.title.replace(/^\d+[.、]\s*/, '');
|
|
47
|
+
const indented = s.content.split('\n').map((l) => ` ${l}`).join('\n');
|
|
48
|
+
return ` ${si + 1}. **${title}**\n${indented}`;
|
|
49
|
+
})
|
|
50
|
+
.join('\n\n');
|
|
51
|
+
return `### Step ${stepNum}/${total}: ${skill.nameEn.replace(/_/g, ' ')}
|
|
52
|
+
|
|
53
|
+
${prevNote}**Goal**: ${skill.descriptionEn ?? skill.description}
|
|
54
|
+
|
|
55
|
+
**Execution Steps**:
|
|
56
|
+
|
|
57
|
+
${stepsContent}
|
|
58
|
+
|
|
59
|
+
**Output Format**: ${skill.outputFormat}`;
|
|
60
|
+
}).join('\n\n---\n\n');
|
|
61
|
+
const reportTemplate = buildReportTemplate(pipeline, skills, context, true);
|
|
62
|
+
const startCmd = `**Begin executing Step 1 now.**`;
|
|
63
|
+
return [header, '---', rules, '---', foldFormat, '---', `## Step Details`, stepsSection, '---', reportTemplate, startCmd].join('\n\n');
|
|
64
|
+
}
|
|
65
|
+
// 中文版
|
|
66
|
+
const header = `# Auto-Pilot 工作流指令
|
|
67
|
+
|
|
68
|
+
**任务背景**:${context}
|
|
69
|
+
**Pipeline**:${pipeline.name}(\`${pipeline.id}\`)
|
|
70
|
+
**总步数**:${total} 步
|
|
71
|
+
**执行模式**:全自动,步骤间自动传递上下文,无需用户介入`;
|
|
72
|
+
const rules = `## 执行规则(必须严格遵守)
|
|
73
|
+
|
|
74
|
+
1. 按顺序执行以下全部 ${total} 个步骤,**不等待用户确认**
|
|
75
|
+
2. 每步完成后,用 \`<details>\` 标签折叠展示中间结果(见下方格式)
|
|
76
|
+
3. 将每步的**核心产出**(≤200字摘要)作为下一步的背景信息
|
|
77
|
+
4. 全部步骤完成后,输出完整合并报告`;
|
|
78
|
+
const foldFormat = `## 每步输出格式
|
|
79
|
+
|
|
80
|
+
每个步骤完成后,使用如下格式:
|
|
81
|
+
|
|
82
|
+
\`\`\`
|
|
83
|
+
<details>
|
|
84
|
+
<summary>✅ 步骤 N:[Skill名称] — 已完成</summary>
|
|
85
|
+
|
|
86
|
+
[本步骤完整输出]
|
|
87
|
+
|
|
88
|
+
</details>
|
|
89
|
+
\`\`\``;
|
|
90
|
+
const stepsSection = skills.map((skill, i) => {
|
|
91
|
+
const stepNum = i + 1;
|
|
92
|
+
const prevNote = i > 0
|
|
93
|
+
? `**前序输入**:使用步骤 ${i} 的核心产出(≤200字)作为本步骤的背景信息。\n\n`
|
|
94
|
+
: '';
|
|
95
|
+
const stepsContent = skill.steps
|
|
96
|
+
.map((s, si) => {
|
|
97
|
+
const title = s.title.replace(/^\d+[.、]\s*/, '');
|
|
98
|
+
const indented = s.content.split('\n').map((l) => ` ${l}`).join('\n');
|
|
99
|
+
return ` ${si + 1}. **${title}**\n${indented}`;
|
|
100
|
+
})
|
|
101
|
+
.join('\n\n');
|
|
102
|
+
return `### 步骤 ${stepNum}/${total}:${skill.name}
|
|
103
|
+
|
|
104
|
+
${prevNote}**目标**:${skill.description}
|
|
105
|
+
|
|
106
|
+
**执行内容**:
|
|
107
|
+
|
|
108
|
+
${stepsContent}
|
|
109
|
+
|
|
110
|
+
**输出格式**:${skill.outputFormat}`;
|
|
111
|
+
}).join('\n\n---\n\n');
|
|
112
|
+
const reportTemplate = buildReportTemplate(pipeline, skills, context, false);
|
|
113
|
+
const startCmd = `**立即开始执行步骤 1。**`;
|
|
114
|
+
return [header, '---', rules, '---', foldFormat, '---', `## 步骤详情`, stepsSection, '---', reportTemplate, startCmd].join('\n\n');
|
|
115
|
+
}
|
|
116
|
+
/** 生成合并报告模板段落 */
|
|
117
|
+
function buildReportTemplate(pipeline, skills, context, isEn) {
|
|
118
|
+
if (isEn) {
|
|
119
|
+
const skillSections = skills
|
|
120
|
+
.map((s) => `## ${s.nameEn.replace(/_/g, ' ')}\n[Full output]\n\n---`)
|
|
121
|
+
.join('\n\n');
|
|
122
|
+
return `## Final Output Requirements
|
|
123
|
+
|
|
124
|
+
After all steps complete, output the following merged report:
|
|
125
|
+
|
|
126
|
+
# Workflow Report — ${context}
|
|
127
|
+
> Pipeline: ${pipeline.name}
|
|
128
|
+
|
|
129
|
+
${skillSections}
|
|
130
|
+
|
|
131
|
+
*Auto-generated by Ethan Auto-Pilot*`;
|
|
132
|
+
}
|
|
133
|
+
const skillSections = skills
|
|
134
|
+
.map((s) => `## ${s.name}\n[完整输出]\n\n---`)
|
|
135
|
+
.join('\n\n');
|
|
136
|
+
return `## 最终输出要求
|
|
137
|
+
|
|
138
|
+
全部步骤完成后,输出以下合并报告:
|
|
139
|
+
|
|
140
|
+
# 工作流执行报告 — ${context}
|
|
141
|
+
> Pipeline:${pipeline.name}
|
|
142
|
+
|
|
143
|
+
${skillSections}
|
|
144
|
+
|
|
145
|
+
*由 Ethan Auto-Pilot 自动生成*`;
|
|
146
|
+
}
|
|
147
|
+
/** 生成全部 Pipeline 的超级 prompt(依次串联所有 Pipeline) */
|
|
148
|
+
function buildAllPipelinesAutopilotPrompt(pipelines, options) {
|
|
149
|
+
const { isEn = false } = options;
|
|
150
|
+
const divider = '\n\n' + '═'.repeat(60) + '\n\n';
|
|
151
|
+
const header = isEn
|
|
152
|
+
? `# Auto-Pilot — All Pipelines\n\n**Context**: ${options.context}\n**Mode**: Execute all ${pipelines.length} pipelines sequentially`
|
|
153
|
+
: `# Auto-Pilot — 全部工作流\n\n**任务背景**:${options.context}\n**执行模式**:依次执行全部 ${pipelines.length} 条 Pipeline`;
|
|
154
|
+
const sections = pipelines.map(({ pipeline, skills }, i) => {
|
|
155
|
+
const label = isEn ? `Pipeline ${i + 1}/${pipelines.length}` : `Pipeline ${i + 1}/${pipelines.length}`;
|
|
156
|
+
const prompt = buildAutopilotPrompt(pipeline, skills, options);
|
|
157
|
+
return `# ${label}:${pipeline.name}\n\n${prompt}`;
|
|
158
|
+
});
|
|
159
|
+
return [header, ...sections].join(divider);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=autopilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.js","sourceRoot":"","sources":["../../src/cli/autopilot.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,oDA0HC;AAyCD,4EAkBC;AAtLD,+BAA+B;AAC/B,SAAgB,oBAAoB,CAClC,QAA4B,EAC5B,MAAyB,EACzB,OAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAE5B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,MAAM,GAAG;;eAEJ,OAAO;gBACN,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,EAAE;mBAC5B,KAAK;+DACuC,CAAC;QAE5D,MAAM,KAAK,GAAG;;iBAED,KAAK;;;iEAG2C,CAAC;QAE9D,MAAM,UAAU,GAAG;;;;;;;;;;;OAWhB,CAAC;QAEJ,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,gDAAgD,CAAC,2CAA2C;gBAC9F,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK;iBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxE,OAAO,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,OAAO,QAAQ,EAAE,CAAC;YACnD,CAAC,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,OAAO,YAAY,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;;EAE3E,QAAQ,aAAa,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,WAAW;;;;EAI7D,YAAY;;qBAEO,KAAK,CAAC,YAAY,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvB,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5E,MAAM,QAAQ,GAAG,iCAAiC,CAAC;QAEnD,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzI,CAAC;IAED,MAAM;IACN,MAAM,MAAM,GAAG;;WAEN,OAAO;eACH,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,EAAE;UACnC,KAAK;+BACgB,CAAC;IAE9B,MAAM,KAAK,GAAG;;eAED,KAAK;;;oBAGA,CAAC;IAEnB,MAAM,UAAU,GAAG;;;;;;;;;;;OAWd,CAAC;IAEN,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC;YACpB,CAAC,CAAC,iBAAiB,CAAC,8BAA8B;YAClD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK;aAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACb,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,OAAO,MAAM,EAAE,GAAG,CAAC,OAAO,KAAK,OAAO,QAAQ,EAAE,CAAC;QACnD,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO,UAAU,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI;;EAEjD,QAAQ,UAAU,KAAK,CAAC,WAAW;;;;EAInC,YAAY;;WAEH,KAAK,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,iBAAiB,CAAC;IAEnC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjI,CAAC;AAED,iBAAiB;AACjB,SAAS,mBAAmB,CAC1B,QAA4B,EAC5B,MAAyB,EACzB,OAAe,EACf,IAAa;IAEb,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,aAAa,GAAG,MAAM;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,wBAAwB,CAAC;aACrE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO;;;;sBAIW,OAAO;cACf,QAAQ,CAAC,IAAI;;EAEzB,aAAa;;qCAEsB,CAAC;IACpC,CAAC;IAED,MAAM,aAAa,GAAG,MAAM;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,iBAAiB,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChB,OAAO;;;;cAIK,OAAO;aACR,QAAQ,CAAC,IAAI;;EAExB,aAAa;;0BAEW,CAAC;AAC3B,CAAC;AAED,gDAAgD;AAChD,SAAgB,gCAAgC,CAC9C,SAA6E,EAC7E,OAAyB;IAEzB,MAAM,EAAE,IAAI,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;IAEjD,MAAM,MAAM,GAAG,IAAI;QACjB,CAAC,CAAC,gDAAgD,OAAO,CAAC,OAAO,2BAA2B,SAAS,CAAC,MAAM,yBAAyB;QACrI,CAAC,CAAC,oCAAoC,OAAO,CAAC,OAAO,qBAAqB,SAAS,CAAC,MAAM,aAAa,CAAC;IAE1G,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACvG,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO,KAAK,KAAK,IAAI,QAAQ,CAAC,IAAI,OAAO,MAAM,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.test.d.ts","sourceRoot":"","sources":["../../src/cli/autopilot.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const autopilot_1 = require("./autopilot");
|
|
5
|
+
const pipeline_1 = require("../skills/pipeline");
|
|
6
|
+
(0, vitest_1.describe)('buildAutopilotPrompt', () => {
|
|
7
|
+
const devWorkflow = (0, pipeline_1.resolvePipeline)('dev-workflow');
|
|
8
|
+
(0, vitest_1.it)('includes task context', () => {
|
|
9
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
10
|
+
context: '实现用户登录功能',
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.expect)(prompt).toContain('实现用户登录功能');
|
|
13
|
+
});
|
|
14
|
+
(0, vitest_1.it)('includes pipeline name and id', () => {
|
|
15
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
16
|
+
context: '测试',
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.expect)(prompt).toContain(devWorkflow.pipeline.name);
|
|
19
|
+
(0, vitest_1.expect)(prompt).toContain(devWorkflow.pipeline.id);
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('includes all step headings in order', () => {
|
|
22
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
23
|
+
context: '测试',
|
|
24
|
+
});
|
|
25
|
+
devWorkflow.skills.forEach((skill, i) => {
|
|
26
|
+
(0, vitest_1.expect)(prompt).toContain(`步骤 ${i + 1}/${devWorkflow.skills.length}`);
|
|
27
|
+
(0, vitest_1.expect)(prompt).toContain(skill.name);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.it)('includes <details> fold instruction', () => {
|
|
31
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
32
|
+
context: '测试',
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.expect)(prompt).toContain('<details>');
|
|
35
|
+
(0, vitest_1.expect)(prompt).toContain('<summary>');
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.it)('includes "no user confirmation" instruction', () => {
|
|
38
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
39
|
+
context: '测试',
|
|
40
|
+
});
|
|
41
|
+
(0, vitest_1.expect)(prompt).toContain('不等待用户确认');
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('includes prior-input reference for steps after first', () => {
|
|
44
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
45
|
+
context: '测试',
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.expect)(prompt).toContain('步骤 1 的核心产出');
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)('includes context-passing rule (≤200字)', () => {
|
|
50
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
51
|
+
context: '测试',
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.expect)(prompt).toContain('200');
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('ends with start instruction', () => {
|
|
56
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
57
|
+
context: '测试',
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.expect)(prompt.trimEnd()).toMatch(/立即开始执行步骤 1[。.]?\*{0,2}$/);
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('includes merged report template', () => {
|
|
62
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
63
|
+
context: '测试需求',
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.expect)(prompt).toContain('工作流执行报告');
|
|
66
|
+
(0, vitest_1.expect)(prompt).toContain('测试需求');
|
|
67
|
+
(0, vitest_1.expect)(prompt).toContain('Ethan Auto-Pilot');
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.it)('generates english prompt when isEn=true', () => {
|
|
70
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(devWorkflow.pipeline, devWorkflow.skills, {
|
|
71
|
+
context: 'implement login',
|
|
72
|
+
isEn: true,
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.expect)(prompt).toContain('Auto-Pilot Workflow Instruction');
|
|
75
|
+
(0, vitest_1.expect)(prompt).toContain('Begin executing Step 1 now');
|
|
76
|
+
(0, vitest_1.expect)(prompt).not.toContain('任务背景');
|
|
77
|
+
(0, vitest_1.expect)(prompt).toContain('<details>');
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('works for all built-in pipelines', () => {
|
|
80
|
+
for (const p of pipeline_1.PIPELINES) {
|
|
81
|
+
const resolved = (0, pipeline_1.resolvePipeline)(p.id);
|
|
82
|
+
const prompt = (0, autopilot_1.buildAutopilotPrompt)(resolved.pipeline, resolved.skills, {
|
|
83
|
+
context: '测试',
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.expect)(prompt.length).toBeGreaterThan(500);
|
|
86
|
+
(0, vitest_1.expect)(prompt).toContain(resolved.pipeline.name);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.describe)('buildAllPipelinesAutopilotPrompt', () => {
|
|
91
|
+
const allResolved = pipeline_1.PIPELINES.map((p) => (0, pipeline_1.resolvePipeline)(p.id));
|
|
92
|
+
(0, vitest_1.it)('includes all pipeline names', () => {
|
|
93
|
+
const prompt = (0, autopilot_1.buildAllPipelinesAutopilotPrompt)(allResolved, { context: '测试' });
|
|
94
|
+
for (const p of pipeline_1.PIPELINES) {
|
|
95
|
+
(0, vitest_1.expect)(prompt).toContain(p.name);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('includes pipeline count header', () => {
|
|
99
|
+
const prompt = (0, autopilot_1.buildAllPipelinesAutopilotPrompt)(allResolved, { context: '测试' });
|
|
100
|
+
(0, vitest_1.expect)(prompt).toContain(`${pipeline_1.PIPELINES.length}`);
|
|
101
|
+
(0, vitest_1.expect)(prompt).toContain('全部工作流');
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)('separates pipelines with dividers', () => {
|
|
104
|
+
const prompt = (0, autopilot_1.buildAllPipelinesAutopilotPrompt)(allResolved, { context: '测试' });
|
|
105
|
+
(0, vitest_1.expect)(prompt).toContain('═'.repeat(60));
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)('includes context in all sections', () => {
|
|
108
|
+
const context = '我的任务背景';
|
|
109
|
+
const prompt = (0, autopilot_1.buildAllPipelinesAutopilotPrompt)(allResolved, { context });
|
|
110
|
+
(0, vitest_1.expect)(prompt).toContain(context);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=autopilot.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.test.js","sourceRoot":"","sources":["../../src/cli/autopilot.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -2879,6 +2879,117 @@ function loadCustomPipelines(cwd) {
|
|
|
2879
2879
|
}
|
|
2880
2880
|
return results;
|
|
2881
2881
|
}
|
|
2882
|
+
// ─── autopilot 命令 ──────────────────────────────────────────────────────────
|
|
2883
|
+
program
|
|
2884
|
+
.command('autopilot [pipelineId]')
|
|
2885
|
+
.description('生成「超级 prompt」:一次粘贴即可让 AI 自动链式执行完整 Pipeline,无需手动推进每一步')
|
|
2886
|
+
.option('-c, --context <context>', '任务上下文描述(如"实现用户登录功能")', '')
|
|
2887
|
+
.option('--all', '生成全部 3 条 Pipeline 的超级 prompt')
|
|
2888
|
+
.option('--lang <lang>', '输出语言:zh(默认)或 en', '')
|
|
2889
|
+
.option('--no-copy', '不自动复制到剪贴板,直接打印到终端')
|
|
2890
|
+
.action(async (pipelineId, options) => {
|
|
2891
|
+
const { resolvePipeline, PIPELINES } = await Promise.resolve().then(() => __importStar(require('../skills/pipeline')));
|
|
2892
|
+
const { buildAutopilotPrompt, buildAllPipelinesAutopilotPrompt } = await Promise.resolve().then(() => __importStar(require('./autopilot')));
|
|
2893
|
+
const config = (0, config_1.readConfig)(process.cwd());
|
|
2894
|
+
const isEn = (options.lang || config.lang || 'zh') === 'en';
|
|
2895
|
+
// 获取任务上下文(--context 或交互式输入)
|
|
2896
|
+
let context = (options.context || '').trim();
|
|
2897
|
+
if (!context) {
|
|
2898
|
+
const readline = await Promise.resolve().then(() => __importStar(require('readline')));
|
|
2899
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
2900
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));
|
|
2901
|
+
context = await ask(isEn
|
|
2902
|
+
? 'Describe your task context (e.g. "implement user login with JWT"):\n> '
|
|
2903
|
+
: '请描述任务背景(例如:实现用户登录功能,支持 JWT 认证):\n> ');
|
|
2904
|
+
rl.close();
|
|
2905
|
+
if (!context) {
|
|
2906
|
+
console.error(isEn ? '\n❌ Context cannot be empty\n' : '\n❌ 任务背景不能为空\n');
|
|
2907
|
+
process.exit(1);
|
|
2908
|
+
}
|
|
2909
|
+
}
|
|
2910
|
+
let prompt;
|
|
2911
|
+
if (options.all) {
|
|
2912
|
+
// 生成全部 Pipeline 的超级 prompt
|
|
2913
|
+
const allResolved = PIPELINES.map((p) => resolvePipeline(p.id)).filter(Boolean);
|
|
2914
|
+
prompt = buildAllPipelinesAutopilotPrompt(allResolved, { context, isEn });
|
|
2915
|
+
console.log(isEn
|
|
2916
|
+
? `\n🚀 Auto-Pilot prompt generated for all ${PIPELINES.length} pipelines`
|
|
2917
|
+
: `\n🚀 已生成全部 ${PIPELINES.length} 条 Pipeline 的超级 prompt`);
|
|
2918
|
+
}
|
|
2919
|
+
else {
|
|
2920
|
+
// 确定目标 Pipeline
|
|
2921
|
+
let id = pipelineId;
|
|
2922
|
+
if (!id) {
|
|
2923
|
+
const customPipelines = loadCustomPipelines(process.cwd());
|
|
2924
|
+
const allPipelines = [
|
|
2925
|
+
...PIPELINES,
|
|
2926
|
+
...customPipelines.map((p) => ({ id: p.id, name: p.name, description: p.description, skillIds: p.skillIds })),
|
|
2927
|
+
];
|
|
2928
|
+
const readline = await Promise.resolve().then(() => __importStar(require('readline')));
|
|
2929
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
2930
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, (a) => resolve(a.trim())));
|
|
2931
|
+
console.log(isEn ? '\n🔄 Available Pipelines\n' : '\n🔄 可用工作流 Pipeline\n');
|
|
2932
|
+
console.log('─'.repeat(60));
|
|
2933
|
+
allPipelines.forEach((p, i) => {
|
|
2934
|
+
console.log(` ${i + 1}. ${p.name} [${p.id}]`);
|
|
2935
|
+
console.log(` ${isEn ? p.description : p.description}`);
|
|
2936
|
+
});
|
|
2937
|
+
console.log('');
|
|
2938
|
+
const choice = await ask(isEn
|
|
2939
|
+
? `Select pipeline (1-${allPipelines.length} or ID):\n> `
|
|
2940
|
+
: `选择 Pipeline(输入序号 1-${allPipelines.length},或直接输入 ID):\n> `);
|
|
2941
|
+
rl.close();
|
|
2942
|
+
const num = parseInt(choice, 10);
|
|
2943
|
+
if (!isNaN(num) && num >= 1 && num <= allPipelines.length) {
|
|
2944
|
+
id = allPipelines[num - 1].id;
|
|
2945
|
+
}
|
|
2946
|
+
else {
|
|
2947
|
+
id = choice;
|
|
2948
|
+
}
|
|
2949
|
+
}
|
|
2950
|
+
let resolved = resolvePipeline(id);
|
|
2951
|
+
if (!resolved) {
|
|
2952
|
+
const customPipelines = loadCustomPipelines(process.cwd());
|
|
2953
|
+
const custom = customPipelines.find((p) => p.id === id);
|
|
2954
|
+
if (custom) {
|
|
2955
|
+
const customSkills = custom.skillIds
|
|
2956
|
+
.map((sid) => index_1.ALL_SKILLS.find((s) => s.id === sid))
|
|
2957
|
+
.filter((s) => s != null);
|
|
2958
|
+
if (customSkills.length > 0) {
|
|
2959
|
+
resolved = { pipeline: { id: custom.id, name: custom.name, description: custom.description, skillIds: custom.skillIds }, skills: customSkills };
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
}
|
|
2963
|
+
if (!resolved) {
|
|
2964
|
+
console.error(isEn ? `\n❌ Unknown pipeline: ${id}\n` : `\n❌ 未找到 Pipeline: ${id}\n`);
|
|
2965
|
+
console.error(`Available: ${PIPELINES.map((p) => p.id).join(' | ')}`);
|
|
2966
|
+
process.exit(1);
|
|
2967
|
+
}
|
|
2968
|
+
const { pipeline, skills } = resolved;
|
|
2969
|
+
prompt = buildAutopilotPrompt(pipeline, skills, { context, isEn });
|
|
2970
|
+
console.log(isEn
|
|
2971
|
+
? `\n🚀 Auto-Pilot prompt generated: ${pipeline.name} (${skills.length} steps)`
|
|
2972
|
+
: `\n🚀 超级 prompt 已生成:${pipeline.name}(${skills.length} 步)`);
|
|
2973
|
+
trackUsageWithStreak(`autopilot-${pipeline.id}`);
|
|
2974
|
+
}
|
|
2975
|
+
console.log('─'.repeat(60));
|
|
2976
|
+
if (options.copy !== false) {
|
|
2977
|
+
if (copyToClipboard(prompt)) {
|
|
2978
|
+
console.log(isEn
|
|
2979
|
+
? '\n✅ Super prompt copied to clipboard! Paste it into your AI editor.'
|
|
2980
|
+
: '\n✅ 超级 prompt 已复制到剪贴板!粘贴到 AI 编辑器后,AI 将自动执行所有步骤。');
|
|
2981
|
+
}
|
|
2982
|
+
else {
|
|
2983
|
+
console.log('\n' + prompt + '\n');
|
|
2984
|
+
}
|
|
2985
|
+
}
|
|
2986
|
+
else {
|
|
2987
|
+
console.log('\n' + prompt + '\n');
|
|
2988
|
+
}
|
|
2989
|
+
console.log(isEn
|
|
2990
|
+
? '\n💡 The AI will automatically chain all steps and deliver the final merged report.\n'
|
|
2991
|
+
: '\n💡 AI 将自动链式执行所有步骤,每步折叠展示,最终输出完整合并报告。\n');
|
|
2992
|
+
});
|
|
2882
2993
|
program
|
|
2883
2994
|
.command('pipeline-init')
|
|
2884
2995
|
.description('在 .ethan/pipelines/ 生成自定义 Pipeline YAML 模板')
|