prjct-cli 3.92.0 → 3.94.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 (256) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/bin/hook-chunks/{agent-switch-XMFUTNNV.mjs → agent-switch-2U2LOBGR.mjs} +1 -1
  3. package/dist/bin/hook-chunks/analysis-N4NYGIG3.mjs +42 -0
  4. package/dist/bin/hook-chunks/{auth-config-WNUARXTJ.mjs → auth-config-SP4PBALR.mjs} +1 -1
  5. package/dist/bin/hook-chunks/auto-flush-BN6L6QHO.mjs +8 -0
  6. package/dist/bin/hook-chunks/{auto-updater-EHRRMCYY.mjs → auto-updater-4TIXYSEX.mjs} +1 -1
  7. package/dist/bin/hook-chunks/capture-gate-FRF2G3IG.mjs +8 -0
  8. package/dist/bin/hook-chunks/{chunk-DGBDMUBL.mjs → chunk-27XFSCOE.mjs} +4 -4
  9. package/dist/bin/hook-chunks/chunk-2HB2JHQE.mjs +69 -0
  10. package/dist/bin/hook-chunks/{chunk-MAHTF6JG.mjs → chunk-3VWBNLBC.mjs} +1 -1
  11. package/dist/bin/hook-chunks/{chunk-V37VTXDW.mjs → chunk-4KVPAHFV.mjs} +1 -1
  12. package/dist/bin/hook-chunks/{chunk-2HTDCLZD.mjs → chunk-4O4D6DV7.mjs} +2 -2
  13. package/dist/bin/hook-chunks/chunk-4SKJWNKE.mjs +11 -0
  14. package/dist/bin/hook-chunks/{chunk-3LG3ACQV.mjs → chunk-5EQLQ7GF.mjs} +1 -1
  15. package/dist/bin/hook-chunks/{chunk-HZIORCPO.mjs → chunk-66GE3IHX.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-MEQS4VPO.mjs → chunk-6RLCUGGG.mjs} +1 -1
  17. package/dist/bin/hook-chunks/{chunk-BISPGBNN.mjs → chunk-6UH244CC.mjs} +1 -1
  18. package/dist/bin/hook-chunks/chunk-7GNWHWOO.mjs +26 -0
  19. package/dist/bin/hook-chunks/chunk-7JEKBJAP.mjs +9 -0
  20. package/dist/bin/hook-chunks/{chunk-LLQUB6YR.mjs → chunk-7O6OMD4X.mjs} +2 -2
  21. package/dist/bin/hook-chunks/chunk-7YT2FGO7.mjs +8 -0
  22. package/dist/bin/hook-chunks/{chunk-XHDNPEAN.mjs → chunk-AVRNHROK.mjs} +1 -1
  23. package/dist/bin/hook-chunks/chunk-AZHE4VOM.mjs +8 -0
  24. package/dist/bin/hook-chunks/{chunk-7OZDWT6C.mjs → chunk-AZYQFRPJ.mjs} +1 -1
  25. package/dist/bin/hook-chunks/chunk-BCAHWZH7.mjs +8 -0
  26. package/dist/bin/hook-chunks/{chunk-Q5I2UPD6.mjs → chunk-C3W2HLJT.mjs} +1 -1
  27. package/dist/bin/hook-chunks/{chunk-ZX2KFQV5.mjs → chunk-D6IONKRA.mjs} +1 -1
  28. package/dist/bin/hook-chunks/chunk-DRGI5UHQ.mjs +10 -0
  29. package/dist/bin/hook-chunks/{chunk-7SI6X3Z7.mjs → chunk-EHEQOF6Z.mjs} +1 -1
  30. package/dist/bin/hook-chunks/{chunk-ZX6BC2EB.mjs → chunk-EMTCZG5I.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-ZNQXFWSI.mjs → chunk-EQ5KNMLG.mjs} +1 -1
  32. package/dist/bin/hook-chunks/{chunk-S4TB2OFJ.mjs → chunk-F4T7IAA7.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-ODWWIFSN.mjs → chunk-FEFP6JOL.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-2OU2MKNS.mjs → chunk-FX6VHIKB.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-2WPR5GFT.mjs → chunk-GFY4GY3Z.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{chunk-PSSR7LSW.mjs → chunk-H4CA3XZ6.mjs} +1 -1
  37. package/dist/bin/hook-chunks/chunk-HHIGNKDO.mjs +8 -0
  38. package/dist/bin/hook-chunks/chunk-HNEKXKOI.mjs +16 -0
  39. package/dist/bin/hook-chunks/{chunk-45I2C2UB.mjs → chunk-HRWXMF7P.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{chunk-AWD2AQVJ.mjs → chunk-IHECXD2M.mjs} +1 -1
  41. package/dist/bin/hook-chunks/chunk-IKIB42F7.mjs +31 -0
  42. package/dist/bin/hook-chunks/chunk-INXNK57E.mjs +8 -0
  43. package/dist/bin/hook-chunks/{chunk-WDGDFXSB.mjs → chunk-J6TAD3OZ.mjs} +1 -1
  44. package/dist/bin/hook-chunks/chunk-JAMSIKDE.mjs +9 -0
  45. package/dist/bin/hook-chunks/{chunk-CREPUNOS.mjs → chunk-JCYXFHQZ.mjs} +1 -1
  46. package/dist/bin/hook-chunks/chunk-JMCMTX6U.mjs +8 -0
  47. package/dist/bin/hook-chunks/{chunk-D7TRY3CO.mjs → chunk-JPSJWCFD.mjs} +1 -1
  48. package/dist/bin/hook-chunks/{chunk-QDQ7DTDV.mjs → chunk-JR542RI2.mjs} +1 -1
  49. package/dist/bin/hook-chunks/chunk-JUZ5LNDI.mjs +14 -0
  50. package/dist/bin/hook-chunks/{chunk-HDHVBB6Q.mjs → chunk-KG7Z6OMK.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{chunk-OGOCHZ3S.mjs → chunk-KOCROTRM.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{chunk-75UJIVMO.mjs → chunk-KOGZCFBC.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{chunk-ZTZTVBAZ.mjs → chunk-LNB2GLYI.mjs} +1 -1
  54. package/dist/bin/hook-chunks/chunk-M5E2YOZ4.mjs +8 -0
  55. package/dist/bin/hook-chunks/{chunk-BZ5UR7G3.mjs → chunk-MHQTGU45.mjs} +1 -1
  56. package/dist/bin/hook-chunks/{chunk-OL6ITIAZ.mjs → chunk-MI3JEFON.mjs} +2 -2
  57. package/dist/bin/hook-chunks/chunk-NBKEOLDH.mjs +18 -0
  58. package/dist/bin/hook-chunks/{chunk-EM6ZDJAK.mjs → chunk-NCOOKPXX.mjs} +1 -1
  59. package/dist/bin/hook-chunks/chunk-NHIWYDQD.mjs +8 -0
  60. package/dist/bin/hook-chunks/chunk-NUJASVHN.mjs +18 -0
  61. package/dist/bin/hook-chunks/chunk-NWIQNII6.mjs +11 -0
  62. package/dist/bin/hook-chunks/{chunk-OP467HW6.mjs → chunk-NWZEBCTC.mjs} +2 -2
  63. package/dist/bin/hook-chunks/{chunk-6EWGHM32.mjs → chunk-OENWCYLF.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{chunk-3JUE6MNF.mjs → chunk-OIU4Y5WL.mjs} +1 -1
  65. package/dist/bin/hook-chunks/chunk-OUAS3LZ3.mjs +8 -0
  66. package/dist/bin/hook-chunks/{chunk-X5RDLFPM.mjs → chunk-OWOPA2O7.mjs} +1 -1
  67. package/dist/bin/hook-chunks/{chunk-NLG2EW6M.mjs → chunk-OZJ6UKKP.mjs} +1 -1
  68. package/dist/bin/hook-chunks/chunk-PUHX3ECX.mjs +11 -0
  69. package/dist/bin/hook-chunks/chunk-Q3EYM4GJ.mjs +19 -0
  70. package/dist/bin/hook-chunks/{chunk-I5BDN25C.mjs → chunk-Q3Z53QTH.mjs} +3 -3
  71. package/dist/bin/hook-chunks/{chunk-ZZ65CN5F.mjs → chunk-QPRNRLG6.mjs} +1 -1
  72. package/dist/bin/hook-chunks/chunk-QWQFF2UG.mjs +10 -0
  73. package/dist/bin/hook-chunks/{chunk-DMXFGLZE.mjs → chunk-QYEASMFV.mjs} +1 -1
  74. package/dist/bin/hook-chunks/chunk-R4ILCXKE.mjs +8 -0
  75. package/dist/bin/hook-chunks/{chunk-4WHS7CO7.mjs → chunk-S7HQQILD.mjs} +1 -1
  76. package/dist/bin/hook-chunks/chunk-SDUS2AT7.mjs +8 -0
  77. package/dist/bin/hook-chunks/chunk-T2FCU3ZS.mjs +12 -0
  78. package/dist/bin/hook-chunks/{chunk-A5RNWWTH.mjs → chunk-TFCLMTJ5.mjs} +1 -1
  79. package/dist/bin/hook-chunks/{chunk-AUUWQH3S.mjs → chunk-TG5CQJD5.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{chunk-CQUG6SO2.mjs → chunk-TKWAFYF7.mjs} +1 -1
  81. package/dist/bin/hook-chunks/{chunk-YUOTOCKK.mjs → chunk-TYEAIX3X.mjs} +1 -1
  82. package/dist/bin/hook-chunks/{chunk-AOPJ4Z6O.mjs → chunk-UA4Z5TGG.mjs} +1 -1
  83. package/dist/bin/hook-chunks/chunk-UH4MD3F3.mjs +9 -0
  84. package/dist/bin/hook-chunks/chunk-V2BSS7HW.mjs +36 -0
  85. package/dist/bin/hook-chunks/{chunk-MQVVNX63.mjs → chunk-VWOIUTAX.mjs} +1 -1
  86. package/dist/bin/hook-chunks/{chunk-NLDL3N6R.mjs → chunk-X2AGNDGD.mjs} +1 -1
  87. package/dist/bin/hook-chunks/{chunk-5PEHJEFE.mjs → chunk-XE4MJNBQ.mjs} +1 -1
  88. package/dist/bin/hook-chunks/{chunk-2NMSEZTQ.mjs → chunk-XFQ7NNLN.mjs} +1 -1
  89. package/dist/bin/hook-chunks/{chunk-SOPRYWUY.mjs → chunk-XS45K7ZQ.mjs} +1 -1
  90. package/dist/bin/hook-chunks/chunk-Y3J7UUMR.mjs +47 -0
  91. package/dist/bin/hook-chunks/{chunk-HIFIDMH5.mjs → chunk-Y4DUB7UN.mjs} +2 -2
  92. package/dist/bin/hook-chunks/{chunk-6IKHMK2U.mjs → chunk-YQ55MHKL.mjs} +1 -1
  93. package/dist/bin/hook-chunks/{chunk-DVBBB5BS.mjs → chunk-YUKGWWL7.mjs} +1 -1
  94. package/dist/bin/hook-chunks/chunk-ZJXH76Q5.mjs +11 -0
  95. package/dist/bin/hook-chunks/{chunk-TBM7736J.mjs → chunk-ZMKTR2IO.mjs} +1 -1
  96. package/dist/bin/hook-chunks/{chunk-54LH63LM.mjs → chunk-ZMLA5SKR.mjs} +1 -0
  97. package/dist/bin/hook-chunks/client-ERZ5CM3D.mjs +10 -0
  98. package/dist/bin/hook-chunks/code-graph-cloud-4GRWQSUK.mjs +8 -0
  99. package/dist/bin/hook-chunks/{codex-skill-2N6656SR.mjs → codex-skill-6DYQMPDJ.mjs} +1 -1
  100. package/dist/bin/hook-chunks/{command-installer-XSKQS3IS.mjs → command-installer-MF4KUM3X.mjs} +1 -1
  101. package/dist/bin/hook-chunks/{config-manager-YZANYLPV.mjs → config-manager-2VZPHUDG.mjs} +1 -1
  102. package/dist/bin/hook-chunks/{content-bound-stamp-72EQVZLP.mjs → content-bound-stamp-OG2KKN3L.mjs} +1 -1
  103. package/dist/bin/hook-chunks/{context7-service-4C6VNJUS.mjs → context7-service-V7CIDF3Q.mjs} +1 -1
  104. package/dist/bin/hook-chunks/custom-workflow-storage-UOBQXY42.mjs +8 -0
  105. package/dist/bin/hook-chunks/cwd-changed-J6O46KS7.mjs +8 -0
  106. package/dist/bin/hook-chunks/{database-SLDTQXWG.mjs → database-XYKQF3KR.mjs} +1 -1
  107. package/dist/bin/hook-chunks/{delivery-geometry-VHCURJ7E.mjs → delivery-geometry-WYOEMKMO.mjs} +1 -1
  108. package/dist/bin/hook-chunks/detect-changes-DFRJOOB3.mjs +19 -0
  109. package/dist/bin/hook-chunks/{detection-MEYHME4X.mjs → detection-QRVSNMKL.mjs} +1 -1
  110. package/dist/bin/hook-chunks/developer-evolution-SLC34HUU.mjs +12 -0
  111. package/dist/bin/hook-chunks/distill-U2LJGUG3.mjs +8 -0
  112. package/dist/bin/hook-chunks/{editors-config-3N6VREZR.mjs → editors-config-6XFYIOE6.mjs} +1 -1
  113. package/dist/bin/hook-chunks/enriched-recall-X6RDNNIE.mjs +8 -0
  114. package/dist/bin/hook-chunks/exec-2P5VOBHM.mjs +8 -0
  115. package/dist/bin/hook-chunks/format-ALUX4QSI.mjs +8 -0
  116. package/dist/bin/hook-chunks/{git-helpers-6JLP2OJZ.mjs → git-helpers-HELM6DXJ.mjs} +1 -1
  117. package/dist/bin/hook-chunks/{judgment-ledger-storage-UKROWRVA.mjs → judgment-ledger-storage-SCGU3URM.mjs} +1 -1
  118. package/dist/bin/hook-chunks/{judgment-orchestrator-UFGNBTEK.mjs → judgment-orchestrator-BYPG65RS.mjs} +1 -1
  119. package/dist/bin/hook-chunks/judgment-receipt-GWSSCLAB.mjs +8 -0
  120. package/dist/bin/hook-chunks/land-cue-MMISX2BI.mjs +9 -0
  121. package/dist/bin/hook-chunks/land-synthesis-WG5JAS7B.mjs +8 -0
  122. package/dist/bin/hook-chunks/legacy-crew-sweep-2WSO5KEB.mjs +24 -0
  123. package/dist/bin/hook-chunks/memory-index-QK5QJOFJ.mjs +8 -0
  124. package/dist/bin/hook-chunks/notification-MPVWVV52.mjs +8 -0
  125. package/dist/bin/hook-chunks/{pack-integrity-BKLDNYE5.mjs → pack-integrity-XRYOROK5.mjs} +1 -1
  126. package/dist/bin/hook-chunks/{pack-manager-ASWLKYGP.mjs → pack-manager-WWGQNJDQ.mjs} +1 -1
  127. package/dist/bin/hook-chunks/{package-legitimacy-HXC4L73B.mjs → package-legitimacy-MIR3VZSF.mjs} +1 -1
  128. package/dist/bin/hook-chunks/{path-manager-F2HE2GGK.mjs → path-manager-ZR5RAKTK.mjs} +1 -1
  129. package/dist/bin/hook-chunks/{planning-QBSY272P.mjs → planning-S55KBPN2.mjs} +2 -2
  130. package/dist/bin/hook-chunks/post-edit-QMHSZHDN.mjs +8 -0
  131. package/dist/bin/hook-chunks/{pr-convention-7UGI7TFA.mjs → pr-convention-5NPXQJ2R.mjs} +1 -1
  132. package/dist/bin/hook-chunks/pre-bash-RAM6L3G4.mjs +11 -0
  133. package/dist/bin/hook-chunks/pre-commit-736ZLMDL.mjs +8 -0
  134. package/dist/bin/hook-chunks/pre-edit-GZ4QJ2MU.mjs +11 -0
  135. package/dist/bin/hook-chunks/pre-package-LCIAWWGK.mjs +8 -0
  136. package/dist/bin/hook-chunks/pre-search-J5EOFMYN.mjs +9 -0
  137. package/dist/bin/hook-chunks/pre-secrets-TSUMTXHH.mjs +8 -0
  138. package/dist/bin/hook-chunks/{precision-judgment-WPTCNTGV.mjs → precision-judgment-TT3DRNAX.mjs} +1 -1
  139. package/dist/bin/hook-chunks/{prjct-md-WE6WFVL3.mjs → prjct-md-T2DG236Y.mjs} +1 -1
  140. package/dist/bin/hook-chunks/{project-agent-surfaces-A6HGZPAL.mjs → project-agent-surfaces-VRY22I66.mjs} +1 -1
  141. package/dist/bin/hook-chunks/{project-file-inventory-ZAPKPKY6.mjs → project-file-inventory-5DEN5VLF.mjs} +1 -1
  142. package/dist/bin/hook-chunks/project-memory-KKEMTEMP.mjs +8 -0
  143. package/dist/bin/hook-chunks/project-style-evolution-7MAUSED2.mjs +8 -0
  144. package/dist/bin/hook-chunks/{prompt-JIOMJCGV.mjs → prompt-DVF6V2X2.mjs} +7 -7
  145. package/dist/bin/hook-chunks/{velocity-storage-UPW6TLK6.mjs → publish-helper-G54XQV5K.mjs} +1 -1
  146. package/dist/bin/hook-chunks/purge-MC5LFSAO.mjs +8 -0
  147. package/dist/bin/hook-chunks/retention-LWETHQX3.mjs +8 -0
  148. package/dist/bin/hook-chunks/sdd-5UCVX43H.mjs +10 -0
  149. package/dist/bin/hook-chunks/session-continuity-RKNAJJHR.mjs +11 -0
  150. package/dist/bin/hook-chunks/session-start-MFMFKUPK.mjs +8 -0
  151. package/dist/bin/hook-chunks/setup-WQRJ6TQL.mjs +141 -0
  152. package/dist/bin/hook-chunks/{shipping-LVTFVSWJ.mjs → shipping-5D5LTJ3P.mjs} +5 -5
  153. package/dist/bin/hook-chunks/{skill-index-OOVAXHYJ.mjs → skill-index-RAVJMC4P.mjs} +1 -1
  154. package/dist/bin/hook-chunks/{spec-context-inference-U6BGGB2Q.mjs → spec-context-inference-7DDSTRTV.mjs} +1 -1
  155. package/dist/bin/hook-chunks/{spec-service-2DVDFOR7.mjs → spec-service-LAO5Z2M5.mjs} +2 -2
  156. package/dist/bin/hook-chunks/spec-task-breakdown-K3GMQKGH.mjs +8 -0
  157. package/dist/bin/hook-chunks/state-storage-EIFGUO7X.mjs +8 -0
  158. package/dist/bin/hook-chunks/stop-RYLI4FGF.mjs +16 -0
  159. package/dist/bin/hook-chunks/subagent-start-CCUPSANT.mjs +8 -0
  160. package/dist/bin/hook-chunks/subagent-stop-RBD2OILE.mjs +8 -0
  161. package/dist/bin/hook-chunks/{surface-attribution-BDKFYUOJ.mjs → surface-attribution-K37N2NK7.mjs} +1 -1
  162. package/dist/bin/hook-chunks/symbol-graph-BKQIMFRG.mjs +8 -0
  163. package/dist/bin/hook-chunks/{sync-analyzer-FKC57RTV.mjs → sync-analyzer-6U5GHYV3.mjs} +1 -1
  164. package/dist/bin/hook-chunks/{sync-client-DJWOG2ZQ.mjs → sync-client-EGBMWF3J.mjs} +1 -1
  165. package/dist/bin/hook-chunks/{sync-cursor-storage-2VKG757H.mjs → sync-cursor-storage-E3LMZISA.mjs} +1 -1
  166. package/dist/bin/hook-chunks/{task-orchestration-MLOCR7GA.mjs → task-orchestration-2ZYE5M6J.mjs} +1 -1
  167. package/dist/bin/hook-chunks/{task-overview-6ZQKJGSH.mjs → task-overview-ITY5OSHX.mjs} +1 -1
  168. package/dist/bin/hook-chunks/task-service-XREJLWEF.mjs +8 -0
  169. package/dist/bin/hook-chunks/tdd-7S55S5C3.mjs +10 -0
  170. package/dist/bin/hook-chunks/{template-loader-BFTLPG2W.mjs → template-loader-SCM4C2A3.mjs} +1 -1
  171. package/dist/bin/hook-chunks/{trust-boundary-ERMDF2C5.mjs → trust-boundary-EX65SUYR.mjs} +1 -1
  172. package/dist/bin/hook-chunks/{usefulness-253CZLNY.mjs → usefulness-SCH5ARGV.mjs} +1 -1
  173. package/dist/bin/hook-chunks/{vault-retire-notice-GRT3QRLZ.mjs → vault-retire-notice-HT756AND.mjs} +1 -1
  174. package/dist/bin/hook-chunks/velocity-storage-47CF3XWZ.mjs +8 -0
  175. package/dist/bin/hook-chunks/weak-model-mode-FLCEQ2BV.mjs +8 -0
  176. package/dist/bin/hook-chunks/work-graph-JQHVVXIZ.mjs +49 -0
  177. package/dist/bin/hook-chunks/work-scope-CDLSZ4U5.mjs +8 -0
  178. package/dist/bin/hook-chunks/{workspace-occupancy-UVIRHY5Z.mjs → workspace-occupancy-UUW4UGGB.mjs} +1 -1
  179. package/dist/bin/hook-chunks/{worktree-service-XGRN5TTE.mjs → worktree-service-AS7JVBK5.mjs} +1 -1
  180. package/dist/bin/prjct-core.mjs +736 -746
  181. package/dist/bin/prjct-hooks.mjs +2 -2
  182. package/dist/daemon/entry.mjs +625 -632
  183. package/dist/mcp/server.mjs +323 -323
  184. package/package.json +1 -1
  185. package/dist/bin/hook-chunks/analysis-PFGKPYWQ.mjs +0 -42
  186. package/dist/bin/hook-chunks/auto-flush-QZ3YIQP6.mjs +0 -8
  187. package/dist/bin/hook-chunks/capture-gate-2FXYVHNF.mjs +0 -8
  188. package/dist/bin/hook-chunks/chunk-3X7TBM4A.mjs +0 -19
  189. package/dist/bin/hook-chunks/chunk-4DDCWMI6.mjs +0 -8
  190. package/dist/bin/hook-chunks/chunk-4KY2EHXS.mjs +0 -9
  191. package/dist/bin/hook-chunks/chunk-7JE6VTLN.mjs +0 -71
  192. package/dist/bin/hook-chunks/chunk-AKIN5WSQ.mjs +0 -9
  193. package/dist/bin/hook-chunks/chunk-CDCCAU22.mjs +0 -11
  194. package/dist/bin/hook-chunks/chunk-CPHUFXD2.mjs +0 -14
  195. package/dist/bin/hook-chunks/chunk-CQHPIYNM.mjs +0 -8
  196. package/dist/bin/hook-chunks/chunk-CTWZQ7YI.mjs +0 -8
  197. package/dist/bin/hook-chunks/chunk-FGQZ62ZP.mjs +0 -47
  198. package/dist/bin/hook-chunks/chunk-GELCZWKW.mjs +0 -11
  199. package/dist/bin/hook-chunks/chunk-HJ4HEI45.mjs +0 -8
  200. package/dist/bin/hook-chunks/chunk-HX42HFII.mjs +0 -18
  201. package/dist/bin/hook-chunks/chunk-J6JZ4PQA.mjs +0 -18
  202. package/dist/bin/hook-chunks/chunk-KB3P6XTL.mjs +0 -38
  203. package/dist/bin/hook-chunks/chunk-L4COZ7ZH.mjs +0 -13
  204. package/dist/bin/hook-chunks/chunk-LT5WSSQO.mjs +0 -8
  205. package/dist/bin/hook-chunks/chunk-N5WOHG36.mjs +0 -8
  206. package/dist/bin/hook-chunks/chunk-NJAMZSHM.mjs +0 -26
  207. package/dist/bin/hook-chunks/chunk-NWY5M34K.mjs +0 -12
  208. package/dist/bin/hook-chunks/chunk-OLKNK2HB.mjs +0 -8
  209. package/dist/bin/hook-chunks/chunk-SVZHJZ5T.mjs +0 -9
  210. package/dist/bin/hook-chunks/chunk-SY2FRLJF.mjs +0 -31
  211. package/dist/bin/hook-chunks/chunk-WSFHSXBZ.mjs +0 -9
  212. package/dist/bin/hook-chunks/chunk-Y7CKMFNW.mjs +0 -16
  213. package/dist/bin/hook-chunks/chunk-YJMWY4Y6.mjs +0 -8
  214. package/dist/bin/hook-chunks/client-SKFMAUI5.mjs +0 -10
  215. package/dist/bin/hook-chunks/code-graph-cloud-65GCWNII.mjs +0 -8
  216. package/dist/bin/hook-chunks/custom-workflow-storage-M77INP6Z.mjs +0 -8
  217. package/dist/bin/hook-chunks/cwd-changed-NJ6RYVOJ.mjs +0 -8
  218. package/dist/bin/hook-chunks/detect-changes-6N4DCWXQ.mjs +0 -17
  219. package/dist/bin/hook-chunks/developer-evolution-R5BXQH6G.mjs +0 -12
  220. package/dist/bin/hook-chunks/distill-IABVRW2U.mjs +0 -8
  221. package/dist/bin/hook-chunks/enriched-recall-NDASPZXZ.mjs +0 -8
  222. package/dist/bin/hook-chunks/exec-I7XE7NMD.mjs +0 -8
  223. package/dist/bin/hook-chunks/format-NIBVWBGR.mjs +0 -8
  224. package/dist/bin/hook-chunks/judgment-receipt-HTNEOJLT.mjs +0 -8
  225. package/dist/bin/hook-chunks/land-cue-FNLP4IAB.mjs +0 -9
  226. package/dist/bin/hook-chunks/land-synthesis-HBPIXP5S.mjs +0 -8
  227. package/dist/bin/hook-chunks/legacy-crew-sweep-2MLYPNQR.mjs +0 -24
  228. package/dist/bin/hook-chunks/memory-index-MQCHZFUE.mjs +0 -10
  229. package/dist/bin/hook-chunks/notification-VQM2AMNS.mjs +0 -8
  230. package/dist/bin/hook-chunks/post-edit-VTLDHWI3.mjs +0 -8
  231. package/dist/bin/hook-chunks/pre-bash-JR6257XO.mjs +0 -11
  232. package/dist/bin/hook-chunks/pre-commit-BYUFDN2N.mjs +0 -8
  233. package/dist/bin/hook-chunks/pre-edit-MHROFDS3.mjs +0 -11
  234. package/dist/bin/hook-chunks/pre-package-P7CLTJJV.mjs +0 -8
  235. package/dist/bin/hook-chunks/pre-search-BCQHPE46.mjs +0 -9
  236. package/dist/bin/hook-chunks/pre-secrets-IE5NX5X5.mjs +0 -8
  237. package/dist/bin/hook-chunks/project-memory-ON54KZEM.mjs +0 -8
  238. package/dist/bin/hook-chunks/project-style-evolution-T27I5N65.mjs +0 -8
  239. package/dist/bin/hook-chunks/publish-helper-I37V4L7U.mjs +0 -8
  240. package/dist/bin/hook-chunks/purge-QQ6XILZD.mjs +0 -8
  241. package/dist/bin/hook-chunks/retention-E7WGFL47.mjs +0 -8
  242. package/dist/bin/hook-chunks/sdd-PV6KWXE4.mjs +0 -10
  243. package/dist/bin/hook-chunks/session-continuity-5CLT5YBL.mjs +0 -11
  244. package/dist/bin/hook-chunks/session-start-ATYLOUKB.mjs +0 -8
  245. package/dist/bin/hook-chunks/setup-VL7YXVE5.mjs +0 -142
  246. package/dist/bin/hook-chunks/spec-task-breakdown-MPNRRTNZ.mjs +0 -8
  247. package/dist/bin/hook-chunks/state-storage-KNGP2CQV.mjs +0 -8
  248. package/dist/bin/hook-chunks/stop-GBUGB5OE.mjs +0 -17
  249. package/dist/bin/hook-chunks/subagent-start-HURF2GI7.mjs +0 -8
  250. package/dist/bin/hook-chunks/subagent-stop-WJECHEXI.mjs +0 -8
  251. package/dist/bin/hook-chunks/symbol-graph-LZM4RZXZ.mjs +0 -8
  252. package/dist/bin/hook-chunks/task-service-BM2JQXMS.mjs +0 -8
  253. package/dist/bin/hook-chunks/tdd-UJDJUJ3E.mjs +0 -10
  254. package/dist/bin/hook-chunks/weak-model-mode-GLXXHG32.mjs +0 -8
  255. package/dist/bin/hook-chunks/work-graph-QJGNBVIP.mjs +0 -49
  256. package/dist/bin/hook-chunks/work-scope-VTF6SKLY.mjs +0 -8
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as f}from"./chunk-DYHYDHCW.mjs";import{d as x,f as D,j as g,n as S}from"./chunk-SVZHJZ5T.mjs";import{a as l,o as P}from"./chunk-CTWZQ7YI.mjs";import{d as k}from"./chunk-PKDYFXMI.mjs";import{a}from"./chunk-E66B27AL.mjs";import y from"node:path";P();S();S();import j from"node:fs/promises";import F from"node:path";var d=class{static{a(this,"StackDetector")}projectPath;constructor(t){this.projectPath=t}async detect(){let t={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},e=await this.readPackageJson();if(e){let s={...e.dependencies,...e.devDependencies};this.detectFrontend(s,t),this.detectBackend(s,t),this.detectDatabase(s,t),this.detectTesting(s,e,t),this.collectFrameworks(s,t)}return t.hasDocker=await this.detectDocker(),t}detectFrontend(t,e){(t.react||t.vue||t.svelte||t["@angular/core"])&&(e.hasFrontend=!0,e.frontendType="web"),(t["react-native"]||t.expo)&&(e.hasFrontend=!0,e.frontendType=e.frontendType==="web"?"both":"mobile")}detectBackend(t,e){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(o=>t[o])&&(e.hasBackend=!0)}detectDatabase(t,e){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(o=>t[o])&&(e.hasDatabase=!0)}detectTesting(t,e,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(c=>t[c]||e.devDependencies?.[c])&&(s.hasTesting=!0)}async detectDocker(){let t=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let e of t)if(await this.fileExistsInProject(e))return!0;return!1}collectFrameworks(t,e){t.react&&e.frameworks.push("React"),t.next&&e.frameworks.push("Next.js"),t.vue&&e.frameworks.push("Vue"),t.nuxt&&e.frameworks.push("Nuxt"),t.svelte&&e.frameworks.push("Svelte"),t["@angular/core"]&&e.frameworks.push("Angular"),t["react-native"]&&e.frameworks.push("React Native"),t.expo&&e.frameworks.push("Expo"),t.express&&e.frameworks.push("Express"),t.fastify&&e.frameworks.push("Fastify"),t.hono&&e.frameworks.push("Hono"),t.koa&&e.frameworks.push("Koa"),(t["@nestjs/core"]||t.nest)&&e.frameworks.push("NestJS"),t.astro&&e.frameworks.push("Astro"),t.remix&&e.frameworks.push("Remix"),t.gatsby&&e.frameworks.push("Gatsby")}async readPackageJson(){try{let t=F.join(this.projectPath,"package.json"),e=await j.readFile(t,"utf-8");return JSON.parse(e)}catch{return null}}async fileExistsInProject(t){return g(F.join(this.projectPath,t))}};async function I(r){let t={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},e={cwd:r},s=a(i=>i.catch(()=>null),"safe"),[o,c,w,h,b,v]=await Promise.all([s(l("git branch --show-current",e)),s(l("git rev-list --count HEAD",e)),s(l("git shortlog -sn --all",e)),s(l("git status --porcelain",e)),s(l('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',e)),s(l('git log --oneline --since="1 week ago"',e))]);if(o&&(t.branch=o.stdout.trim()||"main"),c&&(t.commits=parseInt(c.stdout.trim(),10)||0),w&&(t.contributors=w.stdout.split(`
8
+ import{a as f}from"./chunk-DYHYDHCW.mjs";import{d as x,f as D,k as g,o as S}from"./chunk-UH4MD3F3.mjs";import{a as l,p as P}from"./chunk-QWQFF2UG.mjs";import{d as k}from"./chunk-PKDYFXMI.mjs";import{a}from"./chunk-E66B27AL.mjs";import y from"node:path";P();S();S();import j from"node:fs/promises";import F from"node:path";var d=class{static{a(this,"StackDetector")}projectPath;constructor(t){this.projectPath=t}async detect(){let t={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},e=await this.readPackageJson();if(e){let s={...e.dependencies,...e.devDependencies};this.detectFrontend(s,t),this.detectBackend(s,t),this.detectDatabase(s,t),this.detectTesting(s,e,t),this.collectFrameworks(s,t)}return t.hasDocker=await this.detectDocker(),t}detectFrontend(t,e){(t.react||t.vue||t.svelte||t["@angular/core"])&&(e.hasFrontend=!0,e.frontendType="web"),(t["react-native"]||t.expo)&&(e.hasFrontend=!0,e.frontendType=e.frontendType==="web"?"both":"mobile")}detectBackend(t,e){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(o=>t[o])&&(e.hasBackend=!0)}detectDatabase(t,e){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(o=>t[o])&&(e.hasDatabase=!0)}detectTesting(t,e,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(c=>t[c]||e.devDependencies?.[c])&&(s.hasTesting=!0)}async detectDocker(){let t=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let e of t)if(await this.fileExistsInProject(e))return!0;return!1}collectFrameworks(t,e){t.react&&e.frameworks.push("React"),t.next&&e.frameworks.push("Next.js"),t.vue&&e.frameworks.push("Vue"),t.nuxt&&e.frameworks.push("Nuxt"),t.svelte&&e.frameworks.push("Svelte"),t["@angular/core"]&&e.frameworks.push("Angular"),t["react-native"]&&e.frameworks.push("React Native"),t.expo&&e.frameworks.push("Expo"),t.express&&e.frameworks.push("Express"),t.fastify&&e.frameworks.push("Fastify"),t.hono&&e.frameworks.push("Hono"),t.koa&&e.frameworks.push("Koa"),(t["@nestjs/core"]||t.nest)&&e.frameworks.push("NestJS"),t.astro&&e.frameworks.push("Astro"),t.remix&&e.frameworks.push("Remix"),t.gatsby&&e.frameworks.push("Gatsby")}async readPackageJson(){try{let t=F.join(this.projectPath,"package.json"),e=await j.readFile(t,"utf-8");return JSON.parse(e)}catch{return null}}async fileExistsInProject(t){return g(F.join(this.projectPath,t))}};async function I(r){let t={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},e={cwd:r},s=a(i=>i.catch(()=>null),"safe"),[o,c,w,h,b,v]=await Promise.all([s(l("git branch --show-current",e)),s(l("git rev-list --count HEAD",e)),s(l("git shortlog -sn --all",e)),s(l("git status --porcelain",e)),s(l('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',e)),s(l('git log --oneline --since="1 week ago"',e))]);if(o&&(t.branch=o.stdout.trim()||"main"),c&&(t.commits=parseInt(c.stdout.trim(),10)||0),w&&(t.contributors=w.stdout.split(`
9
9
  `).filter(i=>i.trim()).length),h){let i=h.stdout.trim().split(`
10
10
  `).filter(Boolean);t.hasChanges=i.length>0;for(let p of i){let m=p.substring(0,2),u=p.substring(3);m.startsWith("A")||m.startsWith("M ")?t.stagedFiles.push(u):m.includes("M")?t.modifiedFiles.push(u):m.startsWith("??")&&t.untrackedFiles.push(u)}}return b&&(t.recentCommits=b.stdout.split(`
11
11
  `).filter(Boolean).map(i=>{let[p,m,u]=i.split("|");return{hash:p,message:m,date:u}})),v&&(t.weeklyCommits=v.stdout.split(`
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as r}from"./chunk-E66B27AL.mjs";import{createHash as e}from"node:crypto";function s(n){return e("sha256").update(n).digest("hex")}r(s,"sha256");function c(n){return s(n).slice(0,16)}r(c,"sha256Short");function f(n){let t=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(i(n)):JSON.stringify(n);return s(t)}r(f,"hashPayload");function i(n){let t={};for(let o of Object.keys(n).sort())t[o]=n[o];return t}r(i,"sortKeys");export{s as a,c as b,f as c};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as x,b as h}from"./chunk-OL6ITIAZ.mjs";import{a as M,h as I}from"./chunk-DXQMKW2B.mjs";import{e as b}from"./chunk-OP467HW6.mjs";import{a as S}from"./chunk-DGBDMUBL.mjs";import{a as l,b as D}from"./chunk-HDHVBB6Q.mjs";import{b as R}from"./chunk-GCKILEXJ.mjs";import{a as c}from"./chunk-E66B27AL.mjs";D();var F=.92,v=.18;function d(e){let r=new Map,n=[];for(let s of e){r.set(l(s.content),s.id);let o=x(s.content);n.push(Float64Array.from(o))}return{entries:e,fingerprints:r,vectors:n}}c(d,"buildReferenceIndex");function g(e,r,n){if(!r||r.entries.length===0)return{excess:1,maxSim:0,nearestId:null,exactDup:!1,nearDup:!1};let s=l(e),o=r.fingerprints.get(s);if(o&&o!==n)return{excess:0,maxSim:1,nearestId:o,exactDup:!0,nearDup:!0};let f=x(e),a=r.entries.reduce((t,m,_)=>{if(n&&m.id===n)return t;let E=h(f,r.vectors[_]);return E>t.maxSim?{maxSim:E,nearestId:m.id}:t},{maxSim:0,nearestId:null}),i=Math.max(0,Math.min(1,a.maxSim)),u=a.nearestId,p=i>=F;return{excess:p?0:Math.max(0,Math.min(1,1-i)),maxSim:i,nearestId:u,exactDup:!1,nearDup:p}}c(g,"excessAgainstIndex");function L(e,r,n){return g(e,d(r),n)}c(L,"computeExcess");var $=new Set(["decision","gotcha","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","context"]),k=150,N={declared:3,extracted:2,ambiguous:1,inferred:0};function T(e){return e.tags?.context_schema==="living-v2"||e.tags?.synthesis==="model-authored"||e.tags?.synthesis==="deterministic"||e.tags?.source==="land-auto"||e.tags?.capture==="land-v2"}c(T,"isLivingV2");function w(e){return!(!R(e)||e.content.trim().length<40||!$.has(e.type)||e.type==="context"&&!T(e)||e.type==="inbox"||e.type==="todo"||e.type==="idea")}c(w,"isReferenceEligible");function A(e){let r=N[e.provenance]??1,n=e.type==="decision"||e.type==="gotcha"?100:e.type==="learning"||e.type==="fact"?50:e.type==="context"?30:20,s=Date.parse(e.rememberedAt),o=Number.isFinite(s)?s/1e13:0;return n*10+r*3+o}c(A,"referenceRank");function C(e){let r=e.filter(w);return r.sort((n,s)=>A(s)-A(n)),r.slice(0,k)}c(C,"buildReferenceModel");var P=new Set(["decision","gotcha","red-herring","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","shipped"]),j=.28;function Q(e,r,n,s){let o=n.trim();if(o.length===0)return{accept:!1,reason:"empty content"};let f=M(o,r);if(f.junk)return{accept:!1,reason:`junk capture: ${f.reason}`};let a=I(o,r,{force:s?.force==="true"||s?.["precision:force"]==="true"});if(a.action==="refuse")return{accept:!1,reason:`precision: ${a.reason}`};if(a.action==="demote")return{accept:!1,reason:`precision demote\u2192${a.demoteTo??"context"}: ${a.reason}`};let i=b(s?.source);if(P.has(r)&&!i)return{accept:!0,reason:"judgment type \u2014 always accept novel content"};let u=(()=>{try{return S.allEntriesForIndex(e)}catch{return null}})();if(!u)return{accept:!0,reason:"gate skipped (read failure)"};if(u.length===0)return{accept:!0,reason:"empty vault \u2014 seed accepted"};let p=C(u);if(p.length===0)return{accept:!0,reason:"empty reference \u2014 accept"};let y=d(p),t=g(o,y),m=i?j:v;return t.exactDup||t.nearDup||t.excess<m?{accept:!1,reason:t.exactDup?`redundant exact match of ${t.nearestId}`:i?`auto-source low excess ${t.excess.toFixed(2)} (floor ${m}) vs R nearest ${t.nearestId}`:`low excess ${t.excess.toFixed(2)} vs reference (nearest ${t.nearestId}, sim ${t.maxSim.toFixed(2)})`,excess:t.excess,nearestId:t.nearestId}:{accept:!0,reason:i?`auto-source excess ${t.excess.toFixed(2)} above floor`:`excess ${t.excess.toFixed(2)} above capture floor`,excess:t.excess,nearestId:t.nearestId}}c(Q,"captureGate");export{k as a,w as b,C as c,F as d,v as e,d as f,g,L as h,Q as i};
8
+ import{a as x,b as h}from"./chunk-MI3JEFON.mjs";import{a as M,h as I}from"./chunk-DXQMKW2B.mjs";import{e as b}from"./chunk-NWZEBCTC.mjs";import{a as S}from"./chunk-27XFSCOE.mjs";import{a as l,b as D}from"./chunk-KG7Z6OMK.mjs";import{b as R}from"./chunk-GCKILEXJ.mjs";import{a as c}from"./chunk-E66B27AL.mjs";D();var F=.92,v=.18;function d(e){let r=new Map,n=[];for(let s of e){r.set(l(s.content),s.id);let o=x(s.content);n.push(Float64Array.from(o))}return{entries:e,fingerprints:r,vectors:n}}c(d,"buildReferenceIndex");function g(e,r,n){if(!r||r.entries.length===0)return{excess:1,maxSim:0,nearestId:null,exactDup:!1,nearDup:!1};let s=l(e),o=r.fingerprints.get(s);if(o&&o!==n)return{excess:0,maxSim:1,nearestId:o,exactDup:!0,nearDup:!0};let f=x(e),a=r.entries.reduce((t,m,_)=>{if(n&&m.id===n)return t;let E=h(f,r.vectors[_]);return E>t.maxSim?{maxSim:E,nearestId:m.id}:t},{maxSim:0,nearestId:null}),i=Math.max(0,Math.min(1,a.maxSim)),u=a.nearestId,p=i>=F;return{excess:p?0:Math.max(0,Math.min(1,1-i)),maxSim:i,nearestId:u,exactDup:!1,nearDup:p}}c(g,"excessAgainstIndex");function L(e,r,n){return g(e,d(r),n)}c(L,"computeExcess");var $=new Set(["decision","gotcha","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","context"]),k=150,N={declared:3,extracted:2,ambiguous:1,inferred:0};function T(e){return e.tags?.context_schema==="living-v2"||e.tags?.synthesis==="model-authored"||e.tags?.synthesis==="deterministic"||e.tags?.source==="land-auto"||e.tags?.capture==="land-v2"}c(T,"isLivingV2");function w(e){return!(!R(e)||e.content.trim().length<40||!$.has(e.type)||e.type==="context"&&!T(e)||e.type==="inbox"||e.type==="todo"||e.type==="idea")}c(w,"isReferenceEligible");function A(e){let r=N[e.provenance]??1,n=e.type==="decision"||e.type==="gotcha"?100:e.type==="learning"||e.type==="fact"?50:e.type==="context"?30:20,s=Date.parse(e.rememberedAt),o=Number.isFinite(s)?s/1e13:0;return n*10+r*3+o}c(A,"referenceRank");function C(e){let r=e.filter(w);return r.sort((n,s)=>A(s)-A(n)),r.slice(0,k)}c(C,"buildReferenceModel");var P=new Set(["decision","gotcha","red-herring","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","shipped"]),j=.28;function Q(e,r,n,s){let o=n.trim();if(o.length===0)return{accept:!1,reason:"empty content"};let f=M(o,r);if(f.junk)return{accept:!1,reason:`junk capture: ${f.reason}`};let a=I(o,r,{force:s?.force==="true"||s?.["precision:force"]==="true"});if(a.action==="refuse")return{accept:!1,reason:`precision: ${a.reason}`};if(a.action==="demote")return{accept:!1,reason:`precision demote\u2192${a.demoteTo??"context"}: ${a.reason}`};let i=b(s?.source);if(P.has(r)&&!i)return{accept:!0,reason:"judgment type \u2014 always accept novel content"};let u=(()=>{try{return S.allEntriesForIndex(e)}catch{return null}})();if(!u)return{accept:!0,reason:"gate skipped (read failure)"};if(u.length===0)return{accept:!0,reason:"empty vault \u2014 seed accepted"};let p=C(u);if(p.length===0)return{accept:!0,reason:"empty reference \u2014 accept"};let y=d(p),t=g(o,y),m=i?j:v;return t.exactDup||t.nearDup||t.excess<m?{accept:!1,reason:t.exactDup?`redundant exact match of ${t.nearestId}`:i?`auto-source low excess ${t.excess.toFixed(2)} (floor ${m}) vs R nearest ${t.nearestId}`:`low excess ${t.excess.toFixed(2)} vs reference (nearest ${t.nearestId}, sim ${t.maxSim.toFixed(2)})`,excess:t.excess,nearestId:t.nearestId}:{accept:!0,reason:i?`auto-source excess ${t.excess.toFixed(2)} above floor`:`excess ${t.excess.toFixed(2)} above capture floor`,excess:t.excess,nearestId:t.nearestId}}c(Q,"captureGate");export{k as a,w as b,C as c,F as d,v as e,d as f,g,L as h,Q as i};
@@ -5,9 +5,9 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as f}from"./chunk-Y5NQV46G.mjs";import{a as v}from"./chunk-DGBDMUBL.mjs";import{e as p,g as I}from"./chunk-HDHVBB6Q.mjs";import{a as R,b as q}from"./chunk-WUHGODSQ.mjs";import{b as H,o as F}from"./chunk-CTWZQ7YI.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var U="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??U);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");q();F();import X from"node:fs";import Q from"node:path";var D="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(R(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await H("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function k(){if(S.value!==void 0)return S.value;let r=process.env[D]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(k,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await k(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",N=256,ae=800;function ce(r){return r.split("").reduce((n,t)=>Math.imul(n^t.charCodeAt(0),16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function P(r){let e=new Float64Array(N),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%N,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(P,"embedLocal");function Oe(r){return P(r)}s(Oe,"embedLocalText");var L=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>P(n))}};function O(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new L}s(O,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Ce(r,e){let n=E(r)*E(e);return n===0?0:T(r,e)/n}s(Ce,"cosineSimilarity");function E(r){let e=Array.from({length:r.length},(n,t)=>r[t]).reduce((n,t)=>n+t*t,0);return Math.sqrt(e)}s(E,"l2Norm");function T(r,e){let n=Math.min(r.length,e.length);return Array.from({length:n},(t,i)=>r[i]*e[i]).reduce((t,i)=>t+i,0)}s(T,"dot");var ge=2e3,fe=10,C=new Map,Pe={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
8
+ import{a as f}from"./chunk-Y5NQV46G.mjs";import{a as v}from"./chunk-27XFSCOE.mjs";import{e as p,g as I}from"./chunk-KG7Z6OMK.mjs";import{a as R,b as q}from"./chunk-WUHGODSQ.mjs";import{b as H,p as F}from"./chunk-QWQFF2UG.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var U="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??U);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");q();F();import X from"node:fs";import Q from"node:path";var D="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(R(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await H("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function k(){if(S.value!==void 0)return S.value;let r=process.env[D]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(k,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await k(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",N=256,ae=800;function ce(r){return r.split("").reduce((n,t)=>Math.imul(n^t.charCodeAt(0),16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function P(r){let e=new Float64Array(N),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%N,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(P,"embedLocal");function Oe(r){return P(r)}s(Oe,"embedLocalText");var L=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>P(n))}};function O(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new L}s(O,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Ce(r,e){let n=E(r)*E(e);return n===0?0:T(r,e)/n}s(Ce,"cosineSimilarity");function E(r){let e=Array.from({length:r.length},(n,t)=>r[t]).reduce((n,t)=>n+t*t,0);return Math.sqrt(e)}s(E,"l2Norm");function T(r,e){let n=Math.min(r.length,e.length);return Array.from({length:n},(t,i)=>r[i]*e[i]).reduce((t,i)=>t+i,0)}s(T,"dot");var ge=2e3,fe=10,C=new Map,Pe={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
9
9
  VALUES (?, ?, ?, ?, ?, ?)
10
10
  ON CONFLICT(memory_id) DO UPDATE SET
11
11
  vector = excluded.vector, model = excluded.model,
12
- dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??O(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-E7WGFL47.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!x(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!x(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,B,K)=>{let A=c[K];return!A||A.length===0?y:(this.store(r,B.id,A,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=C.get(r)??0;return C.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??O(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
12
+ dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??O(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-LWETHQX3.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!x(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!x(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,B,K)=>{let A=c[K];return!A||A.length===0?y:(this.store(r,B.id,A,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=C.get(r)??0;return C.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??O(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
13
13
  WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,ge)}catch{return null}})();if(!u)return[];let l=E(a);if(l===0)return[];let g=u.map(m=>{let d=le(m.vector),c=l*(m.norm??E(d));return{id:m.memory_id,score:c===0?0:T(a,d)/c}}).sort((m,d)=>d.score-m.score).slice(0,t),b=[];for(let m of g){let d=v.getById(r,m.id);d&&b.push(d)}return b}};export{Oe as a,Ce as b,Pe as c};
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{b as y,c as ne,d as re}from"./chunk-JQE2F2RK.mjs";import{a as V,b as te}from"./chunk-WUHGODSQ.mjs";import{g as P,o as I}from"./chunk-UH4MD3F3.mjs";import{b as N,p as ee}from"./chunk-QWQFF2UG.mjs";import{a as A,e as g,f as D}from"./chunk-BUDZL4DW.mjs";import{a as o,b as O}from"./chunk-E66B27AL.mjs";re();te();D();import{constants as de}from"node:fs";import d from"node:fs/promises";import j from"node:os";import a from"node:path";ne();import k from"node:fs/promises";import ae from"node:path";D();I();import m from"node:fs";import _ from"node:fs/promises";import M from"node:os";import p from"node:path";var w="mcp-remote@0.1.38";var E="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";function se(){let t=oe();if(t)return t;if(process.env.PRJCT_MCP_ALLOW_LOCAL==="1"){let e=ie();if(e)return{command:e,args:["mcp-server"],description:E}}return{command:"npx",args:["-y","prjct-cli@latest","mcp-server"],description:E}}o(se,"getPrjctMcpConfig");function $(t){let e=t.replace(/\\/g,"/");return!!(e.includes("/.worktrees/")||e.includes("/prjct-cli/bin/prjct")&&!e.includes("/node_modules/prjct-cli/"))}o($,"isNonProductionPrjctPath");function oe(){let t=[];try{t.push(p.dirname(O.resolve("prjct-cli/package.json")))}catch{}let e=M.homedir();for(let n of[process.env.NVM_BIN?p.resolve(process.env.NVM_BIN,".."):"",p.join(e,".nvm","versions","node",process.version,"lib"),"/opt/homebrew/lib","/usr/local/lib"].filter(Boolean))t.push(p.join(n,"node_modules","prjct-cli"));for(let n of t){if($(n))continue;let r=p.join(n,"bin","prjct.cjs"),i=m.existsSync(p.join(n,"dist","bin","prjct.mjs"))||m.existsSync(p.join(n,"dist","bin","prjct-core.mjs"));if(!m.existsSync(r)||!i)continue;let c=[process.execPath,p.join(p.dirname(process.execPath),"node"),p.join(n,"..","..","bin","node")].find(x=>x&&m.existsSync(x)),u=p.resolve(n,"..","..","..","bin","node"),f=m.existsSync(u)?u:c??process.execPath;return{command:f,args:[r,"mcp-server"],env:{PATH:`${p.dirname(f)}${p.delimiter}/usr/bin${p.delimiter}/bin`},description:E}}return null}o(oe,"resolvePublishedPrjctMcpConfig");function ie(){let t=process.argv[1],e=[t?p.resolve(p.dirname(t),"prjct"):"",t?p.resolve(p.dirname(t),"..","bin","prjct"):"",p.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let n of e){if(!m.existsSync(n))continue;let r=(()=>{try{return m.realpathSync(n)}catch{return n}})();if(!$(r))return r}return null}o(ie,"resolveLocalPrjctBin");var h={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:se(),linear:{command:"npx",args:["-y",w,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",w,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};function S(){return process.env.PRJCT_TEST_MODE==="1"?p.join(M.tmpdir(),"prjct-context7-test","mcp.json"):p.join(M.homedir(),".claude","mcp.json")}o(S,"getClaudeMcpConfigPath");async function L(t=S()){try{let e=await _.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let n=g(e).toLowerCase();if(n.includes("no such file")||n.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${g(e)}`)}}o(L,"readMcpConfig");async function ce(t,e=S()){await P(e,t)}o(ce,"writeMcpConfig");async function Oe(t,e,n=S()){let r=await L(n),i={...r.mcpServers||{}},s=i[t];i[t]=e,r.mcpServers=i;let c=JSON.stringify(s)!==JSON.stringify(e);return await ce(r,n),{path:n,changed:c}}o(Oe,"upsertMcpServer");async function Ne(t,e=S()){return!!(await L(e)).mcpServers?.[t]}o(Ne,"hasMcpServer");function T(t,e,n,r,i){let s=t.indexOf(n),c=t.indexOf(r);if(s!==-1&&c!==-1&&c>s){let u=t.slice(0,s),f=t.slice(c+r.length),x=f.startsWith(`
9
+ `)?f.slice(1):f;return{next:u+e+x}}return new RegExp(`^\\s*\\[mcp_servers\\.${i}\\]`,"m").test(t)?{next:t,skipped:"user-managed"}:t.trim().length>0?{next:`${t.trimEnd()}
10
+
11
+ ${e}`}:{next:e}}o(T,"upsertMarkedBlock");async function b(t,e,n){return n===e?{path:t,changed:!1}:(await _.mkdir(p.dirname(t),{recursive:!0}),await _.writeFile(t,n,"utf-8"),{path:t,changed:!0})}o(b,"writeConfigIfChanged");var F="# prjct:mcp:start - managed by prjct, do not edit between markers",B="# prjct:mcp:end",J="# prjct:mcp:context7:start - managed by prjct, do not edit between markers",X="# prjct:mcp:context7:end",H=["model-with-reasoning","current-dir","git-branch","context-remaining","five-hour-limit","weekly-limit","task-progress"];function v(){return process.env.PRJCT_TEST_MODE==="1"?ae.join(y(".prjct-tests"),"codex","config.toml"):y(".codex","config.toml")}o(v,"getCodexConfigTomlPath");function C(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}o(C,"tomlString");function K(t,e,n,r){let i=(e.args??[]).map(C).join(", "),s=[n,`[mcp_servers.${t}]`,`command = ${C(e.command)}`,`args = [${i}]`];if(e.env&&Object.keys(e.env).length>0){let c=Object.entries(e.env).map(([u,f])=>`${u} = ${C(f)}`).join(", ");s.push(`env = { ${c} }`)}return s.push(r,""),s.join(`
12
+ `)}o(K,"buildMcpTomlBlock");function ue(t=h.prjct){return K("prjct",t,F,B)}o(ue,"buildPrjctMcpTomlBlock");function pe(t=h.context7){return K("context7",t,J,X)}o(pe,"buildContext7McpTomlBlock");function fe(){return["[tui]",`status_line = [${H.map(C).join(", ")}]`,""].join(`
13
+ `)}o(fe,"buildCodexStatusLineToml");function le(t){return/^\s*(?:tui\.)?status_line\s*=/m.test(t)}o(le,"hasCodexStatusLine");function me(t){if(le(t))return{toml:t,changed:!1};let n=`status_line = [${H.map(C).join(", ")}]
14
+ `,r=/^\s*\[tui\]\s*$/m.exec(t);if(r){let s=r.index+r[0].length,c=t.slice(0,s),u=t.slice(s),f=u.startsWith(`
15
+ `)?u.slice(1):u;return{toml:`${c}
16
+ ${n}${f}`,changed:!0}}let i=fe();return{toml:t.trim().length>0?`${t.trimEnd()}
17
+
18
+ ${i}`:i,changed:!0}}o(me,"ensureCodexStatusLineToml");async function Fe(t=v()){let e=await k.readFile(t,"utf-8").catch(()=>""),n=ue(),r=T(e,n,F,B,"prjct"),i=r.skipped,s=me(r.next),c=s.toml,u=await b(t,e,c);return{...u,skipped:i,...u.changed?{statusLineChanged:s.changed}:{}}}o(Fe,"ensureCodexMcpServer");async function U(t=v()){let e=await k.readFile(t,"utf-8").catch(()=>""),n=pe(),{next:r,skipped:i}=T(e,n,J,X,"context7");return{...await b(t,e,r),skipped:i}}o(U,"ensureCodexContext7Server");async function q(t=v()){try{let e=await k.readFile(t,"utf-8");return/^\s*\[mcp_servers\.context7\]/m.test(e)}catch{return!1}}o(q,"codexHasContext7Server");ee();I();function Q(){return process.env.NODE_ENV==="test"?a.join(j.tmpdir(),"prjct-context7-test","verify-cache.json"):a.join(V(),"state","context7-verify.json")}o(Q,"getVerifyCachePath");async function ge(){try{let t=await d.readFile(Q(),"utf-8"),e=JSON.parse(t);if(typeof e?.at=="number"&&e.status)return{...e,provider:e.provider??"claude"}}catch{}return null}o(ge,"readPersistedVerify");async function he(t,e,n){let r=Q();try{await d.mkdir(a.dirname(r),{recursive:!0}),await d.writeFile(r,JSON.stringify({at:t,provider:e,status:n}),"utf-8")}catch{}}o(he,"writePersistedVerify");var Z=h.context7,l={value:null},Ce=[a.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],ve=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];async function G(t){try{return(await d.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}o(G,"listChildDirs");async function xe(t){let e=[],n=process.env.NVM_DIR||a.join(t,".nvm"),r=a.join(n,"versions","node");for(let c of await G(r))e.push(a.join(r,c,"bin"));let i=process.env.FNM_DIR||a.join(t,".local","share","fnm"),s=a.join(i,"node-versions");for(let c of await G(s))e.push(a.join(s,c,"installation","bin"));return e}o(xe,"discoverNodeManagerBinDirs");async function Pe(t=process.env.PATH||"",e=j.homedir()){let n=new Set,r=[],i=ve.map(c=>a.join(e,...c)),s=[...Ce,...i,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[a.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[a.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[a.join(process.env.MISE_DATA_DIR,"shims")]:[],...await xe(e)];for(let c of[...t.split(a.delimiter),...s]){let u=c.trim();!u||n.has(u)||(n.add(u),r.push(u))}return r.join(a.delimiter)}o(Pe,"buildContext7SmokePath");async function Se(t,e){if(a.isAbsolute(t)||t.includes(a.sep))return t;let n=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split(a.delimiter))if(r)for(let i of n){let s=a.join(r,t+i);try{return await d.access(s,de.X_OK),s}catch{}}return t}o(Se,"resolveExecutable");function Y(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?a.join(j.tmpdir(),"prjct-context7-test","mcp.json"):a.join(j.homedir(),".claude","mcp.json")}o(Y,"getConfigPath");async function z(t){try{let e=await d.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(A(e))return{};throw e}}o(z,"readConfig");async function je(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=Z,e=[...t.args||[],"--help"],n=await Pe(),r=await Se(t.command||"npx",n);await N(r,e,{timeout:15e3,env:{...process.env,PATH:n}})}o(je,"runSmokeCheck");var R=class{static{o(this,"Context7Service")}async install(e="claude"){if(e==="codex")return this.installCodex();if(e!=="claude")return{installed:!1,verified:!1,configPath:"",message:`Context7 auto-config not supported for ${e}; skipping`};let n=Y(),r=a.dirname(n);await d.mkdir(r,{recursive:!0});let i=await z(n),s=i.mcpServers||{},c=Z,u=s.context7;return u&&JSON.stringify(u)===JSON.stringify(c)?{installed:!0,verified:!1,configPath:n,message:"Context7 MCP already configured"}:(s.context7=c,i.mcpServers=s,await P(n,i),l.value=null,{installed:!0,verified:!1,configPath:n,message:"Context7 MCP configured"})}async installCodex(){let e=await U();return e.changed&&(l.value=null),{installed:!0,verified:!1,configPath:e.path,message:e.skipped==="user-managed"?"Context7 MCP user-managed in config.toml":"Context7 MCP configured in config.toml"}}async resolveConfigured(e){if(e==="codex"){let c=v();return await q(c)?{ok:!0,configPath:c}:{ok:!1,configPath:c,message:"Context7 MCP not configured in ~/.codex/config.toml"}}if(e!=="claude")return{ok:!1,configPath:"",message:`Context7 not managed for ${e}`};let n=Y(),s=((await z(n)).mcpServers||{}).context7;return!s?.command||!Array.isArray(s.args)||s.args.length===0?{ok:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"}:{ok:!0,configPath:n}}async verify(e="claude"){let n=Date.now();if(l.value&&l.value.provider===e&&n-l.value.at<3e5)return l.value.status;let r=await ge();if(r?.status.verified&&r.provider===e&&n-r.at<3e5)return l.value=r,r.status;let i=await this.resolveConfigured(e);if(!i.ok)return{installed:!1,verified:!1,configPath:i.configPath,message:i.message};try{await je();let s={installed:!0,verified:!0,configPath:i.configPath};return l.value={at:n,provider:e,status:s},await he(n,e,s),s}catch(s){let c={installed:!0,verified:!1,configPath:i.configPath,message:`Context7 smoke check failed: ${g(s)}`};return l.value={at:n,provider:e,status:c},c}}async ensureReady(e="claude"){await this.install(e);let n=await this.verify(e);if(!n.verified){let r=n.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return n}},ye=new R,et=ye;export{h as a,S as b,Oe as c,Ne as d,Fe as e,U as f,Q as g,Pe as h,et as i};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as o,g as y}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";import{createHash as f}from"node:crypto";import{z as u}from"zod";var d=u.string().trim().min(1).max(200),v=u.string().trim().min(1).max(2e3),T=u.enum(["open","resolved","false_positive"]),g=u.object({source:d,runtime:d,model:d,sessionId:d.nullish(),taskId:d.nullish(),category:d,expectedBehavior:v,observedBehavior:v,relatedRuleId:d.nullish(),occurredAt:u.string().datetime().optional()}).strict(),N=g.omit({occurredAt:!0}).extend({id:u.string().min(1),projectId:u.string().min(1),dedupKey:u.string().length(64),disposition:T,occurredAt:u.string().datetime(),createdAt:u.string().datetime()}).strict();y();var b="instruction.guidance.activated",D=90,A=m(t=>t.normalize("NFKC").trim().replace(/\s+/g," ").toLocaleLowerCase("en-US"),"normalizedBehavior"),C=m(t=>f("sha256").update(JSON.stringify([t.source,t.sessionId??"",t.category,A(t.expectedBehavior),A(t.observedBehavior),t.relatedRuleId??""])).digest("hex"),"dedupKeyFor"),S=m(t=>N.parse({id:t.id,projectId:t.project_id,dedupKey:t.dedup_key,source:t.source,runtime:t.runtime,model:t.model,sessionId:t.session_id,taskId:t.task_id,category:t.category,expectedBehavior:t.expected_behavior,observedBehavior:t.observed_behavior,relatedRuleId:t.related_rule_id,disposition:t.disposition,occurredAt:t.occurred_at,createdAt:t.created_at}),"rowToFailure"),I=class{static{m(this,"InstructionFailureStorage")}record(i,n){let e=g.parse(n),c=C(e),a=`if_${c.slice(0,24)}`,E=new Date().toISOString(),_=e.occurredAt??E,l=o.query(i,`INSERT OR IGNORE INTO instruction_failures
8
+ import{d as o,g as y}from"./chunk-KG7Z6OMK.mjs";import{a as m}from"./chunk-E66B27AL.mjs";import{createHash as f}from"node:crypto";import{z as u}from"zod";var d=u.string().trim().min(1).max(200),v=u.string().trim().min(1).max(2e3),T=u.enum(["open","resolved","false_positive"]),g=u.object({source:d,runtime:d,model:d,sessionId:d.nullish(),taskId:d.nullish(),category:d,expectedBehavior:v,observedBehavior:v,relatedRuleId:d.nullish(),occurredAt:u.string().datetime().optional()}).strict(),N=g.omit({occurredAt:!0}).extend({id:u.string().min(1),projectId:u.string().min(1),dedupKey:u.string().length(64),disposition:T,occurredAt:u.string().datetime(),createdAt:u.string().datetime()}).strict();y();var b="instruction.guidance.activated",D=90,A=m(t=>t.normalize("NFKC").trim().replace(/\s+/g," ").toLocaleLowerCase("en-US"),"normalizedBehavior"),C=m(t=>f("sha256").update(JSON.stringify([t.source,t.sessionId??"",t.category,A(t.expectedBehavior),A(t.observedBehavior),t.relatedRuleId??""])).digest("hex"),"dedupKeyFor"),S=m(t=>N.parse({id:t.id,projectId:t.project_id,dedupKey:t.dedup_key,source:t.source,runtime:t.runtime,model:t.model,sessionId:t.session_id,taskId:t.task_id,category:t.category,expectedBehavior:t.expected_behavior,observedBehavior:t.observed_behavior,relatedRuleId:t.related_rule_id,disposition:t.disposition,occurredAt:t.occurred_at,createdAt:t.created_at}),"rowToFailure"),I=class{static{m(this,"InstructionFailureStorage")}record(i,n){let e=g.parse(n),c=C(e),a=`if_${c.slice(0,24)}`,E=new Date().toISOString(),_=e.occurredAt??E,l=o.query(i,`INSERT OR IGNORE INTO instruction_failures
9
9
  (id, project_id, dedup_key, source, runtime, model, session_id, task_id, category,
10
10
  expected_behavior, observed_behavior, related_rule_id, disposition, occurred_at, created_at)
11
11
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'open', ?, ?)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{b as s}from"./chunk-F4T7IAA7.mjs";import{b as i}from"./chunk-AZHE4VOM.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function d(t,n){let o=((t??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();return!o||o==="status"||o==="show"?{kind:"status"}:n.includes(o)?{kind:"mode",mode:o}:{kind:"unknown",sub:o}}e(d,"parseModeSubcommand");async function m(t,n={}){let r=await i.readConfig(t).catch(()=>null);return r?.projectId?{ok:!0,value:r}:{ok:!1,result:s("No prjct project here \u2014 run `prjct init` first.",n)}}e(m,"requireProjectConfig");export{d as a,m as b};
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as K}from"./chunk-HRWXMF7P.mjs";import{a as X}from"./chunk-ZJXH76Q5.mjs";import{a as q,j as H}from"./chunk-PUHX3ECX.mjs";import{a as J}from"./chunk-Q3EYM4GJ.mjs";import{e as Y}from"./chunk-AZYQFRPJ.mjs";import{c as P}from"./chunk-QPRNRLG6.mjs";import{d as M,e as I}from"./chunk-7JEKBJAP.mjs";import{a as x}from"./chunk-27XFSCOE.mjs";import{h as j}from"./chunk-DRGI5UHQ.mjs";import{b as E}from"./chunk-AZHE4VOM.mjs";import{d as f,g as G}from"./chunk-KG7Z6OMK.mjs";import{b,g as A,h as ct,i as W,k as ut,v as B,w as mt}from"./chunk-JAMSIKDE.mjs";import{d as lt}from"./chunk-JQE2F2RK.mjs";import{e as k,p as ot}from"./chunk-QWQFF2UG.mjs";import{b as _,e as dt}from"./chunk-EMTCZG5I.mjs";import{e as U,f as at}from"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";mt();import L from"node:fs";import pt from"node:path";var V=l(()=>B.getStatePath(),"stampDir"),z=l(()=>pt.join(V(),"installed-version"),"stampPath");function ft(){try{return L.readFileSync(z(),"utf-8").trim()}catch{return null}}l(ft,"readStamp");function ht(i){try{L.mkdirSync(V(),{recursive:!0}),L.writeFileSync(z(),i,"utf-8")}catch{}}l(ht,"writeStamp");function Q(i){return i?ft()===i:!0}l(Q,"isSyncCurrent");async function Z(i){if(i&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await import("./command-installer-MF4KUM3X.mjs");await e()}catch{}try{await(await import("./settings-installer-QDM3GB6J.mjs")).install()}catch{}try{let{SetupCommands:e}=await import("./setup-WQRJ6TQL.mjs");await new e().installStatusLine()}catch{}ht(i)}}l(Z,"runSelfHeal");G();at();ot();lt();G();ut();ct();var gt=50,N=class{static{l(this,"SessionTracker")}currentRow(e){try{return f.get(e,"SELECT * FROM cli_sessions WHERE status = 'active' ORDER BY last_activity DESC LIMIT 1")??null}catch{return null}}isExpired(e){return W(e,18e5)}toSessionData(e,t){return{id:t.id,projectId:e,status:t.status,createdAt:t.created_at,lastActivity:t.last_activity,commands:[],files:[]}}async touch(e){let t=b(),n=this.currentRow(e);if(n&&!this.isExpired(n.last_activity))return f.run(e,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",t,n.id),this.toSessionData(e,{...n,last_activity:t});n&&f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",n.id);let s=crypto.randomUUID();return f.run(e,"INSERT INTO cli_sessions (id, status, created_at, last_activity) VALUES (?, 'active', ?, ?)",s,t,t),this.toSessionData(e,{id:s,status:"active",created_at:t,last_activity:t})}async trackCommand(e,t,n){let s=this.currentRow(e);if(!s)return;let o=b();try{f.run(e,"INSERT INTO cli_session_commands (session_id, command, timestamp, duration_ms) VALUES (?, ?, ?, ?)",s.id,t,o,Math.round(n)),f.run(e,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",o,s.id)}catch{}}async getInfo(e){let t=this.currentRow(e);if(!t||this.isExpired(t.last_activity))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=Date.now(),s=new Date(t.created_at).getTime(),o=new Date(t.last_activity).getTime(),c=n-o,a=Math.max(0,18e5-c),r=f.query(e,"SELECT command FROM cli_session_commands WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?",t.id,gt);return{active:!0,id:t.id,duration:A(n-s),idleSince:t.last_activity,idleMs:c,expiresIn:A(a),commandCount:r.length,commands:r.map(m=>m.command).reverse(),filesRead:0,filesWritten:0}}async expire(e){try{f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE status = 'active'")}catch{}}async expireIfStale(e){let t=this.currentRow(e);return t&&this.isExpired(t.last_activity)?(f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",t.id),!0):!1}},et=new N;var yt={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},F=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...yt,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n=(()=>{try{return f.getDoc(e,"project")}catch{return null}})();if(!n)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;let c={cwd:this.projectPath,timeoutMs:3e3,maxBuffer:1024*256},a=`${t.lastSyncCommit}..HEAD`,[r,m]=await Promise.all([k(["rev-parse","--short","HEAD"],c),k(["rev-list","--count",a],c)]);if(!r.ok)return t.reason=r.kind==="exit"?"Not a git repository":`git ${r.kind} \u2014 staleness unknown`,t;if(t.currentCommit=r.stdout.trim(),t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;if(!m.ok)return m.kind==="exit"?(t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`."):t.reason=`git ${m.kind} reading history \u2014 staleness unknown. Retry shortly.`,t;if(t.commitsSinceSync=parseInt(m.stdout.trim(),10)||0,s){let y=new Date(s),g=new Date;t.daysSinceSync=Math.floor((g.getTime()-y.getTime())/(1e3*60*60*24))}if(t.commitsSinceSync>0&&t.commitsSinceSync<this.config.commitThreshold){let y=await k(["diff","--name-only",a],c),g=y.ok?y.stdout.trim().split(`
9
+ `).filter(Boolean).slice(0,200):[];t.changedFiles=g,t.significantChanges=g.filter(d=>this.config.significantFiles.some(p=>d.endsWith(p)||d.includes(p)))}else t.changedFiles=[],t.significantChanges=[];return t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${U(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0&&t.push(...nt(n)),e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
10
+ `)}async getSessionInfo(e){return et.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
11
+ `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let c of e.commands)s.has(c)||(s.add(c),o.push(c));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}return(e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0&&t.push(...nt(n)),t.join(`
12
+ `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}};function nt(i){let e=Math.max(...i.map(n=>n.length)),t="\u2500".repeat(e+2);return[`\u250C${t}\u2510`,...i.map(n=>`\u2502 ${n.padEnd(e)} \u2502`),`\u2514${t}\u2518`]}l(nt,"boxLines");var st=l((i,e)=>new F(i,e),"createStalenessChecker");dt();var St=1600,R=3,Ct=4,O={minTeaser:24,maxTeaser:90};async function wt(i,e,t={}){let n=e??await E.readConfig(i);if(!n?.projectId)return null;let s=n.persona,o=t.digest?await(async()=>{try{let{memoryL0IndexForSession:h}=await import("./memory-index-QK5QJOFJ.mjs");return h(n.projectId,{rebuildIfStale:!0})||it(n.projectId)}catch{return it(n.projectId)}})():null,c=vt(i,n.projectId),a=import("./vault-retire-notice-HT756AND.mjs").then(({vaultRetirementNotice:h})=>h(n,n.projectId)),r=(async()=>{try{let{buildLandCue:h}=await import("./land-cue-MMISX2BI.mjs");return await h(n.projectId,i,n)}catch{return null}})(),m=(async()=>{try{let{effectiveWeakModelMode:h,weakModelBanner:C}=await import("./weak-model-mode-FLCEQ2BV.mjs");return h(n)==="on"?C():null}catch{return null}})(),w=t.digest?(async()=>{try{let{formatPendingHandoffCue:h}=await import("./agent-switch-2U2LOBGR.mjs"),C=h(n.projectId);return C?`# prjct: pending handoff
13
+ ${C}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:C}=await import("./session-continuity-RKNAJJHR.mjs");return C(h(n.projectId))}catch{return null}})():Promise.resolve(null),g=Tt(i,n.projectId),[d,p,S,v,T,$,D]=await Promise.all([c,a,r,m,w,y,g]);if(!D&&!s&&!o&&!d&&!p&&!S&&!v&&!T&&!$)return null;let u=["# prjct: project context",""];return D&&u.push(D,""),s&&u.push(xt(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&u.push(""),u.push(o)),d&&((s||o)&&u.push(""),u.push(d)),p&&((s||o||d)&&u.push(""),u.push(p)),S&&((s||o||d||p)&&u.push(""),u.push(S)),v&&((s||o||d||p||S)&&u.push(""),u.push(v)),T&&((s||o||d||p||S||v)&&u.push(""),u.push(T)),$&&((s||o||d||p||S||v||T)&&u.push(""),u.push($)),u.join(`
14
+ `)}l(wt,"buildSessionContext");async function vt(i,e){try{let t=st(i),n=await t.check(e);if(!n.isStale||n.commitsSinceSync<=0)return null;let s=t.getWarning(n);if(!s)return null;try{let c=await import("node:path"),a=await import("node:os"),{maybeDetachDriftRefresh:r,readDriftStamp:m,formatDriftNotice:w,driftStaleResolved:y}=await import("./drift-refresh-TD3PYPJN.mjs"),g=process.env.PRJCT_CLI_HOME?c.resolve(process.env.PRJCT_CLI_HOME):c.join(a.homedir(),".prjct-cli"),d=m(g);if(y(d))return w({warning:s,commitsSinceSync:n.commitsSinceSync,stamp:d,refreshScheduled:!1});let p=r({projectPath:i,cliHome:g,commitsSinceSync:n.commitsSinceSync}),S=m(g);return w({warning:s,commitsSinceSync:n.commitsSinceSync,stamp:S,refreshScheduled:p})}catch{}let o=await(async()=>{try{let{hasSymbolIndex:c,loadMeta:a}=await import("./symbol-graph-BKQIMFRG.mjs");if(!c(e))return" Code graph empty \u2014 `prjct code reindex` (or `prjct sync`) before trace/impact.";if(n.commitsSinceSync<5)return"";let r=a(e);return` Symbol index may lag${r?.builtAt?` (index ${r.builtAt.slice(0,10)})`:""} \u2014 prefer \`prjct code reindex\` after big pulls.`}catch{return""}})();return`**Understanding may be stale:** ${s} \u2014 run \`prjct sync\` before big calls.${o}`}catch{return null}}l(vt,"buildStalenessNotice");function it(i){let e=(()=>{try{let r=P.rerank(i,x.recall(i,{types:["gotcha","anti-pattern"],limit:R*4})).slice(0,R),m=P.rerank(i,x.recall(i,{types:["decision"],limit:R*4})).slice(0,R);return{gotchas:r,decisions:m}}catch{return null}})();if(!e)return null;let{gotchas:t,decisions:n}=e,s=(()=>{try{let r=x.recall(i,{types:["feedback","improvement-signal"],limit:40,dedupeByKey:!1});return q(r,Ct)}catch{return[]}})(),o=H(i,new Set([...t,...n].map(r=>r.id))),c=(()=>{try{let r=J(i);return r?Y(r,{maxConventions:4,maxPatterns:3,maxAnti:2}):null}catch{return null}})();if(t.length===0&&n.length===0&&!o&&s.length===0&&!c)return null;let a=["## What this project already knows",""];if(a.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not. Apply these; do not re-derive from source."),s.length>0){a.push("","**How this developer works (act as them):**");for(let r of s){let m=r.rule.length>140?`${r.rule.slice(0,139)}\u2026`:r.rule;a.push(`- ${m} \`${r.sourceId}\``)}}if(c){let r=c.replace(/^## How this repo works \(project style\)\n?/,"").trim();r&&a.push("","**How this repo works (match house style):**",r)}if(t.length>0){a.push("","**Traps to avoid:**");for(let r of t)a.push(`- ${I(r,O)}`)}if(n.length>0){a.push("","**Decisions in force:**");for(let r of n)a.push(`- ${I(r,O)}`)}return o&&a.push("","**Keeps being missed:**",`- ${I(o.entry,O)} \u2014 flagged relevant-but-unused ${o.count}\xD7. Apply it or supersede it.`),a.push("","> Resolve any `mem_id` with `prjct search <id>`. Full developer model: MCP `prjct_developer`. Project style: `prjct analysis` / sync evolution."),j(a.join(`
15
+ `),St)}l(it,"buildKnowledgeDigest");var Et=500,rt=2;async function ne(i){let e=await E.readConfig(i).catch(()=>null);if(!e?.projectId)return null;let t=["# prjct: subagent context"];e.persona?.role&&t.push(`Role in this project: ${e.persona.role}`);try{let{resolveActiveTask:n}=await import("./task-service-XREJLWEF.mjs"),s=await n(e.projectId,i);s&&t.push(`Active work cycle (this worktree): ${s.description}`)}catch{}try{let n=P.rerank(e.projectId,x.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:rt*4})).slice(0,rt);if(n.length>0){t.push("Traps to avoid:");for(let o of n)t.push(`- ${M(o)} \`${o.id}\``)}let s=H(e.projectId,new Set(n.map(o=>o.id)));s&&t.push(`Keeps being missed: ${M(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:j(t.join(`
16
+ `),Et)}l(ne,"buildSubagentDigest");function xt(i){let e=[];return e.push(`## Your role in this project: **${i.role}**`),i.focus&&e.push(`Focus: ${i.focus}`),i.mcps&&i.mcps.length>0&&e.push(`Available MCPs this project expects: ${i.mcps.join(", ")}`),i.packs&&i.packs.length>0&&e.push(`Active packs: ${i.packs.join(", ")}`),e.join(`
17
+ `)}l(xt,"formatPersona");async function Tt(i,e){try{let t=await import("node:path"),{execFileAsync:n}=await import("./exec-2P5VOBHM.mjs"),s=t.basename(i),o=await(async()=>{try{let{stdout:r}=await n("git",["branch","--show-current"],{cwd:i});return r.trim()}catch{return""}})(),c=e.length>12?`${e.slice(0,8)}\u2026`:e,a=["## Project identity (cwd)",`- **${s}** \xB7 id \`${c}\``];return o&&a.push(`- Branch: \`${o}\``),a.push("- Skill is portable L0 \u2014 if skill text names another project, ignore it; trust this block + `prjct context --md`."),a.join(`
18
+ `)}catch{return null}}l(Tt,"buildProjectIdentityLine");function se(i=process.cwd(),e){let t=E.readConfig(i).catch(()=>null);return X({event:"SessionStart",projectPath:i,build:l(async(n,s)=>{let o=s===i?await t:await E.readConfig(s).catch(()=>null),c=n.source??"startup";return wt(s,o,{digest:c==="startup"||c==="clear"||c==="compact"})},"build"),afterEmit:l(async(n,s)=>{let o=await t;if(o?.projectId){let c=await(async()=>{try{let{collectActiveTasks:a}=await import("./task-overview-ITY5OSHX.mjs"),r=await a(o.projectId,s);return{taskId:r.current?.id??null,goal:r.current?.description??n.source??null}}catch{return{taskId:null,goal:n.source??null}}})();K({projectId:o.projectId,sessionId:n.session_id,directory:s,taskId:c.taskId,goal:c.goal})}Q(_)||await Z(_).catch(()=>{});try{let{maybeAutoUpdate:c}=await import("./auto-updater-4TIXYSEX.mjs");c(_)}catch{}},"afterEmit")},e)}l(se,"runSessionStartHook");export{wt as a,ne as b,Tt as c,se as d};
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as l}from"./chunk-DYHYDHCW.mjs";import{a as x}from"./chunk-M5E2YOZ4.mjs";import{r as g,u as j}from"./chunk-JAMSIKDE.mjs";import{k as d,o as H}from"./chunk-UH4MD3F3.mjs";import{c as h}from"./chunk-EQ5KNMLG.mjs";import{b as m,e as E}from"./chunk-EMTCZG5I.mjs";import{e as c,f as p}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import w from"node:fs/promises";import P from"node:os";import y from"node:path";p();H();E();j();p();import C from"node:fs/promises";async function k(e){let{skillMdPath:t,skillExists:r,templateContent:a,build:s,logLabel:o}=e;try{let n=s(a);return r&&await C.readFile(t,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged",path:t}:(await C.writeFile(t,n.content,"utf-8"),{success:!0,action:r?"updated":"created",path:t})}catch(n){return l.warn(`${o} skill warning: ${c(n)}`),{success:!1,action:null}}}i(k,"writeSkillIfChanged");var L="prjct-codex-router",S=1024;function b(){return y.join(P.homedir(),".codex","skills","prjct","SKILL.md")}i(b,"getCodexSkillPath");function K(e){return`<!-- ${L}: ${JSON.stringify({v:m,h:e})} -->`}i(K,"getCodexSkillMetadata");function M(e){let t=e.match(new RegExp(`<!--\\s*${L}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!t)return null;try{let r=JSON.parse(t[1]);return{version:r.v??r.version,templateHash:r.h??r.templateHash}}catch{return null}}i(M,"parseCodexSkillMetadata");function $(e){return x(e).slice(0,12)}i($,"hashContent");async function I(){return h("codex/SKILL.md")}i(I,"loadCodexSkillTemplate");function R(e){let t=e.trimEnd(),r=$(t),a=K(r);return{content:`${t}
9
+
10
+ ${a}
11
+ `,templateHash:r}}i(R,"buildCodexSkillContent");async function D(){try{let e=b(),t=y.dirname(e);await w.mkdir(t,{recursive:!0});let r=await d(e),a=await I();return a?await k({skillMdPath:e,skillExists:r,templateContent:a,build:i(s=>{let o=R(s),n=Buffer.byteLength(o.content,"utf-8");return n>S&&l.warn(`Codex SKILL.md is ${n} bytes \u2014 over Codex's ~${S}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),o},"build"),logLabel:"Codex"}):(l.warn("Codex SKILL.md template not found"),{success:!1,action:null})}catch(e){return l.warn(`Codex skill warning: ${c(e)}`),{success:!1,action:null}}}i(D,"installCodexSkill");async function U(e={}){let t=b();if(!(await g()).installed)return{installed:!1,verified:!0,skillPath:t,message:"Codex not detected"};let a=await I();if(!a)return{installed:!0,verified:!1,skillPath:t,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=R(a),o=i(async()=>e.autoRepair?(await D()).success:!1,"maybeRepair");if(!await d(t)&&!await o())return{installed:!0,verified:!1,skillPath:t,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};let n=i(async()=>{let u=await w.readFile(t,"utf-8").catch(()=>""),f=M(u);return{matches:f?.version===m&&f?.templateHash===s.templateHash}},"readVerification");if(!(await n()).matches){if(!await o())return{installed:!0,verified:!1,skillPath:t,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(!(await n()).matches)return{installed:!0,verified:!1,skillPath:t,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:t,templateHash:s.templateHash,message:"Codex p. router ready"}}i(U,"verifyCodexPRouterReady");export{S as a,R as b,D as c,U as d};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as d}from"./chunk-DGBDMUBL.mjs";import{c as l}from"./chunk-3LG3ACQV.mjs";import{e as a,g as p}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";p();var E=7,T=90,f=20,A=["pattern-detector","transcript-auto","skill-miss","friction","land-auto","sync-context-quality"];function h(e){return e?A.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(t)):!1}m(h,"isAutoSource");function L(e,t=E,o=500){let u=Date.now()-t*864e5;try{let n=a.query(e,`SELECT id FROM memory_entries
8
+ import{a as d}from"./chunk-27XFSCOE.mjs";import{c as l}from"./chunk-5EQLQ7GF.mjs";import{e as a,g as p}from"./chunk-KG7Z6OMK.mjs";import{a as m}from"./chunk-E66B27AL.mjs";p();var E=7,T=90,f=20,A=["pattern-detector","transcript-auto","skill-miss","friction","land-auto","sync-context-quality"];function h(e){return e?A.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(t)):!1}m(h,"isAutoSource");function L(e,t=E,o=500){let u=Date.now()-t*864e5;try{let n=a.query(e,`SELECT id FROM memory_entries
9
9
  WHERE deleted_at IS NOT NULL AND deleted_at < ?
10
10
  ORDER BY deleted_at ASC
11
11
  LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),r=s.prepare("DELETE FROM memory_entries WHERE id = ?");for(let c of n){try{i.run(c.id)}catch{}r.run(c.id)}}),n.length)}catch{return 0}}m(L,"purgeSoftDeleted");function O(e,t=E,o=500){let u=new Date(Date.now()-t*864e5).toISOString();try{let n=a.query(e,`SELECT e.id FROM events e
@@ -16,4 +16,4 @@ import{a as d}from"./chunk-DGBDMUBL.mjs";import{c as l}from"./chunk-3LG3ACQV.mjs
16
16
  WHERE m.id = 'mem_' || e.id AND m.deleted_at IS NULL
17
17
  )
18
18
  ORDER BY e.id ASC
19
- LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM events WHERE id = ?");for(let r of n)i.run(r.id)}),n.length)}catch{return 0}}m(O,"purgeOrphanRememberEvents");function g(e,t=f){if(t<=0)return 0;let o=[];try{let u=d.allEntriesForIndex(e),n=new Map;for(let s of u){let i=s.tags?.source;if(!h(i))continue;let r=i,c=n.get(r)??[];c.push(s),n.set(r,c)}for(let[,s]of n){if(s.length<=t)continue;s.sort((r,c)=>r.rememberedAt.localeCompare(c.rememberedAt));let i=s.slice(0,s.length-t);for(let r of i){try{l.archive(e,{entityType:"memory_entry",entityId:r.id,entityData:{id:r.id,type:r.type,content:r.content,tags:r.tags,rememberedAt:r.rememberedAt},summary:r.content.slice(0,80),reason:`auto-source-cap (>${t})`})}catch{}d.forget(e,r.id)&&o.push(r)}}}catch{return o.length}return o.length}m(g,"trimAutoSourceCap");function F(e){let t=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NULL")?.c??0,o=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NOT NULL")?.c??0,u=a.get(e,"SELECT COUNT(*) AS c FROM archives")?.c??0,n=a.get(e,"SELECT COUNT(*) AS c FROM events WHERE type LIKE 'memory.remember.%'")?.c??0,s=(()=>{try{return d.allEntriesForIndex(e).filter(i=>h(i.tags?.source)).length}catch{return 0}})();return{live:t,softDeleted:o,archives:u,rememberEvents:n,autoSourceLive:s}}m(F,"vaultHealth");async function N(e,t={}){let o=t.softDeletedPurgeDays??E,u=t.archivePruneDays??T,n=t.autoSourceMaxLive??f;if(t.dryRun===!0)return{softDeletedPurged:0,orphanEventsPurged:0,archivesPruned:0,autoSourceTrimmed:0,distilledDiscarded:0,digestsWritten:0};let i=await(async()=>{if(t.projectPath)try{let{distillAndDiscardAllAutoSources:_}=await import("./distill-IABVRW2U.mjs"),y=await _(t.projectPath,e,n);return{distilledDiscarded:y.discarded,digestsWritten:y.digests}}catch{return g(e,n),{distilledDiscarded:0,digestsWritten:0}}else return g(e,n),{distilledDiscarded:0,digestsWritten:0}})(),{distilledDiscarded:r,digestsWritten:c}=i,{eliminateSoftDeletedNoValue:D}=await import("./distill-IABVRW2U.mjs"),b=D(e,o).purged||L(e,o),S=O(e,o),R=(()=>{try{return l.pruneOldArchives(e,u)}catch{return 0}})();return{softDeletedPurged:b,orphanEventsPurged:S,archivesPruned:R,autoSourceTrimmed:r,distilledDiscarded:r,digestsWritten:c}}m(N,"runVaultPurge");export{E as a,T as b,f as c,A as d,h as e,L as f,O as g,g as h,F as i,N as j};
19
+ LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM events WHERE id = ?");for(let r of n)i.run(r.id)}),n.length)}catch{return 0}}m(O,"purgeOrphanRememberEvents");function g(e,t=f){if(t<=0)return 0;let o=[];try{let u=d.allEntriesForIndex(e),n=new Map;for(let s of u){let i=s.tags?.source;if(!h(i))continue;let r=i,c=n.get(r)??[];c.push(s),n.set(r,c)}for(let[,s]of n){if(s.length<=t)continue;s.sort((r,c)=>r.rememberedAt.localeCompare(c.rememberedAt));let i=s.slice(0,s.length-t);for(let r of i){try{l.archive(e,{entityType:"memory_entry",entityId:r.id,entityData:{id:r.id,type:r.type,content:r.content,tags:r.tags,rememberedAt:r.rememberedAt},summary:r.content.slice(0,80),reason:`auto-source-cap (>${t})`})}catch{}d.forget(e,r.id)&&o.push(r)}}}catch{return o.length}return o.length}m(g,"trimAutoSourceCap");function F(e){let t=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NULL")?.c??0,o=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NOT NULL")?.c??0,u=a.get(e,"SELECT COUNT(*) AS c FROM archives")?.c??0,n=a.get(e,"SELECT COUNT(*) AS c FROM events WHERE type LIKE 'memory.remember.%'")?.c??0,s=(()=>{try{return d.allEntriesForIndex(e).filter(i=>h(i.tags?.source)).length}catch{return 0}})();return{live:t,softDeleted:o,archives:u,rememberEvents:n,autoSourceLive:s}}m(F,"vaultHealth");async function N(e,t={}){let o=t.softDeletedPurgeDays??E,u=t.archivePruneDays??T,n=t.autoSourceMaxLive??f;if(t.dryRun===!0)return{softDeletedPurged:0,orphanEventsPurged:0,archivesPruned:0,autoSourceTrimmed:0,distilledDiscarded:0,digestsWritten:0};let i=await(async()=>{if(t.projectPath)try{let{distillAndDiscardAllAutoSources:_}=await import("./distill-U2LJGUG3.mjs"),y=await _(t.projectPath,e,n);return{distilledDiscarded:y.discarded,digestsWritten:y.digests}}catch{return g(e,n),{distilledDiscarded:0,digestsWritten:0}}else return g(e,n),{distilledDiscarded:0,digestsWritten:0}})(),{distilledDiscarded:r,digestsWritten:c}=i,{eliminateSoftDeletedNoValue:D}=await import("./distill-U2LJGUG3.mjs"),b=D(e,o).purged||L(e,o),S=O(e,o),R=(()=>{try{return l.pruneOldArchives(e,u)}catch{return 0}})();return{softDeletedPurged:b,orphanEventsPurged:S,archivesPruned:R,autoSourceTrimmed:r,distilledDiscarded:r,digestsWritten:c}}m(N,"runVaultPurge");export{E as a,T as b,f as c,A as d,h as e,L as f,O as g,g as h,F as i,N as j};
@@ -5,5 +5,5 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{c as d}from"./chunk-AOPJ4Z6O.mjs";import{e as r,g as f}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";f();var u=class{static{m(this,"CustomWorkflowStorage")}createWorkflow(t,e){let n=new Date().toISOString();r.run(t,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
8
+ import{b as d}from"./chunk-UA4Z5TGG.mjs";import{e as r,g as f}from"./chunk-KG7Z6OMK.mjs";import{a as m}from"./chunk-E66B27AL.mjs";f();var u=class{static{m(this,"CustomWorkflowStorage")}createWorkflow(t,e){let n=new Date().toISOString();r.run(t,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
9
9
  VALUES (?, ?, ?, ?, 0, 1, ?)`,e.name,e.description??null,n,n,e.metadata?JSON.stringify(e.metadata):null);let o=r.get(t,"SELECT id FROM custom_workflows WHERE name = ?",e.name);if(!o)throw new Error(`Failed to create workflow: ${e.name}`);return d({projectId:t,entityType:"custom_workflows",entityId:String(o.id),eventType:"upsert",data:{id:o.id,name:e.name,description:e.description??null,metadata:e.metadata??null,created_at:n,updated_at:n,is_builtin:0,enabled:1}}),o.id}getWorkflow(t,e){let n=r.get(t,"SELECT * FROM custom_workflows WHERE name = ?",e);return n?this.rowToWorkflow(n):null}getAllWorkflows(t,e=!1){let n=e?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return r.query(t,n).map(l=>this.rowToWorkflow(l))}updateWorkflow(t,e,n){if(!this.getWorkflow(t,e))return!1;let l=new Date().toISOString(),s=[],a=[];if(n.description!==void 0&&(s.push("description = ?"),a.push(n.description)),n.enabled!==void 0&&(s.push("enabled = ?"),a.push(n.enabled?1:0)),n.metadata!==void 0&&(s.push("metadata = ?"),a.push(JSON.stringify(n.metadata))),s.length===0)return!1;s.push("updated_at = ?"),a.push(l),a.push(e),r.run(t,`UPDATE custom_workflows SET ${s.join(", ")} WHERE name = ?`,...a);let i=this.getWorkflow(t,e);return i&&d({projectId:t,entityType:"custom_workflows",entityId:String(i.id),eventType:"upsert",data:{id:i.id,name:i.name,description:i.description??null,enabled:i.enabled?1:0,metadata:i.metadata??null,updated_at:l}}),!0}deleteWorkflow(t,e){let n=this.getWorkflow(t,e);if(!n)return!1;if(n.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${e}`);return r.run(t,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",e),d({projectId:t,entityType:"custom_workflows",entityId:String(n.id),eventType:"delete",data:{id:n.id,name:e}}),!0}isBuiltin(t,e){return this.getWorkflow(t,e)?.isBuiltin??!1}isReservedName(t){let e=["task","done","ship","sync"],n=["add","rm","gate","list","create","delete","run","help","reset","init"];return e.includes(t)||n.includes(t)}isValidName(t){return/^[a-z0-9-]+$/.test(t)}rowToWorkflow(t){return{id:t.id,name:t.name,description:t.description,createdAt:t.created_at,updatedAt:t.updated_at,isBuiltin:t.is_builtin===1,enabled:t.enabled===1,metadata:t.metadata?JSON.parse(t.metadata):null}}},p=new u;export{p as a};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as p}from"./chunk-3FBCOCPD.mjs";import{c as h}from"./chunk-YUOTOCKK.mjs";import{a as d}from"./chunk-E66B27AL.mjs";var k={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};function y(c){if(c)return k[c]}d(y,"toCloudTable");var w={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},f={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};function T(c,e){let t=w[c];return t?{...f,...e??{}}[t]!==!1:!0}d(T,"isTableIncluded");var v=Object.keys(f);function _(c){return c.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}d(_,"camelToSnake");function E(c){let e={};for(let[t,s]of Object.entries(c))e[_(t)]=s;return e}d(E,"snakeCaseKeys");function R(c,e){let[t,s]=e.type.split("."),r=y(e.entityType)??y(t);if(!r)return null;let i=e.eventType==="delete"||s==="deleted"||s==="archived"||s==="removed"?"delete":"upsert",n=e.data||{},a=E(n),u=e.entityId||(typeof a.id=="string"?a.id:"")||(typeof n.id=="string"?n.id:"")||(typeof a.task_id=="string"?a.task_id:"")||(typeof n.taskId=="string"?n.taskId:"")||(typeof a.entity_id=="string"?a.entity_id:"")||"";u&&a.id==null&&(a.id=u);let l={event_type:i,entity_type:r,entity_id:u,data:{...a,project_id:c},project_id:c};return e.originDeviceId!==void 0&&(l.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(l.content_hash=e.contentHash),e.revisionCount!==void 0&&(l.revision_count=e.revisionCount),e.timestamp&&(l.ts=e.timestamp),l}d(R,"mapCliEventToWebFormat");function g(c,e){return e.map(t=>R(c,t)).filter(t=>t!==null)}d(g,"mapCliEventsToWebFormat");var m=class{static{d(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=g(e,t),n=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify({projectId:e,events:i})});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async pullEvents(e,t,s){let{apiUrl:r,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let n={projectId:e};typeof t=="number"&&t>0&&(n.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(n)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:s,deviceId:r}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(s,r)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,s){let{apiUrl:r,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${r}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...s?{meta:s}:{}})});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async setCloudLifecycle(e,t){try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();return r?(await this.fetchWithRetry(`${s}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(r,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)return{ok:!1,reason:"unauthenticated"};let i=await this.fetchWithRetry(`${s}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1,reason:await(async()=>{let u=`${i.status} ${i.statusText}`;try{let l=await i.json();return typeof l.detail=="string"?l.detail:l.detail!=null?JSON.stringify(l.detail).slice(0,300):u}catch{return u}})()};let n=await i.json();return{ok:n.ok!==!1,nodes:n.nodes,links:n.links}}catch(s){return{ok:!1,reason:s instanceof Error?s.message:String(s)}}}async publishBenchmark(e,t){let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${s}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),p("API_REQUEST"));try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let i=await fetch(`${s}/auth/verify`,{method:"GET",headers:{...this.authHeaders(r,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await h.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await h.hasAuth()}async getAuthHeaders(){let[e,t,s]=await Promise.all([h.getApiUrl(),h.getApiKey(),h.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:s}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,s=0){let r=new AbortController,o=setTimeout(()=>r.abort(),p("API_REQUEST")),i=(t.method??"GET").toUpperCase(),n=i==="GET"||i==="HEAD";try{let a=await fetch(e,{...t,signal:r.signal});if(clearTimeout(o),n&&a.status>=500&&s<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,s+1)}return a}catch(a){if(clearTimeout(o),a instanceof Error&&a.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${p("API_REQUEST")}ms)`);if(n&&s<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await h.clearAuth(),this.createError("AUTH_REQUIRED",s,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return e.status===401||e.status===403?(await h.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},b=new m,j=b;export{y as a,T as b,b as c,j as d};
8
+ import{a as p}from"./chunk-3FBCOCPD.mjs";import{c as d}from"./chunk-TYEAIX3X.mjs";import{a as l}from"./chunk-E66B27AL.mjs";var k={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};function y(c){if(c)return k[c]}l(y,"toCloudTable");var w={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},f={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};function T(c,e){let t=w[c];return t?{...f,...e??{}}[t]!==!1:!0}l(T,"isTableIncluded");var v=Object.keys(f);function _(c){return c.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(_,"camelToSnake");function R(c){let e={};for(let[t,s]of Object.entries(c))e[_(t)]=s;return e}l(R,"snakeCaseKeys");function E(c,e){let[t,s]=e.type.split("."),r=y(e.entityType)??y(t);if(!r)return null;let i=e.eventType==="delete"||s==="deleted"||s==="archived"||s==="removed"?"delete":"upsert",n=e.data||{},a=R(n),h=e.entityId||(typeof a.id=="string"?a.id:"")||(typeof n.id=="string"?n.id:"")||(typeof a.task_id=="string"?a.task_id:"")||(typeof n.taskId=="string"?n.taskId:"")||(typeof a.entity_id=="string"?a.entity_id:"")||"";h&&a.id==null&&(a.id=h);let u={event_type:i,entity_type:r,entity_id:h,data:{...a,project_id:c},project_id:c};return e.originDeviceId!==void 0&&(u.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(u.content_hash=e.contentHash),e.revisionCount!==void 0&&(u.revision_count=e.revisionCount),e.timestamp&&(u.ts=e.timestamp),u}l(E,"mapCliEventToWebFormat");function g(c,e){return e.map(t=>E(c,t)).filter(t=>t!==null)}l(g,"mapCliEventsToWebFormat");var m=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=g(e,t),n=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify({projectId:e,events:i})});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async pullEvents(e,t,s){let{apiUrl:r,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let n={projectId:e};typeof t=="number"&&t>0&&(n.sinceEventId=t);let a=await this.fetchWithRetry(`${r}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(n)});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async getStatus(e){let{apiUrl:t,apiKey:s,deviceId:r}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(s,r)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,s){let{apiUrl:r,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${r}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...s?{meta:s}:{}})});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async setCloudLifecycle(e,t){try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();return r?(await this.fetchWithRetry(`${s}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(r,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)return{ok:!1,reason:"unauthenticated"};let i=await this.fetchWithRetry(`${s}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1,reason:await(async()=>{let h=`${i.status} ${i.statusText}`;try{let u=await i.json();return typeof u.detail=="string"?u.detail:u.detail!=null?JSON.stringify(u.detail).slice(0,300):h}catch{return h}})()};let n=await i.json();return{ok:n.ok!==!1,nodes:n.nodes,links:n.links}}catch(s){return{ok:!1,reason:s instanceof Error?s.message:String(s)}}}async publishBenchmark(e,t){let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${s}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(r,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),p("API_REQUEST"));try{let{apiUrl:s,apiKey:r,deviceId:o}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let i=await fetch(`${s}/auth/verify`,{method:"GET",headers:{...this.authHeaders(r,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await d.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await d.hasAuth()}async getAuthHeaders(){let[e,t,s]=await Promise.all([d.getApiUrl(),d.getApiKey(),d.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:s}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,s=0){let r=new AbortController,o=setTimeout(()=>r.abort(),p("API_REQUEST")),i=(t.method??"GET").toUpperCase(),n=i==="GET"||i==="HEAD";try{let a=await fetch(e,{...t,signal:r.signal});return clearTimeout(o),n&&a.status>=500&&s<this.retryConfig.maxRetries?this.scheduleRetry(e,t,s):a}catch(a){if(clearTimeout(o),a instanceof Error&&a.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${p("API_REQUEST")}ms)`);if(n&&s<this.retryConfig.maxRetries)return this.scheduleRetry(e,t,s);throw this.createError("NETWORK_ERROR",a instanceof Error?a.message:"Network request failed")}}async scheduleRetry(e,t,s){let r=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(r),this.fetchWithRetry(e,t,s+1)}async parseErrorResponse(e){try{let t=await e.json(),s=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await d.clearAuth(),this.createError("AUTH_REQUIRED",s,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return e.status===401||e.status===403?(await d.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},b=new m,D=b;export{y as a,T as b,b as c,D as d};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{b as n,f as p}from"./chunk-HDSS6UB3.mjs";p();import{z as e}from"zod";var c=e.enum(["low","medium","high","critical"]),t=e.enum(["feature","bug","improvement","chore"]),u=e.enum(["active","backlog","previously_active"]),l=e.enum(["H0","H1","H2","H3"]),m=e.enum(["bug","feature","refactor","docs","chore","security","research","unknown"]),d=e.enum(["low","medium","high"]),g=e.enum(["regression-test","focused-tests","docs-if-public-behavior","config-preservation","spec-or-design","edge-cases","scope-check"]),k=e.enum(["verify-before-done","scope-check","review-before-ship","spec-before-implementation"]),y=e.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),o=e.object({title:e.string(),description:e.string(),filesChanged:e.array(e.object({path:e.string(),action:e.enum(["created","modified","deleted"])})),whatWasDone:e.array(e.string()).min(1),outputForNextAgent:e.string().min(1),notes:e.string().optional()}),I=e.object({output:e.string().min(1,"Subtask output is required"),summary:o}),S=e.object({id:e.string(),description:e.string(),domain:e.string(),agent:e.string(),status:y,dependsOn:e.array(e.string()),startedAt:e.string().optional(),completedAt:e.string().optional(),output:e.string().optional(),summary:o.optional(),skipReason:e.string().optional(),blockReason:e.string().optional(),estimatedPoints:e.number().optional(),estimatedMinutes:e.number().optional()}),f=e.object({completed:e.number(),total:e.number(),percentage:e.number()}),s=e.object({level:l,kind:m,risk:d,expectedEvidence:e.array(g),scopeHints:e.array(e.string()),gates:e.array(k),rationale:e.string(),createdAt:e.string()}),r=e.object({featureId:e.string().optional(),subtasks:e.array(S).optional(),currentSubtaskIndex:e.number().optional(),subtaskProgress:f.optional(),linearId:e.string().optional(),linearUuid:e.string().optional(),estimatedPoints:e.number().optional(),estimatedMinutes:e.number().optional(),modelMetadata:n.optional(),tokensIn:e.number().optional(),tokensOut:e.number().optional(),harness:s.optional()}),i=r.extend({id:e.string(),description:e.string(),type:t.optional(),startedAt:e.string(),sessionId:e.string(),linkedSpecId:e.string().optional(),parentDescription:e.string().optional(),branch:e.string().optional(),prUrl:e.string().optional(),turnCount:e.number().optional(),turnLimitAcknowledgedAt:e.string().optional(),ownerAgent:e.string().optional(),ownerIdentity:e.string().optional(),ownerSessionId:e.string().optional(),yieldStatus:e.enum(["active","yielded"]).optional(),pendingHandoffId:e.string().optional()}),a=r.extend({id:e.string(),description:e.string(),status:e.literal("paused"),startedAt:e.string(),pausedAt:e.string(),pauseReason:e.string().optional(),type:t.optional(),sessionId:e.string().optional()}),h=e.object({stackConfirmed:e.array(e.string()).optional(),patternsDiscovered:e.array(e.string()).optional(),agentAccuracy:e.array(e.object({agent:e.string(),rating:e.enum(["helpful","neutral","inaccurate"]),note:e.string().optional()})).optional(),issuesEncountered:e.array(e.string()).optional()}),b=e.object({taskId:e.string(),title:e.string(),classification:t,startedAt:e.string(),completedAt:e.string(),subtaskCount:e.number(),subtaskSummaries:e.array(o),outcome:e.string(),branchName:e.string(),linearId:e.string().optional(),linearUuid:e.string().optional(),prUrl:e.string().optional(),feedback:h.optional(),harness:s.optional(),tokensIn:e.number().optional(),tokensOut:e.number().optional()}),x=i.extend({workspaceId:e.string(),worktreePath:e.string().optional(),agentSessionId:e.string().optional(),jiraId:e.string().optional(),jiraUuid:e.string().optional(),dispatchedFrom:e.string().optional()}),j=e.object({currentTask:i.nullable(),previousTask:a.nullable().optional(),pausedTasks:e.array(a).optional(),taskHistory:e.array(b).optional(),activeTasks:e.array(x).optional(),lastUpdated:e.string()}),T=e.object({id:e.string(),description:e.string(),body:e.string().optional(),priority:c,type:t,featureId:e.string().optional(),originFeature:e.string().optional(),completed:e.boolean(),completedAt:e.string().optional(),createdAt:e.string(),section:u,agent:e.string().optional(),groupName:e.string().optional(),groupId:e.string().optional()}),A=e.object({tasks:e.array(T),lastUpdated:e.string()});export{I as a,j as b,A as c};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{b as e,o as s}from"./chunk-CTWZQ7YI.mjs";import{a as i}from"./chunk-E66B27AL.mjs";s();function p(t){let n=t?.notify?.mode;if(n==="on"||n==="off")return n;let o=process.env.PRJCT_NOTIFY_MODE?.toLowerCase();return o==="on"||o==="off"?o:"on"}i(p,"effectiveNotifyMode");function f(t){return t.replace(/["\\]/g,"").replace(/[\r\n]+/g," ").trim().slice(0,180)}i(f,"sanitize");async function a(t,n){try{let o=f(t)||"prjct",r=f(n);process.platform==="darwin"?await e("osascript",["-e",`display notification "${r}" with title "${o}"`]):process.platform==="linux"&&await e("notify-send",[o,r])}catch{}}i(a,"notifyDesktop");export{p as a,a as b};
8
+ import{b as e,p as s}from"./chunk-QWQFF2UG.mjs";import{a as i}from"./chunk-E66B27AL.mjs";s();function p(t){let n=t?.notify?.mode;if(n==="on"||n==="off")return n;let o=process.env.PRJCT_NOTIFY_MODE?.toLowerCase();return o==="on"||o==="off"?o:"on"}i(p,"effectiveNotifyMode");function f(t){return t.replace(/["\\]/g,"").replace(/[\r\n]+/g," ").trim().slice(0,180)}i(f,"sanitize");async function a(t,n){try{let o=f(t)||"prjct",r=f(n);process.platform==="darwin"?await e("osascript",["-e",`display notification "${r}" with title "${o}"`]):process.platform==="linux"&&await e("notify-send",[o,r])}catch{}}i(a,"notifyDesktop");export{p as a,a as b};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{b as r,c as d}from"./chunk-QSAA6LZF.mjs";import{e as o,g as p}from"./chunk-HDHVBB6Q.mjs";import{b as n,e as m}from"./chunk-AKIN5WSQ.mjs";import{a}from"./chunk-E66B27AL.mjs";m();p();var u="judgment:active",c="judgment:ghosts",g=class{static{a(this,"JudgmentLedgerStorage")}get(s){let t=o.getDoc(s,u);if(t===null)return null;let e=r.safeParse(t);return e.success?e.data:null}set(s,t){let e=t.updatedAt||n();return o.updateDoc(s,u,()=>r.parse({...t,updatedAt:e}),()=>r.parse({...t,updatedAt:e}))}clear(s){o.deleteDoc(s,u)}getGhosts(s){let t=o.getDoc(s,c);if(t===null)return{ghosts:[],updatedAt:n()};let e=d.safeParse(t);return e.success?e.data:{ghosts:[],updatedAt:n()}}setGhosts(s,t){let e=d.parse(t);return o.setDoc(s,c,e),e}},w=new g;export{u as a,c as b,w as c};
8
+ import{b as r,c as d}from"./chunk-QSAA6LZF.mjs";import{e as o,g as p}from"./chunk-KG7Z6OMK.mjs";import{b as n,h as m}from"./chunk-JAMSIKDE.mjs";import{a}from"./chunk-E66B27AL.mjs";m();p();var u="judgment:active",c="judgment:ghosts",g=class{static{a(this,"JudgmentLedgerStorage")}get(s){let t=o.getDoc(s,u);if(t===null)return null;let e=r.safeParse(t);return e.success?e.data:null}set(s,t){let e=t.updatedAt||n();return o.updateDoc(s,u,()=>r.parse({...t,updatedAt:e}),()=>r.parse({...t,updatedAt:e}))}clear(s){o.deleteDoc(s,u)}getGhosts(s){let t=o.getDoc(s,c);if(t===null)return{ghosts:[],updatedAt:n()};let e=d.safeParse(t);return e.success?e.data:{ghosts:[],updatedAt:n()}}setGhosts(s,t){let e=d.parse(t);return o.setDoc(s,c,e),e}},w=new g;export{u as a,c as b,w as c};
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{c as L}from"./chunk-QPRNRLG6.mjs";import{e as g}from"./chunk-7JEKBJAP.mjs";import{a as m}from"./chunk-27XFSCOE.mjs";import{d as y,g as R}from"./chunk-KG7Z6OMK.mjs";import{b as M,h as j}from"./chunk-JAMSIKDE.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as l}from"./chunk-E66B27AL.mjs";R();j();var A=6;function v(e,t=A){let r=[],u=new Set,o=l((s,i,a)=>{let p=D(s);if(!p||p.length<12)return;let c=p.toLowerCase();u.has(c)||(u.add(c),r.push({rule:p,sourceId:i,kind:a}))},"push");for(let s of e.filter(i=>i.type==="feedback")){if(r.length>=t)break;o(s.content,s.id,"preference")}for(let s of e.filter(i=>i.type==="improvement-signal"&&i.tags?.source==="friction-detector")){if(r.length>=t)break;let i=N(s.content)??T(s.content);i&&o(i,s.id,"friction")}return r}l(v,"extractDeveloperRules");function D(e){return e.replace(/\s+/g," ").trim().replace(/^[-*•]\s+/,"")}l(D,"normalizeRule");function N(e){return e.match(/^Next action:\s*(.+)$/im)?.[1]?.trim()||null}l(N,"extractNextAction");function T(e){let t=e.split(`
9
+ `).map(u=>u.trim())[0]??"",r=t.match(/^\[[^\]]+\]\s+Lesson:\s*(.+)$/i);return r?.[1]?r[1].trim():/^\[[^\]]+\]/.test(t)&&t.length>20?t:null}l(T,"extractLesson");var _="memory:l0-index",E=4e3,C=1440*60*1e3,k=3,F=4,P=2,I={minTeaser:20,maxTeaser:80},S=["decision","gotcha","anti-pattern","learning","fact","feedback"];function X(e){try{let t=B(e);return t?(y.setDoc(e.projectId,_,t),t):null}catch{return null}}l(X,"buildAndStoreMemoryL0Index");function B(e){let t=m.allEntriesForIndex(e.projectId).filter(n=>x(n)||n.type==="inbox"||n.type==="improvement-signal");if(t.length===0)return null;let r={};for(let n of t)r[n.type]=(r[n.type]??0)+1;if(t.filter(n=>n.type!=="improvement-signal"&&x(n)).length===0&&(r.inbox??0)===0)return null;let o=["## What this project already knows","","> Carried across sessions and model updates \u2014 this survived even if your conversation context did not. Apply these; do not re-derive from source.","",`_L0 index \xB7 live=${t.length} \xB7 pull L2: \`prjct search\` / \`prjct context memory <topic>\` / \`prjct guard <file>\`_`,""],s=new Set;try{let n=m.recall(e.projectId,{types:["feedback","improvement-signal"],limit:40,dedupeByKey:!1}),d=v(n,F);if(d.length>0){o.push("**How this developer works (act as them):**");for(let f of d){let w=f.rule.length>140?`${f.rule.slice(0,139)}\u2026`:f.rule;o.push(`- ${w} \`${f.sourceId}\``)}o.push("")}}catch{}let i=[{title:"Traps to avoid",types:["gotcha","anti-pattern"],suppressMiss:!0},{title:"Decisions in force",types:["decision"],suppressMiss:!0},{title:"Learnings",types:["learning"]},{title:"Facts",types:["fact"]}];for(let n of i){let d=L.rerank(e.projectId,m.recall(e.projectId,{types:n.types,limit:k*4})).slice(0,k);if(d.length!==0){o.push(`**${n.title}:**`);for(let f of d)o.push(`- ${g(f,I)}`),n.suppressMiss&&s.add(f.id);o.push("")}}let a=O(e.projectId,s);a&&o.push("**Keeps being missed:**",`- ${g(a.entry,I)} \u2014 flagged relevant-but-unused ${a.count}\xD7. Apply it or supersede it.`,"");let p=t.filter(n=>n.type==="inbox").slice(0,3),c=r.inbox??0;if(c>0){o.push(`**Inbox (${c}):**`);for(let n of p)o.push(`- ${g(n,I)}`);c>p.length&&o.push(`- \u2026 +${c-p.length} more`),o.push("",'> Close resolved: `prjct close <id> --reason "\u2026"`. Forget noise: `prjct forget <id>`.',"")}let b=S.filter(n=>(r[n]??0)>0).map(n=>`${n}=${r[n]}`).concat(Object.keys(r).filter(n=>!S.includes(n)&&(r[n]??0)>0).sort().slice(0,8).map(n=>`${n}=${r[n]}`));b.length>0&&o.push(`_Counts: ${b.join(" \xB7 ")}_`,""),o.push("> Resolve any `mem_id` with `prjct search <id>`. Full developer model: MCP `prjct_developer`. Consolidate: `prjct dream`. Never stuff L2 into L0.");let h=o.join(`
10
+ `),$=h.length>E?`${h.slice(0,E-20).trimEnd()}
11
+ \u2026(truncated)`:h;return{version:1,builtAt:M(),projectId:e.projectId,live:t.length,byType:r,markdown:$,source:e.source??"manual"}}l(B,"buildMemoryL0Index");function H(e){try{let t=y.getDoc(e,_);return!t||t.version!==1||!t.markdown?null:t}catch{return null}}l(H,"loadMemoryL0Index");function K(e,t=Date.now()){if(!e?.builtAt)return!1;let r=Date.parse(e.builtAt);return Number.isFinite(r)?t-r<=C:!1}l(K,"isMemoryL0IndexFresh");function oe(e,t={}){try{let r=H(e),u=(!r||!K(r))&&t.rebuildIfStale!==!1?X({projectId:e,source:"session-start"}):r;return u?.markdown?.trim()?u.markdown.trim():null}catch{return null}}l(oe,"memoryL0IndexForSession");function O(e,t){try{let r=m.recall(e,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),u=new Map;for(let p of r){let c=p.tags?.relates;c&&u.set(c,(u.get(c)??0)+1)}let o=[...u].sort((p,c)=>c[1]-p[1])[0];if(!o||o[1]<P||t.has(o[0]))return null;let[s,i]=o,a=m.getById(e,s);return a?{entry:a,count:i}:null}catch{return null}}l(O,"findRepeatMissedEntry");export{v as a,_ as b,E as c,C as d,X as e,B as f,H as g,K as h,oe as i,O as j};
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as j,b as f,d as x,e as I}from"./chunk-AZYQFRPJ.mjs";import{a as D}from"./chunk-JR542RI2.mjs";import{b as v}from"./chunk-HHIGNKDO.mjs";import{g as C,h as M,i as w,j as E,o as R}from"./chunk-7GNWHWOO.mjs";import{a as b}from"./chunk-27XFSCOE.mjs";import{a as S,b as K,d as m,g as U}from"./chunk-KG7Z6OMK.mjs";import{a as c}from"./chunk-E66B27AL.mjs";K();import g from"node:fs/promises";import d from"node:path";U();var q=/^(main|index|app|server|cli|handler|router|bootstrap|init|start|run|default)$/i;function L(t){let e=M(t);if(!C(t))return{ready:!1,builtAt:e?.builtAt??null,symbols:0,edges:0,files:0,languages:[],kinds:[],routes:[],hotspots:[],entryCandidates:[],packages:[],note:"No symbol index. Run `prjct sync` or `prjct code reindex`."};let o=w(t),n=new Map,r=new Map,a=new Map,u=[],p=[];for(let i of o){n.set(i.kind,(n.get(i.kind)??0)+1),r.set(i.file,(r.get(i.file)??0)+1);let l=i.file.includes(".")?i.file.slice(i.file.lastIndexOf(".")):"(none)";a.set(l,(a.get(l)??0)+1),i.kind==="route"&&u.push({name:i.name,file:i.file,line:i.startLine}),i.exported&&q.test(i.name)&&(i.kind==="function"||i.kind==="class")&&!/__tests__|\.test\.|\.spec\.|fixtures?\//i.test(i.file)&&p.push({name:i.name,file:i.file,kind:i.kind})}let y=[...r.keys()],h=[],Y=R(t),J=y.length>400?y.slice(0,400):y;for(let i of J){let l=Y.get(i)??0;l>0&&h.push({file:i,fanIn:l,symbolCount:r.get(i)??0})}h.sort((i,l)=>l.fanIn-i.fanIn);let k=new Set,A=v(t);if(A)for(let i of Object.keys(A.forward).slice(0,2e3)){let l=i.includes("/")?i.slice(0,i.indexOf("/")):i;l&&!l.startsWith(".")&&k.add(l)}for(let i of y.slice(0,2e3)){let l=i.includes("/")?i.slice(0,i.indexOf("/")):".";l&&l!=="."&&k.add(l)}if(p.length<8)for(let i of o){if(p.length>=12)break;i.exported&&i.kind==="class"&&!p.some(l=>l.file===i.file)&&p.push({name:i.name,file:i.file,kind:i.kind})}return{ready:!0,builtAt:e?.builtAt??null,symbols:e?.symbolCount??o.length,edges:e?.edgeCount??0,files:e?.fileCount??r.size,languages:[...a.entries()].map(([i,l])=>({ext:i,count:l})).sort((i,l)=>l.count-i.count).slice(0,12),kinds:[...n.entries()].map(([i,l])=>({kind:i,count:l})).sort((i,l)=>l.count-i.count),routes:u.slice(0,30),hotspots:h.slice(0,15),entryCandidates:p.slice(0,15),packages:[...k].sort().slice(0,40),note:"Structural only (symbol + import graphs). Narrative architecture lives in prjct analysis / memory decisions."}}c(L,"buildArchitectureSnapshot");function O(t,e){let s=[];if(!t)return{hasChanges:!0,items:[{field:"Project style",type:"added",after:e.summary}],summary:{added:1,removed:0,changed:0},beforeCommit:null,afterCommit:e.commitHash};let o=t.payload,n=e.payload;return o.stack.ecosystem!==n.stack.ecosystem&&s.push({field:"Ecosystem",type:"changed",before:o.stack.ecosystem,after:n.stack.ecosystem}),(o.stack.packageManager??"")!==(n.stack.packageManager??"")&&s.push({field:"Package manager",type:"changed",before:o.stack.packageManager??"(none)",after:n.stack.packageManager??"(none)"}),P("Languages",o.stack.languages,n.stack.languages,s),P("Frameworks",o.stack.frameworks,n.stack.frameworks,s),P("Key libraries",o.stack.keyLibraries,n.stack.keyLibraries,s),o.stack.hasTests!==n.stack.hasTests&&s.push({field:"Has tests",type:"changed",before:String(o.stack.hasTests),after:String(n.stack.hasTests)}),_("Pattern",o.patterns.map(r=>[r.key,r.name]),n.patterns.map(r=>[r.key,r.name]),s),_("Anti-pattern",o.antiPatterns.map(r=>[r.key,r.issue]),n.antiPatterns.map(r=>[r.key,r.issue]),s),_("Convention",o.conventions.map(r=>[r.key,r.rule]),n.conventions.map(r=>[r.key,r.rule]),s),o.structural.symbols!==n.structural.symbols&&(o.structural.symbols>0||n.structural.symbols>0)&&s.push({field:"Symbols",type:"changed",before:String(o.structural.symbols),after:String(n.structural.symbols)}),o.structural.files!==n.structural.files&&s.push({field:"Files",type:"changed",before:String(o.structural.files),after:String(n.structural.files)}),D(s,t.commitHash,e.commitHash)}c(O,"generateProjectStyleDiff");function F(t){if(!t.hasChanges)return`## Project evolution
9
+
10
+ No style changes since last sync.`;let e=["## Project evolution (this sync)"];(t.beforeCommit||t.afterCommit)&&e.push(`> \`${T(t.beforeCommit)}\` \u2192 \`${T(t.afterCommit)}\``),e.push(""),e.push(`+${t.summary.added} \xB7 \u2212${t.summary.removed} \xB7 ~${t.summary.changed}`),e.push("");for(let s of t.items.slice(0,20)){let o=s.type==="added"?"+":s.type==="removed"?"\u2212":"~";s.type==="changed"?e.push(`- ${o} **${s.field}**: ${s.before} \u2192 ${s.after}`):s.type==="added"?e.push(`- ${o} **${s.field}**: ${s.after}`):e.push(`- ${o} **${s.field}**: ${s.before}`)}return e.join(`
11
+ `)}c(F,"formatProjectStyleDiffMd");function T(t){return t?t.length>7?t.slice(0,7):t:"(none)"}c(T,"short");function P(t,e,s,o){let n=new Set(e.map(a=>a.toLowerCase())),r=new Set(s.map(a=>a.toLowerCase()));for(let a of s)n.has(a.toLowerCase())||o.push({field:t,type:"added",after:a});for(let a of e)r.has(a.toLowerCase())||o.push({field:t,type:"removed",before:a})}c(P,"diffStringArray");function _(t,e,s,o){let n=new Map(e),r=new Map(s);for(let[a,u]of r)n.has(a)?n.get(a)!==u&&o.push({field:t,type:"changed",before:n.get(a),after:u}):o.push({field:t,type:"added",after:u});for(let[a,u]of n)r.has(a)||o.push({field:t,type:"removed",before:u})}c(_,"diffKeyed");var H=50;function W(t){let e=(()=>{try{return JSON.parse(t.payload_json)}catch{return z()}})();return{id:t.id,capturedAt:t.captured_at,commitHash:t.commit_hash,source:t.source||"sync-mechanical",patternCount:t.pattern_count,antiPatternCount:t.anti_pattern_count,conventionCount:t.convention_count,frameworkCount:t.framework_count,symbolCount:t.symbol_count,fileCount:t.file_count,summary:t.summary,payload:e}}c(W,"rowToSnapshot");function z(){return{payloadVersion:1,stack:{ecosystem:"unknown",languages:[],frameworks:[],keyLibraries:[],hasTests:!1,hasDocker:!1},commands:{},conventions:[],patterns:[],antiPatterns:[],structural:{symbols:0,files:0,packages:[]},metrics:{}}}c(z,"emptyPayload");function N(t){try{let e=m.get(t,"SELECT * FROM project_style_snapshots WHERE is_active = 1 ORDER BY captured_at DESC LIMIT 1");return e?W(e):null}catch{return null}}c(N,"getActiveProjectStyle");function G(t,e=12){try{return m.query(t,"SELECT * FROM project_style_snapshots ORDER BY captured_at DESC LIMIT ?",e).map(W)}catch{return[]}}c(G,"getProjectEvolution");function jt(t,e=6){let s=G(t,e);if(s.length===0)return null;let o=["## Project evolution"];if(s.length>=2){let n=s[0],r=s[s.length-1],a=n.patternCount-r.patternCount,u=n.conventionCount-r.conventionCount,p=n.fileCount-r.fileCount;o.push(`Over ${s.length} snapshots: patterns ${$(a)}, conventions ${$(u)}, files ${$(p)}.`)}for(let n of s)o.push(`- ${n.capturedAt.slice(0,10)} \u2014 ${n.summary}`);return o.join(`
12
+ `)}c(jt,"renderProjectEvolution");function $(t){return t>=0?`+${t}`:`${t}`}c($,"fmtDelta");function V(t,e){m.transaction(t,s=>{s.prepare("UPDATE project_style_snapshots SET is_active = 0 WHERE is_active = 1").run(),s.prepare(`INSERT INTO project_style_snapshots (
13
+ id, captured_at, commit_hash, source,
14
+ pattern_count, anti_pattern_count, convention_count, framework_count,
15
+ symbol_count, file_count, summary, payload_json, is_active
16
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`).run(e.id,e.capturedAt,e.commitHash,e.source,e.patternCount,e.antiPatternCount,e.conventionCount,e.frameworkCount,e.symbolCount,e.fileCount,e.summary,JSON.stringify(e.payload));let o=s.prepare("SELECT id FROM project_style_snapshots ORDER BY captured_at DESC").all();if(o.length>H){let n=o.slice(H),r=s.prepare("DELETE FROM project_style_snapshots WHERE id = ?");for(let a of n)r.run(a.id)}})}c(V,"persistProjectStyleSnapshot");async function Pt(t){let e=N(t.projectId),s=X(t.projectId),o=await et(t.projectPath),n=Z(t.projectId),r=tt(t.projectId),a=x({stats:t.stats,stack:t.stack,commands:t.commands,packageDeps:o.deps,packageManager:o.packageManager,llmAnalysis:s,memoryPatterns:r.patterns,memoryAntiPatterns:r.antiPatterns,memoryConventions:r.conventions,structural:n,commitHash:t.commitHash??null,source:t.source??"sync-mechanical"});a.payload.metrics.styleCoverage=Q(a),a.payload.metrics.hasRichAnalysis=f(s)?1:0;let u=O(e,a),p=e===null;(p||u.hasChanges)&&V(t.projectId,a);let y=N(t.projectId)??a;return t.bridgeMemory!==!1&&await st(t.projectPath,t.projectId,y).catch(()=>{}),await rt(t.projectId,y).catch(()=>{}),{snapshot:y,delta:u,isFirst:p}}c(Pt,"recomputeProjectStyle");function Q(t){let e=(t.payload.stack.ecosystem!=="unknown"?25:0)+(t.payload.stack.frameworks.length>0||t.payload.stack.keyLibraries.length>0?20:0)+(t.payload.stack.hasTests?10:0)+Math.min(25,t.conventionCount*5)+Math.min(15,t.patternCount*3)+Math.min(5,t.antiPatternCount);return Math.min(100,e)}c(Q,"computeStyleCoverage");function X(t){try{let e=j.getActive(t);if(f(e))return e;try{let s=j.getAllFull(t);for(let o of s)if(f(o.analysis))return o.analysis}catch{}return e}catch{return null}}c(X,"pickBestAnalysis");function Z(t){try{let e=L(t);return e.ready?{symbols:e.symbols,files:e.files,packages:e.packages.slice(0,20)}:{symbols:0,files:0,packages:[]}}catch{return{symbols:0,files:0,packages:[]}}}c(Z,"loadStructural");function tt(t){let e=[],s=[],o=[];try{let n=b.recall(t,{types:["pattern","anti-pattern","decision"],limit:40});for(let r of n){let a=r.tags?.topic??"";!a.startsWith("style:")&&r.type!=="pattern"&&r.type!=="anti-pattern"||(r.type==="pattern"||a.startsWith("style:pattern:")?e.push({name:r.tags?.name||a.replace(/^style:pattern:/,"")||"pattern",description:r.content.slice(0,400)}):r.type==="anti-pattern"||a.startsWith("style:anti:")?s.push({issue:r.tags?.name||a.replace(/^style:anti:/,"")||"anti-pattern",suggestion:r.content.slice(0,400)}):a.startsWith("style:convention:")&&o.push({rule:r.content.slice(0,400),category:r.tags?.category}))}}catch{}return{patterns:e,antiPatterns:s,conventions:o}}c(tt,"loadMemoryStyle");async function et(t){try{let e=await g.readFile(d.join(t,"package.json"),"utf-8"),s=JSON.parse(e),o={...s.dependencies??{},...s.devDependencies??{}},n=s.packageManager?s.packageManager.split("@")[0]??null:await(async()=>{let r=[["bun.lockb","bun"],["bun.lock","bun"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"],["package-lock.json","npm"]];for(let[a,u]of r)try{return await g.access(d.join(t,a)),u}catch{}return null})();return{deps:o,packageManager:n}}catch{return{deps:{},packageManager:null}}}c(et,"readPackageMeta");function nt(t){let e=t.payload,s=[...e.conventions.slice(0,25).map(n=>({type:"decision",content:n.rule,tags:{topic:`style:convention:${n.key}`,category:n.category??"convention",source:"project-style"}})),...e.patterns.slice(0,25).map(n=>({type:"pattern",content:`${n.name}: ${n.description}`,tags:{topic:`style:pattern:${n.key}`,name:n.name,source:"project-style",...n.category?{category:n.category}:{}}})),...e.antiPatterns.slice(0,25).map(n=>({type:"anti-pattern",content:`${n.issue}. Suggestion: ${n.suggestion}`,tags:{topic:`style:anti:${n.key}`,name:n.issue,source:"project-style",...n.severity?{severity:n.severity}:{}}}))],o=new Set;return s.filter(n=>{let r=`${n.type}\0${S(n.content)}`;return o.has(r)?!1:(o.add(r),!0)})}c(nt,"desiredStyleBridgeEntries");function B(t,e,s){return`${t}\0${e}\0${s}`}c(B,"styleBridgeIdentity");async function st(t,e,s){let o=nt(s);if(o.length===0)return 0;let n=(()=>{try{let a=[...new Set(o.map(y=>y.tags.topic))],u=a.map(()=>"?").join(","),p=m.query(e,`SELECT type, topic_key, content_hash
17
+ FROM memory_entries
18
+ WHERE project_id = ? AND deleted_at IS NULL
19
+ AND topic_key IN (${u})`,e,...a);return new Set(p.map(y=>B(y.type,y.topic_key,y.content_hash)))}catch{return null}})(),r=[];for(let a of o){let u=a.tags.topic,p=B(a.type,u,S(a.content));n?.has(p)||(await b.remember(t,{...a,projectId:e,provenance:"extracted"}),r.push(a))}return r.length}c(st,"bridgeStyleToMemory");async function rt(t,e){let{default:s}=await import("./path-manager-ZR5RAKTK.mjs"),o=s.getGlobalProjectPath(t),n=d.join(o,"analysis");await g.mkdir(n,{recursive:!0});let r=e.payload.stack,a={ecosystem:r.ecosystem,frameworks:r.frameworks,hasTests:r.hasTests,technologies:[...r.languages,...r.frameworks,...r.keyLibraries].filter((u,p,y)=>y.indexOf(u)===p),packageManager:r.packageManager??null,updatedAt:e.capturedAt,styleSummary:e.summary};await g.writeFile(d.join(n,"repo-analysis.json"),JSON.stringify(a,null,2),"utf-8")}c(rt,"writeRepoAnalysisArtifact");function _t(t){let e=t.delta.hasChanges||t.isFirst?F(t.delta):null,s=I(t.snapshot,{maxConventions:4,maxPatterns:3,maxAnti:2});return{evolutionMd:e,digestMd:s,delta:t.delta}}c(_t,"formatProjectStyleForSync");export{N as a,G as b,jt as c,V as d,Pt as e,st as f,_t as g};
@@ -5,6 +5,6 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{b as a,c as f}from"./chunk-L4COZ7ZH.mjs";import{f as u}from"./chunk-WSFHSXBZ.mjs";import{a as m}from"./chunk-DGBDMUBL.mjs";import{b as l}from"./chunk-OLKNK2HB.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execSync as d}from"node:child_process";var h=1200,y=3;function C(t){try{return d("git diff --cached --name-only",{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
9
- `).map(o=>o.trim()).filter(Boolean)}catch{return[]}}i(C,"stagedFiles");function b(t){let o=new Set;for(let r of t){let n=r.split("/").filter(Boolean);for(let s of n){let e=s.replace(/\.[^.]+$/,"").toLowerCase();e.length>=3&&o.add(e)}}return[...o]}i(b,"pathFragments");function k(t,o){let r=t.content.toLowerCase();if(o.some(n=>r.includes(n)))return!0;for(let n of Object.values(t.tags)){let s=n.toLowerCase();if(o.some(e=>s.includes(e)))return!0}return!1}i(k,"mentionsFragment");async function I(t){let o=await l.readConfig(t);if(!o?.projectId)return null;let r=C(t);if(r.length===0)return null;let n=b(r);if(n.length===0)return null;let s=(()=>{try{return m.recall(o.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}})();if(!s)return null;let e=s.filter(g=>k(g,n)).slice(0,y);if(e.length===0)return null;let c=["# prjct: heads-up for this commit",""];c.push(`${e.length} anti-pattern/gotcha entr${e.length===1?"y":"ies"} match the staged files.`),c.push(""),c.push(u(e)),c.push(""),c.push("> Nudge, not block. Proceed if you think it still applies.");let p=c.join(`
10
- `);return a(p,h)}i(I,"buildPreCommitContext");function _(t=process.cwd(),o){return f({event:"PreToolUse",projectPath:t,build:i(async(r,n)=>w(r)?I(n):null,"build")},o)}i(_,"runPreCommitHook");function w(t){return/\bgit\s+commit\b/.test(t.tool_input?.command??"")}i(w,"isCommitInput");export{I as a,_ as b,w as c};
8
+ import{a as f}from"./chunk-ZJXH76Q5.mjs";import{g as m}from"./chunk-7JEKBJAP.mjs";import{a}from"./chunk-27XFSCOE.mjs";import{h as l}from"./chunk-DRGI5UHQ.mjs";import{b as u}from"./chunk-AZHE4VOM.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execSync as d}from"node:child_process";var h=1200,y=3;function C(t){try{return d("git diff --cached --name-only",{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
9
+ `).map(o=>o.trim()).filter(Boolean)}catch{return[]}}i(C,"stagedFiles");function b(t){let o=new Set;for(let r of t){let n=r.split("/").filter(Boolean);for(let s of n){let e=s.replace(/\.[^.]+$/,"").toLowerCase();e.length>=3&&o.add(e)}}return[...o]}i(b,"pathFragments");function k(t,o){let r=t.content.toLowerCase();if(o.some(n=>r.includes(n)))return!0;for(let n of Object.values(t.tags)){let s=n.toLowerCase();if(o.some(e=>s.includes(e)))return!0}return!1}i(k,"mentionsFragment");async function I(t){let o=await u.readConfig(t);if(!o?.projectId)return null;let r=C(t);if(r.length===0)return null;let n=b(r);if(n.length===0)return null;let s=(()=>{try{return a.recall(o.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}})();if(!s)return null;let e=s.filter(g=>k(g,n)).slice(0,y);if(e.length===0)return null;let c=["# prjct: heads-up for this commit",""];c.push(`${e.length} anti-pattern/gotcha entr${e.length===1?"y":"ies"} match the staged files.`),c.push(""),c.push(m(e)),c.push(""),c.push("> Nudge, not block. Proceed if you think it still applies.");let p=c.join(`
10
+ `);return l(p,h)}i(I,"buildPreCommitContext");function _(t=process.cwd(),o){return f({event:"PreToolUse",projectPath:t,build:i(async(r,n)=>w(r)?I(n):null,"build")},o)}i(_,"runPreCommitHook");function w(t){return/\bgit\s+commit\b/.test(t.tool_input?.command??"")}i(w,"isCommitInput");export{I as a,_ as b,w as c};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{e as c,g as S}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";S();var E=45,O=1,T=.4,R=2.5,h=-2.5,x=-.5,I=-1.3,p=864e5,N=["resolves","relates","supersedes","superseded-by","duplicates","spec"],C=["corrects","contradicts"],d=/\bmem[_-](\d+)\b/g;function w(n,r){let e=new Set;for(let t of N){let s=r[t];if(s)for(let o of String(s).matchAll(d))e.add(`mem_${o[1]}`)}for(let t of n.matchAll(d))e.add(`mem_${t[1]}`);for(let t of l(r))e.delete(t);return[...e]}m(w,"extractRefIds");function l(n){let r=new Set;for(let e of C){let t=n[e];if(t)for(let s of String(t).matchAll(d))r.add(`mem_${s[1]}`)}return[...r]}m(l,"extractCorrectionIds");function g(n,r,e,t,s){c.run(n,`INSERT INTO memory_usefulness (memory_id, score, ${t}, last_used_at)
8
+ import{e as c,g as S}from"./chunk-KG7Z6OMK.mjs";import{a as m}from"./chunk-E66B27AL.mjs";S();var E=45,O=1,T=.4,R=2.5,h=-2.5,x=-.5,I=-1.3,p=864e5,N=["resolves","relates","supersedes","superseded-by","duplicates","spec"],C=["corrects","contradicts"],d=/\bmem[_-](\d+)\b/g;function w(n,r){let e=new Set;for(let t of N){let s=r[t];if(s)for(let o of String(s).matchAll(d))e.add(`mem_${o[1]}`)}for(let t of n.matchAll(d))e.add(`mem_${t[1]}`);for(let t of l(r))e.delete(t);return[...e]}m(w,"extractRefIds");function l(n){let r=new Set;for(let e of C){let t=n[e];if(t)for(let s of String(t).matchAll(d))r.add(`mem_${s[1]}`)}return[...r]}m(l,"extractCorrectionIds");function g(n,r,e,t,s){c.run(n,`INSERT INTO memory_usefulness (memory_id, score, ${t}, last_used_at)
9
9
  VALUES (?, ?, 1, ?)
10
10
  ON CONFLICT(memory_id) DO UPDATE SET
11
11
  score = score + ?, ${t} = ${t} + 1, last_used_at = excluded.last_used_at`,r,e,s,e)}m(g,"bump");function f(n,r,e,t){c.run(n,`INSERT INTO memory_usefulness (memory_id, score, last_used_at)
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as o,c as O}from"./chunk-E66B27AL.mjs";import{exec as _,execFile as U,spawn as R}from"node:child_process";import{promisify as T}from"node:util";function B(r){try{process.platform==="win32"?r.pid!==void 0&&R("taskkill",["/pid",String(r.pid),"/T","/F"],{stdio:"ignore"}).unref():r.pid!==void 0&&process.kill(-r.pid,"SIGKILL")}catch{}try{r.kill("SIGKILL")}catch{}}function h(r,e){if(r.length===0)return"";let t=Buffer.concat(r);return(t.length>e?t.subarray(0,e):t).toString("utf8")}function G(r){let e=r.code;return typeof e=="string"?e:void 0}function J(r,e,t={}){let n=t.timeoutMs??D,s=t.maxBuffer??K,a=s,C=t.spawnFn??R,f=[r,...e],I=Date.now(),l=o(()=>Date.now()-I,"duration");return t.signal?.aborted?Promise.resolve({ok:!1,kind:"timeout",budgetMs:0,budgetSource:"abort",args:f,stdout:"",stderr:"",durationMs:0}):new Promise(F=>{let P=[],v=[],u={settled:!1,overflow:!1,outBytes:0,errBytes:0},d=C(r,e,{cwd:t.cwd,env:t.env,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"]}),g=o(i=>{u.settled||(u.settled=!0,clearTimeout(L),t.signal?.removeEventListener("abort",S),F(i))},"finish"),x=o(()=>({stdout:h(P,a),stderr:h(v,a)}),"partials"),E=o((i,c)=>{B(d);let{stdout:m,stderr:k}=x();g({ok:!1,kind:"timeout",budgetMs:c,budgetSource:i,args:f,stdout:m,stderr:k,durationMs:l()})},"finishTimeout"),A=o(()=>{B(d);let{stdout:i,stderr:c}=x();g({ok:!1,kind:"overflow",maxBuffer:s,args:f,stdout:i,stderr:c||`maxBuffer exceeded (${s} bytes)`,durationMs:l()})},"finishOverflow"),L=setTimeout(()=>E("timeout",n),n),S=o(()=>E("abort",n),"onAbort");t.signal?.addEventListener("abort",S,{once:!0});let y=o((i,c)=>{u.settled||(c?(v.push(i),u.errBytes+=i.length):(P.push(i),u.outBytes+=i.length),!u.overflow&&u.outBytes+u.errBytes>s&&(u.overflow=!0,A()))},"onChunk");d.stdout?.on("data",i=>y(i,!1)),d.stderr?.on("data",i=>y(i,!0)),d.on("error",i=>{g({ok:!1,kind:"spawn",cause:i,code:G(i),args:f,durationMs:l()})}),d.on("close",(i,c)=>{if(u.settled)return;let{stdout:m,stderr:k}=x();g(i===0?{ok:!0,stdout:m,stderr:k,durationMs:l()}:{ok:!1,kind:"exit",code:i??-1,signal:c,stdout:m,stderr:k.trim(),args:f,durationMs:l()})})})}function w(r,e={}){return J("git",r,e)}function q(r){return!r.ok&&(r.kind==="timeout"||r.kind==="spawn"||r.kind==="overflow")}function Q(r,e){return!Number.isInteger(e)||e<0?!1:!r.ok&&r.kind==="exit"&&r.code===e}function b(r,e=N){let n=r.replace(/[\r\n\t]+/g," ").replace(/\s+/g," ").trim().replace(/(?:[A-Za-z]:)?(?:\/|\\)(?:Users|home|tmp|var|private|Users)(?:\/|\\)[^\s]*/gi,"\u2026").replace(/\/(?:Users|home|tmp|var|private)\/[^\s]*/gi,"\u2026");return n.length<=e?n:`${n.slice(0,Math.max(0,e-1))}\u2026`}function $(r){return r.ok||r.kind==="exit"?null:r.kind==="timeout"?new p("timeout",r.args,r.budgetSource==="abort"?"aborted by caller signal":`exceeded ${r.budgetMs}ms`,{budgetSource:r.budgetSource}):r.kind==="overflow"?new p("overflow",r.args,`maxBuffer ${r.maxBuffer} bytes`):new p("spawn",r.args,r.cause.message)}function j(r){if(r.ok)return null;if(r.kind==="exit"){let e=r.stderr?` \u2014 ${b(r.stderr,120)}`:"",t=r.signal?` signal=${r.signal}`:"";return new Error(b(`command failed (exit ${r.code}${t}): ${r.args.join(" ")}${e}`))}return $(r)}function M(r){throw r.ok?new Error("throwProc called on ok result"):j(r)??new Error(`process failed (${r.kind})`)}function W(r,e){if(r.ok)return e.ok(r);switch(r.kind){case"exit":return e.exit(r);case"timeout":return e.timeout(r);case"spawn":return e.spawn(r);case"overflow":return e.overflow(r);default:return r}}async function Y(r,e,t={}){let n=await w(e,{...t,cwd:r});if(n.ok)return n.stdout.trim();let s=$(n);if(s)throw s;return null}async function rr(r){let e=new Set,t=await w(["diff","--name-only","HEAD"],{cwd:r});if(t.ok)for(let s of t.stdout.split(`
9
+ `)){let a=s.trim();a&&e.add(a)}else t.kind!=="exit"&&M(t);let n=await w(["ls-files","--others","--exclude-standard"],{cwd:r});if(n.ok)for(let s of n.stdout.split(`
10
+ `)){let a=s.trim();a&&e.add(a)}else n.kind!=="exit"&&M(n);return[...e].sort()}var V,Z,D,K,N,p,z=O(()=>{V=T(_),Z=T(U),D=1e4,K=1024*1024,N=240;o(B,"killProcessTree");o(h,"joinChunks");o(G,"nodeErrorCode");o(J,"runProc");o(w,"runGit");o(q,"isProcInfra");o(Q,"exitCodeMeans");o(b,"sanitizeProcEnvelope");p=class extends Error{static{o(this,"GitInfraError")}kind;args;detail;budgetSource;constructor(e,t,n,s){super(b(`git ${e} failure (${t.join(" ")}): ${n}`)),this.name="GitInfraError",this.kind=e,this.args=t,this.detail=n,this.budgetSource=s?.budgetSource}};o($,"gitInfraErrorOf");o(j,"procErrorOf");o(M,"throwProc");o(W,"matchProc");o(Y,"gitStdout");o(rr,"listChangedFiles")});export{V as a,Z as b,N as c,J as d,w as e,q as f,Q as g,b as h,p as i,$ as j,j as k,M as l,W as m,Y as n,rr as o,z as p};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as C}from"./chunk-HJ4HEI45.mjs";import{d as l,g as A}from"./chunk-HDHVBB6Q.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as t}from"zod";var O=t.enum(["improving","stable","declining"]),R=t.object({sprintNumber:t.number(),startDate:t.string(),endDate:t.string(),pointsCompleted:t.number(),tasksCompleted:t.number(),avgVariance:t.number(),estimationAccuracy:t.number()}),D=t.object({category:t.string(),avgVariance:t.number(),taskCount:t.number()}),I=t.object({totalPoints:t.number(),sprints:t.number(),estimatedDate:t.string()}),P=t.object({sprints:t.array(R),averageVelocity:t.number(),velocityTrend:O,estimationAccuracy:t.number(),overEstimated:t.array(D),underEstimated:t.array(D),lastUpdated:t.string()}),U=t.object({sprintLengthDays:t.number().min(1).max(90).default(7),startDay:t.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:t.number().min(1).max(52).default(6),accuracyTolerance:t.number().min(0).max(100).default(20)});var f={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""};A();var h=10080*60*1e3;function M(m){let r=new Date(m).getTime();return Number.isFinite(r)?Math.floor(r/h):null}d(M,"epochWeek");function k(m){return new Date(m*h).toISOString()}d(k,"weekStartIso");function w(m){return new Date((m+1)*h-1).toISOString()}d(w,"weekEndIso");var E=class extends C{static{d(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:f,lastUpdated:""}}getEventType(r){return`velocity.${r}d`}async recompute(r){let o=l.query(r,"SELECT completed_at FROM tasks WHERE completed_at IS NOT NULL"),_=l.query(r,"SELECT shipped_at FROM shipped_features"),c=new Map;for(let a of o){let n=M(a.completed_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.tasks++,c.set(n,p)}for(let a of _){let n=M(a.shipped_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.ships++,c.set(n,p)}for(let[a,n]of c)l.run(r,`INSERT INTO velocity_sprints
8
+ import{a as C}from"./chunk-INXNK57E.mjs";import{d as l,g as A}from"./chunk-KG7Z6OMK.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as t}from"zod";var O=t.enum(["improving","stable","declining"]),R=t.object({sprintNumber:t.number(),startDate:t.string(),endDate:t.string(),pointsCompleted:t.number(),tasksCompleted:t.number(),avgVariance:t.number(),estimationAccuracy:t.number()}),D=t.object({category:t.string(),avgVariance:t.number(),taskCount:t.number()}),I=t.object({totalPoints:t.number(),sprints:t.number(),estimatedDate:t.string()}),P=t.object({sprints:t.array(R),averageVelocity:t.number(),velocityTrend:O,estimationAccuracy:t.number(),overEstimated:t.array(D),underEstimated:t.array(D),lastUpdated:t.string()}),U=t.object({sprintLengthDays:t.number().min(1).max(90).default(7),startDay:t.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:t.number().min(1).max(52).default(6),accuracyTolerance:t.number().min(0).max(100).default(20)});var f={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""};A();var h=10080*60*1e3;function M(m){let r=new Date(m).getTime();return Number.isFinite(r)?Math.floor(r/h):null}d(M,"epochWeek");function k(m){return new Date(m*h).toISOString()}d(k,"weekStartIso");function w(m){return new Date((m+1)*h-1).toISOString()}d(w,"weekEndIso");var E=class extends C{static{d(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:f,lastUpdated:""}}getEventType(r){return`velocity.${r}d`}async recompute(r){let o=l.query(r,"SELECT completed_at FROM tasks WHERE completed_at IS NOT NULL"),_=l.query(r,"SELECT shipped_at FROM shipped_features"),c=new Map;for(let a of o){let n=M(a.completed_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.tasks++,c.set(n,p)}for(let a of _){let n=M(a.shipped_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.ships++,c.set(n,p)}for(let[a,n]of c)l.run(r,`INSERT INTO velocity_sprints
9
9
  (sprint_number, points_completed, tasks_completed, estimation_accuracy, avg_variance, started_at, ended_at)
10
10
  VALUES (?, ?, ?, 0, 0, ?, ?)
11
11
  ON CONFLICT(sprint_number) DO UPDATE SET
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as o}from"./chunk-E66B27AL.mjs";var s={critical:0,high:1,medium:2,low:3},c={active:0,previously_active:1,backlog:2};function u(e){return[...e].sort((t,r)=>{let i=c[t.section]-c[r.section];return i!==0?i:s[t.priority]-s[r.priority]})}o(u,"sortBySectionAndPriority");function a(e,t){let r=new Set;return e.filter(i=>{let n=t(i);return r.has(n)?!1:(r.add(n),!0)})}o(a,"uniqueBy");function y(e){return Array.from(e.entries()).map(([t,r])=>({path:t,score:r})).sort((t,r)=>r.score-t.score)}o(y,"scoresToSortedArray");export{u as a,a as b,y as c};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{c as r}from"./chunk-L4COZ7ZH.mjs";import{b as t}from"./chunk-SOPRYWUY.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function u(o){let n=t(o);return n.allow?null:{deny:n.denyMessage}}e(u,"decideSecrets");function l(o=process.cwd(),n){return r({event:"PreToolUse",projectPath:o,decide:e(async c=>{try{return u(c)}catch{return null}},"decide")},n)}e(l,"runPreSecretsHook");var p={decideSecrets:u};export{u as a,l as b,p as c};
8
+ import{a as r}from"./chunk-ZJXH76Q5.mjs";import{b as t}from"./chunk-XS45K7ZQ.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function u(o){let n=t(o);return n.allow?null:{deny:n.denyMessage}}e(u,"decideSecrets");function l(o=process.cwd(),n){return r({event:"PreToolUse",projectPath:o,decide:e(async c=>{try{return u(c)}catch{return null}},"decide")},n)}e(l,"runPreSecretsHook");var p={decideSecrets:u};export{u as a,l as b,p as c};