prjct-cli 3.94.0 → 3.96.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 (190) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +27 -21
  3. package/dist/bin/hook-chunks/{agent-identity-45BYQBU2.mjs → agent-identity-DH6DX72X.mjs} +1 -1
  4. package/dist/bin/hook-chunks/{agent-switch-2U2LOBGR.mjs → agent-switch-I4MTVE56.mjs} +1 -1
  5. package/dist/bin/hook-chunks/{analysis-N4NYGIG3.mjs → analysis-VN7APBHR.mjs} +3 -3
  6. package/dist/bin/hook-chunks/{auth-config-SP4PBALR.mjs → auth-config-JIITQ6GY.mjs} +1 -1
  7. package/dist/bin/hook-chunks/{auto-flush-BN6L6QHO.mjs → auto-flush-DX3FVSQE.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{capture-gate-FRF2G3IG.mjs → capture-gate-MEIQD7ZS.mjs} +1 -1
  9. package/dist/bin/hook-chunks/{chunk-OZJ6UKKP.mjs → chunk-22GFTUER.mjs} +1 -1
  10. package/dist/bin/hook-chunks/chunk-32RX4YGI.mjs +9 -0
  11. package/dist/bin/hook-chunks/{chunk-Q3EYM4GJ.mjs → chunk-33BHU4OM.mjs} +2 -2
  12. package/dist/bin/hook-chunks/{chunk-HNEKXKOI.mjs → chunk-3AHW4XQH.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-JMCMTX6U.mjs → chunk-3CKNJ5RA.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-6RLCUGGG.mjs → chunk-3FEXJUO2.mjs} +1 -1
  15. package/dist/bin/hook-chunks/{chunk-7GNWHWOO.mjs → chunk-3HGQPUKG.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-D6IONKRA.mjs → chunk-3UB6SFRA.mjs} +1 -1
  17. package/dist/bin/hook-chunks/{chunk-AVRNHROK.mjs → chunk-64ZEBHDX.mjs} +1 -1
  18. package/dist/bin/hook-chunks/{chunk-MI3JEFON.mjs → chunk-7PBWIO4K.mjs} +3 -3
  19. package/dist/bin/hook-chunks/{chunk-UA4Z5TGG.mjs → chunk-7WO5CEH3.mjs} +1 -1
  20. package/dist/bin/hook-chunks/chunk-A6K4H3YT.mjs +9 -0
  21. package/dist/bin/hook-chunks/{chunk-3VWBNLBC.mjs → chunk-ADYTBOCZ.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-TG5CQJD5.mjs → chunk-AORD3YDQ.mjs} +1 -1
  23. package/dist/bin/hook-chunks/{chunk-EHEQOF6Z.mjs → chunk-B36LC2JR.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-FX6VHIKB.mjs → chunk-BKJHD5JI.mjs} +1 -1
  25. package/dist/bin/hook-chunks/{chunk-S7HQQILD.mjs → chunk-BVK7ZDLX.mjs} +1 -1
  26. package/dist/bin/hook-chunks/{chunk-HHIGNKDO.mjs → chunk-CPR4FPXG.mjs} +1 -1
  27. package/dist/bin/hook-chunks/{chunk-6UH244CC.mjs → chunk-D7DQABWO.mjs} +1 -1
  28. package/dist/bin/hook-chunks/{chunk-Y4DUB7UN.mjs → chunk-DB226JIV.mjs} +2 -2
  29. package/dist/bin/hook-chunks/{chunk-KOCROTRM.mjs → chunk-DCHIPMOG.mjs} +1 -1
  30. package/dist/bin/hook-chunks/{chunk-IKIB42F7.mjs → chunk-E7NA34VQ.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-MHQTGU45.mjs → chunk-EGCYDLSO.mjs} +1 -1
  32. package/dist/bin/hook-chunks/{chunk-ZMKTR2IO.mjs → chunk-EI6VQZOX.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-INXNK57E.mjs → chunk-ETTDRXQ6.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-EQ5KNMLG.mjs → chunk-EXVL2OFE.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-5EQLQ7GF.mjs → chunk-FZS3XGEA.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{chunk-QYEASMFV.mjs → chunk-GSPDJSJ5.mjs} +1 -1
  37. package/dist/bin/hook-chunks/{chunk-TKWAFYF7.mjs → chunk-H2DGDAQP.mjs} +1 -1
  38. package/dist/bin/hook-chunks/chunk-H5AVBDCH.mjs +8 -0
  39. package/dist/bin/hook-chunks/{chunk-SDUS2AT7.mjs → chunk-HGZQWYBL.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{chunk-EMTCZG5I.mjs → chunk-IJ523YO2.mjs} +1 -1
  41. package/dist/bin/hook-chunks/{chunk-NBKEOLDH.mjs → chunk-IWUF2LGO.mjs} +5 -5
  42. package/dist/bin/hook-chunks/chunk-JGZ3QGWX.mjs +11 -0
  43. package/dist/bin/hook-chunks/{chunk-66GE3IHX.mjs → chunk-JZDZH6IV.mjs} +1 -1
  44. package/dist/bin/hook-chunks/{chunk-PUHX3ECX.mjs → chunk-KDNUQPAK.mjs} +1 -1
  45. package/dist/bin/hook-chunks/chunk-KV4NXLPT.mjs +11 -0
  46. package/dist/bin/hook-chunks/{chunk-XE4MJNBQ.mjs → chunk-LF3S3MYE.mjs} +1 -1
  47. package/dist/bin/hook-chunks/chunk-LQLCYBFF.mjs +36 -0
  48. package/dist/bin/hook-chunks/{chunk-YUKGWWL7.mjs → chunk-LR24AIEW.mjs} +1 -1
  49. package/dist/bin/hook-chunks/{chunk-2HB2JHQE.mjs → chunk-M4YM7Z3F.mjs} +15 -15
  50. package/dist/bin/hook-chunks/{chunk-F4T7IAA7.mjs → chunk-MW54MTLB.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{chunk-7O6OMD4X.mjs → chunk-NCLONKOT.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{chunk-HRWXMF7P.mjs → chunk-NJ74RHNC.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{chunk-JUZ5LNDI.mjs → chunk-NLL5AV2G.mjs} +2 -2
  54. package/dist/bin/hook-chunks/{chunk-OIU4Y5WL.mjs → chunk-OC4CYF7V.mjs} +1 -1
  55. package/dist/bin/hook-chunks/chunk-OLQAMCYV.mjs +18 -0
  56. package/dist/bin/hook-chunks/{chunk-C3W2HLJT.mjs → chunk-PPWPUEBH.mjs} +1 -1
  57. package/dist/bin/hook-chunks/chunk-PVCEWFHS.mjs +51 -0
  58. package/dist/bin/hook-chunks/{chunk-Y3J7UUMR.mjs → chunk-QOQZHR3E.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{chunk-2UC4DTDO.mjs → chunk-QXCEBAIA.mjs} +1 -1
  60. package/dist/bin/hook-chunks/chunk-RT2DFIWF.mjs +19 -0
  61. package/dist/bin/hook-chunks/{chunk-NCOOKPXX.mjs → chunk-SQW2B7NW.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{chunk-IHECXD2M.mjs → chunk-SWJ7TLBD.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{chunk-X2AGNDGD.mjs → chunk-TB57OYGW.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{chunk-QPRNRLG6.mjs → chunk-TF6PN7IB.mjs} +1 -1
  65. package/dist/bin/hook-chunks/{chunk-KG7Z6OMK.mjs → chunk-TKXOMN4K.mjs} +4 -4
  66. package/dist/bin/hook-chunks/chunk-UMJ5D5I6.mjs +9 -0
  67. package/dist/bin/hook-chunks/{chunk-NWIQNII6.mjs → chunk-UVATSTRF.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{chunk-NHIWYDQD.mjs → chunk-WJV24WE6.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{chunk-Q3Z53QTH.mjs → chunk-WL6PKX3U.mjs} +1 -1
  70. package/dist/bin/hook-chunks/chunk-WUOVBBPC.mjs +11 -0
  71. package/dist/bin/hook-chunks/{chunk-TYEAIX3X.mjs → chunk-XDBJSJOT.mjs} +1 -1
  72. package/dist/bin/hook-chunks/{chunk-JCYXFHQZ.mjs → chunk-XSJ7SPVR.mjs} +1 -1
  73. package/dist/bin/hook-chunks/{chunk-J6TAD3OZ.mjs → chunk-XV2LJVYB.mjs} +1 -1
  74. package/dist/bin/hook-chunks/{chunk-7JEKBJAP.mjs → chunk-XYKVWO23.mjs} +1 -1
  75. package/dist/bin/hook-chunks/{chunk-4O4D6DV7.mjs → chunk-Y3RHBU2R.mjs} +2 -2
  76. package/dist/bin/hook-chunks/{chunk-JPSJWCFD.mjs → chunk-Y7MZA2G4.mjs} +1 -1
  77. package/dist/bin/hook-chunks/{chunk-T2FCU3ZS.mjs → chunk-YHOZTAZH.mjs} +1 -1
  78. package/dist/bin/hook-chunks/chunk-YLOK4WRR.mjs +8 -0
  79. package/dist/bin/hook-chunks/{chunk-OENWCYLF.mjs → chunk-ZJW27EUC.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{chunk-VWOIUTAX.mjs → chunk-ZQI4TJ5C.mjs} +3 -3
  81. package/dist/bin/hook-chunks/chunk-ZYCNW75E.mjs +9 -0
  82. package/dist/bin/hook-chunks/{chunk-AZHE4VOM.mjs → chunk-ZZBNFNMG.mjs} +1 -1
  83. package/dist/bin/hook-chunks/{client-ERZ5CM3D.mjs → client-K3ZA2BLB.mjs} +3 -3
  84. package/dist/bin/hook-chunks/{code-graph-cloud-4GRWQSUK.mjs → code-graph-cloud-XGQF7XYC.mjs} +1 -1
  85. package/dist/bin/hook-chunks/{codex-skill-6DYQMPDJ.mjs → codex-skill-6CRFUF3A.mjs} +1 -1
  86. package/dist/bin/hook-chunks/{command-installer-MF4KUM3X.mjs → command-installer-MUHZWDZA.mjs} +1 -1
  87. package/dist/bin/hook-chunks/{config-manager-2VZPHUDG.mjs → config-manager-2JJPCLKC.mjs} +1 -1
  88. package/dist/bin/hook-chunks/{context7-service-V7CIDF3Q.mjs → context7-service-NH4BMGSJ.mjs} +1 -1
  89. package/dist/bin/hook-chunks/{custom-workflow-storage-UOBQXY42.mjs → custom-workflow-storage-VBMWLKA7.mjs} +1 -1
  90. package/dist/bin/hook-chunks/cwd-changed-UTD6Y4MS.mjs +8 -0
  91. package/dist/bin/hook-chunks/{database-XYKQF3KR.mjs → database-ZCP76LMM.mjs} +1 -1
  92. package/dist/bin/hook-chunks/{detect-changes-DFRJOOB3.mjs → detect-changes-5W6EGEZG.mjs} +1 -1
  93. package/dist/bin/hook-chunks/{developer-evolution-SLC34HUU.mjs → developer-evolution-UTY3CWOK.mjs} +1 -1
  94. package/dist/bin/hook-chunks/{distill-U2LJGUG3.mjs → distill-5TNAM3LY.mjs} +1 -1
  95. package/dist/bin/hook-chunks/{editors-config-6XFYIOE6.mjs → editors-config-2CACBNS4.mjs} +1 -1
  96. package/dist/bin/hook-chunks/{enriched-recall-X6RDNNIE.mjs → enriched-recall-6VOIUNLN.mjs} +1 -1
  97. package/dist/bin/hook-chunks/{format-ALUX4QSI.mjs → format-IIOFTSBF.mjs} +1 -1
  98. package/dist/bin/hook-chunks/{judgment-ledger-storage-SCGU3URM.mjs → judgment-ledger-storage-7Q7AEEY6.mjs} +1 -1
  99. package/dist/bin/hook-chunks/{judgment-orchestrator-BYPG65RS.mjs → judgment-orchestrator-AAON4ZJ4.mjs} +1 -1
  100. package/dist/bin/hook-chunks/{judgment-receipt-GWSSCLAB.mjs → judgment-receipt-QLV3MYFT.mjs} +1 -1
  101. package/dist/bin/hook-chunks/{land-cue-MMISX2BI.mjs → land-cue-57B23PEL.mjs} +1 -1
  102. package/dist/bin/hook-chunks/{land-synthesis-WG5JAS7B.mjs → land-synthesis-ZVPFJERV.mjs} +1 -1
  103. package/dist/bin/hook-chunks/{legacy-crew-sweep-2WSO5KEB.mjs → legacy-crew-sweep-GR6HRSHX.mjs} +2 -2
  104. package/dist/bin/hook-chunks/{memory-index-QK5QJOFJ.mjs → memory-index-XE2MWKQS.mjs} +1 -1
  105. package/dist/bin/hook-chunks/{notification-MPVWVV52.mjs → notification-GU2ZJP5K.mjs} +1 -1
  106. package/dist/bin/hook-chunks/{pack-integrity-XRYOROK5.mjs → pack-integrity-WV5U3AFF.mjs} +1 -1
  107. package/dist/bin/hook-chunks/{pack-manager-WWGQNJDQ.mjs → pack-manager-QLFQKP24.mjs} +1 -1
  108. package/dist/bin/hook-chunks/{path-manager-ZR5RAKTK.mjs → path-manager-375HH6TB.mjs} +1 -1
  109. package/dist/bin/hook-chunks/{planning-S55KBPN2.mjs → planning-VPAX5DZL.mjs} +2 -2
  110. package/dist/bin/hook-chunks/{post-edit-QMHSZHDN.mjs → post-edit-UXCFSR3Y.mjs} +1 -1
  111. package/dist/bin/hook-chunks/{pre-bash-RAM6L3G4.mjs → pre-bash-MB4JNNYG.mjs} +1 -1
  112. package/dist/bin/hook-chunks/{pre-commit-736ZLMDL.mjs → pre-commit-U7TRFKWX.mjs} +1 -1
  113. package/dist/bin/hook-chunks/pre-edit-MDCQXI5F.mjs +11 -0
  114. package/dist/bin/hook-chunks/{pre-package-LCIAWWGK.mjs → pre-package-A6ZI5R64.mjs} +1 -1
  115. package/dist/bin/hook-chunks/{pre-search-J5EOFMYN.mjs → pre-search-ZZO3LGXJ.mjs} +1 -1
  116. package/dist/bin/hook-chunks/{pre-secrets-TSUMTXHH.mjs → pre-secrets-MWPPZPWK.mjs} +1 -1
  117. package/dist/bin/hook-chunks/{prjct-md-T2DG236Y.mjs → prjct-md-MS52YLI2.mjs} +1 -1
  118. package/dist/bin/hook-chunks/{project-agent-surfaces-VRY22I66.mjs → project-agent-surfaces-6AIW7KL6.mjs} +1 -1
  119. package/dist/bin/hook-chunks/{project-file-inventory-5DEN5VLF.mjs → project-file-inventory-HHURZTMH.mjs} +1 -1
  120. package/dist/bin/hook-chunks/project-memory-UDH56VFP.mjs +8 -0
  121. package/dist/bin/hook-chunks/{project-style-evolution-7MAUSED2.mjs → project-style-evolution-IJXT2MCP.mjs} +1 -1
  122. package/dist/bin/hook-chunks/prompt-7VZLYONO.mjs +24 -0
  123. package/dist/bin/hook-chunks/{publish-helper-G54XQV5K.mjs → publish-helper-ZSL27HSX.mjs} +1 -1
  124. package/dist/bin/hook-chunks/{purge-MC5LFSAO.mjs → purge-N2WN6NDB.mjs} +1 -1
  125. package/dist/bin/hook-chunks/retention-RET4P2RO.mjs +8 -0
  126. package/dist/bin/hook-chunks/{sdd-5UCVX43H.mjs → sdd-PB6WKSLE.mjs} +1 -1
  127. package/dist/bin/hook-chunks/{session-continuity-RKNAJJHR.mjs → session-continuity-BIJXMN44.mjs} +1 -1
  128. package/dist/bin/hook-chunks/session-start-R2VMKW2L.mjs +8 -0
  129. package/dist/bin/hook-chunks/settings-installer-CQKMGMRG.mjs +9 -0
  130. package/dist/bin/hook-chunks/{setup-WQRJ6TQL.mjs → setup-PPIZHVXS.mjs} +3 -3
  131. package/dist/bin/hook-chunks/{shipping-5D5LTJ3P.mjs → shipping-C637PCOF.mjs} +4 -4
  132. package/dist/bin/hook-chunks/{skill-index-RAVJMC4P.mjs → skill-index-55I3HLAI.mjs} +1 -1
  133. package/dist/bin/hook-chunks/{spec-context-inference-7DDSTRTV.mjs → spec-context-inference-RTTDOZZO.mjs} +1 -1
  134. package/dist/bin/hook-chunks/{spec-service-LAO5Z2M5.mjs → spec-service-ENLAAMVL.mjs} +2 -2
  135. package/dist/bin/hook-chunks/{spec-task-breakdown-K3GMQKGH.mjs → spec-task-breakdown-RUDEP3AY.mjs} +1 -1
  136. package/dist/bin/hook-chunks/{state-storage-EIFGUO7X.mjs → state-storage-AJUPG7J5.mjs} +1 -1
  137. package/dist/bin/hook-chunks/stop-DPXAWJFN.mjs +16 -0
  138. package/dist/bin/hook-chunks/subagent-start-AFHPXL2S.mjs +8 -0
  139. package/dist/bin/hook-chunks/{subagent-stop-RBD2OILE.mjs → subagent-stop-5BMV63ML.mjs} +1 -1
  140. package/dist/bin/hook-chunks/{surface-attribution-K37N2NK7.mjs → surface-attribution-EGIKCVMF.mjs} +1 -1
  141. package/dist/bin/hook-chunks/{symbol-graph-BKQIMFRG.mjs → symbol-graph-MH42JSPX.mjs} +1 -1
  142. package/dist/bin/hook-chunks/{sync-client-EGBMWF3J.mjs → sync-client-PIRHMHXL.mjs} +1 -1
  143. package/dist/bin/hook-chunks/{sync-cursor-storage-E3LMZISA.mjs → sync-cursor-storage-ZB7FGT6D.mjs} +1 -1
  144. package/dist/bin/hook-chunks/{task-orchestration-2ZYE5M6J.mjs → task-orchestration-7NGRIISS.mjs} +1 -1
  145. package/dist/bin/hook-chunks/{task-overview-ITY5OSHX.mjs → task-overview-F3GB77OA.mjs} +1 -1
  146. package/dist/bin/hook-chunks/task-service-FZABHPFV.mjs +8 -0
  147. package/dist/bin/hook-chunks/{tdd-7S55S5C3.mjs → tdd-TAMBOPN3.mjs} +1 -1
  148. package/dist/bin/hook-chunks/{template-loader-SCM4C2A3.mjs → template-loader-MXOMU4XH.mjs} +1 -1
  149. package/dist/bin/hook-chunks/{transcript-jsonl-6X4DDD6R.mjs → transcript-jsonl-7W2NOJPZ.mjs} +1 -1
  150. package/dist/bin/hook-chunks/{usefulness-SCH5ARGV.mjs → usefulness-TBD5EYAL.mjs} +1 -1
  151. package/dist/bin/hook-chunks/{vault-retire-notice-HT756AND.mjs → vault-retire-notice-7XHVNHU6.mjs} +1 -1
  152. package/dist/bin/hook-chunks/{velocity-storage-47CF3XWZ.mjs → velocity-storage-IOCVK2LU.mjs} +1 -1
  153. package/dist/bin/hook-chunks/{weak-model-mode-FLCEQ2BV.mjs → weak-model-mode-BMSPGEQY.mjs} +1 -1
  154. package/dist/bin/hook-chunks/{work-graph-JQHVVXIZ.mjs → work-graph-AVAOKY63.mjs} +1 -1
  155. package/dist/bin/hook-chunks/work-scope-YCS4GTXW.mjs +8 -0
  156. package/dist/bin/hook-chunks/{workspace-occupancy-UUW4UGGB.mjs → workspace-occupancy-JOBYNNXV.mjs} +1 -1
  157. package/dist/bin/hook-fast-darwin-arm64 +0 -0
  158. package/dist/bin/hook-fast-darwin-x64 +0 -0
  159. package/dist/bin/hook-fast-linux-x64 +0 -0
  160. package/dist/bin/prjct-core.mjs +739 -714
  161. package/dist/bin/prjct-hooks.mjs +3 -3
  162. package/dist/bin/prjct.mjs +22 -9
  163. package/dist/daemon/entry.mjs +620 -593
  164. package/dist/mcp/server.mjs +317 -303
  165. package/package.json +3 -5
  166. package/scripts/install.sh +28 -496
  167. package/dist/bin/hook-chunks/chunk-27XFSCOE.mjs +0 -43
  168. package/dist/bin/hook-chunks/chunk-4SKJWNKE.mjs +0 -11
  169. package/dist/bin/hook-chunks/chunk-AZYQFRPJ.mjs +0 -9
  170. package/dist/bin/hook-chunks/chunk-DRGI5UHQ.mjs +0 -10
  171. package/dist/bin/hook-chunks/chunk-GFY4GY3Z.mjs +0 -8
  172. package/dist/bin/hook-chunks/chunk-JAMSIKDE.mjs +0 -9
  173. package/dist/bin/hook-chunks/chunk-NUJASVHN.mjs +0 -18
  174. package/dist/bin/hook-chunks/chunk-NWZEBCTC.mjs +0 -19
  175. package/dist/bin/hook-chunks/chunk-PW3KYKVS.mjs +0 -9
  176. package/dist/bin/hook-chunks/chunk-TFCLMTJ5.mjs +0 -9
  177. package/dist/bin/hook-chunks/chunk-TRMBRDKH.mjs +0 -8
  178. package/dist/bin/hook-chunks/chunk-V2BSS7HW.mjs +0 -36
  179. package/dist/bin/hook-chunks/chunk-ZJXH76Q5.mjs +0 -11
  180. package/dist/bin/hook-chunks/cwd-changed-J6O46KS7.mjs +0 -8
  181. package/dist/bin/hook-chunks/pre-edit-GZ4QJ2MU.mjs +0 -11
  182. package/dist/bin/hook-chunks/project-memory-KKEMTEMP.mjs +0 -8
  183. package/dist/bin/hook-chunks/prompt-DVF6V2X2.mjs +0 -22
  184. package/dist/bin/hook-chunks/retention-LWETHQX3.mjs +0 -8
  185. package/dist/bin/hook-chunks/session-start-MFMFKUPK.mjs +0 -8
  186. package/dist/bin/hook-chunks/settings-installer-QDM3GB6J.mjs +0 -9
  187. package/dist/bin/hook-chunks/stop-RYLI4FGF.mjs +0 -16
  188. package/dist/bin/hook-chunks/subagent-start-CCUPSANT.mjs +0 -8
  189. package/dist/bin/hook-chunks/task-service-XREJLWEF.mjs +0 -8
  190. package/dist/bin/hook-chunks/work-scope-CDLSZ4U5.mjs +0 -8
@@ -5,10 +5,10 @@ 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 D,g as O,h as v,i as G,j as q}from"./chunk-FX6VHIKB.mjs";import{a as W,b as C}from"./chunk-HHIGNKDO.mjs";import{g as z,k as T}from"./chunk-7GNWHWOO.mjs";import{a as B,e as H}from"./chunk-JMCMTX6U.mjs";import{c as A}from"./chunk-R4ILCXKE.mjs";import{a as I}from"./chunk-27XFSCOE.mjs";import{e as w,g as se}from"./chunk-KG7Z6OMK.mjs";import{a as L,p as oe}from"./chunk-QWQFF2UG.mjs";import{a as c}from"./chunk-E66B27AL.mjs";se();oe();async function ce(e,t=100){try{let{stdout:r}=await L(`git log --name-only --pretty=format:'---COMMIT---' -${t}`,{cwd:e,maxBuffer:10485760}),n=r.split(`
8
+ import{e as D,g as O,h as v,i as G,j as q}from"./chunk-BKJHD5JI.mjs";import{a as W,b as C}from"./chunk-CPR4FPXG.mjs";import{g as z,k as T}from"./chunk-3HGQPUKG.mjs";import{a as B,e as H}from"./chunk-3CKNJ5RA.mjs";import{c as A}from"./chunk-R4ILCXKE.mjs";import{b as I}from"./chunk-PVCEWFHS.mjs";import{e as w,g as se}from"./chunk-TKXOMN4K.mjs";import{a as L,p as oe}from"./chunk-QWQFF2UG.mjs";import{a as c}from"./chunk-E66B27AL.mjs";se();oe();async function ce(e,t=100){try{let{stdout:r}=await L(`git log --name-only --pretty=format:'---COMMIT---' -${t}`,{cwd:e,maxBuffer:10485760}),n=r.split(`
9
9
  `).reduce((o,i)=>{let m=i.trim();return m==="---COMMIT---"?(o.currentFiles&&o.currentFiles.size>0&&o.currentFiles.size<=30&&o.commits.push(o.currentFiles),o.currentFiles=new Set):m&&o.currentFiles&&ae(m)&&o.currentFiles.add(m),o},{commits:[],currentFiles:null});return n.currentFiles&&n.currentFiles.size>0&&n.currentFiles.size<=30&&n.commits.push(n.currentFiles),n.commits}catch{return[]}}c(ce,"parseGitLog");function ae(e){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(e)&&!e.includes("node_modules/")}c(ae,"isSourceFile");async function le(e,t=100){let r=await ce(e,t),n=new Map,o=new Map;for(let m of r){let p=Array.from(m);for(let g of p)n.set(g,(n.get(g)||0)+1);for(let[g,f]of p.entries())for(let h of p.slice(g+1)){let d=me(f,h);o.set(d,(o.get(d)||0)+1)}}let i={};for(let[m,p]of o){let[g,f]=m.split("\0"),h=n.get(g)||0,d=n.get(f)||0;if(h<2||d<2)continue;let s=h+d-p,a=s>0?p/s:0;a<.1||(i[g]||(i[g]={}),i[f]||(i[f]={}),i[g][f]=a,i[f][g]=a)}return{matrix:i,commitsAnalyzed:r.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}c(le,"buildMatrix");function me(e,t){return e<t?`${e}\0${t}`:`${t}\0${e}`}c(me,"pairKey");function _(e,t){let r=new Set(e),n=new Map;for(let o of e){let i=t.matrix[o];if(i)for(let[m,p]of Object.entries(i)){if(r.has(m))continue;let g=n.get(m)||0;p>g&&n.set(m,p)}}return A(n)}c(_,"scoreFromSeeds");var N="cochange-index",R=new Map;function ge(e,t){w.setDoc(e,N,t),R.delete(e)}c(ge,"saveMatrix");function F(e){let t=w.get(e,"SELECT updated_at FROM kv_store WHERE key = ?",N);if(!t)return R.delete(e),null;let r=R.get(e);if(r&&r.updatedAt===t.updated_at)return r.matrix;let n=w.getDoc(e,N);return n&&R.set(e,{matrix:n,updatedAt:t.updated_at}),n}c(F,"loadMatrix");async function pe(e,t){try{let{stdout:r}=await L(`git rev-list --max-count=${t} HEAD`,{cwd:e,maxBuffer:1048576}),n=r.split(`
10
10
  `).map(o=>o.trim()).filter(Boolean);return n.length>0?n.join(`
11
- `):null}catch{return null}}c(pe,"recentHistoryFingerprint");async function Se(e,t,r=100){let n=await pe(e,r),o=n?F(t):null;if(o?.historyFingerprint===n)return o;let i=await le(e,r);return n&&(i.historyFingerprint=n),ge(t,i),i}c(Se,"indexCoChanges");function E(e){if(e.length===0)return[];let t=e[0]?.score||1;return e.map(r=>({path:r.path,score:r.score/t}))}c(E,"normalize");var M=[{name:"bm25",kind:"query",defaultWeight:.45,hasIndex:c(e=>B(e),"hasIndex"),scoreFromQuery:c((e,t,r)=>E(H(e,t,r)),"scoreFromQuery")},{name:"symbols",kind:"query",defaultWeight:.2,hasIndex:c(e=>z(e),"hasIndex"),scoreFromQuery:c((e,t,r)=>E(T(e,t,r)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.2,hasIndex:c(e=>C(e)!==null,"hasIndex"),scoreFromSeeds:c((e,t,r)=>{let n=C(e);return n?E(W(t,n,r.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.15,hasIndex:c(e=>F(e)!==null,"hasIndex"),scoreFromSeeds:c((e,t)=>{let r=F(e);return r?E(_(t,r)):[]},"scoreFromSeeds")}];var ue={bm25Weight:.45,importWeight:.2,cochangeWeight:.15,symbolsWeight:.2,topN:15,importDepth:2},Q=10;function U(e,t,r={}){let n={...ue,...r},o={bm25:n.bm25Weight,symbols:n.symbolsWeight,imports:n.importWeight,cochange:n.cochangeWeight},i=M.filter(s=>s.kind==="query"),m=M.filter(s=>s.kind==="seed"),p=new Map,g=new Map;for(let s of i){let a=s.scoreFromQuery(e,t,n.topN*3);if(a.length!==0){p.set(s.name,new Map(a.map(u=>[u.path,u.score])));for(let u of a.slice(0,Q))g.set(u.path,Math.max(g.get(u.path)??0,u.score))}}if(p.size===0)return[];let f=[...g.entries()].sort((s,a)=>a[1]-s[1]).slice(0,Q).map(([s])=>s);for(let s of m){let a=s.scoreFromSeeds(e,f,{importDepth:n.importDepth});a.length!==0&&p.set(s.name,new Map(a.map(u=>[u.path,u.score])))}let h=new Set;for(let s of p.values())for(let a of s.keys())h.add(a);let d=[];for(let s of h){let a=[...p].reduce((u,[l,y])=>{let b=y.get(s)??0,k=o[l]??M.find(S=>S.name===l)?.defaultWeight??0;return u+b*k},0);d.push({path:s,finalScore:a,signals:{bm25:p.get("bm25")?.get(s)??0,imports:p.get("imports")?.get(s)??0,cochange:p.get("cochange")?.get(s)??0,symbols:p.get("symbols")?.get(s)??0}})}return d.sort((s,a)=>a.finalScore-s.finalScore),d.slice(0,n.topN)}c(U,"rankFiles");function K(e){let t={};for(let r of M)t[r.name]=r.hasIndex(e);return{bm25:t.bm25??!1,imports:t.imports??!1,cochange:t.cochange??!1,symbols:t.symbols??!1}}c(K,"hasIndexes");function X(e,t,r=8){let n=t.map(s=>s.trim()).filter(Boolean),o=!!C(e),i=!!F(e),m=new Map;if(n.length>0&&o)try{for(let s of W(n,C(e),2)){if(n.some(u=>u.endsWith(s.path)||s.path.endsWith(u)))continue;let a=m.get(s.path)??{score:0,via:new Set};a.score+=s.score,a.via.add("imports"),m.set(s.path,a)}}catch{}if(n.length>0&&i)try{for(let s of _(n,F(e))){if(n.some(u=>u.endsWith(s.path)||s.path.endsWith(u)))continue;let a=m.get(s.path)??{score:0,via:new Set};a.score+=s.score,a.via.add("cochange"),m.set(s.path,a)}}catch{}let p=[...m.entries()].map(([s,a])=>({path:s,score:a.score,via:a.via.size>1?"both":[...a.via][0]??"imports"})).sort((s,a)=>a.score-s.score).slice(0,r),g=[];for(let s of n.slice(0,5))try{let a=I.recallForFile(e,s,2,{preventiveOnly:!0});for(let u of a)g.push({id:u.id,type:u.type,title:u.content.replace(/\s+/g," ").trim().slice(0,100),file:s})}catch{}let f=p.length>0?`related=${p.slice(0,3).map(s=>s.path.split("/").pop()).join(",")}`:o||i?"related=none-strong":"indexes=cold",h=g.length>0?`traps=${g.length}`:"traps=0",d=n.length===0?"World model: no seed files":`World model impact: seeds=${n.length} \xB7 ${f} \xB7 ${h}`;return{seeds:n,neighbors:p,traps:g.slice(0,r),line:d,hasIndexes:{imports:o,cochange:i}}}c(X,"breakImpact");var J=8,Y=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;function Oe(e,t,r=J){let n=t.trim();if(!n)return re();let o=Z(e,n);return V(e,n,o,r)}c(Oe,"resolveWorkScopeSync");async function Ge(e,t,r,n=J){let o=r.trim();if(!o)return re();let i=new Set(Z(t,o));try{let{enrichedRecall:m}=await import("./enriched-recall-X6RDNNIE.mjs"),p=await m(e,t,{topic:o,types:["context","decision","gotcha","anti-pattern","learning"],limit:12});for(let g of ee(p,t))i.add(g)}catch{}return V(t,o,i,n)}c(Ge,"resolveWorkScope");function V(e,t,r,n){let o=K(e),i=new Map,m=D(e),p=O(e),g=c((l,y,b,k)=>{if(!v(e,l))return;let S=y*G(e,l),x=i.get(l);if(!x){i.set(l,{path:l,score:S,signals:[b],reason:k});return}x.score+=S,x.signals.includes(b)||x.signals.push(b),S>=.4&&(x.reason=k)},"bump");for(let l of r)g(l,fe(l,p),"memory","linked from project judgment memory (decision/gotcha/context)");let f=(()=>{if(!(o.bm25||o.symbols))return[];try{return U(e,t,{topN:Math.max(n*2,12)})}catch{return[]}})();for(let l of f){let y=l.signals.symbols??0,b=[l.signals.bm25>0?"bm25":null,y>0?"symbols":null,l.signals.imports>0?"imports":null,l.signals.cochange>0?"cochange":null].filter(x=>x!==null),k=Math.max(l.signals.bm25,y,l.signals.imports,l.signals.cochange),S=y>=k&&y>0?"matches function/class/route symbols in code graph":l.signals.bm25>=l.signals.imports&&l.signals.bm25>=l.signals.cochange?"matches task terms in code index (BM25)":l.signals.imports>=l.signals.cochange?"import-graph neighbor of matched files":"historically co-changes with matched files";g(l.path,l.finalScore,b[0]??"bm25",S);for(let x of b.slice(1)){let $=i.get(l.path);$&&!$.signals.includes(x)&&$.signals.push(x)}}let h=f.length,d=[...i.keys()].slice(0,5);d.length===0&&r.size>0&&d.push(...[...r].slice(0,5));let s=(()=>{if(d.length===0)return null;try{return X(e,d,n)}catch{return null}})();if(s)for(let l of s.neighbors)g(l.path,.35*Math.min(1,l.score+.1),l.via==="both"?"imports":l.via,l.via==="cochange"?"historically co-changes with seed files":"import-graph neighbor of seed files");let a=s?.neighbors.length??0,u=[...i.values()].sort((l,y)=>y.score-l.score).slice(0,n);return{files:u,indexesReady:o.bm25||o.imports||o.cochange||o.symbols,sources:{memorySeeds:r.size,indexHits:h,graphNeighbors:a},agentBlock:de(u,{indexesReady:o.bm25||o.imports||o.cochange||o.symbols,memorySeeds:r.size,inventoryLine:q(m)})}}c(V,"mergeScope");function Z(e,t){let r=new Set;try{let n=t.split(/\s+/).filter(m=>m.length>2).slice(0,12),o=n.length>0?(()=>{try{return I.searchFts(e,n,15)}catch{return[]}})():[],i=o.length>0?o:I.recall(e,{types:["gotcha","decision","anti-pattern","context"],limit:20});for(let m of ee(i,e))r.add(m)}catch{}return r}c(Z,"memoryFileSeedsSync");function ee(e,t){let r=new Set,n=c(o=>{let i=te(o);i&&(t?v(t,i)&&r.add(i):ne(i)&&r.add(i))},"accept");for(let o of e){let i=o.tags?.file?.trim();i&&n(i);let m=o.tags?.files?.trim();if(m)for(let g of m.split(",")){let f=g.trim();f&&n(f)}let p=o.content??"";Y.lastIndex=0;for(let g of p.matchAll(Y))n(g[1])}return[...r]}c(ee,"extractFilePathsFromEntries");function te(e){return e.replace(/^\.\//,"").replace(/\\/g,"/")}c(te,"normalizePath");function ne(e){let t=te(e).trim();return!t||t.length<3?!1:t.includes("/")&&t.includes(".")}c(ne,"looksLikeRepoPath");function fe(e,t){let r=(e.split("/").pop()??e).toLowerCase(),n=r.includes(".")?`.${r.split(".").pop()}`:"";return r==="package.json"||r==="cargo.toml"||r==="go.mod"?.4:t.size>0&&n&&t.has(n)?e.includes("/")?.9:.75:e.includes("/")&&r.includes(".")?.7:.5}c(fe,"memorySeedWeight");function re(){return{files:[],indexesReady:!1,sources:{memorySeeds:0,indexHits:0,graphNeighbors:0},agentBlock:""}}c(re,"emptyResult");function de(e,t){if(e.length===0)return t?.indexesReady===!1?["**Work scope (prjct):** indexes cold \u2014 run `prjct sync` once, then re-resolve scope.",t.inventoryLine?`_${t.inventoryLine}_`:"","Until then: prefer `prjct search` / `prjct context memory <topic>` over raw Grep/Glob walks."].filter(Boolean).join(`
11
+ `):null}catch{return null}}c(pe,"recentHistoryFingerprint");async function Se(e,t,r=100){let n=await pe(e,r),o=n?F(t):null;if(o?.historyFingerprint===n)return o;let i=await le(e,r);return n&&(i.historyFingerprint=n),ge(t,i),i}c(Se,"indexCoChanges");function E(e){if(e.length===0)return[];let t=e[0]?.score||1;return e.map(r=>({path:r.path,score:r.score/t}))}c(E,"normalize");var M=[{name:"bm25",kind:"query",defaultWeight:.45,hasIndex:c(e=>B(e),"hasIndex"),scoreFromQuery:c((e,t,r)=>E(H(e,t,r)),"scoreFromQuery")},{name:"symbols",kind:"query",defaultWeight:.2,hasIndex:c(e=>z(e),"hasIndex"),scoreFromQuery:c((e,t,r)=>E(T(e,t,r)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.2,hasIndex:c(e=>C(e)!==null,"hasIndex"),scoreFromSeeds:c((e,t,r)=>{let n=C(e);return n?E(W(t,n,r.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.15,hasIndex:c(e=>F(e)!==null,"hasIndex"),scoreFromSeeds:c((e,t)=>{let r=F(e);return r?E(_(t,r)):[]},"scoreFromSeeds")}];var ue={bm25Weight:.45,importWeight:.2,cochangeWeight:.15,symbolsWeight:.2,topN:15,importDepth:2},Q=10;function U(e,t,r={}){let n={...ue,...r},o={bm25:n.bm25Weight,symbols:n.symbolsWeight,imports:n.importWeight,cochange:n.cochangeWeight},i=M.filter(s=>s.kind==="query"),m=M.filter(s=>s.kind==="seed"),p=new Map,g=new Map;for(let s of i){let a=s.scoreFromQuery(e,t,n.topN*3);if(a.length!==0){p.set(s.name,new Map(a.map(u=>[u.path,u.score])));for(let u of a.slice(0,Q))g.set(u.path,Math.max(g.get(u.path)??0,u.score))}}if(p.size===0)return[];let f=[...g.entries()].sort((s,a)=>a[1]-s[1]).slice(0,Q).map(([s])=>s);for(let s of m){let a=s.scoreFromSeeds(e,f,{importDepth:n.importDepth});a.length!==0&&p.set(s.name,new Map(a.map(u=>[u.path,u.score])))}let h=new Set;for(let s of p.values())for(let a of s.keys())h.add(a);let d=[];for(let s of h){let a=[...p].reduce((u,[l,y])=>{let b=y.get(s)??0,k=o[l]??M.find(S=>S.name===l)?.defaultWeight??0;return u+b*k},0);d.push({path:s,finalScore:a,signals:{bm25:p.get("bm25")?.get(s)??0,imports:p.get("imports")?.get(s)??0,cochange:p.get("cochange")?.get(s)??0,symbols:p.get("symbols")?.get(s)??0}})}return d.sort((s,a)=>a.finalScore-s.finalScore),d.slice(0,n.topN)}c(U,"rankFiles");function K(e){let t={};for(let r of M)t[r.name]=r.hasIndex(e);return{bm25:t.bm25??!1,imports:t.imports??!1,cochange:t.cochange??!1,symbols:t.symbols??!1}}c(K,"hasIndexes");function X(e,t,r=8){let n=t.map(s=>s.trim()).filter(Boolean),o=!!C(e),i=!!F(e),m=new Map;if(n.length>0&&o)try{for(let s of W(n,C(e),2)){if(n.some(u=>u.endsWith(s.path)||s.path.endsWith(u)))continue;let a=m.get(s.path)??{score:0,via:new Set};a.score+=s.score,a.via.add("imports"),m.set(s.path,a)}}catch{}if(n.length>0&&i)try{for(let s of _(n,F(e))){if(n.some(u=>u.endsWith(s.path)||s.path.endsWith(u)))continue;let a=m.get(s.path)??{score:0,via:new Set};a.score+=s.score,a.via.add("cochange"),m.set(s.path,a)}}catch{}let p=[...m.entries()].map(([s,a])=>({path:s,score:a.score,via:a.via.size>1?"both":[...a.via][0]??"imports"})).sort((s,a)=>a.score-s.score).slice(0,r),g=[];for(let s of n.slice(0,5))try{let a=I.recallForFile(e,s,2,{preventiveOnly:!0});for(let u of a)g.push({id:u.id,type:u.type,title:u.content.replace(/\s+/g," ").trim().slice(0,100),file:s})}catch{}let f=p.length>0?`related=${p.slice(0,3).map(s=>s.path.split("/").pop()).join(",")}`:o||i?"related=none-strong":"indexes=cold",h=g.length>0?`traps=${g.length}`:"traps=0",d=n.length===0?"World model: no seed files":`World model impact: seeds=${n.length} \xB7 ${f} \xB7 ${h}`;return{seeds:n,neighbors:p,traps:g.slice(0,r),line:d,hasIndexes:{imports:o,cochange:i}}}c(X,"breakImpact");var J=8,Y=/(?:^|[\s`"'(])((?:@?[\w.-]+\/)+[\w.-]+\.[\w.-]+)(?:$|[\s`"'),;:])/g;function Oe(e,t,r=J){let n=t.trim();if(!n)return re();let o=Z(e,n);return V(e,n,o,r)}c(Oe,"resolveWorkScopeSync");async function Ge(e,t,r,n=J){let o=r.trim();if(!o)return re();let i=new Set(Z(t,o));try{let{enrichedRecall:m}=await import("./enriched-recall-6VOIUNLN.mjs"),p=await m(e,t,{topic:o,types:["context","decision","gotcha","anti-pattern","learning"],limit:12});for(let g of ee(p,t))i.add(g)}catch{}return V(t,o,i,n)}c(Ge,"resolveWorkScope");function V(e,t,r,n){let o=K(e),i=new Map,m=D(e),p=O(e),g=c((l,y,b,k)=>{if(!v(e,l))return;let S=y*G(e,l),x=i.get(l);if(!x){i.set(l,{path:l,score:S,signals:[b],reason:k});return}x.score+=S,x.signals.includes(b)||x.signals.push(b),S>=.4&&(x.reason=k)},"bump");for(let l of r)g(l,fe(l,p),"memory","linked from project judgment memory (decision/gotcha/context)");let f=(()=>{if(!(o.bm25||o.symbols))return[];try{return U(e,t,{topN:Math.max(n*2,12)})}catch{return[]}})();for(let l of f){let y=l.signals.symbols??0,b=[l.signals.bm25>0?"bm25":null,y>0?"symbols":null,l.signals.imports>0?"imports":null,l.signals.cochange>0?"cochange":null].filter(x=>x!==null),k=Math.max(l.signals.bm25,y,l.signals.imports,l.signals.cochange),S=y>=k&&y>0?"matches function/class/route symbols in code graph":l.signals.bm25>=l.signals.imports&&l.signals.bm25>=l.signals.cochange?"matches task terms in code index (BM25)":l.signals.imports>=l.signals.cochange?"import-graph neighbor of matched files":"historically co-changes with matched files";g(l.path,l.finalScore,b[0]??"bm25",S);for(let x of b.slice(1)){let $=i.get(l.path);$&&!$.signals.includes(x)&&$.signals.push(x)}}let h=f.length,d=[...i.keys()].slice(0,5);d.length===0&&r.size>0&&d.push(...[...r].slice(0,5));let s=(()=>{if(d.length===0)return null;try{return X(e,d,n)}catch{return null}})();if(s)for(let l of s.neighbors)g(l.path,.35*Math.min(1,l.score+.1),l.via==="both"?"imports":l.via,l.via==="cochange"?"historically co-changes with seed files":"import-graph neighbor of seed files");let a=s?.neighbors.length??0,u=[...i.values()].sort((l,y)=>y.score-l.score).slice(0,n);return{files:u,indexesReady:o.bm25||o.imports||o.cochange||o.symbols,sources:{memorySeeds:r.size,indexHits:h,graphNeighbors:a},agentBlock:de(u,{indexesReady:o.bm25||o.imports||o.cochange||o.symbols,memorySeeds:r.size,inventoryLine:q(m)})}}c(V,"mergeScope");function Z(e,t){let r=new Set;try{let n=t.split(/\s+/).filter(m=>m.length>2).slice(0,12),o=n.length>0?(()=>{try{return I.searchFts(e,n,15)}catch{return[]}})():[],i=o.length>0?o:I.recall(e,{types:["gotcha","decision","anti-pattern","context"],limit:20});for(let m of ee(i,e))r.add(m)}catch{}return r}c(Z,"memoryFileSeedsSync");function ee(e,t){let r=new Set,n=c(o=>{let i=te(o);i&&(t?v(t,i)&&r.add(i):ne(i)&&r.add(i))},"accept");for(let o of e){let i=o.tags?.file?.trim();i&&n(i);let m=o.tags?.files?.trim();if(m)for(let g of m.split(",")){let f=g.trim();f&&n(f)}let p=o.content??"";Y.lastIndex=0;for(let g of p.matchAll(Y))n(g[1])}return[...r]}c(ee,"extractFilePathsFromEntries");function te(e){return e.replace(/^\.\//,"").replace(/\\/g,"/")}c(te,"normalizePath");function ne(e){let t=te(e).trim();return!t||t.length<3?!1:t.includes("/")&&t.includes(".")}c(ne,"looksLikeRepoPath");function fe(e,t){let r=(e.split("/").pop()??e).toLowerCase(),n=r.includes(".")?`.${r.split(".").pop()}`:"";return r==="package.json"||r==="cargo.toml"||r==="go.mod"?.4:t.size>0&&n&&t.has(n)?e.includes("/")?.9:.75:e.includes("/")&&r.includes(".")?.7:.5}c(fe,"memorySeedWeight");function re(){return{files:[],indexesReady:!1,sources:{memorySeeds:0,indexHits:0,graphNeighbors:0},agentBlock:""}}c(re,"emptyResult");function de(e,t){if(e.length===0)return t?.indexesReady===!1?["**Work scope (prjct):** indexes cold \u2014 run `prjct sync` once, then re-resolve scope.",t.inventoryLine?`_${t.inventoryLine}_`:"","Until then: prefer `prjct search` / `prjct context memory <topic>` over raw Grep/Glob walks."].filter(Boolean).join(`
12
12
  `):["**Work scope (prjct):** no high-confidence file hits for this query.",t?.inventoryLine?`_${t.inventoryLine}_`:"","MUST still try `prjct context memory <topic>` + `prjct search` before a broad Grep/Glob walk."].filter(Boolean).join(`
13
13
  `);let r=["**Work scope \u2014 prjct (MUST read before Grep/Glob):**","> Do NOT walk the tree. Open these first. Expand only via `prjct guard <file>` (graph neighbors + traps) or MCP `prjct_relevant_files` / `prjct_impact_analysis`.",...e.map(n=>{let o=n.signals.length>0?` (${n.signals.join("+")})`:"";return`- \`${n.path}\` \u2014 ${n.reason}${o}`})];return t?.memorySeeds&&t.memorySeeds>0&&r.push(`_Seeded from ${t.memorySeeds} memory path hit(s) + code index + graph._`),t?.inventoryLine&&r.push(`_${t.inventoryLine}_`),r.join(`
14
14
  `)}c(de,"formatWorkScopeBlock");function qe(e){return e.map(({path:t,signals:r,reason:n})=>({path:t,signals:r,reason:n}))}c(qe,"toLikelyFileHits");function je(e,t){return t?v(t,e):ne(e)}c(je,"isUsefulScopePath");export{F as a,Se as b,Oe as c,Ge as d,ee as e,de as f,qe as g,je as h};
@@ -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 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};
8
+ import{a as p}from"./chunk-3FBCOCPD.mjs";import{c as d}from"./chunk-XDBJSJOT.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,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 z}from"./chunk-NJ74RHNC.mjs";import{a as V}from"./chunk-WUOVBBPC.mjs";import{a as X,j as L}from"./chunk-KDNUQPAK.mjs";import{a as q}from"./chunk-33BHU4OM.mjs";import{e as J}from"./chunk-ZYCNW75E.mjs";import{c as P}from"./chunk-TF6PN7IB.mjs";import{d as H,e as I}from"./chunk-XYKVWO23.mjs";import{b as k}from"./chunk-PVCEWFHS.mjs";import{i as b}from"./chunk-JGZ3QGWX.mjs";import{c as W}from"./chunk-QXCEBAIA.mjs";import{b as E}from"./chunk-ZZBNFNMG.mjs";import{d as p,g as K}from"./chunk-TKXOMN4K.mjs";import{b as A,g as M,h as mt,i as G,k as pt,v as Y,w as ht}from"./chunk-A6K4H3YT.mjs";import{d as ft}from"./chunk-JQE2F2RK.mjs";import{e as x,p as ut}from"./chunk-QWQFF2UG.mjs";import{b as T,e as gt}from"./chunk-IJ523YO2.mjs";import{e as B,f as dt}from"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";import $ from"node:fs/promises";import at from"node:path";ht();import N from"node:fs";import yt from"node:path";var Z=l(()=>Y.getStatePath(),"stampDir"),Q=l(()=>yt.join(Z(),"installed-version"),"stampPath");function St(){try{return N.readFileSync(Q(),"utf-8").trim()}catch{return null}}l(St,"readStamp");function wt(i){try{N.mkdirSync(Z(),{recursive:!0}),N.writeFileSync(Q(),i,"utf-8")}catch{}}l(wt,"writeStamp");function tt(i){return i?St()===i:!0}l(tt,"isSyncCurrent");async function nt(i){if(i&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:n}=await import("./command-installer-MUHZWDZA.mjs");await n()}catch{}try{await(await import("./settings-installer-CQKMGMRG.mjs")).install()}catch{}try{let{SetupCommands:n}=await import("./setup-PPIZHVXS.mjs");await new n().installStatusLine()}catch{}wt(i)}}l(nt,"runSelfHeal");K();dt();ut();ft();K();pt();mt();var Ct=50,F=class{static{l(this,"SessionTracker")}currentRow(n){try{return p.get(n,"SELECT * FROM cli_sessions WHERE status = 'active' ORDER BY last_activity DESC LIMIT 1")??null}catch{return null}}isExpired(n){return G(n,18e5)}toSessionData(n,t){return{id:t.id,projectId:n,status:t.status,createdAt:t.created_at,lastActivity:t.last_activity,commands:[],files:[]}}async touch(n){let t=A(),e=this.currentRow(n);if(e&&!this.isExpired(e.last_activity))return p.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",t,e.id),this.toSessionData(n,{...e,last_activity:t});e&&p.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",e.id);let s=crypto.randomUUID();return p.run(n,"INSERT INTO cli_sessions (id, status, created_at, last_activity) VALUES (?, 'active', ?, ?)",s,t,t),this.toSessionData(n,{id:s,status:"active",created_at:t,last_activity:t})}async trackCommand(n,t,e){let s=this.currentRow(n);if(!s)return;let o=A();try{p.run(n,"INSERT INTO cli_session_commands (session_id, command, timestamp, duration_ms) VALUES (?, ?, ?, ?)",s.id,t,o,Math.round(e)),p.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",o,s.id)}catch{}}async getInfo(n){let t=this.currentRow(n);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 e=Date.now(),s=new Date(t.created_at).getTime(),o=new Date(t.last_activity).getTime(),c=e-o,a=Math.max(0,18e5-c),r=p.query(n,"SELECT command FROM cli_session_commands WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?",t.id,Ct);return{active:!0,id:t.id,duration:M(e-s),idleSince:t.last_activity,idleMs:c,expiresIn:M(a),commandCount:r.length,commands:r.map(u=>u.command).reverse(),filesRead:0,filesWritten:0}}async expire(n){try{p.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE status = 'active'")}catch{}}async expireIfStale(n){let t=this.currentRow(n);return t&&this.isExpired(t.last_activity)?(p.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",t.id),!0):!1}},st=new F;var vt={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},O=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(n,t={}){this.projectPath=n,this.config={...vt,...t}}async check(n){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let e=(()=>{try{return p.getDoc(n,"project")}catch{return null}})();if(!e)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;t.lastSyncCommit=e.lastSyncCommit||null;let s=e.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,u]=await Promise.all([x(["rev-parse","--short","HEAD"],c),x(["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(!u.ok)return u.kind==="exit"?(t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`."):t.reason=`git ${u.kind} reading history \u2014 staleness unknown. Retry shortly.`,t;if(t.commitsSinceSync=parseInt(u.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 x(["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(f=>d.endsWith(f)||d.includes(f)))}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(e){return t.reason=`Error checking staleness: ${B(e)}`,t}}formatStatus(n){let t=[];n.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let e=[];if(n.lastSyncCommit&&e.push(`Last sync: ${n.lastSyncCommit}`),n.currentCommit&&e.push(`Current: ${n.currentCommit}`),n.commitsSinceSync>0&&e.push(`Commits since: ${n.commitsSinceSync}`),n.daysSinceSync>0&&e.push(`Days since: ${n.daysSinceSync}`),n.changedFiles.length>0&&e.push(`Files changed: ${n.changedFiles.length}`),e.length>0&&t.push(...it(e)),n.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of n.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);n.significantChanges.length>5&&t.push(` ... and ${n.significantChanges.length-5} more`)}return n.reason&&(t.push(""),t.push(n.reason)),n.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
10
+ `)}async getSessionInfo(n){return st.getInfo(n)}formatSessionInfo(n){let t=[];if(!n.active)return t.push("Session: \u25CB No active session"),t.join(`
11
+ `);t.push(`Session: \u25B6 Active (${n.duration})`);let e=[];if(n.commandCount>0){let s=new Set,o=[];for(let c of n.commands)s.has(c)||(s.add(c),o.push(c));e.push(`Commands: ${o.join(" \u2192 ")} (${n.commandCount} total)`)}return(n.filesRead>0||n.filesWritten>0)&&e.push(`Files: ${n.filesRead} read, ${n.filesWritten} written`),e.push(`Idle: ${n.expiresIn} until timeout`),e.length>0&&t.push(...it(e)),t.join(`
12
+ `)}getWarning(n){return n.isStale?n.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${n.commitsSinceSync} commits behind). Run \`prjct sync\``:n.daysSinceSync>0?`\u26A0\uFE0F Context stale (${n.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}};function it(i){let n=Math.max(...i.map(e=>e.length)),t="\u2500".repeat(n+2);return[`\u250C${t}\u2510`,...i.map(e=>`\u2502 ${e.padEnd(n)} \u2502`),`\u2514${t}\u2518`]}l(it,"boxLines");var rt=l((i,n)=>new O(i,n),"createStalenessChecker");gt();var Et=1600,j=3,kt=4,U={minTeaser:24,maxTeaser:90};async function _t(i,n,t={}){let e=n??await E.readConfig(i);if(!e?.projectId)return null;let s=e.persona,o=t.digest?await(async()=>{try{let{memoryL0IndexForSession:h}=await import("./memory-index-XE2MWKQS.mjs");return h(e.projectId,{rebuildIfStale:!0})||ot(e.projectId)}catch{return ot(e.projectId)}})():null,c=xt(i,e.projectId),a=import("./vault-retire-notice-7XHVNHU6.mjs").then(({vaultRetirementNotice:h})=>h(e,e.projectId)),r=(async()=>{try{let{buildLandCue:h}=await import("./land-cue-57B23PEL.mjs");return await h(e.projectId,i,e)}catch{return null}})(),u=(async()=>{try{let{effectiveWeakModelMode:h,weakModelBanner:w}=await import("./weak-model-mode-BMSPGEQY.mjs");return h(e)==="on"?w():null}catch{return null}})(),C=t.digest?(async()=>{try{let{formatPendingHandoffCue:h}=await import("./agent-switch-I4MTVE56.mjs"),w=h(e.projectId);return w?`# prjct: pending handoff
13
+ ${w}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:w}=await import("./session-continuity-BIJXMN44.mjs");return w(h(e.projectId))}catch{return null}})():Promise.resolve(null),g=Pt(i,e.projectId),[d,f,S,v,_,D,R]=await Promise.all([c,a,r,u,C,y,g]);if(!R&&!s&&!o&&!d&&!f&&!S&&!v&&!_&&!D)return null;let m=["# prjct: project context",""];return R&&m.push(R,""),s&&m.push(It(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&m.push(""),m.push(o)),d&&((s||o)&&m.push(""),m.push(d)),f&&((s||o||d)&&m.push(""),m.push(f)),S&&((s||o||d||f)&&m.push(""),m.push(S)),v&&((s||o||d||f||S)&&m.push(""),m.push(v)),_&&((s||o||d||f||S||v)&&m.push(""),m.push(_)),D&&((s||o||d||f||S||v||_)&&m.push(""),m.push(D)),m.join(`
14
+ `)}l(_t,"buildSessionContext");async function xt(i,n){try{let t=rt(i),e=await t.check(n);if(!e.isStale||e.commitsSinceSync<=0)return null;let s=t.getWarning(e);if(!s)return null;try{let c=await import("node:path"),a=await import("node:os"),{maybeDetachDriftRefresh:r,readDriftStamp:u,formatDriftNotice:C,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=u(g);if(y(d))return C({warning:s,commitsSinceSync:e.commitsSinceSync,stamp:d,refreshScheduled:!1});let f=r({projectPath:i,cliHome:g,commitsSinceSync:e.commitsSinceSync}),S=u(g);return C({warning:s,commitsSinceSync:e.commitsSinceSync,stamp:S,refreshScheduled:f})}catch{}let o=await(async()=>{try{let{hasSymbolIndex:c,loadMeta:a}=await import("./symbol-graph-MH42JSPX.mjs");if(!c(n))return" Code graph empty \u2014 `prjct code reindex` (or `prjct sync`) before trace/impact.";if(e.commitsSinceSync<5)return"";let r=a(n);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(xt,"buildStalenessNotice");function ot(i){let n=(()=>{try{let r=P.rerank(i,k.recall(i,{types:["gotcha","anti-pattern"],limit:j*4})).slice(0,j),u=P.rerank(i,k.recall(i,{types:["decision"],limit:j*4})).slice(0,j);return{gotchas:r,decisions:u}}catch{return null}})();if(!n)return null;let{gotchas:t,decisions:e}=n,s=(()=>{try{let r=k.recall(i,{types:["feedback","improvement-signal"],limit:40,dedupeByKey:!1});return X(r,kt)}catch{return[]}})(),o=L(i,new Set([...t,...e].map(r=>r.id))),c=(()=>{try{let r=q(i);return r?J(r,{maxConventions:4,maxPatterns:3,maxAnti:2}):null}catch{return null}})();if(t.length===0&&e.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 u=r.rule.length>140?`${r.rule.slice(0,139)}\u2026`:r.rule;a.push(`- ${u} \`${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,U)}`)}if(e.length>0){a.push("","**Decisions in force:**");for(let r of e)a.push(`- ${I(r,U)}`)}return o&&a.push("","**Keeps being missed:**",`- ${I(o.entry,U)} \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."),b(a.join(`
15
+ `),Et)}l(ot,"buildKnowledgeDigest");var Tt=500,ct=2;async function un(i){let n=await E.readConfig(i).catch(()=>null);if(!n?.projectId)return null;let t=["# prjct: subagent context"];n.persona?.role&&t.push(`Role in this project: ${n.persona.role}`);try{let{resolveActiveTask:e}=await import("./task-service-FZABHPFV.mjs"),s=await e(n.projectId,i);s&&t.push(`Active work cycle (this worktree): ${s.description}`)}catch{}try{let e=P.rerank(n.projectId,k.recall(n.projectId,{types:["gotcha","anti-pattern"],limit:ct*4})).slice(0,ct);if(e.length>0){t.push("Traps to avoid:");for(let o of e)t.push(`- ${H(o)} \`${o.id}\``)}let s=L(n.projectId,new Set(e.map(o=>o.id)));s&&t.push(`Keeps being missed: ${H(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:b(t.join(`
16
+ `),Tt)}l(un,"buildSubagentDigest");function It(i){let n=[];return n.push(`## Your role in this project: **${i.role}**`),i.focus&&n.push(`Focus: ${i.focus}`),i.mcps&&i.mcps.length>0&&n.push(`Available MCPs this project expects: ${i.mcps.join(", ")}`),i.packs&&i.packs.length>0&&n.push(`Active packs: ${i.packs.join(", ")}`),n.join(`
17
+ `)}l(It,"formatPersona");async function Pt(i,n){try{let t=await import("node:path"),{execFileAsync:e}=await import("./exec-2P5VOBHM.mjs"),s=t.basename(i),o=await(async()=>{try{let{stdout:r}=await e("git",["branch","--show-current"],{cwd:i});return r.trim()}catch{return""}})(),c=n.length>12?`${n.slice(0,8)}\u2026`:n,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(Pt,"buildProjectIdentityLine");function lt(i,n,t="kimi"){let e=i.replace(/[^a-zA-Z0-9._-]/g,"_"),s=(n??`nosession-${t}`).replace(/[^a-zA-Z0-9._-]/g,"_");return at.join(W.runDir(),`kimi-session-${e}-${s}.pending`)}l(lt,"kimiSessionStampPath");async function mn(i,n,t="kimi"){let e=lt(i,n,t),s=await $.readFile(e,"utf-8").catch(()=>null);return s===null?null:(await $.rm(e,{force:!0}).catch(()=>{}),s.trim()==="digest"?"digest":"persona")}l(mn,"consumeKimiSessionInjection");function dn(i=process.cwd(),n){let t=E.readConfig(i).catch(()=>null);return V({event:"SessionStart",projectPath:i,build:l(async(e,s,o)=>{let c=s===i?await t:await E.readConfig(s).catch(()=>null),a=e.source??"startup",r=a==="startup"||a==="clear"||a==="compact";if(o==="kimi"){if(c?.projectId){let u=lt(c.projectId,e.session_id,o);await $.mkdir(at.dirname(u),{recursive:!0}).then(()=>$.writeFile(u,r?"digest":"persona")).catch(()=>{})}return null}return _t(s,c,{digest:r})},"build"),afterEmit:l(async(e,s)=>{let o=await t;if(o?.projectId){let c=await(async()=>{try{let{collectActiveTasks:a}=await import("./task-overview-F3GB77OA.mjs"),r=await a(o.projectId,s);return{taskId:r.current?.id??null,goal:r.current?.description??e.source??null}}catch{return{taskId:null,goal:e.source??null}}})();z({projectId:o.projectId,sessionId:e.session_id,directory:s,taskId:c.taskId,goal:c.goal})}tt(T)||await nt(T).catch(()=>{});try{let{maybeAutoUpdate:c}=await import("./auto-updater-4TIXYSEX.mjs");c(T)}catch{}},"afterEmit")},n)}l(dn,"runSessionStartHook");export{_t as a,un as b,Pt as c,mn as d,dn as e};
@@ -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{a as f}from"./chunk-OENWCYLF.mjs";import{b as m}from"./chunk-UA4Z5TGG.mjs";import{d as r,g}from"./chunk-KG7Z6OMK.mjs";import{a as i}from"./chunk-E66B27AL.mjs";g();var _=["hook","gate","step","instruction"];function d(o){let t=o.trust_source==="imported"?"imported":"local",e=_.includes(o.type)?o.type:"step";return{id:o.id,type:e,command:o.command,position:o.position,action:o.action,description:o.description,enabled:o.enabled===1,timeoutMs:o.timeout_ms,createdAt:o.created_at,sortOrder:o.sort_order,whenExpr:o.when_expr??null,parallel:o.parallel===null?!0:o.parallel===1,trustSource:t}}i(d,"rowToRule");var p=class{static{i(this,"WorkflowRuleStorage")}addRule(t,e){let n=r.get(t,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",e.command),u=e.sortOrder||(n?.m??-1)+1;r.run(t,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
8
+ import{a as f}from"./chunk-ZJW27EUC.mjs";import{b as m}from"./chunk-7WO5CEH3.mjs";import{d as r,g}from"./chunk-TKXOMN4K.mjs";import{a as i}from"./chunk-E66B27AL.mjs";g();var _=["hook","gate","step","instruction"];function d(o){let t=o.trust_source==="imported"?"imported":"local",e=_.includes(o.type)?o.type:"step";return{id:o.id,type:e,command:o.command,position:o.position,action:o.action,description:o.description,enabled:o.enabled===1,timeoutMs:o.timeout_ms,createdAt:o.created_at,sortOrder:o.sort_order,whenExpr:o.when_expr??null,parallel:o.parallel===null?!0:o.parallel===1,trustSource:t}}i(d,"rowToRule");var p=class{static{i(this,"WorkflowRuleStorage")}addRule(t,e){let n=r.get(t,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",e.command),u=e.sortOrder||(n?.m??-1)+1;r.run(t,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
9
9
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.type,e.command,e.position,e.action,e.description??null,e.enabled?1:0,e.timeoutMs,e.createdAt,u,e.whenExpr??null,e.parallel===!1?0:1,e.trustSource??"local");let l=r.get(t,"SELECT last_insert_rowid() as id")?.id??0;return l>0&&m({projectId:t,entityType:"workflow_rules",entityId:String(l),eventType:"upsert",data:{id:l,type:e.type,command:e.command,position:e.position,action:e.action,description:e.description??null,enabled:e.enabled?1:0,timeout_ms:e.timeoutMs,sort_order:u,when_expr:e.whenExpr??null,parallel:e.parallel===!1?0:1,trust_source:e.trustSource??"local",created_at:e.createdAt}}),l}removeRule(t,e){return r.get(t,"SELECT id FROM workflow_rules WHERE id = ?",e)?(r.run(t,"DELETE FROM workflow_rules WHERE id = ?",e),m({projectId:t,entityType:"workflow_rules",entityId:String(e),eventType:"delete",data:{id:e}}),!0):!1}updateRule(t,e,n){if(!r.get(t,"SELECT id FROM workflow_rules WHERE id = ?",e))return!1;let w={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:i(s=>s?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:i(s=>s===!1?0:1,"transform")},trustSource:{column:"trust_source"}},l=[],c=[];for(let[s,E]of Object.entries(n)){let a=w[s];if(!a)continue;l.push(`${a.column} = ?`);let R=E;c.push(a.transform?a.transform(R):R)}return l.length===0||(c.push(e),r.run(t,`UPDATE workflow_rules SET ${l.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(t,e){let n=r.get(t,"SELECT * FROM workflow_rules WHERE id = ?",e);return n?d(n):null}getRulesForCommand(t,e){let n=f.getWorkflow(t,e);return!n||!n.enabled?[]:r.query(t,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",e).map(d)}getAllRules(t){return r.query(t,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(d)}resetRules(t){let e=r.get(t,"SELECT COUNT(*) as c FROM workflow_rules");return r.run(t,"DELETE FROM workflow_rules"),e?.c??0}},S=new p;export{S as a};
@@ -0,0 +1,51 @@
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 v}from"./chunk-LR24AIEW.mjs";import{a as A,b as N,h as B}from"./chunk-UUULLTQV.mjs";import{a as T}from"./chunk-GAOQHD5S.mjs";import{a as D,b as k,e as u,g as x}from"./chunk-TKXOMN4K.mjs";import{c as S,d as C,e as w,f as O,g as M}from"./chunk-GCKILEXJ.mjs";import{a as _}from"./chunk-E66B27AL.mjs";x();k();B();function U(r){let e=u.get(r,`SELECT
9
+ (SELECT COUNT(*) FROM memory_entries) AS memCount,
10
+ (SELECT MAX(rowid) FROM memory_entries) AS memMaxRowid,
11
+ (SELECT COUNT(deleted_at) FROM memory_entries) AS memDeleted,
12
+ (SELECT MAX(deleted_at) FROM memory_entries) AS memMaxDeleted,
13
+ (SELECT COUNT(*) FROM memory_entry_tags) AS tagCount,
14
+ (SELECT MAX(rowid) FROM memory_entry_tags) AS tagMaxRowid,
15
+ (SELECT COUNT(*) FROM shipped_features) AS shipCount,
16
+ (SELECT MAX(rowid) FROM shipped_features) AS shipMaxRowid`);return e?[e.memCount,e.memMaxRowid??0,e.memDeleted,e.memMaxDeleted??0,e.tagCount,e.tagMaxRowid??0,e.shipCount,e.shipMaxRowid??0].join(":"):"empty"}_(U,"memoryVaultStamp");var L=new Map,H=25,$=4,q=100,I=["supersedes","duplicates","superseded-by"];function b(r,e,t){let n=r.get(e);if(n!==void 0)return n;let i=t();return r.set(e,i),i}_(b,"getOrCreateMapValue");function V(r){try{let e=I.map(()=>"?").join(","),t=u.query(r,`SELECT t.entry_id, t.key, t.value
17
+ FROM memory_entry_tags t
18
+ JOIN memory_entries m ON m.id = t.entry_id
19
+ WHERE m.deleted_at IS NULL
20
+ AND t.is_machine = 0
21
+ AND t.key IN (${e})`,...I),n=new Map;for(let s of t){let c=b(n,s.entry_id,()=>({}));c[s.key]=s.value}let i=[...n.entries()].map(([s,c])=>({id:s,tags:c}));return M(i)}catch{return new Set}}_(V,"collectMirrorSupersededIds");function F(r,e){let t=new Map;if(e.length===0)return t;let n=e.map(()=>"?").join(","),i=u.query(r,`SELECT entry_id, key, value FROM memory_entry_tags WHERE entry_id IN (${n})`,...e);for(let s of i){let c=b(t,s.entry_id,()=>({}));c[s.key]=s.value}return t}_(F,"batchTagsByEntryId");function R(r,e,...t){let n=u.query(r,`SELECT id, type, content, provenance, created_at
22
+ FROM memory_entries
23
+ WHERE deleted_at IS NULL ${e}`,...t);if(n.length===0)return[];let i=F(r,n.map(s=>s.id));return n.map(s=>({id:s.id,type:s.type,content:s.content,tags:i.get(s.id)??{},rememberedAt:new Date(s.created_at).toISOString(),provenance:s.provenance??"declared"}))}_(R,"loadV2Entries");function Y(r,e,t){if(t&&t.length>0){let n=t.map(()=>"?").join(",");return R(r,`AND type IN (${n}) ORDER BY created_at DESC, rowid DESC LIMIT ?`,...t,e)}return R(r,"ORDER BY created_at DESC, rowid DESC LIMIT ?",e)}_(Y,"recallEntriesFromV2");var P={applyTopicSupersession(r,e,t,n){try{let i=u.get(r,`SELECT COUNT(*) AS c FROM memory_entries
24
+ WHERE project_id = ? AND type = ? AND content_hash != ?
25
+ AND (topic_key = ? OR id IN (
26
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
27
+ ))`,r,e,t,n,n)?.c??0;u.run(r,`UPDATE memory_entries SET topic_key = ?, revision_count = ?
28
+ WHERE project_id = ? AND type = ? AND content_hash = ? AND deleted_at IS NULL`,n,i,r,e,t),u.run(r,`UPDATE memory_entries SET deleted_at = ?
29
+ WHERE project_id = ? AND type = ? AND deleted_at IS NULL AND content_hash != ?
30
+ AND (topic_key = ? OR id IN (
31
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
32
+ ))`,Date.now(),r,e,t,n,n)}catch{}},async remember(r,e){let t={...e.tags??{}},n=e.provenance??"declared",i=D(e.content);{let a=await import("./trust-boundary-EX65SUYR.mjs").then(l=>l.evaluateMemoryContent).catch(()=>null);if(a){let l=a(e.content,{force:e.force});if(!l.allow){if(e.requireWrite)throw new Error(l.denyMessage);return}}}let{classifyCapturePrecision:s}=await import("./precision-classifier-IVVAXE26.mjs"),c=s(e.content,e.type,{force:e.force===!0});if(c.action==="refuse"){if(e.requireWrite)throw new Error(`precision refuse (${c.reasonCode}): ${c.reason}`);return}c.action==="demote"&&c.demoteTo&&(t.shape_demoted="true",t.original_type=e.type,t.precision_reason=c.reasonCode),e.force&&(t["precision:force"]="true");let d=c.action==="demote"&&c.demoteTo?c.demoteTo:e.type,m=e.projectId??await(async()=>{try{let{default:a}=await import("./config-manager-2JJPCLKC.mjs");return(await a.readConfig(r))?.projectId}catch{return}})();if(!t.file)try{let{inferMemoryFileTag:a}=await import("./infer-memory-file-PIAZ542H.mjs"),l=m?await(async()=>{try{let{stateStorage:E}=await import("./state-storage-AJUPG7J5.mjs"),p=(await E.getCurrentTask(m))?.likelyFiles;return Array.isArray(p)?p.map(f=>typeof f=="string"?f:f?.path).filter(f=>typeof f=="string"&&f.length>0):null}catch{return null}})():null,h=a({content:e.content,tags:t,projectPath:r,cycleFiles:l});h&&(t.file=h,t.file_source="inferred")}catch{}let y=t.topic??t.key;if(m){try{if(u.get(m,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",i,d)){y&&this.applyTopicSupersession(m,d,i,y);return}}catch{}try{let{captureGate:a}=await import("./capture-gate-MEIQD7ZS.mjs"),l=a(m,d,e.content,t);if(!l.accept){if(e.requireWrite)throw new Error(`capture refused: ${l.reason}`);return}}catch(a){if(e.requireWrite&&a instanceof Error&&a.message.startsWith("capture refused"))throw a}}let o=await v.log(r,`${A}${d}`,{content:e.content,tags:t,source:e.source,provenance:n,content_hash:i,...m?{project_id:m}:{}},void 0,m||e.requireWrite?{...m?{projectId:m}:{},required:e.requireWrite}:void 0),g=m??o?.projectId;if(g&&y&&o?.eventId!=null&&this.applyTopicSupersession(g,d,i,y),o?.projectId)try{let{usefulnessService:a}=await import("./usefulness-TBD5EYAL.mjs");a.recordReferences(o.projectId,e.content,t),a.recordCorrection(o.projectId,t)}catch{}if(g)try{let{publishCRUD:a}=await import("./publish-helper-ZSL27HSX.mjs"),l=t.spec_id??t.task_id??t.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await a({projectId:g,entityType:"memories",entityId:l,eventType:"upsert",data:{id:l,type:d,content:e.content,tags:t,source:e.source??null,provenance:n,created_at:new Date().toISOString(),rememberedAt:new Date().toISOString()}})}catch{}},searchFts(r,e,t){if(e.length===0||t<=0)return[];let n=e.map(o=>T(o).replace(/[^a-z0-9-]/gi,"")).filter(o=>o.length>=2);if(n.length===0)return[];let i=n.map(o=>`"${o}"*`).join(" OR "),s=(()=>{try{return u.query(r,`SELECT m.id, m.content, m.type, m.provenance, m.created_at
33
+ FROM memory_entries_fts ft
34
+ JOIN memory_entries m ON m.rowid = ft.rowid
35
+ WHERE memory_entries_fts MATCH ?
36
+ AND m.deleted_at IS NULL
37
+ ORDER BY bm25(memory_entries_fts) ASC, m.created_at DESC
38
+ LIMIT ?`,i,t*2)}catch{return[]}})();if(s.length===0)return[];let c=F(r,s.map(o=>o.id)),d=s.map(o=>({id:o.id,type:o.type??"fact",content:o.content,tags:c.get(o.id)??{},rememberedAt:new Date(o.created_at).toISOString(),provenance:o.provenance??"declared"})),m=V(r);return(m.size>0?d.filter(o=>!m.has(o.id)):d).slice(0,t)},recall(r,e={}){let t=e.limit??H,n=Math.max(t*$,q),i=e.types&&e.types.length>0?new Set(e.types):null,s=i?i.has("shipped"):!0,c=i?[...i].some(p=>p!=="shipped"):!0,d=i?[...i].filter(p=>p!=="shipped"):void 0,m=c?Y(r,n,d):[],y=s?u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n):[],o=[...m,...y.map(S)],g=i?o.filter(p=>i.has(p.type)):o,a=e.tags?g.filter(p=>w(p,e.tags??{})):g,h=[...e.topic?a.filter(p=>C(p,e.topic)):a].sort((p,f)=>f.rememberedAt.localeCompare(p.rememberedAt)),E=e.dedupeByKey!==!1?O(h):h;return(()=>{if(e.pruneSuperseded===!1)return E;let p=M(E);return p.size>0?E.filter(f=>!p.has(f.id)):E})().slice(0,t)},recallForFile(r,e,t=3,n={}){if(!e)return[];let i=e.split("/").pop()??e,s=_(a=>a.type==="gotcha"||a.type==="red-herring"||a.type==="anti-pattern"||a.tags?.pattern==="recurring-bug","isPreventive"),c=Math.max(t*5,15),d=(()=>{try{return R(r,`AND file IS NOT NULL
39
+ AND (file = ? OR ? LIKE '%/' || file OR file = ? OR file LIKE '%/' || ?)
40
+ ORDER BY created_at DESC, rowid DESC
41
+ LIMIT ?`,e,e,i,i,c).filter(s)}catch{return[]}})(),m=n.preventiveOnly?[]:(()=>{try{return R(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT 200","context").filter(l=>(l.tags?.files??"").split(",").map(E=>E.trim()).some(E=>E===e||E===i||E.endsWith(`/${i}`)))}catch{return[]}})(),y=[...d,...m],o=M(y);return(o.size>0?y.filter(a=>!o.has(a.id)):y).slice(0,t)},getById(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;try{return R(r,"AND id = ?",`mem_${t[1]}`)[0]??null}catch{return null}},countByType(r,e){try{return u.get(r,"SELECT COUNT(*) AS n FROM memory_entries WHERE project_id IN (?, 'local') AND type = ? AND deleted_at IS NULL",r,e)?.n??0}catch{return 0}},recallByType(r,e,t){if(t<=0)return[];try{return R(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT ?",e,t)}catch{return[]}},forget(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return!1;let n=Number(t[1]),i=`mem_${n}`,s=(()=>{try{return u.get(r,"SELECT id FROM events WHERE id = ? AND type LIKE ?",n,`${N}%`)?(u.run(r,"DELETE FROM events WHERE id = ?",n),!0):!1}catch{return!1}})();try{u.run(r,"DELETE FROM memory_embeddings WHERE memory_id = ?",i)}catch{}let c=(()=>{try{return u.run(r,"UPDATE memory_entries SET deleted_at = ? WHERE id = ? AND deleted_at IS NULL",Date.now(),i).changes>0}catch{return!1}})();return s||c},expandWithLinks(r,e,t=5){if(e.length===0||t<=0)return[];let n=/\bmem[_-](\d+)\b/g,i=["resolves","relates","supersedes","superseded-by","duplicates","spec"],s=new Set(e.map(d=>d.id)),c=[];for(let d of e){if(c.length>=t)break;let m=new Set;for(let y of i){let o=d.tags?.[y];if(o)for(let g of String(o).matchAll(n))m.add(`mem_${g[1]}`)}for(let y of d.content.matchAll(n))m.add(`mem_${y[1]}`);for(let y of m){if(c.length>=t)break;if(s.has(y))continue;s.add(y);let o=P.getById(r,y);o&&c.push(o)}}return c},unembeddedEntriesForIndex(r,e){try{let t=R(r,`AND type != ?
42
+ AND NOT EXISTS (
43
+ SELECT 1 FROM memory_embeddings me
44
+ WHERE me.memory_id = memory_entries.id AND me.model = ?
45
+ )
46
+ ORDER BY created_at DESC, rowid DESC`,"improvement-signal",e),n=u.query(r,`SELECT s.id, s.name, s.type, s.shipped_at, s.data FROM shipped_features s
47
+ WHERE NOT EXISTS (
48
+ SELECT 1 FROM memory_embeddings me
49
+ WHERE me.memory_id = 'ship_' || s.id AND me.model = ?
50
+ )
51
+ ORDER BY s.shipped_at DESC`,e);return[...t,...n.map(S)]}catch{return[]}},allEntriesForIndex(r){try{let e=U(r),t=L.get(r);if(t&&t.stamp===e)return[...t.entries];let n=R(r,"ORDER BY created_at DESC, rowid DESC"),i=u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC"),s=[...n,...i.map(S)];return L.set(r,{stamp:e,entries:s}),[...s]}catch{return[]}}};export{U as a,P as b};
@@ -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 q}from"./chunk-UA4Z5TGG.mjs";import{e as p,g as P}from"./chunk-KG7Z6OMK.mjs";import{d as H,e as g,f as B,h as Q}from"./chunk-JAMSIKDE.mjs";import{a as c}from"./chunk-E66B27AL.mjs";P();P();function l(t,s,...e){try{return Number(p.get(t,s,...e)?.value??0)}catch{return 0}}c(l,"count");function E(t,s,...e){try{return p.query(t,s,...e)}catch{return[]}}c(E,"query");Q();var j="memory.task_tokens",_=1e7;function pt(t,s,e,r,n){if(!s||e+r<=0)return;let i=5e7;if(e>i||r>i)return;let a=e>_||r>_,u=Math.min(Math.round(e),_),d=Math.min(Math.round(r),_);a&&(n={...n,isEstimated:!0});try{p.appendEvent(t,j,{taskId:s,tokensIn:u,tokensOut:d,...n?.description?{description:n.description}:{},...n?.agent?{agent:n.agent}:{},...n?.model?{model:n.model}:{},...n?.runtime?{runtime:n.runtime}:{},...n?.isEstimated!==void 0?{isEstimated:n.isEstimated}:{},...n?.source?{source:n.source}:{}},s)}catch{}if(u>=0&&u<=_&&d>=0&&d<=_)try{p.run(t,"UPDATE tasks SET tokens_in = ?, tokens_out = ? WHERE id = ?",u,d,s)}catch{}try{let C=n?.source??"cli",S=`${s}:${C}`,h=Date.now();p.run(t,`INSERT INTO token_usage
8
+ import{a as q}from"./chunk-7WO5CEH3.mjs";import{e as p,g as P}from"./chunk-TKXOMN4K.mjs";import{d as H,e as g,f as B,h as Q}from"./chunk-A6K4H3YT.mjs";import{a as c}from"./chunk-E66B27AL.mjs";P();P();function l(t,s,...e){try{return Number(p.get(t,s,...e)?.value??0)}catch{return 0}}c(l,"count");function E(t,s,...e){try{return p.query(t,s,...e)}catch{return[]}}c(E,"query");Q();var j="memory.task_tokens",_=1e7;function pt(t,s,e,r,n){if(!s||e+r<=0)return;let i=5e7;if(e>i||r>i)return;let a=e>_||r>_,u=Math.min(Math.round(e),_),d=Math.min(Math.round(r),_);a&&(n={...n,isEstimated:!0});try{p.appendEvent(t,j,{taskId:s,tokensIn:u,tokensOut:d,...n?.description?{description:n.description}:{},...n?.agent?{agent:n.agent}:{},...n?.model?{model:n.model}:{},...n?.runtime?{runtime:n.runtime}:{},...n?.isEstimated!==void 0?{isEstimated:n.isEstimated}:{},...n?.source?{source:n.source}:{}},s)}catch{}if(u>=0&&u<=_&&d>=0&&d<=_)try{p.run(t,"UPDATE tasks SET tokens_in = ?, tokens_out = ? WHERE id = ?",u,d,s)}catch{}try{let C=n?.source??"cli",S=`${s}:${C}`,h=Date.now();p.run(t,`INSERT INTO token_usage
9
9
  (id, work_cycle_id, event_key, source, is_estimated, input_tokens, output_tokens, model_id, description, measured_at, created_at)
10
10
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
11
11
  ON CONFLICT(event_key) DO UPDATE SET
@@ -6,4 +6,4 @@ const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
8
  import{a as n,b as m}from"./chunk-WUHGODSQ.mjs";import{a as o}from"./chunk-E66B27AL.mjs";m();import c from"node:crypto";import t from"node:path";var i="\\\\.\\pipe\\";function p(e=n()){return t.join(e,"run")}o(p,"getDaemonRunDir");function a(e=process.platform,r=n()){if(e==="win32"){let u=c.createHash("sha1").update(t.resolve(r)).digest("hex").slice(0,16);return`${i}prjct-${u}-daemon`}return t.join(p(r),"daemon.sock")}o(a,"getDaemonSocketPath");function N(e=a()){return e.startsWith(i)}o(N,"isDaemonNamedPipe");var s={runDir:o(()=>p(),"runDir"),socket:o(()=>a(),"socket"),pid:o(()=>t.join(s.runDir(),"daemon.pid"),"pid"),log:o(()=>t.join(s.runDir(),"daemon.log"),"log")},O=480*60*1e3,x=1024*1024,_=3e4,f=600*1e3,D=new Set(["ship","sync","dream","update","upgrade","analyze","init","cloud"]),M=800;function E(e){return e==="hook"?M:D.has(e)?f:_}o(E,"commandRequestTimeoutMs");function R(e){return Buffer.from(`${JSON.stringify(e)}
9
- `)}o(R,"encodeMessage");export{N as a,s as b,E as c,R as d};
9
+ `)}o(R,"encodeMessage");export{p as a,N as b,s as c,E as d,R as e};
@@ -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{b as d}from"./chunk-PVCEWFHS.mjs";import{c as l}from"./chunk-FZS3XGEA.mjs";import{e as a,g as _}from"./chunk-TKXOMN4K.mjs";import{a as m}from"./chunk-E66B27AL.mjs";_();var E=7,A=90,f=20,T=["pattern-detector","transcript-auto","skill-miss","friction","land-auto","sync-context-quality"];function D(e){return e?T.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(t)):!1}m(D,"isAutoSource");function O(e,t=E,o=500){let u=Date.now()-t*864e5;try{let n=a.query(e,`SELECT id FROM memory_entries
9
+ WHERE deleted_at IS NOT NULL AND deleted_at < ?
10
+ ORDER BY deleted_at ASC
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(O,"purgeSoftDeleted");function L(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
12
+ WHERE e.type >= 'memory.remember.' AND e.type < 'memory.remember/'
13
+ AND e.timestamp < ?
14
+ AND NOT EXISTS (
15
+ SELECT 1 FROM memory_entries m
16
+ WHERE m.id = 'mem_' || e.id AND m.deleted_at IS NULL
17
+ )
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(L,"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(!D(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 C(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 >= 'memory.remember.' AND type < 'memory.remember/'")?.c??0,s=(()=>{try{return d.allEntriesForIndex(e).filter(i=>D(i.tags?.source)).length}catch{return 0}})();return{live:t,softDeleted:o,archives:u,rememberEvents:n,autoSourceLive:s}}m(C,"vaultHealth");async function F(e,t={}){let o=t.softDeletedPurgeDays??E,u=t.archivePruneDays??A,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:p}=await import("./distill-5TNAM3LY.mjs"),y=await p(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:b}=await import("./distill-5TNAM3LY.mjs"),h=b(e,o).purged||O(e,o),S=L(e,o),R=(()=>{try{return l.pruneOldArchives(e,u)}catch{return 0}})();return{softDeletedPurged:h,orphanEventsPurged:S,archivesPruned:R,autoSourceTrimmed:r,distilledDiscarded:r,digestsWritten:c}}m(F,"runVaultPurge");export{E as a,A as b,f as c,T as d,D as e,O as f,L as g,g as h,C as i,F as j};
@@ -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-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
8
+ import{d as o,g as y}from"./chunk-TKXOMN4K.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', ?, ?)
@@ -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 y,b as N}from"./chunk-KEJ5RMAI.mjs";import{b as u}from"./chunk-AZHE4VOM.mjs";import{f as d,h as l,k as m,o as j}from"./chunk-UH4MD3F3.mjs";import{b as f,c as g,d as p,e as k}from"./chunk-SYHDEUVU.mjs";import{a}from"./chunk-E66B27AL.mjs";j();import c from"node:path";var P=[{scriptName:"typecheck",kind:"typecheck"},{scriptName:"lint",kind:"lint"},{scriptName:"test",kind:"test"},{scriptName:"build",kind:"build"},{scriptName:"dev",kind:"dev"},{scriptName:"format",kind:"format"}],A=[{file:"bun.lock",manager:"bun"},{file:"bun.lockb",manager:"bun"},{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];async function R(t){for(let{file:n,manager:e}of A)if(await m(c.join(t,n)))return e;return null}a(R,"detectPackageManager");async function w(t){let n=c.join(t,"package.json");if(!await m(n))return[];let r=(await d(n,null))?.scripts??{};return P.filter(({scriptName:i})=>!!r[i]).map(({scriptName:i,kind:o})=>{let s=r[i];return{scriptName:i,command:s,kind:o,mutating:S(s)}})}a(w,"detectNodeCommands");async function M(t){return await m(c.join(t,"Cargo.toml"))?[{scriptName:"test",command:"cargo test",kind:"test",mutating:!1},{scriptName:"build",command:"cargo build",kind:"build",mutating:!1},{scriptName:"lint",command:"cargo clippy",kind:"lint",mutating:!1},{scriptName:"format",command:"cargo fmt",kind:"format",mutating:!0}]:[]}a(M,"detectCargoCommands");async function _(t){return await m(c.join(t,"go.mod"))?[{scriptName:"test",command:"go test ./...",kind:"test",mutating:!1},{scriptName:"build",command:"go build ./...",kind:"build",mutating:!1},{scriptName:"format",command:"gofmt -l .",kind:"format",mutating:!1}]:[]}a(_,"detectGoCommands");var h=[{marker:/\[tool\.pytest\b/,scriptName:"test",command:"pytest",kind:"test",mutating:!1},{marker:/\[tool\.ruff\b/,scriptName:"lint",command:"ruff check .",kind:"lint",mutating:!1},{marker:/\[tool\.black\b/,scriptName:"format",command:"black .",kind:"format",mutating:!0},{marker:/\[tool\.mypy\b/,scriptName:"typecheck",command:"mypy .",kind:"typecheck",mutating:!1}];async function V(t){let n=c.join(t,"pyproject.toml");if(!await m(n))return[];let e=await l(n,"");return h.filter(({marker:r})=>r.test(e)).map(({marker:r,...i})=>i)}a(V,"detectPythonCommands");async function C(t){let[n,e,r,i,o]=await Promise.all([w(t),M(t),_(t),V(t),R(t)]);return{packageManager:o,commands:[...n,...e,...r,...i]}}a(C,"detectVerifiedCommands");var T=/^(?:--fix|--write|--update|-w|--fix-type)$/,E=new Set(["migrate","push","publish","deploy","release","commit"]);function S(t){for(let n of y(t)){let e=N(n);if(e.some(r=>T.test(r))||e.some(r=>E.has(r.toLowerCase())))return!0}return!1}a(S,"classifyCommandMutation");var x=6,O=3,I=80;function G(t){let n=new Set;return t.filter(e=>n.has(e.kind)?!1:(n.add(e.kind),!0))}a(G,"dedupeByKind");function K(t,n){let e=t.replace(/\s+/g," ").trim();return e.length>n?`${e.slice(0,n-1)}\u2026`:e}a(K,"truncate");async function L(t){try{let n=await u.getProjectId(t),{getActiveProjectStyle:e}=await import("./project-style-evolution-7MAUSED2.mjs"),r=e(n);if(!r)return null;let i=r.payload.stack,o=[i.ecosystem&&i.ecosystem!=="unknown"?i.ecosystem:null,i.languages.slice(0,O).join(", ")||null,i.frameworks.slice(0,x).join(", ")||null].filter(s=>!!s);return o.length>0?o.join(" \xB7 "):null}catch{return null}}a(L,"buildStackLine");async function b(t){let[n,e]=await Promise.all([L(t),C(t)]),r=G(e.commands);if(!n&&r.length===0)return null;let i=[];n&&i.push(`- stack: ${n}`);for(let o of r){let s=o.mutating?"mutating":"read-only";i.push(`- ${o.kind}: \`${K(o.command,I)}\` (${s})`)}return i.push("- deeper: `prjct context --md` \xB7 `prjct_analysis` MCP \xB7 `prjct_relevant_files` MCP"),i.join(`
8
+ import{a as y,b as N}from"./chunk-KEJ5RMAI.mjs";import{b as u}from"./chunk-ZZBNFNMG.mjs";import{f as d,h as l,k as m,o as j}from"./chunk-UH4MD3F3.mjs";import{b as f,c as g,d as p,e as k}from"./chunk-SYHDEUVU.mjs";import{a}from"./chunk-E66B27AL.mjs";j();import c from"node:path";var P=[{scriptName:"typecheck",kind:"typecheck"},{scriptName:"lint",kind:"lint"},{scriptName:"test",kind:"test"},{scriptName:"build",kind:"build"},{scriptName:"dev",kind:"dev"},{scriptName:"format",kind:"format"}],A=[{file:"bun.lock",manager:"bun"},{file:"bun.lockb",manager:"bun"},{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];async function R(t){for(let{file:n,manager:e}of A)if(await m(c.join(t,n)))return e;return null}a(R,"detectPackageManager");async function w(t){let n=c.join(t,"package.json");if(!await m(n))return[];let r=(await d(n,null))?.scripts??{};return P.filter(({scriptName:i})=>!!r[i]).map(({scriptName:i,kind:o})=>{let s=r[i];return{scriptName:i,command:s,kind:o,mutating:S(s)}})}a(w,"detectNodeCommands");async function M(t){return await m(c.join(t,"Cargo.toml"))?[{scriptName:"test",command:"cargo test",kind:"test",mutating:!1},{scriptName:"build",command:"cargo build",kind:"build",mutating:!1},{scriptName:"lint",command:"cargo clippy",kind:"lint",mutating:!1},{scriptName:"format",command:"cargo fmt",kind:"format",mutating:!0}]:[]}a(M,"detectCargoCommands");async function _(t){return await m(c.join(t,"go.mod"))?[{scriptName:"test",command:"go test ./...",kind:"test",mutating:!1},{scriptName:"build",command:"go build ./...",kind:"build",mutating:!1},{scriptName:"format",command:"gofmt -l .",kind:"format",mutating:!1}]:[]}a(_,"detectGoCommands");var h=[{marker:/\[tool\.pytest\b/,scriptName:"test",command:"pytest",kind:"test",mutating:!1},{marker:/\[tool\.ruff\b/,scriptName:"lint",command:"ruff check .",kind:"lint",mutating:!1},{marker:/\[tool\.black\b/,scriptName:"format",command:"black .",kind:"format",mutating:!0},{marker:/\[tool\.mypy\b/,scriptName:"typecheck",command:"mypy .",kind:"typecheck",mutating:!1}];async function V(t){let n=c.join(t,"pyproject.toml");if(!await m(n))return[];let e=await l(n,"");return h.filter(({marker:r})=>r.test(e)).map(({marker:r,...i})=>i)}a(V,"detectPythonCommands");async function C(t){let[n,e,r,i,o]=await Promise.all([w(t),M(t),_(t),V(t),R(t)]);return{packageManager:o,commands:[...n,...e,...r,...i]}}a(C,"detectVerifiedCommands");var T=/^(?:--fix|--write|--update|-w|--fix-type)$/,E=new Set(["migrate","push","publish","deploy","release","commit"]);function S(t){for(let n of y(t)){let e=N(n);if(e.some(r=>T.test(r))||e.some(r=>E.has(r.toLowerCase())))return!0}return!1}a(S,"classifyCommandMutation");var x=6,O=3,I=80;function G(t){let n=new Set;return t.filter(e=>n.has(e.kind)?!1:(n.add(e.kind),!0))}a(G,"dedupeByKind");function K(t,n){let e=t.replace(/\s+/g," ").trim();return e.length>n?`${e.slice(0,n-1)}\u2026`:e}a(K,"truncate");async function L(t){try{let n=await u.getProjectId(t),{getActiveProjectStyle:e}=await import("./project-style-evolution-IJXT2MCP.mjs"),r=e(n);if(!r)return null;let i=r.payload.stack,o=[i.ecosystem&&i.ecosystem!=="unknown"?i.ecosystem:null,i.languages.slice(0,O).join(", ")||null,i.frameworks.slice(0,x).join(", ")||null].filter(s=>!!s);return o.length>0?o.join(" \xB7 "):null}catch{return null}}a(L,"buildStackLine");async function b(t){let[n,e]=await Promise.all([L(t),C(t)]),r=G(e.commands);if(!n&&r.length===0)return null;let i=[];n&&i.push(`- stack: ${n}`);for(let o of r){let s=o.mutating?"mutating":"read-only";i.push(`- ${o.kind}: \`${K(o.command,I)}\` (${s})`)}return i.push("- deeper: `prjct context --md` \xB7 `prjct_analysis` MCP \xB7 `prjct_relevant_files` MCP"),i.join(`
9
9
  `)}a(b,"buildProjectFactsSection");async function $(t){let n=await b(t),e=[p];return n&&e.push("","## This project",n),e.join(`
10
10
  `)}a($,"buildPrjctMdBody");async function J(t){let n=await $(t),e=`${f}
11
11
  ${n}
@@ -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 u,e as c}from"./chunk-EMTCZG5I.mjs";import{a as r}from"./chunk-E66B27AL.mjs";c();function g(){return"---"}r(g,"mdHeader");function a(){return`---
8
+ import{a as u,e as c}from"./chunk-IJ523YO2.mjs";import{a as r}from"./chunk-E66B27AL.mjs";c();function g(){return"---"}r(g,"mdHeader");function a(){return`---
9
9
  prjct v${u()}`}r(a,"mdFooter");function f(...n){return m(g(),...n.filter(Boolean),a())}r(f,"mdOutput");function d(n,t){let i=`| ${n.join(" | ")} |`,e=`|${n.map(()=>"---").join("|")}|`,o=t.map(s=>`| ${s.join(" | ")} |`);return[i,e,...o].join(`
10
10
  `)}r(d,"mdTable");function l(n,t,i=3){return`### ${n}
11
11
  ${t}`}r(l,"mdSection");function $(n,t=!1){return n.map((i,e)=>t?`${e+1}. ${i}`:`- ${i}`).join(`
@@ -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-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)
8
+ import{e as c,g as S}from"./chunk-TKXOMN4K.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)
@@ -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 U,c as W}from"./chunk-CE4RCNC7.mjs";import{v as h,w as Y}from"./chunk-JAMSIKDE.mjs";import{d as D,f as B}from"./chunk-BUDZL4DW.mjs";import{a as r,b as g,c as l,d as M}from"./chunk-E66B27AL.mjs";import P from"node:crypto";function R(e){let t=e.toLowerCase().replace(/\s+/g," ").trim();return P.createHash("sha256").update(t).digest("hex")}var k=l(()=>{"use strict";r(R,"memoryFingerprint")});var C,f=l(()=>{"use strict";C=`
8
+ import{a as U,c as W}from"./chunk-CE4RCNC7.mjs";import{v as h,w as Y}from"./chunk-A6K4H3YT.mjs";import{d as D,f as B}from"./chunk-BUDZL4DW.mjs";import{a as r,b as g,c as l,d as M}from"./chunk-E66B27AL.mjs";import P from"node:crypto";function R(e){let t=e.toLowerCase().replace(/\s+/g," ").trim();return P.createHash("sha256").update(t).digest("hex")}var C=l(()=>{"use strict";r(R,"memoryFingerprint")});var k,f=l(()=>{"use strict";k=`
9
9
  -- =======================================================================
10
10
  -- Document storage (backward-compatible with JSON file pattern)
11
11
  -- =======================================================================
@@ -221,7 +221,7 @@ CREATE TABLE velocity_sprints (
221
221
  );
222
222
  `});function v(e){let t=e.split(`
223
223
  `);return/^\[[^\]]+\]\s+Lesson:/i.test(t[0]??"")&&t.filter(n=>!/^Evidence:\s*/i.test(n.trim())).join(`
224
- `).trim()||e}function q(e){try{let t=JSON.parse(e);if(typeof t.content!="string")return null;let s=v(t.content);return s===t.content?null:JSON.stringify({...t,content:s})}catch{return null}}var O,ne,F=l(()=>{"use strict";k();f();r(v,"stripLiteralFrictionEvidence");r(q,"scrubFrictionEventData");O=[{version:1,name:"initial-schema",up:r(e=>{e.run(C)},"up")},{version:2,name:"archives-table",up:r(e=>{e.run(`
224
+ `).trim()||e}function q(e){try{let t=JSON.parse(e);if(typeof t.content!="string")return null;let s=v(t.content);return s===t.content?null:JSON.stringify({...t,content:s})}catch{return null}}var O,ne,F=l(()=>{"use strict";C();f();r(v,"stripLiteralFrictionEvidence");r(q,"scrubFrictionEventData");O=[{version:1,name:"initial-schema",up:r(e=>{e.run(k)},"up")},{version:2,name:"archives-table",up:r(e=>{e.run(`
225
225
  -- =======================================================================
226
226
  -- Archives: Stale data moved out of active storage (PRJ-267)
227
227
  -- =======================================================================
@@ -1251,10 +1251,10 @@ CREATE TABLE velocity_sprints (
1251
1251
  CHECK (disposition IN ('open', 'resolved', 'false_positive')),
1252
1252
  occurred_at TEXT NOT NULL,
1253
1253
  created_at TEXT NOT NULL
1254
- )`),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_project_occurred ON instruction_failures(project_id, occurred_at DESC)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_runtime_model ON instruction_failures(project_id, runtime, model)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_disposition_occurred ON instruction_failures(project_id, disposition, occurred_at)")},"up")}],ne=O[O.length-1]?.version??0});function w(e){let t=K(e);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA busy_timeout = 5000"),t}function K(e){if(U()){let{Database:n}=g("bun:sqlite");return new n(e,{create:!0})}let t=(()=>{try{return g("node:sqlite").DatabaseSync}catch(n){throw new Error(`prjct needs SQLite: run on Bun, or Node >=22.5 with --experimental-sqlite (the \`prjct\` launcher sets this automatically \u2014 invoke \`prjct\`, not \`node dist/bin/prjct.mjs\` directly). Underlying error: ${n instanceof Error?n.message:String(n)}`)}})(),s=new t(e);return H(s)}function H(e){let t={depth:0,savepointSequence:0},s={prepare:r(n=>e.prepare(n),"prepare"),run:r(n=>{e.exec(n)},"run"),close:r(()=>e.close(),"close"),transaction:r(n=>{let a=r(T=>(...i)=>{if(t.depth>0){t.savepointSequence++;let o=`prjct_sp_${t.savepointSequence}`;e.exec(`SAVEPOINT ${o}`),t.depth++;try{let _=n(...i.length?i:[s]);return e.exec(`RELEASE ${o}`),_}catch(_){throw e.exec(`ROLLBACK TO ${o}`),e.exec(`RELEASE ${o}`),_}finally{t.depth--}}e.exec(T),t.depth++;try{let o=n(...i.length?i:[s]);return e.exec("COMMIT"),o}catch(o){throw e.exec("ROLLBACK"),o}finally{t.depth--}},"make"),E=a("BEGIN");return E.deferred=a("BEGIN DEFERRED"),E.immediate=a("BEGIN IMMEDIATE"),E.exclusive=a("BEGIN EXCLUSIVE"),E},"transaction")};return s}var x=l(()=>{"use strict";W();r(w,"openDatabase");r(K,"openRaw");r(H,"adaptNodeSqlite")});var J={};M(J,{PrjctDatabase:()=>A,default:()=>V,prjctDb:()=>G});import I from"node:fs";import b from"node:path";function S(e,t){let s=e.transaction(t);return typeof s.immediate=="function"?s.immediate(e):s(e)}function j(e){let t=new Date().toISOString();return!e||t>e?t:new Date(new Date(e).getTime()+1).toISOString()}var $,A,G,V,z=l(()=>{Y();B();F();x();r(S,"runImmediate");r(j,"monotonicStamp");$=3,A=class{static{r(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(t,s){let n=this.statementCache.get(t),a=n??new Map;n||this.statementCache.set(t,a);let E=a.get(s);if(E)return E;let T=t.prepare(s);return a.set(s,T),T}getDbPath(t){return b.join(h.getGlobalProjectPath(t),"prjct.db")}getDb(t){let s=this.connections.get(t);if(s)return this.touchAccessOrder(t),s;this.connections.size>=$&&this.evictLru();let n=this.getDbPath(t),a=b.dirname(n),E=(()=>{try{I.existsSync(a)||I.mkdirSync(a,{recursive:!0});let T=w(n);return T.run("PRAGMA synchronous = NORMAL"),T.run("PRAGMA cache_size = -2000"),T.run("PRAGMA temp_store = MEMORY"),T.run("PRAGMA mmap_size = 33554432"),T}catch(T){throw new Error(D(T,n,"database"))}})();return this.runMigrations(E,n),this.connections.set(t,E),this.touchAccessOrder(t),E}close(t){if(t){let s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t),this.accessOrder=this.accessOrder.filter(n=>n!==t))}else this.connections.forEach(s=>{this.statementCache.delete(s),s.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(t){this.accessOrder=this.accessOrder.filter(s=>s!==t),this.accessOrder.push(t)}evictLru(){if(this.accessOrder.length===0)return;let t=this.accessOrder.shift(),s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t))}checkpointAll(){for(let[t,s]of this.connections)try{this.prepareCached(s,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(t){return I.existsSync(this.getDbPath(t))}getDoc(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(s);return a?JSON.parse(a.data):null}setDoc(t,s,n){let a=this.getDb(t),E=JSON.stringify(n),T=new Date().toISOString();this.prepareCached(a,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,E,T)}getDocWithStamp(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s);return a?{data:JSON.parse(a.data),updatedAt:a.updated_at}:null}nextKvStamp(t,s){let n=this.prepareCached(t,"SELECT updated_at FROM kv_store WHERE key = ?").get(s);return j(n?.updated_at)}casSetDoc(t,s,n,a){let E=this.getDb(t),T=JSON.stringify(n),i=this.nextKvStamp(E,s);return a===null?this.prepareCached(E,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(s,T,i).changes===1:this.prepareCached(E,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(T,i,s,a).changes===1}updateDoc(t,s,n,a){let E=this.getDb(t);return S(E,()=>{let T=this.prepareCached(E,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s),i=T?JSON.parse(T.data):a(),o=n(i),_=j(T?.updated_at);return this.prepareCached(E,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,JSON.stringify(o),_),o})}deleteDoc(t,s){let n=this.getDb(t);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(s)}hasDoc(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(s)!==null}listDocsByPrefix(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(s).map(E=>({key:E.key,data:JSON.parse(E.data)}))}appendEvent(t,s,n,a){let E=this.getDb(t),T=new Date().toISOString(),o=this.prepareCached(E,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(s,a??null,JSON.stringify(n),T).lastInsertRowid;return typeof o=="bigint"?Number(o):o??null}getEvents(t,s,n=100){let a=this.getDb(t);return s?this.prepareCached(a,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(s,n):this.prepareCached(a,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).all(...n)}run(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).run(...n)}get(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).get(...n)??null}transaction(t,s){let n=this.getDb(t);return S(n,s)}runMigrations(t,s){t.run(`
1254
+ )`),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_project_occurred ON instruction_failures(project_id, occurred_at DESC)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_runtime_model ON instruction_failures(project_id, runtime, model)"),e.run("CREATE INDEX IF NOT EXISTS ix_instruction_failures_disposition_occurred ON instruction_failures(project_id, disposition, occurred_at)")},"up")},{version:65,name:"memory-entries-deleted-at-partial-index",up:r(e=>{e.run("CREATE INDEX IF NOT EXISTS ix_memory_entries_deleted_at ON memory_entries(deleted_at) WHERE deleted_at IS NOT NULL")},"up")}],ne=O[O.length-1]?.version??0});function w(e){let t=K(e);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA busy_timeout = 5000"),t}function K(e){if(U()){let{Database:n}=g("bun:sqlite");return new n(e,{create:!0})}let t=(()=>{try{return g("node:sqlite").DatabaseSync}catch(n){throw new Error(`prjct needs SQLite: run on Bun, or Node >=22.5 with --experimental-sqlite (the \`prjct\` launcher sets this automatically \u2014 invoke \`prjct\`, not \`node dist/bin/prjct.mjs\` directly). Underlying error: ${n instanceof Error?n.message:String(n)}`)}})(),s=new t(e);return H(s)}function H(e){let t={depth:0,savepointSequence:0},s={prepare:r(n=>e.prepare(n),"prepare"),run:r(n=>{e.exec(n)},"run"),close:r(()=>e.close(),"close"),transaction:r(n=>{let a=r(T=>(...i)=>{if(t.depth>0){t.savepointSequence++;let o=`prjct_sp_${t.savepointSequence}`;e.exec(`SAVEPOINT ${o}`),t.depth++;try{let _=n(...i.length?i:[s]);return e.exec(`RELEASE ${o}`),_}catch(_){throw e.exec(`ROLLBACK TO ${o}`),e.exec(`RELEASE ${o}`),_}finally{t.depth--}}e.exec(T),t.depth++;try{let o=n(...i.length?i:[s]);return e.exec("COMMIT"),o}catch(o){throw e.exec("ROLLBACK"),o}finally{t.depth--}},"make"),E=a("BEGIN");return E.deferred=a("BEGIN DEFERRED"),E.immediate=a("BEGIN IMMEDIATE"),E.exclusive=a("BEGIN EXCLUSIVE"),E},"transaction")};return s}var x=l(()=>{"use strict";W();r(w,"openDatabase");r(K,"openRaw");r(H,"adaptNodeSqlite")});var J={};M(J,{PrjctDatabase:()=>A,default:()=>V,prjctDb:()=>G});import I from"node:fs";import b from"node:path";function S(e,t){let s=e.transaction(t);return typeof s.immediate=="function"?s.immediate(e):s(e)}function j(e){let t=new Date().toISOString();return!e||t>e?t:new Date(new Date(e).getTime()+1).toISOString()}var $,A,G,V,z=l(()=>{Y();B();F();x();r(S,"runImmediate");r(j,"monotonicStamp");$=3,A=class{static{r(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(t,s){let n=this.statementCache.get(t),a=n??new Map;n||this.statementCache.set(t,a);let E=a.get(s);if(E)return E;let T=t.prepare(s);return a.set(s,T),T}getDbPath(t){return b.join(h.getGlobalProjectPath(t),"prjct.db")}getDb(t){let s=this.connections.get(t);if(s)return this.touchAccessOrder(t),s;this.connections.size>=$&&this.evictLru();let n=this.getDbPath(t),a=b.dirname(n),E=(()=>{try{I.existsSync(a)||I.mkdirSync(a,{recursive:!0});let T=w(n);return T.run("PRAGMA synchronous = NORMAL"),T.run("PRAGMA cache_size = -2000"),T.run("PRAGMA temp_store = MEMORY"),T.run("PRAGMA mmap_size = 33554432"),T}catch(T){throw new Error(D(T,n,"database"))}})();return this.runMigrations(E,n),this.connections.set(t,E),this.touchAccessOrder(t),E}close(t){if(t){let s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t),this.accessOrder=this.accessOrder.filter(n=>n!==t))}else this.connections.forEach(s=>{this.statementCache.delete(s),s.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(t){this.accessOrder=this.accessOrder.filter(s=>s!==t),this.accessOrder.push(t)}evictLru(){if(this.accessOrder.length===0)return;let t=this.accessOrder.shift(),s=this.connections.get(t);s&&(this.statementCache.delete(s),s.close(),this.connections.delete(t))}checkpointAll(){for(let[t,s]of this.connections)try{this.prepareCached(s,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(t){return I.existsSync(this.getDbPath(t))}getDoc(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data FROM kv_store WHERE key = ?").get(s);return a?JSON.parse(a.data):null}setDoc(t,s,n){let a=this.getDb(t),E=JSON.stringify(n),T=new Date().toISOString();this.prepareCached(a,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,E,T)}getDocWithStamp(t,s){let n=this.getDb(t),a=this.prepareCached(n,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s);return a?{data:JSON.parse(a.data),updatedAt:a.updated_at}:null}nextKvStamp(t,s){let n=this.prepareCached(t,"SELECT updated_at FROM kv_store WHERE key = ?").get(s);return j(n?.updated_at)}casSetDoc(t,s,n,a){let E=this.getDb(t),T=JSON.stringify(n),i=this.nextKvStamp(E,s);return a===null?this.prepareCached(E,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(s,T,i).changes===1:this.prepareCached(E,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(T,i,s,a).changes===1}updateDoc(t,s,n,a){let E=this.getDb(t);return S(E,()=>{let T=this.prepareCached(E,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(s),i=T?JSON.parse(T.data):a(),o=n(i),_=j(T?.updated_at);return this.prepareCached(E,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(s,JSON.stringify(o),_),o})}deleteDoc(t,s){let n=this.getDb(t);this.prepareCached(n,"DELETE FROM kv_store WHERE key = ?").run(s)}hasDoc(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT 1 FROM kv_store WHERE key = ?").get(s)!==null}listDocsByPrefix(t,s){let n=this.getDb(t);return this.prepareCached(n,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(s).map(E=>({key:E.key,data:JSON.parse(E.data)}))}appendEvent(t,s,n,a){let E=this.getDb(t),T=new Date().toISOString(),o=this.prepareCached(E,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(s,a??null,JSON.stringify(n),T).lastInsertRowid;return typeof o=="bigint"?Number(o):o??null}getEvents(t,s,n=100){let a=this.getDb(t);return s?this.prepareCached(a,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(s,n):this.prepareCached(a,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).all(...n)}run(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).run(...n)}get(t,s,...n){let a=this.getDb(t);return this.prepareCached(a,s).get(...n)??null}transaction(t,s){let n=this.getDb(t);return S(n,s)}runMigrations(t,s){t.run(`
1255
1255
  CREATE TABLE IF NOT EXISTS _migrations (
1256
1256
  version INTEGER PRIMARY KEY,
1257
1257
  name TEXT NOT NULL,
1258
1258
  applied_at TEXT NOT NULL
1259
1259
  )
1260
- `);let n=new Set(t.prepare("SELECT version FROM _migrations").all().map(E=>E.version)),a=O.filter(E=>!n.has(E.version));if(a.length!==0){if(s&&n.size>0)try{let E=`${s}.pre-migrate.bak`;I.existsSync(E)&&I.rmSync(E,{force:!0}),t.prepare("VACUUM INTO ?").run(E)}catch(E){console.warn(`prjct: pre-migration backup failed (continuing): ${E?.message??E}`)}for(let E of a)S(t,()=>{E.up(t),t.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(E.version,E.name,new Date().toISOString())})}}getMigrations(t){return this.getDb(t).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(t){return this.getDb(t).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},G=new A,V=G});export{R as a,k as b,A as c,G as d,V as e,J as f,z as g};
1260
+ `);let n=new Set(t.prepare("SELECT version FROM _migrations").all().map(E=>E.version)),a=O.filter(E=>!n.has(E.version));if(a.length!==0){if(s&&n.size>0)try{let E=`${s}.pre-migrate.bak`;I.existsSync(E)&&I.rmSync(E,{force:!0}),t.prepare("VACUUM INTO ?").run(E)}catch(E){console.warn(`prjct: pre-migration backup failed (continuing): ${E?.message??E}`)}for(let E of a)S(t,()=>{E.up(t),t.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(E.version,E.name,new Date().toISOString())})}}getMigrations(t){return this.getDb(t).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(t){return this.getDb(t).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},G=new A,V=G});export{R as a,C as b,A as c,G as d,V as e,J as f,z as g};
@@ -0,0 +1,9 @@
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 c,b as p,c as a,d as f,e as g,f as u,i as l}from"./chunk-IWUF2LGO.mjs";import{r as d,s as m,u as j}from"./chunk-A6K4H3YT.mjs";import{b as i,c as h}from"./chunk-JQE2F2RK.mjs";import{e as n,f as y}from"./chunk-BUDZL4DW.mjs";import{a as o}from"./chunk-E66B27AL.mjs";j();y();h();import{existsSync as x}from"node:fs";import M from"node:path";function S(){return process.env.PRJCT_TEST_MODE==="1"?[i(".prjct-tests","kimi-code"),i(".prjct-tests","kimi")]:[i(".kimi-code"),i(".kimi")]}o(S,"kimiHomeDirs");function P(){let[t,e]=S(),r=x(e)&&!x(t)?e:t;return M.join(r,"mcp.json")}o(P,"getKimiMcpConfigPath");async function v(t=P()){let e=await a("context7",c.context7,t),r=await a("prjct",c.prjct,t);return{path:t,changed:e.changed||r.changed}}o(v,"ensureKimiMcpServer");var w=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];async function F(t={}){t.silent||console.log(`
9
+ \u{1F50C} Configuring MCP servers...`);try{await l.install();let e=t.verifyContext7===!1?null:await l.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of w)try{let r=p(),s=await f(e.name,r),C=await a(e.name,c[e.name],r);s&&!C.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(r){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${n(r)}`),console.log(e.manual))}try{if((await d()).installed){let r=await g(),s=await u();t.silent||(r.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):r.changed||s.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await m()).installed){let r=await v();t.silent||console.log(r.changed?`\u2705 prjct Kimi config updated in ${r.path}`:"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}}o(F,"setupMcpServers");export{F as a};
@@ -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 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}
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-A6K4H3YT.mjs";import{k as d,o as H}from"./chunk-UH4MD3F3.mjs";import{c as h}from"./chunk-EXVL2OFE.mjs";import{b as m,e as E}from"./chunk-IJ523YO2.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
9
 
10
10
  ${a}
11
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,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 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};
8
+ import{b as s}from"./chunk-MW54MTLB.mjs";import{b as i}from"./chunk-ZZBNFNMG.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};
@@ -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{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(`
8
+ import{a as f}from"./chunk-WUOVBBPC.mjs";import{g as m}from"./chunk-XYKVWO23.mjs";import{b as a}from"./chunk-PVCEWFHS.mjs";import{i as l}from"./chunk-JGZ3QGWX.mjs";import{b as u}from"./chunk-ZZBNFNMG.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
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
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};
@@ -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 c,b as u,c as d,e as k,f as s,g as l,j as f}from"./chunk-JGZ3QGWX.mjs";import{a}from"./chunk-E66B27AL.mjs";function m(t){return typeof t=="string"?`${t}
9
+ `:`${JSON.stringify(t)}
10
+ `}a(m,"payloadLine");async function g(t,n){let e=t.projectPath??process.cwd();if(n){try{let i=n.hookHost??u(),r=n.input;if(n.afterEmitOnly){t.afterEmit&&n.detachAfterEmit(()=>t.afterEmit(r,e,i));return}let o=t.decide?await t.decide(r,e):null;if(o){n.sink(m(d(c(t.event,o.deny),i)));return}let H=t.build?await t.build(r,e,i):null;n.sink(m(d(f(t.event,H),i))),t.afterEmit&&n.detachAfterEmit(()=>t.afterEmit(r,e,i))}catch{n.sink(`{}
11
+ `)}return}await l(async()=>{let i=k(),r=t.decide?await t.decide(i,e):null;if(r){s(c(t.event,r.deny));return}let o=t.build?await t.build(i,e,u()):null;s(f(t.event,o)),t.afterEmit&&await t.afterEmit(i,e,u())})}a(g,"runHook");export{g as a};
@@ -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{m as _,n as z,v as M,w as J}from"./chunk-JAMSIKDE.mjs";import{f as y,g as m,m as C,o as F}from"./chunk-UH4MD3F3.mjs";import{b as o,p as $}from"./chunk-QWQFF2UG.mjs";import{a as e}from"./chunk-E66B27AL.mjs";J();F();import ot from"node:crypto";import b from"node:fs/promises";import R from"node:os";import H from"node:path";$();z();import{spawn as Y}from"node:child_process";var P="prjct-cli-auth",c="prjct-cloud",A="app.prjct.cli.auth",E="prjct-cli-auth",u={cached:void 0,testStore:null};function d(){return process.platform==="darwin"}e(d,"isDarwin");function h(){return process.platform==="linux"}e(h,"isLinux");function p(){return process.platform==="win32"}e(p,"isWindows");function B(r,t,a){return new Promise((n,i)=>{let s=Y(r,t,{stdio:["pipe","pipe","pipe"]}),f=[],U=[];s.stdout.setEncoding("utf8"),s.stderr.setEncoding("utf8"),s.stdout.on("data",l=>{f.push(String(l))}),s.stderr.on("data",l=>{U.push(String(l))}),s.on("error",i),s.on("close",l=>{if(l===0){n(f.join(""));return}i(new Error(U.join("").trim()||`${r} exited with code ${l}`))}),s.stdin.end(a)})}e(B,"runWithStdin");async function K(){try{let{stdout:r}=await o("security",["find-generic-password","-a",c,"-s",P,"-w"]);return r.trim()||null}catch{return null}}e(K,"readMacosKeychain");async function q(r){await o("security",["add-generic-password","-U","-a",c,"-s",P,"-w",r])}e(q,"writeMacosKeychain");async function V(){try{await o("security",["delete-generic-password","-a",c,"-s",P])}catch{}}e(V,"clearMacosKeychain");async function W(){try{let{stdout:r}=await o("secret-tool",["lookup","service",A,"account",c]);return r.trim()||null}catch{return null}}e(W,"readLinuxSecretService");async function X(r){await B("secret-tool",["store","--label","prjct Cloud token","service",A,"account",c],r)}e(X,"writeLinuxSecretService");async function Z(){try{await o("secret-tool",["clear","service",A,"account",c])}catch{}}e(Z,"clearLinuxSecretService");var w=`
8
+ import{m as _,n as z,v as M,w as J}from"./chunk-A6K4H3YT.mjs";import{f as y,g as m,m as C,o as F}from"./chunk-UH4MD3F3.mjs";import{b as o,p as $}from"./chunk-QWQFF2UG.mjs";import{a as e}from"./chunk-E66B27AL.mjs";J();F();import ot from"node:crypto";import b from"node:fs/promises";import R from"node:os";import H from"node:path";$();z();import{spawn as Y}from"node:child_process";var P="prjct-cli-auth",c="prjct-cloud",A="app.prjct.cli.auth",E="prjct-cli-auth",u={cached:void 0,testStore:null};function d(){return process.platform==="darwin"}e(d,"isDarwin");function h(){return process.platform==="linux"}e(h,"isLinux");function p(){return process.platform==="win32"}e(p,"isWindows");function B(r,t,a){return new Promise((n,i)=>{let s=Y(r,t,{stdio:["pipe","pipe","pipe"]}),f=[],U=[];s.stdout.setEncoding("utf8"),s.stderr.setEncoding("utf8"),s.stdout.on("data",l=>{f.push(String(l))}),s.stderr.on("data",l=>{U.push(String(l))}),s.on("error",i),s.on("close",l=>{if(l===0){n(f.join(""));return}i(new Error(U.join("").trim()||`${r} exited with code ${l}`))}),s.stdin.end(a)})}e(B,"runWithStdin");async function K(){try{let{stdout:r}=await o("security",["find-generic-password","-a",c,"-s",P,"-w"]);return r.trim()||null}catch{return null}}e(K,"readMacosKeychain");async function q(r){await o("security",["add-generic-password","-U","-a",c,"-s",P,"-w",r])}e(q,"writeMacosKeychain");async function V(){try{await o("security",["delete-generic-password","-a",c,"-s",P])}catch{}}e(V,"clearMacosKeychain");async function W(){try{let{stdout:r}=await o("secret-tool",["lookup","service",A,"account",c]);return r.trim()||null}catch{return null}}e(W,"readLinuxSecretService");async function X(r){await B("secret-tool",["store","--label","prjct Cloud token","service",A,"account",c],r)}e(X,"writeLinuxSecretService");async function Z(){try{await o("secret-tool",["clear","service",A,"account",c])}catch{}}e(Z,"clearLinuxSecretService");var w=`
9
9
  using System;
10
10
  using System.Runtime.InteropServices;
11
11
  using System.Text;
@@ -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{b as g}from"./chunk-M5E2YOZ4.mjs";import{d,g as C}from"./chunk-KG7Z6OMK.mjs";import{b as f,h as E}from"./chunk-JAMSIKDE.mjs";import{e as _,p as q}from"./chunk-QWQFF2UG.mjs";import{a as s}from"./chunk-E66B27AL.mjs";E();C();function m(e){return{projectId:e.project_id,taskId:e.task_id,workspaceId:e.workspace_id,classification:e.classification,station:e.station,requiresSpec:e.requires_spec===1,requiresTestsFirst:e.requires_tests_first===1,reason:e.reason,linkedSpecId:e.linked_spec_id,createdAt:e.created_at,updatedAt:e.updated_at}}s(m,"toState");function y(e,t){let i=f(),r=d.query(e,`INSERT INTO task_pipeline_state (
8
+ import{b as g}from"./chunk-M5E2YOZ4.mjs";import{d,g as C}from"./chunk-TKXOMN4K.mjs";import{b as f,h as E}from"./chunk-A6K4H3YT.mjs";import{e as _,p as q}from"./chunk-QWQFF2UG.mjs";import{a as s}from"./chunk-E66B27AL.mjs";E();C();function m(e){return{projectId:e.project_id,taskId:e.task_id,workspaceId:e.workspace_id,classification:e.classification,station:e.station,requiresSpec:e.requires_spec===1,requiresTestsFirst:e.requires_tests_first===1,reason:e.reason,linkedSpecId:e.linked_spec_id,createdAt:e.created_at,updatedAt:e.updated_at}}s(m,"toState");function y(e,t){let i=f(),r=d.query(e,`INSERT INTO task_pipeline_state (
9
9
  project_id, task_id, workspace_id, classification, station,
10
10
  requires_spec, requires_tests_first, reason, linked_spec_id,
11
11
  created_at, updated_at