@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,70 @@
|
|
|
1
|
+
export const updateTaskDocTool = {
|
|
2
|
+
name: 'update_task_doc',
|
|
3
|
+
description: '更新任务的阶段文档(需求/设计/当前情况)。支持覆盖或追加模式。',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
task_id: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
description: '任务ID',
|
|
10
|
+
},
|
|
11
|
+
doc_type: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
enum: ['requirement', 'design', 'status'],
|
|
14
|
+
description: '文档类型:requirement=需求文档, design=设计文档, status=当前情况',
|
|
15
|
+
},
|
|
16
|
+
content: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: '文档内容(Markdown 格式)',
|
|
19
|
+
},
|
|
20
|
+
append: {
|
|
21
|
+
type: 'boolean',
|
|
22
|
+
description: '是否追加模式(默认 false,覆盖原内容)',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['task_id', 'doc_type', 'content'],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const DOC_TYPE_NAMES = {
|
|
29
|
+
requirement: '需求文档',
|
|
30
|
+
design: '设计文档',
|
|
31
|
+
status: '当前情况',
|
|
32
|
+
};
|
|
33
|
+
export async function handleUpdateTaskDoc(args, context) {
|
|
34
|
+
const taskId = args.task_id;
|
|
35
|
+
const docType = args.doc_type;
|
|
36
|
+
const content = args.content;
|
|
37
|
+
const append = args.append ?? false;
|
|
38
|
+
const response = await fetch(`${context.serverUrl}/api/tasks/${taskId}/doc`, {
|
|
39
|
+
method: 'PUT',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
'Authorization': `Bearer ${context.token}`,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
doc_type: docType,
|
|
46
|
+
content,
|
|
47
|
+
append,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const error = await response.json();
|
|
52
|
+
throw new Error(error.error || 'Failed to update task doc');
|
|
53
|
+
}
|
|
54
|
+
const result = await response.json();
|
|
55
|
+
const task = result.data;
|
|
56
|
+
const docTypeName = DOC_TYPE_NAMES[docType] || docType;
|
|
57
|
+
const mode = append ? '追加' : '更新';
|
|
58
|
+
return {
|
|
59
|
+
content: [{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `✅ ${docTypeName}已${mode}!
|
|
62
|
+
|
|
63
|
+
任务: ${task.title}
|
|
64
|
+
文档类型: ${docTypeName}
|
|
65
|
+
操作: ${mode}
|
|
66
|
+
更新时间: ${task.updated_at}`,
|
|
67
|
+
}],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=update-task-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-task-doc.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-task-doc.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,kCAAkC;IAC/C,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,MAAM;aACpB;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC;gBACzC,WAAW,EAAE,iDAAiD;aAC/D;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wBAAwB;aACtC;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;KAC7C;CACF,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA6B,EAC7B,OAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAiB,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAkB,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiB,CAAC;IACvC,MAAM,MAAM,GAAI,IAAI,CAAC,MAAkB,IAAI,KAAK,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,cAAc,MAAM,MAAM,EAAE;QAC3E,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;SAC3C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,MAAM;SACP,CAAC;KACH,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,2BAA2B,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAoB,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAElC,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,WAAW,IAAI,IAAI;;MAE9B,IAAI,CAAC,KAAK;QACR,WAAW;MACb,IAAI;QACF,IAAI,CAAC,UAAU,EAAE;aACpB,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 updateTaskTool: Tool;
|
|
4
|
+
export declare function handleUpdateTask(args: Record<string, unknown>, context: McpContext): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=update-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-task.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/update-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,cAAc,EAAE,IA0D5B,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,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,CA2C7D"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
export const updateTaskTool = {
|
|
2
|
+
name: 'update_task',
|
|
3
|
+
description: '更新任务信息,包括状态、标题、描述、负责人等',
|
|
4
|
+
inputSchema: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
task_id: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
description: '任务ID',
|
|
10
|
+
},
|
|
11
|
+
title: {
|
|
12
|
+
type: 'string',
|
|
13
|
+
description: '新标题(可选)',
|
|
14
|
+
},
|
|
15
|
+
description: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: '新描述(可选)',
|
|
18
|
+
},
|
|
19
|
+
status: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
enum: ['todo', 'in_progress', 'blocked', 'review', 'done', 'cancelled'],
|
|
22
|
+
description: `任务状态(可选):
|
|
23
|
+
- todo: 待办,初始状态
|
|
24
|
+
- in_progress: 进行中,正在执行
|
|
25
|
+
- blocked: 阻塞,等待外部依赖
|
|
26
|
+
- review: 待验收(AI完成编码后应使用 submit_for_review 工具)
|
|
27
|
+
- done: 已完成(仅在人工验收通过后使用 approve_task 工具)
|
|
28
|
+
- cancelled: 已取消
|
|
29
|
+
|
|
30
|
+
⚠️ 注意:请使用专门的工具来变更状态:
|
|
31
|
+
- 开始任务 → start_task
|
|
32
|
+
- 提交验收 → submit_for_review
|
|
33
|
+
- 验收通过 → approve_task
|
|
34
|
+
- 验收不通过 → reject_task`,
|
|
35
|
+
},
|
|
36
|
+
assignee_id: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: '新负责人ID(可选)',
|
|
39
|
+
},
|
|
40
|
+
estimated_days: {
|
|
41
|
+
type: 'number',
|
|
42
|
+
description: '新预估工时(天)(可选)',
|
|
43
|
+
},
|
|
44
|
+
start_date: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: '新开始日期,格式 YYYY-MM-DD(可选)',
|
|
47
|
+
},
|
|
48
|
+
due_date: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: '新截止日期,格式 YYYY-MM-DD(可选)',
|
|
51
|
+
},
|
|
52
|
+
reason: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: '变更原因,会记录到历史(可选)',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
required: ['task_id'],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
export async function handleUpdateTask(args, context) {
|
|
61
|
+
const taskId = args.task_id;
|
|
62
|
+
const body = {};
|
|
63
|
+
if (args.title !== undefined)
|
|
64
|
+
body.title = args.title;
|
|
65
|
+
if (args.description !== undefined)
|
|
66
|
+
body.description = args.description;
|
|
67
|
+
if (args.status !== undefined)
|
|
68
|
+
body.status = args.status;
|
|
69
|
+
if (args.assignee_id !== undefined)
|
|
70
|
+
body.assignee_id = args.assignee_id;
|
|
71
|
+
if (args.estimated_days !== undefined)
|
|
72
|
+
body.estimated_days = args.estimated_days;
|
|
73
|
+
if (args.start_date !== undefined)
|
|
74
|
+
body.start_date = args.start_date;
|
|
75
|
+
if (args.due_date !== undefined)
|
|
76
|
+
body.due_date = args.due_date;
|
|
77
|
+
if (args.reason !== undefined)
|
|
78
|
+
body.reason = args.reason;
|
|
79
|
+
const response = await fetch(`${context.serverUrl}/api/tasks/${taskId}`, {
|
|
80
|
+
method: 'PUT',
|
|
81
|
+
headers: {
|
|
82
|
+
'Content-Type': 'application/json',
|
|
83
|
+
'Authorization': `Bearer ${context.token}`,
|
|
84
|
+
},
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
});
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
const error = await response.json();
|
|
89
|
+
throw new Error(error.error || 'Failed to update task');
|
|
90
|
+
}
|
|
91
|
+
const result = await response.json();
|
|
92
|
+
const task = result.data;
|
|
93
|
+
const changes = Object.keys(body).filter(k => k !== 'reason').join(', ');
|
|
94
|
+
return {
|
|
95
|
+
content: [{
|
|
96
|
+
type: 'text',
|
|
97
|
+
text: `任务更新成功!
|
|
98
|
+
ID: ${task.id}
|
|
99
|
+
标题: ${task.title}
|
|
100
|
+
状态: ${task.status}
|
|
101
|
+
更新字段: ${changes || '无变更'}
|
|
102
|
+
${args.reason ? `变更原因: ${args.reason}` : ''}`,
|
|
103
|
+
}],
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=update-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-task.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProjectConfig } from '../../../types/index.js';
|
|
2
|
+
export interface McpContext {
|
|
3
|
+
serverUrl: string;
|
|
4
|
+
token: string;
|
|
5
|
+
projectName?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 从环境变量获取 MCP 上下文
|
|
9
|
+
*/
|
|
10
|
+
export declare function getMcpContextFromEnv(): McpContext;
|
|
11
|
+
/**
|
|
12
|
+
* 读取项目配置文件
|
|
13
|
+
*/
|
|
14
|
+
export declare function readProjectConfig(projectPath?: string): ProjectConfig | null;
|
|
15
|
+
/**
|
|
16
|
+
* 获取项目的 project_id(兼容新旧格式)
|
|
17
|
+
*/
|
|
18
|
+
export declare function getProjectId(config: ProjectConfig, context: McpContext): string | null;
|
|
19
|
+
/**
|
|
20
|
+
* 获取认证 Token(优先使用配置中的 token,其次使用环境变量)
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAuthToken(config: ProjectConfig | null, context: McpContext): string;
|
|
23
|
+
/**
|
|
24
|
+
* 获取项目路径
|
|
25
|
+
*/
|
|
26
|
+
export declare function getProjectPath(): string;
|
|
27
|
+
/**
|
|
28
|
+
* 检查项目是否已初始化
|
|
29
|
+
*/
|
|
30
|
+
export declare function isProjectInitialized(projectPath?: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* 通过项目名称查询项目 ID
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveProjectId(projectName: string, context: McpContext): Promise<string | null>;
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,CAMjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAY5E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAStF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAGtF;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* 从环境变量获取 MCP 上下文
|
|
5
|
+
*/
|
|
6
|
+
export function getMcpContextFromEnv() {
|
|
7
|
+
return {
|
|
8
|
+
serverUrl: process.env.OMT_SERVER_URL || 'http://localhost:3000',
|
|
9
|
+
token: process.env.OMT_TOKEN || process.env.OMT_API_KEY || 'omt-admin-key',
|
|
10
|
+
projectName: process.env.OMT_PROJECT_NAME,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 读取项目配置文件
|
|
15
|
+
*/
|
|
16
|
+
export function readProjectConfig(projectPath) {
|
|
17
|
+
const configPath = join(projectPath || process.cwd(), '.omt.json');
|
|
18
|
+
if (!existsSync(configPath)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 获取项目的 project_id(兼容新旧格式)
|
|
30
|
+
*/
|
|
31
|
+
export function getProjectId(config, context) {
|
|
32
|
+
// 新格式:通过 project_name 查询
|
|
33
|
+
if (config.project_name && !config.project_id) {
|
|
34
|
+
// 需要从 API 查询 project_id
|
|
35
|
+
return null; // 由调用方处理
|
|
36
|
+
}
|
|
37
|
+
// 旧格式或已有 project_id
|
|
38
|
+
return config.project_id || null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 获取认证 Token(优先使用配置中的 token,其次使用环境变量)
|
|
42
|
+
*/
|
|
43
|
+
export function getAuthToken(config, context) {
|
|
44
|
+
// 优先级:配置文件 token > 环境变量 token > 环境变量 api_key
|
|
45
|
+
return config?.token || context.token;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 获取项目路径
|
|
49
|
+
*/
|
|
50
|
+
export function getProjectPath() {
|
|
51
|
+
return process.cwd();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 检查项目是否已初始化
|
|
55
|
+
*/
|
|
56
|
+
export function isProjectInitialized(projectPath) {
|
|
57
|
+
const configPath = join(projectPath || process.cwd(), '.omt.json');
|
|
58
|
+
return existsSync(configPath);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 通过项目名称查询项目 ID
|
|
62
|
+
*/
|
|
63
|
+
export async function resolveProjectId(projectName, context) {
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch(`${context.serverUrl}/api/projects`, {
|
|
66
|
+
headers: {
|
|
67
|
+
'Authorization': `Bearer ${context.token}`,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const result = await response.json();
|
|
74
|
+
const project = result.data.find(p => p.name === projectName);
|
|
75
|
+
return project?.id || null;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/mcp/tools/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB;QAChE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,eAAe;QAC1E,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;KAC1C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAoB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEnE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAkB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,OAAmB;IACrE,yBAAyB;IACzB,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,wBAAwB;QACxB,OAAO,IAAI,CAAC,CAAE,SAAS;IACzB,CAAC;IAED,oBAAoB;IACpB,OAAO,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAA4B,EAAE,OAAmB;IAC5E,6CAA6C;IAC7C,OAAO,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAoB;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACnE,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE;YAChE,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE;aAC3C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmD,CAAC;QACtF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAE9D,OAAO,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SystemConfigMap } from '../types/index.js';
|
|
2
|
+
export declare function getConfig(key: string): string | null;
|
|
3
|
+
export declare function getAllConfig(): SystemConfigMap;
|
|
4
|
+
export declare function setConfig(key: string, value: string): void;
|
|
5
|
+
export declare function setMultipleConfig(configs: Partial<SystemConfigMap>): void;
|
|
6
|
+
//# sourceMappingURL=config.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEvE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMpD;AAED,wBAAgB,YAAY,IAAI,eAAe,CAmB9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAO1D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAazE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getDb } from '../db/connection.js';
|
|
2
|
+
export function getConfig(key) {
|
|
3
|
+
const db = getDb();
|
|
4
|
+
const config = db.prepare(`
|
|
5
|
+
SELECT value FROM system_config WHERE key = ?
|
|
6
|
+
`).get(key);
|
|
7
|
+
return config?.value || null;
|
|
8
|
+
}
|
|
9
|
+
export function getAllConfig() {
|
|
10
|
+
const db = getDb();
|
|
11
|
+
const configs = db.prepare(`
|
|
12
|
+
SELECT key, value FROM system_config
|
|
13
|
+
`).all();
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const config of configs) {
|
|
16
|
+
result[config.key] = config.value;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
server_url: result.server_url || 'http://localhost:3000',
|
|
20
|
+
smtp_host: result.smtp_host || '',
|
|
21
|
+
smtp_port: result.smtp_port || '587',
|
|
22
|
+
smtp_user: result.smtp_user || '',
|
|
23
|
+
smtp_pass: result.smtp_pass || '',
|
|
24
|
+
smtp_from: result.smtp_from || '',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function setConfig(key, value) {
|
|
28
|
+
const db = getDb();
|
|
29
|
+
db.prepare(`
|
|
30
|
+
INSERT INTO system_config (key, value, updated_at)
|
|
31
|
+
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
32
|
+
ON CONFLICT(key) DO UPDATE SET value = ?, updated_at = CURRENT_TIMESTAMP
|
|
33
|
+
`).run(key, value, value);
|
|
34
|
+
}
|
|
35
|
+
export function setMultipleConfig(configs) {
|
|
36
|
+
const db = getDb();
|
|
37
|
+
const stmt = db.prepare(`
|
|
38
|
+
INSERT INTO system_config (key, value, updated_at)
|
|
39
|
+
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
40
|
+
ON CONFLICT(key) DO UPDATE SET value = ?, updated_at = CURRENT_TIMESTAMP
|
|
41
|
+
`);
|
|
42
|
+
for (const [key, value] of Object.entries(configs)) {
|
|
43
|
+
if (value !== undefined) {
|
|
44
|
+
stmt.run(key, value, value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5C,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEzB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAkC,CAAC;IAC7C,OAAO,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;;GAE1B,CAAC,CAAC,GAAG,EAA2C,CAAC;IAElD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,uBAAuB;QACxD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IAClD,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,EAAE,CAAC,OAAO,CAAC;;;;GAIV,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAiC;IACjE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAIvB,CAAC,CAAC;IAEH,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Project } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 获取用户的所有项目
|
|
4
|
+
*/
|
|
5
|
+
export declare function listProjects(userId?: string): Project[];
|
|
6
|
+
/**
|
|
7
|
+
* 根据 ID 获取项目(验证归属)
|
|
8
|
+
*/
|
|
9
|
+
export declare function getProjectById(id: string, userId?: string): Project | null;
|
|
10
|
+
/**
|
|
11
|
+
* 创建项目
|
|
12
|
+
*/
|
|
13
|
+
export declare function createProject(name: string, description?: string, ownerId?: string): Project;
|
|
14
|
+
/**
|
|
15
|
+
* 更新项目(验证归属)
|
|
16
|
+
*/
|
|
17
|
+
export declare function updateProject(id: string, updates: {
|
|
18
|
+
name?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
}, userId?: string): Project | null;
|
|
21
|
+
/**
|
|
22
|
+
* 删除项目(级联删除所有任务和版本,验证归属)
|
|
23
|
+
*/
|
|
24
|
+
export declare function deleteProject(id: string, userId?: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 检查项目归属
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkProjectOwnership(projectId: string, userId: string): boolean;
|
|
29
|
+
//# sourceMappingURL=project.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.service.d.ts","sourceRoot":"","sources":["../../src/services/project.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAavD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAc1E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAW3F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CA0B3H;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CA6BlE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQhF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { getDb } from '../db/connection.js';
|
|
3
|
+
/**
|
|
4
|
+
* 获取用户的所有项目
|
|
5
|
+
*/
|
|
6
|
+
export function listProjects(userId) {
|
|
7
|
+
const db = getDb();
|
|
8
|
+
if (userId) {
|
|
9
|
+
return db.prepare(`
|
|
10
|
+
SELECT * FROM projects
|
|
11
|
+
WHERE owner_id = ?
|
|
12
|
+
ORDER BY created_at DESC
|
|
13
|
+
`).all(userId);
|
|
14
|
+
}
|
|
15
|
+
// 兼容旧逻辑:管理员可以查看所有项目
|
|
16
|
+
return db.prepare('SELECT * FROM projects ORDER BY created_at DESC').all();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 根据 ID 获取项目(验证归属)
|
|
20
|
+
*/
|
|
21
|
+
export function getProjectById(id, userId) {
|
|
22
|
+
const db = getDb();
|
|
23
|
+
if (userId) {
|
|
24
|
+
const project = db.prepare(`
|
|
25
|
+
SELECT * FROM projects
|
|
26
|
+
WHERE id = ? AND (owner_id = ? OR owner_id IS NULL)
|
|
27
|
+
`).get(id, userId);
|
|
28
|
+
return project || null;
|
|
29
|
+
}
|
|
30
|
+
// 兼容旧逻辑
|
|
31
|
+
const project = db.prepare('SELECT * FROM projects WHERE id = ?').get(id);
|
|
32
|
+
return project || null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 创建项目
|
|
36
|
+
*/
|
|
37
|
+
export function createProject(name, description, ownerId) {
|
|
38
|
+
const db = getDb();
|
|
39
|
+
const id = uuidv4();
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
db.prepare(`
|
|
42
|
+
INSERT INTO projects (id, name, description, owner_id, created_at, updated_at)
|
|
43
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
44
|
+
`).run(id, name, description || null, ownerId || null, now, now);
|
|
45
|
+
return getProjectById(id);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 更新项目(验证归属)
|
|
49
|
+
*/
|
|
50
|
+
export function updateProject(id, updates, userId) {
|
|
51
|
+
const db = getDb();
|
|
52
|
+
// 验证归属
|
|
53
|
+
if (userId) {
|
|
54
|
+
const existing = db.prepare(`
|
|
55
|
+
SELECT id FROM projects WHERE id = ? AND owner_id = ?
|
|
56
|
+
`).get(id, userId);
|
|
57
|
+
if (!existing) {
|
|
58
|
+
return null; // 返回 404 而非 403
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const project = getProjectById(id);
|
|
62
|
+
if (!project)
|
|
63
|
+
return null;
|
|
64
|
+
const name = updates.name ?? project.name;
|
|
65
|
+
const description = updates.description ?? project.description;
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
db.prepare(`
|
|
68
|
+
UPDATE projects SET name = ?, description = ?, updated_at = ? WHERE id = ?
|
|
69
|
+
`).run(name, description, now, id);
|
|
70
|
+
return getProjectById(id);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 删除项目(级联删除所有任务和版本,验证归属)
|
|
74
|
+
*/
|
|
75
|
+
export function deleteProject(id, userId) {
|
|
76
|
+
const db = getDb();
|
|
77
|
+
// 验证归属
|
|
78
|
+
if (userId) {
|
|
79
|
+
const existing = db.prepare(`
|
|
80
|
+
SELECT id FROM projects WHERE id = ? AND owner_id = ?
|
|
81
|
+
`).get(id, userId);
|
|
82
|
+
if (!existing) {
|
|
83
|
+
return false; // 返回 404 而非 403
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 删除项目下所有任务的历史记录
|
|
87
|
+
db.prepare(`
|
|
88
|
+
DELETE FROM task_history WHERE task_id IN
|
|
89
|
+
(SELECT id FROM tasks WHERE project_id = ?)
|
|
90
|
+
`).run(id);
|
|
91
|
+
// 删除项目下所有任务
|
|
92
|
+
db.prepare('DELETE FROM tasks WHERE project_id = ?').run(id);
|
|
93
|
+
// 删除项目下所有版本
|
|
94
|
+
db.prepare('DELETE FROM versions WHERE project_id = ?').run(id);
|
|
95
|
+
// 删除项目本身
|
|
96
|
+
const result = db.prepare('DELETE FROM projects WHERE id = ?').run(id);
|
|
97
|
+
return result.changes > 0;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 检查项目归属
|
|
101
|
+
*/
|
|
102
|
+
export function checkProjectOwnership(projectId, userId) {
|
|
103
|
+
const db = getDb();
|
|
104
|
+
const project = db.prepare(`
|
|
105
|
+
SELECT owner_id FROM projects WHERE id = ?
|
|
106
|
+
`).get(projectId);
|
|
107
|
+
if (!project)
|
|
108
|
+
return false;
|
|
109
|
+
return project.owner_id === userId || project.owner_id === null;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=project.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/services/project.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { Task, Holiday } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 确保指定年份的节假日数据已加载
|
|
4
|
+
* 如果数据库中没有,则自动从 API 获取
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensureHolidaysLoaded(year: number): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* 格式化日期为 YYYY-MM-DD
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatDate(date: Date): string;
|
|
11
|
+
/**
|
|
12
|
+
* 解析日期字符串
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseDate(dateStr: string): Date;
|
|
15
|
+
/**
|
|
16
|
+
* 检查日期是否为工作日(同步版本,需先确保节假日数据已加载)
|
|
17
|
+
* 优先查数据库,否则按周一到周五判断
|
|
18
|
+
*/
|
|
19
|
+
export declare function isWorkdaySync(date: Date): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 检查日期是否为工作日(异步版本,自动加载节假日数据)
|
|
22
|
+
*/
|
|
23
|
+
export declare function isWorkday(date: Date): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* 添加工作日(同步版本,需先确保节假日数据已加载)
|
|
26
|
+
*/
|
|
27
|
+
export declare function addWorkdaysSync(startDate: Date, days: number): Date;
|
|
28
|
+
/**
|
|
29
|
+
* 添加工作日(异步版本,自动加载节假日数据)
|
|
30
|
+
*/
|
|
31
|
+
export declare function addWorkdays(startDate: Date, days: number): Promise<Date>;
|
|
32
|
+
/**
|
|
33
|
+
* 计算两个日期之间的工作日数(同步版本)
|
|
34
|
+
*/
|
|
35
|
+
export declare function countWorkdaysSync(startDate: Date, endDate: Date): number;
|
|
36
|
+
/**
|
|
37
|
+
* 计算两个日期之间的工作日数(异步版本)
|
|
38
|
+
*/
|
|
39
|
+
export declare function countWorkdays(startDate: Date, endDate: Date): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* 根据预估工时计算截止日期(同步版本)
|
|
42
|
+
*/
|
|
43
|
+
export declare function calculateDueDateSync(startDate: string, estimatedDays: number): string;
|
|
44
|
+
/**
|
|
45
|
+
* 根据预估工时计算截止日期(异步版本)
|
|
46
|
+
*/
|
|
47
|
+
export declare function calculateDueDate(startDate: string, estimatedDays: number): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* 计算任务延期天数(同步版本)
|
|
50
|
+
*/
|
|
51
|
+
export declare function calculateDelaySync(task: Task): number;
|
|
52
|
+
/**
|
|
53
|
+
* 计算任务延期天数(异步版本)
|
|
54
|
+
*/
|
|
55
|
+
export declare function calculateDelay(task: Task): Promise<number>;
|
|
56
|
+
/**
|
|
57
|
+
* 重新排期:从指定任务开始,顺延后续任务(异步版本)
|
|
58
|
+
*/
|
|
59
|
+
export declare function rescheduleFromTask(taskId: string, newStartDate: string): Promise<RescheduleResult>;
|
|
60
|
+
/**
|
|
61
|
+
* 自动排期:为项目中未排期的任务自动分配日期(异步版本)
|
|
62
|
+
*/
|
|
63
|
+
export declare function autoSchedule(projectId: string, startDate: string): Promise<RescheduleResult>;
|
|
64
|
+
/**
|
|
65
|
+
* 批量计算预期结束日期(用于前端进度图)
|
|
66
|
+
*/
|
|
67
|
+
export interface CalculateEndDatesInput {
|
|
68
|
+
id: string;
|
|
69
|
+
estimatedDays: number;
|
|
70
|
+
status: string;
|
|
71
|
+
actualEnd?: string | null;
|
|
72
|
+
}
|
|
73
|
+
export interface CalculateEndDatesResult {
|
|
74
|
+
id: string;
|
|
75
|
+
startDate: string;
|
|
76
|
+
endDate: string;
|
|
77
|
+
}
|
|
78
|
+
export declare function calculateEndDates(tasks: CalculateEndDatesInput[], startDate?: string): Promise<CalculateEndDatesResult[]>;
|
|
79
|
+
/**
|
|
80
|
+
* 导入节假日数据
|
|
81
|
+
*/
|
|
82
|
+
export declare function importHolidays(holidays: HolidayInput[]): number;
|
|
83
|
+
/**
|
|
84
|
+
* 获取年度节假日(异步版本,自动加载)
|
|
85
|
+
*/
|
|
86
|
+
export declare function getHolidaysByYear(year: number): Promise<Holiday[]>;
|
|
87
|
+
export interface TaskScheduleChange {
|
|
88
|
+
task_id: string;
|
|
89
|
+
title: string;
|
|
90
|
+
old_start: string | null;
|
|
91
|
+
new_start: string;
|
|
92
|
+
old_due: string | null;
|
|
93
|
+
new_due: string | null;
|
|
94
|
+
}
|
|
95
|
+
export interface RescheduleResult {
|
|
96
|
+
changes: TaskScheduleChange[];
|
|
97
|
+
}
|
|
98
|
+
export interface HolidayInput {
|
|
99
|
+
date: string;
|
|
100
|
+
year: number;
|
|
101
|
+
is_workday: boolean;
|
|
102
|
+
name?: string;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=schedule.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.service.d.ts","sourceRoot":"","sources":["../../src/services/schedule.service.ts"],"names":[],"mappings":"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"}
|