@qq33357486/oh-my-task 1.4.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/LICENSE +21 -0
- package/README.md +315 -0
- package/dist/api/middleware/auth.d.ts +26 -0
- package/dist/api/middleware/auth.d.ts.map +1 -0
- package/dist/api/middleware/auth.js +90 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/middleware/captcha.d.ts +6 -0
- package/dist/api/middleware/captcha.d.ts.map +1 -0
- package/dist/api/middleware/captcha.js +47 -0
- package/dist/api/middleware/captcha.js.map +1 -0
- package/dist/api/middleware/ownerCheck.d.ts +22 -0
- package/dist/api/middleware/ownerCheck.d.ts.map +1 -0
- package/dist/api/middleware/ownerCheck.js +138 -0
- package/dist/api/middleware/ownerCheck.js.map +1 -0
- package/dist/api/routes/auth.d.ts +8 -0
- package/dist/api/routes/auth.d.ts.map +1 -0
- package/dist/api/routes/auth.js +136 -0
- package/dist/api/routes/auth.js.map +1 -0
- package/dist/api/routes/config.d.ts +3 -0
- package/dist/api/routes/config.d.ts.map +1 -0
- package/dist/api/routes/config.js +26 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/projects.d.ts +3 -0
- package/dist/api/routes/projects.d.ts.map +1 -0
- package/dist/api/routes/projects.js +54 -0
- package/dist/api/routes/projects.js.map +1 -0
- package/dist/api/routes/schedule.d.ts +3 -0
- package/dist/api/routes/schedule.d.ts.map +1 -0
- package/dist/api/routes/schedule.js +92 -0
- package/dist/api/routes/schedule.js.map +1 -0
- package/dist/api/routes/sops.d.ts +3 -0
- package/dist/api/routes/sops.d.ts.map +1 -0
- package/dist/api/routes/sops.js +155 -0
- package/dist/api/routes/sops.js.map +1 -0
- package/dist/api/routes/tasks.d.ts +3 -0
- package/dist/api/routes/tasks.d.ts.map +1 -0
- package/dist/api/routes/tasks.js +218 -0
- package/dist/api/routes/tasks.js.map +1 -0
- package/dist/api/routes/tokens.d.ts +3 -0
- package/dist/api/routes/tokens.d.ts.map +1 -0
- package/dist/api/routes/tokens.js +77 -0
- package/dist/api/routes/tokens.js.map +1 -0
- package/dist/api/routes/users.d.ts +3 -0
- package/dist/api/routes/users.d.ts.map +1 -0
- package/dist/api/routes/users.js +94 -0
- package/dist/api/routes/users.js.map +1 -0
- package/dist/api/routes/versions.d.ts +3 -0
- package/dist/api/routes/versions.d.ts.map +1 -0
- package/dist/api/routes/versions.js +156 -0
- package/dist/api/routes/versions.js.map +1 -0
- package/dist/api/server.d.ts +4 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +70 -0
- package/dist/api/server.js.map +1 -0
- package/dist/db/connection.d.ts +15 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +158 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/init.d.ts +2 -0
- package/dist/db/init.d.ts.map +1 -0
- package/dist/db/init.js +5 -0
- package/dist/db/init.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +146 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/activate-task.d.ts +10 -0
- package/dist/mcp/tools/activate-task.d.ts.map +1 -0
- package/dist/mcp/tools/activate-task.js +52 -0
- package/dist/mcp/tools/activate-task.js.map +1 -0
- package/dist/mcp/tools/add-task-note.d.ts +10 -0
- package/dist/mcp/tools/add-task-note.d.ts.map +1 -0
- package/dist/mcp/tools/add-task-note.js +46 -0
- package/dist/mcp/tools/add-task-note.js.map +1 -0
- package/dist/mcp/tools/approve-task.d.ts +10 -0
- package/dist/mcp/tools/approve-task.d.ts.map +1 -0
- package/dist/mcp/tools/approve-task.js +59 -0
- package/dist/mcp/tools/approve-task.js.map +1 -0
- package/dist/mcp/tools/archive-version.d.ts +10 -0
- package/dist/mcp/tools/archive-version.d.ts.map +1 -0
- package/dist/mcp/tools/archive-version.js +57 -0
- package/dist/mcp/tools/archive-version.js.map +1 -0
- package/dist/mcp/tools/assign-task.d.ts +10 -0
- package/dist/mcp/tools/assign-task.d.ts.map +1 -0
- package/dist/mcp/tools/assign-task.js +53 -0
- package/dist/mcp/tools/assign-task.js.map +1 -0
- package/dist/mcp/tools/complete-task.d.ts +10 -0
- package/dist/mcp/tools/complete-task.d.ts.map +1 -0
- package/dist/mcp/tools/complete-task.js +46 -0
- package/dist/mcp/tools/complete-task.js.map +1 -0
- package/dist/mcp/tools/create-sop.d.ts +10 -0
- package/dist/mcp/tools/create-sop.d.ts.map +1 -0
- package/dist/mcp/tools/create-sop.js +90 -0
- package/dist/mcp/tools/create-sop.js.map +1 -0
- package/dist/mcp/tools/create-task.d.ts +10 -0
- package/dist/mcp/tools/create-task.d.ts.map +1 -0
- package/dist/mcp/tools/create-task.js +138 -0
- package/dist/mcp/tools/create-task.js.map +1 -0
- package/dist/mcp/tools/create-version.d.ts +10 -0
- package/dist/mcp/tools/create-version.d.ts.map +1 -0
- package/dist/mcp/tools/create-version.js +86 -0
- package/dist/mcp/tools/create-version.js.map +1 -0
- package/dist/mcp/tools/delete-task.d.ts +10 -0
- package/dist/mcp/tools/delete-task.d.ts.map +1 -0
- package/dist/mcp/tools/delete-task.js +34 -0
- package/dist/mcp/tools/delete-task.js.map +1 -0
- package/dist/mcp/tools/get-my-tasks.d.ts +10 -0
- package/dist/mcp/tools/get-my-tasks.d.ts.map +1 -0
- package/dist/mcp/tools/get-my-tasks.js +88 -0
- package/dist/mcp/tools/get-my-tasks.js.map +1 -0
- package/dist/mcp/tools/get-next-task.d.ts +10 -0
- package/dist/mcp/tools/get-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/get-next-task.js +84 -0
- package/dist/mcp/tools/get-next-task.js.map +1 -0
- package/dist/mcp/tools/get-sop.d.ts +10 -0
- package/dist/mcp/tools/get-sop.d.ts.map +1 -0
- package/dist/mcp/tools/get-sop.js +67 -0
- package/dist/mcp/tools/get-sop.js.map +1 -0
- package/dist/mcp/tools/get-task-context.d.ts +10 -0
- package/dist/mcp/tools/get-task-context.d.ts.map +1 -0
- package/dist/mcp/tools/get-task-context.js +114 -0
- package/dist/mcp/tools/get-task-context.js.map +1 -0
- package/dist/mcp/tools/get-task.d.ts +10 -0
- package/dist/mcp/tools/get-task.d.ts.map +1 -0
- package/dist/mcp/tools/get-task.js +61 -0
- package/dist/mcp/tools/get-task.js.map +1 -0
- package/dist/mcp/tools/helpers.d.ts +10 -0
- package/dist/mcp/tools/helpers.d.ts.map +1 -0
- package/dist/mcp/tools/helpers.js +17 -0
- package/dist/mcp/tools/helpers.js.map +1 -0
- package/dist/mcp/tools/init-project.d.ts +12 -0
- package/dist/mcp/tools/init-project.d.ts.map +1 -0
- package/dist/mcp/tools/init-project.js +162 -0
- package/dist/mcp/tools/init-project.js.map +1 -0
- package/dist/mcp/tools/list-sops.d.ts +10 -0
- package/dist/mcp/tools/list-sops.d.ts.map +1 -0
- package/dist/mcp/tools/list-sops.js +57 -0
- package/dist/mcp/tools/list-sops.js.map +1 -0
- package/dist/mcp/tools/list-tasks.d.ts +10 -0
- package/dist/mcp/tools/list-tasks.d.ts.map +1 -0
- package/dist/mcp/tools/list-tasks.js +96 -0
- package/dist/mcp/tools/list-tasks.js.map +1 -0
- package/dist/mcp/tools/list-versions.d.ts +10 -0
- package/dist/mcp/tools/list-versions.d.ts.map +1 -0
- package/dist/mcp/tools/list-versions.js +76 -0
- package/dist/mcp/tools/list-versions.js.map +1 -0
- package/dist/mcp/tools/reject-task.d.ts +10 -0
- package/dist/mcp/tools/reject-task.d.ts.map +1 -0
- package/dist/mcp/tools/reject-task.js +63 -0
- package/dist/mcp/tools/reject-task.js.map +1 -0
- package/dist/mcp/tools/reschedule.d.ts +17 -0
- package/dist/mcp/tools/reschedule.d.ts.map +1 -0
- package/dist/mcp/tools/reschedule.js +107 -0
- package/dist/mcp/tools/reschedule.js.map +1 -0
- package/dist/mcp/tools/start-task.d.ts +10 -0
- package/dist/mcp/tools/start-task.d.ts.map +1 -0
- package/dist/mcp/tools/start-task.js +42 -0
- package/dist/mcp/tools/start-task.js.map +1 -0
- package/dist/mcp/tools/submit-for-review.d.ts +10 -0
- package/dist/mcp/tools/submit-for-review.d.ts.map +1 -0
- package/dist/mcp/tools/submit-for-review.js +64 -0
- package/dist/mcp/tools/submit-for-review.js.map +1 -0
- package/dist/mcp/tools/update-sop.d.ts +10 -0
- package/dist/mcp/tools/update-sop.d.ts.map +1 -0
- package/dist/mcp/tools/update-sop.js +113 -0
- package/dist/mcp/tools/update-sop.js.map +1 -0
- package/dist/mcp/tools/update-task-doc.d.ts +10 -0
- package/dist/mcp/tools/update-task-doc.d.ts.map +1 -0
- package/dist/mcp/tools/update-task-doc.js +70 -0
- package/dist/mcp/tools/update-task-doc.js.map +1 -0
- package/dist/mcp/tools/update-task.d.ts +10 -0
- package/dist/mcp/tools/update-task.d.ts.map +1 -0
- package/dist/mcp/tools/update-task.js +106 -0
- package/dist/mcp/tools/update-task.js.map +1 -0
- package/dist/mcp/tools/utils/config.d.ts +35 -0
- package/dist/mcp/tools/utils/config.d.ts.map +1 -0
- package/dist/mcp/tools/utils/config.js +81 -0
- package/dist/mcp/tools/utils/config.js.map +1 -0
- package/dist/services/config.service.d.ts +6 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +48 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/project.service.d.ts +29 -0
- package/dist/services/project.service.d.ts.map +1 -0
- package/dist/services/project.service.js +111 -0
- package/dist/services/project.service.js.map +1 -0
- package/dist/services/schedule.service.d.ts +104 -0
- package/dist/services/schedule.service.d.ts.map +1 -0
- package/dist/services/schedule.service.js +362 -0
- package/dist/services/schedule.service.js.map +1 -0
- package/dist/services/session.service.d.ts +5 -0
- package/dist/services/session.service.d.ts.map +1 -0
- package/dist/services/session.service.js +30 -0
- package/dist/services/session.service.js.map +1 -0
- package/dist/services/sop.service.d.ts +53 -0
- package/dist/services/sop.service.d.ts.map +1 -0
- package/dist/services/sop.service.js +275 -0
- package/dist/services/sop.service.js.map +1 -0
- package/dist/services/task.service.d.ts +62 -0
- package/dist/services/task.service.d.ts.map +1 -0
- package/dist/services/task.service.js +546 -0
- package/dist/services/task.service.js.map +1 -0
- package/dist/services/token.service.d.ts +37 -0
- package/dist/services/token.service.d.ts.map +1 -0
- package/dist/services/token.service.js +99 -0
- package/dist/services/token.service.js.map +1 -0
- package/dist/services/user.service.d.ts +95 -0
- package/dist/services/user.service.d.ts.map +1 -0
- package/dist/services/user.service.js +275 -0
- package/dist/services/user.service.js.map +1 -0
- package/dist/services/version.service.d.ts +70 -0
- package/dist/services/version.service.d.ts.map +1 -0
- package/dist/services/version.service.js +225 -0
- package/dist/services/version.service.js.map +1 -0
- package/dist/types/index.d.ts +207 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/password.d.ts +16 -0
- package/dist/utils/password.d.ts.map +1 -0
- package/dist/utils/password.js +37 -0
- package/dist/utils/password.js.map +1 -0
- package/dist/utils/validation.d.ts +13 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +20 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +65 -0
- package/src/db/schema.sql +162 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const getTaskContextTool = {
|
|
2
|
+
name: 'get_task_context',
|
|
3
|
+
description: '获取任务完整上下文(用于断点续传)。一次性返回任务的基本信息、需求文档、设计文档、当前情况、最近历史和子任务摘要。',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
task_id: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
description: '任务ID',
|
|
10
|
+
},
|
|
11
|
+
history_limit: {
|
|
12
|
+
type: 'number',
|
|
13
|
+
description: '返回的历史记录条数,默认 5',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
required: ['task_id'],
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const STATUS_EMOJI = {
|
|
20
|
+
planned: '📋',
|
|
21
|
+
in_progress: '🔄',
|
|
22
|
+
done: '✅',
|
|
23
|
+
};
|
|
24
|
+
function formatContext(ctx) {
|
|
25
|
+
const emoji = STATUS_EMOJI[ctx.status] || '📌';
|
|
26
|
+
let output = `# 任务上下文:${ctx.title}
|
|
27
|
+
|
|
28
|
+
## 📌 基本信息
|
|
29
|
+
| 项目 | 值 |
|
|
30
|
+
|------|-----|
|
|
31
|
+
| ID | ${ctx.id} |
|
|
32
|
+
| 状态 | ${emoji} ${ctx.status} |
|
|
33
|
+
| 负责人 | ${ctx.assignee?.name || '未分配'} |
|
|
34
|
+
| 开始日期 | ${ctx.start_date || '-'} |
|
|
35
|
+
| 截止日期 | ${ctx.due_date || '-'} |
|
|
36
|
+
| 预估工时 | ${ctx.estimated_days ? `${ctx.estimated_days} 天` : '-'} |
|
|
37
|
+
| 实际开始 | ${ctx.actual_start || '-'} |
|
|
38
|
+
| 实际完成 | ${ctx.actual_end || '-'} |
|
|
39
|
+
`;
|
|
40
|
+
output += `\n## 📋 需求文档\n`;
|
|
41
|
+
if (ctx.requirement_doc) {
|
|
42
|
+
output += ctx.requirement_doc + '\n';
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
output += '_暂无需求文档,使用 update_task_doc 添加_\n';
|
|
46
|
+
}
|
|
47
|
+
output += `\n## 🎨 设计文档\n`;
|
|
48
|
+
if (ctx.design_doc) {
|
|
49
|
+
output += ctx.design_doc + '\n';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
output += '_暂无设计文档,使用 update_task_doc 添加_\n';
|
|
53
|
+
}
|
|
54
|
+
output += `\n## 📍 当前情况\n`;
|
|
55
|
+
if (ctx.current_status) {
|
|
56
|
+
output += ctx.current_status + '\n';
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
output += '_暂无当前情况记录,使用 update_task_doc 添加_\n';
|
|
60
|
+
}
|
|
61
|
+
output += `\n## 📜 最近历史\n`;
|
|
62
|
+
if (ctx.recent_history.length > 0) {
|
|
63
|
+
output += '| 时间 | 操作 | 内容 |\n|------|------|------|\n';
|
|
64
|
+
for (const h of ctx.recent_history) {
|
|
65
|
+
const time = h.changed_at.substring(0, 16).replace('T', ' ');
|
|
66
|
+
const action = h.action === 'noted' ? '备注' :
|
|
67
|
+
h.action === 'status_changed' ? '状态变更' :
|
|
68
|
+
h.action === 'created' ? '创建' :
|
|
69
|
+
h.action === 'assigned' ? '分配' : '更新';
|
|
70
|
+
const content = h.action === 'noted' ? h.new_value :
|
|
71
|
+
h.action === 'status_changed' ? `${h.old_value} → ${h.new_value}` :
|
|
72
|
+
h.field ? `${h.field}: ${h.old_value || '-'} → ${h.new_value || '-'}` : '-';
|
|
73
|
+
output += `| ${time} | ${action} | ${content} |\n`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
output += '_暂无历史记录_\n';
|
|
78
|
+
}
|
|
79
|
+
output += `\n## 📂 子任务 (${ctx.children_summary.done}/${ctx.children_summary.total} 完成)\n`;
|
|
80
|
+
if (ctx.children_summary.children.length > 0) {
|
|
81
|
+
for (const child of ctx.children_summary.children) {
|
|
82
|
+
const childEmoji = STATUS_EMOJI[child.status] || '📌';
|
|
83
|
+
const marker = child.status === 'done' ? '[x]' :
|
|
84
|
+
child.status === 'in_progress' ? '[→]' : '[ ]';
|
|
85
|
+
output += `- ${marker} ${childEmoji} ${child.title}\n`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
output += '_暂无子任务_\n';
|
|
90
|
+
}
|
|
91
|
+
return output;
|
|
92
|
+
}
|
|
93
|
+
export async function handleGetTaskContext(args, context) {
|
|
94
|
+
const taskId = args.task_id;
|
|
95
|
+
const historyLimit = args.history_limit || 5;
|
|
96
|
+
const response = await fetch(`${context.serverUrl}/api/tasks/${taskId}/context?history_limit=${historyLimit}`, {
|
|
97
|
+
headers: {
|
|
98
|
+
'Authorization': `Bearer ${context.token}`,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
if (!response.ok) {
|
|
102
|
+
const error = await response.json();
|
|
103
|
+
throw new Error(error.error || 'Failed to get task context');
|
|
104
|
+
}
|
|
105
|
+
const result = await response.json();
|
|
106
|
+
const ctx = result.data;
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: formatContext(ctx),
|
|
111
|
+
}],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=get-task-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-task-context.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-task-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export declare const getTaskTool: Tool;
|
|
4
|
+
export declare function handleGetTask(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=get-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-task.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,WAAW,EAAE,IAazB,CAAC;AAiCF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAuB7D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const getTaskTool = {
|
|
2
|
+
name: 'get_task',
|
|
3
|
+
description: '获取任务详情,包含子任务树',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
task_id: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
description: '任务ID',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
required: ['task_id'],
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
function formatTaskTree(task, indent = 0) {
|
|
16
|
+
const prefix = ' '.repeat(indent);
|
|
17
|
+
const statusEmoji = {
|
|
18
|
+
todo: '📋',
|
|
19
|
+
in_progress: '🔄',
|
|
20
|
+
blocked: '🚫',
|
|
21
|
+
review: '👀',
|
|
22
|
+
done: '✅',
|
|
23
|
+
cancelled: '❌',
|
|
24
|
+
};
|
|
25
|
+
const emoji = statusEmoji[task.status] || '📌';
|
|
26
|
+
let output = `${prefix}${emoji} ${task.title}
|
|
27
|
+
${prefix} ID: ${task.id}
|
|
28
|
+
${prefix} 状态: ${task.status}
|
|
29
|
+
${prefix} ${task.description ? `描述: ${task.description}` : ''}
|
|
30
|
+
${prefix} ${task.assignee ? `负责人: ${task.assignee.name}` : '未分配'}
|
|
31
|
+
${prefix} ${task.start_date ? `开始: ${task.start_date}` : ''} ${task.due_date ? `截止: ${task.due_date}` : ''}
|
|
32
|
+
${prefix} ${task.estimated_days ? `预估: ${task.estimated_days} 天` : ''}`;
|
|
33
|
+
if (task.children && task.children.length > 0) {
|
|
34
|
+
output += `\n${prefix} 子任务 (${task.children.length}):\n`;
|
|
35
|
+
for (const child of task.children) {
|
|
36
|
+
output += formatTaskTree(child, indent + 2) + '\n';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return output;
|
|
40
|
+
}
|
|
41
|
+
export async function handleGetTask(args, context) {
|
|
42
|
+
const taskId = args.task_id;
|
|
43
|
+
const response = await fetch(`${context.serverUrl}/api/tasks/${taskId}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
'Authorization': `Bearer ${context.token}`,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const error = await response.json();
|
|
50
|
+
throw new Error(error.error || 'Failed to get task');
|
|
51
|
+
}
|
|
52
|
+
const result = await response.json();
|
|
53
|
+
const task = result.data;
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: formatTaskTree(task),
|
|
58
|
+
}],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=get-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-task.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export declare const helpersTool: Tool;
|
|
4
|
+
export declare function handleHelpers(_args: Record<string, unknown>, _context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,WAAW,EAAE,IAOzB,CAAC;AAEF,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAO7D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const helpersTool = {
|
|
2
|
+
name: 'helpers',
|
|
3
|
+
description: '辅助工具(内部使用)',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {},
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
export async function handleHelpers(_args, _context) {
|
|
10
|
+
return {
|
|
11
|
+
content: [{
|
|
12
|
+
type: 'text',
|
|
13
|
+
text: 'Helper functions for MCP tools',
|
|
14
|
+
}],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/mcp/tools/helpers.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA8B,EAC9B,QAAoB;IAEpB,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,gCAAgC;aACvC,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export type { McpContext } from './utils/config.js';
|
|
4
|
+
export { getProjectPath } from './utils/config.js';
|
|
5
|
+
export declare const initProjectTool: Tool;
|
|
6
|
+
export declare function handleInitProject(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: string;
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=init-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/init-project.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,eAAO,MAAM,eAAe,EAAE,IA8B7B,CAAC;AAwDF,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmF7D"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
export { getProjectPath } from './utils/config.js';
|
|
4
|
+
export const initProjectTool = {
|
|
5
|
+
name: 'init_project',
|
|
6
|
+
description: `初始化项目,创建配置文件和规则文档。
|
|
7
|
+
|
|
8
|
+
【完整工作流】
|
|
9
|
+
1. init_project - 初始化项目(本工具)
|
|
10
|
+
2. create_version - 创建版本(如 v1.0、Sprint-1)
|
|
11
|
+
3. create_task - 创建任务(自动关联到最新版本)
|
|
12
|
+
|
|
13
|
+
【注意】
|
|
14
|
+
- 每个项目只需初始化一次
|
|
15
|
+
- 初始化后请立即创建版本,否则任务无法在网页中显示`,
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
name: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: '项目名称',
|
|
22
|
+
},
|
|
23
|
+
description: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: '项目描述(可选)',
|
|
26
|
+
},
|
|
27
|
+
path: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: '项目路径(可选,默认当前目录)',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
required: ['name'],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
const AGENTS_HEADER = `# 项目规则
|
|
36
|
+
|
|
37
|
+
> ⚠️ **开始任务前,请先阅读以下规则文档:**
|
|
38
|
+
> - [oh-my-task 任务管理规则](.omt/rules.md)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
`;
|
|
43
|
+
const RULES_CONTENT = `# oh-my-task 任务管理规则
|
|
44
|
+
|
|
45
|
+
## 核心概念
|
|
46
|
+
|
|
47
|
+
- **项目 (Project)**: 顶层容器,一个代码仓库对应一个项目
|
|
48
|
+
- **版本 (Version)**: 任务的分组容器(如 v1.0、Sprint-1),任务必须关联版本才能在网页显示
|
|
49
|
+
- **任务 (Task)**: 具体的工作项,支持无限层级子任务
|
|
50
|
+
|
|
51
|
+
## 完整工作流
|
|
52
|
+
|
|
53
|
+
### 新项目初始化
|
|
54
|
+
\`\`\`
|
|
55
|
+
1. init_project(name="项目名") # 创建项目
|
|
56
|
+
2. create_version(name="v1.0") # 创建版本(必须!)
|
|
57
|
+
3. create_task(title="任务1") # 创建任务(自动关联到最新版本)
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
### 日常使用
|
|
61
|
+
- \`list_versions\` - 查看项目版本
|
|
62
|
+
- \`list_tasks\` - 查看任务列表
|
|
63
|
+
- \`create_task\` - 创建任务(自动关联最新版本)
|
|
64
|
+
- \`activate_task\` - 开始任务
|
|
65
|
+
- \`complete_task\` - 完成任务
|
|
66
|
+
|
|
67
|
+
## 触发词映射
|
|
68
|
+
|
|
69
|
+
| 用户说 | 调用工具 |
|
|
70
|
+
|--------|----------|
|
|
71
|
+
| "初始化项目" | \`init_project\` |
|
|
72
|
+
| "创建版本" | \`create_version\` |
|
|
73
|
+
| "查看版本" | \`list_versions\` |
|
|
74
|
+
| "创建任务" | \`create_task\` |
|
|
75
|
+
| "任务列表" | \`list_tasks\` |
|
|
76
|
+
| "开始任务" | \`activate_task\` |
|
|
77
|
+
| "完成了"、"做完了" | \`complete_task\` |
|
|
78
|
+
|
|
79
|
+
## 常见问题
|
|
80
|
+
|
|
81
|
+
**Q: 任务在网页中不显示?**
|
|
82
|
+
A: 检查任务是否关联了版本。使用 \`list_versions\` 确认项目有版本,没有则先 \`create_version\`。
|
|
83
|
+
|
|
84
|
+
**Q: 如何批量创建任务?**
|
|
85
|
+
A: 多次调用 \`create_task\`,所有任务会自动关联到最新版本。
|
|
86
|
+
`;
|
|
87
|
+
export async function handleInitProject(args, context) {
|
|
88
|
+
const name = args.name;
|
|
89
|
+
const description = args.description;
|
|
90
|
+
const projectPath = args.path || process.cwd();
|
|
91
|
+
const configPath = join(projectPath, '.omt.json');
|
|
92
|
+
if (existsSync(configPath)) {
|
|
93
|
+
return {
|
|
94
|
+
content: [{
|
|
95
|
+
type: 'text',
|
|
96
|
+
text: `项目已初始化。配置文件: ${configPath}`,
|
|
97
|
+
}],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const response = await fetch(`${context.serverUrl}/api/projects`, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: {
|
|
103
|
+
'Content-Type': 'application/json',
|
|
104
|
+
'Authorization': `Bearer ${context.token}`,
|
|
105
|
+
},
|
|
106
|
+
body: JSON.stringify({ name, description }),
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
const error = await response.json();
|
|
110
|
+
throw new Error(error.error || 'Failed to create project');
|
|
111
|
+
}
|
|
112
|
+
const result = await response.json();
|
|
113
|
+
const project = result.data;
|
|
114
|
+
const config = {
|
|
115
|
+
project_id: project.id,
|
|
116
|
+
project_name: project.name,
|
|
117
|
+
project_path: projectPath,
|
|
118
|
+
server_url: context.serverUrl,
|
|
119
|
+
token: context.token,
|
|
120
|
+
created_at: new Date().toISOString(),
|
|
121
|
+
};
|
|
122
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
123
|
+
const omtDir = join(projectPath, '.omt');
|
|
124
|
+
if (!existsSync(omtDir)) {
|
|
125
|
+
mkdirSync(omtDir, { recursive: true });
|
|
126
|
+
}
|
|
127
|
+
const sopsDir = join(omtDir, 'sops');
|
|
128
|
+
if (!existsSync(sopsDir)) {
|
|
129
|
+
mkdirSync(sopsDir, { recursive: true });
|
|
130
|
+
}
|
|
131
|
+
const rulesPath = join(omtDir, 'rules.md');
|
|
132
|
+
if (!existsSync(rulesPath)) {
|
|
133
|
+
writeFileSync(rulesPath, RULES_CONTENT);
|
|
134
|
+
}
|
|
135
|
+
const agentsPath = join(projectPath, 'AGENTS.md');
|
|
136
|
+
if (existsSync(agentsPath)) {
|
|
137
|
+
const content = readFileSync(agentsPath, 'utf-8');
|
|
138
|
+
if (!content.includes('.omt/rules.md')) {
|
|
139
|
+
writeFileSync(agentsPath, AGENTS_HEADER + content);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
writeFileSync(agentsPath, AGENTS_HEADER);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
content: [{
|
|
147
|
+
type: 'text',
|
|
148
|
+
text: `项目初始化成功!
|
|
149
|
+
项目名称: ${project.name}
|
|
150
|
+
项目ID: ${project.id}
|
|
151
|
+
|
|
152
|
+
已创建文件:
|
|
153
|
+
- .omt.json (项目配置)
|
|
154
|
+
- .omt/rules.md (任务管理规则)
|
|
155
|
+
- .omt/sops/ (SOP 存储目录)
|
|
156
|
+
- AGENTS.md (已更新规则索引)
|
|
157
|
+
|
|
158
|
+
⚠️ 开始任务前,请先阅读 .omt/rules.md`,
|
|
159
|
+
}],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=init-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-project.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export declare const listSOPsTool: Tool;
|
|
4
|
+
export declare function handleListSOPs(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=list-sops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sops.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-sops.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,YAAY,EAAE,IAY1B,CAAC;AAUF,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAuC7D"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
export const listSOPsTool = {
|
|
4
|
+
name: 'list_sops',
|
|
5
|
+
description: '列出项目中的所有 SOP(技能/智能体)',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
path: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: '项目路径(可选,默认当前目录)',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
function getProjectConfig(projectPath) {
|
|
17
|
+
const configPath = join(projectPath, '.omt.json');
|
|
18
|
+
if (!existsSync(configPath)) {
|
|
19
|
+
throw new Error('项目未初始化。请先运行 init_project');
|
|
20
|
+
}
|
|
21
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
export async function handleListSOPs(args, context) {
|
|
24
|
+
const projectPath = args.path || process.cwd();
|
|
25
|
+
const config = getProjectConfig(projectPath);
|
|
26
|
+
const response = await fetch(`${context.serverUrl}/api/sops?project_id=${config.project_id}&project_path=${encodeURIComponent(projectPath)}`, {
|
|
27
|
+
headers: {
|
|
28
|
+
'Authorization': `Bearer ${context.token}`,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const error = await response.json();
|
|
33
|
+
throw new Error(error.error || 'Failed to list SOPs');
|
|
34
|
+
}
|
|
35
|
+
const result = await response.json();
|
|
36
|
+
const sops = result.data;
|
|
37
|
+
if (sops.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: '项目中暂无 SOP。使用 create_sop 创建第一个 SOP。',
|
|
42
|
+
}],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const lines = sops.map((sop, index) => {
|
|
46
|
+
return `${index + 1}. 📚 ${sop.name}
|
|
47
|
+
ID: ${sop.id}
|
|
48
|
+
${sop.description ? `描述: ${sop.description}` : ''}`;
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
content: [{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: `找到 ${sops.length} 个 SOP:\n\n${lines.join('\n\n')}`,
|
|
54
|
+
}],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=list-sops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sops.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-sops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAe,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,MAAM,CAAC,MAAM,YAAY,GAAS;IAChC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,sBAAsB;IACnC,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iBAAiB;aAC/B;SACF;KACF;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAA6B,EAC7B,OAAmB;IAEnB,MAAM,WAAW,GAAI,IAAI,CAAC,IAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,wBAAwB,MAAM,CAAC,UAAU,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE;QAC5I,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;SAC3C;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwB,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAEzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oCAAoC;iBAC3C,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACpC,OAAO,GAAG,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI;SAC9B,GAAG,CAAC,EAAE;KACV,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,IAAI,CAAC,MAAM,cAAc,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;aAC1D,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export declare const listTasksTool: Tool;
|
|
4
|
+
export declare function handleListTasks(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=list-tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tasks.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-tasks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,aAAa,EAAE,IA6B3B,CAAC;AAoCF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAoC7D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
export const listTasksTool = {
|
|
4
|
+
name: 'list_tasks',
|
|
5
|
+
description: '查询任务列表,支持按状态、负责人等筛选',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
status: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
enum: ['todo', 'in_progress', 'blocked', 'review', 'done', 'cancelled'],
|
|
12
|
+
description: '按状态筛选(可选)',
|
|
13
|
+
},
|
|
14
|
+
assignee_id: {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: '按负责人ID筛选(可选)',
|
|
17
|
+
},
|
|
18
|
+
parent_id: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: '父任务ID,查询子任务(可选,传 "null" 查询顶层任务)',
|
|
21
|
+
},
|
|
22
|
+
is_version: {
|
|
23
|
+
type: 'boolean',
|
|
24
|
+
description: '只查询版本(可选)',
|
|
25
|
+
},
|
|
26
|
+
path: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: '项目路径(可选,默认当前目录)',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
function getProjectConfig(projectPath) {
|
|
34
|
+
const configPath = join(projectPath, '.omt.json');
|
|
35
|
+
if (!existsSync(configPath)) {
|
|
36
|
+
throw new Error('项目未初始化。请先运行 init_project');
|
|
37
|
+
}
|
|
38
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
39
|
+
}
|
|
40
|
+
function formatTaskList(tasks) {
|
|
41
|
+
if (tasks.length === 0) {
|
|
42
|
+
return '没有找到任务。';
|
|
43
|
+
}
|
|
44
|
+
const statusEmoji = {
|
|
45
|
+
todo: '📋',
|
|
46
|
+
in_progress: '🔄',
|
|
47
|
+
blocked: '🚫',
|
|
48
|
+
review: '👀',
|
|
49
|
+
done: '✅',
|
|
50
|
+
cancelled: '❌',
|
|
51
|
+
};
|
|
52
|
+
const lines = tasks.map((task, index) => {
|
|
53
|
+
const emoji = statusEmoji[task.status] || '📌';
|
|
54
|
+
const typeLabel = task.parent_id ? '[子任务]' : '';
|
|
55
|
+
return `${index + 1}. ${emoji} ${typeLabel} ${task.title}
|
|
56
|
+
ID: ${task.id}
|
|
57
|
+
状态: ${task.status}
|
|
58
|
+
${task.due_date ? `截止: ${task.due_date}` : ''}`;
|
|
59
|
+
});
|
|
60
|
+
return `找到 ${tasks.length} 个任务:\n\n${lines.join('\n\n')}`;
|
|
61
|
+
}
|
|
62
|
+
export async function handleListTasks(args, context) {
|
|
63
|
+
const projectPath = args.path || process.cwd();
|
|
64
|
+
const config = getProjectConfig(projectPath);
|
|
65
|
+
const params = new URLSearchParams();
|
|
66
|
+
params.append('project_id', config.project_id || '');
|
|
67
|
+
if (!config.project_id) {
|
|
68
|
+
throw new Error('项目配置缺少 project_id');
|
|
69
|
+
}
|
|
70
|
+
if (args.status)
|
|
71
|
+
params.append('status', args.status);
|
|
72
|
+
if (args.assignee_id)
|
|
73
|
+
params.append('assignee_id', args.assignee_id);
|
|
74
|
+
if (args.parent_id !== undefined)
|
|
75
|
+
params.append('parent_id', args.parent_id);
|
|
76
|
+
if (args.is_version !== undefined)
|
|
77
|
+
params.append('is_version', String(args.is_version));
|
|
78
|
+
const response = await fetch(`${context.serverUrl}/api/tasks?${params}`, {
|
|
79
|
+
headers: {
|
|
80
|
+
'Authorization': `Bearer ${context.token}`,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
const error = await response.json();
|
|
85
|
+
throw new Error(error.error || 'Failed to list tasks');
|
|
86
|
+
}
|
|
87
|
+
const result = await response.json();
|
|
88
|
+
const tasks = result.data;
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: formatTaskList(tasks),
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=list-tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tasks.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { McpContext } from './utils/config.js';
|
|
3
|
+
export declare const listVersionsTool: Tool;
|
|
4
|
+
export declare function handleListVersions(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=list-versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-versions.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-versions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAapD,eAAO,MAAM,gBAAgB,EAAE,IAsB9B,CAAC;AAUF,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAgD7D"}
|