@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
@@ -1,14 +1,12 @@
1
1
  export type UserRole = 'admin' | 'member';
2
2
  export type TaskStatus = 'planned' | 'in_progress' | 'done';
3
- export type TaskAction = 'created' | 'updated' | 'status_changed' | 'assigned' | 'noted';
3
+ export type TaskAction = 'created' | 'updated' | 'status_changed' | 'noted';
4
4
  export interface User {
5
5
  id: string;
6
6
  name: string;
7
- email: string | null;
8
- password_hash: string | null;
9
- api_key: string | null;
7
+ email: string;
8
+ password_hash: string;
10
9
  role: UserRole;
11
- is_first_login: number;
12
10
  reset_token: string | null;
13
11
  reset_token_expires: string | null;
14
12
  created_at: string;
@@ -22,24 +20,17 @@ export interface UserToken {
22
20
  last_used_at: string | null;
23
21
  created_at: string;
24
22
  }
25
- export interface Project {
23
+ export interface UserActivity {
26
24
  id: string;
27
- name: string;
28
- description: string | null;
29
- owner_id: string | null;
25
+ user_id: string;
26
+ action: string;
30
27
  created_at: string;
31
- updated_at: string;
32
28
  }
33
- export interface SOP {
29
+ export interface Project {
34
30
  id: string;
35
- project_id: string;
36
31
  name: string;
37
32
  description: string | null;
38
- rules: string;
39
- workflow: string;
40
- required: string;
41
- forbidden: string;
42
- experience: string;
33
+ owner_id: string;
43
34
  created_at: string;
44
35
  updated_at: string;
45
36
  }
@@ -51,6 +42,7 @@ export interface Version {
51
42
  start_date: string | null;
52
43
  due_date: string | null;
53
44
  locked_at: string | null;
45
+ completed_at: string | null;
54
46
  archived_at: string | null;
55
47
  sort_order: number;
56
48
  created_at: string;
@@ -74,27 +66,21 @@ export interface Task {
74
66
  parent_id: string | null;
75
67
  title: string;
76
68
  description: string | null;
69
+ notes: string | null;
77
70
  status: TaskStatus;
78
- assignee_id: string | null;
79
- estimated_days: number | null;
71
+ estimated_days: number;
80
72
  start_date: string | null;
81
73
  due_date: string | null;
82
74
  actual_start: string | null;
83
75
  actual_end: string | null;
84
76
  sort_order: number;
85
- dependencies: string | null;
86
- sop_id: string | null;
77
+ inserted: number;
87
78
  deleted_at: string | null;
88
- requirement_doc: string | null;
89
- design_doc: string | null;
90
- current_status: string | null;
91
79
  created_at: string;
92
80
  updated_at: string;
93
81
  }
94
82
  export interface TaskWithChildren extends Task {
95
83
  children: TaskWithChildren[];
96
- assignee?: User | null;
97
- sop?: SOP | null;
98
84
  }
99
85
  export interface TaskHistory {
100
86
  id: string;
@@ -107,37 +93,6 @@ export interface TaskHistory {
107
93
  changed_by: string | null;
108
94
  changed_at: string;
109
95
  }
110
- export interface TaskContext {
111
- id: string;
112
- title: string;
113
- status: TaskStatus;
114
- assignee: User | null;
115
- start_date: string | null;
116
- due_date: string | null;
117
- estimated_days: number | null;
118
- actual_start: string | null;
119
- actual_end: string | null;
120
- requirement_doc: string | null;
121
- design_doc: string | null;
122
- current_status: string | null;
123
- recent_history: TaskHistory[];
124
- children_summary: {
125
- total: number;
126
- done: number;
127
- in_progress: number;
128
- children: Array<{
129
- id: string;
130
- title: string;
131
- status: TaskStatus;
132
- }>;
133
- };
134
- }
135
- export type DocType = 'requirement' | 'design' | 'status';
136
- export interface UpdateTaskDocParams {
137
- doc_type: DocType;
138
- content: string;
139
- append?: boolean;
140
- }
141
96
  export interface Holiday {
142
97
  date: string;
143
98
  year: number;
@@ -156,7 +111,7 @@ export interface CreateTaskParams {
156
111
  parent_id?: string;
157
112
  title: string;
158
113
  description?: string;
159
- assignee_id?: string;
114
+ notes?: string;
160
115
  estimated_days?: number;
161
116
  start_date?: string;
162
117
  due_date?: string;
@@ -164,8 +119,8 @@ export interface CreateTaskParams {
164
119
  export interface UpdateTaskParams {
165
120
  title?: string;
166
121
  description?: string;
122
+ notes?: string;
167
123
  status?: TaskStatus;
168
- assignee_id?: string;
169
124
  estimated_days?: number;
170
125
  start_date?: string;
171
126
  due_date?: string;
@@ -177,7 +132,6 @@ export interface ListTasksParams {
177
132
  version_id?: string | null;
178
133
  parent_id?: string | null;
179
134
  status?: TaskStatus;
180
- assignee_id?: string;
181
135
  }
182
136
  export interface ProjectConfig {
183
137
  project_id?: string;
@@ -203,5 +157,8 @@ export interface SystemConfigMap {
203
157
  smtp_user: string;
204
158
  smtp_pass: string;
205
159
  smtp_from: string;
160
+ registration_enabled: string;
161
+ hcaptcha_site_key: string;
162
+ hcaptcha_secret_key: string;
206
163
  }
207
164
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAG1C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAG5D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,UAAU,GAAG,OAAO,CAAC;AAGzF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,IAAI;IAC5C,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CAClB;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,WAAW;IAE1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,cAAc,EAAE,WAAW,EAAE,CAAC;IAE9B,gBAAgB,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,KAAK,CAAC;YACd,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,UAAU,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;CACH;AAGD,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAG1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAG1C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;AAG5D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAG5E,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,IAAI;IAC5C,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAGD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;CAC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qq33357486/oh-my-task",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "description": "文档驱动的 AI 编程协作系统 - 通过 MCP 工具管理任务",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,15 +20,7 @@
20
20
  "build": "tsc",
21
21
  "start": "node dist/index.js",
22
22
  "mcp": "tsx src/mcp/server.ts",
23
- "db:init": "tsx src/db/init.ts",
24
- "db:clean": "tsx scripts/clean-db.ts",
25
- "db:migrate-auth": "tsx scripts/migrate-auth.ts",
26
- "test": "vitest run",
27
- "test:watch": "vitest",
28
- "test:coverage": "vitest run --coverage",
29
- "test:e2e": "playwright test",
30
- "test:e2e:ui": "playwright test --ui",
31
- "test:e2e:report": "playwright show-report"
23
+ "db:init": "tsx src/db/init.ts"
32
24
  },
33
25
  "keywords": [
34
26
  "task-management",
@@ -48,18 +40,17 @@
48
40
  "uuid": "^9.0.0"
49
41
  },
50
42
  "devDependencies": {
51
- "@playwright/test": "^1.40.0",
52
43
  "@types/bcrypt": "^6.0.0",
53
44
  "@types/better-sqlite3": "^7.6.8",
54
45
  "@types/cors": "^2.8.17",
55
46
  "@types/express": "^4.17.21",
56
47
  "@types/express-session": "^1.18.2",
57
48
  "@types/node": "^20.10.0",
58
- "@types/supertest": "^6.0.3",
49
+ "@types/supertest": "^7.2.0",
59
50
  "@types/uuid": "^9.0.7",
60
51
  "supertest": "^7.2.2",
61
52
  "tsx": "^4.7.0",
62
53
  "typescript": "^5.3.0",
63
- "vitest": "^3.2.4"
54
+ "vitest": "^4.1.4"
64
55
  }
65
56
  }
package/src/db/schema.sql CHANGED
@@ -1,44 +1,62 @@
1
- -- oh-my-task Database Schema
2
- -- SQLite
1
+ -- oh-my-task Database Schema (v2)
2
+ -- 从零重写:移除 SOP、assignee、阶段性文档等旧功能
3
+ -- 新增 user_activity、sessions、inserted/notes 等字段
3
4
 
5
+ -- ============================================
4
6
  -- 用户表
7
+ -- ============================================
5
8
  CREATE TABLE IF NOT EXISTS users (
6
9
  id TEXT PRIMARY KEY,
7
10
  name TEXT NOT NULL,
8
- email TEXT UNIQUE, -- 登录邮箱
9
- password_hash TEXT, -- 密码哈希(bcrypt)
10
- api_key TEXT UNIQUE, -- API Key(可选,兼容旧配置)
11
+ email TEXT NOT NULL UNIQUE,
12
+ password_hash TEXT NOT NULL,
11
13
  role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('admin', 'member')),
12
- is_first_login INTEGER NOT NULL DEFAULT 0 CHECK (is_first_login IN (0, 1)), -- 是否首次登录(需强制修改密码)
13
- reset_token TEXT, -- 密码重置令牌
14
- reset_token_expires DATETIME, -- 重置令牌过期时间
15
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
16
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
14
+ reset_token TEXT,
15
+ reset_token_expires DATETIME,
16
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
17
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
17
18
  );
18
19
 
19
- -- 用户 Token 表(用于 MCP 认证)
20
+ -- ============================================
21
+ -- 用户 Token 表(用于 MCP/API 认证)
22
+ -- ============================================
20
23
  CREATE TABLE IF NOT EXISTS user_tokens (
21
24
  id TEXT PRIMARY KEY,
22
25
  user_id TEXT NOT NULL,
23
- name TEXT NOT NULL, -- Token 名称,如 "VS Code", "Cursor"
24
- token TEXT NOT NULL UNIQUE, -- Token 值(omt_ 前缀)
25
- last_used_at DATETIME, -- 最后使用时间
26
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
26
+ name TEXT NOT NULL,
27
+ token TEXT NOT NULL UNIQUE,
28
+ last_used_at DATETIME,
29
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
27
30
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
28
31
  );
29
32
 
33
+ -- ============================================
34
+ -- 用户活动表(用于 DAU/留存统计)
35
+ -- ============================================
36
+ CREATE TABLE IF NOT EXISTS user_activity (
37
+ id TEXT PRIMARY KEY,
38
+ user_id TEXT NOT NULL,
39
+ action TEXT NOT NULL,
40
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
41
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
42
+ );
43
+
44
+ -- ============================================
30
45
  -- 项目表
46
+ -- ============================================
31
47
  CREATE TABLE IF NOT EXISTS projects (
32
48
  id TEXT PRIMARY KEY,
33
49
  name TEXT NOT NULL,
34
50
  description TEXT,
35
- owner_id TEXT, -- 项目所有者
36
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
37
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
38
- FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE SET NULL
51
+ owner_id TEXT NOT NULL,
52
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
53
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
54
+ FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE
39
55
  );
40
56
 
57
+ -- ============================================
41
58
  -- 版本表
59
+ -- ============================================
42
60
  CREATE TABLE IF NOT EXISTS versions (
43
61
  id TEXT PRIMARY KEY,
44
62
  project_id TEXT NOT NULL,
@@ -47,30 +65,17 @@ CREATE TABLE IF NOT EXISTS versions (
47
65
  start_date DATE,
48
66
  due_date DATE,
49
67
  locked_at DATETIME DEFAULT NULL,
50
- archived_at DATETIME DEFAULT NULL, -- 归档时间
51
- sort_order INTEGER DEFAULT 0,
52
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
53
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
54
- FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
55
- );
56
-
57
- -- SOP(技能/智能体)表
58
- CREATE TABLE IF NOT EXISTS sops (
59
- id TEXT PRIMARY KEY,
60
- project_id TEXT NOT NULL,
61
- name TEXT NOT NULL,
62
- description TEXT,
63
- rules TEXT DEFAULT '',
64
- workflow TEXT DEFAULT '',
65
- required TEXT DEFAULT '',
66
- forbidden TEXT DEFAULT '',
67
- experience TEXT DEFAULT '',
68
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
69
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
68
+ completed_at DATETIME DEFAULT NULL,
69
+ archived_at DATETIME DEFAULT NULL,
70
+ sort_order INTEGER NOT NULL DEFAULT 0,
71
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
72
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
70
73
  FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
71
74
  );
72
75
 
76
+ -- ============================================
73
77
  -- 任务表
78
+ -- ============================================
74
79
  CREATE TABLE IF NOT EXISTS tasks (
75
80
  id TEXT PRIMARY KEY,
76
81
  project_id TEXT NOT NULL,
@@ -78,46 +83,43 @@ CREATE TABLE IF NOT EXISTS tasks (
78
83
  parent_id TEXT,
79
84
  title TEXT NOT NULL,
80
85
  description TEXT,
86
+ notes TEXT,
81
87
  status TEXT NOT NULL DEFAULT 'planned' CHECK (status IN ('planned', 'in_progress', 'done')),
82
- assignee_id TEXT,
83
- estimated_days REAL DEFAULT 1,
88
+ estimated_days INTEGER DEFAULT 1,
84
89
  start_date DATE,
85
90
  due_date DATE,
86
91
  actual_start DATETIME,
87
92
  actual_end DATETIME,
88
- sort_order INTEGER DEFAULT 0,
89
- dependencies TEXT,
90
- sop_id TEXT, -- 关联的 SOP
91
- deleted_at DATETIME DEFAULT NULL, -- 软删除标记
92
- -- 阶段性文档字段(Markdown 格式)
93
- requirement_doc TEXT, -- 需求文档:这个任务要做什么
94
- design_doc TEXT, -- 设计文档:怎么做,技术方案
95
- current_status TEXT, -- 当前情况:做到哪了,遇到什么问题
96
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
97
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
93
+ sort_order INTEGER NOT NULL DEFAULT 0,
94
+ inserted INTEGER NOT NULL DEFAULT 0 CHECK (inserted IN (0, 1)),
95
+ deleted_at DATETIME DEFAULT NULL,
96
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
97
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
98
98
  FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
99
99
  FOREIGN KEY (version_id) REFERENCES versions(id) ON DELETE SET NULL,
100
- FOREIGN KEY (parent_id) REFERENCES tasks(id) ON DELETE CASCADE,
101
- FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL,
102
- FOREIGN KEY (sop_id) REFERENCES sops(id) ON DELETE SET NULL
100
+ FOREIGN KEY (parent_id) REFERENCES tasks(id) ON DELETE CASCADE
103
101
  );
104
102
 
103
+ -- ============================================
105
104
  -- 任务历史表
105
+ -- ============================================
106
106
  CREATE TABLE IF NOT EXISTS task_history (
107
107
  id TEXT PRIMARY KEY,
108
108
  task_id TEXT NOT NULL,
109
- action TEXT NOT NULL CHECK (action IN ('created', 'updated', 'status_changed', 'assigned', 'noted')),
109
+ action TEXT NOT NULL CHECK (action IN ('created', 'updated', 'status_changed', 'noted')),
110
110
  field TEXT,
111
111
  old_value TEXT,
112
112
  new_value TEXT,
113
113
  reason TEXT,
114
114
  changed_by TEXT,
115
- changed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
115
+ changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
116
116
  FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
117
117
  FOREIGN KEY (changed_by) REFERENCES users(id) ON DELETE SET NULL
118
118
  );
119
119
 
120
+ -- ============================================
120
121
  -- 节假日表
122
+ -- ============================================
121
123
  CREATE TABLE IF NOT EXISTS holidays (
122
124
  date DATE PRIMARY KEY,
123
125
  year INTEGER NOT NULL,
@@ -125,38 +127,79 @@ CREATE TABLE IF NOT EXISTS holidays (
125
127
  name TEXT
126
128
  );
127
129
 
130
+ -- ============================================
128
131
  -- 系统配置表
132
+ -- ============================================
129
133
  CREATE TABLE IF NOT EXISTS system_config (
130
134
  key TEXT PRIMARY KEY,
131
- value TEXT NOT NULL,
135
+ value TEXT NOT NULL DEFAULT '',
132
136
  description TEXT,
133
- updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
137
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
134
138
  );
135
139
 
140
+ -- ============================================
141
+ -- Sessions 表(express-session SQLite store)
142
+ -- better-sqlite3-session-store 需要 sid, sess, expire 列
143
+ -- ============================================
144
+ CREATE TABLE IF NOT EXISTS sessions (
145
+ sid TEXT NOT NULL PRIMARY KEY,
146
+ sess TEXT NOT NULL,
147
+ expire TEXT NOT NULL DEFAULT ''
148
+ );
149
+
150
+ -- 迁移:如果旧 sessions 表缺少 expire 列或有过时的 expired 列,进行修复
151
+ -- SQLite 不支持 DROP COLUMN,需要重建表
152
+ -- 注意:这里只在必要时执行,不影响已有 session 数据
153
+ -- better-sqlite3-session-store 会在构造时自动执行自己的 CREATE TABLE IF NOT EXISTS
154
+
155
+ -- ============================================
136
156
  -- 初始系统配置
157
+ -- ============================================
137
158
  INSERT OR IGNORE INTO system_config (key, value, description) VALUES
138
159
  ('server_url', 'http://localhost:3000', '服务器 URL'),
139
160
  ('smtp_host', '', 'SMTP 服务器地址'),
140
161
  ('smtp_port', '587', 'SMTP 端口'),
141
162
  ('smtp_user', '', 'SMTP 用户名'),
142
163
  ('smtp_pass', '', 'SMTP 密码'),
143
- ('smtp_from', '', '发件人邮箱');
164
+ ('smtp_from', '', '发件人邮箱'),
165
+ ('registration_enabled', '1', '是否开放注册'),
166
+ ('hcaptcha_site_key', '', 'hCaptcha Site Key'),
167
+ ('hcaptcha_secret_key', '', 'hCaptcha Secret Key');
144
168
 
169
+ -- ============================================
145
170
  -- 索引
171
+ -- ============================================
172
+
173
+ -- users 索引
174
+ CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
175
+ CREATE INDEX IF NOT EXISTS idx_users_reset_token ON users(reset_token);
176
+
177
+ -- user_tokens 索引
178
+ CREATE INDEX IF NOT EXISTS idx_user_tokens_user_id ON user_tokens(user_id);
179
+ CREATE INDEX IF NOT EXISTS idx_user_tokens_token ON user_tokens(token);
180
+
181
+ -- user_activity 索引
182
+ CREATE INDEX IF NOT EXISTS idx_user_activity_user_id ON user_activity(user_id);
183
+ CREATE INDEX IF NOT EXISTS idx_user_activity_action ON user_activity(action);
184
+ CREATE INDEX IF NOT EXISTS idx_user_activity_created_at ON user_activity(created_at);
185
+
186
+ -- projects 索引
187
+ CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id);
188
+
189
+ -- versions 索引
190
+ CREATE INDEX IF NOT EXISTS idx_versions_project_id ON versions(project_id);
191
+ CREATE INDEX IF NOT EXISTS idx_versions_locked_at ON versions(locked_at);
192
+ CREATE INDEX IF NOT EXISTS idx_versions_archived_at ON versions(archived_at);
193
+
194
+ -- tasks 索引
146
195
  CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id);
147
196
  CREATE INDEX IF NOT EXISTS idx_tasks_parent_id ON tasks(parent_id);
148
- CREATE INDEX IF NOT EXISTS idx_tasks_assignee_id ON tasks(assignee_id);
149
197
  CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
150
198
  CREATE INDEX IF NOT EXISTS idx_tasks_deleted_at ON tasks(deleted_at);
199
+ CREATE INDEX IF NOT EXISTS idx_tasks_version_id ON tasks(version_id);
200
+
201
+ -- task_history 索引
151
202
  CREATE INDEX IF NOT EXISTS idx_task_history_task_id ON task_history(task_id);
152
- CREATE INDEX IF NOT EXISTS idx_holidays_year ON holidays(year);
153
- CREATE INDEX IF NOT EXISTS idx_sops_project_id ON sops(project_id);
154
- CREATE INDEX IF NOT EXISTS idx_versions_archived_at ON versions(archived_at);
155
- CREATE INDEX IF NOT EXISTS idx_user_tokens_user_id ON user_tokens(user_id);
156
- CREATE INDEX IF NOT EXISTS idx_user_tokens_token ON user_tokens(token);
157
- CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id);
158
203
 
159
- -- 创建默认管理员用户
160
- -- 注意:email、password_hash、is_first_login 等字段由迁移脚本处理
161
- INSERT OR IGNORE INTO users (id, name, role)
162
- VALUES ('admin-001', 'admin', 'admin');
204
+ -- holidays 索引
205
+ CREATE INDEX IF NOT EXISTS idx_holidays_year ON holidays(year);
@@ -1 +0,0 @@
1
- {"version":3,"file":"sops.d.ts","sourceRoot":"","sources":["../../../src/api/routes/sops.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA6KxB,eAAe,MAAM,CAAC"}
@@ -1,155 +0,0 @@
1
- import { Router } from 'express';
2
- import * as sopService from '../../services/sop.service.js';
3
- import * as projectService from '../../services/project.service.js';
4
- const router = Router();
5
- // 获取项目的路径(从请求体、查询参数或请求头)
6
- function getProjectPath(req) {
7
- // 从请求体获取
8
- if (req.body.project_path) {
9
- return req.body.project_path;
10
- }
11
- // 从查询参数获取
12
- if (req.query.project_path) {
13
- return req.query.project_path;
14
- }
15
- // 从请求头获取
16
- if (req.headers['x-project-path']) {
17
- return req.headers['x-project-path'];
18
- }
19
- return null;
20
- }
21
- // GET /api/sops - 获取 SOP 列表
22
- router.get('/', (req, res) => {
23
- const projectId = req.query.project_id;
24
- const projectPath = getProjectPath(req);
25
- const userId = req.auth?.user?.id;
26
- const isAdmin = req.auth?.user?.role === 'admin';
27
- if (!projectId) {
28
- res.status(400).json({ success: false, error: 'project_id 不能为空' });
29
- return;
30
- }
31
- if (!projectPath) {
32
- res.status(400).json({ success: false, error: 'project_path 不能为空(可通过 body、query 或 x-project-path header)' });
33
- return;
34
- }
35
- // 验证项目归属
36
- if (!isAdmin) {
37
- const hasAccess = projectService.checkProjectOwnership(projectId, userId);
38
- if (!hasAccess) {
39
- res.status(404).json({ success: false, error: '项目不存在' });
40
- return;
41
- }
42
- }
43
- const sops = sopService.listSOPs(projectId, projectPath, isAdmin ? undefined : userId);
44
- res.json({ success: true, data: sops });
45
- });
46
- // GET /api/sops/:id - 获取 SOP 详情
47
- router.get('/:id', (req, res) => {
48
- const projectPath = getProjectPath(req);
49
- const userId = req.auth?.user?.id;
50
- const isAdmin = req.auth?.user?.role === 'admin';
51
- if (!projectPath) {
52
- res.status(400).json({ success: false, error: 'project_path 不能为空' });
53
- return;
54
- }
55
- const sop = sopService.getSOPById(req.params.id, projectPath, isAdmin ? undefined : userId);
56
- if (!sop) {
57
- res.status(404).json({ success: false, error: 'SOP 不存在' });
58
- return;
59
- }
60
- res.json({ success: true, data: sop });
61
- });
62
- // POST /api/sops - 创建 SOP
63
- router.post('/', (req, res) => {
64
- const { project_id, project_path, name, description, rules, workflow, required, forbidden, experience } = req.body;
65
- const userId = req.auth.user.id;
66
- const isAdmin = req.auth.user.role === 'admin';
67
- if (!project_id) {
68
- res.status(400).json({ success: false, error: 'project_id 不能为空' });
69
- return;
70
- }
71
- if (!project_path) {
72
- res.status(400).json({ success: false, error: 'project_path 不能为空' });
73
- return;
74
- }
75
- if (!name) {
76
- res.status(400).json({ success: false, error: 'name 不能为空' });
77
- return;
78
- }
79
- // 验证项目归属
80
- if (!isAdmin) {
81
- const hasAccess = projectService.checkProjectOwnership(project_id, userId);
82
- if (!hasAccess) {
83
- res.status(404).json({ success: false, error: '项目不存在' });
84
- return;
85
- }
86
- }
87
- const params = {
88
- project_id,
89
- project_path,
90
- name,
91
- description,
92
- rules,
93
- workflow,
94
- required,
95
- forbidden,
96
- experience,
97
- };
98
- const sop = sopService.createSOP(params);
99
- res.status(201).json({ success: true, data: sop });
100
- });
101
- // PUT /api/sops/:id - 更新 SOP
102
- router.put('/:id', (req, res) => {
103
- const { name, description, rules, workflow, required, forbidden, experience, append_experience, project_path } = req.body;
104
- const userId = req.auth.user.id;
105
- const isAdmin = req.auth.user.role === 'admin';
106
- if (!project_path) {
107
- res.status(400).json({ success: false, error: 'project_path 不能为空' });
108
- return;
109
- }
110
- const params = {
111
- name,
112
- description,
113
- rules,
114
- workflow,
115
- required,
116
- forbidden,
117
- experience,
118
- append_experience,
119
- };
120
- const sop = sopService.updateSOP(req.params.id, params, project_path);
121
- if (!sop) {
122
- res.status(404).json({ success: false, error: 'SOP 不存在' });
123
- return;
124
- }
125
- res.json({ success: true, data: sop });
126
- });
127
- // DELETE /api/sops/:id - 删除 SOP
128
- router.delete('/:id', (req, res) => {
129
- const projectPath = req.query.project_path || req.body.project_path;
130
- const userId = req.auth.user.id;
131
- const isAdmin = req.auth.user.role === 'admin';
132
- if (!projectPath) {
133
- res.status(400).json({ success: false, error: 'project_path 不能为空' });
134
- return;
135
- }
136
- // 验证归属
137
- const sop = sopService.getSOPById(req.params.id, projectPath, isAdmin ? undefined : userId);
138
- if (!sop) {
139
- res.status(404).json({ success: false, error: 'SOP 不存在' });
140
- return;
141
- }
142
- const success = sopService.deleteSOP(req.params.id, projectPath);
143
- if (!success) {
144
- res.status(404).json({ success: false, error: 'SOP 不存在' });
145
- return;
146
- }
147
- res.json({ success: true, message: 'SOP 已删除' });
148
- });
149
- // GET /api/sops/:id/usage - 获取 SOP 使用统计
150
- router.get('/:id/usage', (req, res) => {
151
- const count = sopService.getSOPUsageCount(req.params.id);
152
- res.json({ success: true, data: { usage_count: count } });
153
- });
154
- export default router;
155
- //# sourceMappingURL=sops.js.map