ethan-skill 1.0.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/CHANGELOG.md +25 -0
- package/README.md +249 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +452 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +199 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/router/trigger-router.d.ts +16 -0
- package/dist/router/trigger-router.d.ts.map +1 -0
- package/dist/router/trigger-router.js +45 -0
- package/dist/router/trigger-router.js.map +1 -0
- package/dist/router/trigger-router.test.d.ts +2 -0
- package/dist/router/trigger-router.test.d.ts.map +1 -0
- package/dist/router/trigger-router.test.js +79 -0
- package/dist/router/trigger-router.test.js.map +1 -0
- package/dist/skills/01-requirement.d.ts +3 -0
- package/dist/skills/01-requirement.d.ts.map +1 -0
- package/dist/skills/01-requirement.js +100 -0
- package/dist/skills/01-requirement.js.map +1 -0
- package/dist/skills/02-task-breakdown.d.ts +3 -0
- package/dist/skills/02-task-breakdown.d.ts.map +1 -0
- package/dist/skills/02-task-breakdown.js +82 -0
- package/dist/skills/02-task-breakdown.js.map +1 -0
- package/dist/skills/03-design.d.ts +3 -0
- package/dist/skills/03-design.d.ts.map +1 -0
- package/dist/skills/03-design.js +80 -0
- package/dist/skills/03-design.js.map +1 -0
- package/dist/skills/04-implementation.d.ts +3 -0
- package/dist/skills/04-implementation.d.ts.map +1 -0
- package/dist/skills/04-implementation.js +77 -0
- package/dist/skills/04-implementation.js.map +1 -0
- package/dist/skills/05-progress-tracking.d.ts +3 -0
- package/dist/skills/05-progress-tracking.d.ts.map +1 -0
- package/dist/skills/05-progress-tracking.js +78 -0
- package/dist/skills/05-progress-tracking.js.map +1 -0
- package/dist/skills/06-task-report.d.ts +3 -0
- package/dist/skills/06-task-report.d.ts.map +1 -0
- package/dist/skills/06-task-report.js +75 -0
- package/dist/skills/06-task-report.js.map +1 -0
- package/dist/skills/07-weekly-report.d.ts +3 -0
- package/dist/skills/07-weekly-report.d.ts.map +1 -0
- package/dist/skills/07-weekly-report.js +101 -0
- package/dist/skills/07-weekly-report.js.map +1 -0
- package/dist/skills/08-code-review.d.ts +3 -0
- package/dist/skills/08-code-review.d.ts.map +1 -0
- package/dist/skills/08-code-review.js +136 -0
- package/dist/skills/08-code-review.js.map +1 -0
- package/dist/skills/09-debug.d.ts +3 -0
- package/dist/skills/09-debug.d.ts.map +1 -0
- package/dist/skills/09-debug.js +151 -0
- package/dist/skills/09-debug.js.map +1 -0
- package/dist/skills/10-tech-research.d.ts +3 -0
- package/dist/skills/10-tech-research.d.ts.map +1 -0
- package/dist/skills/10-tech-research.js +141 -0
- package/dist/skills/10-tech-research.js.map +1 -0
- package/dist/skills/index.d.ts +18 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +51 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/pipeline.d.ts +15 -0
- package/dist/skills/pipeline.d.ts.map +1 -0
- package/dist/skills/pipeline.js +55 -0
- package/dist/skills/pipeline.js.map +1 -0
- package/dist/skills/skills.test.d.ts +2 -0
- package/dist/skills/skills.test.d.ts.map +1 -0
- package/dist/skills/skills.test.js +101 -0
- package/dist/skills/skills.test.js.map +1 -0
- package/dist/skills/types.d.ts +60 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +7 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/templates/copilot-md.template.d.ts +7 -0
- package/dist/templates/copilot-md.template.d.ts.map +1 -0
- package/dist/templates/copilot-md.template.js +293 -0
- package/dist/templates/copilot-md.template.js.map +1 -0
- package/dist/templates/cursor-mdc.template.d.ts +10 -0
- package/dist/templates/cursor-mdc.template.d.ts.map +1 -0
- package/dist/templates/cursor-mdc.template.js +86 -0
- package/dist/templates/cursor-mdc.template.js.map +1 -0
- package/dist/templates/templates.test.d.ts +2 -0
- package/dist/templates/templates.test.d.ts.map +1 -0
- package/dist/templates/templates.test.js +89 -0
- package/dist/templates/templates.test.js.map +1 -0
- package/dist/vscode/commands.d.ts +4 -0
- package/dist/vscode/commands.d.ts.map +1 -0
- package/dist/vscode/commands.js +155 -0
- package/dist/vscode/commands.js.map +1 -0
- package/dist/vscode/extension.d.ts +4 -0
- package/dist/vscode/extension.d.ts.map +1 -0
- package/dist/vscode/extension.js +96 -0
- package/dist/vscode/extension.js.map +1 -0
- package/package.json +71 -0
- package/rules/claude-code/CLAUDE.md +767 -0
- package/rules/cline/.clinerules +622 -0
- package/rules/codebuddy/CODEBUDDY.md +70 -0
- package/rules/continue/.continuerules +622 -0
- package/rules/copilot/copilot-instructions.md +162 -0
- package/rules/cursor/.cursorrules +747 -0
- package/rules/cursor/smart-flow.mdc +763 -0
- package/rules/jetbrains/smart-flow.md +162 -0
- package/rules/lingma/smart-flow.md +133 -0
- package/rules/windsurf/.windsurf/rules/smart-flow.md +162 -0
- package/rules/zed/smart-flow.rules +45 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server(stdio transport)
|
|
4
|
+
* 每个 Skill → 一个 MCP tool
|
|
5
|
+
* 运行:node dist/mcp/server.js 或 npx ethan mcp
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.startMcpServer = startMcpServer;
|
|
42
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
43
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
44
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
45
|
+
const index_1 = require("../skills/index");
|
|
46
|
+
const pipeline_1 = require("../skills/pipeline");
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
|
|
50
|
+
/**
|
|
51
|
+
* 将 SkillDefinition 转换为 MCP Tool 定义
|
|
52
|
+
*/
|
|
53
|
+
function skillToMcpTool(skill) {
|
|
54
|
+
return {
|
|
55
|
+
name: skill.nameEn,
|
|
56
|
+
description: `[${skill.name}] ${skill.description}`,
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
context: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: `用户需求或上下文描述,将作为执行 "${skill.name}" Skill 的输入`,
|
|
63
|
+
},
|
|
64
|
+
format: {
|
|
65
|
+
type: 'string',
|
|
66
|
+
enum: ['full', 'brief'],
|
|
67
|
+
description: 'full=完整执行所有步骤(默认),brief=只返回关键输出',
|
|
68
|
+
default: 'full',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
required: ['context'],
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 生成 Skill 执行结果(Markdown 格式)
|
|
77
|
+
*/
|
|
78
|
+
function executeSkill(skill, context, format) {
|
|
79
|
+
if (format === 'brief') {
|
|
80
|
+
return `## ${skill.name}\n\n${skill.description}\n\n**输入**:${context}\n\n*请根据以上输入,直接输出 ${skill.outputFormat}*`;
|
|
81
|
+
}
|
|
82
|
+
const stepsContent = skill.steps
|
|
83
|
+
.map((step) => `### ${step.title}\n\n${step.content}`)
|
|
84
|
+
.join('\n\n');
|
|
85
|
+
let result = `# 执行 Skill:${skill.name}\n\n`;
|
|
86
|
+
result += `**输入上下文**:${context}\n\n`;
|
|
87
|
+
result += `---\n\n`;
|
|
88
|
+
result += `## 执行流程\n\n${stepsContent}\n\n`;
|
|
89
|
+
result += `---\n\n`;
|
|
90
|
+
result += `## 输出格式\n\n${skill.outputFormat}\n\n`;
|
|
91
|
+
if (skill.notes && skill.notes.length > 0) {
|
|
92
|
+
result += `## 注意事项\n\n${skill.notes.map((n) => `- ${n}`).join('\n')}\n\n`;
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
async function startMcpServer() {
|
|
97
|
+
const server = new index_js_1.Server({
|
|
98
|
+
name: 'ethan-skill',
|
|
99
|
+
version: pkg.version,
|
|
100
|
+
}, {
|
|
101
|
+
capabilities: {
|
|
102
|
+
tools: {},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
const pipelineTool = {
|
|
106
|
+
name: 'ethan_pipeline',
|
|
107
|
+
description: '按 Pipeline 顺序串联执行多个 Skill,适用于完整工作流场景',
|
|
108
|
+
inputSchema: {
|
|
109
|
+
type: 'object',
|
|
110
|
+
properties: {
|
|
111
|
+
pipeline: {
|
|
112
|
+
type: 'string',
|
|
113
|
+
enum: pipeline_1.PIPELINES.map((p) => p.id),
|
|
114
|
+
description: `要执行的 Pipeline ID。可选值:${pipeline_1.PIPELINES.map((p) => `${p.id}(${p.name})`).join('、')}`,
|
|
115
|
+
},
|
|
116
|
+
context: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: '用户需求或上下文描述,将作为 Pipeline 中所有 Skill 的输入基础',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
required: ['pipeline', 'context'],
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
// 注册工具列表处理器
|
|
125
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
126
|
+
return {
|
|
127
|
+
tools: [...index_1.ALL_SKILLS.map(skillToMcpTool), pipelineTool],
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
// 注册工具调用处理器
|
|
131
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
132
|
+
const { name, arguments: args } = request.params;
|
|
133
|
+
// Handle pipeline tool
|
|
134
|
+
if (name === 'ethan_pipeline') {
|
|
135
|
+
const pipelineId = args?.pipeline || '';
|
|
136
|
+
const context = args?.context || '';
|
|
137
|
+
const resolved = (0, pipeline_1.resolvePipeline)(pipelineId);
|
|
138
|
+
if (!resolved) {
|
|
139
|
+
return {
|
|
140
|
+
content: [
|
|
141
|
+
{
|
|
142
|
+
type: 'text',
|
|
143
|
+
text: `Unknown pipeline: ${pipelineId}. Available: ${pipeline_1.PIPELINES.map((p) => p.id).join(', ')}`,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
isError: true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const { pipeline, skills } = resolved;
|
|
150
|
+
let result = `# Pipeline 执行:${pipeline.name}\n\n`;
|
|
151
|
+
result += `**描述**:${pipeline.description}\n\n`;
|
|
152
|
+
result += `**包含 Skill**:${skills.map((s) => s.name).join(' → ')}\n\n`;
|
|
153
|
+
result += `**输入上下文**:${context}\n\n`;
|
|
154
|
+
result += `${'='.repeat(60)}\n\n`;
|
|
155
|
+
result += skills
|
|
156
|
+
.map((skill) => executeSkill(skill, context, 'full'))
|
|
157
|
+
.join('\n\n---\n\n');
|
|
158
|
+
return {
|
|
159
|
+
content: [{ type: 'text', text: result }],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const skill = index_1.ALL_SKILLS.find((s) => s.nameEn === name);
|
|
163
|
+
if (!skill) {
|
|
164
|
+
return {
|
|
165
|
+
content: [
|
|
166
|
+
{
|
|
167
|
+
type: 'text',
|
|
168
|
+
text: `Unknown tool: ${name}. Available tools: ${index_1.ALL_SKILLS.map((s) => s.nameEn).join(', ')}, ethan_pipeline`,
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
isError: true,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const context = args?.context || '';
|
|
175
|
+
const format = (args?.format || 'full');
|
|
176
|
+
const result = executeSkill(skill, context, format);
|
|
177
|
+
return {
|
|
178
|
+
content: [
|
|
179
|
+
{
|
|
180
|
+
type: 'text',
|
|
181
|
+
text: result,
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
// 启动 stdio transport
|
|
187
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
188
|
+
await server.connect(transport);
|
|
189
|
+
// MCP server 运行时不输出到 stdout(会破坏协议)
|
|
190
|
+
process.stderr.write(`Ethan MCP Server v${pkg.version} running (${index_1.ALL_SKILLS.length} skill tools + 1 pipeline tool, ${pipeline_1.PIPELINES.length} pipelines)\n`);
|
|
191
|
+
}
|
|
192
|
+
// 直接运行时启动
|
|
193
|
+
if (require.main === module) {
|
|
194
|
+
startMcpServer().catch((err) => {
|
|
195
|
+
process.stderr.write(`MCP Server error: ${err}\n`);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SkillDefinition } from '../skills/types';
|
|
2
|
+
export interface RouteResult {
|
|
3
|
+
skill: SkillDefinition;
|
|
4
|
+
matchedTrigger: string;
|
|
5
|
+
confidence: 'exact' | 'partial';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 根据用户输入路由到对应 Skill
|
|
9
|
+
* 优先精确匹配,其次模糊匹配
|
|
10
|
+
*/
|
|
11
|
+
export declare function routeTrigger(input: string): RouteResult | null;
|
|
12
|
+
/**
|
|
13
|
+
* 获取所有触发词映射表(用于展示和调试)
|
|
14
|
+
*/
|
|
15
|
+
export declare function getTriggerMap(): Map<string, SkillDefinition>;
|
|
16
|
+
//# sourceMappingURL=trigger-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-router.d.ts","sourceRoot":"","sources":["../../src/router/trigger-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAwB9D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAQ5D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.routeTrigger = routeTrigger;
|
|
4
|
+
exports.getTriggerMap = getTriggerMap;
|
|
5
|
+
const index_1 = require("../skills/index");
|
|
6
|
+
/**
|
|
7
|
+
* 根据用户输入路由到对应 Skill
|
|
8
|
+
* 优先精确匹配,其次模糊匹配
|
|
9
|
+
*/
|
|
10
|
+
function routeTrigger(input) {
|
|
11
|
+
const normalized = input.trim().toLowerCase();
|
|
12
|
+
if (normalized.length === 0)
|
|
13
|
+
return null;
|
|
14
|
+
// 精确匹配:输入完全等于某个触发词
|
|
15
|
+
for (const skill of index_1.ALL_SKILLS) {
|
|
16
|
+
for (const trigger of skill.triggers) {
|
|
17
|
+
if (normalized === trigger.toLowerCase()) {
|
|
18
|
+
return { skill, matchedTrigger: trigger, confidence: 'exact' };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// 部分匹配:输入包含触发词,或触发词包含在输入中
|
|
23
|
+
for (const skill of index_1.ALL_SKILLS) {
|
|
24
|
+
for (const trigger of skill.triggers) {
|
|
25
|
+
const t = trigger.toLowerCase();
|
|
26
|
+
if (normalized.includes(t) || t.includes(normalized)) {
|
|
27
|
+
return { skill, matchedTrigger: trigger, confidence: 'partial' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取所有触发词映射表(用于展示和调试)
|
|
35
|
+
*/
|
|
36
|
+
function getTriggerMap() {
|
|
37
|
+
const map = new Map();
|
|
38
|
+
for (const skill of index_1.ALL_SKILLS) {
|
|
39
|
+
for (const trigger of skill.triggers) {
|
|
40
|
+
map.set(trigger.toLowerCase(), skill);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return map;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=trigger-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-router.js","sourceRoot":"","sources":["../../src/router/trigger-router.ts"],"names":[],"mappings":";;AAaA,oCAwBC;AAKD,sCAQC;AAjDD,2CAA6C;AAQ7C;;;GAGG;AACH,SAAgB,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,mBAAmB;IACnB,KAAK,MAAM,KAAK,IAAI,kBAAU,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,UAAU,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,MAAM,KAAK,IAAI,kBAAU,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAChC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa;IAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,kBAAU,EAAE,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-router.test.d.ts","sourceRoot":"","sources":["../../src/router/trigger-router.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const trigger_router_1 = require("./trigger-router");
|
|
5
|
+
(0, vitest_1.describe)('routeTrigger', () => {
|
|
6
|
+
(0, vitest_1.it)('returns null for empty input', () => {
|
|
7
|
+
(0, vitest_1.expect)((0, trigger_router_1.routeTrigger)('')).toBeNull();
|
|
8
|
+
});
|
|
9
|
+
(0, vitest_1.it)('returns null for whitespace-only input', () => {
|
|
10
|
+
(0, vitest_1.expect)((0, trigger_router_1.routeTrigger)(' ')).toBeNull();
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('returns null for unrecognized input', () => {
|
|
13
|
+
(0, vitest_1.expect)((0, trigger_router_1.routeTrigger)('this is completely unrelated input xyz')).toBeNull();
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('exact match: "需求理解" → requirement-understanding', () => {
|
|
16
|
+
const result = (0, trigger_router_1.routeTrigger)('需求理解');
|
|
17
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
18
|
+
(0, vitest_1.expect)(result.skill.id).toBe('requirement-understanding');
|
|
19
|
+
(0, vitest_1.expect)(result.confidence).toBe('exact');
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('exact match is case-insensitive', () => {
|
|
22
|
+
const result = (0, trigger_router_1.routeTrigger)('Code Review');
|
|
23
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
24
|
+
(0, vitest_1.expect)(result.skill.id).toBe('code-review');
|
|
25
|
+
(0, vitest_1.expect)(result.confidence).toBe('exact');
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)('exact match: "debug" → debug skill', () => {
|
|
28
|
+
const result = (0, trigger_router_1.routeTrigger)('debug');
|
|
29
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
30
|
+
(0, vitest_1.expect)(result.skill.id).toBe('debug');
|
|
31
|
+
(0, vitest_1.expect)(result.confidence).toBe('exact');
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('exact match: "@ethan 需求" → requirement-understanding', () => {
|
|
34
|
+
const result = (0, trigger_router_1.routeTrigger)('@ethan 需求');
|
|
35
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
36
|
+
(0, vitest_1.expect)(result.skill.id).toBe('requirement-understanding');
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('partial match: input contains a trigger keyword', () => {
|
|
39
|
+
const result = (0, trigger_router_1.routeTrigger)('帮我做一下需求理解');
|
|
40
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
41
|
+
(0, vitest_1.expect)(result.confidence).toBe('partial');
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('partial match: trigger is contained in a longer input', () => {
|
|
44
|
+
const result = (0, trigger_router_1.routeTrigger)('我想做一个 POC 验证');
|
|
45
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
46
|
+
(0, vitest_1.expect)(result.skill.id).toBe('tech-research');
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('returns the matchedTrigger field', () => {
|
|
49
|
+
const result = (0, trigger_router_1.routeTrigger)('任务拆解');
|
|
50
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
51
|
+
(0, vitest_1.expect)(result.matchedTrigger).toBeDefined();
|
|
52
|
+
(0, vitest_1.expect)(typeof result.matchedTrigger).toBe('string');
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('trimming: leading/trailing whitespace does not break exact match', () => {
|
|
55
|
+
const result = (0, trigger_router_1.routeTrigger)(' 周报 ');
|
|
56
|
+
(0, vitest_1.expect)(result).not.toBeNull();
|
|
57
|
+
(0, vitest_1.expect)(result.skill.id).toBe('weekly-report');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.describe)('getTriggerMap', () => {
|
|
61
|
+
(0, vitest_1.it)('returns a Map', () => {
|
|
62
|
+
(0, vitest_1.expect)((0, trigger_router_1.getTriggerMap)()).toBeInstanceOf(Map);
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)('map is non-empty', () => {
|
|
65
|
+
(0, vitest_1.expect)((0, trigger_router_1.getTriggerMap)().size).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('all map keys are lowercase', () => {
|
|
68
|
+
for (const key of (0, trigger_router_1.getTriggerMap)().keys()) {
|
|
69
|
+
(0, vitest_1.expect)(key).toBe(key.toLowerCase());
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.it)('each map value has an id and name', () => {
|
|
73
|
+
for (const skill of (0, trigger_router_1.getTriggerMap)().values()) {
|
|
74
|
+
(0, vitest_1.expect)(skill.id).toBeTruthy();
|
|
75
|
+
(0, vitest_1.expect)(skill.name).toBeTruthy();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=trigger-router.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-router.test.js","sourceRoot":"","sources":["../../src/router/trigger-router.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"01-requirement.d.ts","sourceRoot":"","sources":["../../src/skills/01-requirement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,gBAAgB,EAAE,eAgG9B,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.requirementSkill = void 0;
|
|
4
|
+
exports.requirementSkill = {
|
|
5
|
+
id: 'requirement-understanding',
|
|
6
|
+
name: '需求理解',
|
|
7
|
+
nameEn: 'requirement_understanding',
|
|
8
|
+
order: 1,
|
|
9
|
+
description: '深度解析用户需求,消除歧义,输出结构化需求文档',
|
|
10
|
+
detailDescription: `当用户提出需求时,执行深度需求理解流程:分析核心目标、识别隐含需求、
|
|
11
|
+
消除歧义点,最终输出结构化的需求确认文档,确保开发方向正确。`,
|
|
12
|
+
triggers: [
|
|
13
|
+
'需求理解',
|
|
14
|
+
'理解需求',
|
|
15
|
+
'分析需求',
|
|
16
|
+
'需求分析',
|
|
17
|
+
'我需要',
|
|
18
|
+
'帮我做',
|
|
19
|
+
'实现一个',
|
|
20
|
+
'开发一个',
|
|
21
|
+
'/需求理解',
|
|
22
|
+
'@ethan 需求',
|
|
23
|
+
],
|
|
24
|
+
steps: [
|
|
25
|
+
{
|
|
26
|
+
title: '1. 提取核心诉求',
|
|
27
|
+
content: `- 用一句话总结用户最终想实现的**业务目标**
|
|
28
|
+
- 区分"功能需求"(要做什么)与"非功能需求"(性能、安全、兼容性等)
|
|
29
|
+
- 识别隐含的技术约束(语言栈、框架版本、部署环境)`,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
title: '2. 识别歧义与缺失信息',
|
|
33
|
+
content: `- 列出所有**不明确**的地方(用 ❓ 标记)
|
|
34
|
+
- 列出**缺失**但必须明确的信息(用 ⚠️ 标记)
|
|
35
|
+
- 最多提出 3 个最关键的澄清问题,避免信息过载`,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
title: '3. 假设声明',
|
|
39
|
+
content: `- 对于无法立即澄清的歧义,明确列出你的**假设前提**
|
|
40
|
+
- 格式:「假设 X,如果实际是 Y,则需要调整 Z」`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
title: '4. 输出结构化需求文档',
|
|
44
|
+
content: `按以下模板输出:
|
|
45
|
+
|
|
46
|
+
\`\`\`markdown
|
|
47
|
+
## 需求理解确认
|
|
48
|
+
|
|
49
|
+
### 核心目标
|
|
50
|
+
[一句话描述]
|
|
51
|
+
|
|
52
|
+
### 功能需求
|
|
53
|
+
- [ ] 功能点 1
|
|
54
|
+
- [ ] 功能点 2
|
|
55
|
+
|
|
56
|
+
### 非功能需求
|
|
57
|
+
- 性能:[描述]
|
|
58
|
+
- 兼容性:[描述]
|
|
59
|
+
|
|
60
|
+
### 技术约束
|
|
61
|
+
- [约束条件]
|
|
62
|
+
|
|
63
|
+
### 待澄清问题
|
|
64
|
+
❓ 1. [问题]
|
|
65
|
+
⚠️ 2. [缺失信息]
|
|
66
|
+
|
|
67
|
+
### 当前假设
|
|
68
|
+
- 假设 [A],如果实际是 [B],则 [调整]
|
|
69
|
+
\`\`\``,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
outputFormat: 'Markdown 结构化文档,包含核心目标、功能需求列表、非功能需求、技术约束、待澄清问题和假设声明',
|
|
73
|
+
examples: [
|
|
74
|
+
{
|
|
75
|
+
input: '帮我做一个用户登录功能',
|
|
76
|
+
output: `## 需求理解确认
|
|
77
|
+
|
|
78
|
+
### 核心目标
|
|
79
|
+
实现安全的用户身份认证,允许用户通过账号密码登录系统。
|
|
80
|
+
|
|
81
|
+
### 功能需求
|
|
82
|
+
- [ ] 用户名/邮箱 + 密码登录
|
|
83
|
+
- [ ] 登录失败错误提示
|
|
84
|
+
- [ ] 登录状态持久化(记住登录)
|
|
85
|
+
|
|
86
|
+
### 待澄清问题
|
|
87
|
+
❓ 1. 是否需要支持第三方登录(微信、GitHub)?
|
|
88
|
+
❓ 2. Token 有效期要求?
|
|
89
|
+
⚠️ 3. 后端 API 是否已有,还是需要一起实现?`,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
notes: [
|
|
93
|
+
'不要急于给出解决方案,先确保完全理解需求',
|
|
94
|
+
'澄清问题不超过 3 个,聚焦最关键的',
|
|
95
|
+
'假设声明必须明确,避免隐式假设导致方向偏差',
|
|
96
|
+
],
|
|
97
|
+
category: '需求侧',
|
|
98
|
+
nextSkill: 'task-breakdown',
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=01-requirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"01-requirement.js","sourceRoot":"","sources":["../../src/skills/01-requirement.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAoB;IAC/C,EAAE,EAAE,2BAA2B;IAC/B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,yBAAyB;IACtC,iBAAiB,EAAE;+BACU;IAC7B,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,KAAK;QACL,MAAM;QACN,MAAM;QACN,OAAO;QACP,WAAW;KACZ;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;2BAEY;SACtB;QACD;YACE,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE;;0BAEW;SACrB;QACD;YACE,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE;4BACa;SACvB;QACD;YACE,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;OAyBR;SACF;KACF;IACD,YAAY,EACV,oDAAoD;IACtD,QAAQ,EAAE;QACR;YACE,KAAK,EAAE,aAAa;YACpB,MAAM,EAAE;;;;;;;;;;;;;4BAac;SACvB;KACF;IACD,KAAK,EAAE;QACL,sBAAsB;QACtB,oBAAoB;QACpB,uBAAuB;KACxB;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,gBAAgB;CAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-task-breakdown.d.ts","sourceRoot":"","sources":["../../src/skills/02-task-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,kBAAkB,EAAE,eA6EhC,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.taskBreakdownSkill = void 0;
|
|
4
|
+
exports.taskBreakdownSkill = {
|
|
5
|
+
id: 'task-breakdown',
|
|
6
|
+
name: '任务拆解',
|
|
7
|
+
nameEn: 'task_breakdown',
|
|
8
|
+
order: 2,
|
|
9
|
+
description: '将复杂需求拆解为可执行的原子任务,建立依赖关系和优先级',
|
|
10
|
+
detailDescription: `将已理解的需求拆解为具体可执行的任务列表,建立任务间的依赖关系,
|
|
11
|
+
评估复杂度,制定合理的执行顺序,为后续实现提供清晰路线图。`,
|
|
12
|
+
triggers: [
|
|
13
|
+
'任务拆解',
|
|
14
|
+
'拆解任务',
|
|
15
|
+
'拆分任务',
|
|
16
|
+
'制定计划',
|
|
17
|
+
'任务规划',
|
|
18
|
+
'怎么实现',
|
|
19
|
+
'实现步骤',
|
|
20
|
+
'/任务拆解',
|
|
21
|
+
'@ethan 拆解',
|
|
22
|
+
],
|
|
23
|
+
steps: [
|
|
24
|
+
{
|
|
25
|
+
title: '1. 识别主要模块',
|
|
26
|
+
content: `- 将需求按**功能域**或**技术层**划分为 3-7 个主要模块
|
|
27
|
+
- 每个模块用一行说明其职责
|
|
28
|
+
- 标注模块类型:[前端 UI] [后端 API] [数据库] [基础设施] [测试]`,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: '2. 拆解为原子任务',
|
|
32
|
+
content: `- 每个原子任务满足:**单人、半天内可完成**
|
|
33
|
+
- 任务命名格式:「动词 + 对象 + 可选限定」
|
|
34
|
+
- ✅ 「实现用户登录 API(POST /auth/login)」
|
|
35
|
+
- ❌ 「做登录」(太模糊)
|
|
36
|
+
- 标注预估工时:[S=2h] [M=4h] [L=8h] [XL=需再拆]`,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
title: '3. 建立依赖关系',
|
|
40
|
+
content: `- 用 → 表示依赖:「A → B」意为「完成 A 才能开始 B」
|
|
41
|
+
- 识别可以**并行**执行的任务组
|
|
42
|
+
- 找出**关键路径**(决定最短完成时间的任务链)`,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
title: '4. 输出任务清单',
|
|
46
|
+
content: `按以下格式输出:
|
|
47
|
+
|
|
48
|
+
\`\`\`markdown
|
|
49
|
+
## 任务拆解
|
|
50
|
+
|
|
51
|
+
### 模块概览
|
|
52
|
+
| 模块 | 职责 | 预估任务数 |
|
|
53
|
+
|------|------|-----------|
|
|
54
|
+
| [模块名] | [职责] | [数量] |
|
|
55
|
+
|
|
56
|
+
### 任务列表
|
|
57
|
+
|
|
58
|
+
#### 阶段一:[阶段名](可并行)
|
|
59
|
+
- [ ] T01 [任务名] [S/M/L]
|
|
60
|
+
- [ ] T02 [任务名] [S/M/L]
|
|
61
|
+
|
|
62
|
+
#### 阶段二:[阶段名](依赖阶段一)
|
|
63
|
+
- [ ] T03 [任务名] [S/M/L] 依赖:T01
|
|
64
|
+
|
|
65
|
+
### 关键路径
|
|
66
|
+
T01 → T03 → T05(预估总工时:X 天)
|
|
67
|
+
|
|
68
|
+
### 并行机会
|
|
69
|
+
T02 可与 T01 同时进行
|
|
70
|
+
\`\`\``,
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
outputFormat: 'Markdown 表格 + 任务列表,含模块概览、分阶段任务、依赖关系、关键路径',
|
|
74
|
+
notes: [
|
|
75
|
+
'任务粒度宁细勿粗,XL 任务必须继续拆解',
|
|
76
|
+
'优先识别阻塞性任务(其他任务依赖它的),优先排期',
|
|
77
|
+
'第一阶段任务应尽量可并行,提高效率',
|
|
78
|
+
],
|
|
79
|
+
category: '需求侧',
|
|
80
|
+
nextSkill: 'solution-design',
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=02-task-breakdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"02-task-breakdown.js","sourceRoot":"","sources":["../../src/skills/02-task-breakdown.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAoB;IACjD,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,CAAC;IACR,WAAW,EAAE,6BAA6B;IAC1C,iBAAiB,EAAE;8BACS;IAC5B,QAAQ,EAAE;QACR,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,WAAW;KACZ;IACD,KAAK,EAAE;QACL;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;4CAE6B;SACvC;QACD;YACE,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE;;;;uCAIwB;SAClC;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;2BAEY;SACtB;QACD;YACE,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;OAwBR;SACF;KACF;IACD,YAAY,EAAE,0CAA0C;IACxD,KAAK,EAAE;QACL,sBAAsB;QACtB,0BAA0B;QAC1B,mBAAmB;KACpB;IACD,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,iBAAiB;CAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"03-design.d.ts","sourceRoot":"","sources":["../../src/skills/03-design.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,eA4EzB,CAAC"}
|