@kernhq/module-tracker 0.1.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.
Files changed (158) hide show
  1. package/LICENSE +662 -0
  2. package/README.md +265 -0
  3. package/dist/contract/events.d.ts +140 -0
  4. package/dist/contract/events.d.ts.map +1 -0
  5. package/dist/contract/events.js +51 -0
  6. package/dist/contract/events.js.map +1 -0
  7. package/dist/contract/index.d.ts +6 -0
  8. package/dist/contract/index.d.ts.map +1 -0
  9. package/dist/contract/index.js +6 -0
  10. package/dist/contract/index.js.map +1 -0
  11. package/dist/contract/models.d.ts +2547 -0
  12. package/dist/contract/models.d.ts.map +1 -0
  13. package/dist/contract/models.js +1214 -0
  14. package/dist/contract/models.js.map +1 -0
  15. package/dist/contract/notifications.d.ts +4 -0
  16. package/dist/contract/notifications.d.ts.map +1 -0
  17. package/dist/contract/notifications.js +46 -0
  18. package/dist/contract/notifications.js.map +1 -0
  19. package/dist/contract/permissions.d.ts +161 -0
  20. package/dist/contract/permissions.d.ts.map +1 -0
  21. package/dist/contract/permissions.js +192 -0
  22. package/dist/contract/permissions.js.map +1 -0
  23. package/dist/contract/router.d.ts +9659 -0
  24. package/dist/contract/router.d.ts.map +1 -0
  25. package/dist/contract/router.js +732 -0
  26. package/dist/contract/router.js.map +1 -0
  27. package/dist/kql/ast.d.ts +90 -0
  28. package/dist/kql/ast.d.ts.map +1 -0
  29. package/dist/kql/ast.js +80 -0
  30. package/dist/kql/ast.js.map +1 -0
  31. package/dist/kql/dates.d.ts +16 -0
  32. package/dist/kql/dates.d.ts.map +1 -0
  33. package/dist/kql/dates.js +54 -0
  34. package/dist/kql/dates.js.map +1 -0
  35. package/dist/kql/fields.d.ts +61 -0
  36. package/dist/kql/fields.d.ts.map +1 -0
  37. package/dist/kql/fields.js +106 -0
  38. package/dist/kql/fields.js.map +1 -0
  39. package/dist/kql/index.d.ts +16 -0
  40. package/dist/kql/index.d.ts.map +1 -0
  41. package/dist/kql/index.js +16 -0
  42. package/dist/kql/index.js.map +1 -0
  43. package/dist/kql/lexer.d.ts +28 -0
  44. package/dist/kql/lexer.d.ts.map +1 -0
  45. package/dist/kql/lexer.js +127 -0
  46. package/dist/kql/lexer.js.map +1 -0
  47. package/dist/kql/parser.d.ts +14 -0
  48. package/dist/kql/parser.d.ts.map +1 -0
  49. package/dist/kql/parser.js +290 -0
  50. package/dist/kql/parser.js.map +1 -0
  51. package/dist/kql/suggest.d.ts +8 -0
  52. package/dist/kql/suggest.d.ts.map +1 -0
  53. package/dist/kql/suggest.js +96 -0
  54. package/dist/kql/suggest.js.map +1 -0
  55. package/dist/kql/validate.d.ts +10 -0
  56. package/dist/kql/validate.d.ts.map +1 -0
  57. package/dist/kql/validate.js +84 -0
  58. package/dist/kql/validate.js.map +1 -0
  59. package/dist/server/index.d.ts +17 -0
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +583 -0
  62. package/dist/server/index.js.map +1 -0
  63. package/dist/server/kql/compile.d.ts +49 -0
  64. package/dist/server/kql/compile.d.ts.map +1 -0
  65. package/dist/server/kql/compile.js +372 -0
  66. package/dist/server/kql/compile.js.map +1 -0
  67. package/dist/server/rank.d.ts +23 -0
  68. package/dist/server/rank.d.ts.map +1 -0
  69. package/dist/server/rank.js +66 -0
  70. package/dist/server/rank.js.map +1 -0
  71. package/dist/server/rich.d.ts +30 -0
  72. package/dist/server/rich.d.ts.map +1 -0
  73. package/dist/server/rich.js +97 -0
  74. package/dist/server/rich.js.map +1 -0
  75. package/dist/server/router.d.ts +10589 -0
  76. package/dist/server/router.d.ts.map +1 -0
  77. package/dist/server/router.js +431 -0
  78. package/dist/server/router.js.map +1 -0
  79. package/dist/server/schema.d.ts +6622 -0
  80. package/dist/server/schema.d.ts.map +1 -0
  81. package/dist/server/schema.js +581 -0
  82. package/dist/server/schema.js.map +1 -0
  83. package/dist/server/services/access.d.ts +53 -0
  84. package/dist/server/services/access.d.ts.map +1 -0
  85. package/dist/server/services/access.js +146 -0
  86. package/dist/server/services/access.js.map +1 -0
  87. package/dist/server/services/comments.d.ts +36 -0
  88. package/dist/server/services/comments.d.ts.map +1 -0
  89. package/dist/server/services/comments.js +231 -0
  90. package/dist/server/services/comments.js.map +1 -0
  91. package/dist/server/services/config.d.ts +130 -0
  92. package/dist/server/services/config.d.ts.map +1 -0
  93. package/dist/server/services/config.js +797 -0
  94. package/dist/server/services/config.js.map +1 -0
  95. package/dist/server/services/db.d.ts +93 -0
  96. package/dist/server/services/db.d.ts.map +1 -0
  97. package/dist/server/services/db.js +519 -0
  98. package/dist/server/services/db.js.map +1 -0
  99. package/dist/server/services/imports.d.ts +37 -0
  100. package/dist/server/services/imports.d.ts.map +1 -0
  101. package/dist/server/services/imports.js +324 -0
  102. package/dist/server/services/imports.js.map +1 -0
  103. package/dist/server/services/index.d.ts +36 -0
  104. package/dist/server/services/index.d.ts.map +1 -0
  105. package/dist/server/services/index.js +57 -0
  106. package/dist/server/services/index.js.map +1 -0
  107. package/dist/server/services/intake.d.ts +47 -0
  108. package/dist/server/services/intake.d.ts.map +1 -0
  109. package/dist/server/services/intake.js +268 -0
  110. package/dist/server/services/intake.js.map +1 -0
  111. package/dist/server/services/issues.d.ts +763 -0
  112. package/dist/server/services/issues.d.ts.map +1 -0
  113. package/dist/server/services/issues.js +1381 -0
  114. package/dist/server/services/issues.js.map +1 -0
  115. package/dist/server/services/notify.d.ts +51 -0
  116. package/dist/server/services/notify.d.ts.map +1 -0
  117. package/dist/server/services/notify.js +90 -0
  118. package/dist/server/services/notify.js.map +1 -0
  119. package/dist/server/services/planning.d.ts +62 -0
  120. package/dist/server/services/planning.d.ts.map +1 -0
  121. package/dist/server/services/planning.js +614 -0
  122. package/dist/server/services/planning.js.map +1 -0
  123. package/dist/server/services/projects.d.ts +43 -0
  124. package/dist/server/services/projects.d.ts.map +1 -0
  125. package/dist/server/services/projects.js +375 -0
  126. package/dist/server/services/projects.js.map +1 -0
  127. package/dist/server/services/query.d.ts +24 -0
  128. package/dist/server/services/query.d.ts.map +1 -0
  129. package/dist/server/services/query.js +312 -0
  130. package/dist/server/services/query.js.map +1 -0
  131. package/dist/server/services/reports.d.ts +30 -0
  132. package/dist/server/services/reports.d.ts.map +1 -0
  133. package/dist/server/services/reports.js +295 -0
  134. package/dist/server/services/reports.js.map +1 -0
  135. package/dist/server/services/time.d.ts +53 -0
  136. package/dist/server/services/time.d.ts.map +1 -0
  137. package/dist/server/services/time.js +192 -0
  138. package/dist/server/services/time.js.map +1 -0
  139. package/dist/server/services/transitions.d.ts +61 -0
  140. package/dist/server/services/transitions.d.ts.map +1 -0
  141. package/dist/server/services/transitions.js +493 -0
  142. package/dist/server/services/transitions.js.map +1 -0
  143. package/dist/server/services/views.d.ts +33 -0
  144. package/dist/server/services/views.d.ts.map +1 -0
  145. package/dist/server/services/views.js +195 -0
  146. package/dist/server/services/views.js.map +1 -0
  147. package/migrations/0000_init.sql +529 -0
  148. package/migrations/0001_rls.sql +259 -0
  149. package/migrations/meta/0000_snapshot.json +4140 -0
  150. package/migrations/meta/_journal.json +20 -0
  151. package/package.json +82 -0
  152. package/src/client/api.ts +15 -0
  153. package/src/client/format.ts +164 -0
  154. package/src/client/group.ts +150 -0
  155. package/src/client/index.ts +60 -0
  156. package/src/client/kql.ts +492 -0
  157. package/src/client/rank.ts +87 -0
  158. package/src/client/types.ts +57 -0
@@ -0,0 +1,529 @@
1
+ CREATE SCHEMA IF NOT EXISTS "mod_tracker";
2
+ --> statement-breakpoint
3
+ CREATE TABLE "mod_tracker"."attachments" (
4
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
5
+ "workspace_id" uuid NOT NULL,
6
+ "issue_id" uuid NOT NULL,
7
+ "file_id" uuid NOT NULL,
8
+ "name" text NOT NULL,
9
+ "mime_type" text DEFAULT 'application/octet-stream' NOT NULL,
10
+ "size" integer DEFAULT 0 NOT NULL,
11
+ "uploaded_by" uuid,
12
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
13
+ );
14
+ --> statement-breakpoint
15
+ CREATE TABLE "mod_tracker"."comment_reactions" (
16
+ "comment_id" uuid NOT NULL,
17
+ "workspace_id" uuid NOT NULL,
18
+ "user_id" uuid NOT NULL,
19
+ "emoji" text NOT NULL,
20
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
21
+ CONSTRAINT "comment_reactions_comment_id_user_id_emoji_pk" PRIMARY KEY("comment_id","user_id","emoji")
22
+ );
23
+ --> statement-breakpoint
24
+ CREATE TABLE "mod_tracker"."comments" (
25
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
26
+ "workspace_id" uuid NOT NULL,
27
+ "issue_id" uuid NOT NULL,
28
+ "parent_id" uuid,
29
+ "author_id" uuid,
30
+ "body" jsonb DEFAULT '{}'::jsonb NOT NULL,
31
+ "body_text" text DEFAULT '' NOT NULL,
32
+ "mention_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
33
+ "internal" boolean DEFAULT false NOT NULL,
34
+ "source" text DEFAULT 'app' NOT NULL,
35
+ "reply_count" integer DEFAULT 0 NOT NULL,
36
+ "edited_at" timestamp with time zone,
37
+ "deleted_at" timestamp with time zone,
38
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
39
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
40
+ "search" "tsvector" GENERATED ALWAYS AS (to_tsvector('simple', coalesce(body_text, ''))) STORED
41
+ );
42
+ --> statement-breakpoint
43
+ CREATE TABLE "mod_tracker"."components" (
44
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
45
+ "workspace_id" uuid NOT NULL,
46
+ "project_id" uuid NOT NULL,
47
+ "name" text NOT NULL,
48
+ "description" text,
49
+ "lead_id" uuid,
50
+ "default_assignee" text DEFAULT 'project' NOT NULL,
51
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
52
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
53
+ );
54
+ --> statement-breakpoint
55
+ CREATE TABLE "mod_tracker"."cycles" (
56
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
57
+ "workspace_id" uuid NOT NULL,
58
+ "project_id" uuid NOT NULL,
59
+ "number" integer NOT NULL,
60
+ "name" text NOT NULL,
61
+ "goal" text,
62
+ "start_at" timestamp with time zone NOT NULL,
63
+ "end_at" timestamp with time zone NOT NULL,
64
+ "status" text DEFAULT 'upcoming' NOT NULL,
65
+ "started_at" timestamp with time zone,
66
+ "completed_at" timestamp with time zone,
67
+ "carry_over_count" integer DEFAULT 0 NOT NULL,
68
+ "committed" jsonb DEFAULT '{}'::jsonb NOT NULL,
69
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
70
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
71
+ );
72
+ --> statement-breakpoint
73
+ CREATE TABLE "mod_tracker"."field_defs" (
74
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
75
+ "workspace_id" uuid NOT NULL,
76
+ "project_id" uuid,
77
+ "key" text NOT NULL,
78
+ "name" text NOT NULL,
79
+ "description" text,
80
+ "type" text NOT NULL,
81
+ "options" jsonb DEFAULT '[]'::jsonb NOT NULL,
82
+ "default_value" jsonb,
83
+ "config" jsonb DEFAULT '{}'::jsonb NOT NULL,
84
+ "searchable" boolean DEFAULT false NOT NULL,
85
+ "required" boolean DEFAULT false NOT NULL,
86
+ "show_in_cards" boolean DEFAULT false NOT NULL,
87
+ "order" integer DEFAULT 0 NOT NULL,
88
+ "archived_at" timestamp with time zone,
89
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
90
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
91
+ );
92
+ --> statement-breakpoint
93
+ CREATE TABLE "mod_tracker"."field_schemes" (
94
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
95
+ "workspace_id" uuid NOT NULL,
96
+ "name" text NOT NULL,
97
+ "field_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
98
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
99
+ );
100
+ --> statement-breakpoint
101
+ CREATE TABLE "mod_tracker"."hierarchy_rules" (
102
+ "workspace_id" uuid PRIMARY KEY NOT NULL,
103
+ "rules" jsonb DEFAULT '{}'::jsonb NOT NULL,
104
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
105
+ );
106
+ --> statement-breakpoint
107
+ CREATE TABLE "mod_tracker"."import_jobs" (
108
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
109
+ "workspace_id" uuid NOT NULL,
110
+ "project_id" uuid NOT NULL,
111
+ "source" text NOT NULL,
112
+ "file_id" uuid NOT NULL,
113
+ "mapping" jsonb DEFAULT '{}'::jsonb NOT NULL,
114
+ "status" text DEFAULT 'pending' NOT NULL,
115
+ "progress" jsonb DEFAULT '{}'::jsonb NOT NULL,
116
+ "errors" jsonb DEFAULT '[]'::jsonb NOT NULL,
117
+ "created_by" uuid,
118
+ "started_at" timestamp with time zone,
119
+ "finished_at" timestamp with time zone,
120
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
121
+ );
122
+ --> statement-breakpoint
123
+ CREATE TABLE "mod_tracker"."intake_tokens" (
124
+ "token" text PRIMARY KEY NOT NULL,
125
+ "workspace_id" uuid NOT NULL,
126
+ "project_id" uuid NOT NULL,
127
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
128
+ );
129
+ --> statement-breakpoint
130
+ CREATE TABLE "mod_tracker"."issue_approvals" (
131
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
132
+ "workspace_id" uuid NOT NULL,
133
+ "issue_id" uuid NOT NULL,
134
+ "transition_id" text NOT NULL,
135
+ "state" jsonb DEFAULT '{}'::jsonb NOT NULL,
136
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
137
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
138
+ );
139
+ --> statement-breakpoint
140
+ CREATE TABLE "mod_tracker"."issue_counters" (
141
+ "project_id" uuid PRIMARY KEY NOT NULL,
142
+ "workspace_id" uuid NOT NULL,
143
+ "last_issue_number" integer DEFAULT 0 NOT NULL,
144
+ "last_cycle_number" integer DEFAULT 0 NOT NULL
145
+ );
146
+ --> statement-breakpoint
147
+ CREATE TABLE "mod_tracker"."issue_history" (
148
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
149
+ "workspace_id" uuid NOT NULL,
150
+ "issue_id" uuid NOT NULL,
151
+ "actor_id" uuid,
152
+ "action" text NOT NULL,
153
+ "changes" jsonb DEFAULT '[]'::jsonb NOT NULL,
154
+ "data" jsonb DEFAULT '{}'::jsonb NOT NULL,
155
+ "occurred_at" timestamp with time zone DEFAULT now() NOT NULL
156
+ );
157
+ --> statement-breakpoint
158
+ CREATE TABLE "mod_tracker"."issue_status_history" (
159
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
160
+ "workspace_id" uuid NOT NULL,
161
+ "issue_id" uuid NOT NULL,
162
+ "project_id" uuid NOT NULL,
163
+ "from_status_id" text,
164
+ "to_status_id" text NOT NULL,
165
+ "from_category" text,
166
+ "to_category" text NOT NULL,
167
+ "actor_id" uuid,
168
+ "transition_id" text,
169
+ "duration_sec" integer,
170
+ "occurred_at" timestamp with time zone DEFAULT now() NOT NULL
171
+ );
172
+ --> statement-breakpoint
173
+ CREATE TABLE "mod_tracker"."issue_templates" (
174
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
175
+ "workspace_id" uuid NOT NULL,
176
+ "project_id" uuid,
177
+ "name" text NOT NULL,
178
+ "description" text,
179
+ "type_id" uuid,
180
+ "defaults" jsonb DEFAULT '{}'::jsonb NOT NULL,
181
+ "sub_items" jsonb DEFAULT '[]'::jsonb NOT NULL,
182
+ "created_by" uuid,
183
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
184
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
185
+ );
186
+ --> statement-breakpoint
187
+ CREATE TABLE "mod_tracker"."issues" (
188
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
189
+ "workspace_id" uuid NOT NULL,
190
+ "project_id" uuid NOT NULL,
191
+ "key" text NOT NULL,
192
+ "number" integer NOT NULL,
193
+ "type_id" uuid NOT NULL,
194
+ "title" text NOT NULL,
195
+ "description" jsonb,
196
+ "description_text" text DEFAULT '' NOT NULL,
197
+ "status_id" text NOT NULL,
198
+ "status_category" text NOT NULL,
199
+ "priority" text DEFAULT 'none' NOT NULL,
200
+ "assignee_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
201
+ "reporter_id" uuid,
202
+ "creator_id" uuid,
203
+ "label_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
204
+ "component_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
205
+ "version_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
206
+ "affects_version_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
207
+ "cycle_id" uuid,
208
+ "milestone_id" uuid,
209
+ "parent_id" uuid,
210
+ "rank" text NOT NULL,
211
+ "estimate" double precision,
212
+ "estimate_unit" text DEFAULT 'points' NOT NULL,
213
+ "start_date" date,
214
+ "due_date" date,
215
+ "completed_at" timestamp with time zone,
216
+ "cancelled_at" timestamp with time zone,
217
+ "resolution" text,
218
+ "custom" jsonb DEFAULT '{}'::jsonb NOT NULL,
219
+ "watcher_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
220
+ "comment_count" integer DEFAULT 0 NOT NULL,
221
+ "attachment_count" integer DEFAULT 0 NOT NULL,
222
+ "time_spent_sec" integer DEFAULT 0 NOT NULL,
223
+ "remaining_sec" integer,
224
+ "original_estimate_sec" integer,
225
+ "sla" jsonb,
226
+ "triage" boolean DEFAULT false NOT NULL,
227
+ "snoozed_until" timestamp with time zone,
228
+ "source" text DEFAULT 'app' NOT NULL,
229
+ "external_ref" text,
230
+ "chat_channel_id" uuid,
231
+ "archived_at" timestamp with time zone,
232
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
233
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
234
+ "last_activity_at" timestamp with time zone DEFAULT now() NOT NULL,
235
+ "search" "tsvector" GENERATED ALWAYS AS (to_tsvector('simple', coalesce(title, '') || ' ' || coalesce(description_text, ''))) STORED
236
+ );
237
+ --> statement-breakpoint
238
+ CREATE TABLE "mod_tracker"."labels" (
239
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
240
+ "workspace_id" uuid NOT NULL,
241
+ "project_id" uuid,
242
+ "name" text NOT NULL,
243
+ "color" text,
244
+ "description" text,
245
+ "group_name" text,
246
+ "archived_at" timestamp with time zone,
247
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
248
+ );
249
+ --> statement-breakpoint
250
+ CREATE TABLE "mod_tracker"."links" (
251
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
252
+ "workspace_id" uuid NOT NULL,
253
+ "issue_id" uuid NOT NULL,
254
+ "url" text NOT NULL,
255
+ "title" text,
256
+ "kind" text DEFAULT 'generic' NOT NULL,
257
+ "created_by" uuid,
258
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
259
+ );
260
+ --> statement-breakpoint
261
+ CREATE TABLE "mod_tracker"."milestones" (
262
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
263
+ "workspace_id" uuid NOT NULL,
264
+ "project_id" uuid NOT NULL,
265
+ "name" text NOT NULL,
266
+ "description" text,
267
+ "target_date" date,
268
+ "status" text DEFAULT 'open' NOT NULL,
269
+ "completed_at" timestamp with time zone,
270
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
271
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
272
+ );
273
+ --> statement-breakpoint
274
+ CREATE TABLE "mod_tracker"."project_members" (
275
+ "project_id" uuid NOT NULL,
276
+ "workspace_id" uuid NOT NULL,
277
+ "user_id" uuid NOT NULL,
278
+ "role" text DEFAULT 'member' NOT NULL,
279
+ "added_by" uuid,
280
+ "added_at" timestamp with time zone DEFAULT now() NOT NULL,
281
+ CONSTRAINT "project_members_project_id_user_id_pk" PRIMARY KEY("project_id","user_id")
282
+ );
283
+ --> statement-breakpoint
284
+ CREATE TABLE "mod_tracker"."project_templates" (
285
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
286
+ "workspace_id" uuid NOT NULL,
287
+ "key" text NOT NULL,
288
+ "name" text NOT NULL,
289
+ "description" text,
290
+ "icon" text,
291
+ "body" jsonb DEFAULT '{}'::jsonb NOT NULL,
292
+ "builtin" boolean DEFAULT false NOT NULL,
293
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
294
+ );
295
+ --> statement-breakpoint
296
+ CREATE TABLE "mod_tracker"."projects" (
297
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
298
+ "workspace_id" uuid NOT NULL,
299
+ "key" text NOT NULL,
300
+ "name" text NOT NULL,
301
+ "description" text,
302
+ "icon" text,
303
+ "color" text,
304
+ "lead_id" uuid,
305
+ "visibility" text DEFAULT 'workspace' NOT NULL,
306
+ "default_assignee" text DEFAULT 'unassigned' NOT NULL,
307
+ "workflow_scheme_id" uuid,
308
+ "type_scheme_id" uuid,
309
+ "field_scheme_id" uuid,
310
+ "settings" jsonb DEFAULT '{}'::jsonb NOT NULL,
311
+ "intake_token" text,
312
+ "member_count" integer DEFAULT 0 NOT NULL,
313
+ "archived_at" timestamp with time zone,
314
+ "created_by" uuid,
315
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
316
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
317
+ );
318
+ --> statement-breakpoint
319
+ CREATE TABLE "mod_tracker"."recurring_issues" (
320
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
321
+ "workspace_id" uuid NOT NULL,
322
+ "project_id" uuid NOT NULL,
323
+ "name" text NOT NULL,
324
+ "rule" jsonb DEFAULT '{}'::jsonb NOT NULL,
325
+ "defaults" jsonb DEFAULT '{}'::jsonb NOT NULL,
326
+ "enabled" boolean DEFAULT true NOT NULL,
327
+ "next_run_at" timestamp with time zone,
328
+ "last_run_at" timestamp with time zone,
329
+ "last_issue_id" uuid,
330
+ "run_count" integer DEFAULT 0 NOT NULL,
331
+ "created_by" uuid,
332
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
333
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
334
+ );
335
+ --> statement-breakpoint
336
+ CREATE TABLE "mod_tracker"."relations" (
337
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
338
+ "workspace_id" uuid NOT NULL,
339
+ "type" text NOT NULL,
340
+ "from_issue_id" uuid NOT NULL,
341
+ "to_issue_id" uuid NOT NULL,
342
+ "created_by" uuid,
343
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
344
+ );
345
+ --> statement-breakpoint
346
+ CREATE TABLE "mod_tracker"."timers" (
347
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
348
+ "workspace_id" uuid NOT NULL,
349
+ "issue_id" uuid NOT NULL,
350
+ "user_id" uuid NOT NULL,
351
+ "started_at" timestamp with time zone DEFAULT now() NOT NULL,
352
+ "note" text
353
+ );
354
+ --> statement-breakpoint
355
+ CREATE TABLE "mod_tracker"."type_schemes" (
356
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
357
+ "workspace_id" uuid NOT NULL,
358
+ "name" text NOT NULL,
359
+ "type_ids" uuid[] DEFAULT '{}'::uuid[] NOT NULL,
360
+ "default_type_id" uuid,
361
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
362
+ );
363
+ --> statement-breakpoint
364
+ CREATE TABLE "mod_tracker"."versions" (
365
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
366
+ "workspace_id" uuid NOT NULL,
367
+ "project_id" uuid NOT NULL,
368
+ "name" text NOT NULL,
369
+ "description" text,
370
+ "status" text DEFAULT 'unreleased' NOT NULL,
371
+ "start_date" date,
372
+ "release_date" date,
373
+ "released_at" timestamp with time zone,
374
+ "order" integer DEFAULT 0 NOT NULL,
375
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
376
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
377
+ );
378
+ --> statement-breakpoint
379
+ CREATE TABLE "mod_tracker"."view_pins" (
380
+ "view_id" uuid NOT NULL,
381
+ "workspace_id" uuid NOT NULL,
382
+ "user_id" uuid NOT NULL,
383
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
384
+ CONSTRAINT "view_pins_view_id_user_id_pk" PRIMARY KEY("view_id","user_id")
385
+ );
386
+ --> statement-breakpoint
387
+ CREATE TABLE "mod_tracker"."views" (
388
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
389
+ "workspace_id" uuid NOT NULL,
390
+ "project_id" uuid,
391
+ "name" text NOT NULL,
392
+ "description" text,
393
+ "icon" text,
394
+ "kql" text DEFAULT '' NOT NULL,
395
+ "layout" text DEFAULT 'list' NOT NULL,
396
+ "display" jsonb DEFAULT '{}'::jsonb NOT NULL,
397
+ "filters" jsonb DEFAULT '{}'::jsonb NOT NULL,
398
+ "visibility" text DEFAULT 'private' NOT NULL,
399
+ "owner_id" uuid,
400
+ "builtin" boolean DEFAULT false NOT NULL,
401
+ "order" integer DEFAULT 0 NOT NULL,
402
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
403
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
404
+ );
405
+ --> statement-breakpoint
406
+ CREATE TABLE "mod_tracker"."work_item_types" (
407
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
408
+ "workspace_id" uuid NOT NULL,
409
+ "project_id" uuid,
410
+ "key" text NOT NULL,
411
+ "name" text NOT NULL,
412
+ "description" text,
413
+ "icon" text,
414
+ "color" text,
415
+ "level" integer DEFAULT 0 NOT NULL,
416
+ "is_default" boolean DEFAULT false NOT NULL,
417
+ "workflow_id" uuid,
418
+ "field_layout" jsonb DEFAULT '[]'::jsonb NOT NULL,
419
+ "template_body" jsonb,
420
+ "order" integer DEFAULT 0 NOT NULL,
421
+ "archived_at" timestamp with time zone,
422
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
423
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
424
+ );
425
+ --> statement-breakpoint
426
+ CREATE TABLE "mod_tracker"."workflow_schemes" (
427
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
428
+ "workspace_id" uuid NOT NULL,
429
+ "name" text NOT NULL,
430
+ "default_workflow_id" uuid NOT NULL,
431
+ "mappings" jsonb DEFAULT '[]'::jsonb NOT NULL,
432
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
433
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
434
+ );
435
+ --> statement-breakpoint
436
+ CREATE TABLE "mod_tracker"."workflows" (
437
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
438
+ "workspace_id" uuid NOT NULL,
439
+ "project_id" uuid,
440
+ "name" text NOT NULL,
441
+ "description" text,
442
+ "definition" jsonb DEFAULT '{}'::jsonb NOT NULL,
443
+ "is_default" boolean DEFAULT false NOT NULL,
444
+ "archived_at" timestamp with time zone,
445
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
446
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
447
+ );
448
+ --> statement-breakpoint
449
+ CREATE TABLE "mod_tracker"."worklogs" (
450
+ "id" uuid PRIMARY KEY DEFAULT uuidv7() NOT NULL,
451
+ "workspace_id" uuid NOT NULL,
452
+ "project_id" uuid NOT NULL,
453
+ "issue_id" uuid NOT NULL,
454
+ "user_id" uuid NOT NULL,
455
+ "started_at" timestamp with time zone DEFAULT now() NOT NULL,
456
+ "duration_sec" integer NOT NULL,
457
+ "note" text,
458
+ "billable" boolean DEFAULT false NOT NULL,
459
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
460
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
461
+ );
462
+ --> statement-breakpoint
463
+ CREATE TABLE "mod_tracker"."workspaces" (
464
+ "workspace_id" uuid PRIMARY KEY NOT NULL,
465
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
466
+ );
467
+ --> statement-breakpoint
468
+ CREATE UNIQUE INDEX "attachments_issue_file_uq" ON "mod_tracker"."attachments" USING btree ("issue_id","file_id");--> statement-breakpoint
469
+ CREATE INDEX "attachments_issue_idx" ON "mod_tracker"."attachments" USING btree ("issue_id","created_at");--> statement-breakpoint
470
+ CREATE INDEX "comments_issue_idx" ON "mod_tracker"."comments" USING btree ("issue_id","created_at");--> statement-breakpoint
471
+ CREATE INDEX "comments_thread_idx" ON "mod_tracker"."comments" USING btree ("parent_id","created_at") WHERE parent_id is not null;--> statement-breakpoint
472
+ CREATE INDEX "comments_search_idx" ON "mod_tracker"."comments" USING gin ("search");--> statement-breakpoint
473
+ CREATE UNIQUE INDEX "components_project_name_uq" ON "mod_tracker"."components" USING btree ("project_id","name");--> statement-breakpoint
474
+ CREATE UNIQUE INDEX "cycles_project_number_uq" ON "mod_tracker"."cycles" USING btree ("project_id","number");--> statement-breakpoint
475
+ CREATE INDEX "cycles_project_status_idx" ON "mod_tracker"."cycles" USING btree ("project_id","status","start_at");--> statement-breakpoint
476
+ CREATE UNIQUE INDEX "field_defs_ws_project_key_uq" ON "mod_tracker"."field_defs" USING btree ("workspace_id","project_id","key") WHERE project_id is not null;--> statement-breakpoint
477
+ CREATE UNIQUE INDEX "field_defs_ws_key_uq" ON "mod_tracker"."field_defs" USING btree ("workspace_id","key") WHERE project_id is null;--> statement-breakpoint
478
+ CREATE INDEX "field_defs_ws_idx" ON "mod_tracker"."field_defs" USING btree ("workspace_id","project_id","order");--> statement-breakpoint
479
+ CREATE INDEX "field_schemes_ws_idx" ON "mod_tracker"."field_schemes" USING btree ("workspace_id","created_at");--> statement-breakpoint
480
+ CREATE INDEX "import_jobs_project_idx" ON "mod_tracker"."import_jobs" USING btree ("project_id","created_at");--> statement-breakpoint
481
+ CREATE UNIQUE INDEX "issue_approvals_issue_transition_uq" ON "mod_tracker"."issue_approvals" USING btree ("issue_id","transition_id");--> statement-breakpoint
482
+ CREATE INDEX "issue_history_issue_idx" ON "mod_tracker"."issue_history" USING btree ("issue_id","occurred_at");--> statement-breakpoint
483
+ CREATE INDEX "issue_status_history_issue_idx" ON "mod_tracker"."issue_status_history" USING btree ("issue_id","occurred_at");--> statement-breakpoint
484
+ CREATE INDEX "issue_status_history_project_idx" ON "mod_tracker"."issue_status_history" USING btree ("project_id","occurred_at");--> statement-breakpoint
485
+ CREATE INDEX "issue_templates_ws_idx" ON "mod_tracker"."issue_templates" USING btree ("workspace_id","project_id");--> statement-breakpoint
486
+ CREATE UNIQUE INDEX "issues_ws_key_uq" ON "mod_tracker"."issues" USING btree ("workspace_id","key");--> statement-breakpoint
487
+ CREATE UNIQUE INDEX "issues_project_number_uq" ON "mod_tracker"."issues" USING btree ("project_id","number");--> statement-breakpoint
488
+ CREATE INDEX "issues_ws_project_rank_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","project_id","rank");--> statement-breakpoint
489
+ CREATE INDEX "issues_ws_project_status_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","project_id","status_id");--> statement-breakpoint
490
+ CREATE INDEX "issues_ws_updated_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","updated_at");--> statement-breakpoint
491
+ CREATE INDEX "issues_ws_cycle_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","cycle_id") WHERE cycle_id is not null;--> statement-breakpoint
492
+ CREATE INDEX "issues_ws_parent_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","parent_id") WHERE parent_id is not null;--> statement-breakpoint
493
+ CREATE INDEX "issues_ws_due_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","due_date") WHERE due_date is not null;--> statement-breakpoint
494
+ CREATE INDEX "issues_ws_triage_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","project_id") WHERE triage;--> statement-breakpoint
495
+ CREATE INDEX "issues_external_ref_idx" ON "mod_tracker"."issues" USING btree ("workspace_id","external_ref") WHERE external_ref is not null;--> statement-breakpoint
496
+ CREATE INDEX "issues_assignees_idx" ON "mod_tracker"."issues" USING gin ("assignee_ids");--> statement-breakpoint
497
+ CREATE INDEX "issues_labels_idx" ON "mod_tracker"."issues" USING gin ("label_ids");--> statement-breakpoint
498
+ CREATE INDEX "issues_components_idx" ON "mod_tracker"."issues" USING gin ("component_ids");--> statement-breakpoint
499
+ CREATE INDEX "issues_versions_idx" ON "mod_tracker"."issues" USING gin ("version_ids");--> statement-breakpoint
500
+ CREATE INDEX "issues_watchers_idx" ON "mod_tracker"."issues" USING gin ("watcher_ids");--> statement-breakpoint
501
+ CREATE INDEX "issues_custom_idx" ON "mod_tracker"."issues" USING gin ("custom");--> statement-breakpoint
502
+ CREATE INDEX "issues_search_idx" ON "mod_tracker"."issues" USING gin ("search");--> statement-breakpoint
503
+ CREATE UNIQUE INDEX "labels_project_name_uq" ON "mod_tracker"."labels" USING btree ("project_id","name") WHERE project_id is not null;--> statement-breakpoint
504
+ CREATE UNIQUE INDEX "labels_ws_name_uq" ON "mod_tracker"."labels" USING btree ("workspace_id","name") WHERE project_id is null;--> statement-breakpoint
505
+ CREATE INDEX "labels_ws_idx" ON "mod_tracker"."labels" USING btree ("workspace_id","project_id");--> statement-breakpoint
506
+ CREATE INDEX "links_issue_idx" ON "mod_tracker"."links" USING btree ("issue_id","created_at");--> statement-breakpoint
507
+ CREATE INDEX "milestones_project_idx" ON "mod_tracker"."milestones" USING btree ("project_id","target_date");--> statement-breakpoint
508
+ CREATE INDEX "project_members_ws_user_idx" ON "mod_tracker"."project_members" USING btree ("workspace_id","user_id");--> statement-breakpoint
509
+ CREATE UNIQUE INDEX "project_templates_ws_key_uq" ON "mod_tracker"."project_templates" USING btree ("workspace_id","key");--> statement-breakpoint
510
+ CREATE UNIQUE INDEX "projects_ws_key_uq" ON "mod_tracker"."projects" USING btree ("workspace_id","key");--> statement-breakpoint
511
+ CREATE UNIQUE INDEX "projects_intake_token_uq" ON "mod_tracker"."projects" USING btree ("intake_token") WHERE intake_token is not null;--> statement-breakpoint
512
+ CREATE INDEX "projects_ws_idx" ON "mod_tracker"."projects" USING btree ("workspace_id","archived_at");--> statement-breakpoint
513
+ CREATE INDEX "recurring_issues_project_idx" ON "mod_tracker"."recurring_issues" USING btree ("project_id");--> statement-breakpoint
514
+ CREATE INDEX "recurring_issues_due_idx" ON "mod_tracker"."recurring_issues" USING btree ("next_run_at") WHERE enabled;--> statement-breakpoint
515
+ CREATE UNIQUE INDEX "relations_edge_uq" ON "mod_tracker"."relations" USING btree ("from_issue_id","to_issue_id","type");--> statement-breakpoint
516
+ CREATE INDEX "relations_to_idx" ON "mod_tracker"."relations" USING btree ("to_issue_id");--> statement-breakpoint
517
+ CREATE UNIQUE INDEX "timers_ws_user_uq" ON "mod_tracker"."timers" USING btree ("workspace_id","user_id");--> statement-breakpoint
518
+ CREATE INDEX "type_schemes_ws_idx" ON "mod_tracker"."type_schemes" USING btree ("workspace_id","created_at");--> statement-breakpoint
519
+ CREATE INDEX "versions_project_idx" ON "mod_tracker"."versions" USING btree ("project_id","order");--> statement-breakpoint
520
+ CREATE INDEX "view_pins_ws_user_idx" ON "mod_tracker"."view_pins" USING btree ("workspace_id","user_id");--> statement-breakpoint
521
+ CREATE INDEX "views_ws_idx" ON "mod_tracker"."views" USING btree ("workspace_id","project_id","order");--> statement-breakpoint
522
+ CREATE UNIQUE INDEX "work_item_types_ws_project_key_uq" ON "mod_tracker"."work_item_types" USING btree ("workspace_id","project_id","key") WHERE project_id is not null;--> statement-breakpoint
523
+ CREATE UNIQUE INDEX "work_item_types_ws_key_uq" ON "mod_tracker"."work_item_types" USING btree ("workspace_id","key") WHERE project_id is null;--> statement-breakpoint
524
+ CREATE INDEX "work_item_types_ws_idx" ON "mod_tracker"."work_item_types" USING btree ("workspace_id","project_id","order");--> statement-breakpoint
525
+ CREATE INDEX "workflow_schemes_ws_idx" ON "mod_tracker"."workflow_schemes" USING btree ("workspace_id","created_at");--> statement-breakpoint
526
+ CREATE INDEX "workflows_ws_idx" ON "mod_tracker"."workflows" USING btree ("workspace_id","project_id","archived_at");--> statement-breakpoint
527
+ CREATE INDEX "worklogs_issue_idx" ON "mod_tracker"."worklogs" USING btree ("issue_id","started_at");--> statement-breakpoint
528
+ CREATE INDEX "worklogs_ws_user_started_idx" ON "mod_tracker"."worklogs" USING btree ("workspace_id","user_id","started_at");--> statement-breakpoint
529
+ CREATE INDEX "worklogs_project_started_idx" ON "mod_tracker"."worklogs" USING btree ("project_id","started_at");