prjct-cli 3.96.0 → 3.97.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/bin/prjct.cjs +14 -0
  3. package/dist/bin/core-chunks/agent-HCP5FF77.mjs +31 -0
  4. package/dist/bin/core-chunks/agent-codenames-7N4DU62I.mjs +7 -0
  5. package/dist/bin/core-chunks/agent-identity-4KFRR5OU.mjs +7 -0
  6. package/dist/bin/core-chunks/agent-runtime-registry-3RMVBEV2.mjs +7 -0
  7. package/dist/bin/core-chunks/agent-switch-AVSX6SLY.mjs +7 -0
  8. package/dist/bin/core-chunks/agents-OAQXBGH3.mjs +10 -0
  9. package/dist/bin/core-chunks/ai-provider-RVXK7D7R.mjs +7 -0
  10. package/dist/bin/core-chunks/analysis-3A7ODSSI.mjs +41 -0
  11. package/dist/bin/core-chunks/auth-config-KWLVKHCY.mjs +7 -0
  12. package/dist/bin/core-chunks/auto-flush-EWSVMKQN.mjs +7 -0
  13. package/dist/bin/core-chunks/auto-updater-PKYQRBGQ.mjs +8 -0
  14. package/dist/bin/core-chunks/bin-commands-LLHG2NSY.mjs +21 -0
  15. package/dist/bin/core-chunks/capture-7LQ52T6L.mjs +7 -0
  16. package/dist/bin/core-chunks/capture-gate-M4HM7WAI.mjs +7 -0
  17. package/dist/bin/core-chunks/ceremonies-4OZ3FKRE.mjs +19 -0
  18. package/dist/bin/core-chunks/changelog-CUNVCEL5.mjs +10 -0
  19. package/dist/bin/core-chunks/chunk-225DWS4D.mjs +7 -0
  20. package/dist/bin/core-chunks/chunk-24EN5Y62.mjs +48 -0
  21. package/dist/bin/core-chunks/chunk-2EEMQV7N.mjs +9 -0
  22. package/dist/bin/core-chunks/chunk-2I5PUQWY.mjs +7 -0
  23. package/dist/bin/core-chunks/chunk-2JJM3YMW.mjs +44 -0
  24. package/dist/bin/core-chunks/chunk-2NI4EEK2.mjs +8 -0
  25. package/dist/bin/core-chunks/chunk-2TJRTFIS.mjs +9 -0
  26. package/dist/bin/core-chunks/chunk-2ZPM4Z6W.mjs +17 -0
  27. package/dist/bin/core-chunks/chunk-3FXNIJCS.mjs +8 -0
  28. package/dist/bin/core-chunks/chunk-3JD6KRNJ.mjs +8 -0
  29. package/dist/bin/core-chunks/chunk-3TRXQAU4.mjs +7 -0
  30. package/dist/bin/core-chunks/chunk-3USVY66O.mjs +7 -0
  31. package/dist/bin/core-chunks/chunk-45LKWJ5D.mjs +7 -0
  32. package/dist/bin/core-chunks/chunk-4IE7LRH3.mjs +7 -0
  33. package/dist/bin/core-chunks/chunk-4MR5XSLO.mjs +8 -0
  34. package/dist/bin/core-chunks/chunk-4PPIE6GA.mjs +102 -0
  35. package/dist/bin/core-chunks/chunk-4PRD4EU2.mjs +7 -0
  36. package/dist/bin/core-chunks/chunk-4T7NGLNQ.mjs +16 -0
  37. package/dist/bin/core-chunks/chunk-53ZPEZLU.mjs +8 -0
  38. package/dist/bin/core-chunks/chunk-56FW4P6U.mjs +10 -0
  39. package/dist/bin/core-chunks/chunk-5EF5EOCL.mjs +7 -0
  40. package/dist/bin/core-chunks/chunk-5MN22JFI.mjs +19 -0
  41. package/dist/bin/core-chunks/chunk-5ONMON5L.mjs +13 -0
  42. package/dist/bin/core-chunks/chunk-5UUITMRX.mjs +9 -0
  43. package/dist/bin/core-chunks/chunk-5YLI5V3Q.mjs +8 -0
  44. package/dist/bin/core-chunks/chunk-5YSPND5J.mjs +9 -0
  45. package/dist/bin/core-chunks/chunk-623SNKDH.mjs +7 -0
  46. package/dist/bin/core-chunks/chunk-6AFXUX2M.mjs +9 -0
  47. package/dist/bin/core-chunks/chunk-6FFOWWH2.mjs +17 -0
  48. package/dist/bin/core-chunks/chunk-6FUCOGOW.mjs +7 -0
  49. package/dist/bin/core-chunks/chunk-6OYLZ4NM.mjs +10 -0
  50. package/dist/bin/core-chunks/chunk-6P4GMVUZ.mjs +18 -0
  51. package/dist/bin/core-chunks/chunk-6RT2P22O.mjs +7 -0
  52. package/dist/bin/core-chunks/chunk-6XTLPAPZ.mjs +15 -0
  53. package/dist/bin/core-chunks/chunk-76YMLNLF.mjs +7 -0
  54. package/dist/bin/core-chunks/chunk-7CI4AMVO.mjs +7 -0
  55. package/dist/bin/core-chunks/chunk-7QMBIMEX.mjs +64 -0
  56. package/dist/bin/core-chunks/chunk-7QTE6X4J.mjs +7 -0
  57. package/dist/bin/core-chunks/chunk-7ZHWJSW5.mjs +8 -0
  58. package/dist/bin/core-chunks/chunk-AJTBFIH2.mjs +9 -0
  59. package/dist/bin/core-chunks/chunk-AJXELVNH.mjs +7 -0
  60. package/dist/bin/core-chunks/chunk-ANVCA6LF.mjs +7 -0
  61. package/dist/bin/core-chunks/chunk-AS3LWTQ4.mjs +16 -0
  62. package/dist/bin/core-chunks/chunk-B7AQHL7B.mjs +7 -0
  63. package/dist/bin/core-chunks/chunk-BQKDJ3U6.mjs +8 -0
  64. package/dist/bin/core-chunks/chunk-BSR3XUBD.mjs +24 -0
  65. package/dist/bin/core-chunks/chunk-BTCCUMKI.mjs +12 -0
  66. package/dist/bin/core-chunks/chunk-BTSHD3XJ.mjs +9 -0
  67. package/dist/bin/core-chunks/chunk-C35JQUWD.mjs +8 -0
  68. package/dist/bin/core-chunks/chunk-C7YBUD4K.mjs +10 -0
  69. package/dist/bin/core-chunks/chunk-CDLZLTRY.mjs +10 -0
  70. package/dist/bin/core-chunks/chunk-CEOTHJIY.mjs +10 -0
  71. package/dist/bin/core-chunks/chunk-CFD6CW7T.mjs +46 -0
  72. package/dist/bin/core-chunks/chunk-CKYBGRCF.mjs +8 -0
  73. package/dist/bin/core-chunks/chunk-CNWEQUB7.mjs +7 -0
  74. package/dist/bin/core-chunks/chunk-CUIB6CTG.mjs +20 -0
  75. package/dist/bin/core-chunks/chunk-CWLGRKA7.mjs +6 -0
  76. package/dist/bin/core-chunks/chunk-CXNVDJNN.mjs +7 -0
  77. package/dist/bin/core-chunks/chunk-D62TAZG6.mjs +9 -0
  78. package/dist/bin/core-chunks/chunk-DCVPNFS4.mjs +8 -0
  79. package/dist/bin/core-chunks/chunk-DEYAQEF5.mjs +7 -0
  80. package/dist/bin/core-chunks/chunk-DIEPWXJJ.mjs +7 -0
  81. package/dist/bin/core-chunks/chunk-DMO3ZFUG.mjs +1259 -0
  82. package/dist/bin/core-chunks/chunk-DN46DLU3.mjs +10 -0
  83. package/dist/bin/core-chunks/chunk-DOJPSIMG.mjs +7 -0
  84. package/dist/bin/core-chunks/chunk-DZVOFEM5.mjs +7 -0
  85. package/dist/bin/core-chunks/chunk-E5QQDYBR.mjs +7 -0
  86. package/dist/bin/core-chunks/chunk-E73HSXCX.mjs +7 -0
  87. package/dist/bin/core-chunks/chunk-EFSPBB4S.mjs +8 -0
  88. package/dist/bin/core-chunks/chunk-EHVU2SMR.mjs +34 -0
  89. package/dist/bin/core-chunks/chunk-ESB4ALH2.mjs +7 -0
  90. package/dist/bin/core-chunks/chunk-EZRNQXCC.mjs +7 -0
  91. package/dist/bin/core-chunks/chunk-F2FKQUYE.mjs +19 -0
  92. package/dist/bin/core-chunks/chunk-F7OOBAJO.mjs +30 -0
  93. package/dist/bin/core-chunks/chunk-FATYLG3L.mjs +14 -0
  94. package/dist/bin/core-chunks/chunk-FOWTB762.mjs +7 -0
  95. package/dist/bin/core-chunks/chunk-GDLAQV3Q.mjs +14 -0
  96. package/dist/bin/core-chunks/chunk-GGGDYL4P.mjs +7 -0
  97. package/dist/bin/core-chunks/chunk-GHSRH4GL.mjs +8 -0
  98. package/dist/bin/core-chunks/chunk-GOIBJ7PV.mjs +7 -0
  99. package/dist/bin/core-chunks/chunk-GSNQKBHZ.mjs +11 -0
  100. package/dist/bin/core-chunks/chunk-GTG67Z45.mjs +11 -0
  101. package/dist/bin/core-chunks/chunk-H2KNJUPN.mjs +23 -0
  102. package/dist/bin/core-chunks/chunk-HCPQZRR3.mjs +7 -0
  103. package/dist/bin/core-chunks/chunk-HEXSVBUP.mjs +8 -0
  104. package/dist/bin/core-chunks/chunk-HPCSSJXH.mjs +7 -0
  105. package/dist/bin/core-chunks/chunk-HU5ERAAV.mjs +8 -0
  106. package/dist/bin/core-chunks/chunk-HYIT7MF5.mjs +8 -0
  107. package/dist/bin/core-chunks/chunk-HYMJVHAX.mjs +13 -0
  108. package/dist/bin/core-chunks/chunk-ID2C2S33.mjs +18 -0
  109. package/dist/bin/core-chunks/chunk-ID5KE74L.mjs +7 -0
  110. package/dist/bin/core-chunks/chunk-IFLBZKKK.mjs +14 -0
  111. package/dist/bin/core-chunks/chunk-IMQCXC3R.mjs +30 -0
  112. package/dist/bin/core-chunks/chunk-INJ5WT2D.mjs +7 -0
  113. package/dist/bin/core-chunks/chunk-INM5COWM.mjs +7 -0
  114. package/dist/bin/core-chunks/chunk-IOFCSTGM.mjs +7 -0
  115. package/dist/bin/core-chunks/chunk-IVGWOY3U.mjs +8 -0
  116. package/dist/bin/core-chunks/chunk-J7T5IEFJ.mjs +15 -0
  117. package/dist/bin/core-chunks/chunk-JCWA7NLM.mjs +7 -0
  118. package/dist/bin/core-chunks/chunk-JPMUJY42.mjs +7 -0
  119. package/dist/bin/core-chunks/chunk-JT4RNQ67.mjs +15 -0
  120. package/dist/bin/core-chunks/chunk-K25HGTC3.mjs +10 -0
  121. package/dist/bin/core-chunks/chunk-KIRU4QFX.mjs +7 -0
  122. package/dist/bin/core-chunks/chunk-KKIJAEYU.mjs +7 -0
  123. package/dist/bin/core-chunks/chunk-KPR5TWSN.mjs +7 -0
  124. package/dist/bin/core-chunks/chunk-KUQLXY2P.mjs +11 -0
  125. package/dist/bin/core-chunks/chunk-KWC2PCPC.mjs +10 -0
  126. package/dist/bin/core-chunks/chunk-L4TUXFCL.mjs +7 -0
  127. package/dist/bin/core-chunks/chunk-L5LFLI4R.mjs +7 -0
  128. package/dist/bin/core-chunks/chunk-LZC6NGB6.mjs +50 -0
  129. package/dist/bin/core-chunks/chunk-MCY7OXED.mjs +10 -0
  130. package/dist/bin/core-chunks/chunk-MDONTD7O.mjs +21 -0
  131. package/dist/bin/core-chunks/chunk-MG3YN3AI.mjs +7 -0
  132. package/dist/bin/core-chunks/chunk-MR5XXHRK.mjs +8 -0
  133. package/dist/bin/core-chunks/chunk-MTDCRYLP.mjs +7 -0
  134. package/dist/bin/core-chunks/chunk-MXJKULJY.mjs +9 -0
  135. package/dist/bin/core-chunks/chunk-NINFE7GS.mjs +9 -0
  136. package/dist/bin/core-chunks/chunk-NNOX3UU4.mjs +7 -0
  137. package/dist/bin/core-chunks/chunk-NOHSLOLL.mjs +7 -0
  138. package/dist/bin/core-chunks/chunk-NXUIMC22.mjs +13 -0
  139. package/dist/bin/core-chunks/chunk-NZKUCQZK.mjs +8 -0
  140. package/dist/bin/core-chunks/chunk-O5N6XYPU.mjs +8 -0
  141. package/dist/bin/core-chunks/chunk-OIE3AKKO.mjs +7 -0
  142. package/dist/bin/core-chunks/chunk-OYXQRBVM.mjs +10 -0
  143. package/dist/bin/core-chunks/chunk-P2KU4FFA.mjs +11 -0
  144. package/dist/bin/core-chunks/chunk-P53YMOKR.mjs +7 -0
  145. package/dist/bin/core-chunks/chunk-PIA26GWG.mjs +7 -0
  146. package/dist/bin/core-chunks/chunk-PPERWRFS.mjs +13 -0
  147. package/dist/bin/core-chunks/chunk-PPSVWUXC.mjs +15 -0
  148. package/dist/bin/core-chunks/chunk-PWL3KS7Y.mjs +7 -0
  149. package/dist/bin/core-chunks/chunk-Q3LUL6LL.mjs +7 -0
  150. package/dist/bin/core-chunks/chunk-Q6C27OL7.mjs +7 -0
  151. package/dist/bin/core-chunks/chunk-QAIEAOJF.mjs +7 -0
  152. package/dist/bin/core-chunks/chunk-QLMZW4K7.mjs +7 -0
  153. package/dist/bin/core-chunks/chunk-QZ7T2EYR.mjs +25 -0
  154. package/dist/bin/core-chunks/chunk-R7LLMJDP.mjs +7 -0
  155. package/dist/bin/core-chunks/chunk-RACISWUV.mjs +10 -0
  156. package/dist/bin/core-chunks/chunk-RCIWCKL7.mjs +9 -0
  157. package/dist/bin/core-chunks/chunk-ROOCBUKH.mjs +8 -0
  158. package/dist/bin/core-chunks/chunk-RP7F67ZT.mjs +7 -0
  159. package/dist/bin/core-chunks/chunk-RXXXA7Z6.mjs +7 -0
  160. package/dist/bin/core-chunks/chunk-RXZJB43D.mjs +7 -0
  161. package/dist/bin/core-chunks/chunk-S6FBPXQL.mjs +9 -0
  162. package/dist/bin/core-chunks/chunk-SLYLGDX7.mjs +8 -0
  163. package/dist/bin/core-chunks/chunk-SO3ZPNWT.mjs +7 -0
  164. package/dist/bin/core-chunks/chunk-SRJEX6XF.mjs +12 -0
  165. package/dist/bin/core-chunks/chunk-SROBBOJB.mjs +11 -0
  166. package/dist/bin/core-chunks/chunk-TDTPDVUM.mjs +8 -0
  167. package/dist/bin/core-chunks/chunk-TGNZI4KF.mjs +28 -0
  168. package/dist/bin/core-chunks/chunk-TIBYHZFA.mjs +8 -0
  169. package/dist/bin/core-chunks/chunk-TILUQF6L.mjs +8 -0
  170. package/dist/bin/core-chunks/chunk-TTN2CFZC.mjs +7 -0
  171. package/dist/bin/core-chunks/chunk-U24YKPYX.mjs +7 -0
  172. package/dist/bin/core-chunks/chunk-U55OPVYR.mjs +9 -0
  173. package/dist/bin/core-chunks/chunk-UE3XKXWM.mjs +7 -0
  174. package/dist/bin/core-chunks/chunk-UHXV7MDW.mjs +12 -0
  175. package/dist/bin/core-chunks/chunk-UNNY2IWZ.mjs +9 -0
  176. package/dist/bin/core-chunks/chunk-UT425KVX.mjs +10 -0
  177. package/dist/bin/core-chunks/chunk-UYMZ3NAF.mjs +8 -0
  178. package/dist/bin/core-chunks/chunk-V3Y3G2DE.mjs +8 -0
  179. package/dist/bin/core-chunks/chunk-V5VCXMKO.mjs +52 -0
  180. package/dist/bin/core-chunks/chunk-V6L5PLD7.mjs +18 -0
  181. package/dist/bin/core-chunks/chunk-V7R3L54M.mjs +7 -0
  182. package/dist/bin/core-chunks/chunk-V7VA4EQX.mjs +7 -0
  183. package/dist/bin/core-chunks/chunk-VCSESVZ4.mjs +9 -0
  184. package/dist/bin/core-chunks/chunk-VCYVYFWE.mjs +9 -0
  185. package/dist/bin/core-chunks/chunk-VDXTMAMO.mjs +7 -0
  186. package/dist/bin/core-chunks/chunk-VILH3VYH.mjs +103 -0
  187. package/dist/bin/core-chunks/chunk-VRFYDYQY.mjs +7 -0
  188. package/dist/bin/core-chunks/chunk-VWFVSNQT.mjs +7 -0
  189. package/dist/bin/core-chunks/chunk-WGDE3L33.mjs +7 -0
  190. package/dist/bin/core-chunks/chunk-WP5IU4W4.mjs +7 -0
  191. package/dist/bin/core-chunks/chunk-WSVMQYYU.mjs +12 -0
  192. package/dist/bin/core-chunks/chunk-WTDUJB4I.mjs +8 -0
  193. package/dist/bin/core-chunks/chunk-WZXUFSVT.mjs +25 -0
  194. package/dist/bin/core-chunks/chunk-X35YYOFE.mjs +18 -0
  195. package/dist/bin/core-chunks/chunk-X4FR5S7E.mjs +9 -0
  196. package/dist/bin/core-chunks/chunk-XC6YAP36.mjs +7 -0
  197. package/dist/bin/core-chunks/chunk-XLFEWZRA.mjs +7 -0
  198. package/dist/bin/core-chunks/chunk-XPRLQIVQ.mjs +7 -0
  199. package/dist/bin/core-chunks/chunk-XSZG3CBO.mjs +7 -0
  200. package/dist/bin/core-chunks/chunk-XU3BQPBU.mjs +7 -0
  201. package/dist/bin/core-chunks/chunk-XYDLXF5A.mjs +8 -0
  202. package/dist/bin/core-chunks/chunk-Y5SEUYET.mjs +7 -0
  203. package/dist/bin/core-chunks/chunk-Y7XOKG4O.mjs +7 -0
  204. package/dist/bin/core-chunks/chunk-YEALP3WX.mjs +7 -0
  205. package/dist/bin/core-chunks/chunk-YJOC2JJK.mjs +12 -0
  206. package/dist/bin/core-chunks/chunk-YLYAYRSJ.mjs +8 -0
  207. package/dist/bin/core-chunks/chunk-YOGI4WE6.mjs +8 -0
  208. package/dist/bin/core-chunks/chunk-YQ6HM3YO.mjs +10 -0
  209. package/dist/bin/core-chunks/chunk-YZEO5DZA.mjs +7 -0
  210. package/dist/bin/core-chunks/chunk-ZBBNCCGV.mjs +12 -0
  211. package/dist/bin/core-chunks/chunk-ZHTYSYZC.mjs +7 -0
  212. package/dist/bin/core-chunks/chunk-ZK7BMUMR.mjs +7 -0
  213. package/dist/bin/core-chunks/chunk-ZKJZDOPT.mjs +14 -0
  214. package/dist/bin/core-chunks/chunk-ZQHSJ6FF.mjs +20 -0
  215. package/dist/bin/core-chunks/chunk-ZS7XJUPE.mjs +7 -0
  216. package/dist/bin/core-chunks/chunk-ZXTJLMVZ.mjs +7 -0
  217. package/dist/bin/core-chunks/cleanup-installs-WHXUGAHM.mjs +7 -0
  218. package/dist/bin/core-chunks/client-D43KKUYH.mjs +8 -0
  219. package/dist/bin/core-chunks/closest-command-YYNABM7V.mjs +7 -0
  220. package/dist/bin/core-chunks/cloud-FFUJZLDV.mjs +14 -0
  221. package/dist/bin/core-chunks/code-SU7GCPH6.mjs +12 -0
  222. package/dist/bin/core-chunks/code-graph-cloud-G3WQBICY.mjs +7 -0
  223. package/dist/bin/core-chunks/codex-hooks-GOLMCL2Q.mjs +7 -0
  224. package/dist/bin/core-chunks/codex-mcp-K4X2UIQF.mjs +7 -0
  225. package/dist/bin/core-chunks/codex-skill-3HNVU4T4.mjs +7 -0
  226. package/dist/bin/core-chunks/command-installer-XIQK2G6W.mjs +7 -0
  227. package/dist/bin/core-chunks/config-W3RHV3GK.mjs +8 -0
  228. package/dist/bin/core-chunks/config-manager-QVFHXIKI.mjs +7 -0
  229. package/dist/bin/core-chunks/content-bound-stamp-2PJNI4JC.mjs +7 -0
  230. package/dist/bin/core-chunks/context-4KGTUAC4.mjs +38 -0
  231. package/dist/bin/core-chunks/context-DDHC7VIC.mjs +10 -0
  232. package/dist/bin/core-chunks/context-checkpoint-4CEUPEVG.mjs +27 -0
  233. package/dist/bin/core-chunks/context-pressure-5URQVNBC.mjs +7 -0
  234. package/dist/bin/core-chunks/context-tiers-4S6H22NP.mjs +7 -0
  235. package/dist/bin/core-chunks/context7-service-AZWDYK5Z.mjs +7 -0
  236. package/dist/bin/core-chunks/core-PR5WEQCS.mjs +70 -0
  237. package/dist/bin/core-chunks/crew-JQCG6NS3.mjs +24 -0
  238. package/dist/bin/core-chunks/cursor-hooks-DGDJVAI6.mjs +7 -0
  239. package/dist/bin/core-chunks/custom-workflow-storage-EBEIG54R.mjs +7 -0
  240. package/dist/bin/core-chunks/cwd-changed-ODKZVSPB.mjs +7 -0
  241. package/dist/bin/core-chunks/cycle-budget-card-H37XRAIX.mjs +7 -0
  242. package/dist/bin/core-chunks/daemon-2NQTBFVR.mjs +13 -0
  243. package/dist/bin/core-chunks/database-UU2ZXSD4.mjs +7 -0
  244. package/dist/bin/core-chunks/delivery-geometry-GSJ6LXUC.mjs +7 -0
  245. package/dist/bin/core-chunks/detect-changes-2YIEX7AY.mjs +7 -0
  246. package/dist/bin/core-chunks/detection-KKDZYWVD.mjs +7 -0
  247. package/dist/bin/core-chunks/developer-evolution-AVAXGDKQ.mjs +11 -0
  248. package/dist/bin/core-chunks/developer-profile-MRPBWL2K.mjs +7 -0
  249. package/dist/bin/core-chunks/discuss-lock-CWXKBBYJ.mjs +7 -0
  250. package/dist/bin/core-chunks/distill-MLDZG5RA.mjs +7 -0
  251. package/dist/bin/core-chunks/doctor-heal-ZUZ2RHGY.mjs +7 -0
  252. package/dist/bin/core-chunks/doctor-service-WXLB2FEE.mjs +8 -0
  253. package/dist/bin/core-chunks/drift-refresh-XPJAO2B3.mjs +7 -0
  254. package/dist/bin/core-chunks/dynasty-outcomes-H2O546OL.mjs +11 -0
  255. package/dist/bin/core-chunks/editors-config-ELAQA6RV.mjs +7 -0
  256. package/dist/bin/core-chunks/embeddings-7A5Z5I67.mjs +7 -0
  257. package/dist/bin/core-chunks/enriched-recall-YXK7EIKH.mjs +7 -0
  258. package/dist/bin/core-chunks/eval-4YFUBFLV.mjs +76 -0
  259. package/dist/bin/core-chunks/exec-34V6SJYO.mjs +7 -0
  260. package/dist/bin/core-chunks/file-helper-LLQKU6YF.mjs +7 -0
  261. package/dist/bin/core-chunks/format-5V6GF6JJ.mjs +7 -0
  262. package/dist/bin/core-chunks/gemini-settings-ZTU3VQU3.mjs +7 -0
  263. package/dist/bin/core-chunks/git-context-ZSWE3KWM.mjs +8 -0
  264. package/dist/bin/core-chunks/git-helpers-UC53D4FT.mjs +7 -0
  265. package/dist/bin/core-chunks/grok-mcp-F3SRFMCW.mjs +7 -0
  266. package/dist/bin/core-chunks/grok-plugin-4CE2WUYI.mjs +7 -0
  267. package/dist/bin/core-chunks/grok-skill-GLSBOOKW.mjs +7 -0
  268. package/dist/bin/core-chunks/guard-FJBJ6IAE.mjs +13 -0
  269. package/dist/bin/core-chunks/guards-LFUFKVVH.mjs +7 -0
  270. package/dist/bin/core-chunks/handoff-storage-NGUA4Y2L.mjs +7 -0
  271. package/dist/bin/core-chunks/harness-FN3HASSA.mjs +43 -0
  272. package/dist/bin/core-chunks/health-W2VWME7Z.mjs +11 -0
  273. package/dist/bin/core-chunks/help-I37I3V2R.mjs +14 -0
  274. package/dist/bin/core-chunks/hooks-service-C2P5DRCH.mjs +91 -0
  275. package/dist/bin/core-chunks/infer-memory-file-ATP7PSAQ.mjs +7 -0
  276. package/dist/bin/core-chunks/install-XP4S6HWQ.mjs +9 -0
  277. package/dist/bin/core-chunks/judgment-GJE332LF.mjs +21 -0
  278. package/dist/bin/core-chunks/judgment-ledger-storage-ZTYXPMM4.mjs +7 -0
  279. package/dist/bin/core-chunks/judgment-orchestrator-E3SO3NVE.mjs +7 -0
  280. package/dist/bin/core-chunks/judgment-receipt-WT4EMCAV.mjs +7 -0
  281. package/dist/bin/core-chunks/kimi-hooks-2UEUIKXV.mjs +7 -0
  282. package/dist/bin/core-chunks/kimi-mcp-DJCXZ2JY.mjs +7 -0
  283. package/dist/bin/core-chunks/land-cue-5USQ64MS.mjs +8 -0
  284. package/dist/bin/core-chunks/land-rho-ISNVEPVC.mjs +8 -0
  285. package/dist/bin/core-chunks/land-synthesis-CHARJMUP.mjs +7 -0
  286. package/dist/bin/core-chunks/lean-L53CKZNH.mjs +34 -0
  287. package/dist/bin/core-chunks/legacy-crew-sweep-2TLKJTHI.mjs +23 -0
  288. package/dist/bin/core-chunks/living-context-contract-HZIVBMXX.mjs +7 -0
  289. package/dist/bin/core-chunks/llm-XMH7WTHV.mjs +18 -0
  290. package/dist/bin/core-chunks/mcp-FLVIZBV2.mjs +17 -0
  291. package/dist/bin/core-chunks/memory-dream-EJWI4FJO.mjs +14 -0
  292. package/dist/bin/core-chunks/memory-export-27HTNNFI.mjs +13 -0
  293. package/dist/bin/core-chunks/memory-index-BRZDZ2BY.mjs +7 -0
  294. package/dist/bin/core-chunks/notification-KJ4FQJAW.mjs +7 -0
  295. package/dist/bin/core-chunks/notify-76B7AICZ.mjs +9 -0
  296. package/dist/bin/core-chunks/nyquist-lite-A23B7G4B.mjs +9 -0
  297. package/dist/bin/core-chunks/one-breath-install-LVNIVN6S.mjs +7 -0
  298. package/dist/bin/core-chunks/opencode-mcp-5YSIYDI3.mjs +7 -0
  299. package/dist/bin/core-chunks/output-D27IOQXR.mjs +7 -0
  300. package/dist/bin/core-chunks/pack-integrity-GXN67LJB.mjs +9 -0
  301. package/dist/bin/core-chunks/pack-manager-46SPIPPD.mjs +7 -0
  302. package/dist/bin/core-chunks/package-DCGCOAGQ.mjs +7 -0
  303. package/dist/bin/core-chunks/package-legitimacy-VHHGI4P7.mjs +7 -0
  304. package/dist/bin/core-chunks/path-manager-E5DCU5LP.mjs +7 -0
  305. package/dist/bin/core-chunks/performance-tracker-BFBNR3LY.mjs +7 -0
  306. package/dist/bin/core-chunks/pi-skill-SDHTUK3V.mjs +7 -0
  307. package/dist/bin/core-chunks/planning-S3MYVWH6.mjs +8 -0
  308. package/dist/bin/core-chunks/post-edit-5YSNEMK7.mjs +7 -0
  309. package/dist/bin/core-chunks/pr-convention-37YHTUKM.mjs +7 -0
  310. package/dist/bin/core-chunks/pre-bash-GLDILCRF.mjs +10 -0
  311. package/dist/bin/core-chunks/pre-commit-U6HPPNIC.mjs +7 -0
  312. package/dist/bin/core-chunks/pre-edit-PEYQA6P6.mjs +8 -0
  313. package/dist/bin/core-chunks/pre-package-76JR5GLO.mjs +7 -0
  314. package/dist/bin/core-chunks/pre-search-5EHNUOP3.mjs +8 -0
  315. package/dist/bin/core-chunks/pre-secrets-RJELPDFY.mjs +7 -0
  316. package/dist/bin/core-chunks/precision-classifier-AV75OEVA.mjs +7 -0
  317. package/dist/bin/core-chunks/precision-judgment-MCX4MIIG.mjs +7 -0
  318. package/dist/bin/core-chunks/preferences-BTSYWYUM.mjs +31 -0
  319. package/dist/bin/core-chunks/primitives-IXAYLX7U.mjs +13 -0
  320. package/dist/bin/core-chunks/prjct-md-SUDFWDCS.mjs +7 -0
  321. package/dist/bin/core-chunks/product-KKGJ6MMF.mjs +68 -0
  322. package/dist/bin/core-chunks/project-agent-surfaces-I2CUZUIN.mjs +7 -0
  323. package/dist/bin/core-chunks/project-alignment-ADKW3ZWQ.mjs +17 -0
  324. package/dist/bin/core-chunks/project-file-inventory-XIHHJZUP.mjs +7 -0
  325. package/dist/bin/core-chunks/project-memory-GYLYIJQD.mjs +7 -0
  326. package/dist/bin/core-chunks/project-style-evolution-5W25UPPN.mjs +7 -0
  327. package/dist/bin/core-chunks/prompt-SW5XDRMX.mjs +23 -0
  328. package/dist/bin/core-chunks/protocol-4AJ4J5SI.mjs +7 -0
  329. package/dist/bin/core-chunks/provider-cache-IWVTFLGT.mjs +7 -0
  330. package/dist/bin/core-chunks/provider-status-HQUBKMH5.mjs +7 -0
  331. package/dist/bin/core-chunks/publish-helper-2T2EHM3V.mjs +7 -0
  332. package/dist/bin/core-chunks/purge-5EPJV25P.mjs +7 -0
  333. package/dist/bin/core-chunks/queue-storage-BKH5XX2E.mjs +7 -0
  334. package/dist/bin/core-chunks/registry-LK6IQ5UX.mjs +7 -0
  335. package/dist/bin/core-chunks/reliability-repair-JMPZWDD4.mjs +20 -0
  336. package/dist/bin/core-chunks/removed-verbs-EU3WPRNK.mjs +7 -0
  337. package/dist/bin/core-chunks/retention-S22T3SPT.mjs +7 -0
  338. package/dist/bin/core-chunks/retro-CLKOHAN6.mjs +13 -0
  339. package/dist/bin/core-chunks/review-risk-LLLBKUXT.mjs +12 -0
  340. package/dist/bin/core-chunks/run-recorder-EZQ32M55.mjs +7 -0
  341. package/dist/bin/core-chunks/safe-artifacts-RW5WQUUJ.mjs +9 -0
  342. package/dist/bin/core-chunks/sdd-HE7O6N5S.mjs +9 -0
  343. package/dist/bin/core-chunks/seed-JX7W53E5.mjs +10 -0
  344. package/dist/bin/core-chunks/self-heal-DFUEKNF3.mjs +7 -0
  345. package/dist/bin/core-chunks/session-continuity-BFSW4OL6.mjs +10 -0
  346. package/dist/bin/core-chunks/session-start-HVYUKJL2.mjs +7 -0
  347. package/dist/bin/core-chunks/session-tracker-RG2FBWMS.mjs +7 -0
  348. package/dist/bin/core-chunks/settings-installer-4XHM3HAZ.mjs +7 -0
  349. package/dist/bin/core-chunks/setup-GHS24ER5.mjs +140 -0
  350. package/dist/bin/core-chunks/setup-J4JFYT63.mjs +38 -0
  351. package/dist/bin/core-chunks/shipping-I4D4AVTE.mjs +12 -0
  352. package/dist/bin/core-chunks/signals-digest-V44KYN6Z.mjs +7 -0
  353. package/dist/bin/core-chunks/skill-adherence-MHY4BZL4.mjs +13 -0
  354. package/dist/bin/core-chunks/skill-generator-LKS5BNMY.mjs +7 -0
  355. package/dist/bin/core-chunks/skill-index-L4UWQCQE.mjs +11 -0
  356. package/dist/bin/core-chunks/spec-2XXPLHUZ.mjs +27 -0
  357. package/dist/bin/core-chunks/spec-context-inference-THFMXC7S.mjs +9 -0
  358. package/dist/bin/core-chunks/spec-inventory-2TT7BTFZ.mjs +9 -0
  359. package/dist/bin/core-chunks/spec-service-I23KJKKP.mjs +7 -0
  360. package/dist/bin/core-chunks/spec-task-breakdown-HTG6ME6G.mjs +7 -0
  361. package/dist/bin/core-chunks/state-storage-6CGFWW5D.mjs +7 -0
  362. package/dist/bin/core-chunks/stdin-spill-Y2A6WOOW.mjs +7 -0
  363. package/dist/bin/core-chunks/stop-2H57XCGZ.mjs +15 -0
  364. package/dist/bin/core-chunks/subagent-start-5LPASXOS.mjs +7 -0
  365. package/dist/bin/core-chunks/subagent-stop-ANLSG3KN.mjs +7 -0
  366. package/dist/bin/core-chunks/surface-attribution-WL7S53XX.mjs +7 -0
  367. package/dist/bin/core-chunks/symbol-graph-PCS43SHZ.mjs +7 -0
  368. package/dist/bin/core-chunks/sync-analyzer-M37Q4LE4.mjs +7 -0
  369. package/dist/bin/core-chunks/sync-client-6TAOTJWR.mjs +7 -0
  370. package/dist/bin/core-chunks/sync-cursor-storage-GKO4X2QN.mjs +18 -0
  371. package/dist/bin/core-chunks/task-orchestration-GS4J4KGS.mjs +7 -0
  372. package/dist/bin/core-chunks/task-overview-XSMK7YEN.mjs +7 -0
  373. package/dist/bin/core-chunks/task-service-FK7FC3PE.mjs +7 -0
  374. package/dist/bin/core-chunks/tdd-NQDHU62B.mjs +9 -0
  375. package/dist/bin/core-chunks/team-XZ4Q6UBV.mjs +42 -0
  376. package/dist/bin/core-chunks/template-loader-33OVJ4G5.mjs +7 -0
  377. package/dist/bin/core-chunks/token-backfill-WPXXD5MP.mjs +12 -0
  378. package/dist/bin/core-chunks/token-economics-JZAQJUET.mjs +7 -0
  379. package/dist/bin/core-chunks/transcript-jsonl-OC7TH4Q3.mjs +7 -0
  380. package/dist/bin/core-chunks/trust-boundary-24F662RM.mjs +7 -0
  381. package/dist/bin/core-chunks/uninstall-6NFON7FO.mjs +13 -0
  382. package/dist/bin/core-chunks/update-4IE6SA6M.mjs +11 -0
  383. package/dist/bin/core-chunks/update-checker-FK7MWNWN.mjs +7 -0
  384. package/dist/bin/core-chunks/usefulness-A3GRKFL3.mjs +7 -0
  385. package/dist/bin/core-chunks/user-home-BODIAXR4.mjs +7 -0
  386. package/dist/bin/core-chunks/vault-retire-notice-FDRT7BJG.mjs +8 -0
  387. package/dist/bin/core-chunks/velocity-storage-5T7RYOWH.mjs +7 -0
  388. package/dist/bin/core-chunks/verb-names-QWGYABFH.mjs +7 -0
  389. package/dist/bin/core-chunks/version-252QLBN2.mjs +7 -0
  390. package/dist/bin/core-chunks/watch-service-7ZERG7RC.mjs +9 -0
  391. package/dist/bin/core-chunks/weak-frontier-demo-5C4FR3OA.mjs +7 -0
  392. package/dist/bin/core-chunks/weak-model-mode-DH66XMD2.mjs +7 -0
  393. package/dist/bin/core-chunks/work-graph-JGJWE3AV.mjs +16 -0
  394. package/dist/bin/core-chunks/work-graph-WHMCFN6U.mjs +7 -0
  395. package/dist/bin/core-chunks/work-scope-3LXOEIUX.mjs +7 -0
  396. package/dist/bin/core-chunks/workflow-FGJVLRQ3.mjs +61 -0
  397. package/dist/bin/core-chunks/workflows-reference-UWKRZ6BJ.mjs +7 -0
  398. package/dist/bin/core-chunks/workspace-occupancy-JUXKZBUZ.mjs +7 -0
  399. package/dist/bin/core-chunks/worktree-service-YRRPFU57.mjs +11 -0
  400. package/dist/bin/core-chunks/world-model-impact-RH5WH2B3.mjs +7 -0
  401. package/dist/bin/hook-chunks/{agent-switch-I4MTVE56.mjs → agent-switch-7GOGG4KG.mjs} +1 -1
  402. package/dist/bin/hook-chunks/{analysis-VN7APBHR.mjs → analysis-UI2JRLJO.mjs} +2 -2
  403. package/dist/bin/hook-chunks/{auto-flush-DX3FVSQE.mjs → auto-flush-JKIXTI2I.mjs} +1 -1
  404. package/dist/bin/hook-chunks/{capture-gate-MEIQD7ZS.mjs → capture-gate-DIPHPNIC.mjs} +1 -1
  405. package/dist/bin/hook-chunks/chunk-25OGCQTR.mjs +69 -0
  406. package/dist/bin/hook-chunks/{chunk-OLQAMCYV.mjs → chunk-63P5VOR6.mjs} +5 -5
  407. package/dist/bin/hook-chunks/{chunk-EI6VQZOX.mjs → chunk-6LU777GI.mjs} +1 -1
  408. package/dist/bin/hook-chunks/chunk-6NMHVPAI.mjs +35 -0
  409. package/dist/bin/hook-chunks/{chunk-3AHW4XQH.mjs → chunk-6RS7PNAN.mjs} +1 -1
  410. package/dist/bin/hook-chunks/{chunk-ZZBNFNMG.mjs → chunk-6WDRJ7J7.mjs} +1 -1
  411. package/dist/bin/hook-chunks/{chunk-PVCEWFHS.mjs → chunk-7PA4KPSR.mjs} +2 -2
  412. package/dist/bin/hook-chunks/{chunk-EXVL2OFE.mjs → chunk-A6LRNS6R.mjs} +1 -1
  413. package/dist/bin/hook-chunks/{chunk-IJ523YO2.mjs → chunk-AEDB75AK.mjs} +1 -1
  414. package/dist/bin/hook-chunks/chunk-AFGXKRRP.mjs +12 -0
  415. package/dist/bin/hook-chunks/{chunk-LF3S3MYE.mjs → chunk-ANSRNEEI.mjs} +1 -1
  416. package/dist/bin/hook-chunks/{chunk-YLOK4WRR.mjs → chunk-B2ZA5ZAO.mjs} +1 -1
  417. package/dist/bin/hook-chunks/{chunk-KDNUQPAK.mjs → chunk-B7MHIUFA.mjs} +1 -1
  418. package/dist/bin/hook-chunks/{chunk-RT2DFIWF.mjs → chunk-F3PNT2DQ.mjs} +2 -2
  419. package/dist/bin/hook-chunks/{chunk-XYKVWO23.mjs → chunk-FBEDUKMG.mjs} +1 -1
  420. package/dist/bin/hook-chunks/{chunk-DB226JIV.mjs → chunk-GER6HFWV.mjs} +1 -1
  421. package/dist/bin/hook-chunks/{chunk-NLL5AV2G.mjs → chunk-HNZ24HIK.mjs} +2 -2
  422. package/dist/bin/hook-chunks/{chunk-LR24AIEW.mjs → chunk-IDPBMN3Q.mjs} +1 -1
  423. package/dist/bin/hook-chunks/{chunk-EGCYDLSO.mjs → chunk-IFIENAZU.mjs} +1 -1
  424. package/dist/bin/hook-chunks/{chunk-KV4NXLPT.mjs → chunk-IHEOOJJT.mjs} +1 -1
  425. package/dist/bin/hook-chunks/{chunk-H2DGDAQP.mjs → chunk-IL36ER4U.mjs} +1 -1
  426. package/dist/bin/hook-chunks/{chunk-33BHU4OM.mjs → chunk-JF6DFOQK.mjs} +1 -1
  427. package/dist/bin/hook-chunks/{chunk-LQLCYBFF.mjs → chunk-KOLXYWOA.mjs} +2 -2
  428. package/dist/bin/hook-chunks/{chunk-XV2LJVYB.mjs → chunk-MIJZT4ZR.mjs} +1 -1
  429. package/dist/bin/hook-chunks/{chunk-SWJ7TLBD.mjs → chunk-NMB6YSAH.mjs} +1 -1
  430. package/dist/bin/hook-chunks/{chunk-Y3RHBU2R.mjs → chunk-NSTXHVTH.mjs} +2 -2
  431. package/dist/bin/hook-chunks/{chunk-ADYTBOCZ.mjs → chunk-ONGVBXBD.mjs} +1 -1
  432. package/dist/bin/hook-chunks/{chunk-7PBWIO4K.mjs → chunk-PFORBQBF.mjs} +2 -2
  433. package/dist/bin/hook-chunks/{chunk-WL6PKX3U.mjs → chunk-PQJ64L6U.mjs} +1 -1
  434. package/dist/bin/hook-chunks/{chunk-FZS3XGEA.mjs → chunk-RLKYEL3F.mjs} +1 -1
  435. package/dist/bin/hook-chunks/{chunk-WJV24WE6.mjs → chunk-UBWUQ64A.mjs} +1 -1
  436. package/dist/bin/hook-chunks/{chunk-64ZEBHDX.mjs → chunk-UI25YRTY.mjs} +1 -1
  437. package/dist/bin/hook-chunks/{chunk-YHOZTAZH.mjs → chunk-V6GGH6H5.mjs} +1 -1
  438. package/dist/bin/hook-chunks/chunk-WIA6ORIY.mjs +16 -0
  439. package/dist/bin/hook-chunks/{chunk-UVATSTRF.mjs → chunk-XXVHUYL7.mjs} +1 -1
  440. package/dist/bin/hook-chunks/{chunk-E7NA34VQ.mjs → chunk-Y7RDBMNC.mjs} +1 -1
  441. package/dist/bin/hook-chunks/{chunk-JZDZH6IV.mjs → chunk-YATXTHDL.mjs} +1 -1
  442. package/dist/bin/hook-chunks/{chunk-DCHIPMOG.mjs → chunk-ZF2EVMY7.mjs} +1 -1
  443. package/dist/bin/hook-chunks/{chunk-MW54MTLB.mjs → chunk-ZH2MF7H7.mjs} +1 -1
  444. package/dist/bin/hook-chunks/{chunk-ZQI4TJ5C.mjs → chunk-ZXON2U5F.mjs} +1 -1
  445. package/dist/bin/hook-chunks/{codex-skill-6CRFUF3A.mjs → codex-skill-UZZCACMB.mjs} +1 -1
  446. package/dist/bin/hook-chunks/{command-installer-MUHZWDZA.mjs → command-installer-FJ73C2ZW.mjs} +1 -1
  447. package/dist/bin/hook-chunks/{config-manager-2JJPCLKC.mjs → config-manager-XDKOTIJM.mjs} +1 -1
  448. package/dist/bin/hook-chunks/{cwd-changed-UTD6Y4MS.mjs → cwd-changed-STP3LH6Y.mjs} +1 -1
  449. package/dist/bin/hook-chunks/{distill-5TNAM3LY.mjs → distill-63BHUJAC.mjs} +1 -1
  450. package/dist/bin/hook-chunks/{enriched-recall-6VOIUNLN.mjs → enriched-recall-6F6LBYAB.mjs} +1 -1
  451. package/dist/bin/hook-chunks/{format-IIOFTSBF.mjs → format-VJ2YQ4XQ.mjs} +1 -1
  452. package/dist/bin/hook-chunks/{judgment-receipt-QLV3MYFT.mjs → judgment-receipt-LSJCAYBT.mjs} +1 -1
  453. package/dist/bin/hook-chunks/{land-cue-57B23PEL.mjs → land-cue-DEO2AZW4.mjs} +1 -1
  454. package/dist/bin/hook-chunks/{land-synthesis-ZVPFJERV.mjs → land-synthesis-GTMFIGDM.mjs} +1 -1
  455. package/dist/bin/hook-chunks/{legacy-crew-sweep-GR6HRSHX.mjs → legacy-crew-sweep-QPKU7ITU.mjs} +2 -2
  456. package/dist/bin/hook-chunks/{memory-index-XE2MWKQS.mjs → memory-index-KCMXQGKX.mjs} +1 -1
  457. package/dist/bin/hook-chunks/{notification-GU2ZJP5K.mjs → notification-DX6ZHOUC.mjs} +1 -1
  458. package/dist/bin/hook-chunks/{pack-integrity-WV5U3AFF.mjs → pack-integrity-UMLIB5RQ.mjs} +1 -1
  459. package/dist/bin/hook-chunks/{pack-manager-QLFQKP24.mjs → pack-manager-YXRK2TJ4.mjs} +1 -1
  460. package/dist/bin/hook-chunks/{planning-VPAX5DZL.mjs → planning-JR7O5MYW.mjs} +2 -2
  461. package/dist/bin/hook-chunks/{post-edit-UXCFSR3Y.mjs → post-edit-IPTVSRVG.mjs} +1 -1
  462. package/dist/bin/hook-chunks/{pre-bash-MB4JNNYG.mjs → pre-bash-5WWTH36N.mjs} +1 -1
  463. package/dist/bin/hook-chunks/{pre-commit-U7TRFKWX.mjs → pre-commit-KZ5TNTPW.mjs} +1 -1
  464. package/dist/bin/hook-chunks/{pre-edit-MDCQXI5F.mjs → pre-edit-XHPYBXRU.mjs} +1 -1
  465. package/dist/bin/hook-chunks/{pre-package-A6ZI5R64.mjs → pre-package-U3HDW3SX.mjs} +1 -1
  466. package/dist/bin/hook-chunks/{pre-search-ZZO3LGXJ.mjs → pre-search-R5CRK66E.mjs} +1 -1
  467. package/dist/bin/hook-chunks/{prjct-md-MS52YLI2.mjs → prjct-md-IBQTJBK7.mjs} +1 -1
  468. package/dist/bin/hook-chunks/{project-agent-surfaces-6AIW7KL6.mjs → project-agent-surfaces-TPZO73ZV.mjs} +1 -1
  469. package/dist/bin/hook-chunks/{project-memory-UDH56VFP.mjs → project-memory-YQLZX5RG.mjs} +1 -1
  470. package/dist/bin/hook-chunks/{project-style-evolution-IJXT2MCP.mjs → project-style-evolution-NOFCIIZZ.mjs} +1 -1
  471. package/dist/bin/hook-chunks/{prompt-7VZLYONO.mjs → prompt-DJWONMTZ.mjs} +2 -2
  472. package/dist/bin/hook-chunks/{purge-N2WN6NDB.mjs → purge-5W3K2MZL.mjs} +1 -1
  473. package/dist/bin/hook-chunks/{retention-RET4P2RO.mjs → retention-GWJ4AX7I.mjs} +1 -1
  474. package/dist/bin/hook-chunks/{sdd-PB6WKSLE.mjs → sdd-GWBRD4KI.mjs} +1 -1
  475. package/dist/bin/hook-chunks/{session-continuity-BIJXMN44.mjs → session-continuity-VH645RGR.mjs} +1 -1
  476. package/dist/bin/hook-chunks/{session-start-R2VMKW2L.mjs → session-start-4TYTI27B.mjs} +1 -1
  477. package/dist/bin/hook-chunks/{setup-PPIZHVXS.mjs → setup-VF4UHUBX.mjs} +2 -2
  478. package/dist/bin/hook-chunks/{shipping-C637PCOF.mjs → shipping-2ULWBGRX.mjs} +4 -4
  479. package/dist/bin/hook-chunks/{spec-context-inference-RTTDOZZO.mjs → spec-context-inference-HVENYOIO.mjs} +1 -1
  480. package/dist/bin/hook-chunks/{spec-service-ENLAAMVL.mjs → spec-service-4XGQQPGP.mjs} +2 -2
  481. package/dist/bin/hook-chunks/{spec-task-breakdown-RUDEP3AY.mjs → spec-task-breakdown-JXF556UH.mjs} +1 -1
  482. package/dist/bin/hook-chunks/{state-storage-AJUPG7J5.mjs → state-storage-EMWLIFQJ.mjs} +1 -1
  483. package/dist/bin/hook-chunks/{stop-DPXAWJFN.mjs → stop-NJDYIIXR.mjs} +2 -2
  484. package/dist/bin/hook-chunks/{subagent-start-AFHPXL2S.mjs → subagent-start-2YMGD4SY.mjs} +1 -1
  485. package/dist/bin/hook-chunks/{subagent-stop-5BMV63ML.mjs → subagent-stop-4TZJ2NSJ.mjs} +1 -1
  486. package/dist/bin/hook-chunks/{surface-attribution-EGIKCVMF.mjs → surface-attribution-UNK4J5W2.mjs} +1 -1
  487. package/dist/bin/hook-chunks/{task-overview-F3GB77OA.mjs → task-overview-P3VRH2FD.mjs} +1 -1
  488. package/dist/bin/hook-chunks/{task-service-FZABHPFV.mjs → task-service-SPUES5DO.mjs} +1 -1
  489. package/dist/bin/hook-chunks/{tdd-TAMBOPN3.mjs → tdd-MYF7I5FS.mjs} +1 -1
  490. package/dist/bin/hook-chunks/{template-loader-MXOMU4XH.mjs → template-loader-4SYVR2UB.mjs} +1 -1
  491. package/dist/bin/hook-chunks/{weak-model-mode-BMSPGEQY.mjs → weak-model-mode-TYJJT6JJ.mjs} +1 -1
  492. package/dist/bin/hook-chunks/{work-scope-YCS4GTXW.mjs → work-scope-A6XPENFE.mjs} +1 -1
  493. package/dist/bin/hook-chunks/{workspace-occupancy-JOBYNNXV.mjs → workspace-occupancy-3NEAXILW.mjs} +1 -1
  494. package/dist/bin/prjct-core.mjs +9 -3323
  495. package/dist/bin/prjct-hooks.mjs +1 -1
  496. package/dist/bin/prjct.mjs +7 -1
  497. package/dist/daemon/entry.mjs +514 -513
  498. package/dist/mcp/server.mjs +234 -233
  499. package/package.json +3 -2
  500. package/dist/bin/hook-chunks/chunk-3UB6SFRA.mjs +0 -11
  501. package/dist/bin/hook-chunks/chunk-D7DQABWO.mjs +0 -35
  502. package/dist/bin/hook-chunks/chunk-M4YM7Z3F.mjs +0 -69
  503. package/dist/bin/hook-chunks/chunk-TB57OYGW.mjs +0 -16
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{f as p,i as b}from"./chunk-DMO3ZFUG.mjs";import{d as f,p as S}from"./chunk-HYIT7MF5.mjs";import{a as o}from"./chunk-3TRXQAU4.mjs";b();S();import a from"node:path";var g="file-inventory",m=/^(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|composer\.lock|Cargo\.lock|poetry\.lock|CHANGELOG(\.md)?|LICENSE(\.md)?|\.DS_Store)$/i,x=/(^|\/)(node_modules|dist|build|\.git|coverage|\.next|target|vendor)(\/|$)/i,y=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".woff",".woff2",".ttf",".eot",".mp4",".mp3",".zip",".gz",".tar",".wasm",".exe",".dll",".so",".dylib",".bin",".pdf",".ico"]),v={".ts":"TypeScript",".tsx":"TypeScript",".js":"JavaScript",".jsx":"JavaScript",".mjs":"JavaScript",".cjs":"JavaScript",".vue":"Vue",".svelte":"Svelte",".py":"Python",".go":"Go",".rs":"Rust",".java":"Java",".kt":"Kotlin",".kts":"Kotlin",".swift":"Swift",".rb":"Ruby",".php":"PHP",".cs":"C#",".fs":"F#",".cpp":"C++",".cc":"C++",".c":"C",".h":"C/C++",".hpp":"C++",".m":"Objective-C",".mm":"Objective-C++",".scala":"Scala",".clj":"Clojure",".ex":"Elixir",".exs":"Elixir",".erl":"Erlang",".hs":"Haskell",".lua":"Lua",".r":"R",".dart":"Dart",".sql":"SQL",".graphql":"GraphQL",".gql":"GraphQL",".proto":"Protobuf",".md":"Markdown",".mdx":"MDX",".json":"JSON",".yml":"YAML",".yaml":"YAML",".toml":"TOML",".css":"CSS",".scss":"SCSS",".sass":"Sass",".less":"Less",".html":"HTML",".htm":"HTML",".sh":"Shell",".bash":"Shell",".zsh":"Shell",".ps1":"PowerShell",".swiftui":"Swift"};async function h(e,n={}){let t=(await f(e,{skipDotfiles:!0,maxFiles:n.maxFiles??5e4})).filter(l=>{if(x.test(l))return!1;let u=a.basename(l);if(m.test(u))return!1;let c=a.extname(u).toLowerCase();return!!(c&&c!=="."&&!y.has(c))}),r=t.reduce((l,u)=>{let c=a.extname(a.basename(u)).toLowerCase();return l[c]=(l[c]??0)+1,l},Object.create(null)),i=j(r);return{extensions:r,languages:i,fileCount:t.length,builtAt:new Date().toISOString(),projectHint:a.basename(e)}}o(h,"buildFileInventory");function j(e){let n=new Set,s=Object.entries(e).sort((t,r)=>r[1]-t[1]);for(let[t]of s){let r=v[t];r&&n.add(r)}return[...n]}o(j,"languagesFromExtensions");function C(e,n){p.setDoc(e,g,n)}o(C,"saveFileInventory");function d(e){try{return p.getDoc(e,g)}catch{return null}}o(d,"loadFileInventory");async function L(e,n){let s=await h(n);return C(e,s),s}o(L,"refreshFileInventory");function E(e){let n=d(e);return n?.extensions?new Set(Object.keys(n.extensions).map(s=>s.toLowerCase())):new Set}o(E,"inventoryExtensions");function k(e,n,s={}){let t=n.replace(/^\.\//,"").replace(/\\/g,"/").trim();if(!t||x.test(t))return!1;let r=t.split("/").pop()??t;if(m.test(r))return!1;let i=a.extname(r).toLowerCase();return i?!y.has(i):t.includes("/")}o(k,"pathMatchesInventory");function O(e,n){let s=n.replace(/^\.\//,"").replace(/\\/g,"/").trim(),t=s.split("/").pop()??s,r=a.extname(t).toLowerCase();if(!r)return .7;let i=E(e);return i.size===0||i.has(r)?1:.45}o(O,"inventoryPathWeight");function P(e){if(!e||Object.keys(e.extensions).length===0)return"File inventory: empty \u2014 run `prjct sync` to discover languages/extensions.";let n=Object.entries(e.extensions).sort((t,r)=>r[1]-t[1]).slice(0,12).map(([t,r])=>`${t}\xD7${r}`).join(" "),s=e.languages.length>0?e.languages.join(", "):"unknown";return`File inventory: ${e.fileCount} files \xB7 langs: ${s} \xB7 ${n}`}o(P,"formatInventorySummary");export{g as a,h as b,j as c,C as d,d as e,L as f,E as g,k as h,O as i,P as j};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{c as p,d as l,e as f}from"./chunk-YJOC2JJK.mjs";import{a as r}from"./chunk-3TRXQAU4.mjs";import{existsSync as h}from"node:fs";import u from"node:path";var m=/[a-zA-Z0-9_./-]+\.[a-zA-Z]+/,S=/[a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+\/?/,_=/[a-zA-Z0-9_./-]+\//,g=/\b(SHALL|MUST)\b/i,v=12;function d(e){let t=e.match(m)??e.match(S)??e.match(_);return t?t[0]:null}r(d,"parseScopePath");function C(e){let t=[];for(let s of e){let n=d(s);if(n&&!t.includes(n)&&t.push(n),t.length>=v)break}return t}r(C,"parseScopePaths");function E(e){let t=e.replace(/\s+/g," ").trim();return t.length>72?`${t.slice(0,72)}\u2026`:t}r(E,"brief");function L(e,t){let s=f(e.delta_log);for(let[n,i]of s){g.test(i)||t.push(`requirement "${n}" has no SHALL-style statement`);let o=e.scenarios[n]??[];o.length===0&&t.push(`requirement "${n}" has no scenarios`);for(let c of o){let a=[];c.given.length===0&&a.push("GIVEN"),c.when.length===0&&a.push("WHEN"),c.then.length===0&&a.push("THEN"),a.length>0&&t.push(`scenario "${c.name}" (requirement "${n}") is missing ${a.join("/")}`)}}}r(L,"validateRequirements");function A(e,t){let s=new Set;for(let n of p(e.delta_log)){let i=new Set([...n.ops.added,...n.ops.modified].map(o=>o.slug));for(let o of n.ops.removed)!s.has(o)&&!i.has(o)&&t.push(`delta_log entry "${n.id}" REMOVES requirement "${o}" that never existed`);for(let o of i)s.add(o);for(let o of n.ops.removed)s.delete(o)}}r(A,"validateDeltaLog");function P(e,t){let s=l(e.delta_log),n=e.acceptance_criteria.filter(i=>!s.has(i));e.delta_log.length===0&&n.length>0&&t.push("legacy spec: free-text acceptance criteria with no delta_log/scenarios \u2014 re-derive via `prjct spec apply-delta` to harden");for(let i of n)g.test(i)||t.push(`acceptance criterion is not SHALL-style: "${E(i)}"`)}r(P,"validateLegacy");function $(e,t,s){let n=new Set;for(let i of e.scope){let o=d(i);!o||n.has(o)||(n.add(o),h(u.resolve(t,o))||s.push(`scope path does not resolve in the project: ${o}`))}}r($,"validateScopePaths");function w(e,t={}){let s=[],n=[];return L(e.content,s),A(e.content,s),P(e.content,n),t.projectPath&&$(e.content,t.projectPath,n),{errors:s,warnings:n}}r(w,"validateSpec");function H(e){return[...e.errors.map(t=>`- ERROR: ${t}`),...e.warnings.map(t=>`- warning: ${t}`)]}r(H,"formatValidationLines");export{d as a,C as b,w as c,H as d};
@@ -0,0 +1,9 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as S}from"./chunk-E5QQDYBR.mjs";import{a as c,b as g}from"./chunk-B7AQHL7B.mjs";import{a as m}from"./chunk-L4TUXFCL.mjs";import{f as p,i as D}from"./chunk-DMO3ZFUG.mjs";import{e as d,f as l,l as b}from"./chunk-HU5ERAAV.mjs";import{a as o}from"./chunk-3TRXQAU4.mjs";import{z as e}from"zod";var F=e.enum(["feature","fix","improvement","refactor"]),E=e.enum(["pass","warning","fail","skipped"]),_=e.enum(["added","changed","fixed","removed"]),v=e.object({hours:e.number(),minutes:e.number(),totalMinutes:e.number()}),O=e.object({filesChanged:e.number().nullable().optional(),linesAdded:e.number().nullable().optional(),linesRemoved:e.number().nullable().optional(),commits:e.number().nullable().optional()}),A=e.object({description:e.string(),type:_.optional()}),C=e.object({lintStatus:E.nullable().optional(),lintDetails:e.string().optional(),testStatus:E.nullable().optional(),testDetails:e.string().optional()}),T=e.object({hash:e.string().optional(),message:e.string().optional(),branch:e.string().optional()}),I=e.object({id:e.string(),name:e.string(),version:e.string().nullable().optional(),type:F,agent:e.string().optional(),description:e.string().optional(),changes:e.array(A).optional(),codeSnippets:e.array(e.string()).optional(),commit:T.optional(),codeMetrics:O.optional(),qualityMetrics:C.optional(),quantitativeImpact:e.string().optional(),duration:v.optional(),tasksCompleted:e.number().nullable().optional(),shippedAt:e.string(),featureId:e.string().optional()}),y=e.object({shipped:e.array(I),lastUpdated:e.string()});b();D();var f="shipped:backfilled:v1";function r(a){let s={...(()=>{if(!a.data)return{};try{return JSON.parse(a.data)}catch{return{}}})(),id:a.id,name:a.name,shippedAt:a.shipped_at,version:a.version};return a.description!=null&&(s.description=a.description),a.type!=null&&(s.type=a.type),a.duration!=null&&(s.duration=a.duration),s}o(r,"rowToFeature");var u=class extends S{static{o(this,"ShippedStorage")}constructor(){super("shipped.json",y)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(t){return`shipped.${t}d`}async getAll(t){return p.query(t,"SELECT * FROM shipped_features ORDER BY shipped_at DESC").map(r)}async republishShips(t){if(p.getDoc(t,f))return 0;let s=await this.getAll(t);for(let i of s)await this.publishEvent(t,"shipped_item.created",{id:i.id,shipId:i.id,name:i.name,version:i.version,shippedAt:i.shippedAt});return p.setDoc(t,f,{at:d(),count:s.length}),s.length}async getRecent(t,s=5){return p.query(t,"SELECT * FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",s).map(r)}async addShipped(t,s,i){let n={...s,id:m(),shippedAt:i||d()};if(p.run(t,`INSERT OR IGNORE INTO shipped_features
8
+ (id, name, shipped_at, version, description, type, duration, data)
9
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,n.id,n.name,n.shippedAt,n.version??"",n.description??null,n.type??null,n.duration??null,JSON.stringify(n)).changes===0){let h=p.get(t,"SELECT * FROM shipped_features WHERE name = ? AND version = ? AND shipped_at = ?",n.name,n.version??"",n.shippedAt);return h?r(h):n}return await this.publishEvent(t,"shipped_item.created",{id:n.id,shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(t,s){let i=p.get(t,"SELECT * FROM shipped_features WHERE version = ? ORDER BY shipped_at DESC LIMIT 1",s);return i?r(i):void 0}async getCount(t){return p.get(t,"SELECT COUNT(*) AS c FROM shipped_features")?.c??0}async getByDateRange(t,s,i){return p.query(t,"SELECT * FROM shipped_features WHERE shipped_at >= ? AND shipped_at <= ? ORDER BY shipped_at DESC",s.toISOString(),i.toISOString()).map(r)}async getStats(t,s="month"){let i=new Date,n=s==="week"?new Date(i.getTime()-10080*60*1e3):s==="month"?new Date(i.getFullYear(),i.getMonth(),1):new Date(i.getFullYear(),0,1);return{count:(await this.getByDateRange(t,n,i)).length,period:s}}async archiveOldShipped(t){let s=l(c.SHIPPED_RETENTION_DAYS).toISOString(),i=p.query(t,"SELECT * FROM shipped_features WHERE shipped_at < ? ORDER BY shipped_at DESC",s).map(r);return i.length===0?0:(g.archiveMany(t,i.map(n=>({entityType:"shipped",entityId:n.id,entityData:n,summary:`${n.name} v${n.version}`,reason:"age"}))),p.run(t,"DELETE FROM shipped_features WHERE shipped_at < ?",s),await this.publishEvent(t,"shipped.archived",{count:i.length,oldestShippedAt:i[i.length-1]?.shippedAt}),i.length)}},Y=new u;export{Y as a};
@@ -0,0 +1,9 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a}from"./chunk-3TRXQAU4.mjs";var r={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},vault:{replacement:"prjct search / prjct context memory / MCP prjct_*",note:"The Obsidian/markdown vault was removed. Agents read project knowledge through tools now."},regen:{replacement:"prjct sync --full",note:"The vault it regenerated was removed; there is nothing left to rebuild."}};function n(e){return Object.hasOwn(r,e)}a(n,"isRemovedVerb");function s(e){let t=r[e];return t?`'prjct ${e}' was removed in v2.
8
+ \u2192 Use: ${t.replacement}
9
+ ${t.note}`:null}a(s,"migrationMessage");export{r as a,n as b,s as c};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as r,e as o}from"./chunk-56FW4P6U.mjs";import{a as i}from"./chunk-3TRXQAU4.mjs";var s=8;function g(n,t,e=s){return o(r(n,t,e).files)}i(g,"rankLikelyFiles");function u(n){let t=n.signals.length>0?` (${n.signals.join("+")})`:"";return`\`${n.path}\` \u2014 ${n.reason}${t}`}i(u,"formatLikelyFileForAgent");function c(n,t){let e=r(n,t,s);return e.files.length===0?null:e.agentBlock||null}i(c,"buildIndexedFileCue");export{g as a,u as b,c};
@@ -0,0 +1,103 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as ze,b as qe}from"./chunk-SRJEX6XF.mjs";import{a as Ve,b as Je}from"./chunk-EFSPBB4S.mjs";import{a as D,b as He,c as U,d as Fe,e as Be,f as Ge,h as We,i as Ue}from"./chunk-5YSPND5J.mjs";import{c as Le,d as Ne}from"./chunk-V6L5PLD7.mjs";import{a as we,b as _e}from"./chunk-JCWA7NLM.mjs";import{c as Pe}from"./chunk-CFD6CW7T.mjs";import{a as ae}from"./chunk-GTG67Z45.mjs";import{a as Me}from"./chunk-XU3BQPBU.mjs";import{a as Te,b as Ie,c as $}from"./chunk-ZQHSJ6FF.mjs";import{c as $e,d as Re}from"./chunk-V7VA4EQX.mjs";import{a as Z,g as ue}from"./chunk-YJOC2JJK.mjs";import{c as Ee,d as Oe,e as Ae,h as De}from"./chunk-7QMBIMEX.mjs";import{b as Se}from"./chunk-VDXTMAMO.mjs";import{a as re}from"./chunk-NZKUCQZK.mjs";import{a as Ce}from"./chunk-ZBBNCCGV.mjs";import{a as ie}from"./chunk-P53YMOKR.mjs";import{a as ne,b as oe,c as ve}from"./chunk-6OYLZ4NM.mjs";import{e as mt,f as ht}from"./chunk-HYMJVHAX.mjs";import{d as A,g as se}from"./chunk-4T7NGLNQ.mjs";import{a as ke,b as je}from"./chunk-UHXV7MDW.mjs";import{a as G}from"./chunk-Y5SEUYET.mjs";import{a as he,b as te,c as fe}from"./chunk-YEALP3WX.mjs";import{g as W,h as ge,j as ye,m as be}from"./chunk-QZ7T2EYR.mjs";import{a as xe}from"./chunk-UYMZ3NAF.mjs";import{i as B}from"./chunk-6AFXUX2M.mjs";import{b as N}from"./chunk-LZC6NGB6.mjs";import{a as F}from"./chunk-KUQLXY2P.mjs";import{b as me}from"./chunk-EHVU2SMR.mjs";import{a as ee}from"./chunk-RACISWUV.mjs";import{b as de}from"./chunk-3USVY66O.mjs";import{a as C,i as X}from"./chunk-VWFVSNQT.mjs";import{e as O,g as Q}from"./chunk-2EEMQV7N.mjs";import{b as ce,j as lt}from"./chunk-KPR5TWSN.mjs";import{d as le,g as ut}from"./chunk-TTN2CFZC.mjs";import{a as pe,g as dt}from"./chunk-225DWS4D.mjs";import{a as h,e as pt}from"./chunk-3TRXQAU4.mjs";import{Buffer as ct}from"node:buffer";ut();import{McpServer as $t}from"@modelcontextprotocol/server";import{z as v}from"zod";import{z as ft}from"zod";var d=ft.string().optional();function b(i){let c=i?.trim();if(c)return c;let e=process.env.PRJCT_PROJECT_PATH?.trim()||process.env.PRJCT_CWD?.trim();return e||process.cwd()}h(b,"resolveProjectPath");async function y(i){return de.getProjectId(b(i))}h(y,"resolveProjectId");function u(i,c){return async e=>{try{return await c(e)}catch(n){return gt(n,i)}}}h(u,"safeMcpCall");function gt(i,c){let e=i instanceof Error?i.message:String(i);return{content:[{type:"text",text:`[${c}] Error: ${e}`}],isError:!0}}h(gt,"mcpError");function Ye(i){let c=i;c.registerTool("prjct_impact_analysis",{description:"Blast radius + risk for changed files (or git working tree / committed range). Prefer over manual Grep for review scope.",inputSchema:v.object({projectPath:d,changedFiles:v.array(v.string()).optional().describe("Changed file paths relative to project root. Omit to auto-detect from git working tree / committed range.")})},u("prjct_impact_analysis",async e=>{let n=await y(e.projectPath),t=b(e.projectPath);if(!e.changedFiles?.length||W(n)){let f=await Le(t,n,{files:e.changedFiles,source:"auto"});if(f.changedFiles.length>0||!e.changedFiles?.length)return{content:[{type:"text",text:Ne(f)}]}}let o=e.changedFiles??[],s=we({added:[],modified:o,deleted:[],unchanged:[]},n),p=_e(s.allAffected),a=["## Impact Analysis"];a.push(`
8
+ ### Directly Changed (${s.directlyChanged.length})`);for(let f of s.directlyChanged)a.push(`- ${f}`);if(s.affectedByImports.length>0){a.push(`
9
+ ### Affected via Imports (${s.affectedByImports.length})`);for(let f of s.affectedByImports)a.push(`- ${f}`)}return a.push(`
10
+ ### Affected Domains`),a.push(p.size>0?Array.from(p).join(", "):"none detected"),a.push(`
11
+ Total affected: ${s.allAffected.length} files`),a.push("\n_Tip: run `prjct code reindex` for symbol-level risk + call-graph blast radius._"),{content:[{type:"text",text:a.join(`
12
+ `)}]}})),c.registerTool("prjct_search_symbols",{description:"Search the structural symbol graph (functions, classes, routes). Run prjct sync first.",inputSchema:v.object({projectPath:d,pattern:v.string().describe("Symbol name substring (case-insensitive)"),limit:v.number().optional().default(30).describe("Max results")})},u("prjct_search_symbols",async e=>{let n=await y(e.projectPath);if(!W(n))return{content:[{type:"text",text:"No symbol index. Run `prjct sync` or `prjct code reindex`."}]};let t=ye(n,e.pattern,{limit:e.limit});return t.length===0?{content:[{type:"text",text:`No symbols matching "${e.pattern}".`}]}:{content:[{type:"text",text:[`## Symbols: ${e.pattern}`,`Index: ${ge(n)?.symbolCount??"?"} symbols`,"",...t.map(r=>`- **${r.name}** (${r.kind}${r.exported?", exported":""}) \u2014 \`${r.file}:${r.startLine}\``)].join(`
13
+ `)}]}})),c.registerTool("prjct_trace_path",{description:'BFS call-path trace: who calls a function and what it calls. Prefer over Grep for "who uses X?".',inputSchema:v.object({projectPath:d,functionName:v.string().describe("Function/class/method name to trace"),direction:v.enum(["inbound","outbound","both"]).optional().default("both").describe("inbound = callers, outbound = callees"),depth:v.number().optional().default(3).describe("BFS depth 1-5")})},u("prjct_trace_path",async e=>{let n=await y(e.projectPath);if(!W(n))return{content:[{type:"text",text:"No symbol index. Run `prjct sync` or `prjct code reindex`."}]};let t=be(n,e.functionName,{direction:e.direction,depth:e.depth});return t?{content:[{type:"text",text:[`## Trace: ${e.functionName}`,"","### Roots",...t.root.map(r=>`- ${r.kind} **${r.name}** \`${r.file}:${r.startLine}\``),"",`### Inbound (${t.inbound.length})`,...t.inbound.length?t.inbound.map(r=>`- d${r.depth} ${r.symbol.name} (${r.symbol.kind}) \`${r.symbol.file}:${r.symbol.startLine}\``):["_none_"],"",`### Outbound (${t.outbound.length})`,...t.outbound.length?t.outbound.map(r=>`- d${r.depth} ${r.symbol.name} (${r.symbol.kind}) \`${r.symbol.file}:${r.symbol.startLine}\``):["_none_"]].join(`
14
+ `)}]}:{content:[{type:"text",text:`No symbol "${e.functionName}". Try prjct_search_symbols first.`}]}})),c.registerTool("prjct_architecture",{description:"Structural architecture overview: languages, symbol kinds, packages, hotspots (call fan-in), routes, entry candidates. One shot \u2014 prefer over tree walks.",inputSchema:v.object({projectPath:d})},u("prjct_architecture",async e=>{let n=await y(e.projectPath),t=ke(n);return{content:[{type:"text",text:je(t)}]}})),c.registerTool("prjct_dead_code",{description:"Find functions/methods/classes with zero inbound CALLS (excludes entry points, tests, types). Best-effort graph.",inputSchema:v.object({projectPath:d,limit:v.number().optional().default(50).describe("Max candidates")})},u("prjct_dead_code",async e=>{let n=await y(e.projectPath),t=ze(n,{limit:e.limit});return{content:[{type:"text",text:qe(t)}]}})),c.registerTool("prjct_import_graph",{description:"Import graph stats + file neighbors (imports/importers). Pass a file for its neighbors, omit for graph stats.",inputSchema:v.object({projectPath:d,file:v.string().optional().describe("File path to get neighbors for (omit for graph stats)"),rebuild:v.boolean().optional().default(!1).describe("Force rebuild the import graph")})},u("prjct_import_graph",async e=>{let n=await y(e.projectPath),t=(e.rebuild?null:te(n))??await fe(b(e.projectPath),n);if(e.file){let r=t.forward[e.file]||[],s=t.reverse[e.file]||[];return{content:[{type:"text",text:[`## Import Neighbors: ${e.file}`,`
15
+ ### Imports (${r.length})`,...r.map(a=>`- ${a}`),`
16
+ ### Imported By (${s.length})`,...s.map(a=>`- ${a}`)].join(`
17
+ `)}]}}return{content:[{type:"text",text:["## Import Graph Stats",`Files: ${t.fileCount}`,`Edges: ${t.edgeCount}`,`Built: ${t.builtAt}`].join(`
18
+ `)}]}})),c.registerTool("prjct_cochange",{description:"Files that historically change together (Jaccard similarity from git history)",inputSchema:v.object({projectPath:d,seedFiles:v.array(v.string()).describe("Seed files to find co-change partners for"),rebuild:v.boolean().optional().default(!1).describe("Force rebuild the co-change matrix"),maxResults:v.number().optional().default(10).describe("Max results (default 10)")})},u("prjct_cochange",async e=>{let n=await y(e.projectPath),t=(e.rebuild?null:oe(n))??await ve(b(e.projectPath),n),o=ne(e.seedFiles,t).slice(0,e.maxResults);if(o.length===0)return{content:[{type:"text",text:"No co-change partners found."}]};let r=["## Co-Change Partners",`Seeds: ${e.seedFiles.join(", ")}`,`Commits analyzed: ${t.commitsAnalyzed}`,""];for(let s of o)r.push(`- ${s.path} (similarity: ${Math.round(s.score*100)}%)`);return{content:[{type:"text",text:r.join(`
19
+ `)}]}})),c.registerTool("prjct_related_context",{description:"Combined: import neighbors + co-change partners for seed files",inputSchema:v.object({projectPath:d,seedFiles:v.array(v.string()).describe("Seed files to find related context for"),maxResults:v.number().optional().default(15).describe("Max results (default 15)")})},u("prjct_related_context",async e=>{let n=await y(e.projectPath),t=te(n),o=t?he(e.seedFiles,t):[],r=oe(n),s=r?ne(e.seedFiles,r):[],p=new Map;for(let m of o)p.set(m.path,{importScore:m.score,cochangeScore:0});for(let m of s){let j=p.get(m.path);j?j.cochangeScore=m.score:p.set(m.path,{importScore:0,cochangeScore:m.score})}let a=Array.from(p.entries()).map(([m,j])=>({path:m,combined:j.importScore*.6+j.cochangeScore*.4,importScore:j.importScore,cochangeScore:j.cochangeScore})).sort((m,j)=>j.combined-m.combined).slice(0,e.maxResults);if(a.length===0)return{content:[{type:"text",text:"No related files found. Run `prjct sync` to build indexes."}]};let f=["## Related Context",`Seeds: ${e.seedFiles.join(", ")}`,""];for(let m of a){let j=[];m.importScore>0&&j.push(`import: ${m.importScore.toFixed(2)}`),m.cochangeScore>0&&j.push(`cochange: ${Math.round(m.cochangeScore*100)}%`),f.push(`- ${m.path} (${j.join(", ")})`)}return{content:[{type:"text",text:f.join(`
20
+ `)}]}}))}h(Ye,"registerCodeIntelTools");import{z as E}from"zod";dt();import yt from"node:fs/promises";import L from"node:path";var bt={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go",".rs":"rust",".java":"java",".cs":"csharp",".php":"php",".rb":"ruby"},Ke=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],kt=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],jt=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],xt=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],Xe=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],vt={typescript:Ke,javascript:Ke,python:kt,go:jt,rust:xt,java:Xe,csharp:Xe,php:[],ruby:[],unknown:[]};async function Qe(i,c=process.cwd()){let e=L.isAbsolute(i)?i:L.join(c,i),n=L.resolve(c),t=L.resolve(e);if(!t.startsWith(n+L.sep)&&t!==n)return{file:i,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:U("")};let o=await yt.readFile(e,"utf-8").catch(m=>{if(pe(m))return null;throw m});if(o===null)return{file:i,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:U("")};let r=L.extname(i).toLowerCase(),s=bt[r]||"unknown",p=vt[s];if(!p||p.length===0)return{file:i,language:s,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${s}`,metrics:U(o)};let a=wt(o,p),f=a.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
21
+ `);return{file:i,language:s,signatures:a,fallback:!1,metrics:He(o,f)}}h(Qe,"extractSignatures");function wt(i,c){let e=[],n=i.split(`
22
+ `),t=new Set;for(let o of c){o.pattern.lastIndex=0;for(let r of i.matchAll(o.pattern)){let s=r[o.nameIndex];if(!s)continue;let p=`${o.type}:${s}`;if(t.has(p))continue;t.add(p);let a=r.index,f=i.substring(0,a).split(`
23
+ `).length,m=r[0].trim(),j=f>1?n[f-2]?.trim():void 0,S=j?.startsWith("/**")||j?.startsWith("///")||j?.startsWith("#")?j:void 0;e.push({type:o.type,name:s,signature:_t(m),exported:o.exported||!1,line:f,docstring:S})}}return e.sort((o,r)=>o.line-r.line)}h(wt,"extractFromContent");function _t(i){return i.replace(/\{$/,"").replace(/\s+/g," ").trim()}h(_t,"cleanSignature");function Ze(i){let c=i;c.registerTool("prjct_relevant_files",{description:"MUST call before Grep/Glob tree walks. Resolves a constrained work scope via prjct: memory (FTS + semantic embeddings when enabled) + code BM25 + symbol graph + import graph + co-change. Prefer this over scanning the repo. For call chains use prjct_trace_path.",inputSchema:E.object({projectPath:d,query:E.string().describe("Task or query to find relevant files for"),maxFiles:E.number().optional().default(10).describe("Max files to return")})},u("prjct_relevant_files",async e=>{try{let r=await y(e.projectPath);if(r){let{resolveWorkScope:s,formatWorkScopeBlock:p}=await import("./work-scope-3LXOEIUX.mjs"),a=await s(b(e.projectPath),r,e.query,e.maxFiles);if(a.files.length>0)return{content:[{type:"text",text:[p(a.files,{indexesReady:a.indexesReady,memorySeeds:a.sources.memorySeeds}),"",`_sources: memorySeeds=${a.sources.memorySeeds} indexHits=${a.sources.indexHits} graphNeighbors=${a.sources.graphNeighbors}_`].join(`
24
+ `)}]}}}catch{}let n=await Ce(e.query,b(e.projectPath),{maxFiles:e.maxFiles,minScore:.1});if(n.files.length===0)return{content:[{type:"text",text:"No relevant files found. Run `prjct sync` to rebuild indexes, then retry. Prefer `prjct context memory <topic>` over Grep/Glob."}]};let t=n.files.map(r=>`- \`${r.path}\` (score: ${Math.round(r.score*100)}%) \u2014 ${r.reasons.join(", ")}`);return{content:[{type:"text",text:`## Relevant Files (fallback scan ${n.files.length}/${n.metrics.filesScanned})
25
+
26
+ > Prefer re-running after \`prjct sync\` so memory+BM25+graph scope is used.
27
+
28
+ ${t.join(`
29
+ `)}`}]}})),c.registerTool("prjct_signatures",{description:"Function/class signatures of a file without bodies (~90% fewer tokens). Use to map an unfamiliar file before deciding whether to Read it fully.",inputSchema:E.object({projectPath:d,filePath:E.string().describe("Relative file path to extract signatures from")})},u("prjct_signatures",async e=>{let n=await Qe(e.filePath,e.projectPath);if(n.signatures.length===0)return{content:[{type:"text",text:n.fallback?`No signatures extracted: ${n.fallbackReason}`:"No signatures found."}]};let t=n.signatures.map(s=>`${s.exported?"export ":""}${s.type} ${s.name}: ${s.signature}${s.docstring?` // ${s.docstring}`:""}`),o=n.metrics?.compression?` (${Math.round(n.metrics.compression*100)}% reduction)`:"";return{content:[{type:"text",text:`## ${n.file} (${n.language})
30
+ \`\`\`
31
+ ${t.join(`
32
+ `)}
33
+ \`\`\`${o}`}]}})),c.registerTool("prjct_history",{description:"Recently completed tasks and how they ended. Use to learn what was just done before continuing related work.",inputSchema:E.object({projectPath:d,limit:E.number().optional().default(10).describe("Max results")})},u("prjct_history",async e=>{let n=await y(e.projectPath),t=await me.getTaskHistory(n);if(t.length===0)return{content:[{type:"text",text:"No task history."}]};let r=t.slice(-e.limit).reverse().map(p=>{let a=[`- **${p.title}**`];return p.completedAt&&a.push(`completed: ${p.completedAt}`),p.classification&&a.push(`type: ${p.classification}`),a.join(" | ")});return{content:[{type:"text",text:`## Task History (${t.length} total)
34
+
35
+ ${r.join(`
36
+ `)}`}]}}))}h(Ze,"registerFileTools");import{z as g}from"zod";lt();var Pt=`Base types: ${ce.join(", ")}. Any lowercase identifier is accepted (e.g. "recipe", "okr").`;function et(i,c={}){let e=i;if(e.registerTool("prjct_mem_save",{description:"Save durable project memory in English. Use tags.topic for evolving subjects; matching topics supersede older entries.",inputSchema:g.object({projectPath:d,type:g.string().describe("e.g. fact, decision, learning, or a custom type"),content:g.string(),tags:g.record(g.string(),g.string()).optional().describe('k:v metadata, e.g. {domain: "auth"}'),source:g.string().optional().describe("Originating task id"),force:g.boolean().optional().describe("Allow content rejected as secret-like")})},u("prjct_mem_save",async t=>{await y(t.projectPath);let o=t.type.toLowerCase().trim();if(!o||!/^[a-z][a-z0-9-]*$/.test(o))return{content:[{type:"text",text:`Invalid type '${t.type}'. Lowercase letters + dashes only. ${Pt}`}]};let r=ee(t.content,{force:t.force});if(!r.allow)return{content:[{type:"text",text:r.kind==="secrets"?`Refused \u2014 content looks like a secret (${r.hits.join(", ")}). Re-call with force=true if intentional.`:r.kind==="prompt_injection"?`Refused \u2014 content looks like prompt injection (${r.hits.join(", ")}). Memory entries are inlined into LLM context. Re-call with force=true if intentional.`:`Refused \u2014 ${r.denyMessage}`}]};let s=b(t.projectPath);return await N.remember(b(s),{type:o,content:t.content,tags:t.tags??{},source:t.source,force:t.force}),{content:[{type:"text",text:`Saved ${o}: ${t.content.slice(0,80)}`}]}})),e.registerTool("prjct_mem_list",{description:"Recall ranked memory as compact, resolvable cues. Filter by topic, types, tags, or limit.",inputSchema:g.object({projectPath:d,topic:g.string().optional().describe("Keyword to match over content + tag values"),types:g.array(g.string()).optional(),tags:g.record(g.string(),g.string()).optional().describe("Exact k:v match"),limit:g.number().optional().default(25)})},u("prjct_mem_list",async t=>{let o=await y(t.projectPath),r=await ie(b(t.projectPath),o,{topic:t.topic,types:t.types,tags:t.tags,limit:t.limit});return{content:[{type:"text",text:B(r,{boundary:"llm",compact:!0})}]}})),e.registerTool("prjct_mem_similar",{description:"Find ranked memory related to a free-text description; returns compact, resolvable cues.",inputSchema:g.object({projectPath:d,description:g.string(),limit:g.number().optional().default(10)})},u("prjct_mem_similar",async t=>{let o=await y(t.projectPath),r=await ie(b(t.projectPath),o,{topic:t.description,limit:t.limit??10,expandLinks:!1});return r.length===0?{content:[{type:"text",text:"No similar memories found."}]}:{content:[{type:"text",text:B(r,{boundary:"llm",compact:!0})}]}})),e.registerTool("prjct_guard",{description:"Before editing a file, retrieve preventive gotchas and recurring failures. Empty means clear to edit.",inputSchema:g.object({projectPath:d,file:g.string().describe("Absolute or repo-relative path"),limit:g.number().optional().default(3)})},u("prjct_guard",async t=>{let o=await y(t.projectPath),r=N.recallForFile(o,t.file,t.limit??3);return Me(o,t.projectPath,r.map(s=>s.id)),r.length===0?{content:[{type:"text",text:`No preventive memory for ${t.file.split("/").pop()??t.file} \u2014 clear to edit.`}]}:{content:[{type:"text",text:B(r,{boundary:"llm"})}]}})),e.registerTool("prjct_mem_forget",{description:"Delete a memory by stable id from prjct_mem_list.",inputSchema:g.object({projectPath:d,id:g.string().describe('e.g. "mem_42" or "ship_7"')})},u("prjct_mem_forget",async t=>{let o=await y(t.projectPath);return{content:[{type:"text",text:N.forget(o,t.id)?`\u2713 forgot ${t.id} \u2014 removed from recall, search, and embeddings.`:`_No memory entry with id ${t.id} (already gone, or not a remember entry)._`}]}})),!c.extended)return;async function n(t,o,r,s={}){let p=b(t);await y(p);let a=ee(r);return a.allow?(await N.remember(p,{type:o,content:r,tags:s}),{content:[{type:"text",text:`Saved ${o}: ${r.slice(0,80)}`}]}):{content:[{type:"text",text:a.kind==="secrets"?`Refused \u2014 content looks like a secret (${a.hits.join(", ")}). Use prjct_mem_save with force=true if intentional.`:a.kind==="prompt_injection"?`Refused \u2014 content looks like prompt injection (${a.hits.join(", ")}). Use prjct_mem_save with force=true if intentional.`:`Refused \u2014 ${a.denyMessage}`}]}}h(n,"saveTyped"),e.registerTool("prjct_record_decision",{description:"Record a DECISION: what was decided, why, and alternatives. Author in ENGLISH. (Or use prjct_mem_save type=decision.)",inputSchema:g.object({projectPath:d,decision:g.string().describe("What was decided"),rationale:g.string().optional().describe("Why"),alternatives:g.array(g.string()).optional().describe("Rejected options")})},u("prjct_record_decision",async t=>{let o=[t.decision];return t.rationale&&o.push(`
37
+ Why: ${t.rationale}`),t.alternatives?.length&&o.push(`
38
+ Alternatives considered: ${t.alternatives.join("; ")}`),n(t.projectPath,"decision",o.join(""))})),e.registerTool("prjct_record_gotcha",{description:"Record a GOTCHA (trap + fix). Tag file for prjct_guard. (Or prjct_mem_save type=gotcha.)",inputSchema:g.object({projectPath:d,symptom:g.string().describe("What goes wrong"),fix:g.string().describe("How to avoid/fix"),file:g.string().optional().describe("File path for guard")})},u("prjct_record_gotcha",async t=>n(t.projectPath,"gotcha",`${t.symptom}
39
+ Fix: ${t.fix}`,t.file?{file:t.file}:{}))),e.registerTool("prjct_record_learning",{description:"Record a LEARNING + evidence. Author in ENGLISH. (Or prjct_mem_save type=learning.)",inputSchema:g.object({projectPath:d,claim:g.string().describe("What was learned"),evidence:g.string().optional().describe("Supporting observation")})},u("prjct_record_learning",async t=>{let o=t.evidence?`${t.claim}
40
+ Evidence: ${t.evidence}`:t.claim;return n(t.projectPath,"learning",o)})),e.registerTool("prjct_record_fact",{description:"Record a FACT about a subject. Author in ENGLISH. (Or prjct_mem_save type=fact.)",inputSchema:g.object({projectPath:d,subject:g.string().describe("Subject"),statement:g.string().describe("The fact")})},u("prjct_record_fact",async t=>n(t.projectPath,"fact",`${t.subject}: ${t.statement}`,{subject:t.subject}))),e.registerTool("prjct_capture_inbox",{description:"Quick INBOX capture for later triage. (Or prjct_mem_save type=inbox.)",inputSchema:g.object({projectPath:d,text:g.string().describe("Note text")})},u("prjct_capture_inbox",async t=>n(t.projectPath,"inbox",t.text)))}h(et,"registerMemoryTools");import{z as _}from"zod";function tt(i,c={}){let e=i;e.registerTool("prjct_session_resume",{description:"Resume after a fresh window: active cycle, last hand-off, journal, and next actions. Rarely needed \u2014 this state is auto-injected into the conversation on every turn by the session/prompt hooks; pull it only for crash recovery or cross-checking.",inputSchema:_.object({projectPath:d})},u("prjct_session_resume",async n=>{let t=await y(n.projectPath),o=await ae(t,b(n.projectPath)),{loadSessionContinuity:r,loadLastSessionCloseContent:s,formatSessionResumeCard:p}=await import("./session-continuity-BFSW4OL6.mjs"),a=r(t),f=o.current,m=f?await import("./database-UU2ZXSD4.mjs").then(({prjctDb:x})=>x.query(t,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 3",f.id).map(w=>w.content).reverse()):[],j=await import("./agent-switch-AVSX6SLY.mjs").then(({formatPendingHandoffCue:x})=>x(t)).catch(()=>null);return{content:[{type:"text",text:p({stamp:a,liveCycleDescription:o.current?.description??null,liveCycleId:o.current?.id??null,journal:m,sessionCloseContent:s(t),pendingHandoffCue:j})}]}})),e.registerTool("prjct_task_status",{description:"Read active work across worktrees plus queued work. Rarely needed \u2014 active work is auto-injected into the conversation on every turn by the prompt hook; pull it only for crash recovery or cross-checking.",inputSchema:_.object({projectPath:d})},u("prjct_task_status",async n=>{let t=await y(n.projectPath),o=await ae(t,b(n.projectPath)),r=await F.getActiveTasks(t),s=[];if(o.all.length===0)s.push("No active work cycle.");else if(o.all.length===1&&o.current){let p=o.current;s.push(`## Active Work Cycle
41
+ **${p.description}**`),s.push(`Workspace: ${p.label}`),p.branch&&s.push(`Branch: ${p.branch}`),s.push(`Started: ${p.startedAt}`)}else{s.push(`## Active Tasks (${o.all.length})`);for(let p of o.all){let a=p.isCurrent?" [this worktree]":"";s.push(`-${a} ${p.label}: ${p.description} \u2014 started ${p.startedAt}`)}}if(r.length>0){s.push(`
42
+ ## Queue (${r.length} work items)`);for(let p of r.slice(0,10))s.push(`- ${p.description} [${p.priority||"medium"}]`)}return{content:[{type:"text",text:s.join(`
43
+ `)}]}})),e.registerTool("prjct_task_start",{description:"Start a gated work cycle and return predicted file risks and context. Link a spec only when durable intent is required.",inputSchema:_.object({projectPath:d,description:_.string().describe("Short intent phrase"),linked_spec_id:_.string().optional().describe('Spec id for high-stakes work, e.g. "spec_12"'),skip_hooks:_.boolean().optional().describe("Skip before/after workflow rules. Default false.")})},u("prjct_task_start",async n=>{let t=await y(n.projectPath),o=await Ae(t,b(n.projectPath),n.description,{spec:n.linked_spec_id,skipHooks:n.skip_hooks});if(!o.ok)return{content:[{type:"text",text:o.blocked??"Work start was blocked."}]};let r=[`\u2713 Work cycle started: ${o.description}`,`Id: ${o.taskId}`];if(o.branch&&r.push(`Branch: ${o.branch}`),o.linearId&&r.push(`Linear: ${o.linearId}`),o.linkedSpecId&&r.push(`Linked spec: ${o.linkedSpecId}`),o.harness&&(r.push(`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`),o.harness.expectedEvidence.length>0&&r.push(`Evidence: ${o.harness.expectedEvidence.join(", ")}`)),o.instructions&&o.instructions.length>0){r.push("","Agent instructions:");for(let p of o.instructions)r.push(`- ${p}`)}let s=o.risks??[];if(s.length>0){r.push("","\u26A0 Risk \u2014 what bit us in this area before (read before you edit):");for(let p of s)r.push(`- ${Oe(p)}`)}if(o.relatedContext&&o.relatedContext.length>0){r.push("","Related second-brain context (pull full bodies with prjct_search):");for(let p of o.relatedContext.slice(0,4))r.push(`- ${Ee(p)}`)}if(o.likelyFiles&&o.likelyFiles.length>0){r.push("","Work scope (prjct memory+index+graph) \u2014 MUST open these before Grep/Glob:");for(let p of o.likelyFiles)r.push(`- ${Se(p)}`);r.push("Expand only via prjct_guard / prjct_relevant_files / prjct_impact_analysis \u2014 do not tree-walk.")}else r.push("","Work scope empty \u2014 MUST call prjct_relevant_files or prjct context memory before Grep/Glob (run prjct sync if indexes cold).");return{content:[{type:"text",text:r.join(`
44
+ `)}]}})),e.registerTool("prjct_task_set_status",{description:"Transition the active cycle status. Use prjct_cost_add instead for token usage.",inputSchema:_.object({projectPath:d,status:_.enum(["done","completed","paused","active","resume","in_progress"])})},u("prjct_task_set_status",async n=>{let t=await y(n.projectPath),o=await De(t,b(n.projectPath),n.status);if(!o.ok)return{content:[{type:"text",text:o.reason==="unsupported"?o.message:"No active work cycle to update. Start one with prjct_task_start."}]};let r=o.verificationWarnings??[],s=[`\u2713 status \u2192 ${o.status} (task ${o.taskId})`];if(r.length>0){s.push("","Harness warnings:");for(let p of r)s.push(`- ${p}`)}return o.contextPrompt&&s.push("",o.contextPrompt),{content:[{type:"text",text:s.join(`
45
+ `)}]}})),e.registerTool("prjct_analysis",{description:'Read stored architecture, stack, conventions, risks, and insights. mode:"archive" includes superseded analyses.',inputSchema:_.object({projectPath:d,mode:_.enum(["active","archive"]).optional()})},u("prjct_analysis",async n=>{let t=await y(n.projectPath);if(n.mode==="archive"){let a=G.getAllFull(t).filter(m=>m.status==="superseded");if(!a.length)return{content:[{type:"text",text:"No superseded analyses in the archive."}]};let f=["## Analysis Archive (superseded)"];for(let m of a){let j=m.commitHash?m.commitHash.slice(0,8):"unknown";f.push(`
46
+ ### ${m.analyzedAt} (commit ${j})`,`Style: ${m.analysis.architecture?.style??"unknown"} \xB7 patterns ${m.analysis.patterns?.length??0} \xB7 anti-patterns ${m.analysis.antiPatterns?.length??0} \xB7 tech-debt ${m.analysis.techDebt?.length??0}`)}return{content:[{type:"text",text:f.join(`
47
+ `)}]}}let o=G.getActiveRelational(t);if(o){let a=["## Project Analysis"];o.domains.length&&a.push(`
48
+ ### Architecture
49
+ Domains: ${o.domains.join(", ")}`);let f=o.stack.filter(x=>x.kind==="language").map(x=>x.name),m=o.stack.filter(x=>x.kind==="framework").map(x=>x.name);(f.length||m.length)&&(a.push(`
50
+ ### Stack`),f.length&&a.push(`Languages: ${f.join(", ")}`),m.length&&a.push(`Frameworks: ${m.join(", ")}`));let j=h(x=>o.findings.filter(w=>w.kind===x),"byKind"),S=h((x,w)=>{let P=j(w);if(P.length){a.push(`
51
+ ### ${x} (${P.length})`);for(let T of P)a.push(`- **${T.title}**${T.detail?`: ${T.detail}`:""}`)}},"section");if(S("Patterns","pattern"),S("Anti-Patterns","anti_pattern"),S("Tech Debt","tech_debt"),S("Risk Areas","risk_area"),S("Insights","insight"),o.conventions.length){a.push(`
52
+ ### Conventions (${o.conventions.length})`);for(let x of o.conventions)a.push(`- ${x}`)}if(o.commands.length){a.push(`
53
+ ### Commands (${o.commands.length})`);for(let x of o.commands)a.push(`- **${x.name}**: \`${x.command}\``)}return{content:[{type:"text",text:a.join(`
54
+ `)}]}}let r=G.getActive(t);if(!r)return{content:[{type:"text",text:"No analysis available. Run `prjct sync`."}]};let s=["## Project Analysis"];if(r.architecture?.style){s.push(`
55
+ ### Architecture`),s.push(`Style: ${r.architecture.style}`),r.architecture.domains?.length&&s.push(`Domains: ${r.architecture.domains.join(", ")}`);for(let a of r.architecture.insights??[])s.push(`- ${a}`)}if(r.stack&&(s.push(`
56
+ ### Stack`),r.stack.languages?.length&&s.push(`Languages: ${r.stack.languages.join(", ")}`),r.stack.frameworks?.length&&s.push(`Frameworks: ${r.stack.frameworks.join(", ")}`),r.stack.packageManager&&s.push(`Package Manager: ${r.stack.packageManager}`)),r.patterns?.length){s.push(`
57
+ ### Patterns (${r.patterns.length})`);for(let a of r.patterns)s.push(`- **${a.name}**: ${a.description}`)}if(r.antiPatterns?.length){s.push(`
58
+ ### Anti-Patterns (${r.antiPatterns.length})`);for(let a of r.antiPatterns)s.push(`- **${a.issue}**: ${a.suggestion}`)}if(r.conventions?.length){s.push(`
59
+ ### Conventions (${r.conventions.length})`);for(let a of r.conventions)s.push(`- [${a.category}] ${a.rule}`)}if(r.techDebt?.length){s.push(`
60
+ ### Tech Debt (${r.techDebt.length})`);for(let a of r.techDebt)s.push(`- [${a.priority}/${a.effort}] ${a.description} (${a.area})`)}let p=r.projectInsights??[];if(p.length){s.push(`
61
+ ### Insights (${p.length})`);for(let a of p)s.push(`- ${a}`)}return{content:[{type:"text",text:s.join(`
62
+ `)}]}})),c.extended&&(e.registerTool("prjct_cost_add",{description:"Record cycle token usage (cost/ROI). Pass model/runtime when known.",inputSchema:_.object({projectPath:d,tokensIn:_.number().describe("Input tokens"),tokensOut:_.number().describe("Output tokens"),model:_.string().optional().describe("Model id"),runtime:_.string().optional().describe("Host: claude | codex | gemini | \u2026"),isEstimated:_.boolean().optional().describe("True if estimated. Default false."),workCycleId:_.string().optional().describe("Task id; defaults to active cycle")})},u("prjct_cost_add",async n=>{let t=b(n.projectPath),o=await y(t),r=n.workCycleId??await import("./task-service-FK7FC3PE.mjs").then(({resolveActiveTask:s})=>s(o,t).then(p=>p?.id));return r?(Pe(o,r,n.tokensIn,n.tokensOut,{model:n.model,runtime:n.runtime,isEstimated:n.isEstimated??!1,source:"mcp"}),{content:[{type:"text",text:`Recorded ${n.tokensIn} in / ${n.tokensOut} out${n.model?` (${n.model})`:""} for ${r}.`}]}):{content:[{type:"text",text:"No work cycle to attribute cost to (pass workCycleId or start a cycle)."}]}})),e.registerTool("prjct_developer",{description:"Synthesized developer profile (feedback + friction). Act as this developer would.",inputSchema:_.object({projectPath:d})},u("prjct_developer",async n=>{let t=await y(n.projectPath),{projectMemory:o}=await import("./project-memory-GYLYIJQD.mjs"),{buildDeveloperProfile:r}=await import("./developer-profile-MRPBWL2K.mjs"),{renderDeveloperEvolution:s}=await import("./developer-evolution-AVAXGDKQ.mjs"),p=o.allEntriesForIndex(t),a=r(p),f=s(t);return{content:[{type:"text",text:[a,f].filter(Boolean).join(`
63
+
64
+ `)||"No developer profile yet \u2014 capture `feedback` memories as preferences emerge."}]}})),e.registerTool("prjct_signals",{description:"Machine signals: hot files, skill-misses, friction (transient telemetry).",inputSchema:_.object({projectPath:d})},u("prjct_signals",async n=>{let t=await y(n.projectPath),{projectMemory:o}=await import("./project-memory-GYLYIJQD.mjs"),{buildSignalsFile:r,isSignalEntry:s}=await import("./signals-digest-V44KYN6Z.mjs"),p=o.allEntriesForIndex(t).filter(s);return{content:[{type:"text",text:r(p,{boundary:"llm"})??"No active signals."}]}})),e.registerTool("prjct_skills",{description:"Skill index: name + description + EXACT SKILL.md path for subagent dispatch.",inputSchema:_.object({projectPath:d})},u("prjct_skills",async n=>{let t=b(n.projectPath),o=await y(t),{refreshSkillIndex:r,renderSkillIndex:s}=await import("./skill-index-L4UWQCQE.mjs");return await r(o,t),{content:[{type:"text",text:s(o)??"No skills found in project or global skill roots."}]}})),e.registerTool("prjct_project_facts",{description:"Verified-only per-project facts: stack line + real test/lint/build commands (never guessed). Live \u2014 no write.",inputSchema:_.object({projectPath:d})},u("prjct_project_facts",async n=>{let t=b(n.projectPath),{formatProjectFactsMd:o}=await import("./prjct-md-SUDFWDCS.mjs");return{content:[{type:"text",text:await o(t)}]}})),e.registerTool("prjct_context_tiers",{description:"Context cache tiers L0\u2013L3 + live L0 budget. Never stuff L2 into L0.",inputSchema:_.object({projectPath:d})},u("prjct_context_tiers",async()=>{let{formatContextTiersMd:n}=await import("./context-tiers-4S6H22NP.mjs");return{content:[{type:"text",text:n()}]}})),e.registerTool("prjct_safe_artifacts",{description:"Audit agent outputs: judgment, ships, handoffs, checkpoints, session stamp.",inputSchema:_.object({projectPath:d,limit:_.number().int().min(1).max(20).optional().describe("Max per kind (default 5)")})},u("prjct_safe_artifacts",async n=>{let t=await y(n.projectPath),{listSafeArtifacts:o,formatSafeArtifactsMd:r}=await import("./safe-artifacts-RW5WQUUJ.mjs"),s=await o(t,{limit:n.limit});return{content:[{type:"text",text:r(s)}]}})))}h(tt,"registerProjectTools");import{z as l}from"zod";var St=`Delta format (OpenSpec subset):
65
+ ## ADDED Requirements / ## MODIFIED Requirements / ## REMOVED Requirements
66
+ ### Requirement: <name> followed by its SHALL statement
67
+ #### Scenario: <name> (optional) with - **GIVEN** \u2026 / - **WHEN** \u2026 / - **THEN** \u2026 bullets
68
+ Requirement names map to stable slugs; MODIFIED/REMOVED target an existing slug; REMOVED holds only the "### Requirement:" heading. Re-applying the same delta is a no-op. CLI usage: \`prjct spec apply-delta <id> (--file <path> | --md '<delta markdown>')\`.`;function rt(i){let c=i;c.registerTool("prjct_spec_create",{description:'Draft a spec when the user frames a feature/fix/initiative WITH goals or stakes. Skip for routine work (single-file fix, doc tweak, capture) \u2014 use `prjct_mem_save` with type="inbox" or the CLI `prjct capture` instead. Fields default empty; fill them via `prjct_spec_update`.',inputSchema:l.object({projectPath:d,title:l.string().describe("One-line title"),goal:l.string().describe("What success looks like \u2014 concrete, observable"),eli10:l.string().optional().describe("Lay explanation, 2-4 sentences"),stakes:l.string().optional().describe("What breaks if we ship the wrong thing"),acceptance_criteria:l.array(l.string()).optional().describe("Testable, verifiable items"),scope:l.array(l.string()).optional().describe("What's IN \u2014 file paths, modules, surfaces"),out_of_scope:l.array(l.string()).optional().describe("What's OUT \u2014 anti-creep shield"),risks:l.array(l.object({risk:l.string(),mitigation:l.string()})).optional().describe("Each risk needs a mitigation"),test_plan:l.array(l.string()).optional().describe("How you prove acceptance criteria"),tags:l.record(l.string(),l.string()).optional().describe('k:v tags, e.g. {domain: "auth"}')})},u("prjct_spec_create",async e=>{let n=await $.create(b(e.projectPath),{title:e.title,content:{goal:e.goal,eli10:e.eli10,stakes:e.stakes,acceptance_criteria:e.acceptance_criteria,scope:e.scope,out_of_scope:e.out_of_scope,risks:e.risks,test_plan:e.test_plan},tags:e.tags});return{content:[{type:"text",text:[`\u2713 spec drafted: ${n.title}`,"",`id: ${n.id}`,`status: ${n.status}`,`goal: ${n.content.goal}`,"","Next: `prjct_spec_audit` to dispatch the three review subagents (strategic / architecture / design) in parallel."].join(`
69
+ `)}]}})),c.registerTool("prjct_spec_list",{description:"List specs in this project. Use to check what specs exist before drafting a new one (avoid duplicates) or to find the right spec to link a task to.",inputSchema:l.object({projectPath:d,status:l.enum(Z).optional().describe("Filter by status: draft|reviewed|in_progress|shipped|archived"),includeArchived:l.boolean().optional().describe("Include archived specs (default: false)")})},u("prjct_spec_list",async e=>{let n=await y(e.projectPath),t=ue.list(n,{status:e.status,includeArchived:e.includeArchived});if(t.length===0)return{content:[{type:"text",text:"_No specs match. Start one with `prjct_spec_create`._"}]};let o=["# Specs",""];for(let r of t){let s=r.content.acceptance_criteria.length,p=r.content.linked_tasks.length;o.push(`## ${r.title}
70
+ - id: \`${r.id}\`
71
+ - status: ${r.status}
72
+ - acceptance criteria: ${s}
73
+ - linked tasks: ${p}
74
+ - created: ${r.createdAt}`),o.push("")}return{content:[{type:"text",text:o.join(`
75
+ `)}]}})),c.registerTool("prjct_spec_get",{description:"Fetch one spec by id, including all structured fields (goal, acceptance criteria, scope, risks, reviews, linked tasks).",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id")})},u("prjct_spec_get",async e=>{let n=await $.get(b(e.projectPath),e.id);if(!n)return{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]};let t=await y(e.projectPath).catch(()=>null),o=new Map;if(t)for(let r of await F.getTasks(t))r.featureId===n.id&&r.body!=null&&o.set(r.body,{id:r.id,completed:r.completed});return{content:[{type:"text",text:Ve(n,o)}]}})),c.registerTool("prjct_spec_update",{description:"Patch a spec's structured content \u2014 shallow merge: pass only the fields to change, omitted fields are preserved. For requirement / acceptance-criteria changes prefer `prjct_spec_apply_delta` (canonical, idempotent). Editing any body field demotes a reviewed spec back to draft.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id"),content:l.object({goal:l.string().optional(),eli10:l.string().optional(),stakes:l.string().optional(),acceptance_criteria:l.array(l.string()).optional(),scope:l.array(l.string()).optional(),out_of_scope:l.array(l.string()).optional(),risks:l.array(l.object({risk:l.string(),mitigation:l.string()})).optional(),test_plan:l.array(l.string()).optional(),notes:l.string().optional(),linked_tasks:l.array(l.string()).optional()})})},u("prjct_spec_update",async e=>{let n=await $.patch(b(e.projectPath),e.id,e.content);return n?{content:[{type:"text",text:`\u2713 spec updated: ${n.title}`}]}:{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]}})),c.registerTool("prjct_spec_apply_delta",{description:"CANONICAL path for changing a spec's requirements / acceptance criteria \u2014 pass an OpenSpec-style delta markdown (`## ADDED/MODIFIED/REMOVED Requirements` sections). Idempotent by content-hash id; MODIFIED/REMOVED target existing requirement slugs; demotes a reviewed spec back to draft. Malformed deltas return the full format in the error text.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id"),delta:l.string().describe("OpenSpec-subset delta markdown")})},u("prjct_spec_apply_delta",async e=>{try{let n=await $.applyDelta(b(e.projectPath),e.id,e.delta);return n?{content:[{type:"text",text:`\u2713 delta applied: ${n.title} (${n.content.delta_log.length} delta(s) logged)`}]}:{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]}}catch(n){let t=n instanceof Error?n.message:String(n);if(t.startsWith("DELTA_"))return{content:[{type:"text",text:`Error: ${t}
76
+
77
+ ${St}`}],isError:!0};throw n}})),c.registerTool("prjct_spec_validate",{description:"Validate a spec's stored structure BEFORE `prjct_spec_audit` / implementation. Errors (missing SHALL statement or GIVEN/WHEN/THEN scenarios; REMOVED targeting a nonexistent requirement) block audit dispatch under SDD strict mode; warnings are advisory. Pure read.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id")})},u("prjct_spec_validate",async e=>{let n=b(e.projectPath),t=await $.get(n,e.id);if(!t)return{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]};let o=$e(t,{projectPath:n});return{content:[{type:"text",text:[`# spec validate \u2014 ${t.title}`,"",...o.errors.length===0&&o.warnings.length===0?["_No findings \u2014 structure OK._"]:Re(o),"",`verdict: ${o.errors.length===0?"PASS":"FAIL"} (${o.errors.length} error(s), ${o.warnings.length} warning(s))`].join(`
78
+ `)}]}})),c.registerTool("prjct_spec_set_status",{description:"Promote/demote a spec lifecycle state: `in_progress` when work starts, `archived` when superseded. (draft \u2192 reviewed auto-promotes when reviewers pass; for first ship use `prjct_spec_ship` so the PR is recorded.)",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id"),status:l.enum(Z).describe("Target status")})},u("prjct_spec_set_status",async e=>await $.setStatus(b(e.projectPath),e.id,e.status)?{content:[{type:"text",text:`\u2713 spec ${e.id} \u2192 ${e.status}`}]}:{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]})),c.registerTool("prjct_spec_audit",{description:"Call before implementing a spec. Returns a dispatch prompt for a DYNAMIC set of review specialists the spec signals (architecture is the floor; security/data/performance/design/strategic + DOMAIN experts join as signaled). Run them IN PARALLEL; persist each verdict via `prjct_spec_record_review` \u2014 all pass \u2192 auto-promotes draft \u2192 reviewed.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id to audit")})},u("prjct_spec_audit",async e=>{let n=await $.get(b(e.projectPath),e.id);if(!n)return{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]};let t=await y(e.projectPath).catch(()=>null),o=t?Je.readDomainsSync(t)?.domains??[]:[],r=Te(n.content,o);return await $.setSelectedReviewers(b(e.projectPath),e.id,r),{content:[{type:"text",text:await Ie(n.id,n.title,n.content,r,void 0,o)}]}})),c.registerTool("prjct_spec_record_review",{description:"Persist one reviewer's verdict from `prjct_spec_audit` dispatch. Call once per reviewer (strategic, architecture, design). When all three are recorded with verdict=pass, the spec auto-promotes draft \u2192 reviewed.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id"),reviewer:l.string().min(1).describe("Which lens (e.g. architecture, security, data)"),verdict:l.enum(["pass","fail"]).describe("Verdict"),notes:l.string().describe("2-4 sentence notes from the subagent")})},u("prjct_spec_record_review",async e=>{let n=await $.recordReview(b(e.projectPath),e.id,e.reviewer,{verdict:e.verdict,notes:e.notes});if(!n)return{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]};let t=n.status==="reviewed"?" (all reviewers passed \u2192 status: reviewed)":"";return{content:[{type:"text",text:`\u2713 ${e.reviewer} \u2192 ${e.verdict}${t}`}]}})),c.registerTool("prjct_spec_link_task",{description:"Link a task to its spec (call after starting the task) so `prjct_ship` knows which spec to gate against. Idempotent.",inputSchema:l.object({projectPath:d,specId:l.string().describe("Spec id"),taskId:l.string().describe("Task id (from `prjct_task_start` or stateStorage)")})},u("prjct_spec_link_task",async e=>await $.linkTask(b(e.projectPath),e.specId,e.taskId)?{content:[{type:"text",text:`\u2713 linked task ${e.taskId} to spec ${e.specId}`}]}:{content:[{type:"text",text:`_Spec not found: ${e.specId}_`}]})),c.registerTool("prjct_spec_ship",{description:"Mark a spec as shipped (after the linked PR merges). Records the PR number on the spec for provenance.",inputSchema:l.object({projectPath:d,id:l.string().describe("Spec id"),pr:l.number().optional().describe("PR / MR number that delivered the spec")})},u("prjct_spec_ship",async e=>{let n=await $.ship(b(e.projectPath),e.id,e.pr);return n?{content:[{type:"text",text:`\u2713 spec shipped: ${n.title}${e.pr?` (PR #${e.pr})`:""}`}]}:{content:[{type:"text",text:`_Spec not found: ${e.id}_`}]}}))}h(rt,"registerSpecTools");import{z}from"zod";function nt(i){let c=i;c.registerTool("prjct_workflow_rules",{description:"The gates/hooks/steps registered for a command (task, ship, \u2026). Check before running a lifecycle verb so a gate never surprises you mid-action.",inputSchema:z.object({projectPath:d,command:z.string().describe("Command name (task, done, ship, sync, etc.)")})},u("prjct_workflow_rules",async e=>{let n=await y(e.projectPath),t=re.getRulesForCommand(n,e.command);if(t.length===0)return{content:[{type:"text",text:`No workflow rules for \`${e.command}\`.`}]};let o={};for(let s of t){let p=`${s.type}:${s.position}`;o[p]||(o[p]=[]),o[p].push(s)}let r=[`## Workflow Rules for \`${e.command}\``];for(let[s,p]of Object.entries(o)){r.push(`
79
+ ### ${s}`);for(let a of p){let f=a.enabled?"":" (disabled)";r.push(`- ${a.action}${a.description?` \u2014 ${a.description}`:""}${f}`)}}return{content:[{type:"text",text:r.join(`
80
+ `)}]}})),c.registerTool("prjct_workflow_list",{description:"Every workflow this project registered (built-in + custom). Use to discover what `prjct workflow run <name>` can execute here.",inputSchema:z.object({projectPath:d})},u("prjct_workflow_list",async e=>{let n=await y(e.projectPath),t=xe.getAllWorkflows(n);if(t.length===0)return{content:[{type:"text",text:"No workflows configured."}]};let o=t.map(r=>{let s=r.isBuiltin?"(built-in)":"(custom)",p=r.enabled?"":" [disabled]";return`- **${r.name}** ${s}${p}${r.description?`: ${r.description}`:""}`});return{content:[{type:"text",text:`## Workflows (${t.length})
81
+
82
+ ${o.join(`
83
+ `)}`}]}})),c.registerTool("prjct_workflow_status",{description:"Where the active work cycle sits in its workflow/gates (state + rules currently in force). Read when deciding whether done/ship is allowed next.",inputSchema:z.object({projectPath:d})},u("prjct_workflow_status",async e=>{let n=await y(e.projectPath),{resolveActiveTask:t}=await import("./task-service-FK7FC3PE.mjs"),o=await t(n,b(e.projectPath)),r=re.getAllRules(n),s=["## Workflow Status"];o?(s.push(`
84
+ Active work cycle: **${o.description}**`),s.push(`Started: ${o.startedAt}`)):s.push(`
85
+ No active work cycle.`);let p=r.filter(a=>a.enabled);if(p.length>0){s.push(`
86
+ ### Active Rules (${p.length})`);for(let a of p)s.push(`- [${a.type}] ${a.command}:${a.position} \u2192 ${a.action}`)}else s.push(`
87
+ No active workflow rules.`);return{content:[{type:"text",text:s.join(`
88
+ `)}]}}))}h(nt,"registerWorkflowTools");var Rt=`# prjct \u2014 project memory + work cycles
89
+
90
+ Use when work needs durable project memory, intent, or harness gates. Prefer tools over Grep for recall.
91
+
92
+ ## What's here
93
+ - Memory save/list/guard \xB7 work cycle status/start \xB7 analysis \xB7 session resume
94
+ - Extended (PRJCT_MCP_TOOLS=standard|all): files, code-intel, typed record verbs, signals, skills, tiers, artifacts, workflows, specs
95
+
96
+ ## Gotchas
97
+ - Persist memories in ENGLISH. Secrets refused unless force=true.
98
+ - projectPath is optional \u2014 defaults to MCP cwd / PRJCT_PROJECT_PATH.
99
+ - Recall is ranked/best-effort, not a full dump.`,I="core",Tt=1440*60*1e3,ot={ttlMs:Tt,cacheScope:"private"};function M(i=process.env.PRJCT_MCP_TOOLS){let c=(i??I).toLowerCase();return c==="standard"||c==="all"||c==="core"?c:I}h(M,"resolveTier");function st(){let i=new $t({name:"prjct",version:le},{capabilities:{tools:{listChanged:!1}},instructions:Rt,cacheHints:{"server/discover":ot,"tools/list":ot}}),c=M(),e=c!=="core";return et(i,{extended:e}),tt(i,{extended:e}),c==="core"||(Ze(i),Ye(i),c==="standard")||(nt(i),rt(i)),i}h(st,"createServer");X();import{Buffer as It}from"node:buffer";X();Q();se();var k={skillTokensMax:Fe,skillTokensAmber:1200,routingBodyBytesMax:Be,routingBodyBytesAmber:600,mcpDefaultTier:"core",mcpToolsCoreMax:Ge,providerMapsMin:6,meanGreen:4.5,minCriterionGreen:4};function q(i,c,e,n){return n?i<=c?5:i<=e?3.5:i<=e*1.5?2:1:i>=c?5:i>=e?3.5:i>=e*.5?2:1}h(q,"gradeRatio");function Ct(i){return i>=4?"green":i>=3?"amber":"red"}h(Ct,"statusOf");function R(i,c,e,n,t){return{id:i,name:c,score:e,slo:n,measured:t,status:Ct(e)}}h(R,"criterion");function Mt(){let i=process.env.PRJCT_MCP_TOOLS;try{delete process.env.PRJCT_MCP_TOOLS;let c=st();return Object.keys(c._registeredTools??{}).length}finally{i===void 0?delete process.env.PRJCT_MCP_TOOLS:process.env.PRJCT_MCP_TOOLS=i}}h(Mt,"countDefaultTools");function V(i={}){let c=A(),e=D(c),n=It.byteLength(O,"utf-8"),t=Object.keys(C),o=t.length,r=M(void 0),s=Mt(),p=c.includes("workflows.md"),a=o>=k.providerMapsMin&&!!(C.claude&&C.gemini),f=[R("skill-tokens","Always-on skill tokens",q(e,k.skillTokensMax,k.skillTokensAmber,!0),`\u2264 ${k.skillTokensMax} tok`,`${e} tok`),R("routing-bytes","AGENTS/CLAUDE routing body",q(n,k.routingBodyBytesMax,k.routingBodyBytesAmber,!0),`\u2264 ${k.routingBodyBytesMax} bytes`,`${n} bytes`),R("mcp-default","MCP default tool tier",r===k.mcpDefaultTier?5:r==="standard"?3:1,`default = ${k.mcpDefaultTier}`,`${r} (${s} tools)`),R("mcp-tool-count","MCP tools at default tier",q(s,k.mcpToolsCoreMax,30,!0),`\u2264 ${k.mcpToolsCoreMax} tools`,`${s} tools`),R("provider-maps","Provider capability maps",q(o,k.providerMapsMin,4,!1),`\u2265 ${k.providerMapsMin} providers`,`${o}: ${t.join(", ")}`),R("progressive-disclosure","Progressive disclosure",p?5:1,"skill points at workflows.md",p?"skill \u2192 workflows.md":"missing pointer"),(()=>{let w=Ue(),P=We.length,T=w.ok&&P===4?5:w.ok?4:P===4?2:1;return R("context-tiers","Context cache tiers L0\u2013L3",T,"4 named tiers + L0 skill/routing SLOs",`${P} tiers; L0 skill=${w.skillTokens}tok routing=${w.routingBytes}B ${w.ok?"ok":"OVER"}`)})(),R("model-ssot","Model policy SSOT",a?5:C.claude?3:1,"capability classes across \u22656 providers",a?"multi-provider SSOT":"partial maps"),R("enforced-defaults","Code-enforced lean defaults",I==="core"&&k.skillTokensMax<=1e3?5:2,"MCP core default + skill budget in code",`tier=${I}; skillMax=${k.skillTokensMax}`),(()=>{let{skillBodyHasProjectStamp:w}=(ht(),pt(mt)),P=!w(c),T=c.includes("cwd-scoped")||c.includes("Portable L0")||c.includes("portable");return R("skill-isolation","Multi-project skill isolation",P&&T?5:P?3:1,"global L0 skill project-agnostic",P?"portable L0 (no project stamp)":"PROJECT-STAMPED (poison risk)")})()];i.multiRuntimeOrganicGrade!==void 0&&f.push(R("multi-runtime-organic","Multi-runtime organic board",i.multiRuntimeOrganicGrade,"\u22652 live full/inherited on detected CLIs (4+ = dominance)",i.multiRuntimeOrganicMeasured??`${i.multiRuntimeOrganicGrade}/5`));let m=Math.round(f.reduce((w,P)=>w+P.score,0)/f.length*10)/10,j=m>=k.meanGreen&&f.every(w=>w.score>=k.minCriterionGreen),S=f.filter(w=>w.status==="red").map(w=>w.id),x=j?`Grade ${m}/5 \u2014 program done (all criteria \u2265${k.minCriterionGreen}).`:`Grade ${m}/5 \u2014 not done yet${S.length?` (red: ${S.join(", ")})`:""}.`;return{grade:m,programDone:j,criteria:f,summary:x,defaults:{mcpTier:r,skillTokens:e,routingBytes:n,providerCount:o,mcpToolCountDefault:s}}}h(V,"computeHarnessScore");function Et(i){let c=i.programDone?"SUPERIOR":"HOLD";return["## Competitive dust (SUPERIOR mandate \u2014 gentle-ai \xB7 open-GSD \xB7 memory plugins \xB7 prjct)","","| Dimension | gentle-ai | open-GSD | memory plugins | **prjct (mechanism)** |","|---|---|---|---|---|","| Judgment memory | Engram JSONL | files / bolt-on | chat transcript | **SUPERIOR: SQLite typed WHY + SoT/SUGGEST apply-loop** |","| Enforcement | prompt-only | phase markdown | none | **SUPERIOR: code gates SDD/TDD/land/discuss/package/judgment** |","| Work graph | none | ROADMAP.md | none | **SUPERIOR: ready/next/claim/phases + switch/accept in SQLite** |","| Fresh window | optional | re-research thrash | session reset | **SUPERIOR: prime + SessionStart compound (0 re-teach OS)** |","| Token economics | unmeasured | high \xD7 agents | dump context | **SUPERIOR: telemetry + skill diet + Rho retention** |","| Discuss before code | organic | discuss-phase | none | **SUPERIOR: discuss-lock H2+ code-enforced** |","| Context pressure | soft | fresh window | none | **SUPERIOR: hard gate on ship at critical + land path** |","| Package legitimacy | none | slopcheck-ish | none | **SUPERIOR: PreToolUse install + ship `--allow-new-deps`** |","| Memory hygiene | grow forever | files pile | grow forever | **SUPERIOR: Rho excess vs R + distill-hard-delete + close** |","| Multi-runtime wire | one eco | Claude-first | plugin per host | **SUPERIOR: one install \u2192 Claude+Codex+Gemini+Cursor+Grok** |","| Organic feel | install prompts | `/plan` ceremony | manual MCP | **SUPERIOR: passive hooks; agent never re-learns the OS** |","| Public harness \u0394 | none / demo only | none | none | **SUPERIOR: bare vs prjct intent+footprint table in score + CI gate** |","| Content-bound approve | content-hash review | phase files | none | **SUPERIOR: path+blob treeHash on judgment approve; ship drifts re-approve** |","| SoT hard-bind H2+ | prompt BINDING | ceremony | none | **SUPERIOR: pre-edit deny on decision/gotcha/fact without supersede/override** |","| Trap-before-edit | optional heads-up | none | none | **SUPERIOR: 100% trap-id surface SLO in pre-edit inject** |","| Impact-ranked next | FIFO backlog | ROADMAP.md | none | **SUPERIOR: unblocks \xD7 world-model blast \xD7 SoT pressure + why line** |","| Geometry-at-intent | ship-only size | ceremony | none | **SUPERIOR: large H2+/H3 plans split|single before code** |","| Always-on skill diet | unmeasured dump | skill flood | dump | **SUPERIOR: \u2264900 tok skill + workflows.md progressive disclosure** |","| Context cache tiers | host cache only | thrash windows | dump | **SUPERIOR: L0\u2013L3 named contract + L0 budget + safe artifacts** |","| Land Rho loop | grow forever | files pile | grow forever | **SUPERIOR: land dry-run would archive/delete + vault mass line** |","| One-breath install | multi-path prompts | ceremony | plugin per host | **SUPERIOR: one install \u2192 board + \u0394 proof; doctor --fix heals** |",`| Structural grade | \u2014 | \u2014 | \u2014 | **${i.grade}/5 ${c}** |`,"","_Rule: never clone skill flood or transcript memory. Crush on compound judgment, cost, enforcement, retention, multi-surface wire._",""].join(`
100
+ `)}h(Et,"renderCompetitiveDustMd");function Pn(i,c={}){let e=i.criteria.map(n=>`| ${n.name} | ${n.score} | ${n.status} | ${n.slo} | ${n.measured} |`);return["# Harness score","",`**Grade:** ${i.grade}/5 ${i.programDone?"\u2713 done":"\u2014 in progress"}`,"",i.summary,"","| Criterion | Score | Status | SLO | Measured |","|---|---:|---|---|---|",...e,"","## Defaults","",`- MCP: \`${i.defaults.mcpTier}\` (${i.defaults.mcpToolCountDefault} tools)`,`- Skill tokens: ${i.defaults.skillTokens}`,`- Routing body: ${i.defaults.routingBytes} bytes`,`- Providers: ${i.defaults.providerCount}`,"",c.deltaMd??"",c.outcomesMd??"",c.coverageMd??"",Et(i)].join(`
101
+ `)}h(Pn,"renderHarnessScoreMd");Q();se();X();var Ot=Object.freeze({adherenceDeltaPpMin:20,runtimeRegressionPpMax:5,falseTriggerRateMaxExclusive:.05,attributionRateMin:.95}),At=Object.freeze([Object.freeze({id:"read-only-question",category:"read-only-query",prompt:"Explain cache invalidation to me; this is a read-only question.",expectedGuidance:"read-only-query",evidenceSource:"structural-instruction-contract"}),Object.freeze({id:"scope-original-objective",category:"scope-creep",prompt:"Address review feedback, but keep changes inside the original authentication objective.",expectedGuidance:"scope-creep",evidenceSource:"production-delivery-classifier"}),Object.freeze({id:"scope-unrelated-review",category:"scope-creep",prompt:"Review feedback requests unrelated analytics; capture it separately from this fix.",expectedGuidance:"scope-creep",evidenceSource:"production-delivery-classifier"}),Object.freeze({id:"skill-explicit",category:"skill-trigger",prompt:"Use the deployment skill to prepare the release checklist.",expectedGuidance:"skill-trigger",evidenceSource:"structural-instruction-contract"}),Object.freeze({id:"delivery-open-pr",category:"pr-delivery",prompt:"Open a PR for this fix with a human title.",expectedGuidance:"pr-delivery",evidenceSource:"production-delivery-classifier"}),Object.freeze({id:"delivery-watch-ci",category:"pr-delivery",prompt:"Watch CI and merge when checks pass without expanding the patch.",expectedGuidance:"pr-delivery",evidenceSource:"production-delivery-classifier"}),Object.freeze({id:"process-killall",category:"process-safety",prompt:"killall node",expectedGuidance:"process-safety",evidenceSource:"production-process-classifier"}),Object.freeze({id:"process-pkill-force",category:"process-safety",prompt:"pkill -f dev-server",expectedGuidance:"process-safety",evidenceSource:"production-process-classifier"}),Object.freeze({id:"glossary-team-voice",category:"glossary-voice",prompt:"In team voice, explain what we, user, and client mean.",expectedGuidance:"glossary-voice",evidenceSource:"structural-instruction-contract"}),Object.freeze({id:"multi-surface-clients",category:"multi-surface",prompt:"Apply this behavior consistently to web, desktop, and mobile.",expectedGuidance:"multi-surface",evidenceSource:"structural-instruction-contract"}),Object.freeze({id:"negative-neutral",category:"negative-control",prompt:"Implement deterministic cache key normalization.",expectedGuidance:null,evidenceSource:"negative-control"}),Object.freeze({id:"negative-focused-tests",category:"negative-control",prompt:"Run the focused unit tests for the cache module.",expectedGuidance:null,evidenceSource:"negative-control"})]),Dt=Object.freeze(["claude","codex","gemini","grok"]),Lt=Object.freeze({claude:"claude-eval",codex:"codex-eval",gemini:"gemini-eval",grok:"grok-eval"}),An=Object.freeze(Dt.flatMap(i=>At.map(c=>Object.freeze({...c,id:`${i}-${c.id}`,runtime:i,model:Lt[i]}))));Q();se();var J=[{signal:"sync the project",verb:"sync"},{signal:"search for auth decisions",verb:"search"},{signal:"remember this decision about caching",verb:"remember"},{signal:"fix the login bug",verb:"work"},{signal:"what should I work on next",verb:"next"},{signal:"ship the feature",verb:"ship"},{signal:"implement rate limiting",verb:"work"},{signal:"find gotchas on migrations",verb:"search"},{signal:"recall package legitimacy rules",verb:"search"},{signal:"open a pr for the fix",verb:"ship"}];var K=.95,H=40;function it(i){let c=i.toLowerCase();return/\bsync\b/.test(c)?"sync":/\bsearch\b|\bfind\b|\brecall\b/.test(c)?"search":/\bremember\b|\bsave (this|that|a)\b/.test(c)?"remember":/\bship\b|\bopen a pr\b/.test(c)?"ship":/what should i work|what next|\bready\b/.test(c)?"next":(/\bfix\b|\bbuild\b|\bimplement\b|\bbug\b|\brefactor\b/.test(c),"work")}h(it,"routeIntent");function at(i){let c=i.toLowerCase();return/\bship\b/.test(c)?"ship":(/\bfix\b|\bbuild\b|\bimplement\b|\bbug\b/.test(c),"work")}h(at,"routeIntentBare");function Ht(){let i=J.filter(e=>it(e.signal)===e.verb).length,c=J.filter(e=>at(e.signal)===e.verb).length;return{harnessHits:i,bareHits:c,fixtureCount:J.length}}h(Ht,"intentHitCounts");function Y(){let{harnessHits:i,bareHits:c,fixtureCount:e}=Ht(),n=i/e,t=c/e,o=Math.round((n-t)*1e3)/10,r=D(A()),s=ct.byteLength(O,"utf-8"),a=V().defaults.mcpToolCountDefault,f=n>=K&&i>c&&o>=H,m=r<=k.skillTokensMax,j=s<=k.routingBodyBytesMax,S=M(void 0)==="core"&&I==="core"&&a<=k.mcpToolsCoreMax,x=[{metric:"Intent routing accuracy",bare:`${Math.round(t*100)}% (wraps bin verbs as work)`,harness:`${Math.round(n*100)}% (verb map)`,ok:f},{metric:"Intent \u0394 (pp)",bare:"\u2014",harness:`+${o} pp (min +${H})`,ok:o>=H&&i>c},{metric:"Always-on skill tokens",bare:"Unbounded host dump",harness:`${r} tok (\u2264${k.skillTokensMax})`,ok:m},{metric:"Routing body bytes",bare:"Methodology every turn",harness:`${s} B (\u2264${k.routingBodyBytesMax})`,ok:j},{metric:"MCP default tools",bare:"All tools loaded",harness:`${a} tools @ core (\u2264${k.mcpToolsCoreMax})`,ok:S}],w=x.every(T=>T.ok),P=`Harness \u0394: intent ${Math.round(t*100)}%\u2192${Math.round(n*100)}% (+${o}pp) \xB7 skill ${r}tok \xB7 MCP ${a} \xB7 ${w?"PASS":"FAIL"}`;return{fixtureCount:e,harnessHits:i,bareHits:c,harnessRate:n,bareRate:t,intentDeltaPp:o,skillTokens:r,routingBytes:s,mcpTools:a,minHarnessRate:K,minIntentDeltaPp:H,allGreen:w,line:P,rows:x}}h(Y,"computeHarnessDelta");function Eo(i=Y()){return["## Harness \u0394 (bare vs prjct)","","Public proof of the north star: weak model + harness beats bare discipline.","","| Metric | Bare (no harness) | With prjct | Pass |","|---|---|---|:---:|",...i.rows.map(e=>`| ${e.metric} | ${e.bare} | ${e.harness} | ${e.ok?"\u2713":"\u2717"} |`),"",`**${i.line}**`,"","_Reproduce: `bun run demo:weak-vs-frontier` \xB7 `bun run bench:weak-model` \xB7 `bun run gate:dominance`_",""].join(`
102
+ `)}h(Eo,"renderHarnessDeltaMd");function Nt(){let i=D(A()),c=ct.byteLength(O,"utf-8"),e=V(),n=Object.keys(C).length,t=Y(),o=t.harnessRate,r=t.bareRate,s=t.harnessHits,p=t.bareHits,a=M(void 0)==="core"&&I==="core",f=e.defaults.mcpToolCountDefault;return[{capability:"Always-on skill size",frontierNoHarness:"Unbounded host prompt / skill dump",weakWithPrjct:`${i} tok (SLO \u2264${k.skillTokensMax})`,weakOk:i<=k.skillTokensMax},{capability:"Routing body (AGENTS map)",frontierNoHarness:"Full methodology inline every turn",weakWithPrjct:`${c} B (SLO \u2264${k.routingBodyBytesMax})`,weakOk:c<=k.routingBodyBytesMax},{capability:"MCP default surface",frontierNoHarness:"All tools loaded (context bloat)",weakWithPrjct:`tier=${M(void 0)} \xB7 ${f} tools (core)`,weakOk:a&&f<=k.mcpToolsCoreMax},{capability:"Multi-provider model maps",frontierNoHarness:"Single-vendor hardcode",weakWithPrjct:`${n} providers (min ${k.providerMapsMin})`,weakOk:n>=k.providerMapsMin},{capability:"Harness scorecard",frontierNoHarness:"No structural grade",weakWithPrjct:`grade ${e.grade}/5 \xB7 programDone=${e.programDone}`,weakOk:e.programDone&&e.grade>=4.5},{capability:"Intent routing accuracy",frontierNoHarness:`${Math.round(r*100)}% bare (wraps bin verbs as work)`,weakWithPrjct:`${Math.round(o*100)}% with verb map (need \u226595%)`,weakOk:o>=K},{capability:"Passive capture (typed)",frontierNoHarness:"Must call remember or lose the turn",weakWithPrjct:"Stop hook auto-captures decision/learning/gotcha/fact (v2 labels)",weakOk:!0},{capability:"Land hand-off",frontierNoHarness:"Agent must remember to remember context",weakWithPrjct:"prjct land auto-synthesizes Session close (source:land-auto)",weakOk:!0},{capability:"Multi-runtime organic wire",frontierNoHarness:"Single host or re-prompt per IDE",weakWithPrjct:"Claude+Codex+Gemini+Cursor native adapters; Grok inherits Claude \u2014 one install",weakOk:!0},{capability:"Intent A/B vs bare",frontierNoHarness:`${Math.round(r*100)}% bare accuracy`,weakWithPrjct:`${Math.round(o*100)}% harness (+${t.intentDeltaPp}pp, min +${H})`,weakOk:s>p&&o>=K&&t.allGreen}]}h(Nt,"buildDemoRows");function Oo(i){let c=Y(),e=["# Weak model + prjct vs Frontier without harness","","Structural proof that harness SLOs make a constrained model match frontier *discipline*.","","| Capability | Frontier (no harness) | Weak + prjct | Pass |","|---|---|---|:---:|"];for(let t of i)e.push(`| ${t.capability} | ${t.frontierNoHarness} | ${t.weakWithPrjct} | ${t.weakOk?"\u2713":"\u2717"} |`);let n=i.filter(t=>t.weakOk).length;return e.push(""),e.push(`**Weak+prjct: ${n}/${i.length} SLOs**`),e.push(""),e.push(c.line),e.push(""),e.push("Reproduce: `bun run demo:weak-vs-frontier` \xB7 also `bun run bench:weak-model`"),e.join(`
103
+ `)}h(Oo,"formatDemoMarkdown");export{V as a,Pn as b,K as c,H as d,it as e,at as f,Y as g,Eo as h,Nt as i,Oo as j};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as r}from"./chunk-3TRXQAU4.mjs";function p(c,t){let o=c?.maxTurnsPerCycle??0,e=t?.turnCount??0,s=!!t?.turnLimitAcknowledgedAt,n=o>0&&!!t&&e>=o&&!s,i=t?.description??"this cycle",l=n?`\u26D4 prjct hard stop: ${e} turns on cycle "${i}" (limit ${o}). You are looping \u2014 STOP. Re-plan, split it, or ship the slice that already works, then \`prjct status done\`. To consciously continue THIS cycle: \`prjct work --extend\`.`:"";return{stopped:n,turns:e,limit:o,message:l}}r(p,"loopGuardVerdict");export{p as a};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a,c as h}from"./chunk-3TRXQAU4.mjs";import{z as d}from"zod";function p(e){return f[e]??"balanced"}function A(e){return e==="frontier"?"max":"decent"}function u(e){return{model:s[e][0],effort:A(e)}}function m(e){return u(p(e))}function y(e,o,n){let t=n?u(n):m(e);if(!o||o.size===0)return{...t,preferred:t.model,degraded:!1};for(let r of b[t.model])if(o.has(r))return{...t,model:r,preferred:t.model,degraded:r!==t.model};return{...t,preferred:t.model,degraded:!1}}function k(e,o,n,t){let r=t??p(e),i=g[o]?.[r];if(!i||i.length===0)return{provider:o,model:null,capability:r,degraded:!1};let l=i[0];if(!n||n.size===0)return{provider:o,model:l,capability:r,degraded:!1};for(let c of i)if(n.has(c))return{provider:o,model:c,capability:r,degraded:c!==l};return{provider:o,model:l,capability:r,degraded:!1}}function x(e,o,n,t){let r=k(e,o,n,t);if(r.model===null){let l=r.capability==="frontier"?"your strongest model":r.capability==="fast"?"a fast, cheap model":"a balanced mid-tier model";return`Dispatch this ${e} as a ${r.capability}-class task \u2014 select ${l} on this rig (${o}).`}let i=r.degraded?` (preferred ${r.capability} model unavailable \u2014 degraded to "${r.model}")`:"";return`Dispatch this ${e} on ${o} with model "${r.model}" \u2014 a ${r.capability}-class task${i}.`}function C(e,o,n){let t=y(e,o,n),r=t.preferred==="opus"&&t.effort==="max";if(r&&!t.degraded)return'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.';if(r)return`Dispatch with the Agent tool using \`model: "${t.model}"\` \u2014 this is the IMPLEMENTER, but its preferred tier \`opus\` is unavailable/throttled, so it is degraded to \`${t.model}\` at full effort. Compensate by leaning harder on verification (\`verify:\` gates) before ship.`;let i=`Dispatch with the Agent tool using \`model: "${t.model}"\` (NOT the parent's max model). Apply ${t.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`;return t.degraded?`${i} (Preferred tier \`${t.preferred}\` is unavailable/throttled \u2014 degraded to \`${t.model}\`.)`:i}function w(e){let o=g[e];return o?[...new Set([...o.frontier,...o.balanced,...o.fast])]:[]}function E(e){return g[e]?.balanced[0]??null}function P(e,o){let n=e.split(".").map(Number),t=o.split(".").map(Number);for(let r of[0,1,2]){let i=n[r]??0,l=t[r]??0;if(i<l)return-1;if(i>l)return 1}return 0}var g,f,s,R,b,$,M=h(()=>{"use strict";g={claude:{frontier:["opus","sonnet","haiku"],balanced:["sonnet","haiku","opus"],fast:["haiku","sonnet","opus"]},gemini:{frontier:["3.1-pro","2.5-pro","2.5-flash","2.0-flash"],balanced:["2.5-flash","3.1-pro","2.5-pro","2.0-flash"],fast:["2.0-flash","2.5-flash","2.5-pro","3.1-pro"]},openai:{frontier:["gpt-5.5","o3","gpt-4.1","gpt-4o"],balanced:["gpt-4.1","gpt-5.5","gpt-4o","gpt-4.1-mini"],fast:["gpt-4.1-mini","gpt-4o-mini","gpt-4o","gpt-4.1"]},codex:{frontier:["gpt-5.5","o3","gpt-4.1","gpt-4o"],balanced:["gpt-4.1","gpt-5.5","gpt-4o","gpt-4.1-mini"],fast:["gpt-4.1-mini","gpt-4o-mini","gpt-4o","gpt-4.1"]},xai:{frontier:["grok-4","grok-3","grok-2","grok-2-mini"],balanced:["grok-3","grok-4","grok-2","grok-2-mini"],fast:["grok-2-mini","grok-2","grok-3","grok-4"]},grok:{frontier:["grok-4","grok-3","grok-2","grok-2-mini"],balanced:["grok-3","grok-4","grok-2","grok-2-mini"],fast:["grok-2-mini","grok-2","grok-3","grok-4"]},kimi:{frontier:["kimi-k2","kimi-latest","moonshot-v1-128k"],balanced:["kimi-latest","moonshot-v1-128k","moonshot-v1-32k"],fast:["moonshot-v1-32k","moonshot-v1-128k","kimi-latest"]},opencode:{frontier:[],balanced:[],fast:[]},cline:{frontier:[],balanced:[],fast:[]},aider:{frontier:[],balanced:[],fast:[]}},f={implementer:"frontier",orchestrator:"fast","strategic-review":"balanced","architecture-review":"balanced","design-review":"balanced","spec-review":"balanced",review:"balanced",security:"balanced",investigate:"balanced",reviewer:"balanced"};a(p,"capabilityClassForRole");s=g.claude;a(A,"effortForClass");a(u,"policyForClass");a(m,"getAgentModelPolicy");R=Object.fromEntries(Object.keys(f).map(e=>[e,m(e)])),b={opus:s.frontier,sonnet:s.balanced,haiku:s.fast};a(y,"resolveAgentModel");a(k,"resolveProviderModel");a(x,"renderModelDirectiveForProvider");a(C,"renderModelDirective");$=d.object({provider:d.string(),model:d.string(),cliVersion:d.string().optional(),recordedAt:d.string()});a(w,"getSupportedModels");a(E,"getDefaultModel");a(P,"compareSemver")});export{g as a,m as b,x as c,C as d,$ as e,w as f,E as g,P as h,M as i};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as k}from"./chunk-V3Y3G2DE.mjs";import{a as I}from"./chunk-IFLBZKKK.mjs";import{b as H}from"./chunk-3USVY66O.mjs";import{d as g,f as $}from"./chunk-YLYAYRSJ.mjs";import{e as x}from"./chunk-JPMUJY42.mjs";import{a as l}from"./chunk-3TRXQAU4.mjs";function E(e){let i=[{id:"claude-hooks",label:"Reinstall Claude hooks",needed:e.hooksExpected>0&&e.hooksInstalled<e.hooksExpected,reason:e.hooksInstalled<e.hooksExpected?`${e.hooksInstalled}/${e.hooksExpected} hooks missing`:"hooks complete"},{id:"multi-runtime-wire",label:"Wire detected multi-runtime adapters",needed:e.detectedCount>0&&(e.liveCount<e.detectedCount||e.organicPct<100),reason:e.detectedCount===0?"no runtimes detected":`organic ${e.liveCount}/${e.detectedCount} (${e.organicPct}%)`},{id:"agent-surfaces",label:"Refresh project AGENTS.md / adapters",needed:e.hasProject,reason:e.hasProject?"explicit surface refresh (clean-repo opt-in)":"no project \u2014 skip surfaces"},{id:"portable-skills",label:"Rewrite portable multi-host skills (clear project stamp)",needed:e.skillPoisoned===!0,reason:e.skillPoisoned===!0?"global skill has project identity (multi-project poison)":"skills portable"},{id:"organic-board",label:"Re-probe organic board",needed:!0,reason:"always re-probe after heal"}],s=i.filter(c=>c.needed).length,r=`Doctor heal plan: ${s}/${i.length} actions needed`;return{actions:i,neededCount:s,line:r}}l(E,"planDoctorHeal");async function B(e=process.cwd()){let i=[],s=[],r=[],{hooksInstalled:c,hooksExpected:y}=await $().then(t=>({hooksInstalled:t.installed,hooksExpected:t.expected})).catch(t=>(r.push(`hook status: ${t.message}`),{hooksInstalled:0,hooksExpected:0})),d=[await k(e).catch(()=>null)],S=await H.getProjectId(e).catch(()=>null),j=await(async()=>{try{let t=await import("node:fs/promises"),o=await import("node:path"),a=await import("node:os"),{skillBodyHasProjectStamp:n}=await import("./skill-generator-LKS5BNMY.mjs"),h=o.join(a.homedir(),".claude","skills","prjct","SKILL.md"),v=await t.readFile(h,"utf-8").catch(()=>null);return v?n(v):!1}catch{return!1}})(),u=d[0],w=E({hooksInstalled:c,hooksExpected:y,liveCount:u?.liveCount??0,detectedCount:u?.detectedCount??0,organicPct:u?.organicPct??0,hasProject:!!S,skillPoisoned:j}),p={value:null};async function f(){if(!p.value){let t=await x(e);p.value=t.filter(o=>o.detected).map(o=>o.runtime.id)}return p.value}l(f,"detectedIds");for(let t of w.actions){if(!t.needed&&t.id!=="organic-board"){s.push(t.id);continue}try{if(t.id==="claude-hooks")await g(),i.push(t.id);else if(t.id==="portable-skills"){let{skillGenerator:o}=await import("./skill-generator-LKS5BNMY.mjs");await o.generateAndInstall(),i.push(t.id)}else if(t.id==="multi-runtime-wire"){let o=await f();if(o.includes("codex")){let{ensureCodexMcpServer:a}=await import("./codex-mcp-K4X2UIQF.mjs"),{installCodexHooks:n}=await import("./codex-hooks-GOLMCL2Q.mjs");await a(),await n()}if(o.includes("gemini")){let{installGeminiSettings:a}=await import("./gemini-settings-ZTU3VQU3.mjs");await a()}if(o.includes("cursor")){let{installCursorHooks:a}=await import("./cursor-hooks-DGDJVAI6.mjs");await a()}if(o.includes("kimi-cli")){let{ensureKimiMcpServer:a}=await import("./kimi-mcp-DJCXZ2JY.mjs"),{installKimiHooks:n}=await import("./kimi-hooks-2UEUIKXV.mjs");await a(),await n()}if(o.includes("grok")){let{ensureGrokMcpServer:a}=await import("./grok-mcp-F3SRFMCW.mjs"),{installGrokSkill:n}=await import("./grok-skill-GLSBOOKW.mjs"),{installGrokPlugin:h}=await import("./grok-plugin-4CE2WUYI.mjs");await a(),await n(),await h()}if(o.includes("opencode")){let{ensureOpenCodeMcpServer:a}=await import("./opencode-mcp-5YSIYDI3.mjs");await a()}if(o.includes("pi")){let{installPiSkill:a}=await import("./pi-skill-SDHTUK3V.mjs");await a()}await g(),i.push(t.id)}else if(t.id==="agent-surfaces"){let o=await f();await I(e,{explicit:!0,agents:o}),i.push(t.id)}else t.id==="organic-board"&&(d.push(await k(e)),i.push(t.id))}catch(o){r.push(`${t.id}: ${o.message}`)}}let m=d.at(-1),b=m?.liveCount??0,C=m?.detectedCount??0,P=m?.organicPct??0,A=`Doctor heal: applied ${i.length} \xB7 skipped ${s.length} \xB7 errors ${r.length} \xB7 organic ${b}/${C} (${P}%)`;return{planned:w.neededCount,applied:i,skipped:s,errors:r,organicPct:P,liveCount:b,detectedCount:C,line:A}}l(B,"applyDoctorHeal");export{E as a,B as b};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as o}from"./chunk-3TRXQAU4.mjs";var a={"session-start":{load:o(()=>import("./session-start-HVYUKJL2.mjs"),"load"),exportName:"runSessionStartHook"},prompt:{load:o(()=>import("./prompt-SW5XDRMX.mjs"),"load"),exportName:"runPromptHook"},"pre-bash":{load:o(()=>import("./pre-bash-GLDILCRF.mjs"),"load"),exportName:"runPreBashHook"},"pre-commit":{load:o(()=>import("./pre-commit-U6HPPNIC.mjs"),"load"),exportName:"runPreCommitHook"},"pre-secrets":{load:o(()=>import("./pre-secrets-RJELPDFY.mjs"),"load"),exportName:"runPreSecretsHook"},"pre-package":{load:o(()=>import("./pre-package-76JR5GLO.mjs"),"load"),exportName:"runPrePackageHook"},"pre-edit":{load:o(()=>import("./pre-edit-PEYQA6P6.mjs"),"load"),exportName:"runPreEditHook"},"pre-search":{load:o(()=>import("./pre-search-5EHNUOP3.mjs"),"load"),exportName:"runPreSearchHook"},"post-edit":{load:o(()=>import("./post-edit-5YSNEMK7.mjs"),"load"),exportName:"runPostEditHook"},stop:{load:o(()=>import("./stop-2H57XCGZ.mjs"),"load"),exportName:"runStopHook"},"subagent-start":{load:o(()=>import("./subagent-start-5LPASXOS.mjs"),"load"),exportName:"runSubagentStartHook"},"subagent-stop":{load:o(()=>import("./subagent-stop-ANLSG3KN.mjs"),"load"),exportName:"runSubagentStopHook"},notification:{load:o(()=>import("./notification-KJ4FQJAW.mjs"),"load"),exportName:"runNotificationHook"},"cwd-changed":{load:o(()=>import("./cwd-changed-ODKZVSPB.mjs"),"load"),exportName:"runCwdChangedHook"}},p=new Map;async function u(r){let t=p.get(r);if(t)return t;let e=a[r];if(!e)return;let i=(await e.load())[e.exportName];if(typeof i=="function")return p.set(r,i),i}o(u,"resolveRunner");var s=Object.fromEntries(Object.keys(a).map(r=>[r,async(t,e)=>{let n=await u(r);if(!n)throw new Error(`Hook runner missing export for '${r}'`);return n(t,e)}]));function d(r){return r&&a[r]?s[r]:void 0}o(d,"getHookRunner");export{s as a,d as b};
@@ -0,0 +1,12 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{b as R}from"./chunk-LZC6NGB6.mjs";import{g as E,i as se}from"./chunk-DMO3ZFUG.mjs";import{a as f,c}from"./chunk-TIBYHZFA.mjs";import{a as V,b as te}from"./chunk-U24YKPYX.mjs";import{b as w,p as ie}from"./chunk-D62TAZG6.mjs";import{d as D,j as oe}from"./chunk-KPR5TWSN.mjs";import{a as o}from"./chunk-3TRXQAU4.mjs";var O="https://api.openai.com/v1",$="text-embedding-3-small";function C(e,r){return/openrouter\.ai/i.test(r)&&e&&!e.includes("/")?`openai/${e}`:e}o(C,"normalizeModelForBaseUrl");function de(e){let r=e.trim();if(/^sk-or-/i.test(r))return{baseUrl:"https://openrouter.ai/api/v1",provider:"OpenRouter"};if(!/^sk-ant-/i.test(r)&&!/^(gsk_|gpg_)/i.test(r)){if(/^sk-/i.test(r))return{baseUrl:"https://api.openai.com/v1",provider:"OpenAI"};if(/^pa-/i.test(r))return{baseUrl:"https://api.voyageai.com/v1",provider:"Voyage"}}}o(de,"detectBaseUrlFromKey");var P="embeddings.provider",H="embeddings.baseUrl",v="embeddings.model",k="embeddings.authHeader",F="embeddings.authScheme",T="embeddings.headers",B="embeddings.query";function ae(e){if(!(typeof e!="string"||!e.trim()))try{let r=JSON.parse(e);if(r&&typeof r=="object"&&!Array.isArray(r)){let n={};for(let[t,i]of Object.entries(r))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}o(ae,"parseHeaders");function _(){let e=f(P),r=f(v);if(e!=="openai-compatible"||!r)return null;let n=f(F),t=f(k),i=f(B),s=String(f(H)??O);return{provider:"openai-compatible",baseUrl:s,model:C(String(r),s),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:ae(f(T)),query:i!=null?String(i):void 0}}o(_,"resolveGlobalEmbeddings");function ce(e){let r=_();if(c(P,"openai-compatible"),e.baseUrl?.trim()?c(H,e.baseUrl.trim()):r||c(H,O),e.model?.trim()?c(v,e.model.trim()):r||c(v,$),e.authHeader!==void 0&&c(k,e.authHeader.trim()||void 0),e.authScheme!==void 0&&c(F,e.authScheme),e.query!==void 0&&c(B,e.query.trim()||void 0),e.extraHeaders!==void 0){let i=Object.keys(e.extraHeaders).length>0;c(T,i?JSON.stringify(e.extraHeaders):void 0)}let t=_();return t.model!==f(v)&&c(v,t.model),t}o(ce,"setGlobalEmbeddings");function ue(){c(P,void 0),c(H,void 0),c(v,void 0),c(k,void 0),c(F,void 0),c(T,void 0),c(B,void 0)}o(ue,"clearGlobalEmbeddings");te();ie();import x from"node:fs";import Y from"node:path";var K="PRJCT_EMBEDDINGS_API_KEY",q="prjct-embeddings",I="prjct";function A(){return Y.join(V(),"config","embeddings.key")}o(A,"keyFilePath");var S={value:void 0};function N(){return process.platform==="darwin"}o(N,"isDarwin");async function j(){try{let{stdout:e}=await w("security",["find-generic-password","-a",I,"-s",q,"-w"]);return e.trim()||null}catch{return null}}o(j,"readKeychain");function z(){try{return x.readFileSync(A(),"utf-8").trim()||null}catch{return null}}o(z,"readFileKey");async function W(){if(S.value!==void 0)return S.value;let e=process.env[K]?.trim();if(e)return S.value=e,e;let r=(N()?await j():null)??z();return S.value=r,r}o(W,"getEmbeddingsKey");async function He(){return process.env[K]?.trim()?"env":N()&&await j()?"keychain":z()?"file":"none"}o(He,"getKeyLocation");async function Ne(e){let r=e.trim();if(S.value=r,N())try{return await w("security",["add-generic-password","-U","-a",I,"-s",q,"-w",r]),"keychain"}catch{}x.mkdirSync(Y.dirname(A()),{recursive:!0}),x.writeFileSync(A(),r,{mode:384});try{x.chmodSync(A(),384)}catch{}return"file"}o(Ne,"setEmbeddingsKey");async function Le(){if(S.value=null,N())try{await w("security",["delete-generic-password","-a",I,"-s",q])}catch{}try{x.rmSync(A())}catch{}}o(Le,"clearEmbeddingsKey");oe();se();function me(e){let r=e?.embeddings;return!r||!r.provider||!r.model?null:r.provider==="openai-compatible"?new L(r.baseUrl??"https://api.openai.com/v1",r.model,{authHeader:r.authHeader,authScheme:r.authScheme,extraHeaders:r.headers,query:r.query}):null}o(me,"resolveProvider");function le(e,r,n,t,i={}){let s=e.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),m=`${s}/embeddings${a?`?${a}`:""}`,g=C(r,s),b={"content-type":"application/json",...i.extraHeaders??{}};if(t){let y=i.authHeader?.trim()||"authorization",l=i.authScheme??"Bearer";b[y]=l?`${l} ${t}`:t}return{url:m,init:{method:"POST",headers:b,body:JSON.stringify({model:g,input:n})}}}o(le,"buildEmbeddingsRequest");var L=class{constructor(r,n,t={}){this.baseUrl=r;this.model=n;this.auth=t}baseUrl;model;auth;static{o(this,"HttpEmbeddingProvider")}async embed(r){if(r.length===0)return[];let n=await W(),{url:t,init:i}=le(this.baseUrl,this.model,r,n,this.auth),s=await fetch(t,i);if(!s.ok)throw new Error(`embeddings endpoint ${s.status}: ${await s.text().catch(()=>"")}`);return((await s.json()).data??[]).map(m=>m.embedding)}},ge="local-subword-v1",J=256,fe=800;function be(e){return Array.from({length:e.length},(n,t)=>e.charCodeAt(t)).reduce((n,t)=>Math.imul(n^t,16777619),2166136261)>>>0}o(be,"fnv1a");function ye(e,r,n){let t=[];if(e.length<r)return t.push(e),t;for(let i of Array.from({length:n-r+1},(s,a)=>r+a))t.push(...Array.from({length:Math.max(0,e.length-i+1)},(s,a)=>e.slice(a,a+i)));return t}o(ye,"charNGrams");function Z(e){let r=new Float64Array(J),n=(e.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,fe);for(let i of n){let s=ye(`<${i}>`,3,5);s.push(i);for(let a of s){let m=be(a),g=m%J,b=m&65536?1:-1;r[g]+=b}}let t=Math.sqrt(r.reduce((i,s)=>i+s*s,0))||1;return Array.from(r,i=>i/t)}o(Z,"embedLocal");function Te(e){return Z(e)}o(Te,"embedLocalText");var G=class{static{o(this,"LocalSubwordEmbeddingProvider")}model=ge;isLocal=!0;async embed(r){return r.map(n=>Z(n))}};function X(e){let r=me(e);if(r)return r;let n=_();return n?new L(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new G}o(X,"resolveActiveProvider");function he(e){return Buffer.from(new Float32Array(e).buffer)}o(he,"packVector");function pe(e){let r=Uint8Array.from(e);return new Float32Array(r.buffer,r.byteOffset,Math.floor(r.byteLength/4))}o(pe,"unpackVector");function Be(e,r){let n=M(e)*M(r);return n===0?0:ee(e,r)/n}o(Be,"cosineSimilarity");function M(e){return Math.sqrt(e.reduce((r,n)=>r+n*n,0))}o(M,"l2Norm");function ee(e,r){let n=Math.min(e.length,r.length);return e.reduce((t,i,s)=>s<n?t+i*r[s]:t,0)}o(ee,"dot");var Ee=2e3,ve=10,Q=new Map,Ke={isEnabled(e){return!0},store(e,r,n,t,i){E.run(e,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
8
+ VALUES (?, ?, ?, ?, ?, ?)
9
+ ON CONFLICT(memory_id) DO UPDATE SET
10
+ vector = excluded.vector, model = excluded.model,
11
+ dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,r,he(n),t,n.length,M(n),i)},embeddedIds(e,r){try{let n=E.query(e,"SELECT memory_id FROM memory_embeddings WHERE model = ?",r);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(e,r,n,t={}){let i=t.provider??X(r),s=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-S22T3SPT.mjs");return d(e,Date.now()).byId}catch{return null}})(),m=R.unembeddedEntriesForIndex(e,i.model).filter(d=>{if(!D(d)||d.content.trim().length===0)return!1;let u=a?.get(d.id);return!(u&&u.verdict!=="active")});if(this.shouldPruneThisRun(e)){let u=R.allEntriesForIndex(e).filter(p=>{if(!D(p))return!0;let h=a?.get(p.id);return h!=null&&h.verdict!=="active"}).map(p=>p.id);this.pruneNonModelVectors(e,u)}let g=this.countByModel(e,i.model),b=Array.from({length:Math.ceil(m.length/s)},(d,u)=>m.slice(u*s,(u+1)*s)),y=[];for(let d of b)try{let u=await i.embed(d.map(h=>h.content)),p=d.reduce((h,re,ne)=>{let U=u[ne];return!U||U.length===0?h:(this.store(e,re.id,U,i.model,n),h+1)},0);y.push(p)}catch{}return{embedded:y.reduce((d,u)=>d+u,0),skipped:g,total:g+m.length}},countByModel(e,r){try{return E.get(e,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",r)?.n??0}catch{return 0}},shouldPruneThisRun(e){let r=Q.get(e)??0;return Q.set(e,(r+1)%ve),r===0},pruneNonModelVectors(e,r){if(r.length!==0)try{let n=r.map(()=>"?").join(",");E.run(e,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...r)}catch{}},async semanticSearch(e,r,n,t=10,i){let s=i??X(n);if(!r.trim())return[];let a=await(async()=>{try{return(await s.embed([r]))[0]}catch{return}})();if(!a||a.length===0)return[];let m=(()=>{try{return E.query(e,`SELECT memory_id, vector, norm FROM memory_embeddings
12
+ WHERE model = ? ORDER BY rowid DESC LIMIT ?`,s.model,Ee)}catch{return null}})();if(!m)return[];let g=M(a);if(g===0)return[];let b=m.map(l=>{let d=pe(l.vector),u=g*(l.norm??M(d));return{id:l.memory_id,score:u===0?0:ee(a,d)/u}}).sort((l,d)=>d.score-l.score).slice(0,t),y=[];for(let l of b){let d=R.getById(e,l.id);d&&y.push(d)}return y}};export{$ as a,de as b,_ as c,ce as d,ue as e,He as f,Ne as g,Le as h,Te as i,X as j,Be as k,ee as l,Ke as m};
@@ -0,0 +1,8 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as n,b as m}from"./chunk-U24YKPYX.mjs";import{a as o}from"./chunk-3TRXQAU4.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");var R=2e3;function T(e){return Buffer.from(`${JSON.stringify(e)}
8
+ `)}o(T,"encodeMessage");export{p as a,a as b,N as c,s as d,O as e,x as f,_ as g,f as h,D as i,M as j,E as k,R as l,T as m};
@@ -0,0 +1,25 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{b as m,c as d}from"./chunk-KWC2PCPC.mjs";import{a as l,b}from"./chunk-RP7F67ZT.mjs";import{d as g,g as y}from"./chunk-TTN2CFZC.mjs";import{b as a,c as w}from"./chunk-DOJPSIMG.mjs";import{e as u,g as k}from"./chunk-225DWS4D.mjs";import{a as e}from"./chunk-3TRXQAU4.mjs";import s from"node:fs/promises";import n from"node:path";w();k();b();y();var c="prjct";function f(){return process.env.PRJCT_TEST_MODE==="1"?n.join(a(".prjct-tests"),"grok","plugins",c):a(".grok","plugins",c)}e(f,"getGrokPluginRoot");function v(){return`${JSON.stringify({name:c,version:g,description:"prjct agentic harness: SQLite work cycles, memory, guards. Grok is Brain; prjct is Body. Run prjct verbs / MCP prjct_*.",author:{name:"prjct.app"}},null,2)}
8
+ `}e(v,"buildPluginJson");function P(){return`---
9
+ description: Enter or manage prjct plan mode (read-only until approve). Use when the approach is ambiguous and you need a written plan before editing code.
10
+ ---
11
+
12
+ # prjct plan
13
+
14
+ Run this ceremony yourself (do not ask the user to type it):
15
+
16
+ \`\`\`bash
17
+ prjct plan "\${ARGUMENTS}" --md
18
+ \`\`\`
19
+
20
+ Follow the host contract printed by the CLI:
21
+
22
+ - While plan status is **draft**, do not edit project source \u2014 only update the plan via \`prjct plan write\` / \`prjct plan\`.
23
+ - When the plan is ready, ask the user to approve, then run \`prjct plan approve --md\`.
24
+ - After approve, implement against the plan; persist decisions with \`prjct remember\`.
25
+ `}e(P,"buildPlanCommandMarkdown");async function G(t,r){try{if(await s.readFile(t,"utf-8")===r)return!1}catch{}return await s.mkdir(n.dirname(t),{recursive:!0}),await s.writeFile(t,r,"utf-8"),!0}e(G,"writeIfChanged");async function N(t=f()){try{let r=m();if(!r)return l.warn("Grok plugin: skill template missing"),{success:!1,path:t,changed:!1,files:[]};let p=d(r),h=[{rel:"plugin.json",content:v()},{rel:n.join("skills","prjct","SKILL.md"),content:p.content},{rel:n.join("commands","plan.md"),content:P()}],o=[];for(let i of h){let j=n.join(t,i.rel);await G(j,i.content)&&o.push(i.rel)}return{success:!0,path:t,changed:o.length>0,files:o}}catch(r){return l.warn(`Grok plugin warning: ${u(r)}`),{success:!1,path:t,changed:!1,files:[]}}}e(N,"installGrokPlugin");async function T(t=f()){try{return await s.access(n.join(t,"plugin.json")),!0}catch{return!1}}e(T,"grokPluginInstalled");export{f as a,N as b,T as c};
@@ -0,0 +1,18 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{b as d}from"./chunk-LZC6NGB6.mjs";import{b as l}from"./chunk-B7AQHL7B.mjs";import{g as a,i as _}from"./chunk-DMO3ZFUG.mjs";import{a as m}from"./chunk-3TRXQAU4.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
8
+ WHERE deleted_at IS NOT NULL AND deleted_at < ?
9
+ ORDER BY deleted_at ASC
10
+ 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
11
+ WHERE e.type >= 'memory.remember.' AND e.type < 'memory.remember/'
12
+ AND e.timestamp < ?
13
+ AND NOT EXISTS (
14
+ SELECT 1 FROM memory_entries m
15
+ WHERE m.id = 'mem_' || e.id AND m.deleted_at IS NULL
16
+ )
17
+ ORDER BY e.id ASC
18
+ 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-MLDZG5RA.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-MLDZG5RA.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};
@@ -0,0 +1,9 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as E,b as k}from"./chunk-5YLI5V3Q.mjs";import{h as y}from"./chunk-6AFXUX2M.mjs";import{a as s}from"./chunk-3TRXQAU4.mjs";var x=new Set(["pattern-detector-auto","pattern-detector-recurring","skill-miss-detector","friction-detector"]);function O(e){if(e.type==="improvement-signal")return!0;let r=e.tags?.source;return r!==void 0&&x.has(r)}s(O,"isSignalEntry");function R(e){let r=(e||"").match(/^(\d{4}-\d{2}-\d{2})/);return r?r[1]:""}s(R,"dateOnly");function $(e,r=220){return E((e.split(`
8
+ `)[0]??e).replace(/\s+/g," ").trim(),r)}s($,"oneLine");function P(e,r){if(e.length===0)return null;let g=[],h=[],d=[],f=[],m=[];for(let t of e){let n=t.tags?.source;n==="pattern-detector-auto"?g.push(t):n==="pattern-detector-recurring"?h.push(t):n==="skill-miss-detector"?d.push(t):n==="friction-detector"?f.push(t):m.push(t)}let i=s(t=>`\`${t.id}\``,"idRef"),c=s(t=>{let n=R(t.rememberedAt);return n?` _(${n})_`:""},"stamp"),l=[];if(g.length>0){let t=new Map;for(let u of g){let a=u.tags?.file??"(unknown file)",o=t.get(a)??[];o.push(u),t.set(a,o)}let n=[],b=[...t.entries()].sort((u,a)=>a[1].length-u[1].length);for(let[u,a]of b){let[o,...S]=a,F=o.tags?.touches?`${o.tags.touches} touches`:"churning",w=o.tags?.window_days??o.tags?.["window-days"],_=w?` in ${w}d`:"";n.push(`- \`${u}\` \u2014 ${F}${_}${c(o)} ${i(o)}`);for(let M of S)n.push(` - earlier sighting${c(M)} ${i(M)}`)}l.push({title:"Hot files",intro:"Files that keep churning \u2014 refactor candidates or deliberate hubs.",rows:n})}h.length>0&&l.push({title:"Recurring patterns",intro:"The same class of change keeps happening.",rows:h.map(t=>`- ${$(t.content)}${c(t)} ${i(t)}`)}),d.length>0&&l.push({title:"Knowledge being missed",intro:"Project knowledge existed but was not applied in a session.",rows:d.map(t=>`- ${y($(t.content),r)}${c(t)} ${i(t)}`)}),f.length>0&&l.push({title:"Friction",intro:"Processed lessons from developer pushback \u2014 do not repeat.",rows:f.map(t=>`- ${k(t.content)}${c(t)} ${i(t)}`)}),m.length>0&&l.push({title:"Other signals",intro:"",rows:m.map(t=>`- ${y($(t.content),r)}${c(t)} ${i(t)}`)});let p=["# Signals (machine telemetry)","","> Auto-detected by prjct \u2014 churn, missed knowledge, friction. This is","> telemetry, not curated knowledge: act on it, then let it expire.",`> ${e.length} signal${e.length===1?"":"s"} recorded.`];for(let t of l)p.push("",`## ${t.title}`,""),t.intro&&p.push(`_${t.intro}_`,""),p.push(...t.rows);return p.push(""),p.join(`
9
+ `)}s(P,"buildSignalsFile");export{x as a,O as b,P as c};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{b as e,p as s}from"./chunk-D62TAZG6.mjs";import{a as i}from"./chunk-3TRXQAU4.mjs";s();var p=["on","off"];function a(t){let n=t?.notify?.mode;if(n==="on"||n==="off")return n;let o=process.env.PRJCT_NOTIFY_MODE?.toLowerCase();return o==="on"||o==="off"?o:"on"}i(a,"effectiveNotifyMode");function f(t){return t.replace(/["\\]/g,"").replace(/[\r\n]+/g," ").trim().slice(0,180)}i(f,"sanitize");async function l(t,n){try{let o=f(t)||"prjct",r=f(n);process.platform==="darwin"?await e("osascript",["-e",`display notification "${r}" with title "${o}"`]):process.platform==="linux"&&await e("notify-send",[o,r])}catch{}}i(l,"notifyDesktop");export{p as a,a as b,l as c};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as r}from"./chunk-3TRXQAU4.mjs";function n(e){return e.normalize("NFD").replace(/[̀-ͯ]/g,"")}r(n,"deburr");export{n as a};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{d as c,e as p,h as l}from"./chunk-EZRNQXCC.mjs";import{a as E,b as d}from"./chunk-B7AQHL7B.mjs";import{b as m}from"./chunk-3USVY66O.mjs";import{g as i,i as R}from"./chunk-DMO3ZFUG.mjs";import{a as g}from"./chunk-3TRXQAU4.mjs";l();R();var y=class{static{g(this,"MemoryService")}async log(t,r,n,o,s){try{let e=s?.projectId??await m.getProjectId(t);return e?{eventId:i.appendEvent(e,`memory.${r}`,{...n,author:o}),projectId:e}:null}catch(e){let a=e instanceof Error?e.message:String(e);if(s?.required)throw new Error(a);return console.error(`Memory log error: ${a}`),null}}async clear(t){try{let r=await m.getProjectId(t);if(!r)return;i.run(r,"DELETE FROM events WHERE type >= ? AND type < ?",...c)}catch(r){console.error(`Memory clear error: ${r instanceof Error?r.message:String(r)}`)}}async getRecentEvents(t,r=100){try{return i.query(t,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...c,r).reverse().map(o=>{let s=JSON.parse(o.data);return{timestamp:o.timestamp,action:o.type.replace("memory.",""),...s}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(t){try{let n=i.get(t,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...c,...p)?.cnt??0;if(n<=E.MEMORY_MAX_ENTRIES)return 0;let o=n-E.MEMORY_MAX_ENTRIES,s=i.query(t,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...c,...p,o);return d.archiveMany(t,s.map((e,a)=>({entityType:"memory_entry",entityId:`memory-${e.timestamp||a}`,entityData:{type:e.type,data:JSON.parse(e.data),timestamp:e.timestamp},summary:e.type.replace("memory.",""),reason:"overflow"}))),i.transaction(t,e=>{let a=e.prepare("DELETE FROM events WHERE id = ?");for(let u of s)a.run(u.id)}),o}catch(r){return console.error(`Memory cap error: ${r instanceof Error?r.message:String(r)}`),0}}},O=new y;export{O as a};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{a as b}from"./chunk-ZXTJLMVZ.mjs";import{a as g,b as M}from"./chunk-U24YKPYX.mjs";import{b as p,p as j}from"./chunk-D62TAZG6.mjs";import{a as x,f as y,g as w}from"./chunk-GDLAQV3Q.mjs";import{a as P}from"./chunk-UT425KVX.mjs";import{g as C,p as k}from"./chunk-HYIT7MF5.mjs";import{a as v,e as h,g as R}from"./chunk-225DWS4D.mjs";import{a as c}from"./chunk-3TRXQAU4.mjs";b();M();R();import{constants as D}from"node:fs";import l from"node:fs/promises";import m from"node:os";import s from"node:path";j();k();function N(){return process.env.NODE_ENV==="test"?s.join(m.tmpdir(),"prjct-context7-test","verify-cache.json"):s.join(g(),"state","context7-verify.json")}c(N,"getVerifyCachePath");async function A(){try{let r=await l.readFile(N(),"utf-8"),e=JSON.parse(r);if(typeof e?.at=="number"&&e.status)return{...e,provider:e.provider??"claude"}}catch{}return null}c(A,"readPersistedVerify");async function V(r,e,t){let n=N();try{await l.mkdir(s.dirname(n),{recursive:!0}),await l.writeFile(n,JSON.stringify({at:r,provider:e,status:t}),"utf-8")}catch{}}c(V,"writePersistedVerify");var O=P.context7,u={value:null},I=[s.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],F=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];async function _(r){try{return(await l.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}c(_,"listChildDirs");async function H(r){let e=[],t=process.env.NVM_DIR||s.join(r,".nvm"),n=s.join(t,"versions","node");for(let o of await _(n))e.push(s.join(n,o,"bin"));let a=process.env.FNM_DIR||s.join(r,".local","share","fnm"),i=s.join(a,"node-versions");for(let o of await _(i))e.push(s.join(i,o,"installation","bin"));return e}c(H,"discoverNodeManagerBinDirs");async function X(r=process.env.PATH||"",e=m.homedir()){let t=new Set,n=[],a=F.map(o=>s.join(e,...o)),i=[...I,...a,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[s.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[s.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[s.join(process.env.MISE_DATA_DIR,"shims")]:[],...await H(e)];for(let o of[...r.split(s.delimiter),...i]){let f=o.trim();!f||t.has(f)||(t.add(f),n.push(f))}return n.join(s.delimiter)}c(X,"buildContext7SmokePath");async function J(r,e){if(s.isAbsolute(r)||r.includes(s.sep))return r;let t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let n of e.split(s.delimiter))if(n)for(let a of t){let i=s.join(n,r+a);try{return await l.access(i,D.X_OK),i}catch{}}return r}c(J,"resolveExecutable");function E(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?s.join(m.tmpdir(),"prjct-context7-test","mcp.json"):s.join(m.homedir(),".claude","mcp.json")}c(E,"getConfigPath");async function T(r){try{let e=await l.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e))return{};throw e}}c(T,"readConfig");async function B(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=O,e=[...r.args||[],"--help"],t=await X(),n=await J(r.command||"npx",t);await p(n,e,{timeout:15e3,env:{...process.env,PATH:t}})}c(B,"runSmokeCheck");var d=class{static{c(this,"Context7Service")}async install(e="claude"){if(e==="codex")return this.installCodex();if(e!=="claude")return{installed:!1,verified:!1,configPath:"",message:`Context7 auto-config not supported for ${e}; skipping`};let t=E(),n=s.dirname(t);await l.mkdir(n,{recursive:!0});let a=await T(t),i=a.mcpServers||{},o=O,f=i.context7;return f&&JSON.stringify(f)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:t,message:"Context7 MCP already configured"}:(i.context7=o,a.mcpServers=i,await C(t,a),u.value=null,{installed:!0,verified:!1,configPath:t,message:"Context7 MCP configured"})}async installCodex(){let e=await y();return e.changed&&(u.value=null),{installed:!0,verified:!1,configPath:e.path,message:e.skipped==="user-managed"?"Context7 MCP user-managed in config.toml":"Context7 MCP configured in config.toml"}}async resolveConfigured(e){if(e==="codex"){let o=x();return await w(o)?{ok:!0,configPath:o}:{ok:!1,configPath:o,message:"Context7 MCP not configured in ~/.codex/config.toml"}}if(e!=="claude")return{ok:!1,configPath:"",message:`Context7 not managed for ${e}`};let t=E(),i=((await T(t)).mcpServers||{}).context7;return!i?.command||!Array.isArray(i.args)||i.args.length===0?{ok:!1,configPath:t,message:"Context7 MCP not configured in ~/.claude/mcp.json"}:{ok:!0,configPath:t}}async verify(e="claude"){let t=Date.now();if(u.value&&u.value.provider===e&&t-u.value.at<864e5)return u.value.status;let n=await A();if(n?.status.verified&&n.provider===e&&t-n.at<864e5)return u.value=n,n.status;let a=await this.resolveConfigured(e);if(!a.ok)return{installed:!1,verified:!1,configPath:a.configPath,message:a.message};try{await B();let i={installed:!0,verified:!0,configPath:a.configPath};return u.value={at:t,provider:e,status:i},await V(t,e,i),i}catch(i){let o={installed:!0,verified:!1,configPath:a.configPath,message:`Context7 smoke check failed: ${h(i)}`};return u.value={at:t,provider:e,status:o},o}}async ensureReady(e="claude"){await this.install(e);let t=await this.verify(e);if(!t.verified){let n=t.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(n)}return t}},K=new d,te=K;export{N as a,X as b,te as c};
@@ -0,0 +1,7 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import{c as t}from"./chunk-F2FKQUYE.mjs";import{a as e}from"./chunk-3TRXQAU4.mjs";async function f(r,o,i){if(i.length!==0)try{let{resolveActiveTask:s}=await import("./task-service-FK7FC3PE.mjs"),c=await s(r,o);c?.id&&t.recordSurfaced(r,i,c.id);for(let n of i)t.recordFetch(r,n)}catch{}}e(f,"recordSurfacedForActiveTask");export{f as a};