@qq33357486/oh-my-task 1.4.0 → 1.4.1

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.
Files changed (251) hide show
  1. package/README.md +121 -236
  2. package/dist/__tests__/auth-admin.test.d.ts +2 -0
  3. package/dist/__tests__/auth-admin.test.d.ts.map +1 -0
  4. package/dist/__tests__/auth-admin.test.js +440 -0
  5. package/dist/__tests__/auth-admin.test.js.map +1 -0
  6. package/dist/__tests__/auth-login-logout.test.d.ts +2 -0
  7. package/dist/__tests__/auth-login-logout.test.d.ts.map +1 -0
  8. package/dist/__tests__/auth-login-logout.test.js +400 -0
  9. package/dist/__tests__/auth-login-logout.test.js.map +1 -0
  10. package/dist/__tests__/auth-password.test.d.ts +2 -0
  11. package/dist/__tests__/auth-password.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth-password.test.js +419 -0
  13. package/dist/__tests__/auth-password.test.js.map +1 -0
  14. package/dist/__tests__/auth-register.test.d.ts +2 -0
  15. package/dist/__tests__/auth-register.test.d.ts.map +1 -0
  16. package/dist/__tests__/auth-register.test.js +379 -0
  17. package/dist/__tests__/auth-register.test.js.map +1 -0
  18. package/dist/__tests__/auth-tokens.test.d.ts +2 -0
  19. package/dist/__tests__/auth-tokens.test.d.ts.map +1 -0
  20. package/dist/__tests__/auth-tokens.test.js +392 -0
  21. package/dist/__tests__/auth-tokens.test.js.map +1 -0
  22. package/dist/__tests__/db-schema.test.d.ts +2 -0
  23. package/dist/__tests__/db-schema.test.d.ts.map +1 -0
  24. package/dist/__tests__/db-schema.test.js +245 -0
  25. package/dist/__tests__/db-schema.test.js.map +1 -0
  26. package/dist/__tests__/express-server.test.d.ts +2 -0
  27. package/dist/__tests__/express-server.test.d.ts.map +1 -0
  28. package/dist/__tests__/express-server.test.js +119 -0
  29. package/dist/__tests__/express-server.test.js.map +1 -0
  30. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts +2 -0
  31. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts.map +1 -0
  32. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js +270 -0
  33. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js.map +1 -0
  34. package/dist/__tests__/mcp/mcp-tools.test.d.ts +2 -0
  35. package/dist/__tests__/mcp/mcp-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/mcp/mcp-tools.test.js +547 -0
  37. package/dist/__tests__/mcp/mcp-tools.test.js.map +1 -0
  38. package/dist/__tests__/projects.test.d.ts +2 -0
  39. package/dist/__tests__/projects.test.d.ts.map +1 -0
  40. package/dist/__tests__/projects.test.js +406 -0
  41. package/dist/__tests__/projects.test.js.map +1 -0
  42. package/dist/__tests__/schedule.test.d.ts +2 -0
  43. package/dist/__tests__/schedule.test.d.ts.map +1 -0
  44. package/dist/__tests__/schedule.test.js +587 -0
  45. package/dist/__tests__/schedule.test.js.map +1 -0
  46. package/dist/__tests__/tasks-crud.test.d.ts +2 -0
  47. package/dist/__tests__/tasks-crud.test.d.ts.map +1 -0
  48. package/dist/__tests__/tasks-crud.test.js +606 -0
  49. package/dist/__tests__/tasks-crud.test.js.map +1 -0
  50. package/dist/__tests__/tasks-lifecycle.test.d.ts +2 -0
  51. package/dist/__tests__/tasks-lifecycle.test.d.ts.map +1 -0
  52. package/dist/__tests__/tasks-lifecycle.test.js +712 -0
  53. package/dist/__tests__/tasks-lifecycle.test.js.map +1 -0
  54. package/dist/__tests__/versions.test.d.ts +2 -0
  55. package/dist/__tests__/versions.test.d.ts.map +1 -0
  56. package/dist/__tests__/versions.test.js +613 -0
  57. package/dist/__tests__/versions.test.js.map +1 -0
  58. package/dist/api/middleware/auth.d.ts +1 -2
  59. package/dist/api/middleware/auth.d.ts.map +1 -1
  60. package/dist/api/middleware/auth.js +5 -12
  61. package/dist/api/middleware/auth.js.map +1 -1
  62. package/dist/api/middleware/captcha.d.ts +8 -0
  63. package/dist/api/middleware/captcha.d.ts.map +1 -1
  64. package/dist/api/middleware/captcha.js +29 -4
  65. package/dist/api/middleware/captcha.js.map +1 -1
  66. package/dist/api/middleware/ownerCheck.d.ts +0 -5
  67. package/dist/api/middleware/ownerCheck.d.ts.map +1 -1
  68. package/dist/api/middleware/ownerCheck.js +15 -49
  69. package/dist/api/middleware/ownerCheck.js.map +1 -1
  70. package/dist/api/routes/{sops.d.ts → admin.d.ts} +1 -1
  71. package/dist/api/routes/admin.d.ts.map +1 -0
  72. package/dist/api/routes/admin.js +20 -0
  73. package/dist/api/routes/admin.js.map +1 -0
  74. package/dist/api/routes/auth.d.ts.map +1 -1
  75. package/dist/api/routes/auth.js +65 -14
  76. package/dist/api/routes/auth.js.map +1 -1
  77. package/dist/api/routes/config.d.ts.map +1 -1
  78. package/dist/api/routes/config.js +6 -1
  79. package/dist/api/routes/config.js.map +1 -1
  80. package/dist/api/routes/projects.d.ts.map +1 -1
  81. package/dist/api/routes/projects.js +29 -18
  82. package/dist/api/routes/projects.js.map +1 -1
  83. package/dist/api/routes/tasks.d.ts.map +1 -1
  84. package/dist/api/routes/tasks.js +79 -104
  85. package/dist/api/routes/tasks.js.map +1 -1
  86. package/dist/api/routes/tokens.d.ts.map +1 -1
  87. package/dist/api/routes/tokens.js +11 -8
  88. package/dist/api/routes/tokens.js.map +1 -1
  89. package/dist/api/routes/users.d.ts.map +1 -1
  90. package/dist/api/routes/users.js +7 -59
  91. package/dist/api/routes/users.js.map +1 -1
  92. package/dist/api/routes/versions.d.ts.map +1 -1
  93. package/dist/api/routes/versions.js +63 -34
  94. package/dist/api/routes/versions.js.map +1 -1
  95. package/dist/api/server.d.ts.map +1 -1
  96. package/dist/api/server.js +23 -14
  97. package/dist/api/server.js.map +1 -1
  98. package/dist/db/connection.d.ts.map +1 -1
  99. package/dist/db/connection.js +40 -118
  100. package/dist/db/connection.js.map +1 -1
  101. package/dist/mcp/server.d.ts.map +1 -1
  102. package/dist/mcp/server.js +15 -64
  103. package/dist/mcp/server.js.map +1 -1
  104. package/dist/mcp/tools/activate-task.d.ts.map +1 -1
  105. package/dist/mcp/tools/activate-task.js +3 -17
  106. package/dist/mcp/tools/activate-task.js.map +1 -1
  107. package/dist/mcp/tools/{get-next-task.d.ts → auto-schedule.d.ts} +3 -3
  108. package/dist/mcp/tools/auto-schedule.d.ts.map +1 -0
  109. package/dist/mcp/tools/auto-schedule.js +59 -0
  110. package/dist/mcp/tools/auto-schedule.js.map +1 -0
  111. package/dist/mcp/tools/complete-task.d.ts.map +1 -1
  112. package/dist/mcp/tools/complete-task.js +2 -12
  113. package/dist/mcp/tools/complete-task.js.map +1 -1
  114. package/dist/mcp/tools/create-task.d.ts.map +1 -1
  115. package/dist/mcp/tools/create-task.js +33 -38
  116. package/dist/mcp/tools/create-task.js.map +1 -1
  117. package/dist/mcp/tools/create-version.d.ts.map +1 -1
  118. package/dist/mcp/tools/create-version.js +2 -17
  119. package/dist/mcp/tools/create-version.js.map +1 -1
  120. package/dist/mcp/tools/{get-task-context.d.ts → get-current-task.d.ts} +3 -3
  121. package/dist/mcp/tools/get-current-task.d.ts.map +1 -0
  122. package/dist/mcp/tools/get-current-task.js +85 -0
  123. package/dist/mcp/tools/get-current-task.js.map +1 -0
  124. package/dist/mcp/tools/get-task.d.ts.map +1 -1
  125. package/dist/mcp/tools/get-task.js +7 -12
  126. package/dist/mcp/tools/get-task.js.map +1 -1
  127. package/dist/mcp/tools/init-project.d.ts +0 -2
  128. package/dist/mcp/tools/init-project.d.ts.map +1 -1
  129. package/dist/mcp/tools/init-project.js +39 -75
  130. package/dist/mcp/tools/init-project.js.map +1 -1
  131. package/dist/mcp/tools/list-tasks.d.ts.map +1 -1
  132. package/dist/mcp/tools/list-tasks.js +8 -33
  133. package/dist/mcp/tools/list-tasks.js.map +1 -1
  134. package/dist/mcp/tools/list-versions.d.ts.map +1 -1
  135. package/dist/mcp/tools/list-versions.js +16 -25
  136. package/dist/mcp/tools/list-versions.js.map +1 -1
  137. package/dist/mcp/tools/utils/config.js +1 -1
  138. package/dist/mcp/tools/utils/config.js.map +1 -1
  139. package/dist/services/admin.service.d.ts +27 -0
  140. package/dist/services/admin.service.d.ts.map +1 -0
  141. package/dist/services/admin.service.js +88 -0
  142. package/dist/services/admin.service.js.map +1 -0
  143. package/dist/services/config.service.d.ts +1 -0
  144. package/dist/services/config.service.d.ts.map +1 -1
  145. package/dist/services/config.service.js +7 -0
  146. package/dist/services/config.service.js.map +1 -1
  147. package/dist/services/project.service.d.ts +7 -7
  148. package/dist/services/project.service.d.ts.map +1 -1
  149. package/dist/services/project.service.js +47 -40
  150. package/dist/services/project.service.js.map +1 -1
  151. package/dist/services/schedule.service.d.ts +6 -0
  152. package/dist/services/schedule.service.d.ts.map +1 -1
  153. package/dist/services/schedule.service.js +36 -12
  154. package/dist/services/schedule.service.js.map +1 -1
  155. package/dist/services/task.service.d.ts +6 -18
  156. package/dist/services/task.service.d.ts.map +1 -1
  157. package/dist/services/task.service.js +161 -194
  158. package/dist/services/task.service.js.map +1 -1
  159. package/dist/services/token.service.d.ts +1 -0
  160. package/dist/services/token.service.d.ts.map +1 -1
  161. package/dist/services/token.service.js +5 -2
  162. package/dist/services/token.service.js.map +1 -1
  163. package/dist/services/user.service.d.ts +0 -32
  164. package/dist/services/user.service.d.ts.map +1 -1
  165. package/dist/services/user.service.js +13 -110
  166. package/dist/services/user.service.js.map +1 -1
  167. package/dist/services/version.service.d.ts +26 -8
  168. package/dist/services/version.service.d.ts.map +1 -1
  169. package/dist/services/version.service.js +149 -41
  170. package/dist/services/version.service.js.map +1 -1
  171. package/dist/types/index.d.ts +17 -60
  172. package/dist/types/index.d.ts.map +1 -1
  173. package/package.json +4 -13
  174. package/src/db/schema.sql +113 -70
  175. package/dist/api/routes/sops.d.ts.map +0 -1
  176. package/dist/api/routes/sops.js +0 -155
  177. package/dist/api/routes/sops.js.map +0 -1
  178. package/dist/mcp/tools/add-task-note.d.ts +0 -10
  179. package/dist/mcp/tools/add-task-note.d.ts.map +0 -1
  180. package/dist/mcp/tools/add-task-note.js +0 -46
  181. package/dist/mcp/tools/add-task-note.js.map +0 -1
  182. package/dist/mcp/tools/approve-task.d.ts +0 -10
  183. package/dist/mcp/tools/approve-task.d.ts.map +0 -1
  184. package/dist/mcp/tools/approve-task.js +0 -59
  185. package/dist/mcp/tools/approve-task.js.map +0 -1
  186. package/dist/mcp/tools/archive-version.d.ts +0 -10
  187. package/dist/mcp/tools/archive-version.d.ts.map +0 -1
  188. package/dist/mcp/tools/archive-version.js +0 -57
  189. package/dist/mcp/tools/archive-version.js.map +0 -1
  190. package/dist/mcp/tools/assign-task.d.ts +0 -10
  191. package/dist/mcp/tools/assign-task.d.ts.map +0 -1
  192. package/dist/mcp/tools/assign-task.js +0 -53
  193. package/dist/mcp/tools/assign-task.js.map +0 -1
  194. package/dist/mcp/tools/create-sop.d.ts +0 -10
  195. package/dist/mcp/tools/create-sop.d.ts.map +0 -1
  196. package/dist/mcp/tools/create-sop.js +0 -90
  197. package/dist/mcp/tools/create-sop.js.map +0 -1
  198. package/dist/mcp/tools/get-my-tasks.d.ts +0 -10
  199. package/dist/mcp/tools/get-my-tasks.d.ts.map +0 -1
  200. package/dist/mcp/tools/get-my-tasks.js +0 -88
  201. package/dist/mcp/tools/get-my-tasks.js.map +0 -1
  202. package/dist/mcp/tools/get-next-task.d.ts.map +0 -1
  203. package/dist/mcp/tools/get-next-task.js +0 -84
  204. package/dist/mcp/tools/get-next-task.js.map +0 -1
  205. package/dist/mcp/tools/get-sop.d.ts +0 -10
  206. package/dist/mcp/tools/get-sop.d.ts.map +0 -1
  207. package/dist/mcp/tools/get-sop.js +0 -67
  208. package/dist/mcp/tools/get-sop.js.map +0 -1
  209. package/dist/mcp/tools/get-task-context.d.ts.map +0 -1
  210. package/dist/mcp/tools/get-task-context.js +0 -114
  211. package/dist/mcp/tools/get-task-context.js.map +0 -1
  212. package/dist/mcp/tools/helpers.d.ts +0 -10
  213. package/dist/mcp/tools/helpers.d.ts.map +0 -1
  214. package/dist/mcp/tools/helpers.js +0 -17
  215. package/dist/mcp/tools/helpers.js.map +0 -1
  216. package/dist/mcp/tools/list-sops.d.ts +0 -10
  217. package/dist/mcp/tools/list-sops.d.ts.map +0 -1
  218. package/dist/mcp/tools/list-sops.js +0 -57
  219. package/dist/mcp/tools/list-sops.js.map +0 -1
  220. package/dist/mcp/tools/reject-task.d.ts +0 -10
  221. package/dist/mcp/tools/reject-task.d.ts.map +0 -1
  222. package/dist/mcp/tools/reject-task.js +0 -63
  223. package/dist/mcp/tools/reject-task.js.map +0 -1
  224. package/dist/mcp/tools/reschedule.d.ts +0 -17
  225. package/dist/mcp/tools/reschedule.d.ts.map +0 -1
  226. package/dist/mcp/tools/reschedule.js +0 -107
  227. package/dist/mcp/tools/reschedule.js.map +0 -1
  228. package/dist/mcp/tools/start-task.d.ts +0 -10
  229. package/dist/mcp/tools/start-task.d.ts.map +0 -1
  230. package/dist/mcp/tools/start-task.js +0 -42
  231. package/dist/mcp/tools/start-task.js.map +0 -1
  232. package/dist/mcp/tools/submit-for-review.d.ts +0 -10
  233. package/dist/mcp/tools/submit-for-review.d.ts.map +0 -1
  234. package/dist/mcp/tools/submit-for-review.js +0 -64
  235. package/dist/mcp/tools/submit-for-review.js.map +0 -1
  236. package/dist/mcp/tools/update-sop.d.ts +0 -10
  237. package/dist/mcp/tools/update-sop.d.ts.map +0 -1
  238. package/dist/mcp/tools/update-sop.js +0 -113
  239. package/dist/mcp/tools/update-sop.js.map +0 -1
  240. package/dist/mcp/tools/update-task-doc.d.ts +0 -10
  241. package/dist/mcp/tools/update-task-doc.d.ts.map +0 -1
  242. package/dist/mcp/tools/update-task-doc.js +0 -70
  243. package/dist/mcp/tools/update-task-doc.js.map +0 -1
  244. package/dist/mcp/tools/update-task.d.ts +0 -10
  245. package/dist/mcp/tools/update-task.d.ts.map +0 -1
  246. package/dist/mcp/tools/update-task.js +0 -106
  247. package/dist/mcp/tools/update-task.js.map +0 -1
  248. package/dist/services/sop.service.d.ts +0 -53
  249. package/dist/services/sop.service.d.ts.map +0 -1
  250. package/dist/services/sop.service.js +0 -275
  251. package/dist/services/sop.service.js.map +0 -1
@@ -0,0 +1,547 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
2
+ import request from 'supertest';
3
+ import Database from 'better-sqlite3';
4
+ import { mkdirSync, rmSync, existsSync, readFileSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { tmpdir } from 'os';
7
+ // 每个测试用唯一的临时目录,避免并行测试冲突
8
+ let TEST_DIR;
9
+ let TEST_DB_PATH;
10
+ let app;
11
+ // 测试用户 cookie
12
+ let user1Cookie;
13
+ let user1Id;
14
+ let user2Cookie;
15
+ let user2Id;
16
+ let projectId;
17
+ // 每个测试独立的 token,通过 session 创建
18
+ let user1Token;
19
+ let user2Token;
20
+ beforeAll(async () => {
21
+ TEST_DIR = join(tmpdir(), `omt-mcp-test-${Date.now()}`);
22
+ TEST_DB_PATH = join(TEST_DIR, 'data', 'data.db');
23
+ mkdirSync(join(TEST_DIR, 'data'), { recursive: true });
24
+ process.env.DB_PATH = TEST_DB_PATH;
25
+ // 初始化数据库
26
+ const db = new Database(TEST_DB_PATH);
27
+ db.pragma('journal_mode = WAL');
28
+ db.pragma('foreign_keys = ON');
29
+ const schemaSql = readFileSync(join(process.cwd(), 'src', 'db', 'schema.sql'), 'utf-8');
30
+ db.exec(schemaSql);
31
+ db.close();
32
+ // 动态导入 app
33
+ const serverModule = await import('../../api/server.js');
34
+ app = serverModule.default;
35
+ });
36
+ afterAll(() => {
37
+ try {
38
+ if (existsSync(TEST_DIR)) {
39
+ rmSync(TEST_DIR, { recursive: true, force: true });
40
+ }
41
+ }
42
+ catch {
43
+ // Windows 可能因文件锁定无法立即删除
44
+ }
45
+ delete process.env.DB_PATH;
46
+ });
47
+ beforeEach(async () => {
48
+ // 注册用户1(admin)
49
+ const res1 = await request(app)
50
+ .post('/api/auth/register')
51
+ .send({
52
+ name: 'User1',
53
+ email: `user1-mcp-${Date.now()}@test.com`,
54
+ password: 'UserPass123'
55
+ });
56
+ user1Cookie = res1.headers['set-cookie']?.[0] || '';
57
+ user1Id = res1.body.data?.user?.id || '';
58
+ // 注册用户2(member)
59
+ const res2 = await request(app)
60
+ .post('/api/auth/register')
61
+ .send({
62
+ name: 'User2',
63
+ email: `user2-mcp-${Date.now()}@test.com`,
64
+ password: 'UserPass123'
65
+ });
66
+ user2Cookie = res2.headers['set-cookie']?.[0] || '';
67
+ user2Id = res2.body.data?.user?.id || '';
68
+ // 创建项目
69
+ const projRes = await request(app)
70
+ .post('/api/projects')
71
+ .set('Cookie', user1Cookie)
72
+ .send({ name: 'MCP测试项目' });
73
+ projectId = projRes.body.data?.id || '';
74
+ // 通过 session 创建 Token 用于 Bearer 认证
75
+ const tokenRes1 = await request(app)
76
+ .post('/api/tokens')
77
+ .set('Cookie', user1Cookie)
78
+ .send({ name: `test-token-u1-${Date.now()}` });
79
+ user1Token = tokenRes1.body.data?.token?.plain_token || '';
80
+ const tokenRes2 = await request(app)
81
+ .post('/api/tokens')
82
+ .set('Cookie', user2Cookie)
83
+ .send({ name: `test-token-u2-${Date.now()}` });
84
+ user2Token = tokenRes2.body.data?.token?.plain_token || '';
85
+ });
86
+ describe('MCP Tools — 通过 HTTP API 模拟', () => {
87
+ // ========================
88
+ // VAL-MCP-001: init_project 自动创建项目
89
+ // ========================
90
+ describe('VAL-MCP-001: init_project 自动创建项目', () => {
91
+ it('项目不存在时创建新项目', async () => {
92
+ const res = await request(app)
93
+ .post('/api/projects')
94
+ .set('Authorization', `Bearer ${user1Token}`)
95
+ .send({ name: '新MCP项目', description: '测试描述' });
96
+ expect(res.status).toBe(201);
97
+ expect(res.body.success).toBe(true);
98
+ expect(res.body.data).toHaveProperty('id');
99
+ expect(res.body.data.name).toBe('新MCP项目');
100
+ expect(res.body.data.owner_id).toBe(user1Id);
101
+ });
102
+ it('同名项目已存在时返回 409', async () => {
103
+ // 先创建
104
+ await request(app)
105
+ .post('/api/projects')
106
+ .set('Authorization', `Bearer ${user1Token}`)
107
+ .send({ name: '重复项目' });
108
+ // 再创建同名
109
+ const res = await request(app)
110
+ .post('/api/projects')
111
+ .set('Authorization', `Bearer ${user1Token}`)
112
+ .send({ name: '重复项目' });
113
+ expect(res.status).toBe(409);
114
+ expect(res.body.success).toBe(false);
115
+ });
116
+ });
117
+ // ========================
118
+ // VAL-MCP-002: init_project 已有项目返回现有
119
+ // ========================
120
+ describe('VAL-MCP-002: init_project 已有项目返回现有', () => {
121
+ it('通过 GET /api/projects 获取现有项目列表', async () => {
122
+ const res = await request(app)
123
+ .get('/api/projects')
124
+ .set('Authorization', `Bearer ${user1Token}`);
125
+ expect(res.status).toBe(200);
126
+ expect(res.body.success).toBe(true);
127
+ expect(Array.isArray(res.body.data)).toBe(true);
128
+ // 至少包含 beforeEach 中创建的项目
129
+ expect(res.body.data.length).toBeGreaterThanOrEqual(1);
130
+ const project = res.body.data.find((p) => p.name === 'MCP测试项目');
131
+ expect(project).toBeDefined();
132
+ expect(project.id).toBe(projectId);
133
+ });
134
+ });
135
+ // ========================
136
+ // VAL-MCP-003: create_version 创建版本
137
+ // ========================
138
+ describe('VAL-MCP-003: create_version 创建版本', () => {
139
+ it('创建版本成功', async () => {
140
+ const res = await request(app)
141
+ .post('/api/versions')
142
+ .set('Authorization', `Bearer ${user1Token}`)
143
+ .send({ project_id: projectId, name: 'v1.0' });
144
+ expect(res.status).toBe(201);
145
+ expect(res.body.success).toBe(true);
146
+ expect(res.body.data).toHaveProperty('id');
147
+ expect(res.body.data.name).toBe('v1.0');
148
+ expect(res.body.data.project_id).toBe(projectId);
149
+ });
150
+ it('缺少 name 时返回 400', async () => {
151
+ const res = await request(app)
152
+ .post('/api/versions')
153
+ .set('Authorization', `Bearer ${user1Token}`)
154
+ .send({ project_id: projectId });
155
+ expect(res.status).toBe(400);
156
+ expect(res.body.success).toBe(false);
157
+ });
158
+ });
159
+ // ========================
160
+ // VAL-MCP-004: list_versions 列出版本
161
+ // ========================
162
+ describe('VAL-MCP-004: list_versions 列出版本并标记活跃', () => {
163
+ it('返回项目的版本列表', async () => {
164
+ // 创建两个版本
165
+ await request(app)
166
+ .post('/api/versions')
167
+ .set('Authorization', `Bearer ${user1Token}`)
168
+ .send({ project_id: projectId, name: 'v1.0' });
169
+ await request(app)
170
+ .post('/api/versions')
171
+ .set('Authorization', `Bearer ${user1Token}`)
172
+ .send({ project_id: projectId, name: 'v2.0' });
173
+ const res = await request(app)
174
+ .get(`/api/versions?project_id=${projectId}`)
175
+ .set('Authorization', `Bearer ${user1Token}`);
176
+ expect(res.status).toBe(200);
177
+ expect(res.body.success).toBe(true);
178
+ expect(res.body.data.length).toBe(2);
179
+ // 标记活跃版本
180
+ const activeVersion = res.body.data.find((v) => v.locked_at !== null && v.completed_at === null);
181
+ // 此时没有活跃版本
182
+ expect(activeVersion).toBeUndefined();
183
+ });
184
+ it('开始版本后标记为活跃', async () => {
185
+ // 创建版本
186
+ const vRes = await request(app)
187
+ .post('/api/versions')
188
+ .set('Authorization', `Bearer ${user1Token}`)
189
+ .send({ project_id: projectId, name: 'v1.0' });
190
+ const versionId = vRes.body.data.id;
191
+ // 开始版本
192
+ await request(app)
193
+ .post(`/api/versions/${versionId}/start`)
194
+ .set('Authorization', `Bearer ${user1Token}`);
195
+ const res = await request(app)
196
+ .get(`/api/versions?project_id=${projectId}`)
197
+ .set('Authorization', `Bearer ${user1Token}`);
198
+ expect(res.status).toBe(200);
199
+ const activeVersion = res.body.data.find((v) => v.id === versionId && v.locked_at !== null);
200
+ expect(activeVersion).toBeDefined();
201
+ });
202
+ });
203
+ // ========================
204
+ // VAL-MCP-005: create_task 创建任务
205
+ // ========================
206
+ describe('VAL-MCP-005: create_task 创建任务', () => {
207
+ let versionId;
208
+ beforeEach(async () => {
209
+ const vRes = await request(app)
210
+ .post('/api/versions')
211
+ .set('Authorization', `Bearer ${user1Token}`)
212
+ .send({ project_id: projectId, name: 'v1.0' });
213
+ versionId = vRes.body.data.id;
214
+ });
215
+ it('创建任务成功,自动关联活跃版本', async () => {
216
+ const res = await request(app)
217
+ .post('/api/tasks')
218
+ .set('Authorization', `Bearer ${user1Token}`)
219
+ .send({
220
+ project_id: projectId,
221
+ title: '测试任务',
222
+ });
223
+ expect(res.status).toBe(201);
224
+ expect(res.body.success).toBe(true);
225
+ expect(res.body.data.title).toBe('测试任务');
226
+ expect(res.body.data.status).toBe('planned');
227
+ });
228
+ it('指定 version_id 创建任务', async () => {
229
+ const res = await request(app)
230
+ .post('/api/tasks')
231
+ .set('Authorization', `Bearer ${user1Token}`)
232
+ .send({
233
+ project_id: projectId,
234
+ version_id: versionId,
235
+ title: '指定版本任务',
236
+ });
237
+ expect(res.status).toBe(201);
238
+ expect(res.body.data.version_id).toBe(versionId);
239
+ });
240
+ });
241
+ // ========================
242
+ // VAL-MCP-006: create_task parent_title 匹配
243
+ // ========================
244
+ describe('VAL-MCP-006: create_task parent_title 匹配', () => {
245
+ it('通过 parent_title 找到父任务并创建子任务', async () => {
246
+ // 先创建父任务
247
+ const parentRes = await request(app)
248
+ .post('/api/tasks')
249
+ .set('Authorization', `Bearer ${user1Token}`)
250
+ .send({ project_id: projectId, title: '父任务标题' });
251
+ const parentId = parentRes.body.data.id;
252
+ // 查找父任务(模拟 parent_title 匹配逻辑)
253
+ const listRes = await request(app)
254
+ .get(`/api/tasks?project_id=${projectId}`)
255
+ .set('Authorization', `Bearer ${user1Token}`);
256
+ const parentTask = listRes.body.data.find((t) => t.title === '父任务标题');
257
+ expect(parentTask).toBeDefined();
258
+ expect(parentTask.id).toBe(parentId);
259
+ // 使用找到的 parent_id 创建子任务
260
+ const childRes = await request(app)
261
+ .post('/api/tasks')
262
+ .set('Authorization', `Bearer ${user1Token}`)
263
+ .send({
264
+ project_id: projectId,
265
+ parent_id: parentId,
266
+ title: '子任务',
267
+ });
268
+ expect(childRes.status).toBe(201);
269
+ expect(childRes.body.data.parent_id).toBe(parentId);
270
+ });
271
+ it('parent_title 找不到时返回错误', async () => {
272
+ // 尝试使用不存在的 parent_id
273
+ const res = await request(app)
274
+ .post('/api/tasks')
275
+ .set('Authorization', `Bearer ${user1Token}`)
276
+ .send({
277
+ project_id: projectId,
278
+ parent_id: 'non-existent-id',
279
+ title: '应该失败的任务',
280
+ });
281
+ expect(res.status).toBe(400);
282
+ expect(res.body.success).toBe(false);
283
+ });
284
+ });
285
+ // ========================
286
+ // VAL-MCP-007: list_tasks 查询任务
287
+ // ========================
288
+ describe('VAL-MCP-007: list_tasks 按状态过滤', () => {
289
+ it('按状态过滤任务列表', async () => {
290
+ // 创建多个任务
291
+ await request(app)
292
+ .post('/api/tasks')
293
+ .set('Authorization', `Bearer ${user1Token}`)
294
+ .send({ project_id: projectId, title: '计划任务' });
295
+ await request(app)
296
+ .post('/api/tasks')
297
+ .set('Authorization', `Bearer ${user1Token}`)
298
+ .send({ project_id: projectId, title: '另一个计划任务' });
299
+ // 查询 planned 状态的任务
300
+ const res = await request(app)
301
+ .get(`/api/tasks?project_id=${projectId}&status=planned`)
302
+ .set('Authorization', `Bearer ${user1Token}`);
303
+ expect(res.status).toBe(200);
304
+ expect(res.body.success).toBe(true);
305
+ expect(res.body.data.length).toBeGreaterThanOrEqual(2);
306
+ res.body.data.forEach((task) => {
307
+ expect(task.status).toBe('planned');
308
+ });
309
+ });
310
+ it('返回空列表当没有匹配任务时', async () => {
311
+ const res = await request(app)
312
+ .get(`/api/tasks?project_id=${projectId}&status=in_progress`)
313
+ .set('Authorization', `Bearer ${user1Token}`);
314
+ expect(res.status).toBe(200);
315
+ expect(res.body.data.length).toBe(0);
316
+ });
317
+ });
318
+ // ========================
319
+ // VAL-MCP-008: get_task 获取任务详情
320
+ // ========================
321
+ describe('VAL-MCP-008: get_task 返回任务树', () => {
322
+ it('返回任务详情含子任务树', async () => {
323
+ // 创建父任务
324
+ const parentRes = await request(app)
325
+ .post('/api/tasks')
326
+ .set('Authorization', `Bearer ${user1Token}`)
327
+ .send({ project_id: projectId, title: '父任务' });
328
+ const parentId = parentRes.body.data.id;
329
+ // 创建子任务
330
+ await request(app)
331
+ .post('/api/tasks')
332
+ .set('Authorization', `Bearer ${user1Token}`)
333
+ .send({ project_id: projectId, parent_id: parentId, title: '子任务1' });
334
+ await request(app)
335
+ .post('/api/tasks')
336
+ .set('Authorization', `Bearer ${user1Token}`)
337
+ .send({ project_id: projectId, parent_id: parentId, title: '子任务2' });
338
+ const res = await request(app)
339
+ .get(`/api/tasks/${parentId}`)
340
+ .set('Authorization', `Bearer ${user1Token}`);
341
+ expect(res.status).toBe(200);
342
+ expect(res.body.success).toBe(true);
343
+ expect(res.body.data.title).toBe('父任务');
344
+ expect(res.body.data.children).toBeDefined();
345
+ expect(res.body.data.children.length).toBe(2);
346
+ expect(res.body.data.children[0].title).toBe('子任务1');
347
+ expect(res.body.data.children[1].title).toBe('子任务2');
348
+ });
349
+ });
350
+ // ========================
351
+ // VAL-MCP-009: activate_task 激活任务
352
+ // ========================
353
+ describe('VAL-MCP-009: activate_task 激活任务', () => {
354
+ it('将任务状态设为 in_progress', async () => {
355
+ const taskRes = await request(app)
356
+ .post('/api/tasks')
357
+ .set('Authorization', `Bearer ${user1Token}`)
358
+ .send({ project_id: projectId, title: '待激活任务' });
359
+ const taskId = taskRes.body.data.id;
360
+ const res = await request(app)
361
+ .post(`/api/tasks/${taskId}/activate`)
362
+ .set('Authorization', `Bearer ${user1Token}`);
363
+ expect(res.status).toBe(200);
364
+ expect(res.body.success).toBe(true);
365
+ expect(res.body.data.status).toBe('in_progress');
366
+ expect(res.body.data.actual_start).toBeDefined();
367
+ });
368
+ });
369
+ // ========================
370
+ // VAL-MCP-010: complete_task 完成任务
371
+ // ========================
372
+ describe('VAL-MCP-010: complete_task 完成任务', () => {
373
+ it('将任务状态设为 done', async () => {
374
+ const taskRes = await request(app)
375
+ .post('/api/tasks')
376
+ .set('Authorization', `Bearer ${user1Token}`)
377
+ .send({ project_id: projectId, title: '待完成任务' });
378
+ const taskId = taskRes.body.data.id;
379
+ const res = await request(app)
380
+ .post(`/api/tasks/${taskId}/complete`)
381
+ .set('Authorization', `Bearer ${user1Token}`);
382
+ expect(res.status).toBe(200);
383
+ expect(res.body.success).toBe(true);
384
+ expect(res.body.data.status).toBe('done');
385
+ });
386
+ it('完成父任务级联完成子任务', async () => {
387
+ const parentRes = await request(app)
388
+ .post('/api/tasks')
389
+ .set('Authorization', `Bearer ${user1Token}`)
390
+ .send({ project_id: projectId, title: '父任务' });
391
+ const parentId = parentRes.body.data.id;
392
+ const childRes = await request(app)
393
+ .post('/api/tasks')
394
+ .set('Authorization', `Bearer ${user1Token}`)
395
+ .send({ project_id: projectId, parent_id: parentId, title: '子任务' });
396
+ const childId = childRes.body.data.id;
397
+ // 完成父任务
398
+ const res = await request(app)
399
+ .post(`/api/tasks/${parentId}/complete`)
400
+ .set('Authorization', `Bearer ${user1Token}`);
401
+ expect(res.status).toBe(200);
402
+ expect(res.body.data.status).toBe('done');
403
+ // 验证子任务也被完成
404
+ const childGet = await request(app)
405
+ .get(`/api/tasks/${childId}`)
406
+ .set('Authorization', `Bearer ${user1Token}`);
407
+ expect(childGet.body.data.status).toBe('done');
408
+ });
409
+ });
410
+ // ========================
411
+ // VAL-MCP-011: delete_task 删除任务
412
+ // ========================
413
+ describe('VAL-MCP-011: delete_task 删除任务', () => {
414
+ it('软删除任务及其子任务', async () => {
415
+ const parentRes = await request(app)
416
+ .post('/api/tasks')
417
+ .set('Authorization', `Bearer ${user1Token}`)
418
+ .send({ project_id: projectId, title: '待删除父任务' });
419
+ const parentId = parentRes.body.data.id;
420
+ await request(app)
421
+ .post('/api/tasks')
422
+ .set('Authorization', `Bearer ${user1Token}`)
423
+ .send({ project_id: projectId, parent_id: parentId, title: '待删除子任务' });
424
+ const res = await request(app)
425
+ .delete(`/api/tasks/${parentId}`)
426
+ .set('Authorization', `Bearer ${user1Token}`);
427
+ expect(res.status).toBe(200);
428
+ expect(res.body.success).toBe(true);
429
+ // 验证父任务不再出现
430
+ const listRes = await request(app)
431
+ .get(`/api/tasks?project_id=${projectId}`)
432
+ .set('Authorization', `Bearer ${user1Token}`);
433
+ const found = listRes.body.data.find((t) => t.id === parentId);
434
+ expect(found).toBeUndefined();
435
+ });
436
+ });
437
+ // ========================
438
+ // VAL-MCP-012: auto_schedule 自动排期
439
+ // ========================
440
+ describe('VAL-MCP-012: auto_schedule 自动排期', () => {
441
+ it('按 sort_order 顺序自动排期所有任务', async () => {
442
+ // 创建版本并开始
443
+ const vRes = await request(app)
444
+ .post('/api/versions')
445
+ .set('Authorization', `Bearer ${user1Token}`)
446
+ .send({ project_id: projectId, name: '排期版本' });
447
+ const versionId = vRes.body.data.id;
448
+ await request(app)
449
+ .post(`/api/versions/${versionId}/start`)
450
+ .set('Authorization', `Bearer ${user1Token}`);
451
+ // 创建任务(带 estimated_days)
452
+ await request(app)
453
+ .post('/api/tasks')
454
+ .set('Authorization', `Bearer ${user1Token}`)
455
+ .send({ project_id: projectId, version_id: versionId, title: '任务1', estimated_days: 2 });
456
+ await request(app)
457
+ .post('/api/tasks')
458
+ .set('Authorization', `Bearer ${user1Token}`)
459
+ .send({ project_id: projectId, version_id: versionId, title: '任务2', estimated_days: 3 });
460
+ // 自动排期
461
+ const res = await request(app)
462
+ .post('/api/schedule/auto')
463
+ .set('Authorization', `Bearer ${user1Token}`)
464
+ .send({ project_id: projectId, start_date: '2026-04-13' });
465
+ expect(res.status).toBe(200);
466
+ expect(res.body.success).toBe(true);
467
+ // 验证任务有日期
468
+ const listRes = await request(app)
469
+ .get(`/api/tasks?project_id=${projectId}&version_id=${versionId}`)
470
+ .set('Authorization', `Bearer ${user1Token}`);
471
+ const tasks = listRes.body.data;
472
+ expect(tasks.length).toBe(2);
473
+ // 任务应该有 start_date 和 due_date
474
+ tasks.forEach((task) => {
475
+ expect(task.start_date).not.toBeNull();
476
+ expect(task.due_date).not.toBeNull();
477
+ });
478
+ });
479
+ });
480
+ // ========================
481
+ // VAL-MCP-013: MCP Token 认证
482
+ // ========================
483
+ describe('VAL-MCP-013: MCP Token 认证', () => {
484
+ it('有效 Token 授权访问受保护 API', async () => {
485
+ const res = await request(app)
486
+ .get('/api/projects')
487
+ .set('Authorization', `Bearer ${user1Token}`);
488
+ expect(res.status).toBe(200);
489
+ expect(res.body.success).toBe(true);
490
+ });
491
+ it('无效 Token 返回 401', async () => {
492
+ const res = await request(app)
493
+ .get('/api/projects')
494
+ .set('Authorization', 'Bearer invalid-token-xxx');
495
+ expect(res.status).toBe(401);
496
+ expect(res.body.success).toBe(false);
497
+ });
498
+ it('无 Token 返回 401', async () => {
499
+ const res = await request(app)
500
+ .get('/api/projects');
501
+ expect(res.status).toBe(401);
502
+ expect(res.body.success).toBe(false);
503
+ });
504
+ it('其他用户的 Token 无法访问本用户的项目', async () => {
505
+ // user2 的 token 不能查看 user1 的项目(但 user2 自己没有这个项目)
506
+ const res = await request(app)
507
+ .get(`/api/projects`)
508
+ .set('Authorization', `Bearer ${user2Token}`);
509
+ expect(res.status).toBe(200);
510
+ // user2 看不到 user1 的项目
511
+ const found = res.body.data.find((p) => p.id === projectId);
512
+ expect(found).toBeUndefined();
513
+ });
514
+ });
515
+ // ========================
516
+ // VAL-MCP-014: 版本开始后添加的任务为插队任务
517
+ // ========================
518
+ describe('VAL-MCP-014: 版本开始后添加的任务为插队任务', () => {
519
+ it('版本开始后创建的任务 inserted=true', async () => {
520
+ // 创建版本
521
+ const vRes = await request(app)
522
+ .post('/api/versions')
523
+ .set('Authorization', `Bearer ${user1Token}`)
524
+ .send({ project_id: projectId, name: '插队测试版本' });
525
+ const versionId = vRes.body.data.id;
526
+ // 在版本开始前创建任务
527
+ const beforeRes = await request(app)
528
+ .post('/api/tasks')
529
+ .set('Authorization', `Bearer ${user1Token}`)
530
+ .send({ project_id: projectId, version_id: versionId, title: '版本前任务' });
531
+ // 开始版本
532
+ await request(app)
533
+ .post(`/api/versions/${versionId}/start`)
534
+ .set('Authorization', `Bearer ${user1Token}`);
535
+ // 版本开始后创建任务
536
+ const afterRes = await request(app)
537
+ .post('/api/tasks')
538
+ .set('Authorization', `Bearer ${user1Token}`)
539
+ .send({ project_id: projectId, version_id: versionId, title: '插队任务' });
540
+ expect(afterRes.status).toBe(201);
541
+ expect(afterRes.body.data.inserted).toBe(1); // inserted = true
542
+ // 版本前的任务 inserted = false
543
+ expect(beforeRes.body.data.inserted).toBe(0);
544
+ });
545
+ });
546
+ });
547
+ //# sourceMappingURL=mcp-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../../src/__tests__/mcp/mcp-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=projects.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/projects.test.ts"],"names":[],"mappings":""}