@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,156 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import * as versionService from '../../services/version.service.js';
|
|
3
|
+
import * as projectService from '../../services/project.service.js';
|
|
4
|
+
import { getDb } from '../../db/connection.js';
|
|
5
|
+
const router = Router();
|
|
6
|
+
// GET /api/versions - 获取项目的所有版本
|
|
7
|
+
router.get('/', (req, res) => {
|
|
8
|
+
const projectId = req.query.project_id;
|
|
9
|
+
if (!projectId) {
|
|
10
|
+
res.status(400).json({ success: false, error: 'project_id 不能为空' });
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const userId = req.auth?.user?.id;
|
|
14
|
+
const isAdmin = req.auth?.user?.role === 'admin';
|
|
15
|
+
// 验证项目归属
|
|
16
|
+
if (!isAdmin) {
|
|
17
|
+
const hasAccess = projectService.checkProjectOwnership(projectId, userId);
|
|
18
|
+
if (!hasAccess) {
|
|
19
|
+
res.status(404).json({ success: false, error: '项目不存在' });
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// 只返回未归档的版本
|
|
24
|
+
const versions = versionService.listVersions(projectId, isAdmin ? undefined : userId).filter(v => !v.archived_at);
|
|
25
|
+
res.json({ success: true, data: versions });
|
|
26
|
+
});
|
|
27
|
+
// PUT /api/versions/reorder - 重新排序版本 (must be before /:id)
|
|
28
|
+
router.put('/reorder', (req, res) => {
|
|
29
|
+
const { version_ids } = req.body;
|
|
30
|
+
if (!version_ids || !Array.isArray(version_ids)) {
|
|
31
|
+
res.status(400).json({ success: false, error: 'version_ids 必须是数组' });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
versionService.reorderVersions(version_ids);
|
|
35
|
+
res.json({ success: true, message: '版本排序已更新' });
|
|
36
|
+
});
|
|
37
|
+
// GET /api/versions/:id/stats - 获取版本统计信息
|
|
38
|
+
router.get('/:id/stats', async (req, res) => {
|
|
39
|
+
const userId = req.auth?.user?.id;
|
|
40
|
+
const isAdmin = req.auth?.user?.role === 'admin';
|
|
41
|
+
try {
|
|
42
|
+
// 验证归属
|
|
43
|
+
const version = versionService.getVersionById(req.params.id, isAdmin ? undefined : userId);
|
|
44
|
+
if (!version) {
|
|
45
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const stats = await versionService.getVersionStats(req.params.id);
|
|
49
|
+
if (!stats) {
|
|
50
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
res.json({ success: true, data: stats });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
res.status(500).json({ success: false, error: error.message });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// GET /api/versions/:id - 获取版本详情
|
|
60
|
+
router.get('/:id', (req, res) => {
|
|
61
|
+
const userId = req.auth?.user?.id;
|
|
62
|
+
const isAdmin = req.auth?.user?.role === 'admin';
|
|
63
|
+
const version = versionService.getVersionById(req.params.id, isAdmin ? undefined : userId);
|
|
64
|
+
if (!version) {
|
|
65
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
res.json({ success: true, data: version });
|
|
69
|
+
});
|
|
70
|
+
// POST /api/versions - 创建版本
|
|
71
|
+
router.post('/', (req, res) => {
|
|
72
|
+
const { project_id, name, description, start_date, due_date } = req.body;
|
|
73
|
+
const userId = req.auth.user.id;
|
|
74
|
+
const isAdmin = req.auth.user.role === 'admin';
|
|
75
|
+
if (!project_id) {
|
|
76
|
+
res.status(400).json({ success: false, error: 'project_id 不能为空' });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!name) {
|
|
80
|
+
res.status(400).json({ success: false, error: 'name 不能为空' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// 验证项目归属
|
|
84
|
+
if (!isAdmin) {
|
|
85
|
+
const hasAccess = projectService.checkProjectOwnership(project_id, userId);
|
|
86
|
+
if (!hasAccess) {
|
|
87
|
+
res.status(404).json({ success: false, error: '项目不存在' });
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const version = versionService.createVersion({
|
|
92
|
+
project_id,
|
|
93
|
+
name,
|
|
94
|
+
description,
|
|
95
|
+
start_date,
|
|
96
|
+
due_date,
|
|
97
|
+
}, isAdmin ? undefined : userId);
|
|
98
|
+
if (!version) {
|
|
99
|
+
res.status(404).json({ success: false, error: '项目不存在' });
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
res.status(201).json({ success: true, data: version });
|
|
103
|
+
});
|
|
104
|
+
// PUT /api/versions/:id - 更新版本
|
|
105
|
+
router.put('/:id', (req, res) => {
|
|
106
|
+
const { name, description, start_date, due_date } = req.body;
|
|
107
|
+
const userId = req.auth.user.id;
|
|
108
|
+
const isAdmin = req.auth.user.role === 'admin';
|
|
109
|
+
const version = versionService.updateVersion(req.params.id, {
|
|
110
|
+
name,
|
|
111
|
+
description,
|
|
112
|
+
start_date,
|
|
113
|
+
due_date,
|
|
114
|
+
}, isAdmin ? undefined : userId);
|
|
115
|
+
if (!version) {
|
|
116
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
res.json({ success: true, data: version });
|
|
120
|
+
});
|
|
121
|
+
// POST /api/versions/:id/archive - 归档版本
|
|
122
|
+
router.post('/:id/archive', (req, res) => {
|
|
123
|
+
const userId = req.auth.user.id;
|
|
124
|
+
const isAdmin = req.auth.user.role === 'admin';
|
|
125
|
+
const version = versionService.getVersionById(req.params.id, isAdmin ? undefined : userId);
|
|
126
|
+
if (!version) {
|
|
127
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const db = getDb();
|
|
131
|
+
const now = new Date().toISOString();
|
|
132
|
+
// 标记版本为归档
|
|
133
|
+
db.prepare('UPDATE versions SET archived_at = ?, updated_at = ? WHERE id = ?').run(now, now, req.params.id);
|
|
134
|
+
// 软删除该版本下的所有任务
|
|
135
|
+
const result = db.prepare('UPDATE tasks SET deleted_at = ?, updated_at = ? WHERE version_id = ? AND deleted_at IS NULL').run(now, now, req.params.id);
|
|
136
|
+
res.json({
|
|
137
|
+
success: true,
|
|
138
|
+
data: {
|
|
139
|
+
name: version.name,
|
|
140
|
+
tasks_archived: result.changes
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
// DELETE /api/versions/:id - 删除版本
|
|
145
|
+
router.delete('/:id', (req, res) => {
|
|
146
|
+
const userId = req.auth.user.id;
|
|
147
|
+
const isAdmin = req.auth.user.role === 'admin';
|
|
148
|
+
const success = versionService.deleteVersion(req.params.id, isAdmin ? undefined : userId);
|
|
149
|
+
if (!success) {
|
|
150
|
+
res.status(404).json({ success: false, error: '版本不存在' });
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
res.json({ success: true, message: '版本已删除' });
|
|
154
|
+
});
|
|
155
|
+
export default router;
|
|
156
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../src/api/routes/versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAqBA,QAAA,MAAM,GAAG,6CAAY,CAAC;AA+CtB,wBAAgB,cAAc,IAAI,IAAI,CAUrC;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import cors from 'cors';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { initDb } from '../db/connection.js';
|
|
7
|
+
import { createSessionMiddleware } from '../services/session.service.js';
|
|
8
|
+
import { authMiddleware } from './middleware/auth.js';
|
|
9
|
+
import authRouter from './routes/auth.js';
|
|
10
|
+
import tokensRouter from './routes/tokens.js';
|
|
11
|
+
import usersRouter from './routes/users.js';
|
|
12
|
+
import projectsRouter from './routes/projects.js';
|
|
13
|
+
import tasksRouter from './routes/tasks.js';
|
|
14
|
+
import versionsRouter from './routes/versions.js';
|
|
15
|
+
import sopsRouter from './routes/sops.js';
|
|
16
|
+
import scheduleRouter from './routes/schedule.js';
|
|
17
|
+
import configRouter from './routes/config.js';
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const app = express();
|
|
21
|
+
const PORT = process.env.API_PORT || 3000;
|
|
22
|
+
// 中间件
|
|
23
|
+
app.use(cors({
|
|
24
|
+
origin: process.env.FRONTEND_URL || 'http://localhost:5173',
|
|
25
|
+
credentials: true // 允许携带 cookie
|
|
26
|
+
}));
|
|
27
|
+
app.use(express.json());
|
|
28
|
+
// Session 中间件
|
|
29
|
+
app.use(createSessionMiddleware());
|
|
30
|
+
// 健康检查(无需认证)
|
|
31
|
+
app.get('/health', (_req, res) => {
|
|
32
|
+
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
33
|
+
});
|
|
34
|
+
// 认证路由(无需认证)
|
|
35
|
+
app.use('/api/auth', authRouter);
|
|
36
|
+
// API 路由(需要认证)
|
|
37
|
+
app.use('/api/tokens', authMiddleware, tokensRouter);
|
|
38
|
+
app.use('/api/users', authMiddleware, usersRouter);
|
|
39
|
+
app.use('/api/projects', authMiddleware, projectsRouter);
|
|
40
|
+
app.use('/api/versions', authMiddleware, versionsRouter);
|
|
41
|
+
app.use('/api/sops', authMiddleware, sopsRouter);
|
|
42
|
+
app.use('/api/tasks', authMiddleware, tasksRouter);
|
|
43
|
+
app.use('/api/schedule', authMiddleware, scheduleRouter);
|
|
44
|
+
app.use('/api/config', authMiddleware, configRouter);
|
|
45
|
+
// 静态文件服务(前端)
|
|
46
|
+
const webDistPath = join(__dirname, '../../web/dist');
|
|
47
|
+
if (existsSync(webDistPath)) {
|
|
48
|
+
app.use(express.static(webDistPath));
|
|
49
|
+
app.get('*', (_req, res) => {
|
|
50
|
+
res.sendFile(join(webDistPath, 'index.html'));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// 错误处理
|
|
54
|
+
app.use((err, _req, res, _next) => {
|
|
55
|
+
console.error('Error:', err);
|
|
56
|
+
res.status(500).json({ success: false, error: err.message || 'Internal server error' });
|
|
57
|
+
});
|
|
58
|
+
// 启动服务器
|
|
59
|
+
export function startApiServer() {
|
|
60
|
+
// 初始化数据库
|
|
61
|
+
initDb();
|
|
62
|
+
app.listen(PORT, () => {
|
|
63
|
+
console.log(`API Server running on http://localhost:${PORT}`);
|
|
64
|
+
if (existsSync(webDistPath)) {
|
|
65
|
+
console.log(`Web UI available at http://localhost:${PORT}`);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export default app;
|
|
70
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
/**
|
|
3
|
+
* 获取数据库连接
|
|
4
|
+
*/
|
|
5
|
+
export declare function getDb(): Database.Database;
|
|
6
|
+
/**
|
|
7
|
+
* 初始化数据库(创建表)
|
|
8
|
+
*/
|
|
9
|
+
export declare function initDb(): void;
|
|
10
|
+
/**
|
|
11
|
+
* 关闭数据库连接
|
|
12
|
+
*/
|
|
13
|
+
export declare function closeDb(): void;
|
|
14
|
+
export default getDb;
|
|
15
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AActC;;GAEG;AACH,wBAAgB,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAOzC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAU7B;AAmID;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAK9B;AAED,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
// 数据库文件路径
|
|
8
|
+
const DB_PATH = process.env.DB_PATH || join(__dirname, '../../data/data.db');
|
|
9
|
+
// 单例数据库连接
|
|
10
|
+
let db = null;
|
|
11
|
+
/**
|
|
12
|
+
* 获取数据库连接
|
|
13
|
+
*/
|
|
14
|
+
export function getDb() {
|
|
15
|
+
if (!db) {
|
|
16
|
+
db = new Database(DB_PATH);
|
|
17
|
+
db.pragma('journal_mode = WAL');
|
|
18
|
+
db.pragma('foreign_keys = ON');
|
|
19
|
+
}
|
|
20
|
+
return db;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 初始化数据库(创建表)
|
|
24
|
+
*/
|
|
25
|
+
export function initDb() {
|
|
26
|
+
const database = getDb();
|
|
27
|
+
const schemaPath = join(__dirname, 'schema.sql');
|
|
28
|
+
const schema = readFileSync(schemaPath, 'utf-8');
|
|
29
|
+
database.exec(schema);
|
|
30
|
+
// 运行迁移
|
|
31
|
+
runMigrations(database);
|
|
32
|
+
console.log('Database initialized successfully');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 运行数据库迁移
|
|
36
|
+
*/
|
|
37
|
+
function runMigrations(database) {
|
|
38
|
+
const columns = database.prepare("PRAGMA table_info(tasks)").all();
|
|
39
|
+
const columnNames = columns.map(c => c.name);
|
|
40
|
+
// 迁移 1: 添加阶段性文档字段
|
|
41
|
+
if (!columnNames.includes('requirement_doc')) {
|
|
42
|
+
database.exec('ALTER TABLE tasks ADD COLUMN requirement_doc TEXT');
|
|
43
|
+
console.log('Migration: Added requirement_doc column');
|
|
44
|
+
}
|
|
45
|
+
if (!columnNames.includes('design_doc')) {
|
|
46
|
+
database.exec('ALTER TABLE tasks ADD COLUMN design_doc TEXT');
|
|
47
|
+
console.log('Migration: Added design_doc column');
|
|
48
|
+
}
|
|
49
|
+
if (!columnNames.includes('current_status')) {
|
|
50
|
+
database.exec('ALTER TABLE tasks ADD COLUMN current_status TEXT');
|
|
51
|
+
console.log('Migration: Added current_status column');
|
|
52
|
+
}
|
|
53
|
+
// 迁移 2: 添加 SOP 关联字段和软删除
|
|
54
|
+
if (!columnNames.includes('sop_id')) {
|
|
55
|
+
database.exec('ALTER TABLE tasks ADD COLUMN sop_id TEXT');
|
|
56
|
+
console.log('Migration: Added sop_id column');
|
|
57
|
+
}
|
|
58
|
+
if (!columnNames.includes('deleted_at')) {
|
|
59
|
+
database.exec('ALTER TABLE tasks ADD COLUMN deleted_at DATETIME DEFAULT NULL');
|
|
60
|
+
console.log('Migration: Added deleted_at column');
|
|
61
|
+
}
|
|
62
|
+
// 迁移 3: 版本表添加归档字段
|
|
63
|
+
const versionColumns = database.prepare("PRAGMA table_info(versions)").all();
|
|
64
|
+
const versionColumnNames = versionColumns.map(c => c.name);
|
|
65
|
+
if (!versionColumnNames.includes('archived_at')) {
|
|
66
|
+
database.exec('ALTER TABLE versions ADD COLUMN archived_at DATETIME DEFAULT NULL');
|
|
67
|
+
console.log('Migration: Added archived_at column to versions');
|
|
68
|
+
}
|
|
69
|
+
// 迁移 4: 创建 SOP 表(如果不存在)
|
|
70
|
+
database.exec(`
|
|
71
|
+
CREATE TABLE IF NOT EXISTS sops (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
project_id TEXT NOT NULL,
|
|
74
|
+
name TEXT NOT NULL,
|
|
75
|
+
description TEXT,
|
|
76
|
+
rules TEXT DEFAULT '',
|
|
77
|
+
workflow TEXT DEFAULT '',
|
|
78
|
+
required TEXT DEFAULT '',
|
|
79
|
+
forbidden TEXT DEFAULT '',
|
|
80
|
+
experience TEXT DEFAULT '',
|
|
81
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
82
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
83
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
84
|
+
)
|
|
85
|
+
`);
|
|
86
|
+
// 迁移 5: 创建索引
|
|
87
|
+
database.exec(`CREATE INDEX IF NOT EXISTS idx_sops_project_id ON sops(project_id)`);
|
|
88
|
+
database.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_deleted_at ON tasks(deleted_at)`);
|
|
89
|
+
database.exec(`CREATE INDEX IF NOT EXISTS idx_versions_archived_at ON versions(archived_at)`);
|
|
90
|
+
// 迁移 6: 将旧状态迁移到新状态
|
|
91
|
+
// todo/blocked/review/cancelled -> planned, in_progress -> in_progress, done -> done
|
|
92
|
+
database.exec(`
|
|
93
|
+
UPDATE tasks SET status = 'planned' WHERE status IN ('todo', 'blocked', 'review', 'cancelled')
|
|
94
|
+
`);
|
|
95
|
+
console.log('Migration: Migrated old task statuses to new status values');
|
|
96
|
+
// 迁移 7: 用户表添加首次登录和密码重置字段
|
|
97
|
+
const userColumns = database.prepare("PRAGMA table_info(users)").all();
|
|
98
|
+
const userColumnNames = userColumns.map(c => c.name);
|
|
99
|
+
if (!userColumnNames.includes('is_first_login')) {
|
|
100
|
+
database.exec('ALTER TABLE users ADD COLUMN is_first_login INTEGER NOT NULL DEFAULT 0 CHECK (is_first_login IN (0, 1))');
|
|
101
|
+
console.log('Migration: Added is_first_login column to users');
|
|
102
|
+
}
|
|
103
|
+
if (!userColumnNames.includes('reset_token')) {
|
|
104
|
+
database.exec('ALTER TABLE users ADD COLUMN reset_token TEXT');
|
|
105
|
+
console.log('Migration: Added reset_token column to users');
|
|
106
|
+
}
|
|
107
|
+
if (!userColumnNames.includes('reset_token_expires')) {
|
|
108
|
+
database.exec('ALTER TABLE users ADD COLUMN reset_token_expires DATETIME');
|
|
109
|
+
console.log('Migration: Added reset_token_expires column to users');
|
|
110
|
+
}
|
|
111
|
+
// 迁移 8: 创建系统配置表
|
|
112
|
+
database.exec(`
|
|
113
|
+
CREATE TABLE IF NOT EXISTS system_config (
|
|
114
|
+
key TEXT PRIMARY KEY,
|
|
115
|
+
value TEXT NOT NULL,
|
|
116
|
+
description TEXT,
|
|
117
|
+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
118
|
+
)
|
|
119
|
+
`);
|
|
120
|
+
// 插入默认系统配置
|
|
121
|
+
const configDefaults = [
|
|
122
|
+
['server_url', 'http://localhost:3000', '服务器 URL'],
|
|
123
|
+
['smtp_host', '', 'SMTP 服务器地址'],
|
|
124
|
+
['smtp_port', '587', 'SMTP 端口'],
|
|
125
|
+
['smtp_user', '', 'SMTP 用户名'],
|
|
126
|
+
['smtp_pass', '', 'SMTP 密码'],
|
|
127
|
+
['smtp_from', '', '发件人邮箱'],
|
|
128
|
+
];
|
|
129
|
+
const insertConfig = database.prepare(`
|
|
130
|
+
INSERT OR IGNORE INTO system_config (key, value, description) VALUES (?, ?, ?)
|
|
131
|
+
`);
|
|
132
|
+
for (const [key, value, desc] of configDefaults) {
|
|
133
|
+
insertConfig.run(key, value, desc);
|
|
134
|
+
}
|
|
135
|
+
console.log('Migration: Created system_config table with defaults');
|
|
136
|
+
// 迁移 9: 创建重置令牌索引
|
|
137
|
+
database.exec(`CREATE INDEX IF NOT EXISTS idx_users_reset_token ON users(reset_token)`);
|
|
138
|
+
// 迁移 10: 更新默认管理员用户
|
|
139
|
+
const adminUser = database.prepare(`SELECT id FROM users WHERE id = 'admin-001'`).get();
|
|
140
|
+
if (adminUser) {
|
|
141
|
+
database.exec(`
|
|
142
|
+
UPDATE users SET is_first_login = 1, email = COALESCE(email, 'admin@example.com')
|
|
143
|
+
WHERE id = 'admin-001' AND (email IS NULL OR email = '' OR email = 'admin@example.com')
|
|
144
|
+
`);
|
|
145
|
+
console.log('Migration: Updated admin user for first login');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 关闭数据库连接
|
|
150
|
+
*/
|
|
151
|
+
export function closeDb() {
|
|
152
|
+
if (db) {
|
|
153
|
+
db.close();
|
|
154
|
+
db = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export default getDb;
|
|
158
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/db/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/db/init.ts"],"names":[],"mappings":""}
|
package/dist/db/init.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/db/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,SAAS;AACT,MAAM,EAAE,CAAC;AACT,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,aAAa;AACb,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAuJA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
// 导入所有工具
|
|
5
|
+
import { initProjectTool, handleInitProject } from './tools/init-project.js';
|
|
6
|
+
import { createTaskTool, handleCreateTask } from './tools/create-task.js';
|
|
7
|
+
import { listTasksTool, handleListTasks } from './tools/list-tasks.js';
|
|
8
|
+
import { getTaskTool, handleGetTask } from './tools/get-task.js';
|
|
9
|
+
import { updateTaskTool, handleUpdateTask } from './tools/update-task.js';
|
|
10
|
+
import { deleteTaskTool, handleDeleteTask } from './tools/delete-task.js';
|
|
11
|
+
import { activateTaskTool, handleActivateTask } from './tools/activate-task.js';
|
|
12
|
+
import { completeTaskTool, handleCompleteTask } from './tools/complete-task.js';
|
|
13
|
+
import { assignTaskTool, handleAssignTask } from './tools/assign-task.js';
|
|
14
|
+
import { createVersionTool, handleCreateVersion } from './tools/create-version.js';
|
|
15
|
+
import { listVersionsTool, handleListVersions } from './tools/list-versions.js';
|
|
16
|
+
import { archiveVersionTool, handleArchiveVersion } from './tools/archive-version.js';
|
|
17
|
+
import { addTaskNoteTool, handleAddTaskNote } from './tools/add-task-note.js';
|
|
18
|
+
import { getMyTasksTool, handleGetMyTasks } from './tools/get-my-tasks.js';
|
|
19
|
+
import { getNextTaskTool, handleGetNextTask } from './tools/get-next-task.js';
|
|
20
|
+
import { getTaskContextTool, handleGetTaskContext } from './tools/get-task-context.js';
|
|
21
|
+
import { updateTaskDocTool, handleUpdateTaskDoc } from './tools/update-task-doc.js';
|
|
22
|
+
// SOP 工具
|
|
23
|
+
import { createSOPTool, handleCreateSOP } from './tools/create-sop.js';
|
|
24
|
+
import { listSOPsTool, handleListSOPs } from './tools/list-sops.js';
|
|
25
|
+
import { getSOPTool, handleGetSOP } from './tools/get-sop.js';
|
|
26
|
+
import { updateSOPTool, handleUpdateSOP } from './tools/update-sop.js';
|
|
27
|
+
// 配置工具
|
|
28
|
+
import { getMcpContextFromEnv } from './tools/utils/config.js';
|
|
29
|
+
// 从环境变量获取 MCP 上下文
|
|
30
|
+
const mcpContext = getMcpContextFromEnv();
|
|
31
|
+
// 创建 MCP Server
|
|
32
|
+
const server = new Server({
|
|
33
|
+
name: 'oh-my-task',
|
|
34
|
+
version: '2.1.0',
|
|
35
|
+
}, {
|
|
36
|
+
capabilities: {
|
|
37
|
+
tools: {},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
// 工具列表(2.1 版本 - 支持 Token 认证)
|
|
41
|
+
const tools = [
|
|
42
|
+
// 项目管理
|
|
43
|
+
initProjectTool,
|
|
44
|
+
// 版本管理
|
|
45
|
+
createVersionTool,
|
|
46
|
+
listVersionsTool,
|
|
47
|
+
archiveVersionTool,
|
|
48
|
+
// SOP 管理
|
|
49
|
+
createSOPTool,
|
|
50
|
+
listSOPsTool,
|
|
51
|
+
getSOPTool,
|
|
52
|
+
updateSOPTool,
|
|
53
|
+
// 任务管理
|
|
54
|
+
createTaskTool,
|
|
55
|
+
listTasksTool,
|
|
56
|
+
getTaskTool,
|
|
57
|
+
getTaskContextTool,
|
|
58
|
+
getMyTasksTool,
|
|
59
|
+
getNextTaskTool,
|
|
60
|
+
updateTaskTool,
|
|
61
|
+
updateTaskDocTool,
|
|
62
|
+
activateTaskTool,
|
|
63
|
+
completeTaskTool,
|
|
64
|
+
assignTaskTool,
|
|
65
|
+
deleteTaskTool,
|
|
66
|
+
addTaskNoteTool,
|
|
67
|
+
];
|
|
68
|
+
// 处理工具列表请求
|
|
69
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
70
|
+
return { tools };
|
|
71
|
+
});
|
|
72
|
+
// 处理工具调用请求
|
|
73
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
74
|
+
const { name, arguments: args = {} } = request.params;
|
|
75
|
+
try {
|
|
76
|
+
switch (name) {
|
|
77
|
+
// 项目管理
|
|
78
|
+
case 'init_project':
|
|
79
|
+
return await handleInitProject(args, mcpContext);
|
|
80
|
+
// 版本管理
|
|
81
|
+
case 'create_version':
|
|
82
|
+
return await handleCreateVersion(args, mcpContext);
|
|
83
|
+
case 'list_versions':
|
|
84
|
+
return await handleListVersions(args, mcpContext);
|
|
85
|
+
case 'archive_version':
|
|
86
|
+
return await handleArchiveVersion(args, mcpContext);
|
|
87
|
+
// SOP 管理
|
|
88
|
+
case 'create_sop':
|
|
89
|
+
return await handleCreateSOP(args, mcpContext);
|
|
90
|
+
case 'list_sops':
|
|
91
|
+
return await handleListSOPs(args, mcpContext);
|
|
92
|
+
case 'get_sop':
|
|
93
|
+
return await handleGetSOP(args, mcpContext);
|
|
94
|
+
case 'update_sop':
|
|
95
|
+
return await handleUpdateSOP(args, mcpContext);
|
|
96
|
+
// 任务管理
|
|
97
|
+
case 'create_task':
|
|
98
|
+
return await handleCreateTask(args, mcpContext);
|
|
99
|
+
case 'list_tasks':
|
|
100
|
+
return await handleListTasks(args, mcpContext);
|
|
101
|
+
case 'get_task':
|
|
102
|
+
return await handleGetTask(args, mcpContext);
|
|
103
|
+
case 'get_my_tasks':
|
|
104
|
+
return await handleGetMyTasks(args, mcpContext);
|
|
105
|
+
case 'get_next_task':
|
|
106
|
+
return await handleGetNextTask(args, mcpContext);
|
|
107
|
+
case 'update_task':
|
|
108
|
+
return await handleUpdateTask(args, mcpContext);
|
|
109
|
+
case 'activate_task':
|
|
110
|
+
return await handleActivateTask(args, mcpContext);
|
|
111
|
+
case 'complete_task':
|
|
112
|
+
return await handleCompleteTask(args, mcpContext);
|
|
113
|
+
case 'assign_task':
|
|
114
|
+
return await handleAssignTask(args, mcpContext);
|
|
115
|
+
case 'delete_task':
|
|
116
|
+
return await handleDeleteTask(args, mcpContext);
|
|
117
|
+
case 'add_task_note':
|
|
118
|
+
return await handleAddTaskNote(args, mcpContext);
|
|
119
|
+
case 'get_task_context':
|
|
120
|
+
return await handleGetTaskContext(args, mcpContext);
|
|
121
|
+
case 'update_task_doc':
|
|
122
|
+
return await handleUpdateTaskDoc(args, mcpContext);
|
|
123
|
+
default:
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
126
|
+
isError: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
134
|
+
isError: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// 启动 MCP Server
|
|
139
|
+
export async function startMcpServer() {
|
|
140
|
+
const transport = new StdioServerTransport();
|
|
141
|
+
await server.connect(transport);
|
|
142
|
+
console.error('MCP Server started (v2.1.0 with Token auth)');
|
|
143
|
+
}
|
|
144
|
+
// 如果直接运行此文件
|
|
145
|
+
startMcpServer().catch(console.error);
|
|
146
|
+
//# 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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"}
|