prjct-cli 3.96.0 → 3.97.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 (503) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/bin/prjct.cjs +14 -0
  3. package/dist/bin/core-chunks/agent-HCP5FF77.mjs +31 -0
  4. package/dist/bin/core-chunks/agent-codenames-7N4DU62I.mjs +7 -0
  5. package/dist/bin/core-chunks/agent-identity-4KFRR5OU.mjs +7 -0
  6. package/dist/bin/core-chunks/agent-runtime-registry-3RMVBEV2.mjs +7 -0
  7. package/dist/bin/core-chunks/agent-switch-AVSX6SLY.mjs +7 -0
  8. package/dist/bin/core-chunks/agents-OAQXBGH3.mjs +10 -0
  9. package/dist/bin/core-chunks/ai-provider-RVXK7D7R.mjs +7 -0
  10. package/dist/bin/core-chunks/analysis-3A7ODSSI.mjs +41 -0
  11. package/dist/bin/core-chunks/auth-config-KWLVKHCY.mjs +7 -0
  12. package/dist/bin/core-chunks/auto-flush-EWSVMKQN.mjs +7 -0
  13. package/dist/bin/core-chunks/auto-updater-PKYQRBGQ.mjs +8 -0
  14. package/dist/bin/core-chunks/bin-commands-LLHG2NSY.mjs +21 -0
  15. package/dist/bin/core-chunks/capture-7LQ52T6L.mjs +7 -0
  16. package/dist/bin/core-chunks/capture-gate-M4HM7WAI.mjs +7 -0
  17. package/dist/bin/core-chunks/ceremonies-4OZ3FKRE.mjs +19 -0
  18. package/dist/bin/core-chunks/changelog-CUNVCEL5.mjs +10 -0
  19. package/dist/bin/core-chunks/chunk-225DWS4D.mjs +7 -0
  20. package/dist/bin/core-chunks/chunk-24EN5Y62.mjs +48 -0
  21. package/dist/bin/core-chunks/chunk-2EEMQV7N.mjs +9 -0
  22. package/dist/bin/core-chunks/chunk-2I5PUQWY.mjs +7 -0
  23. package/dist/bin/core-chunks/chunk-2JJM3YMW.mjs +44 -0
  24. package/dist/bin/core-chunks/chunk-2NI4EEK2.mjs +8 -0
  25. package/dist/bin/core-chunks/chunk-2TJRTFIS.mjs +9 -0
  26. package/dist/bin/core-chunks/chunk-2ZPM4Z6W.mjs +17 -0
  27. package/dist/bin/core-chunks/chunk-3FXNIJCS.mjs +8 -0
  28. package/dist/bin/core-chunks/chunk-3JD6KRNJ.mjs +8 -0
  29. package/dist/bin/core-chunks/chunk-3TRXQAU4.mjs +7 -0
  30. package/dist/bin/core-chunks/chunk-3USVY66O.mjs +7 -0
  31. package/dist/bin/core-chunks/chunk-45LKWJ5D.mjs +7 -0
  32. package/dist/bin/core-chunks/chunk-4IE7LRH3.mjs +7 -0
  33. package/dist/bin/core-chunks/chunk-4MR5XSLO.mjs +8 -0
  34. package/dist/bin/core-chunks/chunk-4PPIE6GA.mjs +102 -0
  35. package/dist/bin/core-chunks/chunk-4PRD4EU2.mjs +7 -0
  36. package/dist/bin/core-chunks/chunk-4T7NGLNQ.mjs +16 -0
  37. package/dist/bin/core-chunks/chunk-53ZPEZLU.mjs +8 -0
  38. package/dist/bin/core-chunks/chunk-56FW4P6U.mjs +10 -0
  39. package/dist/bin/core-chunks/chunk-5EF5EOCL.mjs +7 -0
  40. package/dist/bin/core-chunks/chunk-5MN22JFI.mjs +19 -0
  41. package/dist/bin/core-chunks/chunk-5ONMON5L.mjs +13 -0
  42. package/dist/bin/core-chunks/chunk-5UUITMRX.mjs +9 -0
  43. package/dist/bin/core-chunks/chunk-5YLI5V3Q.mjs +8 -0
  44. package/dist/bin/core-chunks/chunk-5YSPND5J.mjs +9 -0
  45. package/dist/bin/core-chunks/chunk-623SNKDH.mjs +7 -0
  46. package/dist/bin/core-chunks/chunk-6AFXUX2M.mjs +9 -0
  47. package/dist/bin/core-chunks/chunk-6FFOWWH2.mjs +17 -0
  48. package/dist/bin/core-chunks/chunk-6FUCOGOW.mjs +7 -0
  49. package/dist/bin/core-chunks/chunk-6OYLZ4NM.mjs +10 -0
  50. package/dist/bin/core-chunks/chunk-6P4GMVUZ.mjs +18 -0
  51. package/dist/bin/core-chunks/chunk-6RT2P22O.mjs +7 -0
  52. package/dist/bin/core-chunks/chunk-6XTLPAPZ.mjs +15 -0
  53. package/dist/bin/core-chunks/chunk-76YMLNLF.mjs +7 -0
  54. package/dist/bin/core-chunks/chunk-7CI4AMVO.mjs +7 -0
  55. package/dist/bin/core-chunks/chunk-7QMBIMEX.mjs +64 -0
  56. package/dist/bin/core-chunks/chunk-7QTE6X4J.mjs +7 -0
  57. package/dist/bin/core-chunks/chunk-7ZHWJSW5.mjs +8 -0
  58. package/dist/bin/core-chunks/chunk-AJTBFIH2.mjs +9 -0
  59. package/dist/bin/core-chunks/chunk-AJXELVNH.mjs +7 -0
  60. package/dist/bin/core-chunks/chunk-ANVCA6LF.mjs +7 -0
  61. package/dist/bin/core-chunks/chunk-AS3LWTQ4.mjs +16 -0
  62. package/dist/bin/core-chunks/chunk-B7AQHL7B.mjs +7 -0
  63. package/dist/bin/core-chunks/chunk-BQKDJ3U6.mjs +8 -0
  64. package/dist/bin/core-chunks/chunk-BSR3XUBD.mjs +24 -0
  65. package/dist/bin/core-chunks/chunk-BTCCUMKI.mjs +12 -0
  66. package/dist/bin/core-chunks/chunk-BTSHD3XJ.mjs +9 -0
  67. package/dist/bin/core-chunks/chunk-C35JQUWD.mjs +8 -0
  68. package/dist/bin/core-chunks/chunk-C7YBUD4K.mjs +10 -0
  69. package/dist/bin/core-chunks/chunk-CDLZLTRY.mjs +10 -0
  70. package/dist/bin/core-chunks/chunk-CEOTHJIY.mjs +10 -0
  71. package/dist/bin/core-chunks/chunk-CFD6CW7T.mjs +46 -0
  72. package/dist/bin/core-chunks/chunk-CKYBGRCF.mjs +8 -0
  73. package/dist/bin/core-chunks/chunk-CNWEQUB7.mjs +7 -0
  74. package/dist/bin/core-chunks/chunk-CUIB6CTG.mjs +20 -0
  75. package/dist/bin/core-chunks/chunk-CWLGRKA7.mjs +6 -0
  76. package/dist/bin/core-chunks/chunk-CXNVDJNN.mjs +7 -0
  77. package/dist/bin/core-chunks/chunk-D62TAZG6.mjs +9 -0
  78. package/dist/bin/core-chunks/chunk-DCVPNFS4.mjs +8 -0
  79. package/dist/bin/core-chunks/chunk-DEYAQEF5.mjs +7 -0
  80. package/dist/bin/core-chunks/chunk-DIEPWXJJ.mjs +7 -0
  81. package/dist/bin/core-chunks/chunk-DMO3ZFUG.mjs +1259 -0
  82. package/dist/bin/core-chunks/chunk-DN46DLU3.mjs +10 -0
  83. package/dist/bin/core-chunks/chunk-DOJPSIMG.mjs +7 -0
  84. package/dist/bin/core-chunks/chunk-DZVOFEM5.mjs +7 -0
  85. package/dist/bin/core-chunks/chunk-E5QQDYBR.mjs +7 -0
  86. package/dist/bin/core-chunks/chunk-E73HSXCX.mjs +7 -0
  87. package/dist/bin/core-chunks/chunk-EFSPBB4S.mjs +8 -0
  88. package/dist/bin/core-chunks/chunk-EHVU2SMR.mjs +34 -0
  89. package/dist/bin/core-chunks/chunk-ESB4ALH2.mjs +7 -0
  90. package/dist/bin/core-chunks/chunk-EZRNQXCC.mjs +7 -0
  91. package/dist/bin/core-chunks/chunk-F2FKQUYE.mjs +19 -0
  92. package/dist/bin/core-chunks/chunk-F7OOBAJO.mjs +30 -0
  93. package/dist/bin/core-chunks/chunk-FATYLG3L.mjs +14 -0
  94. package/dist/bin/core-chunks/chunk-FOWTB762.mjs +7 -0
  95. package/dist/bin/core-chunks/chunk-GDLAQV3Q.mjs +14 -0
  96. package/dist/bin/core-chunks/chunk-GGGDYL4P.mjs +7 -0
  97. package/dist/bin/core-chunks/chunk-GHSRH4GL.mjs +8 -0
  98. package/dist/bin/core-chunks/chunk-GOIBJ7PV.mjs +7 -0
  99. package/dist/bin/core-chunks/chunk-GSNQKBHZ.mjs +11 -0
  100. package/dist/bin/core-chunks/chunk-GTG67Z45.mjs +11 -0
  101. package/dist/bin/core-chunks/chunk-H2KNJUPN.mjs +23 -0
  102. package/dist/bin/core-chunks/chunk-HCPQZRR3.mjs +7 -0
  103. package/dist/bin/core-chunks/chunk-HEXSVBUP.mjs +8 -0
  104. package/dist/bin/core-chunks/chunk-HPCSSJXH.mjs +7 -0
  105. package/dist/bin/core-chunks/chunk-HU5ERAAV.mjs +8 -0
  106. package/dist/bin/core-chunks/chunk-HYIT7MF5.mjs +8 -0
  107. package/dist/bin/core-chunks/chunk-HYMJVHAX.mjs +13 -0
  108. package/dist/bin/core-chunks/chunk-ID2C2S33.mjs +18 -0
  109. package/dist/bin/core-chunks/chunk-ID5KE74L.mjs +7 -0
  110. package/dist/bin/core-chunks/chunk-IFLBZKKK.mjs +14 -0
  111. package/dist/bin/core-chunks/chunk-IMQCXC3R.mjs +30 -0
  112. package/dist/bin/core-chunks/chunk-INJ5WT2D.mjs +7 -0
  113. package/dist/bin/core-chunks/chunk-INM5COWM.mjs +7 -0
  114. package/dist/bin/core-chunks/chunk-IOFCSTGM.mjs +7 -0
  115. package/dist/bin/core-chunks/chunk-IVGWOY3U.mjs +8 -0
  116. package/dist/bin/core-chunks/chunk-J7T5IEFJ.mjs +15 -0
  117. package/dist/bin/core-chunks/chunk-JCWA7NLM.mjs +7 -0
  118. package/dist/bin/core-chunks/chunk-JPMUJY42.mjs +7 -0
  119. package/dist/bin/core-chunks/chunk-JT4RNQ67.mjs +15 -0
  120. package/dist/bin/core-chunks/chunk-K25HGTC3.mjs +10 -0
  121. package/dist/bin/core-chunks/chunk-KIRU4QFX.mjs +7 -0
  122. package/dist/bin/core-chunks/chunk-KKIJAEYU.mjs +7 -0
  123. package/dist/bin/core-chunks/chunk-KPR5TWSN.mjs +7 -0
  124. package/dist/bin/core-chunks/chunk-KUQLXY2P.mjs +11 -0
  125. package/dist/bin/core-chunks/chunk-KWC2PCPC.mjs +10 -0
  126. package/dist/bin/core-chunks/chunk-L4TUXFCL.mjs +7 -0
  127. package/dist/bin/core-chunks/chunk-L5LFLI4R.mjs +7 -0
  128. package/dist/bin/core-chunks/chunk-LZC6NGB6.mjs +50 -0
  129. package/dist/bin/core-chunks/chunk-MCY7OXED.mjs +10 -0
  130. package/dist/bin/core-chunks/chunk-MDONTD7O.mjs +21 -0
  131. package/dist/bin/core-chunks/chunk-MG3YN3AI.mjs +7 -0
  132. package/dist/bin/core-chunks/chunk-MR5XXHRK.mjs +8 -0
  133. package/dist/bin/core-chunks/chunk-MTDCRYLP.mjs +7 -0
  134. package/dist/bin/core-chunks/chunk-MXJKULJY.mjs +9 -0
  135. package/dist/bin/core-chunks/chunk-NINFE7GS.mjs +9 -0
  136. package/dist/bin/core-chunks/chunk-NNOX3UU4.mjs +7 -0
  137. package/dist/bin/core-chunks/chunk-NOHSLOLL.mjs +7 -0
  138. package/dist/bin/core-chunks/chunk-NXUIMC22.mjs +13 -0
  139. package/dist/bin/core-chunks/chunk-NZKUCQZK.mjs +8 -0
  140. package/dist/bin/core-chunks/chunk-O5N6XYPU.mjs +8 -0
  141. package/dist/bin/core-chunks/chunk-OIE3AKKO.mjs +7 -0
  142. package/dist/bin/core-chunks/chunk-OYXQRBVM.mjs +10 -0
  143. package/dist/bin/core-chunks/chunk-P2KU4FFA.mjs +11 -0
  144. package/dist/bin/core-chunks/chunk-P53YMOKR.mjs +7 -0
  145. package/dist/bin/core-chunks/chunk-PIA26GWG.mjs +7 -0
  146. package/dist/bin/core-chunks/chunk-PPERWRFS.mjs +13 -0
  147. package/dist/bin/core-chunks/chunk-PPSVWUXC.mjs +15 -0
  148. package/dist/bin/core-chunks/chunk-PWL3KS7Y.mjs +7 -0
  149. package/dist/bin/core-chunks/chunk-Q3LUL6LL.mjs +7 -0
  150. package/dist/bin/core-chunks/chunk-Q6C27OL7.mjs +7 -0
  151. package/dist/bin/core-chunks/chunk-QAIEAOJF.mjs +7 -0
  152. package/dist/bin/core-chunks/chunk-QLMZW4K7.mjs +7 -0
  153. package/dist/bin/core-chunks/chunk-QZ7T2EYR.mjs +25 -0
  154. package/dist/bin/core-chunks/chunk-R7LLMJDP.mjs +7 -0
  155. package/dist/bin/core-chunks/chunk-RACISWUV.mjs +10 -0
  156. package/dist/bin/core-chunks/chunk-RCIWCKL7.mjs +9 -0
  157. package/dist/bin/core-chunks/chunk-ROOCBUKH.mjs +8 -0
  158. package/dist/bin/core-chunks/chunk-RP7F67ZT.mjs +7 -0
  159. package/dist/bin/core-chunks/chunk-RXXXA7Z6.mjs +7 -0
  160. package/dist/bin/core-chunks/chunk-RXZJB43D.mjs +7 -0
  161. package/dist/bin/core-chunks/chunk-S6FBPXQL.mjs +9 -0
  162. package/dist/bin/core-chunks/chunk-SLYLGDX7.mjs +8 -0
  163. package/dist/bin/core-chunks/chunk-SO3ZPNWT.mjs +7 -0
  164. package/dist/bin/core-chunks/chunk-SRJEX6XF.mjs +12 -0
  165. package/dist/bin/core-chunks/chunk-SROBBOJB.mjs +11 -0
  166. package/dist/bin/core-chunks/chunk-TDTPDVUM.mjs +8 -0
  167. package/dist/bin/core-chunks/chunk-TGNZI4KF.mjs +28 -0
  168. package/dist/bin/core-chunks/chunk-TIBYHZFA.mjs +8 -0
  169. package/dist/bin/core-chunks/chunk-TILUQF6L.mjs +8 -0
  170. package/dist/bin/core-chunks/chunk-TTN2CFZC.mjs +7 -0
  171. package/dist/bin/core-chunks/chunk-U24YKPYX.mjs +7 -0
  172. package/dist/bin/core-chunks/chunk-U55OPVYR.mjs +9 -0
  173. package/dist/bin/core-chunks/chunk-UE3XKXWM.mjs +7 -0
  174. package/dist/bin/core-chunks/chunk-UHXV7MDW.mjs +12 -0
  175. package/dist/bin/core-chunks/chunk-UNNY2IWZ.mjs +9 -0
  176. package/dist/bin/core-chunks/chunk-UT425KVX.mjs +10 -0
  177. package/dist/bin/core-chunks/chunk-UYMZ3NAF.mjs +8 -0
  178. package/dist/bin/core-chunks/chunk-V3Y3G2DE.mjs +8 -0
  179. package/dist/bin/core-chunks/chunk-V5VCXMKO.mjs +52 -0
  180. package/dist/bin/core-chunks/chunk-V6L5PLD7.mjs +18 -0
  181. package/dist/bin/core-chunks/chunk-V7R3L54M.mjs +7 -0
  182. package/dist/bin/core-chunks/chunk-V7VA4EQX.mjs +7 -0
  183. package/dist/bin/core-chunks/chunk-VCSESVZ4.mjs +9 -0
  184. package/dist/bin/core-chunks/chunk-VCYVYFWE.mjs +9 -0
  185. package/dist/bin/core-chunks/chunk-VDXTMAMO.mjs +7 -0
  186. package/dist/bin/core-chunks/chunk-VILH3VYH.mjs +103 -0
  187. package/dist/bin/core-chunks/chunk-VRFYDYQY.mjs +7 -0
  188. package/dist/bin/core-chunks/chunk-VWFVSNQT.mjs +7 -0
  189. package/dist/bin/core-chunks/chunk-WGDE3L33.mjs +7 -0
  190. package/dist/bin/core-chunks/chunk-WP5IU4W4.mjs +7 -0
  191. package/dist/bin/core-chunks/chunk-WSVMQYYU.mjs +12 -0
  192. package/dist/bin/core-chunks/chunk-WTDUJB4I.mjs +8 -0
  193. package/dist/bin/core-chunks/chunk-WZXUFSVT.mjs +25 -0
  194. package/dist/bin/core-chunks/chunk-X35YYOFE.mjs +18 -0
  195. package/dist/bin/core-chunks/chunk-X4FR5S7E.mjs +9 -0
  196. package/dist/bin/core-chunks/chunk-XC6YAP36.mjs +7 -0
  197. package/dist/bin/core-chunks/chunk-XLFEWZRA.mjs +7 -0
  198. package/dist/bin/core-chunks/chunk-XPRLQIVQ.mjs +7 -0
  199. package/dist/bin/core-chunks/chunk-XSZG3CBO.mjs +7 -0
  200. package/dist/bin/core-chunks/chunk-XU3BQPBU.mjs +7 -0
  201. package/dist/bin/core-chunks/chunk-XYDLXF5A.mjs +8 -0
  202. package/dist/bin/core-chunks/chunk-Y5SEUYET.mjs +7 -0
  203. package/dist/bin/core-chunks/chunk-Y7XOKG4O.mjs +7 -0
  204. package/dist/bin/core-chunks/chunk-YEALP3WX.mjs +7 -0
  205. package/dist/bin/core-chunks/chunk-YJOC2JJK.mjs +12 -0
  206. package/dist/bin/core-chunks/chunk-YLYAYRSJ.mjs +8 -0
  207. package/dist/bin/core-chunks/chunk-YOGI4WE6.mjs +8 -0
  208. package/dist/bin/core-chunks/chunk-YQ6HM3YO.mjs +10 -0
  209. package/dist/bin/core-chunks/chunk-YZEO5DZA.mjs +7 -0
  210. package/dist/bin/core-chunks/chunk-ZBBNCCGV.mjs +12 -0
  211. package/dist/bin/core-chunks/chunk-ZHTYSYZC.mjs +7 -0
  212. package/dist/bin/core-chunks/chunk-ZK7BMUMR.mjs +7 -0
  213. package/dist/bin/core-chunks/chunk-ZKJZDOPT.mjs +14 -0
  214. package/dist/bin/core-chunks/chunk-ZQHSJ6FF.mjs +20 -0
  215. package/dist/bin/core-chunks/chunk-ZS7XJUPE.mjs +7 -0
  216. package/dist/bin/core-chunks/chunk-ZXTJLMVZ.mjs +7 -0
  217. package/dist/bin/core-chunks/cleanup-installs-WHXUGAHM.mjs +7 -0
  218. package/dist/bin/core-chunks/client-D43KKUYH.mjs +8 -0
  219. package/dist/bin/core-chunks/closest-command-YYNABM7V.mjs +7 -0
  220. package/dist/bin/core-chunks/cloud-FFUJZLDV.mjs +14 -0
  221. package/dist/bin/core-chunks/code-SU7GCPH6.mjs +12 -0
  222. package/dist/bin/core-chunks/code-graph-cloud-G3WQBICY.mjs +7 -0
  223. package/dist/bin/core-chunks/codex-hooks-GOLMCL2Q.mjs +7 -0
  224. package/dist/bin/core-chunks/codex-mcp-K4X2UIQF.mjs +7 -0
  225. package/dist/bin/core-chunks/codex-skill-3HNVU4T4.mjs +7 -0
  226. package/dist/bin/core-chunks/command-installer-XIQK2G6W.mjs +7 -0
  227. package/dist/bin/core-chunks/config-W3RHV3GK.mjs +8 -0
  228. package/dist/bin/core-chunks/config-manager-QVFHXIKI.mjs +7 -0
  229. package/dist/bin/core-chunks/content-bound-stamp-2PJNI4JC.mjs +7 -0
  230. package/dist/bin/core-chunks/context-4KGTUAC4.mjs +38 -0
  231. package/dist/bin/core-chunks/context-DDHC7VIC.mjs +10 -0
  232. package/dist/bin/core-chunks/context-checkpoint-4CEUPEVG.mjs +27 -0
  233. package/dist/bin/core-chunks/context-pressure-5URQVNBC.mjs +7 -0
  234. package/dist/bin/core-chunks/context-tiers-4S6H22NP.mjs +7 -0
  235. package/dist/bin/core-chunks/context7-service-AZWDYK5Z.mjs +7 -0
  236. package/dist/bin/core-chunks/core-PR5WEQCS.mjs +70 -0
  237. package/dist/bin/core-chunks/crew-JQCG6NS3.mjs +24 -0
  238. package/dist/bin/core-chunks/cursor-hooks-DGDJVAI6.mjs +7 -0
  239. package/dist/bin/core-chunks/custom-workflow-storage-EBEIG54R.mjs +7 -0
  240. package/dist/bin/core-chunks/cwd-changed-ODKZVSPB.mjs +7 -0
  241. package/dist/bin/core-chunks/cycle-budget-card-H37XRAIX.mjs +7 -0
  242. package/dist/bin/core-chunks/daemon-2NQTBFVR.mjs +13 -0
  243. package/dist/bin/core-chunks/database-UU2ZXSD4.mjs +7 -0
  244. package/dist/bin/core-chunks/delivery-geometry-GSJ6LXUC.mjs +7 -0
  245. package/dist/bin/core-chunks/detect-changes-2YIEX7AY.mjs +7 -0
  246. package/dist/bin/core-chunks/detection-KKDZYWVD.mjs +7 -0
  247. package/dist/bin/core-chunks/developer-evolution-AVAXGDKQ.mjs +11 -0
  248. package/dist/bin/core-chunks/developer-profile-MRPBWL2K.mjs +7 -0
  249. package/dist/bin/core-chunks/discuss-lock-CWXKBBYJ.mjs +7 -0
  250. package/dist/bin/core-chunks/distill-MLDZG5RA.mjs +7 -0
  251. package/dist/bin/core-chunks/doctor-heal-ZUZ2RHGY.mjs +7 -0
  252. package/dist/bin/core-chunks/doctor-service-WXLB2FEE.mjs +8 -0
  253. package/dist/bin/core-chunks/drift-refresh-XPJAO2B3.mjs +7 -0
  254. package/dist/bin/core-chunks/dynasty-outcomes-H2O546OL.mjs +11 -0
  255. package/dist/bin/core-chunks/editors-config-ELAQA6RV.mjs +7 -0
  256. package/dist/bin/core-chunks/embeddings-7A5Z5I67.mjs +7 -0
  257. package/dist/bin/core-chunks/enriched-recall-YXK7EIKH.mjs +7 -0
  258. package/dist/bin/core-chunks/eval-4YFUBFLV.mjs +76 -0
  259. package/dist/bin/core-chunks/exec-34V6SJYO.mjs +7 -0
  260. package/dist/bin/core-chunks/file-helper-LLQKU6YF.mjs +7 -0
  261. package/dist/bin/core-chunks/format-5V6GF6JJ.mjs +7 -0
  262. package/dist/bin/core-chunks/gemini-settings-ZTU3VQU3.mjs +7 -0
  263. package/dist/bin/core-chunks/git-context-ZSWE3KWM.mjs +8 -0
  264. package/dist/bin/core-chunks/git-helpers-UC53D4FT.mjs +7 -0
  265. package/dist/bin/core-chunks/grok-mcp-F3SRFMCW.mjs +7 -0
  266. package/dist/bin/core-chunks/grok-plugin-4CE2WUYI.mjs +7 -0
  267. package/dist/bin/core-chunks/grok-skill-GLSBOOKW.mjs +7 -0
  268. package/dist/bin/core-chunks/guard-FJBJ6IAE.mjs +13 -0
  269. package/dist/bin/core-chunks/guards-LFUFKVVH.mjs +7 -0
  270. package/dist/bin/core-chunks/handoff-storage-NGUA4Y2L.mjs +7 -0
  271. package/dist/bin/core-chunks/harness-FN3HASSA.mjs +43 -0
  272. package/dist/bin/core-chunks/health-W2VWME7Z.mjs +11 -0
  273. package/dist/bin/core-chunks/help-I37I3V2R.mjs +14 -0
  274. package/dist/bin/core-chunks/hooks-service-C2P5DRCH.mjs +91 -0
  275. package/dist/bin/core-chunks/infer-memory-file-ATP7PSAQ.mjs +7 -0
  276. package/dist/bin/core-chunks/install-XP4S6HWQ.mjs +9 -0
  277. package/dist/bin/core-chunks/judgment-GJE332LF.mjs +21 -0
  278. package/dist/bin/core-chunks/judgment-ledger-storage-ZTYXPMM4.mjs +7 -0
  279. package/dist/bin/core-chunks/judgment-orchestrator-E3SO3NVE.mjs +7 -0
  280. package/dist/bin/core-chunks/judgment-receipt-WT4EMCAV.mjs +7 -0
  281. package/dist/bin/core-chunks/kimi-hooks-2UEUIKXV.mjs +7 -0
  282. package/dist/bin/core-chunks/kimi-mcp-DJCXZ2JY.mjs +7 -0
  283. package/dist/bin/core-chunks/land-cue-5USQ64MS.mjs +8 -0
  284. package/dist/bin/core-chunks/land-rho-ISNVEPVC.mjs +8 -0
  285. package/dist/bin/core-chunks/land-synthesis-CHARJMUP.mjs +7 -0
  286. package/dist/bin/core-chunks/lean-L53CKZNH.mjs +34 -0
  287. package/dist/bin/core-chunks/legacy-crew-sweep-2TLKJTHI.mjs +23 -0
  288. package/dist/bin/core-chunks/living-context-contract-HZIVBMXX.mjs +7 -0
  289. package/dist/bin/core-chunks/llm-XMH7WTHV.mjs +18 -0
  290. package/dist/bin/core-chunks/mcp-FLVIZBV2.mjs +17 -0
  291. package/dist/bin/core-chunks/memory-dream-EJWI4FJO.mjs +14 -0
  292. package/dist/bin/core-chunks/memory-export-27HTNNFI.mjs +13 -0
  293. package/dist/bin/core-chunks/memory-index-BRZDZ2BY.mjs +7 -0
  294. package/dist/bin/core-chunks/notification-KJ4FQJAW.mjs +7 -0
  295. package/dist/bin/core-chunks/notify-76B7AICZ.mjs +9 -0
  296. package/dist/bin/core-chunks/nyquist-lite-A23B7G4B.mjs +9 -0
  297. package/dist/bin/core-chunks/one-breath-install-LVNIVN6S.mjs +7 -0
  298. package/dist/bin/core-chunks/opencode-mcp-5YSIYDI3.mjs +7 -0
  299. package/dist/bin/core-chunks/output-D27IOQXR.mjs +7 -0
  300. package/dist/bin/core-chunks/pack-integrity-GXN67LJB.mjs +9 -0
  301. package/dist/bin/core-chunks/pack-manager-46SPIPPD.mjs +7 -0
  302. package/dist/bin/core-chunks/package-DCGCOAGQ.mjs +7 -0
  303. package/dist/bin/core-chunks/package-legitimacy-VHHGI4P7.mjs +7 -0
  304. package/dist/bin/core-chunks/path-manager-E5DCU5LP.mjs +7 -0
  305. package/dist/bin/core-chunks/performance-tracker-BFBNR3LY.mjs +7 -0
  306. package/dist/bin/core-chunks/pi-skill-SDHTUK3V.mjs +7 -0
  307. package/dist/bin/core-chunks/planning-S3MYVWH6.mjs +8 -0
  308. package/dist/bin/core-chunks/post-edit-5YSNEMK7.mjs +7 -0
  309. package/dist/bin/core-chunks/pr-convention-37YHTUKM.mjs +7 -0
  310. package/dist/bin/core-chunks/pre-bash-GLDILCRF.mjs +10 -0
  311. package/dist/bin/core-chunks/pre-commit-U6HPPNIC.mjs +7 -0
  312. package/dist/bin/core-chunks/pre-edit-PEYQA6P6.mjs +8 -0
  313. package/dist/bin/core-chunks/pre-package-76JR5GLO.mjs +7 -0
  314. package/dist/bin/core-chunks/pre-search-5EHNUOP3.mjs +8 -0
  315. package/dist/bin/core-chunks/pre-secrets-RJELPDFY.mjs +7 -0
  316. package/dist/bin/core-chunks/precision-classifier-AV75OEVA.mjs +7 -0
  317. package/dist/bin/core-chunks/precision-judgment-MCX4MIIG.mjs +7 -0
  318. package/dist/bin/core-chunks/preferences-BTSYWYUM.mjs +31 -0
  319. package/dist/bin/core-chunks/primitives-IXAYLX7U.mjs +13 -0
  320. package/dist/bin/core-chunks/prjct-md-SUDFWDCS.mjs +7 -0
  321. package/dist/bin/core-chunks/product-KKGJ6MMF.mjs +68 -0
  322. package/dist/bin/core-chunks/project-agent-surfaces-I2CUZUIN.mjs +7 -0
  323. package/dist/bin/core-chunks/project-alignment-ADKW3ZWQ.mjs +17 -0
  324. package/dist/bin/core-chunks/project-file-inventory-XIHHJZUP.mjs +7 -0
  325. package/dist/bin/core-chunks/project-memory-GYLYIJQD.mjs +7 -0
  326. package/dist/bin/core-chunks/project-style-evolution-5W25UPPN.mjs +7 -0
  327. package/dist/bin/core-chunks/prompt-SW5XDRMX.mjs +23 -0
  328. package/dist/bin/core-chunks/protocol-4AJ4J5SI.mjs +7 -0
  329. package/dist/bin/core-chunks/provider-cache-IWVTFLGT.mjs +7 -0
  330. package/dist/bin/core-chunks/provider-status-HQUBKMH5.mjs +7 -0
  331. package/dist/bin/core-chunks/publish-helper-2T2EHM3V.mjs +7 -0
  332. package/dist/bin/core-chunks/purge-5EPJV25P.mjs +7 -0
  333. package/dist/bin/core-chunks/queue-storage-BKH5XX2E.mjs +7 -0
  334. package/dist/bin/core-chunks/registry-LK6IQ5UX.mjs +7 -0
  335. package/dist/bin/core-chunks/reliability-repair-JMPZWDD4.mjs +20 -0
  336. package/dist/bin/core-chunks/removed-verbs-EU3WPRNK.mjs +7 -0
  337. package/dist/bin/core-chunks/retention-S22T3SPT.mjs +7 -0
  338. package/dist/bin/core-chunks/retro-CLKOHAN6.mjs +13 -0
  339. package/dist/bin/core-chunks/review-risk-LLLBKUXT.mjs +12 -0
  340. package/dist/bin/core-chunks/run-recorder-EZQ32M55.mjs +7 -0
  341. package/dist/bin/core-chunks/safe-artifacts-RW5WQUUJ.mjs +9 -0
  342. package/dist/bin/core-chunks/sdd-HE7O6N5S.mjs +9 -0
  343. package/dist/bin/core-chunks/seed-JX7W53E5.mjs +10 -0
  344. package/dist/bin/core-chunks/self-heal-DFUEKNF3.mjs +7 -0
  345. package/dist/bin/core-chunks/session-continuity-BFSW4OL6.mjs +10 -0
  346. package/dist/bin/core-chunks/session-start-HVYUKJL2.mjs +7 -0
  347. package/dist/bin/core-chunks/session-tracker-RG2FBWMS.mjs +7 -0
  348. package/dist/bin/core-chunks/settings-installer-4XHM3HAZ.mjs +7 -0
  349. package/dist/bin/core-chunks/setup-GHS24ER5.mjs +140 -0
  350. package/dist/bin/core-chunks/setup-J4JFYT63.mjs +38 -0
  351. package/dist/bin/core-chunks/shipping-I4D4AVTE.mjs +12 -0
  352. package/dist/bin/core-chunks/signals-digest-V44KYN6Z.mjs +7 -0
  353. package/dist/bin/core-chunks/skill-adherence-MHY4BZL4.mjs +13 -0
  354. package/dist/bin/core-chunks/skill-generator-LKS5BNMY.mjs +7 -0
  355. package/dist/bin/core-chunks/skill-index-L4UWQCQE.mjs +11 -0
  356. package/dist/bin/core-chunks/spec-2XXPLHUZ.mjs +27 -0
  357. package/dist/bin/core-chunks/spec-context-inference-THFMXC7S.mjs +9 -0
  358. package/dist/bin/core-chunks/spec-inventory-2TT7BTFZ.mjs +9 -0
  359. package/dist/bin/core-chunks/spec-service-I23KJKKP.mjs +7 -0
  360. package/dist/bin/core-chunks/spec-task-breakdown-HTG6ME6G.mjs +7 -0
  361. package/dist/bin/core-chunks/state-storage-6CGFWW5D.mjs +7 -0
  362. package/dist/bin/core-chunks/stdin-spill-Y2A6WOOW.mjs +7 -0
  363. package/dist/bin/core-chunks/stop-2H57XCGZ.mjs +15 -0
  364. package/dist/bin/core-chunks/subagent-start-5LPASXOS.mjs +7 -0
  365. package/dist/bin/core-chunks/subagent-stop-ANLSG3KN.mjs +7 -0
  366. package/dist/bin/core-chunks/surface-attribution-WL7S53XX.mjs +7 -0
  367. package/dist/bin/core-chunks/symbol-graph-PCS43SHZ.mjs +7 -0
  368. package/dist/bin/core-chunks/sync-analyzer-M37Q4LE4.mjs +7 -0
  369. package/dist/bin/core-chunks/sync-client-6TAOTJWR.mjs +7 -0
  370. package/dist/bin/core-chunks/sync-cursor-storage-GKO4X2QN.mjs +18 -0
  371. package/dist/bin/core-chunks/task-orchestration-GS4J4KGS.mjs +7 -0
  372. package/dist/bin/core-chunks/task-overview-XSMK7YEN.mjs +7 -0
  373. package/dist/bin/core-chunks/task-service-FK7FC3PE.mjs +7 -0
  374. package/dist/bin/core-chunks/tdd-NQDHU62B.mjs +9 -0
  375. package/dist/bin/core-chunks/team-XZ4Q6UBV.mjs +42 -0
  376. package/dist/bin/core-chunks/template-loader-33OVJ4G5.mjs +7 -0
  377. package/dist/bin/core-chunks/token-backfill-WPXXD5MP.mjs +12 -0
  378. package/dist/bin/core-chunks/token-economics-JZAQJUET.mjs +7 -0
  379. package/dist/bin/core-chunks/transcript-jsonl-OC7TH4Q3.mjs +7 -0
  380. package/dist/bin/core-chunks/trust-boundary-24F662RM.mjs +7 -0
  381. package/dist/bin/core-chunks/uninstall-6NFON7FO.mjs +13 -0
  382. package/dist/bin/core-chunks/update-4IE6SA6M.mjs +11 -0
  383. package/dist/bin/core-chunks/update-checker-FK7MWNWN.mjs +7 -0
  384. package/dist/bin/core-chunks/usefulness-A3GRKFL3.mjs +7 -0
  385. package/dist/bin/core-chunks/user-home-BODIAXR4.mjs +7 -0
  386. package/dist/bin/core-chunks/vault-retire-notice-FDRT7BJG.mjs +8 -0
  387. package/dist/bin/core-chunks/velocity-storage-5T7RYOWH.mjs +7 -0
  388. package/dist/bin/core-chunks/verb-names-QWGYABFH.mjs +7 -0
  389. package/dist/bin/core-chunks/version-252QLBN2.mjs +7 -0
  390. package/dist/bin/core-chunks/watch-service-7ZERG7RC.mjs +9 -0
  391. package/dist/bin/core-chunks/weak-frontier-demo-5C4FR3OA.mjs +7 -0
  392. package/dist/bin/core-chunks/weak-model-mode-DH66XMD2.mjs +7 -0
  393. package/dist/bin/core-chunks/work-graph-JGJWE3AV.mjs +16 -0
  394. package/dist/bin/core-chunks/work-graph-WHMCFN6U.mjs +7 -0
  395. package/dist/bin/core-chunks/work-scope-3LXOEIUX.mjs +7 -0
  396. package/dist/bin/core-chunks/workflow-FGJVLRQ3.mjs +61 -0
  397. package/dist/bin/core-chunks/workflows-reference-UWKRZ6BJ.mjs +7 -0
  398. package/dist/bin/core-chunks/workspace-occupancy-JUXKZBUZ.mjs +7 -0
  399. package/dist/bin/core-chunks/worktree-service-YRRPFU57.mjs +11 -0
  400. package/dist/bin/core-chunks/world-model-impact-RH5WH2B3.mjs +7 -0
  401. package/dist/bin/hook-chunks/{agent-switch-I4MTVE56.mjs → agent-switch-7GOGG4KG.mjs} +1 -1
  402. package/dist/bin/hook-chunks/{analysis-VN7APBHR.mjs → analysis-UI2JRLJO.mjs} +2 -2
  403. package/dist/bin/hook-chunks/{auto-flush-DX3FVSQE.mjs → auto-flush-JKIXTI2I.mjs} +1 -1
  404. package/dist/bin/hook-chunks/{capture-gate-MEIQD7ZS.mjs → capture-gate-DIPHPNIC.mjs} +1 -1
  405. package/dist/bin/hook-chunks/chunk-25OGCQTR.mjs +69 -0
  406. package/dist/bin/hook-chunks/{chunk-OLQAMCYV.mjs → chunk-63P5VOR6.mjs} +5 -5
  407. package/dist/bin/hook-chunks/{chunk-EI6VQZOX.mjs → chunk-6LU777GI.mjs} +1 -1
  408. package/dist/bin/hook-chunks/chunk-6NMHVPAI.mjs +35 -0
  409. package/dist/bin/hook-chunks/{chunk-3AHW4XQH.mjs → chunk-6RS7PNAN.mjs} +1 -1
  410. package/dist/bin/hook-chunks/{chunk-ZZBNFNMG.mjs → chunk-6WDRJ7J7.mjs} +1 -1
  411. package/dist/bin/hook-chunks/{chunk-PVCEWFHS.mjs → chunk-7PA4KPSR.mjs} +2 -2
  412. package/dist/bin/hook-chunks/{chunk-EXVL2OFE.mjs → chunk-A6LRNS6R.mjs} +1 -1
  413. package/dist/bin/hook-chunks/{chunk-IJ523YO2.mjs → chunk-AEDB75AK.mjs} +1 -1
  414. package/dist/bin/hook-chunks/chunk-AFGXKRRP.mjs +12 -0
  415. package/dist/bin/hook-chunks/{chunk-LF3S3MYE.mjs → chunk-ANSRNEEI.mjs} +1 -1
  416. package/dist/bin/hook-chunks/{chunk-YLOK4WRR.mjs → chunk-B2ZA5ZAO.mjs} +1 -1
  417. package/dist/bin/hook-chunks/{chunk-KDNUQPAK.mjs → chunk-B7MHIUFA.mjs} +1 -1
  418. package/dist/bin/hook-chunks/{chunk-RT2DFIWF.mjs → chunk-F3PNT2DQ.mjs} +2 -2
  419. package/dist/bin/hook-chunks/{chunk-XYKVWO23.mjs → chunk-FBEDUKMG.mjs} +1 -1
  420. package/dist/bin/hook-chunks/{chunk-DB226JIV.mjs → chunk-GER6HFWV.mjs} +1 -1
  421. package/dist/bin/hook-chunks/{chunk-NLL5AV2G.mjs → chunk-HNZ24HIK.mjs} +2 -2
  422. package/dist/bin/hook-chunks/{chunk-LR24AIEW.mjs → chunk-IDPBMN3Q.mjs} +1 -1
  423. package/dist/bin/hook-chunks/{chunk-EGCYDLSO.mjs → chunk-IFIENAZU.mjs} +1 -1
  424. package/dist/bin/hook-chunks/{chunk-KV4NXLPT.mjs → chunk-IHEOOJJT.mjs} +1 -1
  425. package/dist/bin/hook-chunks/{chunk-H2DGDAQP.mjs → chunk-IL36ER4U.mjs} +1 -1
  426. package/dist/bin/hook-chunks/{chunk-33BHU4OM.mjs → chunk-JF6DFOQK.mjs} +1 -1
  427. package/dist/bin/hook-chunks/{chunk-LQLCYBFF.mjs → chunk-KOLXYWOA.mjs} +2 -2
  428. package/dist/bin/hook-chunks/{chunk-XV2LJVYB.mjs → chunk-MIJZT4ZR.mjs} +1 -1
  429. package/dist/bin/hook-chunks/{chunk-SWJ7TLBD.mjs → chunk-NMB6YSAH.mjs} +1 -1
  430. package/dist/bin/hook-chunks/{chunk-Y3RHBU2R.mjs → chunk-NSTXHVTH.mjs} +2 -2
  431. package/dist/bin/hook-chunks/{chunk-ADYTBOCZ.mjs → chunk-ONGVBXBD.mjs} +1 -1
  432. package/dist/bin/hook-chunks/{chunk-7PBWIO4K.mjs → chunk-PFORBQBF.mjs} +2 -2
  433. package/dist/bin/hook-chunks/{chunk-WL6PKX3U.mjs → chunk-PQJ64L6U.mjs} +1 -1
  434. package/dist/bin/hook-chunks/{chunk-FZS3XGEA.mjs → chunk-RLKYEL3F.mjs} +1 -1
  435. package/dist/bin/hook-chunks/{chunk-WJV24WE6.mjs → chunk-UBWUQ64A.mjs} +1 -1
  436. package/dist/bin/hook-chunks/{chunk-64ZEBHDX.mjs → chunk-UI25YRTY.mjs} +1 -1
  437. package/dist/bin/hook-chunks/{chunk-YHOZTAZH.mjs → chunk-V6GGH6H5.mjs} +1 -1
  438. package/dist/bin/hook-chunks/chunk-WIA6ORIY.mjs +16 -0
  439. package/dist/bin/hook-chunks/{chunk-UVATSTRF.mjs → chunk-XXVHUYL7.mjs} +1 -1
  440. package/dist/bin/hook-chunks/{chunk-E7NA34VQ.mjs → chunk-Y7RDBMNC.mjs} +1 -1
  441. package/dist/bin/hook-chunks/{chunk-JZDZH6IV.mjs → chunk-YATXTHDL.mjs} +1 -1
  442. package/dist/bin/hook-chunks/{chunk-DCHIPMOG.mjs → chunk-ZF2EVMY7.mjs} +1 -1
  443. package/dist/bin/hook-chunks/{chunk-MW54MTLB.mjs → chunk-ZH2MF7H7.mjs} +1 -1
  444. package/dist/bin/hook-chunks/{chunk-ZQI4TJ5C.mjs → chunk-ZXON2U5F.mjs} +1 -1
  445. package/dist/bin/hook-chunks/{codex-skill-6CRFUF3A.mjs → codex-skill-UZZCACMB.mjs} +1 -1
  446. package/dist/bin/hook-chunks/{command-installer-MUHZWDZA.mjs → command-installer-FJ73C2ZW.mjs} +1 -1
  447. package/dist/bin/hook-chunks/{config-manager-2JJPCLKC.mjs → config-manager-XDKOTIJM.mjs} +1 -1
  448. package/dist/bin/hook-chunks/{cwd-changed-UTD6Y4MS.mjs → cwd-changed-STP3LH6Y.mjs} +1 -1
  449. package/dist/bin/hook-chunks/{distill-5TNAM3LY.mjs → distill-63BHUJAC.mjs} +1 -1
  450. package/dist/bin/hook-chunks/{enriched-recall-6VOIUNLN.mjs → enriched-recall-6F6LBYAB.mjs} +1 -1
  451. package/dist/bin/hook-chunks/{format-IIOFTSBF.mjs → format-VJ2YQ4XQ.mjs} +1 -1
  452. package/dist/bin/hook-chunks/{judgment-receipt-QLV3MYFT.mjs → judgment-receipt-LSJCAYBT.mjs} +1 -1
  453. package/dist/bin/hook-chunks/{land-cue-57B23PEL.mjs → land-cue-DEO2AZW4.mjs} +1 -1
  454. package/dist/bin/hook-chunks/{land-synthesis-ZVPFJERV.mjs → land-synthesis-GTMFIGDM.mjs} +1 -1
  455. package/dist/bin/hook-chunks/{legacy-crew-sweep-GR6HRSHX.mjs → legacy-crew-sweep-QPKU7ITU.mjs} +2 -2
  456. package/dist/bin/hook-chunks/{memory-index-XE2MWKQS.mjs → memory-index-KCMXQGKX.mjs} +1 -1
  457. package/dist/bin/hook-chunks/{notification-GU2ZJP5K.mjs → notification-DX6ZHOUC.mjs} +1 -1
  458. package/dist/bin/hook-chunks/{pack-integrity-WV5U3AFF.mjs → pack-integrity-UMLIB5RQ.mjs} +1 -1
  459. package/dist/bin/hook-chunks/{pack-manager-QLFQKP24.mjs → pack-manager-YXRK2TJ4.mjs} +1 -1
  460. package/dist/bin/hook-chunks/{planning-VPAX5DZL.mjs → planning-JR7O5MYW.mjs} +2 -2
  461. package/dist/bin/hook-chunks/{post-edit-UXCFSR3Y.mjs → post-edit-IPTVSRVG.mjs} +1 -1
  462. package/dist/bin/hook-chunks/{pre-bash-MB4JNNYG.mjs → pre-bash-5WWTH36N.mjs} +1 -1
  463. package/dist/bin/hook-chunks/{pre-commit-U7TRFKWX.mjs → pre-commit-KZ5TNTPW.mjs} +1 -1
  464. package/dist/bin/hook-chunks/{pre-edit-MDCQXI5F.mjs → pre-edit-XHPYBXRU.mjs} +1 -1
  465. package/dist/bin/hook-chunks/{pre-package-A6ZI5R64.mjs → pre-package-U3HDW3SX.mjs} +1 -1
  466. package/dist/bin/hook-chunks/{pre-search-ZZO3LGXJ.mjs → pre-search-R5CRK66E.mjs} +1 -1
  467. package/dist/bin/hook-chunks/{prjct-md-MS52YLI2.mjs → prjct-md-IBQTJBK7.mjs} +1 -1
  468. package/dist/bin/hook-chunks/{project-agent-surfaces-6AIW7KL6.mjs → project-agent-surfaces-TPZO73ZV.mjs} +1 -1
  469. package/dist/bin/hook-chunks/{project-memory-UDH56VFP.mjs → project-memory-YQLZX5RG.mjs} +1 -1
  470. package/dist/bin/hook-chunks/{project-style-evolution-IJXT2MCP.mjs → project-style-evolution-NOFCIIZZ.mjs} +1 -1
  471. package/dist/bin/hook-chunks/{prompt-7VZLYONO.mjs → prompt-DJWONMTZ.mjs} +2 -2
  472. package/dist/bin/hook-chunks/{purge-N2WN6NDB.mjs → purge-5W3K2MZL.mjs} +1 -1
  473. package/dist/bin/hook-chunks/{retention-RET4P2RO.mjs → retention-GWJ4AX7I.mjs} +1 -1
  474. package/dist/bin/hook-chunks/{sdd-PB6WKSLE.mjs → sdd-GWBRD4KI.mjs} +1 -1
  475. package/dist/bin/hook-chunks/{session-continuity-BIJXMN44.mjs → session-continuity-VH645RGR.mjs} +1 -1
  476. package/dist/bin/hook-chunks/{session-start-R2VMKW2L.mjs → session-start-4TYTI27B.mjs} +1 -1
  477. package/dist/bin/hook-chunks/{setup-PPIZHVXS.mjs → setup-VF4UHUBX.mjs} +2 -2
  478. package/dist/bin/hook-chunks/{shipping-C637PCOF.mjs → shipping-2ULWBGRX.mjs} +4 -4
  479. package/dist/bin/hook-chunks/{spec-context-inference-RTTDOZZO.mjs → spec-context-inference-HVENYOIO.mjs} +1 -1
  480. package/dist/bin/hook-chunks/{spec-service-ENLAAMVL.mjs → spec-service-4XGQQPGP.mjs} +2 -2
  481. package/dist/bin/hook-chunks/{spec-task-breakdown-RUDEP3AY.mjs → spec-task-breakdown-JXF556UH.mjs} +1 -1
  482. package/dist/bin/hook-chunks/{state-storage-AJUPG7J5.mjs → state-storage-EMWLIFQJ.mjs} +1 -1
  483. package/dist/bin/hook-chunks/{stop-DPXAWJFN.mjs → stop-NJDYIIXR.mjs} +2 -2
  484. package/dist/bin/hook-chunks/{subagent-start-AFHPXL2S.mjs → subagent-start-2YMGD4SY.mjs} +1 -1
  485. package/dist/bin/hook-chunks/{subagent-stop-5BMV63ML.mjs → subagent-stop-4TZJ2NSJ.mjs} +1 -1
  486. package/dist/bin/hook-chunks/{surface-attribution-EGIKCVMF.mjs → surface-attribution-UNK4J5W2.mjs} +1 -1
  487. package/dist/bin/hook-chunks/{task-overview-F3GB77OA.mjs → task-overview-P3VRH2FD.mjs} +1 -1
  488. package/dist/bin/hook-chunks/{task-service-FZABHPFV.mjs → task-service-SPUES5DO.mjs} +1 -1
  489. package/dist/bin/hook-chunks/{tdd-TAMBOPN3.mjs → tdd-MYF7I5FS.mjs} +1 -1
  490. package/dist/bin/hook-chunks/{template-loader-MXOMU4XH.mjs → template-loader-4SYVR2UB.mjs} +1 -1
  491. package/dist/bin/hook-chunks/{weak-model-mode-BMSPGEQY.mjs → weak-model-mode-TYJJT6JJ.mjs} +1 -1
  492. package/dist/bin/hook-chunks/{work-scope-YCS4GTXW.mjs → work-scope-A6XPENFE.mjs} +1 -1
  493. package/dist/bin/hook-chunks/{workspace-occupancy-JOBYNNXV.mjs → workspace-occupancy-3NEAXILW.mjs} +1 -1
  494. package/dist/bin/prjct-core.mjs +9 -3323
  495. package/dist/bin/prjct-hooks.mjs +1 -1
  496. package/dist/bin/prjct.mjs +7 -1
  497. package/dist/daemon/entry.mjs +514 -513
  498. package/dist/mcp/server.mjs +234 -233
  499. package/package.json +3 -2
  500. package/dist/bin/hook-chunks/chunk-3UB6SFRA.mjs +0 -11
  501. package/dist/bin/hook-chunks/chunk-D7DQABWO.mjs +0 -35
  502. package/dist/bin/hook-chunks/chunk-M4YM7Z3F.mjs +0 -69
  503. package/dist/bin/hook-chunks/chunk-TB57OYGW.mjs +0 -16
@@ -0,0 +1,1259 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as U,c as W}from"./chunk-NNOX3UU4.mjs";import{F as h,G as Y}from"./chunk-HU5ERAAV.mjs";import{d as D,g as B}from"./chunk-225DWS4D.mjs";import{a as r,b as g,c as l,d as M}from"./chunk-3TRXQAU4.mjs";import P from"node:crypto";function R(e){let t=e.toLowerCase().replace(/\s+/g," ").trim();return P.createHash("sha256").update(t).digest("hex")}var C=l(()=>{"use strict";r(R,"memoryFingerprint")});var k,f=l(()=>{"use strict";k=`
8
+ -- =======================================================================
9
+ -- Document storage (backward-compatible with JSON file pattern)
10
+ -- =======================================================================
11
+ -- Each row replaces one JSON file (state.json, queue.json, etc.)
12
+ -- StorageManager reads/writes entire documents via key lookup.
13
+ CREATE TABLE kv_store (
14
+ key TEXT PRIMARY KEY,
15
+ data TEXT NOT NULL,
16
+ updated_at TEXT NOT NULL
17
+ );
18
+
19
+ -- =======================================================================
20
+ -- Normalized: Tasks
21
+ -- =======================================================================
22
+ CREATE TABLE tasks (
23
+ id TEXT PRIMARY KEY,
24
+ description TEXT NOT NULL,
25
+ type TEXT,
26
+ status TEXT NOT NULL,
27
+ parent_description TEXT,
28
+ branch TEXT,
29
+ linear_id TEXT,
30
+ linear_uuid TEXT,
31
+ session_id TEXT,
32
+ feature_id TEXT,
33
+ started_at TEXT NOT NULL,
34
+ completed_at TEXT,
35
+ shipped_at TEXT,
36
+ paused_at TEXT,
37
+ pause_reason TEXT,
38
+ pr_url TEXT,
39
+ expected_value TEXT,
40
+ data TEXT
41
+ );
42
+
43
+ CREATE INDEX idx_tasks_status ON tasks(status);
44
+ CREATE INDEX idx_tasks_type ON tasks(type);
45
+ CREATE INDEX idx_tasks_branch ON tasks(branch);
46
+ CREATE INDEX idx_tasks_linear_id ON tasks(linear_id);
47
+
48
+ -- =======================================================================
49
+ -- Normalized: Subtasks
50
+ -- =======================================================================
51
+ CREATE TABLE subtasks (
52
+ id TEXT PRIMARY KEY,
53
+ task_id TEXT NOT NULL,
54
+ description TEXT NOT NULL,
55
+ status TEXT NOT NULL,
56
+ domain TEXT,
57
+ agent TEXT,
58
+ sort_order INTEGER NOT NULL,
59
+ depends_on TEXT,
60
+ started_at TEXT,
61
+ completed_at TEXT,
62
+ output TEXT,
63
+ summary TEXT,
64
+ FOREIGN KEY (task_id) REFERENCES tasks(id)
65
+ );
66
+
67
+ CREATE INDEX idx_subtasks_task_id ON subtasks(task_id);
68
+ CREATE INDEX idx_subtasks_status ON subtasks(status);
69
+
70
+ -- =======================================================================
71
+ -- Normalized: Queue Tasks
72
+ -- =======================================================================
73
+ CREATE TABLE queue_tasks (
74
+ id TEXT PRIMARY KEY,
75
+ description TEXT NOT NULL,
76
+ type TEXT,
77
+ priority TEXT,
78
+ section TEXT,
79
+ created_at TEXT NOT NULL,
80
+ completed INTEGER DEFAULT 0,
81
+ completed_at TEXT,
82
+ feature_id TEXT,
83
+ feature_name TEXT
84
+ );
85
+
86
+ CREATE INDEX idx_queue_tasks_section ON queue_tasks(section);
87
+ CREATE INDEX idx_queue_tasks_priority ON queue_tasks(priority);
88
+ CREATE INDEX idx_queue_tasks_completed ON queue_tasks(completed);
89
+
90
+ -- =======================================================================
91
+ -- Normalized: Ideas
92
+ -- =======================================================================
93
+ CREATE TABLE ideas (
94
+ id TEXT PRIMARY KEY,
95
+ text TEXT NOT NULL,
96
+ status TEXT NOT NULL DEFAULT 'pending',
97
+ priority TEXT NOT NULL DEFAULT 'medium',
98
+ tags TEXT,
99
+ added_at TEXT NOT NULL,
100
+ converted_to TEXT,
101
+ details TEXT,
102
+ data TEXT
103
+ );
104
+
105
+ CREATE INDEX idx_ideas_status ON ideas(status);
106
+ CREATE INDEX idx_ideas_priority ON ideas(priority);
107
+
108
+ -- =======================================================================
109
+ -- Normalized: Shipped Features
110
+ -- =======================================================================
111
+ CREATE TABLE shipped_features (
112
+ id TEXT PRIMARY KEY,
113
+ name TEXT NOT NULL,
114
+ shipped_at TEXT NOT NULL,
115
+ version TEXT NOT NULL,
116
+ description TEXT,
117
+ type TEXT,
118
+ duration TEXT,
119
+ data TEXT
120
+ );
121
+
122
+ CREATE INDEX idx_shipped_version ON shipped_features(version);
123
+ CREATE INDEX idx_shipped_at ON shipped_features(shipped_at);
124
+
125
+ -- =======================================================================
126
+ -- Events (replaces events.jsonl)
127
+ -- =======================================================================
128
+ CREATE TABLE events (
129
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
130
+ type TEXT NOT NULL,
131
+ task_id TEXT,
132
+ data TEXT,
133
+ timestamp TEXT NOT NULL
134
+ );
135
+
136
+ CREATE INDEX idx_events_type ON events(type);
137
+ CREATE INDEX idx_events_task_id ON events(task_id);
138
+ CREATE INDEX idx_events_timestamp ON events(timestamp);
139
+
140
+ -- =======================================================================
141
+ -- Analysis (draft + sealed)
142
+ -- =======================================================================
143
+ CREATE TABLE analysis (
144
+ id TEXT PRIMARY KEY,
145
+ status TEXT NOT NULL,
146
+ commit_hash TEXT,
147
+ signature TEXT,
148
+ sealed_at TEXT,
149
+ analyzed_at TEXT,
150
+ data TEXT NOT NULL
151
+ );
152
+
153
+ -- =======================================================================
154
+ -- Index: File scores and checksums
155
+ -- =======================================================================
156
+ CREATE TABLE index_files (
157
+ path TEXT PRIMARY KEY,
158
+ score REAL,
159
+ size INTEGER,
160
+ mtime TEXT,
161
+ language TEXT,
162
+ categories TEXT,
163
+ domain TEXT
164
+ );
165
+
166
+ CREATE INDEX idx_index_files_domain ON index_files(domain);
167
+ CREATE INDEX idx_index_files_score ON index_files(score);
168
+
169
+ CREATE TABLE index_checksums (
170
+ path TEXT PRIMARY KEY,
171
+ checksum TEXT NOT NULL,
172
+ size INTEGER,
173
+ mtime TEXT
174
+ );
175
+
176
+ -- =======================================================================
177
+ -- Index: Metadata (project-index, domains, categories-cache)
178
+ -- =======================================================================
179
+ CREATE TABLE index_meta (
180
+ key TEXT PRIMARY KEY,
181
+ data TEXT NOT NULL,
182
+ updated_at TEXT NOT NULL
183
+ );
184
+
185
+ -- =======================================================================
186
+ -- Memory (key-value with domain tagging)
187
+ -- =======================================================================
188
+ CREATE TABLE memory (
189
+ key TEXT PRIMARY KEY,
190
+ domain TEXT,
191
+ value TEXT,
192
+ confidence REAL DEFAULT 1.0,
193
+ updated_at TEXT NOT NULL
194
+ );
195
+
196
+ CREATE INDEX idx_memory_domain ON memory(domain);
197
+
198
+ -- =======================================================================
199
+ -- Metrics: Daily stats for trend analysis
200
+ -- =======================================================================
201
+ CREATE TABLE metrics_daily (
202
+ date TEXT PRIMARY KEY,
203
+ tokens_saved INTEGER NOT NULL DEFAULT 0,
204
+ syncs INTEGER NOT NULL DEFAULT 0,
205
+ avg_compression_rate REAL NOT NULL DEFAULT 0,
206
+ total_duration INTEGER NOT NULL DEFAULT 0
207
+ );
208
+
209
+ -- =======================================================================
210
+ -- Velocity: Sprint data
211
+ -- =======================================================================
212
+ CREATE TABLE velocity_sprints (
213
+ sprint_number INTEGER PRIMARY KEY,
214
+ points_completed REAL NOT NULL DEFAULT 0,
215
+ tasks_completed INTEGER NOT NULL DEFAULT 0,
216
+ estimation_accuracy REAL NOT NULL DEFAULT 0,
217
+ avg_variance REAL NOT NULL DEFAULT 0,
218
+ started_at TEXT,
219
+ ended_at TEXT
220
+ );
221
+ `});function v(e){let t=e.split(`
222
+ `);return/^\[[^\]]+\]\s+Lesson:/i.test(t[0]??"")&&t.filter(n=>!/^Evidence:\s*/i.test(n.trim())).join(`
223
+ `).trim()||e}function q(e){try{let t=JSON.parse(e);if(typeof t.content!="string")return null;let s=v(t.content);return s===t.content?null:JSON.stringify({...t,content:s})}catch{return null}}var O,ne,F=l(()=>{"use strict";C();f();r(v,"stripLiteralFrictionEvidence");r(q,"scrubFrictionEventData");O=[{version:1,name:"initial-schema",up:r(e=>{e.run(k)},"up")},{version:2,name:"archives-table",up:r(e=>{e.run(`
224
+ -- =======================================================================
225
+ -- Archives: Stale data moved out of active storage (PRJ-267)
226
+ -- =======================================================================
227
+ CREATE TABLE archives (
228
+ id TEXT PRIMARY KEY,
229
+ entity_type TEXT NOT NULL,
230
+ entity_id TEXT NOT NULL,
231
+ entity_data TEXT NOT NULL,
232
+ summary TEXT,
233
+ archived_at TEXT NOT NULL,
234
+ reason TEXT NOT NULL
235
+ );
236
+
237
+ CREATE INDEX idx_archives_entity_type ON archives(entity_type);
238
+ CREATE INDEX idx_archives_archived_at ON archives(archived_at);
239
+ CREATE INDEX idx_archives_entity_id ON archives(entity_id);
240
+ `)},"up")},{version:3,name:"workflow-rules-table",up:r(e=>{e.run(`
241
+ -- =======================================================================
242
+ -- Workflow Rules: hooks, gates, and custom steps (Phase 2)
243
+ -- =======================================================================
244
+ CREATE TABLE workflow_rules (
245
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
246
+ type TEXT NOT NULL,
247
+ command TEXT NOT NULL,
248
+ position TEXT NOT NULL,
249
+ action TEXT NOT NULL,
250
+ description TEXT,
251
+ enabled INTEGER NOT NULL DEFAULT 1,
252
+ timeout_ms INTEGER NOT NULL DEFAULT 60000,
253
+ created_at TEXT NOT NULL,
254
+ sort_order INTEGER NOT NULL DEFAULT 0
255
+ );
256
+
257
+ CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
258
+ `)},"up")},{version:4,name:"custom-workflows-table",up:r(e=>{e.run(`
259
+ -- =======================================================================
260
+ -- Custom Workflows: User-defined workflows with agentic auto-config
261
+ -- =======================================================================
262
+ CREATE TABLE custom_workflows (
263
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
264
+ name TEXT UNIQUE NOT NULL,
265
+ description TEXT,
266
+ created_at TEXT NOT NULL,
267
+ updated_at TEXT NOT NULL,
268
+ is_builtin INTEGER NOT NULL DEFAULT 0,
269
+ enabled INTEGER NOT NULL DEFAULT 1,
270
+ metadata TEXT
271
+ );
272
+
273
+ CREATE INDEX idx_custom_workflows_name ON custom_workflows(name);
274
+ CREATE INDEX idx_custom_workflows_enabled ON custom_workflows(enabled);
275
+
276
+ -- Seed built-in workflows (task, done, ship, sync)
277
+ INSERT INTO custom_workflows (name, description, is_builtin, enabled, created_at, updated_at)
278
+ VALUES
279
+ ('task', 'Start a work cycle', 1, 1, datetime('now'), datetime('now')),
280
+ ('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
281
+ ('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
282
+ ('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
283
+ `)},"up")},{version:5,name:"llm-analysis-table",up:r(e=>{e.run(`
284
+ -- =======================================================================
285
+ -- LLM Analysis: Structured findings from hybrid sync pipeline
286
+ -- Pipeline: CLI (collect) \u2192 LLM (analyze) \u2192 CLI (store)
287
+ -- =======================================================================
288
+ CREATE TABLE llm_analysis (
289
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
290
+ commit_hash TEXT,
291
+ status TEXT NOT NULL DEFAULT 'active',
292
+ analysis TEXT NOT NULL,
293
+ analyzed_at TEXT NOT NULL,
294
+ superseded_at TEXT
295
+ );
296
+
297
+ CREATE INDEX idx_llm_analysis_status ON llm_analysis(status);
298
+ CREATE INDEX idx_llm_analysis_commit ON llm_analysis(commit_hash);
299
+ `)},"up")},{version:6,name:"context-feedback-table",up:r(e=>{e.run(`
300
+ -- =======================================================================
301
+ -- Context Feedback: RL loop for file suggestion improvement
302
+ -- Records suggested vs actual files per task for scoring boosts
303
+ -- =======================================================================
304
+ CREATE TABLE context_feedback (
305
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
306
+ task_id TEXT NOT NULL,
307
+ keywords TEXT NOT NULL,
308
+ suggested_files TEXT NOT NULL,
309
+ actual_files TEXT,
310
+ precision REAL,
311
+ recall REAL,
312
+ created_at TEXT NOT NULL,
313
+ completed_at TEXT
314
+ );
315
+
316
+ CREATE INDEX idx_cf_task ON context_feedback(task_id);
317
+ `)},"up")},{version:7,name:"sessions-table",up:r(e=>{e.run(`
318
+ -- =======================================================================
319
+ -- Sessions: Task lifecycle tracking (replaces current.json + archive/)
320
+ -- =======================================================================
321
+ CREATE TABLE sessions (
322
+ id TEXT PRIMARY KEY,
323
+ project_id TEXT NOT NULL,
324
+ task TEXT NOT NULL,
325
+ status TEXT NOT NULL,
326
+ started_at TEXT NOT NULL,
327
+ paused_at TEXT,
328
+ completed_at TEXT,
329
+ duration INTEGER NOT NULL DEFAULT 0,
330
+ metrics TEXT NOT NULL DEFAULT '{}',
331
+ timeline TEXT NOT NULL DEFAULT '[]'
332
+ );
333
+
334
+ CREATE INDEX idx_sessions_project ON sessions(project_id);
335
+ CREATE INDEX idx_sessions_status ON sessions(status);
336
+ CREATE INDEX idx_sessions_completed ON sessions(completed_at);
337
+ `)},"up")},{version:8,name:"task-token-tracking",up:r(e=>{e.run(`
338
+ -- =======================================================================
339
+ -- Token usage tracking per task (input + output)
340
+ -- =======================================================================
341
+ ALTER TABLE tasks ADD COLUMN tokens_in INTEGER DEFAULT 0;
342
+ ALTER TABLE tasks ADD COLUMN tokens_out INTEGER DEFAULT 0;
343
+ `)},"up")},{version:9,name:"context-health-tables",up:r(e=>{e.run(`
344
+ -- =======================================================================
345
+ -- Context Zone Events: Track zone transitions for health analytics
346
+ -- =======================================================================
347
+ CREATE TABLE context_zone_events (
348
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
349
+ project_id TEXT NOT NULL,
350
+ session_id TEXT,
351
+ zone_from TEXT NOT NULL,
352
+ zone_to TEXT NOT NULL,
353
+ usage_percent REAL NOT NULL,
354
+ action TEXT,
355
+ timestamp TEXT NOT NULL
356
+ );
357
+
358
+ CREATE INDEX idx_cze_project ON context_zone_events(project_id);
359
+
360
+ -- =======================================================================
361
+ -- Context Compactions: Track compaction events
362
+ -- =======================================================================
363
+ CREATE TABLE context_compactions (
364
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
365
+ project_id TEXT NOT NULL,
366
+ format TEXT NOT NULL DEFAULT 'standard',
367
+ original_turns INTEGER NOT NULL,
368
+ files_count INTEGER NOT NULL DEFAULT 0,
369
+ timestamp TEXT NOT NULL
370
+ );
371
+
372
+ CREATE INDEX idx_cc_project ON context_compactions(project_id);
373
+ `)},"up")},{version:10,name:"fts5-memories",up:r(e=>{e.run(`
374
+ -- =======================================================================
375
+ -- Memories: Tagged, searchable memory store (replaces memories.json)
376
+ -- =======================================================================
377
+ CREATE TABLE IF NOT EXISTS memories (
378
+ id TEXT PRIMARY KEY,
379
+ project_id TEXT NOT NULL,
380
+ title TEXT NOT NULL,
381
+ content TEXT NOT NULL,
382
+ tags TEXT,
383
+ topic_key TEXT,
384
+ content_hash TEXT,
385
+ user_triggered INTEGER NOT NULL DEFAULT 0,
386
+ revision_count INTEGER NOT NULL DEFAULT 1,
387
+ confidence TEXT,
388
+ observation_count INTEGER DEFAULT 0,
389
+ created_at TEXT NOT NULL,
390
+ updated_at TEXT NOT NULL,
391
+ deleted_at TEXT
392
+ );
393
+
394
+ CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
395
+ CREATE INDEX IF NOT EXISTS idx_memories_topic ON memories(topic_key);
396
+ CREATE INDEX IF NOT EXISTS idx_memories_hash ON memories(content_hash);
397
+ CREATE INDEX IF NOT EXISTS idx_memories_deleted ON memories(deleted_at);
398
+
399
+ -- FTS5 virtual table for full-text search with BM25 ranking
400
+ CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
401
+ title, content, tags,
402
+ content='memories', content_rowid='rowid'
403
+ );
404
+
405
+ -- Triggers to keep FTS index in sync
406
+ CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
407
+ INSERT INTO memories_fts(rowid, title, content, tags)
408
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
409
+ END;
410
+
411
+ CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
412
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
413
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
414
+ END;
415
+
416
+ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
417
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
418
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
419
+ INSERT INTO memories_fts(rowid, title, content, tags)
420
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
421
+ END;
422
+ `);try{let t=e.prepare("SELECT data FROM kv_store WHERE key = 'memory:memories'").get();if(t){let s=JSON.parse(t.data);if(s.memories&&s.memories.length>0){let n=e.prepare(`
423
+ INSERT OR IGNORE INTO memories
424
+ (id, project_id, title, content, tags, content_hash, user_triggered, confidence, observation_count, created_at, updated_at)
425
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
426
+ `);for(let a of s.memories)n.run(a.id,"_migrated",a.title,a.content,(a.tags||[]).join(","),null,a.userTriggered?1:0,a.confidence??null,a.observationCount??0,a.createdAt,a.updatedAt)}}}catch{}},"up")},{version:11,name:"agent-sessions",up:r(e=>{e.run(`
427
+ -- =======================================================================
428
+ -- Agent Sessions: Track AI agent work sessions across compactions
429
+ -- =======================================================================
430
+ CREATE TABLE IF NOT EXISTS agent_sessions (
431
+ id TEXT PRIMARY KEY,
432
+ project_id TEXT NOT NULL,
433
+ directory TEXT,
434
+ task_id TEXT,
435
+ goal TEXT,
436
+ started_at TEXT NOT NULL,
437
+ ended_at TEXT,
438
+ summary TEXT,
439
+ files_touched TEXT,
440
+ created_at TEXT NOT NULL
441
+ );
442
+
443
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_project ON agent_sessions(project_id);
444
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_task ON agent_sessions(task_id);
445
+
446
+ -- =======================================================================
447
+ -- User Prompts: Capture what the user asked (intent tracking)
448
+ -- =======================================================================
449
+ CREATE TABLE IF NOT EXISTS user_prompts (
450
+ id TEXT PRIMARY KEY,
451
+ project_id TEXT NOT NULL,
452
+ session_id TEXT,
453
+ content TEXT NOT NULL,
454
+ created_at TEXT NOT NULL
455
+ );
456
+
457
+ CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
458
+ CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
459
+ `);try{e.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")},{version:12,name:"task-body-and-comments",up:r(e=>{try{e.run("ALTER TABLE queue_tasks ADD COLUMN body TEXT")}catch{}e.run(`
460
+ CREATE TABLE IF NOT EXISTS queue_task_comments (
461
+ id TEXT PRIMARY KEY,
462
+ task_id TEXT NOT NULL,
463
+ author TEXT NOT NULL DEFAULT 'user',
464
+ content TEXT NOT NULL,
465
+ created_at TEXT NOT NULL,
466
+ updated_at TEXT NOT NULL
467
+ );
468
+
469
+ CREATE INDEX IF NOT EXISTS idx_qtc_task_id ON queue_task_comments(task_id);
470
+ `)},"up")},{version:13,name:"workflow-rules-v2",up:r(e=>{try{e.run("ALTER TABLE workflow_rules ADD COLUMN when_expr TEXT")}catch{}try{e.run("ALTER TABLE workflow_rules ADD COLUMN parallel INTEGER NOT NULL DEFAULT 1")}catch{}e.run(`
471
+ CREATE TABLE IF NOT EXISTS workflow_rule_cache (
472
+ rule_id INTEGER NOT NULL,
473
+ context_hash TEXT NOT NULL,
474
+ ran_at TEXT NOT NULL,
475
+ ttl_ms INTEGER NOT NULL DEFAULT 3600000,
476
+ PRIMARY KEY (rule_id, context_hash)
477
+ );
478
+
479
+ CREATE INDEX IF NOT EXISTS idx_wrc_rule ON workflow_rule_cache(rule_id);
480
+ `)},"up")},{version:14,name:"workflow-rules-trust-source",up:r(e=>{try{e.run("ALTER TABLE workflow_rules ADD COLUMN trust_source TEXT NOT NULL DEFAULT 'local'")}catch{}},"up")},{version:15,name:"disable-orphan-workflow-rules",up:r(e=>{let s=["pause","resume","reopen","next","dash","bug","idea","linear","jira","tokens","velocity","plan"].map(n=>`'${n}'`).join(",");e.run(`UPDATE workflow_rules SET enabled = 0 WHERE command IN (${s}) AND enabled = 1`)},"up")},{version:16,name:"specs-and-task-linkage",up:r(e=>{e.run(`
481
+ CREATE TABLE IF NOT EXISTS specs (
482
+ id TEXT PRIMARY KEY,
483
+ title TEXT NOT NULL,
484
+ status TEXT NOT NULL DEFAULT 'draft',
485
+ content TEXT NOT NULL,
486
+ tags TEXT,
487
+ created_at TEXT NOT NULL,
488
+ updated_at TEXT NOT NULL,
489
+ shipped_at TEXT,
490
+ shipped_pr INTEGER,
491
+ archived_at TEXT
492
+ );
493
+
494
+ CREATE INDEX IF NOT EXISTS idx_specs_status ON specs(status);
495
+ CREATE INDEX IF NOT EXISTS idx_specs_created ON specs(created_at);
496
+ `);try{e.run("ALTER TABLE tasks ADD COLUMN linked_spec_id TEXT"),e.run("CREATE INDEX IF NOT EXISTS idx_tasks_spec ON tasks(linked_spec_id)")}catch{}},"up")},{version:17,name:"sync-engine-wire-format",up:r(e=>{let t=[["server_event_id","INTEGER"],["entity_type","TEXT"],["entity_id","TEXT"],["event_type","TEXT"],["device_id","TEXT"],["origin_device_id","TEXT"],["content_hash","TEXT"],["revision_count","INTEGER NOT NULL DEFAULT 1"]];for(let[s,n]of t)try{e.run(`ALTER TABLE events ADD COLUMN ${s} ${n}`)}catch{}try{e.run("CREATE INDEX IF NOT EXISTS idx_events_server_id ON events(server_event_id)"),e.run("CREATE INDEX IF NOT EXISTS idx_events_entity ON events(entity_type, entity_id)"),e.run("CREATE INDEX IF NOT EXISTS idx_events_device ON events(device_id)")}catch{}e.run(`
497
+ CREATE TABLE IF NOT EXISTS sync_pending (
498
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
499
+ project_id TEXT NOT NULL,
500
+ entity_type TEXT,
501
+ entity_id TEXT,
502
+ event_type TEXT,
503
+ content_hash TEXT,
504
+ payload TEXT NOT NULL,
505
+ enqueued_at TEXT NOT NULL
506
+ );
507
+
508
+ CREATE INDEX IF NOT EXISTS idx_sync_pending_project ON sync_pending(project_id);
509
+ CREATE INDEX IF NOT EXISTS idx_sync_pending_entity ON sync_pending(entity_type, entity_id);
510
+ `),e.run(`
511
+ CREATE TABLE IF NOT EXISTS sync_cursors (
512
+ user_id TEXT,
513
+ device_id TEXT NOT NULL,
514
+ project_id TEXT NOT NULL,
515
+ last_event_id INTEGER NOT NULL DEFAULT 0,
516
+ updated_at TEXT NOT NULL,
517
+ PRIMARY KEY (user_id, device_id, project_id)
518
+ );
519
+
520
+ CREATE INDEX IF NOT EXISTS idx_sync_cursors_project ON sync_cursors(project_id);
521
+ `)},"up")},{version:18,name:"specs-shipped-sha",up:r(e=>{try{e.run("ALTER TABLE specs ADD COLUMN shipped_sha TEXT")}catch{}},"up")},{version:19,name:"sync-applied-hashes",up:r(e=>{e.run(`
522
+ CREATE TABLE IF NOT EXISTS sync_applied_hashes (
523
+ entity_type TEXT NOT NULL,
524
+ entity_id TEXT NOT NULL,
525
+ content_hash TEXT NOT NULL,
526
+ applied_at TEXT NOT NULL,
527
+ PRIMARY KEY (entity_type, entity_id)
528
+ );
529
+ `)},"up")},{version:20,name:"events-type-timestamp-index",up:r(e=>{e.run("CREATE INDEX IF NOT EXISTS idx_events_type_ts ON events(type, timestamp DESC)")},"up")},{version:21,name:"memories-type-and-fts-backfill",up:r(e=>{try{e.run("ALTER TABLE memories ADD COLUMN type TEXT")}catch{}try{e.run("ALTER TABLE memories ADD COLUMN provenance TEXT")}catch{}e.run(`
530
+ INSERT INTO memories
531
+ (id, project_id, title, content, tags, type, provenance, user_triggered,
532
+ created_at, updated_at)
533
+ SELECT
534
+ 'mem_' || e.id,
535
+ '_backfill',
536
+ substr(coalesce(json_extract(e.data, '$.content'), ''), 1, 80),
537
+ coalesce(json_extract(e.data, '$.content'), ''),
538
+ coalesce(json_extract(e.data, '$.tags'), '{}'),
539
+ substr(e.type, length('remember.') + 1),
540
+ coalesce(json_extract(e.data, '$.provenance'), 'declared'),
541
+ 0,
542
+ e.timestamp,
543
+ e.timestamp
544
+ FROM events e
545
+ WHERE e.type LIKE 'remember.%'
546
+ AND NOT EXISTS (SELECT 1 FROM memories m WHERE m.id = 'mem_' || e.id)
547
+ `)},"up")},{version:22,name:"memory-embeddings-store",up:r(e=>{e.run(`
548
+ CREATE TABLE IF NOT EXISTS memory_embeddings (
549
+ memory_id TEXT PRIMARY KEY,
550
+ vector BLOB NOT NULL,
551
+ model TEXT NOT NULL,
552
+ dims INTEGER NOT NULL,
553
+ created_at TEXT NOT NULL
554
+ )
555
+ `)},"up")},{version:23,name:"memory-usefulness-ledger",up:r(e=>{e.run(`
556
+ CREATE TABLE IF NOT EXISTS memory_usefulness (
557
+ memory_id TEXT PRIMARY KEY,
558
+ score REAL NOT NULL DEFAULT 0,
559
+ ref_count INTEGER NOT NULL DEFAULT 0,
560
+ fetch_count INTEGER NOT NULL DEFAULT 0,
561
+ last_used_at TEXT NOT NULL
562
+ )
563
+ `)},"up")},{version:24,name:"memory-surface-log",up:r(e=>{e.run(`
564
+ CREATE TABLE IF NOT EXISTS memory_surface_log (
565
+ memory_id TEXT NOT NULL,
566
+ task_id TEXT NOT NULL,
567
+ created_at TEXT NOT NULL,
568
+ PRIMARY KEY (memory_id, task_id)
569
+ )
570
+ `)},"up")},{version:25,name:"memory-dedup-content-hash",up:r(e=>{let t=r(E=>Number(String(E).replace(/^mem[_-]/i,""))||0,"numOf");try{let E=e.prepare("SELECT id, content, content_hash FROM memories").all(),T=e.prepare("UPDATE memories SET content_hash = ? WHERE id = ?");for(let N of E)N.content_hash||T.run(R(N.content??""),N.id);let i=e.prepare("SELECT id, type, content_hash FROM memories WHERE deleted_at IS NULL").all(),o=new Map;for(let N of i){if(!N.content_hash)continue;let m=`${N.type??""}::${N.content_hash}`,c=t(N.id),d=o.get(m);(d===void 0||c<d)&&o.set(m,c)}let _=new Date().toISOString(),L=e.prepare("UPDATE memories SET deleted_at = ? WHERE id = ?");for(let N of i){if(!N.content_hash)continue;let m=`${N.type??""}::${N.content_hash}`;o.get(m)!==t(N.id)&&L.run(_,N.id)}}catch{}let s=e.prepare(`SELECT id, type, json_extract(data, '$.content') AS content
571
+ FROM events WHERE type LIKE 'memory.remember.%' ORDER BY id ASC`).all(),n=new Set,a=e.prepare("DELETE FROM events WHERE id = ?");for(let E of s){if(E.content==null)continue;let T=`${E.type}::${R(E.content)}`;if(n.has(T)){a.run(E.id);continue}n.add(T)}},"up")},{version:26,name:"events-type-id-index",up:r(e=>{e.run("CREATE INDEX IF NOT EXISTS idx_events_type_id ON events(type, id DESC)")},"up")},{version:27,name:"events-file-tag-column",up:r(e=>{e.run(`
572
+ ALTER TABLE events ADD COLUMN file_tag TEXT GENERATED ALWAYS AS (
573
+ CASE
574
+ WHEN type LIKE 'memory.remember.%' AND json_valid(data)
575
+ THEN json_extract(data, '$.tags.file')
576
+ END
577
+ ) VIRTUAL
578
+ `),e.run("CREATE INDEX IF NOT EXISTS idx_events_file_tag ON events(file_tag) WHERE file_tag IS NOT NULL")},"up")},{version:28,name:"embedding-norms",up:r(e=>{e.run("ALTER TABLE memory_embeddings ADD COLUMN norm REAL");let t=e.prepare("SELECT memory_id, vector FROM memory_embeddings").all(),s=e.prepare("UPDATE memory_embeddings SET norm = ? WHERE memory_id = ?");for(let n of t){let a=Uint8Array.from(n.vector),T=new Float32Array(a.buffer,0,Math.floor(a.byteLength/4)).reduce((i,o)=>i+o*o,0);s.run(Math.sqrt(T),n.memory_id)}},"up")},{version:29,name:"fts5-prefix-indexes",up:r(e=>{e.run(`
579
+ DROP TRIGGER IF EXISTS memories_ai;
580
+ DROP TRIGGER IF EXISTS memories_ad;
581
+ DROP TRIGGER IF EXISTS memories_au;
582
+ DROP TABLE IF EXISTS memories_fts;
583
+
584
+ CREATE VIRTUAL TABLE memories_fts USING fts5(
585
+ title, content, tags,
586
+ content='memories', content_rowid='rowid',
587
+ prefix='2 3 4'
588
+ );
589
+
590
+ CREATE TRIGGER memories_ai AFTER INSERT ON memories BEGIN
591
+ INSERT INTO memories_fts(rowid, title, content, tags)
592
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
593
+ END;
594
+
595
+ CREATE TRIGGER memories_ad AFTER DELETE ON memories BEGIN
596
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
597
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
598
+ END;
599
+
600
+ CREATE TRIGGER memories_au AFTER UPDATE ON memories BEGIN
601
+ INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
602
+ VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
603
+ INSERT INTO memories_fts(rowid, title, content, tags)
604
+ VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
605
+ END;
606
+
607
+ INSERT INTO memories_fts(memories_fts) VALUES ('rebuild');
608
+ `)},"up")},{version:30,name:"perf-samples-table",up:r(e=>{e.run(`
609
+ CREATE TABLE IF NOT EXISTS perf_samples (
610
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
611
+ metric TEXT NOT NULL,
612
+ value REAL,
613
+ unit TEXT,
614
+ data TEXT NOT NULL,
615
+ timestamp TEXT NOT NULL
616
+ );
617
+
618
+ CREATE INDEX IF NOT EXISTS idx_perf_samples_metric ON perf_samples(metric);
619
+ CREATE INDEX IF NOT EXISTS idx_perf_samples_timestamp ON perf_samples(timestamp);
620
+ CREATE INDEX IF NOT EXISTS idx_perf_samples_metric_timestamp ON perf_samples(metric, timestamp DESC);
621
+ `)},"up")},{version:31,name:"per-file-code-indexes",up:r(e=>{e.run(`
622
+ CREATE TABLE IF NOT EXISTS bm25_documents (
623
+ path TEXT PRIMARY KEY,
624
+ tokens TEXT NOT NULL,
625
+ length INTEGER NOT NULL,
626
+ updated_at TEXT NOT NULL
627
+ );
628
+
629
+ CREATE TABLE IF NOT EXISTS bm25_terms (
630
+ token TEXT NOT NULL,
631
+ path TEXT NOT NULL,
632
+ tf INTEGER NOT NULL,
633
+ PRIMARY KEY (token, path)
634
+ );
635
+
636
+ CREATE INDEX IF NOT EXISTS idx_bm25_terms_path ON bm25_terms(path);
637
+
638
+ CREATE TABLE IF NOT EXISTS import_graph_edges (
639
+ from_path TEXT NOT NULL,
640
+ to_path TEXT NOT NULL,
641
+ sort_order INTEGER NOT NULL DEFAULT 0,
642
+ PRIMARY KEY (from_path, to_path)
643
+ );
644
+
645
+ CREATE INDEX IF NOT EXISTS idx_import_graph_edges_to ON import_graph_edges(to_path);
646
+ `)},"up")},{version:32,name:"import-graph-edge-sort-order",up:r(e=>{try{e.run("ALTER TABLE import_graph_edges ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0")}catch{}},"up")},{version:33,name:"task-pipeline-state",up:r(e=>{e.run(`
647
+ CREATE TABLE IF NOT EXISTS task_pipeline_state (
648
+ project_id TEXT NOT NULL,
649
+ task_id TEXT NOT NULL,
650
+ workspace_id TEXT NOT NULL,
651
+ classification TEXT NOT NULL,
652
+ station TEXT NOT NULL,
653
+ requires_spec INTEGER NOT NULL DEFAULT 0,
654
+ requires_tests_first INTEGER NOT NULL DEFAULT 0,
655
+ reason TEXT NOT NULL,
656
+ linked_spec_id TEXT,
657
+ created_at TEXT NOT NULL,
658
+ updated_at TEXT NOT NULL,
659
+ PRIMARY KEY (project_id, task_id, workspace_id)
660
+ );
661
+
662
+ CREATE INDEX IF NOT EXISTS idx_task_pipeline_state_workspace
663
+ ON task_pipeline_state(project_id, workspace_id, updated_at);
664
+ `)},"up")},{version:34,name:"retrieval-eval-labels",up:r(e=>{try{e.run("ALTER TABLE memory_surface_log ADD COLUMN query_text TEXT")}catch{}try{e.run("ALTER TABLE memory_surface_log ADD COLUMN surface TEXT")}catch{}e.run(`
665
+ CREATE TABLE IF NOT EXISTS retrieval_eval_labels (
666
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
667
+ query_text TEXT NOT NULL,
668
+ positive_id TEXT NOT NULL,
669
+ source TEXT NOT NULL,
670
+ source_task_id TEXT NOT NULL DEFAULT '',
671
+ created_at TEXT NOT NULL,
672
+ metadata TEXT NOT NULL DEFAULT '{}'
673
+ )
674
+ `),e.run(`
675
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_retrieval_eval_labels_unique
676
+ ON retrieval_eval_labels(source, source_task_id, positive_id, query_text)
677
+ `),e.run(`
678
+ CREATE INDEX IF NOT EXISTS idx_retrieval_eval_labels_created
679
+ ON retrieval_eval_labels(created_at)
680
+ `)},"up")},{version:35,name:"scrub-literal-friction-evidence",up:r(e=>{let t=e.prepare(`SELECT id, data FROM events
681
+ WHERE type = 'memory.remember.improvement-signal'
682
+ AND json_valid(data)
683
+ AND json_extract(data, '$.tags.source') = 'friction-detector'
684
+ AND json_extract(data, '$.content') LIKE '%Evidence:%'`).all(),s=e.prepare("UPDATE events SET data = ? WHERE id = ?");for(let n of t){let a=q(n.data);a&&s.run(a,n.id)}try{let n=e.prepare(`SELECT id, content FROM memories
685
+ WHERE type = 'improvement-signal'
686
+ AND json_extract(tags, '$.source') = 'friction-detector'
687
+ AND content LIKE '%Evidence:%'`).all(),a=e.prepare("UPDATE memories SET content = ?, content_hash = ?, updated_at = ? WHERE id = ?"),E=new Date().toISOString();for(let T of n){let i=v(T.content);i!==T.content&&a.run(i,R(i),E,T.id)}}catch{}},"up")},{version:36,name:"sync-applied-hashes-created-at",up:r(e=>{try{e.run("ALTER TABLE sync_applied_hashes ADD COLUMN created_at TEXT"),e.run("UPDATE sync_applied_hashes SET created_at = applied_at WHERE created_at IS NULL")}catch{}},"up")},{version:37,name:"schema-v2-tables",up:r(e=>{e.run(`
688
+ -- ===== Domain 1: Knowledge (authored memory) =====
689
+ CREATE TABLE IF NOT EXISTS memory_entries (
690
+ id TEXT PRIMARY KEY,
691
+ project_id TEXT NOT NULL,
692
+ type TEXT NOT NULL,
693
+ title TEXT,
694
+ content TEXT NOT NULL,
695
+ file TEXT,
696
+ subject TEXT,
697
+ provenance TEXT NOT NULL,
698
+ confidence REAL,
699
+ content_hash TEXT NOT NULL,
700
+ topic_key TEXT,
701
+ user_triggered INTEGER NOT NULL DEFAULT 0,
702
+ revision_count INTEGER NOT NULL DEFAULT 0,
703
+ created_at INTEGER NOT NULL,
704
+ updated_at INTEGER NOT NULL,
705
+ deleted_at INTEGER
706
+ );
707
+ CREATE INDEX IF NOT EXISTS ix_mem_recall ON memory_entries(project_id, type, created_at DESC) WHERE deleted_at IS NULL;
708
+ CREATE INDEX IF NOT EXISTS ix_mem_file ON memory_entries(file) WHERE file IS NOT NULL;
709
+ CREATE INDEX IF NOT EXISTS ix_mem_topic ON memory_entries(topic_key);
710
+ CREATE UNIQUE INDEX IF NOT EXISTS ux_mem_hash ON memory_entries(project_id, content_hash);
711
+
712
+ CREATE TABLE IF NOT EXISTS memory_entry_tags (
713
+ entry_id TEXT NOT NULL REFERENCES memory_entries(id) ON DELETE CASCADE,
714
+ key TEXT NOT NULL,
715
+ value TEXT NOT NULL,
716
+ is_machine INTEGER NOT NULL DEFAULT 0,
717
+ PRIMARY KEY (entry_id, key, value)
718
+ );
719
+ CREATE INDEX IF NOT EXISTS ix_tag_lookup ON memory_entry_tags(key, value) WHERE is_machine = 0;
720
+
721
+ CREATE TABLE IF NOT EXISTS memory_links (
722
+ from_entry_id TEXT NOT NULL REFERENCES memory_entries(id) ON DELETE CASCADE,
723
+ to_entry_id TEXT NOT NULL REFERENCES memory_entries(id) ON DELETE CASCADE,
724
+ relation TEXT NOT NULL,
725
+ PRIMARY KEY (from_entry_id, to_entry_id, relation)
726
+ );
727
+
728
+ -- ===== Domain 2: Synthesis (llm_analysis children) =====
729
+ CREATE TABLE IF NOT EXISTS analysis_finding (
730
+ id TEXT PRIMARY KEY,
731
+ analysis_id TEXT NOT NULL,
732
+ kind TEXT NOT NULL,
733
+ title TEXT NOT NULL,
734
+ detail TEXT,
735
+ severity TEXT,
736
+ sort_order INTEGER NOT NULL DEFAULT 0
737
+ );
738
+ CREATE INDEX IF NOT EXISTS ix_finding ON analysis_finding(analysis_id, kind, sort_order);
739
+ CREATE TABLE IF NOT EXISTS analysis_convention (id TEXT PRIMARY KEY, analysis_id TEXT NOT NULL, rule TEXT, sort_order INTEGER);
740
+ CREATE TABLE IF NOT EXISTS analysis_stack_item (id TEXT PRIMARY KEY, analysis_id TEXT NOT NULL, kind TEXT, name TEXT);
741
+ CREATE TABLE IF NOT EXISTS analysis_command (id TEXT PRIMARY KEY, analysis_id TEXT NOT NULL, name TEXT, command TEXT, purpose TEXT);
742
+ CREATE TABLE IF NOT EXISTS analysis_domain (id TEXT PRIMARY KEY, analysis_id TEXT NOT NULL, name TEXT, paths TEXT);
743
+
744
+ -- ===== Domain 3: Specs (children) =====
745
+ CREATE TABLE IF NOT EXISTS spec_acceptance_criterion (id TEXT PRIMARY KEY, spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, text TEXT, met INTEGER DEFAULT 0, sort_order INTEGER);
746
+ CREATE TABLE IF NOT EXISTS spec_scope (id TEXT PRIMARY KEY, spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, kind TEXT, item TEXT, sort_order INTEGER);
747
+ CREATE TABLE IF NOT EXISTS spec_risk (id TEXT PRIMARY KEY, spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, risk TEXT, mitigation TEXT, sort_order INTEGER);
748
+ CREATE TABLE IF NOT EXISTS spec_test_step (id TEXT PRIMARY KEY, spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, text TEXT, sort_order INTEGER);
749
+ CREATE TABLE IF NOT EXISTS spec_review (id TEXT PRIMARY KEY, spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, lens TEXT, verdict TEXT, notes TEXT, created_at INTEGER);
750
+ CREATE TABLE IF NOT EXISTS spec_selected_reviewer (spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, lens TEXT, PRIMARY KEY (spec_id, lens));
751
+ CREATE TABLE IF NOT EXISTS spec_linked_task (spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, task_id TEXT NOT NULL, PRIMARY KEY (spec_id, task_id));
752
+ CREATE TABLE IF NOT EXISTS spec_tag (spec_id TEXT NOT NULL REFERENCES specs(id) ON DELETE CASCADE, key TEXT, value TEXT, PRIMARY KEY (spec_id, key, value));
753
+
754
+ -- ===== Domain 4: Telemetry =====
755
+ CREATE TABLE IF NOT EXISTS agent_runs (
756
+ id TEXT PRIMARY KEY,
757
+ project_id TEXT NOT NULL,
758
+ parent_run_id TEXT REFERENCES agent_runs(id),
759
+ work_cycle_id TEXT,
760
+ linked_spec_id TEXT,
761
+ runtime TEXT,
762
+ model_id TEXT,
763
+ cli_version TEXT,
764
+ role TEXT,
765
+ agent_type TEXT,
766
+ status TEXT,
767
+ turns INTEGER,
768
+ started_at INTEGER,
769
+ ended_at INTEGER,
770
+ device_id TEXT,
771
+ created_at INTEGER
772
+ );
773
+ CREATE INDEX IF NOT EXISTS ix_runs_cycle ON agent_runs(work_cycle_id);
774
+ CREATE INDEX IF NOT EXISTS ix_runs_parent ON agent_runs(parent_run_id);
775
+
776
+ CREATE TABLE IF NOT EXISTS token_usage (
777
+ id TEXT PRIMARY KEY,
778
+ agent_run_id TEXT REFERENCES agent_runs(id) ON DELETE CASCADE,
779
+ work_cycle_id TEXT,
780
+ event_key TEXT NOT NULL,
781
+ source TEXT NOT NULL,
782
+ is_estimated INTEGER NOT NULL DEFAULT 0,
783
+ input_tokens INTEGER NOT NULL,
784
+ output_tokens INTEGER NOT NULL,
785
+ cache_read_tokens INTEGER DEFAULT 0,
786
+ cache_write_tokens INTEGER DEFAULT 0,
787
+ model_id TEXT,
788
+ measured_at INTEGER,
789
+ created_at INTEGER,
790
+ CHECK (input_tokens BETWEEN 0 AND 10000000 AND output_tokens BETWEEN 0 AND 10000000)
791
+ );
792
+ CREATE UNIQUE INDEX IF NOT EXISTS ux_token_event ON token_usage(event_key);
793
+ CREATE INDEX IF NOT EXISTS ix_token_cycle ON token_usage(work_cycle_id);
794
+
795
+ CREATE TABLE IF NOT EXISTS agent_artifact (
796
+ agent_run_id TEXT NOT NULL REFERENCES agent_runs(id) ON DELETE CASCADE,
797
+ path TEXT NOT NULL,
798
+ op TEXT NOT NULL,
799
+ count INTEGER,
800
+ PRIMARY KEY (agent_run_id, path, op)
801
+ );
802
+
803
+ -- ===== Domain 5/6: task/ship/idea children =====
804
+ CREATE TABLE IF NOT EXISTS subtask_dependency (subtask_id TEXT NOT NULL, depends_on TEXT NOT NULL, PRIMARY KEY (subtask_id, depends_on));
805
+ CREATE TABLE IF NOT EXISTS task_tag (task_id TEXT NOT NULL, key TEXT, value TEXT, PRIMARY KEY (task_id, key, value));
806
+ CREATE TABLE IF NOT EXISTS shipped_feature_tag (feature_id TEXT NOT NULL, key TEXT, value TEXT, PRIMARY KEY (feature_id, key, value));
807
+ CREATE TABLE IF NOT EXISTS idea_tag (idea_id TEXT NOT NULL, key TEXT, value TEXT, PRIMARY KEY (idea_id, key, value));
808
+
809
+ -- ===== Domain 9/10: observability + RL =====
810
+ CREATE TABLE IF NOT EXISTS entity_timeline (id TEXT PRIMARY KEY, project_id TEXT NOT NULL, entity_type TEXT, entity_id TEXT, event TEXT, at INTEGER, detail TEXT);
811
+ CREATE INDEX IF NOT EXISTS ix_timeline_entity ON entity_timeline(entity_type, entity_id);
812
+ CREATE TABLE IF NOT EXISTS context_feedback_keyword (feedback_id TEXT NOT NULL, keyword TEXT NOT NULL, PRIMARY KEY (feedback_id, keyword));
813
+ CREATE TABLE IF NOT EXISTS context_feedback_file (feedback_id TEXT NOT NULL, role TEXT NOT NULL, path TEXT NOT NULL, PRIMARY KEY (feedback_id, role, path));
814
+
815
+ -- ===== Domain 11: crew + team =====
816
+ CREATE TABLE IF NOT EXISTS crew_runs (id TEXT PRIMARY KEY, project_id TEXT NOT NULL, spec_id TEXT, task_id TEXT, implementer_summary TEXT, reviewer_notes TEXT, verdict TEXT, started_at INTEGER, ended_at INTEGER, created_at INTEGER);
817
+ CREATE TABLE IF NOT EXISTS crew_run_file (run_id TEXT NOT NULL REFERENCES crew_runs(id) ON DELETE CASCADE, path TEXT NOT NULL, op TEXT NOT NULL, PRIMARY KEY (run_id, path, op));
818
+ CREATE TABLE IF NOT EXISTS team_enrollment (project_id TEXT PRIMARY KEY, min_version TEXT, enrolled_at INTEGER, enrolled_by TEXT);
819
+
820
+ -- ===== Domain 13: workflows, gates & execution =====
821
+ CREATE TABLE IF NOT EXISTS workflows (id TEXT PRIMARY KEY, project_id TEXT NOT NULL, name TEXT, description TEXT, is_builtin INTEGER, enabled INTEGER, created_at INTEGER, updated_at INTEGER);
822
+ CREATE UNIQUE INDEX IF NOT EXISTS ux_workflows_name ON workflows(project_id, name);
823
+ CREATE TABLE IF NOT EXISTS workflow_config (workflow_id TEXT NOT NULL REFERENCES workflows(id) ON DELETE CASCADE, key TEXT, value TEXT, PRIMARY KEY (workflow_id, key));
824
+ CREATE TABLE IF NOT EXISTS workflow_rule_condition (rule_id TEXT NOT NULL, kind TEXT, op TEXT, key TEXT, value TEXT, PRIMARY KEY (rule_id, kind, key, value));
825
+ CREATE TABLE IF NOT EXISTS workflow_runs (id TEXT PRIMARY KEY, project_id TEXT NOT NULL, workflow_id TEXT, command TEXT, work_cycle_id TEXT, status TEXT NOT NULL, iteration INTEGER NOT NULL DEFAULT 0, max_iterations INTEGER, started_at INTEGER, ended_at INTEGER);
826
+ CREATE INDEX IF NOT EXISTS ix_wfruns_cycle ON workflow_runs(work_cycle_id);
827
+ CREATE TABLE IF NOT EXISTS workflow_run_step (id TEXT PRIMARY KEY, run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE, rule_id TEXT, seq INTEGER, status TEXT, attempt INTEGER NOT NULL DEFAULT 1, exit_code INTEGER, output TEXT, started_at INTEGER, ended_at INTEGER);
828
+ CREATE TABLE IF NOT EXISTS gate_evaluation (id TEXT PRIMARY KEY, run_id TEXT NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE, rule_id TEXT, passed INTEGER NOT NULL, reason TEXT, evaluated_at INTEGER);
829
+ `)},"up")},{version:38,name:"schema-v2-memory-backfill",up:r(e=>{try{e.run(`
830
+ INSERT OR IGNORE INTO memory_entries
831
+ (id, project_id, type, title, content, file, subject, provenance,
832
+ content_hash, user_triggered, revision_count, created_at, updated_at)
833
+ SELECT
834
+ id, project_id, type,
835
+ COALESCE(title, substr(content, 1, 80)),
836
+ content,
837
+ json_extract(tags, '$.file'),
838
+ json_extract(tags, '$.subject'),
839
+ COALESCE(provenance, 'declared'),
840
+ content_hash,
841
+ COALESCE(user_triggered, 0),
842
+ 0,
843
+ CAST(strftime('%s', created_at) AS INTEGER) * 1000,
844
+ CAST(strftime('%s', COALESCE(updated_at, created_at)) AS INTEGER) * 1000
845
+ FROM memories
846
+ WHERE deleted_at IS NULL
847
+ AND content IS NOT NULL
848
+ AND content_hash IS NOT NULL
849
+ AND created_at IS NOT NULL
850
+ `)}catch{}try{e.run(`
851
+ INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine)
852
+ SELECT me.id, je.key, je.value,
853
+ CASE WHEN je.key IN (
854
+ 'source','session','window_days','window-days','touches','occurrences',
855
+ 'phrase','slug','hash','content-hash','content_hash','key','kind',
856
+ 'spec-id','spec_id','from','origin','event','task-count','task_count',
857
+ 'context-schema','context_schema','synthesis','commit'
858
+ ) THEN 1 ELSE 0 END
859
+ FROM memories m
860
+ JOIN memory_entries me ON me.id = m.id
861
+ JOIN json_each(m.tags) je
862
+ WHERE m.tags IS NOT NULL
863
+ AND json_valid(m.tags)
864
+ AND substr(trim(m.tags), 1, 1) = '{'
865
+ AND je.value IS NOT NULL
866
+ `)}catch{}},"up")},{version:39,name:"schema-v2-events-backfill",up:r(e=>{try{e.run(`
867
+ INSERT OR IGNORE INTO memory_entries
868
+ (id, project_id, type, title, content, file, subject, provenance,
869
+ content_hash, user_triggered, revision_count, created_at, updated_at)
870
+ SELECT
871
+ 'mem_' || e.id,
872
+ (SELECT project_id FROM memories WHERE project_id IS NOT NULL LIMIT 1),
873
+ substr(e.type, length('memory.remember.') + 1),
874
+ substr(json_extract(e.data, '$.content'), 1, 80),
875
+ json_extract(e.data, '$.content'),
876
+ json_extract(e.data, '$.tags.file'),
877
+ json_extract(e.data, '$.tags.subject'),
878
+ COALESCE(json_extract(e.data, '$.provenance'), 'declared'),
879
+ 'evt_' || e.id,
880
+ 0, 0,
881
+ CAST(strftime('%s', e.timestamp) AS INTEGER) * 1000,
882
+ CAST(strftime('%s', e.timestamp) AS INTEGER) * 1000
883
+ FROM events e
884
+ WHERE e.type >= 'memory.remember.' AND e.type < 'memory.remember/'
885
+ AND json_valid(e.data)
886
+ AND json_extract(e.data, '$.content') IS NOT NULL
887
+ AND (SELECT project_id FROM memories WHERE project_id IS NOT NULL LIMIT 1) IS NOT NULL
888
+ ORDER BY e.id DESC
889
+ `)}catch{}try{e.run(`
890
+ INSERT OR IGNORE INTO token_usage
891
+ (id, work_cycle_id, event_key, source, is_estimated, input_tokens,
892
+ output_tokens, model_id, measured_at, created_at)
893
+ SELECT
894
+ COALESCE(e.task_id, json_extract(e.data, '$.taskId')) || ':migrated',
895
+ COALESCE(e.task_id, json_extract(e.data, '$.taskId')),
896
+ COALESCE(e.task_id, json_extract(e.data, '$.taskId')) || ':migrated',
897
+ 'migrated',
898
+ COALESCE(json_extract(e.data, '$.isEstimated'), 0),
899
+ json_extract(e.data, '$.tokensIn'),
900
+ json_extract(e.data, '$.tokensOut'),
901
+ json_extract(e.data, '$.model'),
902
+ CAST(strftime('%s', e.timestamp) AS INTEGER) * 1000,
903
+ CAST(strftime('%s', e.timestamp) AS INTEGER) * 1000
904
+ FROM events e
905
+ WHERE e.type = 'memory.task_tokens'
906
+ AND json_valid(e.data)
907
+ AND json_extract(e.data, '$.tokensIn') IS NOT NULL
908
+ AND COALESCE(e.task_id, json_extract(e.data, '$.taskId')) IS NOT NULL
909
+ ORDER BY e.id DESC
910
+ `)}catch{}},"up")},{version:40,name:"schema-v2-memory-entries-trigger",up:r(e=>{e.run(`
911
+ CREATE TRIGGER IF NOT EXISTS memory_entries_from_events
912
+ AFTER INSERT ON events
913
+ WHEN NEW.type >= 'memory.remember.' AND NEW.type < 'memory.remember/'
914
+ AND json_valid(NEW.data)
915
+ AND json_extract(NEW.data, '$.content') IS NOT NULL
916
+ BEGIN
917
+ INSERT OR IGNORE INTO memory_entries
918
+ (id, project_id, type, title, content, file, subject, provenance,
919
+ content_hash, user_triggered, revision_count, created_at, updated_at)
920
+ VALUES (
921
+ 'mem_' || NEW.id,
922
+ COALESCE((SELECT project_id FROM memories WHERE project_id IS NOT NULL LIMIT 1), 'local'),
923
+ substr(NEW.type, length('memory.remember.') + 1),
924
+ substr(json_extract(NEW.data, '$.content'), 1, 80),
925
+ json_extract(NEW.data, '$.content'),
926
+ json_extract(NEW.data, '$.tags.file'),
927
+ json_extract(NEW.data, '$.tags.subject'),
928
+ COALESCE(json_extract(NEW.data, '$.provenance'), 'declared'),
929
+ 'evt_' || NEW.id,
930
+ 0, 0,
931
+ CAST(strftime('%s', NEW.timestamp) AS INTEGER) * 1000,
932
+ CAST(strftime('%s', NEW.timestamp) AS INTEGER) * 1000
933
+ );
934
+ INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine)
935
+ SELECT 'mem_' || NEW.id, je.key, je.value,
936
+ CASE WHEN je.key IN (
937
+ 'source','session','window_days','window-days','touches','occurrences',
938
+ 'phrase','slug','hash','content-hash','content_hash','key','kind',
939
+ 'spec-id','spec_id','from','origin','event','task-count','task_count',
940
+ 'context-schema','context_schema','synthesis','commit'
941
+ ) THEN 1 ELSE 0 END
942
+ FROM json_each(COALESCE(json_extract(NEW.data, '$.tags'), '{}')) je
943
+ WHERE je.value IS NOT NULL AND je.type != 'object' AND je.type != 'array';
944
+ END;
945
+ `)},"up")},{version:41,name:"schema-v2-memory-entries-correctness",up:r(e=>{let t=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id","from","origin","event","task-count","task_count","context-schema","context_schema","synthesis","commit"]);try{e.run("DROP TRIGGER IF EXISTS memory_entries_from_events")}catch{}try{e.run("DELETE FROM memory_entry_tags")}catch{}try{e.run("DELETE FROM memory_entries")}catch{}try{e.run("DROP INDEX IF EXISTS ux_mem_hash")}catch{}try{e.run("CREATE UNIQUE INDEX IF NOT EXISTS ux_mem_hash ON memory_entries(project_id, content_hash, type)")}catch{}let s=(()=>{try{return e.prepare("SELECT project_id FROM memories WHERE project_id IS NOT NULL LIMIT 1").get()?.project_id??"local"}catch{return"local"}})(),n=(()=>{try{return e.prepare("SELECT id, type, data, timestamp FROM events WHERE type >= 'memory.remember.' AND type < 'memory.remember/' ORDER BY id ASC").all()}catch{return[]}})(),a=e.prepare(`INSERT OR IGNORE INTO memory_entries
946
+ (id, project_id, type, title, content, file, subject, provenance,
947
+ content_hash, user_triggered, revision_count, created_at, updated_at)
948
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, ?, ?)`),E=e.prepare("INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine) VALUES (?, ?, ?, ?)");for(let T of n){let i=(()=>{try{return JSON.parse(T.data)}catch{return null}})();if(!i)continue;let o=i.content;if(typeof o!="string"||!o)continue;let _=`mem_${T.id}`,L=String(T.type).slice(16),N=i.tags&&typeof i.tags=="object"&&!Array.isArray(i.tags)?i.tags:{},m=typeof i.content_hash=="string"?i.content_hash:R(o),c=typeof i.project_id=="string"?i.project_id:s,d=(typeof i.created_at=="string"?Date.parse(i.created_at):NaN)||Date.parse(T.timestamp)||0;try{a.run(_,c,L,o.split(`
949
+ `)[0].slice(0,80),o,typeof N.file=="string"?N.file:null,typeof N.subject=="string"?N.subject:null,typeof i.provenance=="string"?i.provenance:"declared",m,d,d);for(let[u,p]of Object.entries(N))p!=null&&E.run(_,u,String(p),t.has(u)?1:0)}catch{}}e.run(`
950
+ CREATE TRIGGER IF NOT EXISTS memory_entries_from_events
951
+ AFTER INSERT ON events
952
+ WHEN NEW.type >= 'memory.remember.' AND NEW.type < 'memory.remember/'
953
+ AND json_valid(NEW.data)
954
+ AND json_extract(NEW.data, '$.content') IS NOT NULL
955
+ BEGIN
956
+ INSERT OR IGNORE INTO memory_entries
957
+ (id, project_id, type, title, content, file, subject, provenance,
958
+ content_hash, user_triggered, revision_count, created_at, updated_at)
959
+ VALUES (
960
+ 'mem_' || NEW.id,
961
+ COALESCE(json_extract(NEW.data, '$.project_id'),
962
+ (SELECT project_id FROM memories WHERE project_id IS NOT NULL LIMIT 1),
963
+ 'local'),
964
+ substr(NEW.type, length('memory.remember.') + 1),
965
+ substr(json_extract(NEW.data, '$.content'), 1, 80),
966
+ json_extract(NEW.data, '$.content'),
967
+ json_extract(NEW.data, '$.tags.file'),
968
+ json_extract(NEW.data, '$.tags.subject'),
969
+ COALESCE(json_extract(NEW.data, '$.provenance'), 'declared'),
970
+ COALESCE(json_extract(NEW.data, '$.content_hash'), 'evt_' || NEW.id),
971
+ 0, 0,
972
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER),
973
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER)
974
+ );
975
+ INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine)
976
+ SELECT 'mem_' || NEW.id, je.key, je.value,
977
+ CASE WHEN je.key IN (
978
+ 'source','session','window_days','window-days','touches','occurrences',
979
+ 'phrase','slug','hash','content-hash','content_hash','key','kind',
980
+ 'spec-id','spec_id','from','origin','event','task-count','task_count',
981
+ 'context-schema','context_schema','synthesis','commit'
982
+ ) THEN 1 ELSE 0 END
983
+ FROM json_each(COALESCE(json_extract(NEW.data, '$.tags'), '{}')) je
984
+ WHERE je.value IS NOT NULL AND je.type != 'object' AND je.type != 'array';
985
+ END;
986
+ `)},"up")},{version:42,name:"schema-v2-memory-entries-fts",up:r(e=>{try{e.run("CREATE VIRTUAL TABLE IF NOT EXISTS memory_entries_fts USING fts5(content, title, content='memory_entries', content_rowid='rowid')"),e.run(`
987
+ CREATE TRIGGER IF NOT EXISTS memory_entries_fts_ai AFTER INSERT ON memory_entries BEGIN
988
+ INSERT INTO memory_entries_fts(rowid, content, title) VALUES (new.rowid, new.content, new.title);
989
+ END;
990
+ `),e.run(`
991
+ CREATE TRIGGER IF NOT EXISTS memory_entries_fts_ad AFTER DELETE ON memory_entries BEGIN
992
+ INSERT INTO memory_entries_fts(memory_entries_fts, rowid, content, title) VALUES('delete', old.rowid, old.content, old.title);
993
+ END;
994
+ `),e.run(`
995
+ CREATE TRIGGER IF NOT EXISTS memory_entries_fts_au AFTER UPDATE ON memory_entries BEGIN
996
+ INSERT INTO memory_entries_fts(memory_entries_fts, rowid, content, title) VALUES('delete', old.rowid, old.content, old.title);
997
+ INSERT INTO memory_entries_fts(rowid, content, title) VALUES (new.rowid, new.content, new.title);
998
+ END;
999
+ `),e.run("INSERT INTO memory_entries_fts(memory_entries_fts) VALUES('rebuild')")}catch{}},"up")},{version:43,name:"schema-v2-token-usage-description",up:r(e=>{try{e.run("ALTER TABLE token_usage ADD COLUMN description TEXT")}catch{}},"up")},{version:44,name:"schema-v2-drop-unused-tables",up:r(e=>{let t=["DROP TABLE IF EXISTS spec_acceptance_criterion","DROP TABLE IF EXISTS spec_scope","DROP TABLE IF EXISTS spec_risk","DROP TABLE IF EXISTS spec_test_step","DROP TABLE IF EXISTS spec_linked_task","DROP TABLE IF EXISTS spec_tag","DROP TABLE IF EXISTS agent_artifact","DROP TABLE IF EXISTS agent_runs","DROP TABLE IF EXISTS subtask_dependency","DROP TABLE IF EXISTS task_tag","DROP TABLE IF EXISTS shipped_feature_tag","DROP TABLE IF EXISTS idea_tag","DROP TABLE IF EXISTS entity_timeline","DROP TABLE IF EXISTS context_feedback_keyword","DROP TABLE IF EXISTS context_feedback_file","DROP TABLE IF EXISTS crew_run_file","DROP TABLE IF EXISTS crew_runs","DROP TABLE IF EXISTS team_enrollment","DROP TABLE IF EXISTS workflow_config","DROP TABLE IF EXISTS workflow_rule_condition","DROP TABLE IF EXISTS workflows","DROP TABLE IF EXISTS memory_links"];for(let s of t)try{e.run(s)}catch{}},"up")},{version:45,name:"schema-v2-retire-memories-table",up:r(e=>{try{e.run("DROP TRIGGER IF EXISTS memory_entries_from_events"),e.run(`
1000
+ CREATE TRIGGER IF NOT EXISTS memory_entries_from_events
1001
+ AFTER INSERT ON events
1002
+ WHEN NEW.type >= 'memory.remember.' AND NEW.type < 'memory.remember/'
1003
+ AND json_valid(NEW.data)
1004
+ AND json_extract(NEW.data, '$.content') IS NOT NULL
1005
+ BEGIN
1006
+ INSERT OR IGNORE INTO memory_entries
1007
+ (id, project_id, type, title, content, file, subject, provenance,
1008
+ content_hash, user_triggered, revision_count, created_at, updated_at)
1009
+ VALUES (
1010
+ 'mem_' || NEW.id,
1011
+ COALESCE(json_extract(NEW.data, '$.project_id'), 'local'),
1012
+ substr(NEW.type, length('memory.remember.') + 1),
1013
+ substr(json_extract(NEW.data, '$.content'), 1, 80),
1014
+ json_extract(NEW.data, '$.content'),
1015
+ json_extract(NEW.data, '$.tags.file'),
1016
+ json_extract(NEW.data, '$.tags.subject'),
1017
+ COALESCE(json_extract(NEW.data, '$.provenance'), 'declared'),
1018
+ COALESCE(json_extract(NEW.data, '$.content_hash'), 'evt_' || NEW.id),
1019
+ 0, 0,
1020
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER),
1021
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER)
1022
+ );
1023
+ INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine)
1024
+ SELECT 'mem_' || NEW.id, je.key, je.value,
1025
+ CASE WHEN je.key IN (
1026
+ 'source','session','window_days','window-days','touches','occurrences',
1027
+ 'phrase','slug','hash','content-hash','content_hash','key','kind',
1028
+ 'spec-id','spec_id','from','origin','event','task-count','task_count',
1029
+ 'context-schema','context_schema','synthesis','commit'
1030
+ ) THEN 1 ELSE 0 END
1031
+ FROM json_each(COALESCE(json_extract(NEW.data, '$.tags'), '{}')) je
1032
+ WHERE je.value IS NOT NULL AND je.type != 'object' AND je.type != 'array';
1033
+ END;
1034
+ `)}catch{}for(let t of["DROP TRIGGER IF EXISTS memories_ai","DROP TRIGGER IF EXISTS memories_ad","DROP TRIGGER IF EXISTS memories_au","DROP TABLE IF EXISTS memories_fts","DROP TABLE IF EXISTS memories"])try{e.run(t)}catch{}},"up")},{version:46,name:"schema-v2-memory-entries-recapture-and-timestamp-fixes",up:r(e=>{try{e.run("DROP INDEX IF EXISTS ux_mem_hash"),e.run(`CREATE UNIQUE INDEX IF NOT EXISTS ux_mem_hash
1035
+ ON memory_entries(project_id, content_hash, type)
1036
+ WHERE deleted_at IS NULL`)}catch{}try{e.run(`
1037
+ UPDATE memory_entries
1038
+ SET created_at = COALESCE(
1039
+ (SELECT CAST(ROUND((julianday(e.timestamp) - 2440587.5) * 86400000) AS INTEGER)
1040
+ FROM events e WHERE 'mem_' || e.id = memory_entries.id),
1041
+ CAST(unixepoch() AS INTEGER) * 1000
1042
+ ),
1043
+ updated_at = COALESCE(
1044
+ (SELECT CAST(ROUND((julianday(e.timestamp) - 2440587.5) * 86400000) AS INTEGER)
1045
+ FROM events e WHERE 'mem_' || e.id = memory_entries.id),
1046
+ CAST(unixepoch() AS INTEGER) * 1000
1047
+ )
1048
+ WHERE created_at <= 0
1049
+ `)}catch{}try{e.run("DROP TRIGGER IF EXISTS memory_entries_from_events"),e.run(`
1050
+ CREATE TRIGGER IF NOT EXISTS memory_entries_from_events
1051
+ AFTER INSERT ON events
1052
+ WHEN NEW.type >= 'memory.remember.' AND NEW.type < 'memory.remember/'
1053
+ AND json_valid(NEW.data)
1054
+ AND json_extract(NEW.data, '$.content') IS NOT NULL
1055
+ BEGIN
1056
+ INSERT OR IGNORE INTO memory_entries
1057
+ (id, project_id, type, title, content, file, subject, provenance,
1058
+ content_hash, user_triggered, revision_count, created_at, updated_at)
1059
+ VALUES (
1060
+ 'mem_' || NEW.id,
1061
+ COALESCE(json_extract(NEW.data, '$.project_id'), 'local'),
1062
+ substr(NEW.type, length('memory.remember.') + 1),
1063
+ substr(json_extract(NEW.data, '$.content'), 1, 80),
1064
+ json_extract(NEW.data, '$.content'),
1065
+ json_extract(NEW.data, '$.tags.file'),
1066
+ json_extract(NEW.data, '$.tags.subject'),
1067
+ COALESCE(json_extract(NEW.data, '$.provenance'), 'declared'),
1068
+ COALESCE(json_extract(NEW.data, '$.content_hash'), 'evt_' || NEW.id),
1069
+ 0, 0,
1070
+ COALESCE(
1071
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER),
1072
+ CAST(unixepoch() AS INTEGER) * 1000
1073
+ ),
1074
+ COALESCE(
1075
+ CAST(ROUND((julianday(COALESCE(json_extract(NEW.data, '$.created_at'), NEW.timestamp)) - 2440587.5) * 86400000) AS INTEGER),
1076
+ CAST(unixepoch() AS INTEGER) * 1000
1077
+ )
1078
+ );
1079
+ INSERT OR IGNORE INTO memory_entry_tags (entry_id, key, value, is_machine)
1080
+ SELECT 'mem_' || NEW.id, je.key, je.value,
1081
+ CASE WHEN je.key IN (
1082
+ 'source','session','window_days','window-days','touches','occurrences',
1083
+ 'phrase','slug','hash','content-hash','content_hash','key','kind',
1084
+ 'spec-id','spec_id','from','origin','event','task-count','task_count',
1085
+ 'context-schema','context_schema','synthesis','commit'
1086
+ ) THEN 1 ELSE 0 END
1087
+ FROM json_each(COALESCE(json_extract(NEW.data, '$.tags'), '{}')) je
1088
+ WHERE je.value IS NOT NULL AND je.type != 'object' AND je.type != 'array';
1089
+ END;
1090
+ `)}catch{}},"up")},{version:47,name:"schema-v2-missing-indexes",up:r(e=>{for(let t of["CREATE INDEX IF NOT EXISTS ix_analysis_convention ON analysis_convention(analysis_id)","CREATE INDEX IF NOT EXISTS ix_analysis_stack_item ON analysis_stack_item(analysis_id)","CREATE INDEX IF NOT EXISTS ix_analysis_command ON analysis_command(analysis_id)","CREATE INDEX IF NOT EXISTS ix_analysis_domain ON analysis_domain(analysis_id)","CREATE INDEX IF NOT EXISTS ix_token_measured ON token_usage(measured_at DESC)","CREATE INDEX IF NOT EXISTS ix_run_step_run ON workflow_run_step(run_id)","CREATE INDEX IF NOT EXISTS ix_gate_eval_run ON gate_evaluation(run_id)"])try{e.run(t)}catch{}},"up")},{version:48,name:"schema-v2-drop-dangling-agent-runs-fk",up:r(e=>{e.run(`
1091
+ CREATE TABLE token_usage_v48 (
1092
+ id TEXT PRIMARY KEY,
1093
+ work_cycle_id TEXT,
1094
+ event_key TEXT NOT NULL,
1095
+ source TEXT NOT NULL,
1096
+ is_estimated INTEGER NOT NULL DEFAULT 0,
1097
+ input_tokens INTEGER NOT NULL,
1098
+ output_tokens INTEGER NOT NULL,
1099
+ cache_read_tokens INTEGER DEFAULT 0,
1100
+ cache_write_tokens INTEGER DEFAULT 0,
1101
+ model_id TEXT,
1102
+ description TEXT,
1103
+ measured_at INTEGER,
1104
+ created_at INTEGER,
1105
+ CHECK (input_tokens BETWEEN 0 AND 10000000 AND output_tokens BETWEEN 0 AND 10000000)
1106
+ )
1107
+ `),e.run(`
1108
+ INSERT INTO token_usage_v48
1109
+ (id, work_cycle_id, event_key, source, is_estimated, input_tokens,
1110
+ output_tokens, cache_read_tokens, cache_write_tokens, model_id,
1111
+ description, measured_at, created_at)
1112
+ SELECT id, work_cycle_id, event_key, source, is_estimated, input_tokens,
1113
+ output_tokens, cache_read_tokens, cache_write_tokens, model_id,
1114
+ description, measured_at, created_at
1115
+ FROM token_usage
1116
+ `),e.run("DROP TABLE token_usage"),e.run("ALTER TABLE token_usage_v48 RENAME TO token_usage"),e.run("CREATE UNIQUE INDEX IF NOT EXISTS ux_token_event ON token_usage(event_key)"),e.run("CREATE INDEX IF NOT EXISTS ix_token_cycle ON token_usage(work_cycle_id)"),e.run("CREATE INDEX IF NOT EXISTS ix_token_measured ON token_usage(measured_at DESC)")},"up")},{version:49,name:"drop-dead-workflow-rule-cache",up:r(e=>{e.run("DROP TABLE IF EXISTS workflow_rule_cache")},"up")},{version:50,name:"drop-legacy-json-migration-tables",up:r(e=>{e.run("DROP TABLE IF EXISTS memory"),e.run("DROP TABLE IF EXISTS analysis")},"up")},{version:51,name:"shipped-features-typed-store",up:r(e=>{e.run("CREATE UNIQUE INDEX IF NOT EXISTS ux_shipped_natural ON shipped_features(name, version, shipped_at)");let t=e.prepare("SELECT data FROM kv_store WHERE key = 'shipped'").get();if(t?.data){let s=(()=>{try{let a=JSON.parse(t.data);return Array.isArray(a?.shipped)?a.shipped:[]}catch{return[]}})(),n=e.prepare(`INSERT OR IGNORE INTO shipped_features
1117
+ (id, name, shipped_at, version, description, type, duration, data)
1118
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);for(let a of s){let E=a.id,T=a.name,i=a.shippedAt;!E||!T||!i||n.run(E,T,i,a.version??"",a.description??null,a.type??null,a.duration??null,JSON.stringify(a))}}e.run("DELETE FROM kv_store WHERE key = 'shipped'")},"up")},{version:52,name:"metrics-typed-store",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS metrics_agent_usage (
1119
+ agent_name TEXT PRIMARY KEY,
1120
+ usage_count INTEGER NOT NULL DEFAULT 0,
1121
+ tokens_saved INTEGER NOT NULL DEFAULT 0
1122
+ )`);let t=e.prepare("SELECT data FROM kv_store WHERE key = 'metrics'").get();if(t?.data){let s=(()=>{try{return JSON.parse(t.data)}catch{return{}}})(),n=Array.isArray(s.dailyStats)?s.dailyStats:[],a=e.prepare(`INSERT OR IGNORE INTO metrics_daily
1123
+ (date, tokens_saved, syncs, avg_compression_rate, total_duration)
1124
+ VALUES (?, ?, ?, ?, ?)`),[E,T,i]=n.reduce((c,d)=>{let u=d.date;if(!u)return c;let p=Number(d.tokensSaved)||0,X=Number(d.syncs)||0,y=Number(d.totalDuration)||0;return a.run(u,p,X,Number(d.avgCompressionRate)||0,y),[c[0]+p,c[1]+X,c[2]+y]},[0,0,0]),o=Math.max(0,(Number(s.totalTokensSaved)||0)-E),_=Math.max(0,(Number(s.syncCount)||0)-T),L=Math.max(0,(Number(s.totalSyncDuration)||0)-i);if(o>0||_>0){let c=(s.firstSync||"1970-01-01T00:00:00.000Z").split("T")[0];a.run(c,o,_,Number(s.avgCompressionRate)||0,L)}let N=Array.isArray(s.agentUsage)?s.agentUsage:[],m=e.prepare(`INSERT OR IGNORE INTO metrics_agent_usage (agent_name, usage_count, tokens_saved)
1125
+ VALUES (?, ?, ?)`);for(let c of N){let d=c.agentName;d&&m.run(d,Number(c.usageCount)||0,Number(c.tokensSaved)||0)}}e.run("DELETE FROM kv_store WHERE key = 'metrics'")},"up")},{version:53,name:"queue-typed-store",up:r(e=>{for(let s of["body TEXT","agent TEXT","group_name TEXT","group_id TEXT"])try{e.run(`ALTER TABLE queue_tasks ADD COLUMN ${s}`)}catch{}e.run("CREATE INDEX IF NOT EXISTS ix_queue_section ON queue_tasks(section, completed, created_at)");let t=e.prepare("SELECT data FROM kv_store WHERE key = 'queue'").get();if(t?.data){let s=(()=>{try{let a=JSON.parse(t.data);return Array.isArray(a?.tasks)?a.tasks:[]}catch{return[]}})(),n=e.prepare(`INSERT OR IGNORE INTO queue_tasks
1126
+ (id, description, type, priority, section, created_at, completed, completed_at,
1127
+ feature_id, feature_name, body, agent, group_name, group_id)
1128
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let a of s){let E=a.id,T=a.description;!E||!T||n.run(E,T,a.type??null,a.priority??null,a.section??"backlog",a.createdAt??"1970-01-01T00:00:00.000Z",a.completed?1:0,a.completedAt??null,a.featureId??null,a.originFeature??null,a.body??null,a.agent??null,a.groupName??null,a.groupId??null)}}e.run("DELETE FROM kv_store WHERE key = 'queue'")},"up")},{version:54,name:"velocity-restored-and-dev-evolution",up:r(e=>{e.run("DELETE FROM kv_store WHERE key = 'velocity'"),e.run(`CREATE TABLE IF NOT EXISTS developer_profile_snapshots (
1129
+ week INTEGER PRIMARY KEY, -- epoch-week (one snapshot per ISO week)
1130
+ captured_at TEXT NOT NULL,
1131
+ preferences INTEGER NOT NULL DEFAULT 0, -- feedback-type entries (lifetime)
1132
+ frictions INTEGER NOT NULL DEFAULT 0, -- improvement-signals (lifetime)
1133
+ decisions_7d INTEGER NOT NULL DEFAULT 0,
1134
+ gotchas_7d INTEGER NOT NULL DEFAULT 0,
1135
+ learnings_7d INTEGER NOT NULL DEFAULT 0,
1136
+ tasks_completed_7d INTEGER NOT NULL DEFAULT 0,
1137
+ ships_7d INTEGER NOT NULL DEFAULT 0,
1138
+ velocity_avg REAL NOT NULL DEFAULT 0,
1139
+ summary TEXT NOT NULL
1140
+ )`)},"up")},{version:55,name:"ideas-typed-store-and-orphan-cleanup",up:r(e=>{let t=e.prepare("SELECT data FROM kv_store WHERE key = 'ideas'").get();if(t?.data){let s=(()=>{try{let a=JSON.parse(t.data);return Array.isArray(a?.ideas)?a.ideas:[]}catch{return[]}})(),n=e.prepare(`INSERT OR IGNORE INTO ideas
1141
+ (id, text, status, priority, tags, added_at, converted_to, details, data)
1142
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);for(let a of s){let E=a.id,T=a.text;if(!E||!T)continue;let i={};for(let o of["painPoints","solutions","filesAffected","impactEffort"])a[o]!==void 0&&(i[o]=a[o]);n.run(E,T,a.status??"pending",a.priority??"medium",Array.isArray(a.tags)&&a.tags.length?JSON.stringify(a.tags):null,a.addedAt??"1970-01-01T00:00:00.000Z",a.convertedTo??null,a.details??null,Object.keys(i).length?JSON.stringify(i):null)}}e.run("DELETE FROM kv_store WHERE key = 'ideas'"),e.run("DELETE FROM kv_store WHERE key = 'memory:patterns'"),e.run("DELETE FROM kv_store WHERE key LIKE 'analysis:derived-rules:%'")},"up")},{version:56,name:"task-history-typed",up:r(e=>{let t=e.prepare("SELECT data FROM kv_store WHERE key = 'state'").get();if(!t?.data)return;let s=(()=>{try{return JSON.parse(t.data)}catch{return null}})();if(!s)return;let n=Array.isArray(s.taskHistory)?s.taskHistory:[],a=e.prepare(`INSERT OR IGNORE INTO tasks
1143
+ (id, description, type, status, branch, linear_id, pr_url, started_at, completed_at, tokens_in, tokens_out, data)
1144
+ VALUES (?, ?, ?, 'completed', ?, ?, ?, ?, ?, ?, ?, ?)`);for(let E of n){let T=E.taskId,i=E.title;!T||!i||a.run(T,i,E.classification??"improvement",E.branchName==="unknown"?null:E.branchName??null,E.linearId??null,E.prUrl??null,E.startedAt??"1970-01-01T00:00:00.000Z",E.completedAt??"1970-01-01T00:00:00.000Z",Number(E.tokensIn)||0,Number(E.tokensOut)||0,JSON.stringify({title:i,outcome:E.outcome,subtaskCount:E.subtaskCount??0,subtaskSummaries:E.subtaskSummaries??[],feedback:E.feedback,harness:E.harness,linearUuid:E.linearUuid}))}if(n.length>0||"taskHistory"in s){let{taskHistory:E,...T}=s;e.prepare("UPDATE kv_store SET data = ? WHERE key = 'state'").run(JSON.stringify(T))}},"up")},{version:57,name:"skill-registry",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS skill_registry (
1145
+ name TEXT PRIMARY KEY,
1146
+ description TEXT NOT NULL DEFAULT '',
1147
+ path TEXT NOT NULL,
1148
+ scope TEXT NOT NULL DEFAULT 'global', -- project|global (project wins)
1149
+ indexed_at INTEGER NOT NULL
1150
+ )`)},"up")},{version:58,name:"cli-sessions-typed-and-dead-sessions-drop",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS cli_sessions (
1151
+ id TEXT PRIMARY KEY,
1152
+ status TEXT NOT NULL DEFAULT 'active',
1153
+ created_at TEXT NOT NULL,
1154
+ last_activity TEXT NOT NULL
1155
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_cli_sessions_active ON cli_sessions(status, last_activity DESC)"),e.run(`CREATE TABLE IF NOT EXISTS cli_session_commands (
1156
+ session_id TEXT NOT NULL,
1157
+ command TEXT NOT NULL,
1158
+ timestamp TEXT NOT NULL,
1159
+ duration_ms INTEGER NOT NULL DEFAULT 0
1160
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_cli_session_commands ON cli_session_commands(session_id, timestamp)"),e.run("DELETE FROM kv_store WHERE key = 'session-tracker'"),e.run("DROP TABLE IF EXISTS sessions")},"up")},{version:59,name:"work-graph",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS work_dependencies (
1161
+ from_id TEXT NOT NULL,
1162
+ to_id TEXT NOT NULL,
1163
+ dep_type TEXT NOT NULL DEFAULT 'blocks'
1164
+ CHECK (dep_type IN ('blocks', 'parent', 'related', 'discovered-from')),
1165
+ created_at TEXT NOT NULL,
1166
+ PRIMARY KEY (from_id, to_id, dep_type)
1167
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_workdeps_to ON work_dependencies(to_id)"),e.run(`CREATE TABLE IF NOT EXISTS task_complexity (
1168
+ task_id TEXT PRIMARY KEY,
1169
+ score INTEGER NOT NULL,
1170
+ recommended_subtasks INTEGER NOT NULL DEFAULT 0,
1171
+ expansion_prompt TEXT,
1172
+ reasoning TEXT,
1173
+ created_at TEXT NOT NULL
1174
+ )`);try{e.run("ALTER TABLE queue_tasks ADD COLUMN claimed_by TEXT"),e.run("ALTER TABLE queue_tasks ADD COLUMN claimed_at TEXT")}catch{}},"up")},{version:60,name:"task-journal-and-briefs",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS task_log (
1175
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1176
+ task_id TEXT NOT NULL,
1177
+ session_id TEXT,
1178
+ content TEXT NOT NULL,
1179
+ created_at TEXT NOT NULL
1180
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_task_log ON task_log(task_id, id DESC)"),e.run(`CREATE TABLE IF NOT EXISTS task_briefs (
1181
+ task_id TEXT PRIMARY KEY,
1182
+ content TEXT NOT NULL,
1183
+ created_at TEXT NOT NULL
1184
+ )`)},"up")},{version:61,name:"task-handoffs",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS task_handoffs (
1185
+ id TEXT PRIMARY KEY,
1186
+ project_id TEXT NOT NULL,
1187
+ task_id TEXT NOT NULL,
1188
+ task_description TEXT NOT NULL,
1189
+ from_agent TEXT NOT NULL,
1190
+ from_identity TEXT,
1191
+ to_agent TEXT NOT NULL,
1192
+ reason TEXT NOT NULL,
1193
+ evidence TEXT,
1194
+ status TEXT NOT NULL DEFAULT 'pending'
1195
+ CHECK (status IN ('pending', 'accepted', 'expired', 'cancelled')),
1196
+ workspace_id TEXT,
1197
+ worktree_path TEXT,
1198
+ branch TEXT,
1199
+ created_at TEXT NOT NULL,
1200
+ accepted_at TEXT,
1201
+ accepted_by TEXT,
1202
+ expires_at TEXT
1203
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_task_handoffs_pending ON task_handoffs(project_id, status, to_agent)"),e.run("CREATE INDEX IF NOT EXISTS ix_task_handoffs_task ON task_handoffs(task_id)")},"up")},{version:62,name:"code-symbol-graph",up:r(e=>{e.run(`
1204
+ CREATE TABLE IF NOT EXISTS code_symbols (
1205
+ id TEXT PRIMARY KEY,
1206
+ file TEXT NOT NULL,
1207
+ kind TEXT NOT NULL,
1208
+ name TEXT NOT NULL,
1209
+ qname TEXT,
1210
+ start_line INTEGER NOT NULL,
1211
+ end_line INTEGER,
1212
+ exported INTEGER NOT NULL DEFAULT 0
1213
+ )
1214
+ `),e.run("CREATE INDEX IF NOT EXISTS idx_code_symbols_name ON code_symbols(name)"),e.run("CREATE INDEX IF NOT EXISTS idx_code_symbols_file ON code_symbols(file)"),e.run("CREATE INDEX IF NOT EXISTS idx_code_symbols_name_nocase ON code_symbols(name COLLATE NOCASE)"),e.run(`
1215
+ CREATE TABLE IF NOT EXISTS code_symbol_edges (
1216
+ src TEXT NOT NULL,
1217
+ dst TEXT NOT NULL,
1218
+ edge_type TEXT NOT NULL,
1219
+ confidence REAL NOT NULL DEFAULT 1.0,
1220
+ PRIMARY KEY (src, dst, edge_type)
1221
+ )
1222
+ `),e.run("CREATE INDEX IF NOT EXISTS idx_code_symbol_edges_dst ON code_symbol_edges(dst)"),e.run("CREATE INDEX IF NOT EXISTS idx_code_symbol_edges_src ON code_symbol_edges(src)")},"up")},{version:63,name:"project-style-snapshots",up:r(e=>{e.run(`CREATE TABLE IF NOT EXISTS project_style_snapshots (
1223
+ id TEXT PRIMARY KEY,
1224
+ captured_at TEXT NOT NULL,
1225
+ commit_hash TEXT,
1226
+ source TEXT NOT NULL DEFAULT 'sync-mechanical',
1227
+ pattern_count INTEGER NOT NULL DEFAULT 0,
1228
+ anti_pattern_count INTEGER NOT NULL DEFAULT 0,
1229
+ convention_count INTEGER NOT NULL DEFAULT 0,
1230
+ framework_count INTEGER NOT NULL DEFAULT 0,
1231
+ symbol_count INTEGER NOT NULL DEFAULT 0,
1232
+ file_count INTEGER NOT NULL DEFAULT 0,
1233
+ summary TEXT NOT NULL,
1234
+ payload_json TEXT NOT NULL,
1235
+ is_active INTEGER NOT NULL DEFAULT 0
1236
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_project_style_active ON project_style_snapshots(is_active, captured_at DESC)"),e.run("CREATE INDEX IF NOT EXISTS ix_project_style_captured ON project_style_snapshots(captured_at DESC)")},"up")},{version:64,name:"instruction-failure-ledger",up:r(e=>{e.run("ALTER TABLE agent_sessions ADD COLUMN runtime TEXT NOT NULL DEFAULT 'unknown'"),e.run("ALTER TABLE agent_sessions ADD COLUMN model TEXT NOT NULL DEFAULT 'unknown'"),e.run(`CREATE TABLE IF NOT EXISTS instruction_failures (
1237
+ id TEXT PRIMARY KEY,
1238
+ project_id TEXT NOT NULL,
1239
+ dedup_key TEXT NOT NULL UNIQUE,
1240
+ source TEXT NOT NULL,
1241
+ runtime TEXT NOT NULL,
1242
+ model TEXT NOT NULL,
1243
+ session_id TEXT,
1244
+ task_id TEXT,
1245
+ category TEXT NOT NULL,
1246
+ expected_behavior TEXT NOT NULL,
1247
+ observed_behavior TEXT NOT NULL,
1248
+ related_rule_id TEXT,
1249
+ disposition TEXT NOT NULL DEFAULT 'open'
1250
+ CHECK (disposition IN ('open', 'resolved', 'false_positive')),
1251
+ occurred_at TEXT NOT NULL,
1252
+ created_at TEXT NOT NULL
1253
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_project_occurred ON instruction_failures(project_id, occurred_at DESC)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_runtime_model ON instruction_failures(project_id, runtime, model)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_disposition_occurred ON instruction_failures(project_id, disposition, occurred_at)")},"up")},{version:65,name:"memory-entries-deleted-at-partial-index",up:r(e=>{e.run("CREATE INDEX IF NOT EXISTS ix_memory_entries_deleted_at ON memory_entries(deleted_at) WHERE deleted_at IS NOT NULL")},"up")}],ne=O[O.length-1]?.version??0});function w(e){let t=K(e);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA busy_timeout = 5000"),t}function K(e){if(U()){let{Database:n}=g("bun:sqlite");return new n(e,{create:!0})}let t=(()=>{try{return g("node:sqlite").DatabaseSync}catch(n){throw new Error(`prjct needs SQLite: run on Bun, or Node >=22.5 with --experimental-sqlite (the \`prjct\` launcher sets this automatically \u2014 invoke \`prjct\`, not \`node dist/bin/prjct.mjs\` directly). Underlying error: ${n instanceof Error?n.message:String(n)}`)}})(),s=new t(e);return H(s)}function H(e){let t={depth:0,savepointSequence:0},s={prepare:r(n=>e.prepare(n),"prepare"),run:r(n=>{e.exec(n)},"run"),close:r(()=>e.close(),"close"),transaction:r(n=>{let a=r(T=>(...i)=>{if(t.depth>0){t.savepointSequence++;let o=`prjct_sp_${t.savepointSequence}`;e.exec(`SAVEPOINT ${o}`),t.depth++;try{let _=n(...i.length?i:[s]);return e.exec(`RELEASE ${o}`),_}catch(_){throw e.exec(`ROLLBACK TO ${o}`),e.exec(`RELEASE ${o}`),_}finally{t.depth--}}e.exec(T),t.depth++;try{let o=n(...i.length?i:[s]);return e.exec("COMMIT"),o}catch(o){throw e.exec("ROLLBACK"),o}finally{t.depth--}},"make"),E=a("BEGIN");return E.deferred=a("BEGIN DEFERRED"),E.immediate=a("BEGIN IMMEDIATE"),E.exclusive=a("BEGIN EXCLUSIVE"),E},"transaction")};return s}var x=l(()=>{"use strict";W();r(w,"openDatabase");r(K,"openRaw");r(H,"adaptNodeSqlite")});var J={};M(J,{PrjctDatabase:()=>A,default:()=>V,prjctDb:()=>G});import I from"node:fs";import b from"node:path";function S(e,t){let s=e.transaction(t);return typeof s.immediate=="function"?s.immediate(e):s(e)}function j(e){let t=new Date().toISOString();return!e||t>e?t:new Date(new Date(e).getTime()+1).toISOString()}var $,A,G,V,z=l(()=>{Y();B();F();x();r(S,"runImmediate");r(j,"monotonicStamp");$=3,A=class{static{r(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(t,s){let n=this.statementCache.get(t),a=n??new Map;n||this.statementCache.set(t,a);let E=a.get(s);if(E)return E;let T=t.prepare(s);return a.set(s,T),T}getDbPath(t){return b.join(h.getGlobalProjectPath(t),"prjct.db")}getDb(t){let s=this.connections.get(t);if(s)return this.touchAccessOrder(t),s;this.connections.size>=$&&this.evictLru();let n=this.getDbPath(t),a=b.dirname(n),E=(()=>{try{I.existsSync(a)||I.mkdirSync(a,{recursive:!0});let T=w(n);return T.run("PRAGMA synchronous = NORMAL"),T.run("PRAGMA cache_size = -2000"),T.run("PRAGMA temp_store = MEMORY"),T.run("PRAGMA mmap_size = 33554432"),T}catch(T){throw new Error(D(T,n,"database"))}})();return this.runMigrations(E,n),this.connections.set(t,E),this.touchAccessOrder(t),E}close(t){if(t){let s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t),this.accessOrder=this.accessOrder.filter(n=>n!==t))}else this.connections.forEach(s=>{this.statementCache.delete(s),s.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(t){this.accessOrder=this.accessOrder.filter(s=>s!==t),this.accessOrder.push(t)}evictLru(){if(this.accessOrder.length===0)return;let t=this.accessOrder.shift(),s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t))}checkpointAll(){for(let[t,s]of this.connections)try{this.prepareCached(s,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(t){return I.existsSync(this.getDbPath(t))}getDoc(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(s);return a?JSON.parse(a.data):null}setDoc(t,s,n){let a=this.getDb(t),E=JSON.stringify(n),T=new Date().toISOString();this.prepareCached(a,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,E,T)}getDocWithStamp(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s);return a?{data:JSON.parse(a.data),updatedAt:a.updated_at}:null}nextKvStamp(t,s){let n=this.prepareCached(t,"SELECT updated_at FROM kv_store WHERE key = ?").get(s);return j(n?.updated_at)}casSetDoc(t,s,n,a){let E=this.getDb(t),T=JSON.stringify(n),i=this.nextKvStamp(E,s);return a===null?this.prepareCached(E,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(s,T,i).changes===1:this.prepareCached(E,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(T,i,s,a).changes===1}updateDoc(t,s,n,a){let E=this.getDb(t);return S(E,()=>{let T=this.prepareCached(E,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s),i=T?JSON.parse(T.data):a(),o=n(i),_=j(T?.updated_at);return this.prepareCached(E,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,JSON.stringify(o),_),o})}deleteDoc(t,s){let n=this.getDb(t);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(s)}hasDoc(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(s)!==null}listDocsByPrefix(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(s).map(E=>({key:E.key,data:JSON.parse(E.data)}))}appendEvent(t,s,n,a){let E=this.getDb(t),T=new Date().toISOString(),o=this.prepareCached(E,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(s,a??null,JSON.stringify(n),T).lastInsertRowid;return typeof o=="bigint"?Number(o):o??null}getEvents(t,s,n=100){let a=this.getDb(t);return s?this.prepareCached(a,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(s,n):this.prepareCached(a,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).all(...n)}run(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).run(...n)}get(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).get(...n)??null}transaction(t,s){let n=this.getDb(t);return S(n,s)}runMigrations(t,s){t.run(`
1254
+ CREATE TABLE IF NOT EXISTS _migrations (
1255
+ version INTEGER PRIMARY KEY,
1256
+ name TEXT NOT NULL,
1257
+ applied_at TEXT NOT NULL
1258
+ )
1259
+ `);let n=new Set(t.prepare("SELECT version FROM _migrations").all().map(E=>E.version)),a=O.filter(E=>!n.has(E.version));if(a.length!==0){if(s&&n.size>0)try{let E=`${s}.pre-migrate.bak`;I.existsSync(E)&&I.rmSync(E,{force:!0}),t.prepare("VACUUM INTO ?").run(E)}catch(E){console.warn(`prjct: pre-migration backup failed (continuing): ${E?.message??E}`)}for(let E of a)S(t,()=>{E.up(t),t.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(E.version,E.name,new Date().toISOString())})}}getMigrations(t){return this.getDb(t).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(t){return this.getDb(t).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},G=new A,V=G});export{R as a,C as b,ne as c,F as d,A as e,G as f,V as g,J as h,z as i};