@autocode-cli/autocode 0.29.0 → 0.37.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 (203) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_i18n/Mqu2gZRD/en/messages.json +1 -0
  3. package/.output/public/_i18n/Mqu2gZRD/fr/messages.json +1 -0
  4. package/.output/public/_nuxt/-DEWfUYv.js +1 -0
  5. package/.output/public/_nuxt/{CGH8jYZ3.js → 0VxesDuV.js} +1 -1
  6. package/.output/public/_nuxt/{Cw9GjiQd.js → 3dDT4orS.js} +1 -1
  7. package/.output/public/_nuxt/{DJ68wI4q.js → B-L8_kPw.js} +1 -1
  8. package/.output/public/_nuxt/{WXFPFJGI.js → B6_0bWxd.js} +1 -1
  9. package/.output/public/_nuxt/B8IBFC6T.js +1 -0
  10. package/.output/public/_nuxt/{mhFvEihp.js → B9-SkqjX.js} +3 -3
  11. package/.output/public/_nuxt/{DwEf6snv.js → BBTritm-.js} +1 -1
  12. package/.output/public/_nuxt/{D2yqkPsk.js → BDW6A7V8.js} +1 -1
  13. package/.output/public/_nuxt/{CuMOMF74.js → BE1Ftxsu.js} +1 -1
  14. package/.output/public/_nuxt/BF5itqHW.js +10 -0
  15. package/.output/public/_nuxt/{c7taDBy4.js → BHpbNCa8.js} +1 -1
  16. package/.output/public/_nuxt/{CUrMRCov.js → BJGB6i4C.js} +1 -1
  17. package/.output/public/_nuxt/{ttDeS43_.js → BJnlSHzy.js} +1 -1
  18. package/.output/public/_nuxt/{Dnk-IiYT.js → BNr40Cyx.js} +1 -1
  19. package/.output/public/_nuxt/{CftWxl87.js → BP-5A3ad.js} +1 -1
  20. package/.output/public/_nuxt/{CvtJgrAC.js → BPSRe1xo.js} +1 -1
  21. package/.output/public/_nuxt/{DV1gbxJr.js → BatC3POU.js} +1 -1
  22. package/.output/public/_nuxt/{QO28866g.js → BcwrT42V.js} +1 -1
  23. package/.output/public/_nuxt/{MqYwBbea.js → BmfOZEEG.js} +1 -1
  24. package/.output/public/_nuxt/BqOlVwUK.js +1 -0
  25. package/.output/public/_nuxt/{CMirklGN.js → Bx15WLHx.js} +1 -1
  26. package/.output/public/_nuxt/{s3F7y6k3.js → C1Dh6gFG.js} +1 -1
  27. package/.output/public/_nuxt/{Bb4iE1RK.js → C1d_VCXk.js} +1 -1
  28. package/.output/public/_nuxt/{YFXx8Qjo.js → C3g32ML-.js} +1 -1
  29. package/.output/public/_nuxt/{BiTHsA5D.js → C819KIPL.js} +1 -1
  30. package/.output/public/_nuxt/{DMLkLSSr.js → CDRiuU72.js} +1 -1
  31. package/.output/public/_nuxt/{BWuiHx6Z.js → CH4xRPqk.js} +1 -1
  32. package/.output/public/_nuxt/{Qp3vP2w-.js → CHFxtqug.js} +1 -1
  33. package/.output/public/_nuxt/{BhOptLaB.js → CHQoxcLf.js} +1 -1
  34. package/.output/public/_nuxt/CKyM99yH.js +1 -0
  35. package/.output/public/_nuxt/{2aYBL_7i.js → CORW7tev.js} +1 -1
  36. package/.output/public/_nuxt/{5c4wy8Fe.js → CQakkP7y.js} +1 -1
  37. package/.output/public/_nuxt/{C1majTdt.js → CTidC4T0.js} +1 -1
  38. package/.output/public/_nuxt/CWELpXTp.js +1 -0
  39. package/.output/public/_nuxt/{C8ykELcI.js → CjND9Y9S.js} +1 -1
  40. package/.output/public/_nuxt/{eAMnPBdX.js → Cm1brjPJ.js} +1 -1
  41. package/.output/public/_nuxt/{DUT6s2Vc.js → CohKcwVk.js} +1 -1
  42. package/.output/public/_nuxt/CpaAmOT1.js +1 -0
  43. package/.output/public/_nuxt/{BKohRmb3.js → CqtB_OH7.js} +1 -1
  44. package/.output/public/_nuxt/{DBRrdiDg.js → CvEn06t8.js} +1 -1
  45. package/.output/public/_nuxt/{D0l9HWst.js → D3FsoLQm.js} +1 -1
  46. package/.output/public/_nuxt/{ZxHW_Wwi.js → D3uRvzsu.js} +1 -1
  47. package/.output/public/_nuxt/{c9kaG6Mb.js → D6s--CDK.js} +1 -1
  48. package/.output/public/_nuxt/{CFO65yNa.js → DL-48EFA.js} +1 -1
  49. package/.output/public/_nuxt/{a0ULJgSn.js → DPdNpAt1.js} +1 -1
  50. package/.output/public/_nuxt/DbKMezC2.js +1 -0
  51. package/.output/public/_nuxt/{W7VQVcj3.js → DjSp0ni5.js} +3 -3
  52. package/.output/public/_nuxt/{C9F9DISc.js → Dku8fc7v.js} +1 -1
  53. package/.output/public/_nuxt/{B-SoSAQ-.js → DorDSzHT.js} +1 -1
  54. package/.output/public/_nuxt/{CtihvsfH.js → DpJr9JIo.js} +1 -1
  55. package/.output/public/_nuxt/{DS8c6APr.js → DvdVpK92.js} +1 -1
  56. package/.output/public/_nuxt/{DfzafmDP.js → DyAfzMRU.js} +1 -1
  57. package/.output/public/_nuxt/{tqfMB__6.js → G3ENYyJJ.js} +1 -1
  58. package/.output/public/_nuxt/{BvR2cHrU.js → G3RO7xM_.js} +1 -1
  59. package/.output/public/_nuxt/{BsOUGgHX.js → Q3VbeUEc.js} +1 -1
  60. package/.output/public/_nuxt/{E037g09h.js → _Lx_e17m.js} +1 -1
  61. package/.output/public/_nuxt/{DEbgyyF-.js → _S9g-Cdv.js} +1 -1
  62. package/.output/public/_nuxt/{C_XYgaP4.js → _dIH-mlE.js} +1 -1
  63. package/.output/public/_nuxt/builds/latest.json +1 -1
  64. package/.output/public/_nuxt/builds/meta/cbc2f99e-ecf0-446a-810b-808825114bc3.json +1 -0
  65. package/.output/public/_nuxt/{BrN48gj6.js → c0R8lEWK.js} +1 -1
  66. package/.output/public/_nuxt/cli.D68WAxVv.css +1 -0
  67. package/.output/public/_nuxt/{Dmbsi9xE.js → cm-fPQZs.js} +1 -1
  68. package/.output/public/_nuxt/{C2MG9-_i.js → hYe2UtEI.js} +1 -1
  69. package/.output/public/_nuxt/index.B4qqY6WX.css +1 -0
  70. package/.output/public/_nuxt/index.CPvzWVwd.css +1 -0
  71. package/.output/public/_nuxt/{Camk5F-_.js → mbPYOeR0.js} +1 -1
  72. package/.output/public/_nuxt/n-2mvXdi.js +1 -0
  73. package/.output/public/_nuxt/new.84MgEEsd.css +1 -0
  74. package/.output/public/_nuxt/prompt.CNw9EZnJ.css +1 -0
  75. package/.output/public/_nuxt/{CL8Pd5Up.js → qNJDhLpf.js} +1 -1
  76. package/.output/public/_nuxt/{CDsqJjO8.js → rFVztcxU.js} +1 -1
  77. package/.output/public/_nuxt/{BG7brVhY.js → up1a6xQr.js} +1 -1
  78. package/.output/public/_nuxt/x9aAWeiI.js +1 -0
  79. package/.output/public/_payload.json +1 -1
  80. package/.output/public/api/_openapi.json +1 -1
  81. package/.output/public/docs/api/_payload.json +1 -1
  82. package/.output/public/docs/api/index.html +8 -4
  83. package/.output/public/docs/cli/_payload.json +1 -1
  84. package/.output/public/docs/cli/index.html +13 -13
  85. package/.output/public/index.html +1 -1
  86. package/.output/server/chunks/_/en.mjs +16 -23
  87. package/.output/server/chunks/_/en.mjs.map +1 -1
  88. package/.output/server/chunks/_/fr.mjs +16 -23
  89. package/.output/server/chunks/_/fr.mjs.map +1 -1
  90. package/.output/server/chunks/build/LandingAutonomy-styles.Dvel3Juy.mjs +8 -0
  91. package/.output/server/chunks/build/LandingAutonomy-styles.Dvel3Juy.mjs.map +1 -0
  92. package/.output/server/chunks/build/LandingFooter-styles.CudcJSR4.mjs +8 -0
  93. package/.output/server/chunks/build/LandingFooter-styles.CudcJSR4.mjs.map +1 -0
  94. package/.output/server/chunks/build/LandingPipeline-styles.C8JPQYOV.mjs +8 -0
  95. package/.output/server/chunks/build/LandingPipeline-styles.C8JPQYOV.mjs.map +1 -0
  96. package/.output/server/chunks/build/{cli-CZwbcgW5.mjs → cli-S2geGQoF.mjs} +27 -14
  97. package/.output/server/chunks/build/cli-S2geGQoF.mjs.map +1 -0
  98. package/.output/server/chunks/build/cli-styles.BonhH80m.mjs +8 -0
  99. package/.output/server/chunks/build/cli-styles.BonhH80m.mjs.map +1 -0
  100. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  101. package/.output/server/chunks/build/{en-BwRtQJL1.mjs → en-nHmCjmd_.mjs} +17 -24
  102. package/.output/server/chunks/build/{en-BwRtQJL1.mjs.map → en-nHmCjmd_.mjs.map} +1 -1
  103. package/.output/server/chunks/build/{fr-BAbxj8tA.mjs → fr-7FZEU85C.mjs} +17 -24
  104. package/.output/server/chunks/build/{fr-BAbxj8tA.mjs.map → fr-7FZEU85C.mjs.map} +1 -1
  105. package/.output/server/chunks/build/{index-CKZ58Ox2.mjs → index-BZJzUQ3B.mjs} +27 -17
  106. package/.output/server/chunks/build/index-BZJzUQ3B.mjs.map +1 -0
  107. package/.output/server/chunks/build/{index-3KvoAMZW.mjs → index-DYwGkPcJ.mjs} +92 -275
  108. package/.output/server/chunks/build/index-DYwGkPcJ.mjs.map +1 -0
  109. package/.output/server/chunks/build/index-styles.BP9liX_F.mjs +8 -0
  110. package/.output/server/chunks/build/index-styles.BP9liX_F.mjs.map +1 -0
  111. package/.output/server/chunks/build/{new-BI12IpeK.mjs → new-BqYiaSD7.mjs} +19 -19
  112. package/.output/server/chunks/build/{new-BI12IpeK.mjs.map → new-BqYiaSD7.mjs.map} +1 -1
  113. package/.output/server/chunks/build/new-styles.BPjkN6Iy.mjs +8 -0
  114. package/.output/server/chunks/build/new-styles.BPjkN6Iy.mjs.map +1 -0
  115. package/.output/server/chunks/build/{prompt-BjvwrM-J.mjs → prompt-D-xu1MtO.mjs} +41 -12
  116. package/.output/server/chunks/build/prompt-D-xu1MtO.mjs.map +1 -0
  117. package/.output/server/chunks/build/prompt-styles.Dvlc6Xra.mjs +8 -0
  118. package/.output/server/chunks/build/prompt-styles.Dvlc6Xra.mjs.map +1 -0
  119. package/.output/server/chunks/build/server.mjs +9 -9
  120. package/.output/server/chunks/build/styles.mjs +29 -35
  121. package/.output/server/chunks/nitro/nitro.mjs +551 -521
  122. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  123. package/.output/server/chunks/routes/.well-known/appspecific/_...path_.mjs +34 -0
  124. package/.output/server/chunks/routes/.well-known/appspecific/_...path_.mjs.map +1 -0
  125. package/.output/server/chunks/routes/api/issues/_id/history.get.mjs +3 -2
  126. package/.output/server/chunks/routes/api/issues/_id/history.get.mjs.map +1 -1
  127. package/.output/server/node_modules/.prisma/client/index.js +4 -3
  128. package/.output/server/node_modules/.prisma/client/package.json +1 -1
  129. package/.output/server/package.json +1 -1
  130. package/bin/autocode +188 -4
  131. package/package.json +5 -6
  132. package/prisma/migrations/20260104173538_init/migration.sql +142 -0
  133. package/prisma/migrations/20260104180000_pipeline_versioning/migration.sql +216 -0
  134. package/prisma/migrations/20260104190638_add_column_prompts/migration.sql +50 -0
  135. package/prisma/migrations/20260105120000_remove_column_prompts/migration.sql +3 -0
  136. package/prisma/migrations/20260105150000_normalize_pipeline_names/migration.sql +37 -0
  137. package/prisma/migrations/20260105170000_remove_slug_prefixes/migration.sql +16 -0
  138. package/prisma/migrations/migration_lock.toml +3 -0
  139. package/prisma/schema.prisma +185 -0
  140. package/templates/prompts/_transition-decision.en.md +41 -25
  141. package/templates/prompts/_transition-decision.fr.md +28 -11
  142. package/templates/prompts/design.en.md +31 -9
  143. package/templates/prompts/design.fr.md +31 -9
  144. package/templates/prompts/git-tag.en.md +47 -11
  145. package/templates/prompts/git-tag.fr.md +47 -11
  146. package/templates/prompts/in-progress.en.md +43 -9
  147. package/templates/prompts/in-progress.fr.md +44 -10
  148. package/templates/prompts/qualification.en.md +48 -17
  149. package/templates/prompts/qualification.fr.md +48 -17
  150. package/templates/prompts/retest-cypress.en.md +14 -3
  151. package/templates/prompts/retest-cypress.fr.md +14 -3
  152. package/templates/prompts/review-security.en.md +35 -6
  153. package/templates/prompts/review-security.fr.md +35 -6
  154. package/templates/prompts/specification.en.md +29 -7
  155. package/templates/prompts/specification.fr.md +29 -7
  156. package/templates/prompts/splitter.en.md +50 -28
  157. package/templates/prompts/splitter.fr.md +52 -31
  158. package/templates/prompts/testing-cypress.en.md +14 -4
  159. package/templates/prompts/testing-cypress.fr.md +14 -4
  160. package/templates/prompts/testing-integration.en.md +39 -3
  161. package/templates/prompts/testing-integration.fr.md +39 -3
  162. package/.output/public/_i18n/_RCBbyrF/en/messages.json +0 -1
  163. package/.output/public/_i18n/_RCBbyrF/fr/messages.json +0 -1
  164. package/.output/public/_nuxt/B-QzFHDD.js +0 -1
  165. package/.output/public/_nuxt/Bn3kTsBm.js +0 -1
  166. package/.output/public/_nuxt/C2Vs_J-1.js +0 -1
  167. package/.output/public/_nuxt/CDVPefsv.js +0 -1
  168. package/.output/public/_nuxt/CSk34z2H.js +0 -1
  169. package/.output/public/_nuxt/DPWzdJ4S.js +0 -1
  170. package/.output/public/_nuxt/DrzMcrms.js +0 -1
  171. package/.output/public/_nuxt/_bAHEawb.js +0 -1
  172. package/.output/public/_nuxt/b2LQmhwq.js +0 -1
  173. package/.output/public/_nuxt/builds/meta/4d6876ea-4c52-49d1-a9d5-07bb0648a85e.json +0 -1
  174. package/.output/public/_nuxt/cli.e1u7fwy6.css +0 -1
  175. package/.output/public/_nuxt/hWy-7Z1L.js +0 -10
  176. package/.output/public/_nuxt/index.COVdL_Kx.css +0 -1
  177. package/.output/public/_nuxt/index.Dndk3KN9.css +0 -1
  178. package/.output/public/_nuxt/new.BFERdqdm.css +0 -1
  179. package/.output/public/_nuxt/prompt.DZ0wdOji.css +0 -1
  180. package/.output/server/chunks/build/LandingArchitecture-styles.Don6ug3a.mjs +0 -8
  181. package/.output/server/chunks/build/LandingArchitecture-styles.Don6ug3a.mjs.map +0 -1
  182. package/.output/server/chunks/build/LandingAutonomy-styles.D9JJFMEO.mjs +0 -8
  183. package/.output/server/chunks/build/LandingAutonomy-styles.D9JJFMEO.mjs.map +0 -1
  184. package/.output/server/chunks/build/LandingDemo-styles.WY8VUN9P.mjs +0 -8
  185. package/.output/server/chunks/build/LandingDemo-styles.WY8VUN9P.mjs.map +0 -1
  186. package/.output/server/chunks/build/LandingFooter-styles.sSpn5cgM.mjs +0 -8
  187. package/.output/server/chunks/build/LandingFooter-styles.sSpn5cgM.mjs.map +0 -1
  188. package/.output/server/chunks/build/LandingPipeline-styles.CL96fyQR.mjs +0 -8
  189. package/.output/server/chunks/build/LandingPipeline-styles.CL96fyQR.mjs.map +0 -1
  190. package/.output/server/chunks/build/LandingRoadmap-styles.DX5EsTsx.mjs +0 -8
  191. package/.output/server/chunks/build/LandingRoadmap-styles.DX5EsTsx.mjs.map +0 -1
  192. package/.output/server/chunks/build/cli-CZwbcgW5.mjs.map +0 -1
  193. package/.output/server/chunks/build/cli-styles.CSdcLhw8.mjs +0 -8
  194. package/.output/server/chunks/build/cli-styles.CSdcLhw8.mjs.map +0 -1
  195. package/.output/server/chunks/build/index-3KvoAMZW.mjs.map +0 -1
  196. package/.output/server/chunks/build/index-CKZ58Ox2.mjs.map +0 -1
  197. package/.output/server/chunks/build/index-styles.BJ7kZO7q.mjs +0 -8
  198. package/.output/server/chunks/build/index-styles.BJ7kZO7q.mjs.map +0 -1
  199. package/.output/server/chunks/build/new-styles.Chk5u_6M.mjs +0 -8
  200. package/.output/server/chunks/build/new-styles.Chk5u_6M.mjs.map +0 -1
  201. package/.output/server/chunks/build/prompt-BjvwrM-J.mjs.map +0 -1
  202. package/.output/server/chunks/build/prompt-styles.DWfublIG.mjs +0 -8
  203. package/.output/server/chunks/build/prompt-styles.DWfublIG.mjs.map +0 -1
@@ -0,0 +1,142 @@
1
+ -- CreateTable
2
+ CREATE TABLE "pipelines" (
3
+ "name" TEXT NOT NULL PRIMARY KEY,
4
+ "version" TEXT NOT NULL DEFAULT '1.0.0',
5
+ "description" TEXT,
6
+ "active" BOOLEAN NOT NULL DEFAULT false,
7
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updated_at" DATETIME NOT NULL
9
+ );
10
+
11
+ -- CreateTable
12
+ CREATE TABLE "columns" (
13
+ "slug" TEXT NOT NULL PRIMARY KEY,
14
+ "name" TEXT NOT NULL,
15
+ "index" INTEGER NOT NULL,
16
+ "segment" TEXT NOT NULL,
17
+ "pipeline_name" TEXT NOT NULL,
18
+ CONSTRAINT "columns_pipeline_name_fkey" FOREIGN KEY ("pipeline_name") REFERENCES "pipelines" ("name") ON DELETE CASCADE ON UPDATE CASCADE
19
+ );
20
+
21
+ -- CreateTable
22
+ CREATE TABLE "issues" (
23
+ "key" TEXT NOT NULL PRIMARY KEY,
24
+ "title" TEXT NOT NULL,
25
+ "description" TEXT,
26
+ "priority" TEXT NOT NULL DEFAULT 'P2',
27
+ "semver" TEXT NOT NULL DEFAULT 'patch',
28
+ "labels" TEXT NOT NULL DEFAULT '[]',
29
+ "column_slug" TEXT NOT NULL,
30
+ "parent_key" TEXT,
31
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
32
+ "updated_at" DATETIME NOT NULL,
33
+ CONSTRAINT "issues_column_slug_fkey" FOREIGN KEY ("column_slug") REFERENCES "columns" ("slug") ON DELETE RESTRICT ON UPDATE CASCADE,
34
+ CONSTRAINT "issues_parent_key_fkey" FOREIGN KEY ("parent_key") REFERENCES "issues" ("key") ON DELETE SET NULL ON UPDATE CASCADE
35
+ );
36
+
37
+ -- CreateTable
38
+ CREATE TABLE "acceptance_criteria" (
39
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
40
+ "issue_key" TEXT NOT NULL,
41
+ "criterion" TEXT NOT NULL,
42
+ "position" INTEGER NOT NULL,
43
+ CONSTRAINT "acceptance_criteria_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues" ("key") ON DELETE CASCADE ON UPDATE CASCADE
44
+ );
45
+
46
+ -- CreateTable
47
+ CREATE TABLE "issue_history" (
48
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
49
+ "issue_key" TEXT NOT NULL,
50
+ "at" DATETIME NOT NULL,
51
+ "action" TEXT NOT NULL,
52
+ "from_column" TEXT,
53
+ "to_column" TEXT NOT NULL,
54
+ "session_id" TEXT,
55
+ "changes" TEXT,
56
+ CONSTRAINT "issue_history_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues" ("key") ON DELETE CASCADE ON UPDATE CASCADE
57
+ );
58
+
59
+ -- CreateTable
60
+ CREATE TABLE "execution_logs" (
61
+ "session_id" TEXT NOT NULL PRIMARY KEY,
62
+ "issue_key" TEXT NOT NULL,
63
+ "column_slug" TEXT NOT NULL,
64
+ "prompt" TEXT,
65
+ "terminal_log" TEXT,
66
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
67
+ CONSTRAINT "execution_logs_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues" ("key") ON DELETE CASCADE ON UPDATE CASCADE,
68
+ CONSTRAINT "execution_logs_column_slug_fkey" FOREIGN KEY ("column_slug") REFERENCES "columns" ("slug") ON DELETE RESTRICT ON UPDATE CASCADE
69
+ );
70
+
71
+ -- CreateTable
72
+ CREATE TABLE "comments" (
73
+ "id" TEXT NOT NULL PRIMARY KEY,
74
+ "issue_key" TEXT NOT NULL,
75
+ "content" TEXT NOT NULL,
76
+ "author" TEXT NOT NULL,
77
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
78
+ CONSTRAINT "comments_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues" ("key") ON DELETE CASCADE ON UPDATE CASCADE
79
+ );
80
+
81
+ -- CreateTable
82
+ CREATE TABLE "attachments" (
83
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
84
+ "issue_key" TEXT NOT NULL,
85
+ "filename" TEXT NOT NULL,
86
+ "filepath" TEXT NOT NULL,
87
+ "mimetype" TEXT,
88
+ "size" INTEGER,
89
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
90
+ CONSTRAINT "attachments_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues" ("key") ON DELETE CASCADE ON UPDATE CASCADE
91
+ );
92
+
93
+ -- CreateTable
94
+ CREATE TABLE "sequences" (
95
+ "name" TEXT NOT NULL PRIMARY KEY,
96
+ "current_value" INTEGER NOT NULL DEFAULT 0
97
+ );
98
+
99
+ -- CreateIndex
100
+ CREATE INDEX "columns_pipeline_name_idx" ON "columns"("pipeline_name");
101
+
102
+ -- CreateIndex
103
+ CREATE INDEX "columns_index_idx" ON "columns"("index");
104
+
105
+ -- CreateIndex
106
+ CREATE INDEX "issues_column_slug_idx" ON "issues"("column_slug");
107
+
108
+ -- CreateIndex
109
+ CREATE INDEX "issues_parent_key_idx" ON "issues"("parent_key");
110
+
111
+ -- CreateIndex
112
+ CREATE INDEX "issues_priority_idx" ON "issues"("priority");
113
+
114
+ -- CreateIndex
115
+ CREATE INDEX "issues_updated_at_idx" ON "issues"("updated_at" DESC);
116
+
117
+ -- CreateIndex
118
+ CREATE INDEX "acceptance_criteria_issue_key_idx" ON "acceptance_criteria"("issue_key");
119
+
120
+ -- CreateIndex
121
+ CREATE INDEX "issue_history_issue_key_idx" ON "issue_history"("issue_key");
122
+
123
+ -- CreateIndex
124
+ CREATE INDEX "issue_history_session_id_idx" ON "issue_history"("session_id");
125
+
126
+ -- CreateIndex
127
+ CREATE INDEX "issue_history_at_idx" ON "issue_history"("at" DESC);
128
+
129
+ -- CreateIndex
130
+ CREATE INDEX "execution_logs_issue_key_idx" ON "execution_logs"("issue_key");
131
+
132
+ -- CreateIndex
133
+ CREATE INDEX "execution_logs_column_slug_idx" ON "execution_logs"("column_slug");
134
+
135
+ -- CreateIndex
136
+ CREATE INDEX "comments_issue_key_idx" ON "comments"("issue_key");
137
+
138
+ -- CreateIndex
139
+ CREATE INDEX "comments_created_at_idx" ON "comments"("created_at" DESC);
140
+
141
+ -- CreateIndex
142
+ CREATE INDEX "attachments_issue_key_idx" ON "attachments"("issue_key");
@@ -0,0 +1,216 @@
1
+ -- Migration: Pipeline Versioning System
2
+ -- Cette migration transforme le système de pipelines en système versionné et immuable
3
+
4
+ -- ═══════════════════════════════════════════════════════════════
5
+ -- ÉTAPE 1: Créer les nouvelles tables
6
+ -- ═══════════════════════════════════════════════════════════════
7
+
8
+ -- Nouvelle table pipelines avec clé composite (name, version)
9
+ CREATE TABLE "pipelines_new" (
10
+ "name" TEXT NOT NULL,
11
+ "version" INTEGER NOT NULL DEFAULT 1,
12
+ "description" TEXT,
13
+ "active" BOOLEAN NOT NULL DEFAULT false,
14
+ "draft" BOOLEAN NOT NULL DEFAULT false,
15
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ "created_from_version" INTEGER,
17
+ PRIMARY KEY ("name", "version")
18
+ );
19
+
20
+ -- Nouvelle table columns avec ID auto-increment
21
+ CREATE TABLE "columns_new" (
22
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
23
+ "slug" TEXT NOT NULL,
24
+ "name" TEXT NOT NULL,
25
+ "index" INTEGER NOT NULL,
26
+ "segment" TEXT NOT NULL,
27
+ "pipeline_name" TEXT NOT NULL,
28
+ "pipeline_version" INTEGER NOT NULL DEFAULT 1,
29
+ CONSTRAINT "columns_pipeline_fkey" FOREIGN KEY ("pipeline_name", "pipeline_version") REFERENCES "pipelines_new" ("name", "version") ON DELETE CASCADE ON UPDATE CASCADE
30
+ );
31
+
32
+ -- ═══════════════════════════════════════════════════════════════
33
+ -- ÉTAPE 2: Migrer les données pipelines (tous deviennent v1, verrouillés)
34
+ -- ═══════════════════════════════════════════════════════════════
35
+
36
+ INSERT INTO "pipelines_new" ("name", "version", "description", "active", "draft", "created_at", "created_from_version")
37
+ SELECT "name", 1, "description", "active", false, "created_at", NULL
38
+ FROM "pipelines";
39
+
40
+ -- ═══════════════════════════════════════════════════════════════
41
+ -- ÉTAPE 3: Migrer les colonnes (avec auto-increment ID)
42
+ -- ═══════════════════════════════════════════════════════════════
43
+
44
+ INSERT INTO "columns_new" ("slug", "name", "index", "segment", "pipeline_name", "pipeline_version")
45
+ SELECT "slug", "name", "index", "segment", "pipeline_name", 1
46
+ FROM "columns";
47
+
48
+ -- ═══════════════════════════════════════════════════════════════
49
+ -- ÉTAPE 4: Créer table temporaire de mapping slug -> id
50
+ -- ═══════════════════════════════════════════════════════════════
51
+
52
+ CREATE TEMPORARY TABLE "column_slug_to_id" AS
53
+ SELECT "slug" as "old_slug", "id" as "new_id"
54
+ FROM "columns_new";
55
+
56
+ -- ═══════════════════════════════════════════════════════════════
57
+ -- ÉTAPE 5: Recréer la table issues avec column_id
58
+ -- ═══════════════════════════════════════════════════════════════
59
+
60
+ CREATE TABLE "issues_new" (
61
+ "key" TEXT NOT NULL PRIMARY KEY,
62
+ "title" TEXT NOT NULL,
63
+ "description" TEXT,
64
+ "priority" TEXT NOT NULL DEFAULT 'P2',
65
+ "semver" TEXT NOT NULL DEFAULT 'patch',
66
+ "labels" TEXT NOT NULL DEFAULT '[]',
67
+ "column_id" INTEGER NOT NULL,
68
+ "parent_key" TEXT,
69
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
70
+ "updated_at" DATETIME NOT NULL,
71
+ CONSTRAINT "issues_column_id_fkey" FOREIGN KEY ("column_id") REFERENCES "columns_new" ("id") ON DELETE RESTRICT ON UPDATE CASCADE,
72
+ CONSTRAINT "issues_parent_key_fkey" FOREIGN KEY ("parent_key") REFERENCES "issues_new" ("key") ON DELETE SET NULL ON UPDATE CASCADE
73
+ );
74
+
75
+ -- Migrer les issues en convertissant column_slug -> column_id
76
+ INSERT INTO "issues_new" ("key", "title", "description", "priority", "semver", "labels", "column_id", "parent_key", "created_at", "updated_at")
77
+ SELECT i."key", i."title", i."description", i."priority", i."semver", i."labels", m."new_id", i."parent_key", i."created_at", i."updated_at"
78
+ FROM "issues" i
79
+ JOIN "column_slug_to_id" m ON i."column_slug" = m."old_slug";
80
+
81
+ -- ═══════════════════════════════════════════════════════════════
82
+ -- ÉTAPE 6: Recréer la table execution_logs avec column_id
83
+ -- ═══════════════════════════════════════════════════════════════
84
+
85
+ CREATE TABLE "execution_logs_new" (
86
+ "session_id" TEXT NOT NULL PRIMARY KEY,
87
+ "issue_key" TEXT NOT NULL,
88
+ "column_id" INTEGER NOT NULL,
89
+ "prompt" TEXT,
90
+ "terminal_log" TEXT,
91
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
92
+ CONSTRAINT "execution_logs_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues_new" ("key") ON DELETE CASCADE ON UPDATE CASCADE,
93
+ CONSTRAINT "execution_logs_column_id_fkey" FOREIGN KEY ("column_id") REFERENCES "columns_new" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
94
+ );
95
+
96
+ -- Migrer execution_logs en convertissant column_slug -> column_id
97
+ INSERT INTO "execution_logs_new" ("session_id", "issue_key", "column_id", "prompt", "terminal_log", "created_at")
98
+ SELECT e."session_id", e."issue_key", m."new_id", e."prompt", e."terminal_log", e."created_at"
99
+ FROM "execution_logs" e
100
+ JOIN "column_slug_to_id" m ON e."column_slug" = m."old_slug";
101
+
102
+ -- ═══════════════════════════════════════════════════════════════
103
+ -- ÉTAPE 7: Recréer les tables dépendantes (acceptance_criteria reste lié à issues par key)
104
+ -- ═══════════════════════════════════════════════════════════════
105
+
106
+ -- acceptance_criteria: Pas de changement de FK, juste recréer pour intégrité
107
+ CREATE TABLE "acceptance_criteria_new" (
108
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
109
+ "issue_key" TEXT NOT NULL,
110
+ "criterion" TEXT NOT NULL,
111
+ "position" INTEGER NOT NULL,
112
+ CONSTRAINT "acceptance_criteria_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues_new" ("key") ON DELETE CASCADE ON UPDATE CASCADE
113
+ );
114
+
115
+ INSERT INTO "acceptance_criteria_new" SELECT * FROM "acceptance_criteria";
116
+
117
+ -- issue_history: Pas de changement (from_column/to_column restent des strings pour historique)
118
+ CREATE TABLE "issue_history_new" (
119
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
120
+ "issue_key" TEXT NOT NULL,
121
+ "at" DATETIME NOT NULL,
122
+ "action" TEXT NOT NULL,
123
+ "from_column" TEXT,
124
+ "to_column" TEXT NOT NULL,
125
+ "session_id" TEXT,
126
+ "changes" TEXT,
127
+ CONSTRAINT "issue_history_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues_new" ("key") ON DELETE CASCADE ON UPDATE CASCADE
128
+ );
129
+
130
+ INSERT INTO "issue_history_new" SELECT * FROM "issue_history";
131
+
132
+ -- comments
133
+ CREATE TABLE "comments_new" (
134
+ "id" TEXT NOT NULL PRIMARY KEY,
135
+ "issue_key" TEXT NOT NULL,
136
+ "content" TEXT NOT NULL,
137
+ "author" TEXT NOT NULL,
138
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
139
+ CONSTRAINT "comments_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues_new" ("key") ON DELETE CASCADE ON UPDATE CASCADE
140
+ );
141
+
142
+ INSERT INTO "comments_new" SELECT * FROM "comments";
143
+
144
+ -- attachments
145
+ CREATE TABLE "attachments_new" (
146
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
147
+ "issue_key" TEXT NOT NULL,
148
+ "filename" TEXT NOT NULL,
149
+ "filepath" TEXT NOT NULL,
150
+ "mimetype" TEXT,
151
+ "size" INTEGER,
152
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
153
+ CONSTRAINT "attachments_issue_key_fkey" FOREIGN KEY ("issue_key") REFERENCES "issues_new" ("key") ON DELETE CASCADE ON UPDATE CASCADE
154
+ );
155
+
156
+ INSERT INTO "attachments_new" SELECT * FROM "attachments";
157
+
158
+ -- ═══════════════════════════════════════════════════════════════
159
+ -- ÉTAPE 8: Supprimer les anciennes tables
160
+ -- ═══════════════════════════════════════════════════════════════
161
+
162
+ DROP TABLE "attachments";
163
+ DROP TABLE "comments";
164
+ DROP TABLE "issue_history";
165
+ DROP TABLE "acceptance_criteria";
166
+ DROP TABLE "execution_logs";
167
+ DROP TABLE "issues";
168
+ DROP TABLE "columns";
169
+ DROP TABLE "pipelines";
170
+
171
+ -- ═══════════════════════════════════════════════════════════════
172
+ -- ÉTAPE 9: Renommer les nouvelles tables
173
+ -- ═══════════════════════════════════════════════════════════════
174
+
175
+ ALTER TABLE "pipelines_new" RENAME TO "pipelines";
176
+ ALTER TABLE "columns_new" RENAME TO "columns";
177
+ ALTER TABLE "issues_new" RENAME TO "issues";
178
+ ALTER TABLE "execution_logs_new" RENAME TO "execution_logs";
179
+ ALTER TABLE "acceptance_criteria_new" RENAME TO "acceptance_criteria";
180
+ ALTER TABLE "issue_history_new" RENAME TO "issue_history";
181
+ ALTER TABLE "comments_new" RENAME TO "comments";
182
+ ALTER TABLE "attachments_new" RENAME TO "attachments";
183
+
184
+ -- ═══════════════════════════════════════════════════════════════
185
+ -- ÉTAPE 10: Créer les index
186
+ -- ═══════════════════════════════════════════════════════════════
187
+
188
+ -- Columns
189
+ CREATE UNIQUE INDEX "columns_pipeline_slug_unique" ON "columns"("pipeline_name", "pipeline_version", "slug");
190
+ CREATE INDEX "columns_pipeline_idx" ON "columns"("pipeline_name", "pipeline_version");
191
+ CREATE INDEX "columns_index_idx" ON "columns"("index");
192
+
193
+ -- Issues
194
+ CREATE INDEX "issues_column_id_idx" ON "issues"("column_id");
195
+ CREATE INDEX "issues_parent_key_idx" ON "issues"("parent_key");
196
+ CREATE INDEX "issues_priority_idx" ON "issues"("priority");
197
+ CREATE INDEX "issues_updated_at_idx" ON "issues"("updated_at" DESC);
198
+
199
+ -- Acceptance criteria
200
+ CREATE INDEX "acceptance_criteria_issue_key_idx" ON "acceptance_criteria"("issue_key");
201
+
202
+ -- Issue history
203
+ CREATE INDEX "issue_history_issue_key_idx" ON "issue_history"("issue_key");
204
+ CREATE INDEX "issue_history_session_id_idx" ON "issue_history"("session_id");
205
+ CREATE INDEX "issue_history_at_idx" ON "issue_history"("at" DESC);
206
+
207
+ -- Execution logs
208
+ CREATE INDEX "execution_logs_issue_key_idx" ON "execution_logs"("issue_key");
209
+ CREATE INDEX "execution_logs_column_id_idx" ON "execution_logs"("column_id");
210
+
211
+ -- Comments
212
+ CREATE INDEX "comments_issue_key_idx" ON "comments"("issue_key");
213
+ CREATE INDEX "comments_created_at_idx" ON "comments"("created_at" DESC);
214
+
215
+ -- Attachments
216
+ CREATE INDEX "attachments_issue_key_idx" ON "attachments"("issue_key");
@@ -0,0 +1,50 @@
1
+ -- CreateTable
2
+ CREATE TABLE "column_prompts" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "column_id" INTEGER NOT NULL,
5
+ "lang" TEXT NOT NULL,
6
+ "content" TEXT NOT NULL,
7
+ CONSTRAINT "column_prompts_column_id_fkey" FOREIGN KEY ("column_id") REFERENCES "columns" ("id") ON DELETE CASCADE ON UPDATE CASCADE
8
+ );
9
+
10
+ -- RedefineTables
11
+ PRAGMA defer_foreign_keys=ON;
12
+ PRAGMA foreign_keys=OFF;
13
+ CREATE TABLE "new_columns" (
14
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
15
+ "slug" TEXT NOT NULL,
16
+ "name" TEXT NOT NULL,
17
+ "index" INTEGER NOT NULL,
18
+ "segment" TEXT NOT NULL,
19
+ "pipeline_name" TEXT NOT NULL,
20
+ "pipeline_version" INTEGER NOT NULL,
21
+ CONSTRAINT "columns_pipeline_name_pipeline_version_fkey" FOREIGN KEY ("pipeline_name", "pipeline_version") REFERENCES "pipelines" ("name", "version") ON DELETE CASCADE ON UPDATE CASCADE
22
+ );
23
+ INSERT INTO "new_columns" ("id", "index", "name", "pipeline_name", "pipeline_version", "segment", "slug") SELECT "id", "index", "name", "pipeline_name", "pipeline_version", "segment", "slug" FROM "columns";
24
+ DROP TABLE "columns";
25
+ ALTER TABLE "new_columns" RENAME TO "columns";
26
+ CREATE INDEX "columns_pipeline_name_pipeline_version_idx" ON "columns"("pipeline_name", "pipeline_version");
27
+ CREATE INDEX "columns_index_idx" ON "columns"("index");
28
+ CREATE UNIQUE INDEX "columns_pipeline_name_pipeline_version_slug_key" ON "columns"("pipeline_name", "pipeline_version", "slug");
29
+ CREATE TABLE "new_pipelines" (
30
+ "name" TEXT NOT NULL,
31
+ "version" INTEGER NOT NULL,
32
+ "description" TEXT,
33
+ "active" BOOLEAN NOT NULL DEFAULT false,
34
+ "draft" BOOLEAN NOT NULL DEFAULT true,
35
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+ "created_from_version" INTEGER,
37
+
38
+ PRIMARY KEY ("name", "version")
39
+ );
40
+ INSERT INTO "new_pipelines" ("active", "created_at", "created_from_version", "description", "draft", "name", "version") SELECT "active", "created_at", "created_from_version", "description", "draft", "name", "version" FROM "pipelines";
41
+ DROP TABLE "pipelines";
42
+ ALTER TABLE "new_pipelines" RENAME TO "pipelines";
43
+ PRAGMA foreign_keys=ON;
44
+ PRAGMA defer_foreign_keys=OFF;
45
+
46
+ -- CreateIndex
47
+ CREATE INDEX "column_prompts_column_id_idx" ON "column_prompts"("column_id");
48
+
49
+ -- CreateIndex
50
+ CREATE UNIQUE INDEX "column_prompts_column_id_lang_key" ON "column_prompts"("column_id", "lang");
@@ -0,0 +1,3 @@
1
+ -- DropTable
2
+ -- Removing unused column_prompts table (prompts are now read from template files)
3
+ DROP TABLE IF EXISTS "column_prompts";
@@ -0,0 +1,37 @@
1
+ -- Normalize pipeline names to kebab-case
2
+ -- This migration updates existing pipeline names to use kebab-case format
3
+ -- to avoid case sensitivity and URL encoding issues
4
+
5
+ -- Disable foreign key constraints for the update
6
+ PRAGMA foreign_keys = OFF;
7
+
8
+ -- Update pipelines names (primary key)
9
+ UPDATE pipelines SET name = 'default' WHERE name = 'Default';
10
+ UPDATE pipelines SET name = 'nuxtjs' WHERE name = 'Nuxt.js';
11
+ UPDATE pipelines SET name = 'react' WHERE name = 'React';
12
+ UPDATE pipelines SET name = 'angular' WHERE name = 'Angular';
13
+ UPDATE pipelines SET name = 'vuejs' WHERE name = 'Vue.js';
14
+ UPDATE pipelines SET name = 'java-spring-boot' WHERE name = 'Java Spring Boot';
15
+ UPDATE pipelines SET name = 'python-django' WHERE name = 'Python Django';
16
+ UPDATE pipelines SET name = 'python-fastapi' WHERE name = 'Python FastAPI';
17
+ UPDATE pipelines SET name = 'php-symfony' WHERE name = 'PHP Symfony';
18
+ UPDATE pipelines SET name = 'php-laravel' WHERE name = 'PHP Laravel';
19
+ UPDATE pipelines SET name = 'go' WHERE name = 'Go';
20
+ UPDATE pipelines SET name = 'rust' WHERE name = 'Rust';
21
+
22
+ -- Update columns references (foreign key)
23
+ UPDATE columns SET pipeline_name = 'default' WHERE pipeline_name = 'Default';
24
+ UPDATE columns SET pipeline_name = 'nuxtjs' WHERE pipeline_name = 'Nuxt.js';
25
+ UPDATE columns SET pipeline_name = 'react' WHERE pipeline_name = 'React';
26
+ UPDATE columns SET pipeline_name = 'angular' WHERE pipeline_name = 'Angular';
27
+ UPDATE columns SET pipeline_name = 'vuejs' WHERE pipeline_name = 'Vue.js';
28
+ UPDATE columns SET pipeline_name = 'java-spring-boot' WHERE pipeline_name = 'Java Spring Boot';
29
+ UPDATE columns SET pipeline_name = 'python-django' WHERE pipeline_name = 'Python Django';
30
+ UPDATE columns SET pipeline_name = 'python-fastapi' WHERE pipeline_name = 'Python FastAPI';
31
+ UPDATE columns SET pipeline_name = 'php-symfony' WHERE pipeline_name = 'PHP Symfony';
32
+ UPDATE columns SET pipeline_name = 'php-laravel' WHERE pipeline_name = 'PHP Laravel';
33
+ UPDATE columns SET pipeline_name = 'go' WHERE pipeline_name = 'Go';
34
+ UPDATE columns SET pipeline_name = 'rust' WHERE pipeline_name = 'Rust';
35
+
36
+ -- Re-enable foreign key constraints
37
+ PRAGMA foreign_keys = ON;
@@ -0,0 +1,16 @@
1
+ -- Migration: Remove numeric prefixes from column slugs
2
+ -- The order is now managed by the `index` field, making prefixes obsolete
3
+
4
+ -- Update column slugs: "00_backlog" -> "backlog", "02_splitter" -> "splitter"
5
+ UPDATE columns
6
+ SET slug = SUBSTR(slug, 4)
7
+ WHERE slug GLOB '[0-9][0-9]_*';
8
+
9
+ -- Update issue_history references if they store column slugs
10
+ UPDATE issue_history
11
+ SET from_column = SUBSTR(from_column, 4)
12
+ WHERE from_column GLOB '[0-9][0-9]_*';
13
+
14
+ UPDATE issue_history
15
+ SET to_column = SUBSTR(to_column, 4)
16
+ WHERE to_column GLOB '[0-9][0-9]_*';
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "sqlite"
@@ -0,0 +1,185 @@
1
+ // AutoCode - Prisma Schema
2
+ // Base de données SQLite par projet
3
+ // VERSION 2.0 - Pipelines Versionnés & Immuables
4
+
5
+ // Support multiple platforms for CLI distribution:
6
+ // native (build platform), debian/rhel/alpine Linux, macOS Intel/ARM, Windows
7
+ generator client {
8
+ provider = "prisma-client-js"
9
+ binaryTargets = ["native", "debian-openssl-3.0.x", "rhel-openssl-3.0.x", "linux-musl-openssl-3.0.x", "darwin", "darwin-arm64", "windows"]
10
+ }
11
+
12
+ datasource db {
13
+ provider = "sqlite"
14
+ }
15
+
16
+ // ═══════════════════════════════════════════════════════════════
17
+ // PIPELINES & COLUMNS - VERSIONNÉS ET IMMUABLES
18
+ // ═══════════════════════════════════════════════════════════════
19
+
20
+ model Pipeline {
21
+ name String // Partie de la clé composite
22
+ version Int // v1, v2, v3... (pas semver)
23
+ description String?
24
+ active Boolean @default(false)
25
+ draft Boolean @default(true) // Brouillon éditable ou verrouillé
26
+ createdAt DateTime @default(now()) @map("created_at")
27
+ createdFromVersion Int? @map("created_from_version") // Version source du brouillon
28
+
29
+ columns Column[]
30
+
31
+ @@id([name, version]) // Clé composite: nom + version
32
+ @@map("pipelines")
33
+ }
34
+
35
+ model Column {
36
+ id Int @id @default(autoincrement()) // ID stable pour références
37
+ slug String // "backlog", "testing-unit" (slug lisible)
38
+ name String // "Backlog", "Testing Unit"
39
+ index Int // Position 0, 1, 2...
40
+ segment String // 'definition' | 'action' | 'finish'
41
+ pipelineName String @map("pipeline_name")
42
+ pipelineVersion Int @map("pipeline_version")
43
+
44
+ pipeline Pipeline @relation(fields: [pipelineName, pipelineVersion], references: [name, version], onDelete: Cascade)
45
+ issues Issue[]
46
+ executionLogs ExecutionLog[]
47
+
48
+ @@unique([pipelineName, pipelineVersion, slug]) // Slug unique par version de pipeline
49
+ @@index([pipelineName, pipelineVersion])
50
+ @@index([index])
51
+ @@map("columns")
52
+ }
53
+
54
+ // ═══════════════════════════════════════════════════════════════
55
+ // ISSUES
56
+ // ═══════════════════════════════════════════════════════════════
57
+
58
+ model Issue {
59
+ key String @id // "AC-000001"
60
+ title String
61
+ description String? // Markdown
62
+ priority String @default("P2") // P0, P1, P2, P3
63
+ semver String @default("patch") // patch | minor | major
64
+ labels String @default("[]") // JSON array
65
+ lang String @default("fr") // 'fr' | 'en' - langue de l'utilisateur
66
+ columnId Int @map("column_id") // Référence stable par ID
67
+ parentKey String? @map("parent_key")
68
+ createdAt DateTime @default(now()) @map("created_at")
69
+ updatedAt DateTime @updatedAt @map("updated_at")
70
+
71
+ // Processing lock - prevents duplicate executions
72
+ processingColumnId Int? @map("processing_column_id")
73
+ processingStartedAt DateTime? @map("processing_started_at")
74
+ processingSessionId String? @map("processing_session_id")
75
+
76
+ column Column @relation(fields: [columnId], references: [id])
77
+ parent Issue? @relation("IssueHierarchy", fields: [parentKey], references: [key], onDelete: SetNull)
78
+ children Issue[] @relation("IssueHierarchy")
79
+ acceptanceCriteria AcceptanceCriterion[]
80
+ history IssueHistory[]
81
+ comments Comment[]
82
+ attachments Attachment[]
83
+ executionLogs ExecutionLog[]
84
+
85
+ @@index([columnId])
86
+ @@index([parentKey])
87
+ @@index([priority])
88
+ @@index([updatedAt(sort: Desc)])
89
+ @@map("issues")
90
+ }
91
+
92
+ model AcceptanceCriterion {
93
+ id Int @id @default(autoincrement())
94
+ issueKey String @map("issue_key")
95
+ criterion String
96
+ position Int
97
+
98
+ issue Issue @relation(fields: [issueKey], references: [key], onDelete: Cascade)
99
+
100
+ @@index([issueKey])
101
+ @@map("acceptance_criteria")
102
+ }
103
+
104
+ // ═══════════════════════════════════════════════════════════════
105
+ // HISTORY & EXECUTION
106
+ // ═══════════════════════════════════════════════════════════════
107
+
108
+ model IssueHistory {
109
+ id Int @id @default(autoincrement())
110
+ issueKey String @map("issue_key")
111
+ at DateTime
112
+ action String // 'created' | 'moved' | 'started' | 'forced' | 'edited' | 'blocked'
113
+ fromColumn String? @map("from_column") // Slug pour historique (texte)
114
+ toColumn String @map("to_column") // Slug pour historique (texte)
115
+ sessionId String? @map("session_id") // 8 chars hex
116
+ changes String? // JSON pour 'edited'
117
+ reason String? // Raison du blocage (pour action 'blocked')
118
+
119
+ issue Issue @relation(fields: [issueKey], references: [key], onDelete: Cascade)
120
+
121
+ @@index([issueKey])
122
+ @@index([sessionId])
123
+ @@index([at(sort: Desc)])
124
+ @@map("issue_history")
125
+ }
126
+
127
+ model ExecutionLog {
128
+ sessionId String @id @map("session_id") // 8 chars hex
129
+ issueKey String @map("issue_key")
130
+ columnId Int @map("column_id") // Référence par ID
131
+ prompt String? // Contenu du prompt
132
+ terminalLog String? @map("terminal_log") // Logs d'execution
133
+ createdAt DateTime @default(now()) @map("created_at")
134
+
135
+ issue Issue @relation(fields: [issueKey], references: [key], onDelete: Cascade)
136
+ column Column @relation(fields: [columnId], references: [id])
137
+
138
+ @@index([issueKey])
139
+ @@index([columnId])
140
+ @@map("execution_logs")
141
+ }
142
+
143
+ // ═══════════════════════════════════════════════════════════════
144
+ // COMMENTS & ATTACHMENTS
145
+ // ═══════════════════════════════════════════════════════════════
146
+
147
+ model Comment {
148
+ id String @id // Timestamp Unix en ms
149
+ issueKey String @map("issue_key")
150
+ content String
151
+ author String
152
+ createdAt DateTime @default(now()) @map("created_at")
153
+
154
+ issue Issue @relation(fields: [issueKey], references: [key], onDelete: Cascade)
155
+
156
+ @@index([issueKey])
157
+ @@index([createdAt(sort: Desc)])
158
+ @@map("comments")
159
+ }
160
+
161
+ model Attachment {
162
+ id Int @id @default(autoincrement())
163
+ issueKey String @map("issue_key")
164
+ filename String // Nom original
165
+ filepath String // Chemin relatif sur disque
166
+ mimetype String?
167
+ size Int? // Bytes
168
+ createdAt DateTime @default(now()) @map("created_at")
169
+
170
+ issue Issue @relation(fields: [issueKey], references: [key], onDelete: Cascade)
171
+
172
+ @@index([issueKey])
173
+ @@map("attachments")
174
+ }
175
+
176
+ // ═══════════════════════════════════════════════════════════════
177
+ // SEQUENCE (pour generation AC-XXXXXX)
178
+ // ═══════════════════════════════════════════════════════════════
179
+
180
+ model Sequence {
181
+ name String @id // 'issue_key'
182
+ currentValue Int @default(0) @map("current_value")
183
+
184
+ @@map("sequences")
185
+ }