prjct-cli 3.97.0 → 3.98.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 (297) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/bin/core-chunks/{agent-HCP5FF77.mjs → agent-3N2MSSGT.mjs} +1 -1
  3. package/dist/bin/core-chunks/{agent-switch-AVSX6SLY.mjs → agent-switch-4SE6GF7R.mjs} +1 -1
  4. package/dist/bin/core-chunks/{agents-OAQXBGH3.mjs → agents-ZPNNCOH7.mjs} +1 -1
  5. package/dist/bin/core-chunks/{analysis-3A7ODSSI.mjs → analysis-OARMM4AH.mjs} +2 -2
  6. package/dist/bin/core-chunks/{auto-flush-EWSVMKQN.mjs → auto-flush-XA3V7BJ6.mjs} +1 -1
  7. package/dist/bin/core-chunks/{bin-commands-LLHG2NSY.mjs → bin-commands-FYID6EYI.mjs} +5 -5
  8. package/dist/bin/core-chunks/{capture-7LQ52T6L.mjs → capture-3JJPWIF3.mjs} +1 -1
  9. package/dist/bin/core-chunks/{capture-gate-M4HM7WAI.mjs → capture-gate-G5LGVDME.mjs} +1 -1
  10. package/dist/bin/core-chunks/{ceremonies-4OZ3FKRE.mjs → ceremonies-B565WDCA.mjs} +4 -4
  11. package/dist/bin/core-chunks/{changelog-CUNVCEL5.mjs → changelog-LPJ4GKB6.mjs} +1 -1
  12. package/dist/bin/core-chunks/{chunk-DN46DLU3.mjs → chunk-2FRLIQKX.mjs} +1 -1
  13. package/dist/bin/core-chunks/{chunk-X4FR5S7E.mjs → chunk-2VRS5CUH.mjs} +1 -1
  14. package/dist/bin/core-chunks/{chunk-ZK7BMUMR.mjs → chunk-2VXPFULA.mjs} +1 -1
  15. package/dist/bin/core-chunks/chunk-3OWKIRK6.mjs +7 -0
  16. package/dist/bin/core-chunks/{chunk-V5VCXMKO.mjs → chunk-5DZ2LTII.mjs} +1 -1
  17. package/dist/bin/core-chunks/{chunk-5ONMON5L.mjs → chunk-5OWPZWEU.mjs} +1 -1
  18. package/dist/bin/core-chunks/{chunk-KWC2PCPC.mjs → chunk-5TGZSK4C.mjs} +1 -1
  19. package/dist/bin/core-chunks/chunk-5ZBACKED.mjs +14 -0
  20. package/dist/bin/core-chunks/{chunk-X35YYOFE.mjs → chunk-6KNMT46X.mjs} +2 -2
  21. package/dist/bin/core-chunks/{chunk-5MN22JFI.mjs → chunk-6POAOY5C.mjs} +1 -1
  22. package/dist/bin/core-chunks/{chunk-7CI4AMVO.mjs → chunk-6U3CYLY5.mjs} +1 -1
  23. package/dist/bin/core-chunks/{chunk-J7T5IEFJ.mjs → chunk-6U3MV7KZ.mjs} +1 -1
  24. package/dist/bin/core-chunks/{chunk-2ZPM4Z6W.mjs → chunk-7BU6SJBC.mjs} +4 -4
  25. package/dist/bin/core-chunks/{chunk-ZKJZDOPT.mjs → chunk-ACIOJQSI.mjs} +1 -1
  26. package/dist/bin/core-chunks/{chunk-UE3XKXWM.mjs → chunk-ALTQ3KL4.mjs} +1 -1
  27. package/dist/bin/core-chunks/{chunk-IVGWOY3U.mjs → chunk-ANBDOI53.mjs} +1 -1
  28. package/dist/bin/core-chunks/{chunk-LZC6NGB6.mjs → chunk-B2HY22OD.mjs} +2 -2
  29. package/dist/bin/core-chunks/{chunk-6AFXUX2M.mjs → chunk-BUD3R6LF.mjs} +2 -2
  30. package/dist/bin/core-chunks/{chunk-MDONTD7O.mjs → chunk-CA2VFWFP.mjs} +1 -1
  31. package/dist/bin/core-chunks/{chunk-56FW4P6U.mjs → chunk-CB3CNJTL.mjs} +1 -1
  32. package/dist/bin/core-chunks/{chunk-6FFOWWH2.mjs → chunk-CVKMV22J.mjs} +1 -1
  33. package/dist/bin/core-chunks/{chunk-5UUITMRX.mjs → chunk-CXKDKMYE.mjs} +1 -1
  34. package/dist/bin/core-chunks/{chunk-XSZG3CBO.mjs → chunk-DTMZBK4E.mjs} +1 -1
  35. package/dist/bin/core-chunks/chunk-DW4QMD6J.mjs +10 -0
  36. package/dist/bin/core-chunks/{chunk-CDLZLTRY.mjs → chunk-DZDEBDAB.mjs} +1 -1
  37. package/dist/bin/core-chunks/{chunk-WGDE3L33.mjs → chunk-FOUBHU4X.mjs} +1 -1
  38. package/dist/bin/core-chunks/{chunk-CNWEQUB7.mjs → chunk-HA7Y76GF.mjs} +1 -1
  39. package/dist/bin/core-chunks/{chunk-MTDCRYLP.mjs → chunk-HVXWQ2XZ.mjs} +1 -1
  40. package/dist/bin/core-chunks/{chunk-OYXQRBVM.mjs → chunk-IJNKHQIS.mjs} +1 -1
  41. package/dist/bin/core-chunks/{chunk-KIRU4QFX.mjs → chunk-J6Y7IVFQ.mjs} +1 -1
  42. package/dist/bin/core-chunks/{chunk-3FXNIJCS.mjs → chunk-JGGQSMZC.mjs} +1 -1
  43. package/dist/bin/core-chunks/{chunk-6P4GMVUZ.mjs → chunk-KI4OY3UQ.mjs} +1 -1
  44. package/dist/bin/core-chunks/{chunk-BTCCUMKI.mjs → chunk-L3DJN3XD.mjs} +1 -1
  45. package/dist/bin/core-chunks/{chunk-CEOTHJIY.mjs → chunk-LFOQ7FCR.mjs} +1 -1
  46. package/dist/bin/core-chunks/{chunk-XU3BQPBU.mjs → chunk-LGX2GM45.mjs} +1 -1
  47. package/dist/bin/core-chunks/chunk-LTKUTRRL.mjs +7 -0
  48. package/dist/bin/core-chunks/{chunk-BQKDJ3U6.mjs → chunk-LZILSE5H.mjs} +1 -1
  49. package/dist/bin/core-chunks/chunk-MPU3VM6Z.mjs +7 -0
  50. package/dist/bin/core-chunks/{chunk-INM5COWM.mjs → chunk-MXJF3FA7.mjs} +1 -1
  51. package/dist/bin/core-chunks/{chunk-VDXTMAMO.mjs → chunk-NNILF7R3.mjs} +1 -1
  52. package/dist/bin/core-chunks/{chunk-WZXUFSVT.mjs → chunk-O5VCBMEK.mjs} +1 -1
  53. package/dist/bin/core-chunks/{chunk-XYDLXF5A.mjs → chunk-OE27RFLJ.mjs} +1 -1
  54. package/dist/bin/core-chunks/{chunk-HEXSVBUP.mjs → chunk-OGM34Z6W.mjs} +1 -1
  55. package/dist/bin/core-chunks/{chunk-KKIJAEYU.mjs → chunk-OXKGN3HG.mjs} +1 -1
  56. package/dist/bin/core-chunks/{chunk-QLMZW4K7.mjs → chunk-PQTR6XVW.mjs} +1 -1
  57. package/dist/bin/core-chunks/{chunk-53ZPEZLU.mjs → chunk-Q7GJIU6D.mjs} +1 -1
  58. package/dist/bin/core-chunks/{chunk-IFLBZKKK.mjs → chunk-QWRPJARA.mjs} +1 -1
  59. package/dist/bin/core-chunks/{chunk-TGNZI4KF.mjs → chunk-STFUT7R7.mjs} +2 -2
  60. package/dist/bin/core-chunks/{chunk-IMQCXC3R.mjs → chunk-SUXIKMTS.mjs} +1 -1
  61. package/dist/bin/core-chunks/{chunk-WP5IU4W4.mjs → chunk-TOORPP6K.mjs} +1 -1
  62. package/dist/bin/core-chunks/{chunk-7QMBIMEX.mjs → chunk-UAYTDSYG.mjs} +3 -3
  63. package/dist/bin/core-chunks/{chunk-PPERWRFS.mjs → chunk-UNIBFM6J.mjs} +1 -1
  64. package/dist/bin/core-chunks/{chunk-5YSPND5J.mjs → chunk-UX2ORID4.mjs} +1 -1
  65. package/dist/bin/core-chunks/{chunk-3JD6KRNJ.mjs → chunk-VJCTTFKP.mjs} +1 -1
  66. package/dist/bin/core-chunks/chunk-W23JLJJZ.mjs +109 -0
  67. package/dist/bin/core-chunks/{chunk-DCVPNFS4.mjs → chunk-WCTVZQBG.mjs} +1 -1
  68. package/dist/bin/core-chunks/{chunk-GOIBJ7PV.mjs → chunk-WZ6W5ZQ5.mjs} +1 -1
  69. package/dist/bin/core-chunks/{chunk-XPRLQIVQ.mjs → chunk-X433BB6F.mjs} +1 -1
  70. package/dist/bin/core-chunks/{chunk-ZHTYSYZC.mjs → chunk-XBR63NJA.mjs} +1 -1
  71. package/dist/bin/core-chunks/{chunk-ZS7XJUPE.mjs → chunk-XJTEPHLC.mjs} +1 -1
  72. package/dist/bin/core-chunks/{chunk-K25HGTC3.mjs → chunk-XLAGA5B7.mjs} +1 -1
  73. package/dist/bin/core-chunks/{chunk-3USVY66O.mjs → chunk-XSZOHNL4.mjs} +1 -1
  74. package/dist/bin/core-chunks/{chunk-TTN2CFZC.mjs → chunk-XWLTEAGN.mjs} +1 -1
  75. package/dist/bin/core-chunks/{chunk-V3Y3G2DE.mjs → chunk-YOWW4LHK.mjs} +1 -1
  76. package/dist/bin/core-chunks/{chunk-P53YMOKR.mjs → chunk-YPLFWN62.mjs} +1 -1
  77. package/dist/bin/core-chunks/{chunk-ZQHSJ6FF.mjs → chunk-ZAUJWUUN.mjs} +3 -3
  78. package/dist/bin/core-chunks/{chunk-WSVMQYYU.mjs → chunk-ZQ2XH76U.mjs} +2 -2
  79. package/dist/bin/core-chunks/{chunk-RXXXA7Z6.mjs → chunk-ZSANMA7K.mjs} +1 -1
  80. package/dist/bin/core-chunks/{chunk-AJTBFIH2.mjs → chunk-ZZR3LXCK.mjs} +1 -1
  81. package/dist/bin/core-chunks/{cleanup-installs-WHXUGAHM.mjs → cleanup-installs-LD43GI4K.mjs} +1 -1
  82. package/dist/bin/core-chunks/{cloud-FFUJZLDV.mjs → cloud-RXHFZ7MX.mjs} +1 -1
  83. package/dist/bin/core-chunks/{code-SU7GCPH6.mjs → code-IYK65A62.mjs} +1 -1
  84. package/dist/bin/core-chunks/{codex-hooks-GOLMCL2Q.mjs → codex-hooks-N5UHKK5B.mjs} +1 -1
  85. package/dist/bin/core-chunks/{codex-mcp-K4X2UIQF.mjs → codex-mcp-G7WNAT6T.mjs} +1 -1
  86. package/dist/bin/core-chunks/{codex-skill-3HNVU4T4.mjs → codex-skill-IZNP76BJ.mjs} +1 -1
  87. package/dist/bin/core-chunks/{command-installer-XIQK2G6W.mjs → command-installer-4ENM4GZR.mjs} +1 -1
  88. package/dist/bin/core-chunks/{config-W3RHV3GK.mjs → config-UVF7YOR6.mjs} +1 -1
  89. package/dist/bin/core-chunks/{config-manager-QVFHXIKI.mjs → config-manager-QY73WM5U.mjs} +1 -1
  90. package/dist/bin/core-chunks/{context-4KGTUAC4.mjs → context-4GB6ICXK.mjs} +1 -1
  91. package/dist/bin/core-chunks/{context-DDHC7VIC.mjs → context-MPHOQPXF.mjs} +2 -2
  92. package/dist/bin/core-chunks/{context-checkpoint-4CEUPEVG.mjs → context-checkpoint-NBI5HKPV.mjs} +1 -1
  93. package/dist/bin/core-chunks/{context-tiers-4S6H22NP.mjs → context-tiers-NOKJ75QP.mjs} +1 -1
  94. package/dist/bin/core-chunks/{context7-service-AZWDYK5Z.mjs → context7-service-2MYRUNKY.mjs} +1 -1
  95. package/dist/bin/core-chunks/{core-PR5WEQCS.mjs → core-WMEHDCOK.mjs} +1 -1
  96. package/dist/bin/core-chunks/{crew-JQCG6NS3.mjs → crew-EYVSIX4L.mjs} +1 -1
  97. package/dist/bin/core-chunks/{cwd-changed-ODKZVSPB.mjs → cwd-changed-EUJZOBIC.mjs} +1 -1
  98. package/dist/bin/core-chunks/{daemon-2NQTBFVR.mjs → daemon-QARP3RVX.mjs} +1 -1
  99. package/dist/bin/core-chunks/{developer-profile-MRPBWL2K.mjs → developer-profile-2VSFJGCU.mjs} +1 -1
  100. package/dist/bin/core-chunks/{distill-MLDZG5RA.mjs → distill-ZF7WHGCZ.mjs} +1 -1
  101. package/dist/bin/core-chunks/doctor-heal-XFSVPSEY.mjs +7 -0
  102. package/dist/bin/core-chunks/{doctor-service-WXLB2FEE.mjs → doctor-service-6ZJBWIXR.mjs} +1 -1
  103. package/dist/bin/core-chunks/{dynasty-outcomes-H2O546OL.mjs → dynasty-outcomes-KDWIEA4Y.mjs} +1 -1
  104. package/dist/bin/core-chunks/{embeddings-7A5Z5I67.mjs → embeddings-354ZYFKX.mjs} +1 -1
  105. package/dist/bin/core-chunks/{enriched-recall-YXK7EIKH.mjs → enriched-recall-MKBOXB7M.mjs} +1 -1
  106. package/dist/bin/core-chunks/{eval-4YFUBFLV.mjs → eval-O4YD6YOV.mjs} +2 -2
  107. package/dist/bin/core-chunks/{format-5V6GF6JJ.mjs → format-SYVL4CV5.mjs} +1 -1
  108. package/dist/bin/core-chunks/{gemini-settings-ZTU3VQU3.mjs → gemini-settings-RGD7JLSP.mjs} +1 -1
  109. package/dist/bin/core-chunks/{grok-mcp-F3SRFMCW.mjs → grok-mcp-IE2RRRRW.mjs} +1 -1
  110. package/dist/bin/core-chunks/{grok-plugin-4CE2WUYI.mjs → grok-plugin-SSANHBS7.mjs} +1 -1
  111. package/dist/bin/core-chunks/{grok-skill-GLSBOOKW.mjs → grok-skill-7ZP7R7KO.mjs} +1 -1
  112. package/dist/bin/core-chunks/{guard-FJBJ6IAE.mjs → guard-RT7U3LJX.mjs} +1 -1
  113. package/dist/bin/core-chunks/{guards-LFUFKVVH.mjs → guards-AXH6V2IJ.mjs} +1 -1
  114. package/dist/bin/core-chunks/{harness-FN3HASSA.mjs → harness-V7J7WIT2.mjs} +2 -2
  115. package/dist/bin/core-chunks/{health-W2VWME7Z.mjs → health-TNB5OC37.mjs} +1 -1
  116. package/dist/bin/core-chunks/{help-I37I3V2R.mjs → help-P7EYELVK.mjs} +1 -1
  117. package/dist/bin/core-chunks/{hooks-service-C2P5DRCH.mjs → hooks-service-REI56DDC.mjs} +1 -1
  118. package/dist/bin/core-chunks/{install-XP4S6HWQ.mjs → install-FZQJJWT5.mjs} +2 -2
  119. package/dist/bin/core-chunks/{judgment-GJE332LF.mjs → judgment-G5KH6QFC.mjs} +2 -2
  120. package/dist/bin/core-chunks/{judgment-receipt-WT4EMCAV.mjs → judgment-receipt-GO6QEZQC.mjs} +1 -1
  121. package/dist/bin/core-chunks/{kimi-hooks-2UEUIKXV.mjs → kimi-hooks-TR6J3OVG.mjs} +1 -1
  122. package/dist/bin/core-chunks/{kimi-mcp-DJCXZ2JY.mjs → kimi-mcp-ETG7O6O5.mjs} +1 -1
  123. package/dist/bin/core-chunks/{land-cue-5USQ64MS.mjs → land-cue-3BUD3KJJ.mjs} +1 -1
  124. package/dist/bin/core-chunks/{land-rho-ISNVEPVC.mjs → land-rho-MCTQDPRH.mjs} +1 -1
  125. package/dist/bin/core-chunks/{land-synthesis-CHARJMUP.mjs → land-synthesis-MU4EZEYL.mjs} +1 -1
  126. package/dist/bin/core-chunks/{lean-L53CKZNH.mjs → lean-26BWCUOR.mjs} +1 -1
  127. package/dist/bin/core-chunks/{legacy-crew-sweep-2TLKJTHI.mjs → legacy-crew-sweep-G5UJT2PM.mjs} +2 -2
  128. package/dist/bin/core-chunks/{llm-XMH7WTHV.mjs → llm-KMVXVBHG.mjs} +1 -1
  129. package/dist/bin/core-chunks/{mcp-FLVIZBV2.mjs → mcp-BD5TOTCK.mjs} +1 -1
  130. package/dist/bin/core-chunks/{memory-dream-EJWI4FJO.mjs → memory-dream-6GFV2GXN.mjs} +1 -1
  131. package/dist/bin/core-chunks/{memory-export-27HTNNFI.mjs → memory-export-WJ4H7CFV.mjs} +1 -1
  132. package/dist/bin/core-chunks/{memory-index-BRZDZ2BY.mjs → memory-index-7NIU34EI.mjs} +1 -1
  133. package/dist/bin/core-chunks/{notification-KJ4FQJAW.mjs → notification-G654IX3O.mjs} +1 -1
  134. package/dist/bin/core-chunks/{notify-76B7AICZ.mjs → notify-EWYUBKGO.mjs} +1 -1
  135. package/dist/bin/core-chunks/{opencode-mcp-5YSIYDI3.mjs → opencode-mcp-L7NC77JF.mjs} +1 -1
  136. package/dist/bin/core-chunks/{pack-integrity-GXN67LJB.mjs → pack-integrity-X277OVRB.mjs} +1 -1
  137. package/dist/bin/core-chunks/{pack-manager-46SPIPPD.mjs → pack-manager-VN7F6R47.mjs} +1 -1
  138. package/dist/bin/core-chunks/package-R4FUTGOE.mjs +7 -0
  139. package/dist/bin/core-chunks/{pi-skill-SDHTUK3V.mjs → pi-skill-IZQEUILZ.mjs} +1 -1
  140. package/dist/bin/core-chunks/{planning-S3MYVWH6.mjs → planning-NOWLKZDS.mjs} +2 -2
  141. package/dist/bin/core-chunks/{post-edit-5YSNEMK7.mjs → post-edit-GTBY32JU.mjs} +1 -1
  142. package/dist/bin/core-chunks/{pre-bash-GLDILCRF.mjs → pre-bash-32ZOGNSP.mjs} +1 -1
  143. package/dist/bin/core-chunks/{pre-commit-U6HPPNIC.mjs → pre-commit-7TU2A7H4.mjs} +1 -1
  144. package/dist/bin/core-chunks/{pre-edit-PEYQA6P6.mjs → pre-edit-ASEWA5TS.mjs} +1 -1
  145. package/dist/bin/core-chunks/{pre-package-76JR5GLO.mjs → pre-package-ZTZACEBB.mjs} +1 -1
  146. package/dist/bin/core-chunks/{pre-search-5EHNUOP3.mjs → pre-search-MKDRFJSE.mjs} +1 -1
  147. package/dist/bin/core-chunks/{preferences-BTSYWYUM.mjs → preferences-KO5U2ELK.mjs} +1 -1
  148. package/dist/bin/core-chunks/{primitives-IXAYLX7U.mjs → primitives-GNUMBYOK.mjs} +1 -1
  149. package/dist/bin/core-chunks/{prjct-md-SUDFWDCS.mjs → prjct-md-BSFV7OQQ.mjs} +1 -1
  150. package/dist/bin/core-chunks/{product-KKGJ6MMF.mjs → product-GUHSUNIH.mjs} +1 -1
  151. package/dist/bin/core-chunks/{project-agent-surfaces-I2CUZUIN.mjs → project-agent-surfaces-BXCJJXB7.mjs} +1 -1
  152. package/dist/bin/core-chunks/{project-memory-GYLYIJQD.mjs → project-memory-L5MDZYST.mjs} +1 -1
  153. package/dist/bin/core-chunks/{project-style-evolution-5W25UPPN.mjs → project-style-evolution-HIMSJQQB.mjs} +1 -1
  154. package/dist/bin/core-chunks/prompt-47YP5JIR.mjs +25 -0
  155. package/dist/bin/core-chunks/{purge-5EPJV25P.mjs → purge-6SJKHKIY.mjs} +1 -1
  156. package/dist/bin/core-chunks/{registry-LK6IQ5UX.mjs → registry-YM2EYUXY.mjs} +1 -1
  157. package/dist/bin/core-chunks/{retention-S22T3SPT.mjs → retention-QSXWKE4H.mjs} +1 -1
  158. package/dist/bin/core-chunks/{retro-CLKOHAN6.mjs → retro-B2EBN4TA.mjs} +1 -1
  159. package/dist/bin/core-chunks/{review-risk-LLLBKUXT.mjs → review-risk-LBPY5M3K.mjs} +1 -1
  160. package/dist/bin/core-chunks/{safe-artifacts-RW5WQUUJ.mjs → safe-artifacts-PE2TMEZQ.mjs} +1 -1
  161. package/dist/bin/core-chunks/{sdd-HE7O6N5S.mjs → sdd-3WNZJ6FU.mjs} +1 -1
  162. package/dist/bin/core-chunks/{seed-JX7W53E5.mjs → seed-MMDJE2UO.mjs} +2 -2
  163. package/dist/bin/core-chunks/{self-heal-DFUEKNF3.mjs → self-heal-R5FBXEVQ.mjs} +1 -1
  164. package/dist/bin/core-chunks/{session-continuity-BFSW4OL6.mjs → session-continuity-OQDB5UYI.mjs} +1 -1
  165. package/dist/bin/core-chunks/{session-start-HVYUKJL2.mjs → session-start-FM6UL7MT.mjs} +1 -1
  166. package/dist/bin/core-chunks/{setup-GHS24ER5.mjs → setup-BL36ZWPW.mjs} +2 -2
  167. package/dist/bin/core-chunks/{setup-J4JFYT63.mjs → setup-V75BWRHU.mjs} +2 -2
  168. package/dist/bin/core-chunks/{shipping-I4D4AVTE.mjs → shipping-NZVM57JJ.mjs} +4 -4
  169. package/dist/bin/core-chunks/{signals-digest-V44KYN6Z.mjs → signals-digest-P5BG6MZF.mjs} +1 -1
  170. package/dist/bin/core-chunks/{skill-adherence-MHY4BZL4.mjs → skill-adherence-JE3N3Y67.mjs} +1 -1
  171. package/dist/bin/core-chunks/{spec-2XXPLHUZ.mjs → spec-VC3VTUI3.mjs} +3 -3
  172. package/dist/bin/core-chunks/{spec-context-inference-THFMXC7S.mjs → spec-context-inference-KOINWBC7.mjs} +1 -1
  173. package/dist/bin/core-chunks/{spec-service-I23KJKKP.mjs → spec-service-UZ53XL6X.mjs} +1 -1
  174. package/dist/bin/core-chunks/{spec-task-breakdown-HTG6ME6G.mjs → spec-task-breakdown-3Y7YXCIQ.mjs} +1 -1
  175. package/dist/bin/core-chunks/{stop-2H57XCGZ.mjs → stop-6SH36ULT.mjs} +3 -3
  176. package/dist/bin/core-chunks/{subagent-start-5LPASXOS.mjs → subagent-start-TVGBV2V2.mjs} +1 -1
  177. package/dist/bin/core-chunks/{subagent-stop-ANLSG3KN.mjs → subagent-stop-APWY6KMX.mjs} +1 -1
  178. package/dist/bin/core-chunks/{surface-attribution-WL7S53XX.mjs → surface-attribution-CQVM2SWY.mjs} +1 -1
  179. package/dist/bin/core-chunks/{task-service-FK7FC3PE.mjs → task-service-KFYL5NT4.mjs} +1 -1
  180. package/dist/bin/core-chunks/{tdd-NQDHU62B.mjs → tdd-P2PP4RR4.mjs} +1 -1
  181. package/dist/bin/core-chunks/{team-XZ4Q6UBV.mjs → team-WKAAOEFE.mjs} +1 -1
  182. package/dist/bin/core-chunks/{template-loader-33OVJ4G5.mjs → template-loader-H4FE37HV.mjs} +1 -1
  183. package/dist/bin/core-chunks/{uninstall-6NFON7FO.mjs → uninstall-W6EAUS7N.mjs} +1 -1
  184. package/dist/bin/core-chunks/{update-4IE6SA6M.mjs → update-PSHEJJI5.mjs} +2 -2
  185. package/dist/bin/core-chunks/{update-checker-FK7MWNWN.mjs → update-checker-LZCUPWQB.mjs} +1 -1
  186. package/dist/bin/core-chunks/{version-252QLBN2.mjs → version-B5DBRVGQ.mjs} +1 -1
  187. package/dist/bin/core-chunks/{watch-service-7ZERG7RC.mjs → watch-service-7V3O52TW.mjs} +1 -1
  188. package/dist/bin/core-chunks/weak-frontier-demo-ZCDTMYRO.mjs +7 -0
  189. package/dist/bin/core-chunks/{weak-model-mode-DH66XMD2.mjs → weak-model-mode-LOAPFJPQ.mjs} +1 -1
  190. package/dist/bin/core-chunks/{work-graph-JGJWE3AV.mjs → work-graph-ZNV7S6EU.mjs} +1 -1
  191. package/dist/bin/core-chunks/{work-scope-3LXOEIUX.mjs → work-scope-XXPUH6TU.mjs} +1 -1
  192. package/dist/bin/core-chunks/{workflow-FGJVLRQ3.mjs → workflow-XM77QYRF.mjs} +2 -2
  193. package/dist/bin/core-chunks/{workflows-reference-UWKRZ6BJ.mjs → workflows-reference-T7RH7IGJ.mjs} +1 -1
  194. package/dist/bin/core-chunks/{world-model-impact-RH5WH2B3.mjs → world-model-impact-FAGGNUGN.mjs} +1 -1
  195. package/dist/bin/hook-chunks/{agent-switch-7GOGG4KG.mjs → agent-switch-TAJWH2ZD.mjs} +1 -1
  196. package/dist/bin/hook-chunks/{analysis-UI2JRLJO.mjs → analysis-34WDLUXK.mjs} +2 -2
  197. package/dist/bin/hook-chunks/{auto-flush-JKIXTI2I.mjs → auto-flush-7TIEBPPQ.mjs} +1 -1
  198. package/dist/bin/hook-chunks/{capture-gate-DIPHPNIC.mjs → capture-gate-JFVGG7RB.mjs} +1 -1
  199. package/dist/bin/hook-chunks/{chunk-XXVHUYL7.mjs → chunk-22CBVTZ3.mjs} +1 -1
  200. package/dist/bin/hook-chunks/{chunk-ZH2MF7H7.mjs → chunk-3JOZN7YJ.mjs} +1 -1
  201. package/dist/bin/hook-chunks/{chunk-Y7RDBMNC.mjs → chunk-4X3KUIXK.mjs} +1 -1
  202. package/dist/bin/hook-chunks/{chunk-6RS7PNAN.mjs → chunk-5ALQBNIZ.mjs} +1 -1
  203. package/dist/bin/hook-chunks/{chunk-IL36ER4U.mjs → chunk-5VPZI2ZF.mjs} +1 -1
  204. package/dist/bin/hook-chunks/{chunk-FBEDUKMG.mjs → chunk-6EHYPQ5U.mjs} +1 -1
  205. package/dist/bin/hook-chunks/chunk-7H5UVM6X.mjs +9 -0
  206. package/dist/bin/hook-chunks/{chunk-IDPBMN3Q.mjs → chunk-A3R47SP6.mjs} +1 -1
  207. package/dist/bin/hook-chunks/{chunk-UI25YRTY.mjs → chunk-CGAKJDKT.mjs} +1 -1
  208. package/dist/bin/hook-chunks/{chunk-6LU777GI.mjs → chunk-CJY4Y5SO.mjs} +1 -1
  209. package/dist/bin/hook-chunks/{chunk-WIA6ORIY.mjs → chunk-FSFURDAE.mjs} +1 -1
  210. package/dist/bin/hook-chunks/{chunk-6WDRJ7J7.mjs → chunk-FTBBQHI4.mjs} +1 -1
  211. package/dist/bin/hook-chunks/{chunk-25OGCQTR.mjs → chunk-G4VJKPG7.mjs} +3 -3
  212. package/dist/bin/hook-chunks/{chunk-PFORBQBF.mjs → chunk-GAJOSSB4.mjs} +2 -2
  213. package/dist/bin/hook-chunks/{chunk-KOLXYWOA.mjs → chunk-H3GIYI4Q.mjs} +2 -2
  214. package/dist/bin/hook-chunks/{chunk-B7MHIUFA.mjs → chunk-HRU2KNEB.mjs} +1 -1
  215. package/dist/bin/hook-chunks/{chunk-JF6DFOQK.mjs → chunk-LCGWETJ6.mjs} +1 -1
  216. package/dist/bin/hook-chunks/{chunk-PQJ64L6U.mjs → chunk-MG2DNP4Z.mjs} +1 -1
  217. package/dist/bin/hook-chunks/chunk-NGB6JNSB.mjs +18 -0
  218. package/dist/bin/hook-chunks/{chunk-AEDB75AK.mjs → chunk-OALZUWC6.mjs} +1 -1
  219. package/dist/bin/hook-chunks/{chunk-IFIENAZU.mjs → chunk-PZMBZ6GE.mjs} +1 -1
  220. package/dist/bin/hook-chunks/{chunk-F3PNT2DQ.mjs → chunk-QIB6Y6AH.mjs} +2 -2
  221. package/dist/bin/hook-chunks/{chunk-ZXON2U5F.mjs → chunk-QMNZPNVY.mjs} +1 -1
  222. package/dist/bin/hook-chunks/{chunk-B2ZA5ZAO.mjs → chunk-R4YDE3GU.mjs} +1 -1
  223. package/dist/bin/hook-chunks/{chunk-UBWUQ64A.mjs → chunk-RFKRKUHB.mjs} +1 -1
  224. package/dist/bin/hook-chunks/{chunk-NMB6YSAH.mjs → chunk-RGOTJCZU.mjs} +1 -1
  225. package/dist/bin/hook-chunks/{chunk-ANSRNEEI.mjs → chunk-T2KVL6PZ.mjs} +1 -1
  226. package/dist/bin/hook-chunks/{chunk-HNZ24HIK.mjs → chunk-T7DRHVK3.mjs} +2 -2
  227. package/dist/bin/hook-chunks/{chunk-IHEOOJJT.mjs → chunk-TWFLW6OJ.mjs} +1 -1
  228. package/dist/bin/hook-chunks/{chunk-ONGVBXBD.mjs → chunk-UJIOGFNP.mjs} +1 -1
  229. package/dist/bin/hook-chunks/{chunk-NSTXHVTH.mjs → chunk-UK24P7PV.mjs} +2 -2
  230. package/dist/bin/hook-chunks/{chunk-63P5VOR6.mjs → chunk-ULNGKZB6.mjs} +4 -4
  231. package/dist/bin/hook-chunks/{chunk-UMJ5D5I6.mjs → chunk-UWHVPO6X.mjs} +2 -2
  232. package/dist/bin/hook-chunks/{chunk-A6LRNS6R.mjs → chunk-XC2BSGWF.mjs} +1 -1
  233. package/dist/bin/hook-chunks/{chunk-7PA4KPSR.mjs → chunk-ZPAY2NSF.mjs} +2 -2
  234. package/dist/bin/hook-chunks/{codex-skill-UZZCACMB.mjs → codex-skill-BFRU5FTP.mjs} +1 -1
  235. package/dist/bin/hook-chunks/{command-installer-FJ73C2ZW.mjs → command-installer-3XOZGKOQ.mjs} +1 -1
  236. package/dist/bin/hook-chunks/{config-manager-XDKOTIJM.mjs → config-manager-UPB7NEXF.mjs} +1 -1
  237. package/dist/bin/hook-chunks/{context7-service-NH4BMGSJ.mjs → context7-service-7VFXEQVN.mjs} +1 -1
  238. package/dist/bin/hook-chunks/{cwd-changed-STP3LH6Y.mjs → cwd-changed-USNJYUH7.mjs} +1 -1
  239. package/dist/bin/hook-chunks/{distill-63BHUJAC.mjs → distill-47YVL7IH.mjs} +1 -1
  240. package/dist/bin/hook-chunks/{enriched-recall-6F6LBYAB.mjs → enriched-recall-CVYI52NO.mjs} +1 -1
  241. package/dist/bin/hook-chunks/{format-VJ2YQ4XQ.mjs → format-DPIN45EG.mjs} +1 -1
  242. package/dist/bin/hook-chunks/{judgment-receipt-LSJCAYBT.mjs → judgment-receipt-G2DKQR7U.mjs} +1 -1
  243. package/dist/bin/hook-chunks/{land-cue-DEO2AZW4.mjs → land-cue-3JD2TXFP.mjs} +1 -1
  244. package/dist/bin/hook-chunks/{land-synthesis-GTMFIGDM.mjs → land-synthesis-5C4KGCTB.mjs} +1 -1
  245. package/dist/bin/hook-chunks/{legacy-crew-sweep-QPKU7ITU.mjs → legacy-crew-sweep-XQNXNZES.mjs} +2 -2
  246. package/dist/bin/hook-chunks/{memory-index-KCMXQGKX.mjs → memory-index-LL6SQJ2N.mjs} +1 -1
  247. package/dist/bin/hook-chunks/{notification-DX6ZHOUC.mjs → notification-ACQBRJG3.mjs} +1 -1
  248. package/dist/bin/hook-chunks/{pack-integrity-UMLIB5RQ.mjs → pack-integrity-DCXVRRJZ.mjs} +1 -1
  249. package/dist/bin/hook-chunks/{pack-manager-YXRK2TJ4.mjs → pack-manager-KYWKNYUY.mjs} +1 -1
  250. package/dist/bin/hook-chunks/{planning-JR7O5MYW.mjs → planning-KOU3XKWS.mjs} +2 -2
  251. package/dist/bin/hook-chunks/{post-edit-IPTVSRVG.mjs → post-edit-CK2MYQEN.mjs} +1 -1
  252. package/dist/bin/hook-chunks/{pre-bash-5WWTH36N.mjs → pre-bash-W5A5CTR3.mjs} +1 -1
  253. package/dist/bin/hook-chunks/{pre-commit-KZ5TNTPW.mjs → pre-commit-5Q24RM4S.mjs} +1 -1
  254. package/dist/bin/hook-chunks/{pre-edit-XHPYBXRU.mjs → pre-edit-YIJ4BCYL.mjs} +1 -1
  255. package/dist/bin/hook-chunks/{pre-package-U3HDW3SX.mjs → pre-package-O4RMVA4T.mjs} +1 -1
  256. package/dist/bin/hook-chunks/{pre-search-R5CRK66E.mjs → pre-search-WYOWC3D6.mjs} +1 -1
  257. package/dist/bin/hook-chunks/{prjct-md-IBQTJBK7.mjs → prjct-md-2UVHFYTJ.mjs} +1 -1
  258. package/dist/bin/hook-chunks/{project-agent-surfaces-TPZO73ZV.mjs → project-agent-surfaces-BKFYUMRV.mjs} +1 -1
  259. package/dist/bin/hook-chunks/{project-memory-YQLZX5RG.mjs → project-memory-OC5GTJPY.mjs} +1 -1
  260. package/dist/bin/hook-chunks/{project-style-evolution-NOFCIIZZ.mjs → project-style-evolution-2IFJCACQ.mjs} +1 -1
  261. package/dist/bin/hook-chunks/prompt-JIWMP563.mjs +26 -0
  262. package/dist/bin/hook-chunks/{purge-5W3K2MZL.mjs → purge-FQK3Z4QS.mjs} +1 -1
  263. package/dist/bin/hook-chunks/{retention-GWJ4AX7I.mjs → retention-2FETBJFG.mjs} +1 -1
  264. package/dist/bin/hook-chunks/{sdd-GWBRD4KI.mjs → sdd-V43TSJ2P.mjs} +1 -1
  265. package/dist/bin/hook-chunks/{session-continuity-VH645RGR.mjs → session-continuity-RO2ACICF.mjs} +1 -1
  266. package/dist/bin/hook-chunks/{session-start-4TYTI27B.mjs → session-start-FKKFMKQ5.mjs} +1 -1
  267. package/dist/bin/hook-chunks/{setup-VF4UHUBX.mjs → setup-YV2DKG5L.mjs} +2 -2
  268. package/dist/bin/hook-chunks/{shipping-2ULWBGRX.mjs → shipping-SCNFEXBY.mjs} +4 -4
  269. package/dist/bin/hook-chunks/{spec-context-inference-HVENYOIO.mjs → spec-context-inference-BD3ANTXA.mjs} +1 -1
  270. package/dist/bin/hook-chunks/{spec-service-4XGQQPGP.mjs → spec-service-OWYOAGXS.mjs} +2 -2
  271. package/dist/bin/hook-chunks/{spec-task-breakdown-JXF556UH.mjs → spec-task-breakdown-HOTLUFDM.mjs} +1 -1
  272. package/dist/bin/hook-chunks/{stop-NJDYIIXR.mjs → stop-MIXT7WXA.mjs} +3 -3
  273. package/dist/bin/hook-chunks/{subagent-start-2YMGD4SY.mjs → subagent-start-NO3TN65K.mjs} +1 -1
  274. package/dist/bin/hook-chunks/{subagent-stop-4TZJ2NSJ.mjs → subagent-stop-CKWIXX7W.mjs} +1 -1
  275. package/dist/bin/hook-chunks/{surface-attribution-UNK4J5W2.mjs → surface-attribution-BYESPLXM.mjs} +1 -1
  276. package/dist/bin/hook-chunks/{task-service-SPUES5DO.mjs → task-service-5ONSBKKP.mjs} +1 -1
  277. package/dist/bin/hook-chunks/{tdd-MYF7I5FS.mjs → tdd-SESB4IG3.mjs} +1 -1
  278. package/dist/bin/hook-chunks/{template-loader-4SYVR2UB.mjs → template-loader-KO67FVHO.mjs} +1 -1
  279. package/dist/bin/hook-chunks/{weak-model-mode-TYJJT6JJ.mjs → weak-model-mode-HPXBKXJT.mjs} +1 -1
  280. package/dist/bin/hook-chunks/{work-scope-A6XPENFE.mjs → work-scope-RNPGACPA.mjs} +1 -1
  281. package/dist/bin/prjct-core.mjs +3 -3
  282. package/dist/bin/prjct-hooks.mjs +1 -1
  283. package/dist/daemon/entry.mjs +591 -583
  284. package/dist/mcp/server.mjs +318 -312
  285. package/package.json +2 -1
  286. package/dist/bin/core-chunks/chunk-GDLAQV3Q.mjs +0 -14
  287. package/dist/bin/core-chunks/chunk-R7LLMJDP.mjs +0 -7
  288. package/dist/bin/core-chunks/chunk-UT425KVX.mjs +0 -10
  289. package/dist/bin/core-chunks/chunk-VILH3VYH.mjs +0 -103
  290. package/dist/bin/core-chunks/chunk-Y5SEUYET.mjs +0 -7
  291. package/dist/bin/core-chunks/doctor-heal-ZUZ2RHGY.mjs +0 -7
  292. package/dist/bin/core-chunks/package-DCGCOAGQ.mjs +0 -7
  293. package/dist/bin/core-chunks/prompt-SW5XDRMX.mjs +0 -23
  294. package/dist/bin/core-chunks/weak-frontier-demo-5C4FR3OA.mjs +0 -7
  295. package/dist/bin/hook-chunks/chunk-IWUF2LGO.mjs +0 -18
  296. package/dist/bin/hook-chunks/chunk-ZYCNW75E.mjs +0 -9
  297. package/dist/bin/hook-chunks/prompt-DJWONMTZ.mjs +0 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "3.97.0",
3
+ "version": "3.98.0",
4
4
  "description": "The agentic harness for AI coding agents — work cycles, bounded RAG context, persistent memory, guardrails, and performance evals.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {
@@ -40,6 +40,7 @@
40
40
  "test:e2e": "bun test core/__tests__/e2e/",
41
41
  "bench:ab": "bun scripts/bench-ab.ts",
42
42
  "bench:weak-model": "bun scripts/bench-weak-model.ts",
43
+ "bench:token-cost": "bun scripts/bench-token-cost.ts",
43
44
  "demo:weak-vs-frontier": "bun scripts/demo-weak-vs-frontier.ts",
44
45
  "harness:score": "bun bin/prjct.ts harness score --md",
45
46
  "gate:dominance": "bun test core/__tests__/services/weak-model-bench.test.ts core/__tests__/services/weak-frontier-demo.test.ts core/__tests__/services/harness-score.test.ts core/__tests__/services/dynasty-outcomes.test.ts core/__tests__/services/content-bound-stamp.test.ts core/__tests__/services/sot-bind.test.ts core/__tests__/services/trap-surface-slo.test.ts core/__tests__/services/impact-ready.test.ts core/__tests__/services/delivery-geometry.test.ts core/__tests__/services/cycle-budget-card.test.ts core/__tests__/services/land-rho.test.ts core/__tests__/services/one-breath-install.test.ts core/__tests__/services/doctor-heal.test.ts && bun run bench:weak-model && bun run demo:weak-vs-frontier"
@@ -1,14 +0,0 @@
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 l,f as d,g}from"./chunk-UT425KVX.mjs";import{b as p,c as k}from"./chunk-DOJPSIMG.mjs";import{a as n}from"./chunk-3TRXQAU4.mjs";k();import f from"node:fs/promises";import E from"node:path";var x="# prjct:mcp:start - managed by prjct, do not edit between markers",C="# prjct:mcp:end",b="# prjct:mcp:context7:start - managed by prjct, do not edit between markers",j="# prjct:mcp:context7:end",S=["model-with-reasoning","current-dir","git-branch","context-remaining","five-hour-limit","weekly-limit","task-progress"];function h(){return process.env.PRJCT_TEST_MODE==="1"?E.join(p(".prjct-tests"),"codex","config.toml"):p(".codex","config.toml")}n(h,"getCodexConfigTomlPath");function u(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}n(u,"tomlString");function T(t,e,c,o){let s=(e.args??[]).map(u).join(", "),r=[c,`[mcp_servers.${t}]`,`command = ${u(e.command)}`,`args = [${s}]`];if(e.env&&Object.keys(e.env).length>0){let a=Object.entries(e.env).map(([i,m])=>`${i} = ${u(m)}`).join(", ");r.push(`env = { ${a} }`)}return r.push(o,""),r.join(`
8
- `)}n(T,"buildMcpTomlBlock");function _(t=l.prjct){return T("prjct",t,x,C)}n(_,"buildPrjctMcpTomlBlock");function M(t=l.context7){return T("context7",t,b,j)}n(M,"buildContext7McpTomlBlock");function $(){return["[tui]",`status_line = [${S.map(u).join(", ")}]`,""].join(`
9
- `)}n($,"buildCodexStatusLineToml");function R(t){return/^\s*(?:tui\.)?status_line\s*=/m.test(t)}n(R,"hasCodexStatusLine");function v(t){if(R(t))return{toml:t,changed:!1};let c=`status_line = [${S.map(u).join(", ")}]
10
- `,o=/^\s*\[tui\]\s*$/m.exec(t);if(o){let r=o.index+o[0].length,a=t.slice(0,r),i=t.slice(r),m=i.startsWith(`
11
- `)?i.slice(1):i;return{toml:`${a}
12
- ${c}${m}`,changed:!0}}let s=$();return{toml:t.trim().length>0?`${t.trimEnd()}
13
-
14
- ${s}`:s,changed:!0}}n(v,"ensureCodexStatusLineToml");async function L(t=h()){let e=await f.readFile(t,"utf-8").catch(()=>""),c=_(),o=d(e,c,x,C,"prjct"),s=o.skipped,r=v(o.next),a=r.toml,i=await g(t,e,a);return{...i,skipped:s,...i.changed?{statusLineChanged:r.changed}:{}}}n(L,"ensureCodexMcpServer");async function O(t=h()){let e=await f.readFile(t,"utf-8").catch(()=>""),c=M(),{next:o,skipped:s}=d(e,c,b,j,"context7");return{...await g(t,e,o),skipped:s}}n(O,"ensureCodexContext7Server");async function N(t=h()){try{let e=await f.readFile(t,"utf-8");return/^\s*\[mcp_servers\.context7\]/m.test(e)}catch{return!1}}n(N,"codexHasContext7Server");export{h as a,_ as b,M as c,$ as d,L as e,O as f,N as g};
@@ -1,7 +0,0 @@
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,c,e as s}from"./chunk-UT425KVX.mjs";import{b as i,c as d}from"./chunk-DOJPSIMG.mjs";import{a as n}from"./chunk-3TRXQAU4.mjs";d();import{existsSync as p}from"node:fs";import m from"node:path";function a(){return process.env.PRJCT_TEST_MODE==="1"?[i(".prjct-tests","kimi-code"),i(".prjct-tests","kimi")]:[i(".kimi-code"),i(".kimi")]}n(a,"kimiHomeDirs");function v(){return a().map(t=>m.join(t,"mcp.json"))}n(v,"getKimiMcpConfigPaths");function g(){let[t,e]=a(),r=p(e)&&!p(t)?e:t;return m.join(r,"mcp.json")}n(g,"getKimiMcpConfigPath");async function l(t=g()){let e=await c("context7",o.context7,t),r=await c("prjct",o.prjct,t);return{path:t,changed:e.changed||r.changed}}n(l,"ensureKimiMcpServer");async function S(){let t=await Promise.all(v().map(async e=>{let r=await s("prjct",e),u=await s("context7",e,o.context7);return{path:e,removed:(r.changed?1:0)+(u.changed?1:0)}}));return{paths:t.filter(e=>e.removed>0).map(e=>e.path),serversRemoved:t.reduce((e,r)=>e+r.removed,0)}}n(S,"uninstallKimiMcpServer");export{v as a,g as b,l as c,S as d};
@@ -1,10 +0,0 @@
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{g as y,p as w}from"./chunk-HYIT7MF5.mjs";import{e as l,g as x}from"./chunk-225DWS4D.mjs";import{a as o,b as S}from"./chunk-3TRXQAU4.mjs";x();w();import p from"node:fs";import v from"node:fs/promises";import h from"node:os";import t from"node:path";var g="mcp-remote@0.1.38";var C="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";function b(){let e=_();if(e)return e;if(process.env.PRJCT_MCP_ALLOW_LOCAL==="1"){let r=k();if(r)return{command:r,args:["mcp-server"],description:C}}return{command:"npx",args:["-y","prjct-cli@latest","mcp-server"],description:C}}o(b,"getPrjctMcpConfig");function P(e){let r=e.replace(/\\/g,"/");return!!(r.includes("/.worktrees/")||r.includes("/prjct-cli/bin/prjct")&&!r.includes("/node_modules/prjct-cli/"))}o(P,"isNonProductionPrjctPath");function _(){let e=[];try{e.push(t.dirname(S.resolve("prjct-cli/package.json")))}catch{}let r=h.homedir();for(let n of[process.env.NVM_BIN?t.resolve(process.env.NVM_BIN,".."):"",t.join(r,".nvm","versions","node",process.version,"lib"),"/opt/homebrew/lib","/usr/local/lib"].filter(Boolean))e.push(t.join(n,"node_modules","prjct-cli"));for(let n of e){if(P(n))continue;let s=t.join(n,"bin","prjct.cjs"),i=p.existsSync(t.join(n,"dist","bin","prjct.mjs"))||p.existsSync(t.join(n,"dist","bin","prjct-core.mjs"));if(!p.existsSync(s)||!i)continue;let a=[process.execPath,t.join(t.dirname(process.execPath),"node"),t.join(n,"..","..","bin","node")].find(m=>m&&p.existsSync(m)),f=t.resolve(n,"..","..","..","bin","node"),d=p.existsSync(f)?f:a??process.execPath;return{command:d,args:[s,"mcp-server"],env:{PATH:`${t.dirname(d)}${t.delimiter}/usr/bin${t.delimiter}/bin`},description:C}}return null}o(_,"resolvePublishedPrjctMcpConfig");function k(){let e=process.argv[1],r=[e?t.resolve(t.dirname(e),"prjct"):"",e?t.resolve(t.dirname(e),"..","bin","prjct"):"",t.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let n of r){if(!p.existsSync(n))continue;let s=(()=>{try{return p.realpathSync(n)}catch{return n}})();if(!P(s))return s}return null}o(k,"resolveLocalPrjctBin");var L={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:b(),linear:{command:"npx",args:["-y",g,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",g,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};function u(){return process.env.PRJCT_TEST_MODE==="1"?t.join(h.tmpdir(),"prjct-context7-test","mcp.json"):t.join(h.homedir(),".claude","mcp.json")}o(u,"getClaudeMcpConfigPath");async function j(e=u()){try{let r=await v.readFile(e,"utf-8");return JSON.parse(r)}catch(r){let n=l(r).toLowerCase();if(n.includes("no such file")||n.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${e}: ${l(r)}`)}}o(j,"readMcpConfig");async function M(e,r=u()){await y(r,e)}o(M,"writeMcpConfig");async function $(e,r,n=u()){let s=await j(n),i={...s.mcpServers||{}},c=i[e];i[e]=r,s.mcpServers=i;let a=JSON.stringify(c)!==JSON.stringify(r);return await M(s,n),{path:n,changed:a}}o($,"upsertMcpServer");async function A(e,r=u()){return!!(await j(r)).mcpServers?.[e]}o(A,"hasMcpServer");async function V(e,r=u(),n){let s=await j(r),i=s.mcpServers,c=i?.[e];return!i||!c?{path:r,changed:!1}:n&&JSON.stringify(c)!==JSON.stringify(n)?{path:r,changed:!1}:(delete i[e],Object.keys(i).length===0&&delete s.mcpServers,await M(s,r),{path:r,changed:!0})}o(V,"removeMcpServer");function D(e,r,n,s,i){let c=e.indexOf(n),a=e.indexOf(s);if(c!==-1&&a!==-1&&a>c){let f=e.slice(0,c),d=e.slice(a+s.length),m=d.startsWith(`
8
- `)?d.slice(1):d;return{next:f+r+m}}return new RegExp(`^\\s*\\[mcp_servers\\.${i}\\]`,"m").test(e)?{next:e,skipped:"user-managed"}:e.trim().length>0?{next:`${e.trimEnd()}
9
-
10
- ${r}`}:{next:r}}o(D,"upsertMarkedBlock");async function F(e,r,n){return n===r?{path:e,changed:!1}:(await v.mkdir(t.dirname(e),{recursive:!0}),await v.writeFile(e,n,"utf-8"),{path:e,changed:!0})}o(F,"writeConfigIfChanged");export{L as a,u as b,$ as c,A as d,V as e,D as f,F as g};
@@ -1,103 +0,0 @@
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};
@@ -1,7 +0,0 @@
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 l,i as R}from"./chunk-DMO3ZFUG.mjs";import{e as h,l as L}from"./chunk-HU5ERAAV.mjs";import{a as c}from"./chunk-3TRXQAU4.mjs";L();R();function T(o,s,n){let a=o.prepare("INSERT INTO analysis_finding (id, analysis_id, kind, title, detail, severity, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)"),r=[],e=c((t,i,y,A)=>{if(!i)return;let p=r.length,_=`${s}-f${p}`;a.run(_,s,t,i,y,A,p),r.push(_)},"addFinding");for(let t of n.patterns??[])e("pattern",t.name,t.description,null);for(let t of n.antiPatterns??[])e("anti_pattern",t.issue,t.suggestion,t.severity);for(let t of n.techDebt??[])e("tech_debt",t.description,`${t.area}: ${t.impact}`,t.priority);for(let t of n.riskAreas??[])e("risk_area",t.path,`${t.reason} \u2014 ${t.risk}`,t.severity);for(let t of n.refactorSuggestions??[])e("refactor",t.description,t.benefit,null);let m=new Set;for(let t of[...n.projectInsights??[],...n.architecture?.insights??[]]){let i=t.toLowerCase();m.has(i)||(m.add(i),e("insight",t,null,null))}let d=o.prepare("INSERT INTO analysis_convention (id, analysis_id, rule, sort_order) VALUES (?, ?, ?, ?)");(n.conventions??[]).forEach((t,i)=>{d.run(`${s}-c${i}`,s,t.rule,i)});let g=o.prepare("INSERT INTO analysis_stack_item (id, analysis_id, kind, name) VALUES (?, ?, ?, ?)");[...(n.stack?.languages??[]).map(t=>({kind:"language",name:t})),...(n.stack?.frameworks??[]).map(t=>({kind:"framework",name:t}))].forEach((t,i)=>{g.run(`${s}-s${i}`,s,t.kind,t.name)});let f=o.prepare("INSERT INTO analysis_command (id, analysis_id, name, command, purpose) VALUES (?, ?, ?, ?, ?)");Object.entries(n.commands??{}).filter(t=>!!t[1]).forEach(([t,i],y)=>{f.run(`${s}-cmd${y}`,s,t,i,null)});let S=o.prepare("INSERT INTO analysis_domain (id, analysis_id, name, paths) VALUES (?, ?, ?, ?)");(n.architecture?.domains??[]).forEach((t,i)=>{S.run(`${s}-d${i}`,s,t,null)})}c(T,"writeAnalysisChildren");var E=class{static{c(this,"LLMAnalysisStorage")}save(s,n){let a=l.getDb(s),r=h();a.transaction(()=>{a.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r);let e=a.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(n.commitHash??null,"active",JSON.stringify(n),n.analyzedAt);T(a,String(e.lastInsertRowid),n)})()}getActiveRelational(s){let n=l.get(s,"SELECT id FROM llm_analysis WHERE status = 'active' LIMIT 1");if(!n)return null;let a=String(n.id),r=l.query(s,"SELECT kind, title, detail FROM analysis_finding WHERE analysis_id = ? ORDER BY kind, sort_order",a),e=l.query(s,"SELECT rule FROM analysis_convention WHERE analysis_id = ? ORDER BY sort_order",a).map(u=>u.rule),m=l.query(s,"SELECT kind, name FROM analysis_stack_item WHERE analysis_id = ?",a),d=l.query(s,"SELECT name FROM analysis_domain WHERE analysis_id = ?",a).map(u=>u.name),g=l.query(s,"SELECT name, command FROM analysis_command WHERE analysis_id = ?",a);return r.length===0&&e.length===0&&m.length===0?null:{findings:r,conventions:e,stack:m,domains:d,commands:g}}getActive(s){let n=l.get(s,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return n?JSON.parse(n.analysis):null}getActiveSummary(s){let n=this.getActive(s);return n?{commitHash:n.commitHash,architectureStyle:n.architecture.style,patternCount:n.patterns.length,antiPatternCount:n.antiPatterns.length,analyzedAt:n.analyzedAt}:null}isCurrent(s,n){return n?l.get(s,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===n:!1}getAllFull(s){return l.query(s,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(a=>({id:a.id,status:a.status,commitHash:a.commit_hash,analyzedAt:a.analyzed_at,supersededAt:a.superseded_at,analysis:JSON.parse(a.analysis)}))}getHistory(s,n=10){return l.query(s,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",n).map(r=>{let e=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:e.patterns.length}})}},k=new E,C=k;export{C as a};
@@ -1,7 +0,0 @@
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,b}from"./chunk-WGDE3L33.mjs";import"./chunk-V3Y3G2DE.mjs";import"./chunk-5ONMON5L.mjs";import"./chunk-SLYLGDX7.mjs";import"./chunk-3FXNIJCS.mjs";import"./chunk-IFLBZKKK.mjs";import"./chunk-ZKJZDOPT.mjs";import"./chunk-YOGI4WE6.mjs";import"./chunk-3USVY66O.mjs";import"./chunk-OIE3AKKO.mjs";import"./chunk-YLYAYRSJ.mjs";import"./chunk-JPMUJY42.mjs";import"./chunk-WZXUFSVT.mjs";import"./chunk-CDLZLTRY.mjs";import"./chunk-CEOTHJIY.mjs";import"./chunk-KWC2PCPC.mjs";import"./chunk-DMO3ZFUG.mjs";import"./chunk-NNOX3UU4.mjs";import"./chunk-MTDCRYLP.mjs";import"./chunk-PIA26GWG.mjs";import"./chunk-RP7F67ZT.mjs";import"./chunk-INJ5WT2D.mjs";import"./chunk-HU5ERAAV.mjs";import"./chunk-6RT2P22O.mjs";import"./chunk-ZXTJLMVZ.mjs";import"./chunk-VWFVSNQT.mjs";import"./chunk-U24YKPYX.mjs";import"./chunk-D62TAZG6.mjs";import"./chunk-XYDLXF5A.mjs";import"./chunk-FATYLG3L.mjs";import"./chunk-2EEMQV7N.mjs";import"./chunk-KPR5TWSN.mjs";import"./chunk-623SNKDH.mjs";import"./chunk-TTN2CFZC.mjs";import"./chunk-GDLAQV3Q.mjs";import"./chunk-UT425KVX.mjs";import"./chunk-DOJPSIMG.mjs";import"./chunk-HYIT7MF5.mjs";import"./chunk-225DWS4D.mjs";import"./chunk-3TRXQAU4.mjs";export{b as applyDoctorHeal,a as planDoctorHeal};
@@ -1,7 +0,0 @@
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"./chunk-3TRXQAU4.mjs";var s="prjct-cli",r="3.97.0",c="The agentic harness for AI coding agents \u2014 work cycles, bounded RAG context, persistent memory, guardrails, and performance evals.",n="dist/bin/prjct.mjs",o={prjct:"bin/prjct.cjs"},i={access:"public",registry:"https://registry.npmjs.org"},a={build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:dry-run":"node scripts/release.js --dry-run",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:unit":"bun test --path-ignore-patterns='**/e2e/**'","test:fast":"bun scripts/test-sharded.ts","test:sharded":"bun scripts/test-sharded.ts","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"bun run lint:no-let && biome lint .","lint:no-let":"bun scripts/check-no-let.ts","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"bun run lint:no-let && biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/","bench:ab":"bun scripts/bench-ab.ts","bench:weak-model":"bun scripts/bench-weak-model.ts","demo:weak-vs-frontier":"bun scripts/demo-weak-vs-frontier.ts","harness:score":"bun bin/prjct.ts harness score --md","gate:dominance":"bun test core/__tests__/services/weak-model-bench.test.ts core/__tests__/services/weak-frontier-demo.test.ts core/__tests__/services/harness-score.test.ts core/__tests__/services/dynasty-outcomes.test.ts core/__tests__/services/content-bound-stamp.test.ts core/__tests__/services/sot-bind.test.ts core/__tests__/services/trap-surface-slo.test.ts core/__tests__/services/impact-ready.test.ts core/__tests__/services/delivery-geometry.test.ts core/__tests__/services/cycle-budget-card.test.ts core/__tests__/services/land-rho.test.ts core/__tests__/services/one-breath-install.test.ts core/__tests__/services/doctor-heal.test.ts && bun run bench:weak-model && bun run demo:weak-vs-frontier"},p=["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],l={name:"Juan Jos\xE9 L\xF3pez Lira",email:"jlopezlira@gmail.com",url:"https://prjct.app"},d=[{name:"prjct.app contributors"}],u="MIT",m=[{type:"MIT",url:"https://opensource.org/licenses/MIT"}],b={"@clack/prompts":"1.0.0","@modelcontextprotocol/server":"2.0.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"4.3.6"},_={"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:"4.12.27","ip-address":">=10.1.1",qs:"6.15.2"},h={"@biomejs/biome":"2.3.13","@modelcontextprotocol/client":"2.0.0","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},g={type:"git",url:"git+https://github.com/prjct-app/cli.git"},k={url:"https://github.com/prjct-app/cli/issues"},v="https://prjct.app",j="bun@1.3.14",y={bun:">=1.0.0",node:">=22.5.0"},f=["assets/","bin/prjct","bin/prjct.cjs","dist/","templates/","scripts/install.sh","LICENSE","NOTICE","README.md","CHANGELOG.md"],w="node scripts/build.js",E={name:s,version:r,description:c,main:n,bin:o,publishConfig:i,scripts:a,keywords:p,author:l,contributors:d,license:u,licenses:m,dependencies:b,overrides:_,devDependencies:h,repository:g,bugs:k,homepage:v,packageManager:j,engines:y,files:f,prepublishOnly:w};export{l as author,o as bin,k as bugs,d as contributors,E as default,b as dependencies,c as description,h as devDependencies,y as engines,f as files,v as homepage,p as keywords,u as license,m as licenses,n as main,s as name,_ as overrides,j as packageManager,w as prepublishOnly,i as publishConfig,g as repository,a as scripts,r as version};
@@ -1,23 +0,0 @@
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 C,b as Z}from"./chunk-C35JQUWD.mjs";import{b as Q}from"./chunk-2JJM3YMW.mjs";import{a as W}from"./chunk-VRFYDYQY.mjs";import{a as X,d as Y}from"./chunk-2ZPM4Z6W.mjs";import"./chunk-BSR3XUBD.mjs";import{a as J}from"./chunk-MCY7OXED.mjs";import{h as x,i as T}from"./chunk-YQ6HM3YO.mjs";import"./chunk-ZK7BMUMR.mjs";import"./chunk-5UUITMRX.mjs";import"./chunk-K25HGTC3.mjs";import"./chunk-45LKWJ5D.mjs";import{a as O}from"./chunk-VCSESVZ4.mjs";import{a as V}from"./chunk-GTG67Z45.mjs";import{a as K}from"./chunk-AS3LWTQ4.mjs";import{a as z}from"./chunk-XU3BQPBU.mjs";import{c as F}from"./chunk-VDXTMAMO.mjs";import"./chunk-H2KNJUPN.mjs";import{b as q}from"./chunk-Q3LUL6LL.mjs";import{a as U,g as B}from"./chunk-C7YBUD4K.mjs";import"./chunk-IOFCSTGM.mjs";import"./chunk-S6FBPXQL.mjs";import"./chunk-NOHSLOLL.mjs";import"./chunk-RCIWCKL7.mjs";import"./chunk-56FW4P6U.mjs";import"./chunk-BQKDJ3U6.mjs";import"./chunk-6OYLZ4NM.mjs";import"./chunk-SO3ZPNWT.mjs";import"./chunk-V7R3L54M.mjs";import"./chunk-6P4GMVUZ.mjs";import"./chunk-UHXV7MDW.mjs";import"./chunk-TILUQF6L.mjs";import"./chunk-Y5SEUYET.mjs";import"./chunk-MG3YN3AI.mjs";import"./chunk-YEALP3WX.mjs";import"./chunk-QZ7T2EYR.mjs";import"./chunk-YOGI4WE6.mjs";import"./chunk-AJXELVNH.mjs";import"./chunk-CWLGRKA7.mjs";import"./chunk-5YLI5V3Q.mjs";import"./chunk-F2FKQUYE.mjs";import{f as b}from"./chunk-6AFXUX2M.mjs";import"./chunk-WSVMQYYU.mjs";import{b as v}from"./chunk-LZC6NGB6.mjs";import"./chunk-XLFEWZRA.mjs";import"./chunk-XPRLQIVQ.mjs";import"./chunk-EZRNQXCC.mjs";import{a as L}from"./chunk-KUQLXY2P.mjs";import"./chunk-HCPQZRR3.mjs";import{b as j}from"./chunk-EHVU2SMR.mjs";import"./chunk-HPCSSJXH.mjs";import"./chunk-E5QQDYBR.mjs";import"./chunk-B7AQHL7B.mjs";import"./chunk-L4TUXFCL.mjs";import"./chunk-DIEPWXJJ.mjs";import"./chunk-UNNY2IWZ.mjs";import{b as S}from"./chunk-3USVY66O.mjs";import"./chunk-OIE3AKKO.mjs";import"./chunk-Q6C27OL7.mjs";import"./chunk-NXUIMC22.mjs";import{d as w}from"./chunk-WTDUJB4I.mjs";import{f as H,i as lt}from"./chunk-DMO3ZFUG.mjs";import"./chunk-NNOX3UU4.mjs";import"./chunk-INJ5WT2D.mjs";import"./chunk-HU5ERAAV.mjs";import"./chunk-6RT2P22O.mjs";import"./chunk-ZXTJLMVZ.mjs";import"./chunk-TIBYHZFA.mjs";import"./chunk-VWFVSNQT.mjs";import"./chunk-U24YKPYX.mjs";import{b as M,p as at}from"./chunk-D62TAZG6.mjs";import"./chunk-KPR5TWSN.mjs";import"./chunk-623SNKDH.mjs";import"./chunk-TTN2CFZC.mjs";import"./chunk-DOJPSIMG.mjs";import{l as N,p as ut}from"./chunk-HYIT7MF5.mjs";import"./chunk-225DWS4D.mjs";import{a as u}from"./chunk-3TRXQAU4.mjs";import{createHash as A}from"node:crypto";import y from"node:fs/promises";import f from"node:path";var dt=15;function tt(e){let r=[],i=[];e.loop?.stopped&&e.loop.message&&(r.push("loop-hard-stop"),i.push(e.loop.message)),e.pressure?.level==="critical"&&e.pressure.cue?(r.push("context-pressure-critical"),i.push(e.pressure.cue)):e.pressure?.level==="warn"&&e.pressure.cue&&(r.push("context-pressure-warn"),i.push(e.pressure.cue)),e.qualityInject?.trim()&&(r.push("quality-ledger"),i.push(e.qualityInject.trim()));let t=e.turns??0,n=e.stuckThreshold??dt;if(!e.loop?.stopped&&t>=n&&(r.push("stuck-cycle"),i.push(`\u26A0 ${t} turns on this cycle and it is still open. If you are not nearly done, STOP looping: split it, ship the slice that works, or check in with the user \u2014 then \`prjct status done\`. A re-plan beats another grinding turn.`)),i.length===0)return{level:"ok",markdown:null,cues:[]};let s=r.some(g=>["loop-hard-stop","context-pressure-critical","context-pressure-warn"].includes(g)),a=r.some(g=>["quality-ledger","stuck-cycle"].includes(g)),c=s?"hard":a?"warn":"ok",m=c==="hard"?"# prjct: alignment (MUST \u2014 hard gate)":"# prjct: alignment (mid-cycle)",d=i.join(`
8
-
9
- `),o=r.includes("quality-ledger")&&!d.includes("prjct ship")?`
10
-
11
- _${U}_`:"";return{level:c,cues:r,markdown:`${m}
12
-
13
- ${d}${o}`}}u(tt,"buildAlignmentCard");lt();at();ut();var P=1500,pt=P+2100,et=15,mt=10,R=8,nt=420,gt=2,ft=15e3;var ht=new Set(["address","apply","check","continue","create","current","description","feedback","handle","merge","monitor","please","review","should","title","watch","write"]),E=new WeakMap,$=new Map;async function rt(e,r,i={}){let t=r!==void 0?r:await S.readConfig(e);if(!t?.projectId)return null;let n=yt(t,e,i),s=["# prjct: project state"];try{let c=await V(t.projectId,e);if(c.current){let d=st(c.current.startedAt);s.push(`- Active work cycle: "${c.current.description}" (${d}) [${c.current.label}]`);let{turns:o,loopVerdict:g,currentTask:l}=(()=>{try{let p=c.mainTaskRaw;return{turns:p?.turnCount??0,currentTask:p,loopVerdict:W(t,p)}}catch{return{turns:0,currentTask:null,loopVerdict:null}}})();!g?.stopped&&o>0&&o%mt===0&&o<et&&s.push(` \u21B3 Turn ${o} on this cycle \u2014 still advancing the goal? If stuck, re-plan or split; do not loop.`);try{let p=t.maxTokensPerCycle??0;if(p>0&&l){let h=(l.tokensIn??0)+(l.tokensOut??0);h>=p?s.push(` \u26A0 Token budget: ${h.toLocaleString()} of ${p.toLocaleString()} spent on this cycle. STOP growing it \u2014 ship the working slice, split the remainder into a new cycle, or check in with the user.`):h>=p*.8&&s.push(` \u21B3 Token budget: ${h.toLocaleString()} of ${p.toLocaleString()} (${Math.round(h/p*100)}%). Plan the close: prefer finishing over expanding scope.`)}}catch{}try{let p=c.current.startedAt;if(p){let h=H.get(t.projectId,`SELECT COUNT(DISTINCT json_extract(data, '$.file')) AS c
14
- FROM events WHERE type = 'memory.post_edit' AND timestamp >= ?`,p)?.c??0,I=q(h);I&&s.push(` ${I}`)}}catch{}try{let p=K(t,l),h=B(t.projectId),I=tt({loop:g,pressure:p,qualityInject:h,turns:o,stuckThreshold:et});I.markdown&&(s.push(""),s.push(I.markdown))}catch{}l?.ownerAgent&&s.push(`- Owner: ${l.ownerAgent}${l.ownerIdentity?`/${l.ownerIdentity}`:""}${l.yieldStatus==="yielded"?" (yielded \u2014 awaiting accept)":""}`)}let m=c.all.filter(d=>!d.isCurrent);m.length>0&&s.push(`- ${m.length} task(s) active in other workspace(s)`),!c.current&&m.length>0&&s.push("- This workspace idle but siblings busy \u2014 `prjct work` auto-isolates to a worktree when needed")}catch{}let a=await n;for(let c of a)c&&s.push(c);return s.length===1?null:s.join(`
15
- `)}u(rt,"buildProjectState");function yt(e,r,i={}){return Promise.all([i.skipHandoff?Promise.resolve(null):(async()=>{try{let{formatPendingHandoffCue:t}=await import("./agent-switch-AVSX6SLY.mjs"),n=t(e.projectId);return n?`- ${n.replace(/\n/g,`
16
- - `)}`:null}catch{return null}})(),(async()=>{try{let t=await L.getActiveTasks(e.projectId);return t.length>0?`- Pending: ${t.length} \xB7 Next: "${t[0].description}"`:null}catch{return null}})(),(async()=>{try{if(!await N(f.join(r,".git")))return null;let t=await vt(r);if(!t.branch)return null;let n=[];t.modified>0&&n.push(`${t.modified} modified`),t.staged>0&&n.push(`${t.staged} staged`),t.untracked>0&&n.push(`${t.untracked} untracked`);let s=n.length>0?` \u2014 working tree ${n.join(", ")}`:"",a=t.ahead>0?`${s?",":" \u2014"} ${t.ahead} unpushed`:"";return`- Branch: ${t.branch}${s}${a}`}catch{return null}})(),(async()=>{try{let t=await O.getRecent(e.projectId,1);if(t.length===0)return null;let n=t[0],s=st(n.shippedAt??"");return`- Last ship: ${n.version?`v${n.version}`:n.name} (${s})`}catch{return null}})(),(async()=>{try{let t=v.countByType(e.projectId,"inbox");return t>0?`- Inbox: ${t} items pending`:null}catch{return null}})()])}u(yt,"collectSecondarySignals");function It(e){return e.type==="voice"||e.type==="glossary"?!0:e.type==="example"&&!!e.tags.domain&&(e.tags.polarity==="good"||e.tags.polarity==="bad")}u(It,"isValidGuidanceEntry");function kt(e,r){try{let i=C(r),t=x(r).filter(o=>o.length>=5&&!ht.has(o)),n=t.length>0?v.searchFts(e,t,R*2):[],s=i?v.recall(e,{types:["voice","glossary","example"],limit:R*2}).filter(o=>o.tags.domain==="delivery"||o.tags.domain===i):[],a=new Map([...n,...s].map(o=>[o.id,o])),c=new Map([["voice",0],["glossary",1],["example",2]]),m=[...a.values()].filter(It).sort((o,g)=>(c.get(o.type)??3)-(c.get(g.type)??3)).slice(0,gt);if(m.length===0)return null;let d=["# prjct: selective guidance"];for(let o of m){let g=o.type==="example"?` ${o.tags.polarity}/${o.tags.domain}`:o.tags.domain?` ${o.tags.domain}`:"",l=nt-d.join(`
17
- `).length-g.length-8;if(l<24)break;let p=T(o.content.replace(/\s+/g," ").trim(),Math.min(150,l));d.push(`- ${o.type}${g}: ${p}`)}return d.length===1?null:{text:T(d.join(`
18
- `),nt),memoryIds:m.slice(0,d.length-1).map(o=>o.id)}}catch{return null}}u(kt,"buildSelectiveGuidance");function wt(e,r,i=P){if(!r)return e;let t=e?`${e}
19
-
20
- ${r}`:r;return t.length<=i?t:null}u(wt,"appendPromptSection");function it(e,r){try{let i=x(r);if(i.length===0)return null;let t=v.searchFts(e,i,R),n=t.find(s=>s.type==="decision"||s.type==="gotcha"||s.type==="fact")??t.find(s=>s.type==="anti-pattern"||s.type==="pattern")??t.find(s=>s.type==="gotcha"||s.type==="anti-pattern");return n?n.type==="decision"||n.type==="gotcha"||n.type==="fact"?{cue:`> Tip\u2192user (SoT): ${b(n)} \`${n.id}\` \u2014 say it briefly in chat; binding \u2014 do not contradict without superseding`,memoryId:n.id}:n.type==="anti-pattern"||n.type==="pattern"?{cue:`> Tip\u2192user (suggest): ${b(n)} \`${n.id}\` \u2014 propose the live change in chat, then apply when editing`,memoryId:n.id}:{cue:`> Tip\u2192user: ${b(n)} \`${n.id}\``,memoryId:n.id}:null}catch{return null}}u(it,"buildTopicalCueResult");function ie(e,r,i){return it(e,r)?.cue??null}u(ie,"buildTopicalCue");var k=new Map,D={skipDiskSnapshotOnce:!1};function se(){k.clear(),D.skipDiskSnapshotOnce=!0}u(se,"_resetGitSnapshotCacheForTests");async function vt(e){let r=await y.stat(f.join(e,".git","index")).then(a=>a.mtimeMs).catch(()=>0),i=k.get(e);if(i&&i.expiresAt>Date.now()&&i.indexMtimeMs===r)return i.snapshot;let t=St(e);if(!i&&!D.skipDiskSnapshotOnce){let a=await y.readFile(t,"utf-8").then(c=>JSON.parse(c)).catch(()=>null);if(a&&a.expiresAt>Date.now()&&a.indexMtimeMs===r)return k.set(e,a),a.snapshot}D.skipDiskSnapshotOnce=!1;let n=await Pt(e);k.size>32&&k.clear();let s={snapshot:n,expiresAt:Date.now()+ft,indexMtimeMs:r};return k.set(e,s),y.mkdir(f.dirname(t),{recursive:!0}).then(()=>y.writeFile(t,JSON.stringify(s))).catch(()=>{}),n}u(vt,"captureGit");function St(e){let r=A("sha1").update(f.resolve(e)).digest("hex").slice(0,16);return f.join(w.runDir(),`prompt-git-${r}.json`)}u(St,"gitSnapshotPath");function _(e,r){let i=A("sha1").update(f.resolve(r)).digest("hex").slice(0,12);return`${e.replace(/[^a-zA-Z0-9._-]/g,"_")}-${i}`}u(_,"promptHashKey");async function bt(e,r,i){let t=_(e,r),n=A("sha256").update(i).digest("hex");if($.get(t)===n)return null;$.size>64&&$.clear(),$.set(t,n);let s=f.join(w.runDir(),`prompt-state-${t}.hash`);return(await y.readFile(s,"utf-8").catch(()=>"")).trim()===n?null:(await y.mkdir(f.dirname(s),{recursive:!0}).then(()=>y.writeFile(s,n)).catch(()=>{}),i)}u(bt,"dedupePromptPayload");function Tt(e,r){return f.join(w.runDir(),`prompt-afteremit-${_(e,r)}.json`)}u(Tt,"promptAfterEmitStampPath");async function $t(e,r,i,t){let n=Tt(e,r),s=A("sha256").update(i).digest("hex");await y.mkdir(f.dirname(n),{recursive:!0}).then(()=>y.writeFile(n,JSON.stringify({hash:s,record:t}))).catch(()=>{})}u($t,"persistPromptAfterEmit");async function At(e,r){try{let i=_(e,r),t=w.runDir(),[n,s]=await Promise.all([y.readFile(f.join(t,`prompt-afteremit-${i}.json`),"utf-8"),y.readFile(f.join(t,`prompt-state-${i}.hash`),"utf-8")]),a=JSON.parse(n),c=a.record;return!c||a.hash!==s.trim()||c.projectId!==e||!Array.isArray(c.surfacedIds)?null:c}catch{return null}}u(At,"readPersistedPromptAfterEmit");async function Pt(e){let r={branch:"",modified:0,staged:0,untracked:0,ahead:0},i=u(async o=>{try{return(await M("git",o,{cwd:e,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[t,n,s]=await Promise.all([i(["branch","--show-current"]),i(["status","--porcelain"]),i(["rev-list","--count","@{u}..HEAD"])]);if(!t)return r;let{modified:a,staged:c,untracked:m}=n.split(`
21
- `).filter(Boolean).reduce((o,g)=>{let l=g.slice(0,2);return l.startsWith("??")?o.untracked++:(l[0]!==" "&&l[0]!=="?"&&o.staged++,l[1]!==" "&&o.modified++),o},{modified:0,staged:0,untracked:0}),d=Number.parseInt(s,10)||0;return{branch:t,modified:a,staged:c,untracked:m,ahead:d}}u(Pt,"captureGitUncached");function st(e){if(!e)return"unknown";let r=Date.parse(e);if(Number.isNaN(r))return"unknown";let i=Math.max(0,Math.floor((Date.now()-r)/864e5));return i<1?"today":i<2?"yesterday":i<30?`${i}d ago`:`${Math.floor(i/30)}mo ago`}u(st,"formatRelative");function ot(e,r,i,t=P){let n=it(e,r),s=F(e,r),a=Z(r),c=kt(e,r),m=[n?.cue,a,c?.text,s].filter(l=>!!l).reduce((l,p)=>wt(l,p,t)??l,T(i,t)),d=!!(c?.text&&m.includes(c.text)),g=!!(a&&m.includes(a))?`delivery:${C(r)??"unknown"}`:d?c?.memoryIds[0]??null:null;return{prioritized:m,cueResult:n,guidance:c,guidanceIncluded:d,guidanceRuleId:g}}u(ot,"computePromptGuidance");function oe(e=process.cwd(),r){return J({event:"UserPromptSubmit",projectPath:e,build:u(async(i,t,n)=>{let s=(i.prompt??"").trim();if(!s)return null;let a=await S.readConfig(t);if(!a?.projectId)return null;let c=n==="kimi"?await Y(a.projectId,i.session_id,n).catch(()=>null):null,m=await rt(t,a,{skipHandoff:!!c}),d=c?await X(t,a,{digest:c==="digest"}).catch(()=>null):null;if(!m&&!d)return null;let o=[d,m].filter(Boolean).join(`
22
-
23
- `),g=d?pt:P,{prioritized:l,cueResult:p,guidance:h,guidanceIncluded:I,guidanceRuleId:ct}=ot(a.projectId,s,o,g),G={projectId:a.projectId,projectPath:t,bumpTurn:!!m?.includes("Active work cycle:"),surfacedIds:[...p?[p.memoryId]:[],...I?h?.memoryIds??[]:[]],guidanceRuleId:ct};return E.set(i,G),await $t(a.projectId,t,l,G),bt(a.projectId,t,l)},"build"),afterEmit:u(async(i,t)=>{let n=E.get(i)??await jt(i,t);E.delete(i),n&&await Promise.all([n.bumpTurn?j.bumpTurnCount(n.projectId).then(()=>{}):Promise.resolve(),n.surfacedIds.length>0?z(n.projectId,n.projectPath,n.surfacedIds):Promise.resolve(),n.guidanceRuleId?Promise.resolve(Q.recordGuidanceActivation(n.projectId,{ruleId:n.guidanceRuleId})).then(()=>{}):Promise.resolve()])},"afterEmit")},r)}u(oe,"runPromptHook");async function jt(e,r){let i=(e.prompt??"").trim();if(!i)return null;let t=await S.readConfig(r).catch(()=>null);if(!t?.projectId)return null;let n=await At(t.projectId,r);if(n)return n;let[s,a]=await Promise.all([j.getCurrentTask(t.projectId).catch(()=>null),rt(r,t)]),{cueResult:c,guidance:m,guidanceIncluded:d,guidanceRuleId:o}=ot(t.projectId,i,a??"");return{projectId:t.projectId,projectPath:r,bumpTurn:!!s,surfacedIds:[...c?[c.memoryId]:[],...d?m?.memoryIds??[]:[]],guidanceRuleId:o}}u(jt,"rebuildPromptAfterEmit");export{se as _resetGitSnapshotCacheForTests,Z as buildDeliveryGuidance,rt as buildProjectState,kt as buildSelectiveGuidance,ie as buildTopicalCue,C as classifyDeliveryIntent,oe as runPromptHook};
@@ -1,7 +0,0 @@
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 a,d as b,e as c,f as d,g as e,h as f,i as g,j as h}from"./chunk-VILH3VYH.mjs";import"./chunk-MR5XXHRK.mjs";import"./chunk-SRJEX6XF.mjs";import"./chunk-ZHTYSYZC.mjs";import"./chunk-EFSPBB4S.mjs";import"./chunk-7ZHWJSW5.mjs";import"./chunk-WGDE3L33.mjs";import"./chunk-V3Y3G2DE.mjs";import"./chunk-5ONMON5L.mjs";import"./chunk-SLYLGDX7.mjs";import"./chunk-3FXNIJCS.mjs";import"./chunk-BTSHD3XJ.mjs";import"./chunk-CXNVDJNN.mjs";import"./chunk-ROOCBUKH.mjs";import"./chunk-5YSPND5J.mjs";import"./chunk-C35JQUWD.mjs";import"./chunk-V6L5PLD7.mjs";import"./chunk-U55OPVYR.mjs";import"./chunk-JCWA7NLM.mjs";import"./chunk-CFD6CW7T.mjs";import"./chunk-GTG67Z45.mjs";import"./chunk-4MR5XSLO.mjs";import"./chunk-XU3BQPBU.mjs";import"./chunk-ZQHSJ6FF.mjs";import"./chunk-V7VA4EQX.mjs";import"./chunk-YJOC2JJK.mjs";import"./chunk-7QMBIMEX.mjs";import"./chunk-VDXTMAMO.mjs";import"./chunk-NZKUCQZK.mjs";import"./chunk-H2KNJUPN.mjs";import"./chunk-6FUCOGOW.mjs";import"./chunk-7CI4AMVO.mjs";import"./chunk-MDONTD7O.mjs";import"./chunk-ESB4ALH2.mjs";import"./chunk-Q3LUL6LL.mjs";import"./chunk-C7YBUD4K.mjs";import"./chunk-IOFCSTGM.mjs";import"./chunk-S6FBPXQL.mjs";import"./chunk-NOHSLOLL.mjs";import"./chunk-RCIWCKL7.mjs";import"./chunk-ZBBNCCGV.mjs";import"./chunk-E73HSXCX.mjs";import"./chunk-76YMLNLF.mjs";import"./chunk-O5N6XYPU.mjs";import"./chunk-SROBBOJB.mjs";import"./chunk-P53YMOKR.mjs";import"./chunk-56FW4P6U.mjs";import"./chunk-BQKDJ3U6.mjs";import"./chunk-6OYLZ4NM.mjs";import"./chunk-SO3ZPNWT.mjs";import"./chunk-HYMJVHAX.mjs";import"./chunk-4T7NGLNQ.mjs";import"./chunk-MXJKULJY.mjs";import"./chunk-V7R3L54M.mjs";import"./chunk-UHXV7MDW.mjs";import"./chunk-Y5SEUYET.mjs";import"./chunk-YEALP3WX.mjs";import"./chunk-QZ7T2EYR.mjs";import"./chunk-IFLBZKKK.mjs";import"./chunk-ZKJZDOPT.mjs";import"./chunk-YOGI4WE6.mjs";import"./chunk-UYMZ3NAF.mjs";import"./chunk-AJXELVNH.mjs";import"./chunk-CWLGRKA7.mjs";import"./chunk-2NI4EEK2.mjs";import"./chunk-F2FKQUYE.mjs";import"./chunk-6AFXUX2M.mjs";import"./chunk-WSVMQYYU.mjs";import"./chunk-LZC6NGB6.mjs";import"./chunk-XLFEWZRA.mjs";import"./chunk-XPRLQIVQ.mjs";import"./chunk-EZRNQXCC.mjs";import"./chunk-KUQLXY2P.mjs";import"./chunk-HCPQZRR3.mjs";import"./chunk-EHVU2SMR.mjs";import"./chunk-HPCSSJXH.mjs";import"./chunk-E5QQDYBR.mjs";import"./chunk-B7AQHL7B.mjs";import"./chunk-L4TUXFCL.mjs";import"./chunk-ID2C2S33.mjs";import"./chunk-RACISWUV.mjs";import"./chunk-DIEPWXJJ.mjs";import"./chunk-NINFE7GS.mjs";import"./chunk-UNNY2IWZ.mjs";import"./chunk-3USVY66O.mjs";import"./chunk-OIE3AKKO.mjs";import"./chunk-YLYAYRSJ.mjs";import"./chunk-Q6C27OL7.mjs";import"./chunk-NXUIMC22.mjs";import"./chunk-JPMUJY42.mjs";import"./chunk-WZXUFSVT.mjs";import"./chunk-CDLZLTRY.mjs";import"./chunk-CEOTHJIY.mjs";import"./chunk-DZVOFEM5.mjs";import"./chunk-5EF5EOCL.mjs";import"./chunk-KWC2PCPC.mjs";import"./chunk-DMO3ZFUG.mjs";import"./chunk-NNOX3UU4.mjs";import"./chunk-MTDCRYLP.mjs";import"./chunk-PIA26GWG.mjs";import"./chunk-RP7F67ZT.mjs";import"./chunk-INJ5WT2D.mjs";import"./chunk-HU5ERAAV.mjs";import"./chunk-6RT2P22O.mjs";import"./chunk-ZXTJLMVZ.mjs";import"./chunk-TIBYHZFA.mjs";import"./chunk-VWFVSNQT.mjs";import"./chunk-U24YKPYX.mjs";import"./chunk-D62TAZG6.mjs";import"./chunk-XYDLXF5A.mjs";import"./chunk-FATYLG3L.mjs";import"./chunk-2EEMQV7N.mjs";import"./chunk-KPR5TWSN.mjs";import"./chunk-623SNKDH.mjs";import"./chunk-TTN2CFZC.mjs";import"./chunk-GDLAQV3Q.mjs";import"./chunk-UT425KVX.mjs";import"./chunk-DOJPSIMG.mjs";import"./chunk-HYIT7MF5.mjs";import"./chunk-225DWS4D.mjs";import"./chunk-3TRXQAU4.mjs";export{a as DELTA_MIN_HARNESS_RATE,b as DELTA_MIN_INTENT_PP,g as buildDemoRows,e as computeHarnessDelta,h as formatDemoMarkdown,f as renderHarnessDeltaMd,c as routeIntent,d as routeIntentBare};
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{b as y,c as ne,d as re}from"./chunk-JQE2F2RK.mjs";import{a as N,b as ee}from"./chunk-WUHGODSQ.mjs";import{g as P,o as V}from"./chunk-UH4MD3F3.mjs";import{b as A,p as te}from"./chunk-QWQFF2UG.mjs";import{a as D,e as g,f as I}from"./chunk-BUDZL4DW.mjs";import{a as o,b as O}from"./chunk-E66B27AL.mjs";re();ee();I();import{constants as de}from"node:fs";import d from"node:fs/promises";import j from"node:os";import a from"node:path";ne();import k from"node:fs/promises";import ae from"node:path";I();V();import m from"node:fs";import _ from"node:fs/promises";import M from"node:os";import p from"node:path";var w="mcp-remote@0.1.38";var E="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";function se(){let t=oe();if(t)return t;if(process.env.PRJCT_MCP_ALLOW_LOCAL==="1"){let e=ie();if(e)return{command:e,args:["mcp-server"],description:E}}return{command:"npx",args:["-y","prjct-cli@latest","mcp-server"],description:E}}o(se,"getPrjctMcpConfig");function $(t){let e=t.replace(/\\/g,"/");return!!(e.includes("/.worktrees/")||e.includes("/prjct-cli/bin/prjct")&&!e.includes("/node_modules/prjct-cli/"))}o($,"isNonProductionPrjctPath");function oe(){let t=[];try{t.push(p.dirname(O.resolve("prjct-cli/package.json")))}catch{}let e=M.homedir();for(let n of[process.env.NVM_BIN?p.resolve(process.env.NVM_BIN,".."):"",p.join(e,".nvm","versions","node",process.version,"lib"),"/opt/homebrew/lib","/usr/local/lib"].filter(Boolean))t.push(p.join(n,"node_modules","prjct-cli"));for(let n of t){if($(n))continue;let r=p.join(n,"bin","prjct.cjs"),i=m.existsSync(p.join(n,"dist","bin","prjct.mjs"))||m.existsSync(p.join(n,"dist","bin","prjct-core.mjs"));if(!m.existsSync(r)||!i)continue;let c=[process.execPath,p.join(p.dirname(process.execPath),"node"),p.join(n,"..","..","bin","node")].find(x=>x&&m.existsSync(x)),u=p.resolve(n,"..","..","..","bin","node"),f=m.existsSync(u)?u:c??process.execPath;return{command:f,args:[r,"mcp-server"],env:{PATH:`${p.dirname(f)}${p.delimiter}/usr/bin${p.delimiter}/bin`},description:E}}return null}o(oe,"resolvePublishedPrjctMcpConfig");function ie(){let t=process.argv[1],e=[t?p.resolve(p.dirname(t),"prjct"):"",t?p.resolve(p.dirname(t),"..","bin","prjct"):"",p.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let n of e){if(!m.existsSync(n))continue;let r=(()=>{try{return m.realpathSync(n)}catch{return n}})();if(!$(r))return r}return null}o(ie,"resolveLocalPrjctBin");var h={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:se(),linear:{command:"npx",args:["-y",w,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",w,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};function S(){return process.env.PRJCT_TEST_MODE==="1"?p.join(M.tmpdir(),"prjct-context7-test","mcp.json"):p.join(M.homedir(),".claude","mcp.json")}o(S,"getClaudeMcpConfigPath");async function L(t=S()){try{let e=await _.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let n=g(e).toLowerCase();if(n.includes("no such file")||n.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${g(e)}`)}}o(L,"readMcpConfig");async function ce(t,e=S()){await P(e,t)}o(ce,"writeMcpConfig");async function Oe(t,e,n=S()){let r=await L(n),i={...r.mcpServers||{}},s=i[t];i[t]=e,r.mcpServers=i;let c=JSON.stringify(s)!==JSON.stringify(e);return await ce(r,n),{path:n,changed:c}}o(Oe,"upsertMcpServer");async function Ne(t,e=S()){return!!(await L(e)).mcpServers?.[t]}o(Ne,"hasMcpServer");function b(t,e,n,r,i){let s=t.indexOf(n),c=t.indexOf(r);if(s!==-1&&c!==-1&&c>s){let u=t.slice(0,s),f=t.slice(c+r.length),x=f.startsWith(`
9
- `)?f.slice(1):f;return{next:u+e+x}}return new RegExp(`^\\s*\\[mcp_servers\\.${i}\\]`,"m").test(t)?{next:t,skipped:"user-managed"}:t.trim().length>0?{next:`${t.trimEnd()}
10
-
11
- ${e}`}:{next:e}}o(b,"upsertMarkedBlock");async function T(t,e,n){return n===e?{path:t,changed:!1}:(await _.mkdir(p.dirname(t),{recursive:!0}),await _.writeFile(t,n,"utf-8"),{path:t,changed:!0})}o(T,"writeConfigIfChanged");var J="# prjct:mcp:start - managed by prjct, do not edit between markers",F="# prjct:mcp:end",B="# prjct:mcp:context7:start - managed by prjct, do not edit between markers",X="# prjct:mcp:context7:end",H=["model-with-reasoning","current-dir","git-branch","context-remaining","five-hour-limit","weekly-limit","task-progress"];function C(){return process.env.PRJCT_TEST_MODE==="1"?ae.join(y(".prjct-tests"),"codex","config.toml"):y(".codex","config.toml")}o(C,"getCodexConfigTomlPath");function v(t){return`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}o(v,"tomlString");function K(t,e,n,r){let i=(e.args??[]).map(v).join(", "),s=[n,`[mcp_servers.${t}]`,`command = ${v(e.command)}`,`args = [${i}]`];if(e.env&&Object.keys(e.env).length>0){let c=Object.entries(e.env).map(([u,f])=>`${u} = ${v(f)}`).join(", ");s.push(`env = { ${c} }`)}return s.push(r,""),s.join(`
12
- `)}o(K,"buildMcpTomlBlock");function ue(t=h.prjct){return K("prjct",t,J,F)}o(ue,"buildPrjctMcpTomlBlock");function pe(t=h.context7){return K("context7",t,B,X)}o(pe,"buildContext7McpTomlBlock");function fe(){return["[tui]",`status_line = [${H.map(v).join(", ")}]`,""].join(`
13
- `)}o(fe,"buildCodexStatusLineToml");function le(t){return/^\s*(?:tui\.)?status_line\s*=/m.test(t)}o(le,"hasCodexStatusLine");function me(t){if(le(t))return{toml:t,changed:!1};let n=`status_line = [${H.map(v).join(", ")}]
14
- `,r=/^\s*\[tui\]\s*$/m.exec(t);if(r){let s=r.index+r[0].length,c=t.slice(0,s),u=t.slice(s),f=u.startsWith(`
15
- `)?u.slice(1):u;return{toml:`${c}
16
- ${n}${f}`,changed:!0}}let i=fe();return{toml:t.trim().length>0?`${t.trimEnd()}
17
-
18
- ${i}`:i,changed:!0}}o(me,"ensureCodexStatusLineToml");async function Je(t=C()){let e=await k.readFile(t,"utf-8").catch(()=>""),n=ue(),r=b(e,n,J,F,"prjct"),i=r.skipped,s=me(r.next),c=s.toml,u=await T(t,e,c);return{...u,skipped:i,...u.changed?{statusLineChanged:s.changed}:{}}}o(Je,"ensureCodexMcpServer");async function U(t=C()){let e=await k.readFile(t,"utf-8").catch(()=>""),n=pe(),{next:r,skipped:i}=b(e,n,B,X,"context7");return{...await T(t,e,r),skipped:i}}o(U,"ensureCodexContext7Server");async function q(t=C()){try{let e=await k.readFile(t,"utf-8");return/^\s*\[mcp_servers\.context7\]/m.test(e)}catch{return!1}}o(q,"codexHasContext7Server");te();V();function Q(){return process.env.NODE_ENV==="test"?a.join(j.tmpdir(),"prjct-context7-test","verify-cache.json"):a.join(N(),"state","context7-verify.json")}o(Q,"getVerifyCachePath");async function ge(){try{let t=await d.readFile(Q(),"utf-8"),e=JSON.parse(t);if(typeof e?.at=="number"&&e.status)return{...e,provider:e.provider??"claude"}}catch{}return null}o(ge,"readPersistedVerify");async function he(t,e,n){let r=Q();try{await d.mkdir(a.dirname(r),{recursive:!0}),await d.writeFile(r,JSON.stringify({at:t,provider:e,status:n}),"utf-8")}catch{}}o(he,"writePersistedVerify");var Z=h.context7,l={value:null},ve=[a.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],Ce=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];async function G(t){try{return(await d.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}o(G,"listChildDirs");async function xe(t){let e=[],n=process.env.NVM_DIR||a.join(t,".nvm"),r=a.join(n,"versions","node");for(let c of await G(r))e.push(a.join(r,c,"bin"));let i=process.env.FNM_DIR||a.join(t,".local","share","fnm"),s=a.join(i,"node-versions");for(let c of await G(s))e.push(a.join(s,c,"installation","bin"));return e}o(xe,"discoverNodeManagerBinDirs");async function Pe(t=process.env.PATH||"",e=j.homedir()){let n=new Set,r=[],i=Ce.map(c=>a.join(e,...c)),s=[...ve,...i,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[a.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[a.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[a.join(process.env.MISE_DATA_DIR,"shims")]:[],...await xe(e)];for(let c of[...t.split(a.delimiter),...s]){let u=c.trim();!u||n.has(u)||(n.add(u),r.push(u))}return r.join(a.delimiter)}o(Pe,"buildContext7SmokePath");async function Se(t,e){if(a.isAbsolute(t)||t.includes(a.sep))return t;let n=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split(a.delimiter))if(r)for(let i of n){let s=a.join(r,t+i);try{return await d.access(s,de.X_OK),s}catch{}}return t}o(Se,"resolveExecutable");function Y(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?a.join(j.tmpdir(),"prjct-context7-test","mcp.json"):a.join(j.homedir(),".claude","mcp.json")}o(Y,"getConfigPath");async function z(t){try{let e=await d.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(D(e))return{};throw e}}o(z,"readConfig");async function je(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=Z,e=[...t.args||[],"--help"],n=await Pe(),r=await Se(t.command||"npx",n);await A(r,e,{timeout:15e3,env:{...process.env,PATH:n}})}o(je,"runSmokeCheck");var R=class{static{o(this,"Context7Service")}async install(e="claude"){if(e==="codex")return this.installCodex();if(e!=="claude")return{installed:!1,verified:!1,configPath:"",message:`Context7 auto-config not supported for ${e}; skipping`};let n=Y(),r=a.dirname(n);await d.mkdir(r,{recursive:!0});let i=await z(n),s=i.mcpServers||{},c=Z,u=s.context7;return u&&JSON.stringify(u)===JSON.stringify(c)?{installed:!0,verified:!1,configPath:n,message:"Context7 MCP already configured"}:(s.context7=c,i.mcpServers=s,await P(n,i),l.value=null,{installed:!0,verified:!1,configPath:n,message:"Context7 MCP configured"})}async installCodex(){let e=await U();return e.changed&&(l.value=null),{installed:!0,verified:!1,configPath:e.path,message:e.skipped==="user-managed"?"Context7 MCP user-managed in config.toml":"Context7 MCP configured in config.toml"}}async resolveConfigured(e){if(e==="codex"){let c=C();return await q(c)?{ok:!0,configPath:c}:{ok:!1,configPath:c,message:"Context7 MCP not configured in ~/.codex/config.toml"}}if(e!=="claude")return{ok:!1,configPath:"",message:`Context7 not managed for ${e}`};let n=Y(),s=((await z(n)).mcpServers||{}).context7;return!s?.command||!Array.isArray(s.args)||s.args.length===0?{ok:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"}:{ok:!0,configPath:n}}async verify(e="claude"){let n=Date.now();if(l.value&&l.value.provider===e&&n-l.value.at<864e5)return l.value.status;let r=await ge();if(r?.status.verified&&r.provider===e&&n-r.at<864e5)return l.value=r,r.status;let i=await this.resolveConfigured(e);if(!i.ok)return{installed:!1,verified:!1,configPath:i.configPath,message:i.message};try{await je();let s={installed:!0,verified:!0,configPath:i.configPath};return l.value={at:n,provider:e,status:s},await he(n,e,s),s}catch(s){let c={installed:!0,verified:!1,configPath:i.configPath,message:`Context7 smoke check failed: ${g(s)}`};return l.value={at:n,provider:e,status:c},c}}async ensureReady(e="claude"){await this.install(e);let n=await this.verify(e);if(!n.verified){let r=n.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return n}},ye=new R,et=ye;export{h as a,S as b,Oe as c,Ne as d,Je as e,U as f,Q as g,Pe as h,et as i};
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createRequire as __createRequire } from 'module';
3
- import { fileURLToPath as __fileURLToPath } from 'url';
4
- import { dirname as __pathDirname } from 'path';
5
- const require = __createRequire(import.meta.url);
6
- const __filename = __fileURLToPath(import.meta.url);
7
- const __dirname = __pathDirname(__filename);
8
- import{d as m,g as b}from"./chunk-TKXOMN4K.mjs";import{b as f,h as P}from"./chunk-A6K4H3YT.mjs";import{a as c}from"./chunk-E66B27AL.mjs";P();b();function C(t,e,n){let s=t.prepare("INSERT INTO analysis_finding (id, analysis_id, kind, title, detail, severity, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?)"),o=[],i=c((a,u,p,L)=>{if(!u)return;let k=o.length,S=`${e}-f${k}`;s.run(S,e,a,u,p,L,k),o.push(S)},"addFinding");for(let a of n.patterns??[])i("pattern",a.name,a.description,null);for(let a of n.antiPatterns??[])i("anti_pattern",a.issue,a.suggestion,a.severity);for(let a of n.techDebt??[])i("tech_debt",a.description,`${a.area}: ${a.impact}`,a.priority);for(let a of n.riskAreas??[])i("risk_area",a.path,`${a.reason} \u2014 ${a.risk}`,a.severity);for(let a of n.refactorSuggestions??[])i("refactor",a.description,a.benefit,null);let l=new Set;for(let a of[...n.projectInsights??[],...n.architecture?.insights??[]]){let u=a.toLowerCase();l.has(u)||(l.add(u),i("insight",a,null,null))}let g=t.prepare("INSERT INTO analysis_convention (id, analysis_id, rule, sort_order) VALUES (?, ?, ?, ?)");(n.conventions??[]).forEach((a,u)=>{g.run(`${e}-c${u}`,e,a.rule,u)});let r=t.prepare("INSERT INTO analysis_stack_item (id, analysis_id, kind, name) VALUES (?, ?, ?, ?)");[...(n.stack?.languages??[]).map(a=>({kind:"language",name:a})),...(n.stack?.frameworks??[]).map(a=>({kind:"framework",name:a}))].forEach((a,u)=>{r.run(`${e}-s${u}`,e,a.kind,a.name)});let v=t.prepare("INSERT INTO analysis_command (id, analysis_id, name, command, purpose) VALUES (?, ?, ?, ?, ?)");Object.entries(n.commands??{}).filter(a=>!!a[1]).forEach(([a,u],p)=>{v.run(`${e}-cmd${p}`,e,a,u,null)});let j=t.prepare("INSERT INTO analysis_domain (id, analysis_id, name, paths) VALUES (?, ?, ?, ?)");(n.architecture?.domains??[]).forEach((a,u)=>{j.run(`${e}-d${u}`,e,a,null)})}c(C,"writeAnalysisChildren");var h=class{static{c(this,"LLMAnalysisStorage")}save(e,n){let s=m.getDb(e),o=f();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(o);let i=s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(n.commitHash??null,"active",JSON.stringify(n),n.analyzedAt);C(s,String(i.lastInsertRowid),n)})()}getActiveRelational(e){let n=m.get(e,"SELECT id FROM llm_analysis WHERE status = 'active' LIMIT 1");if(!n)return null;let s=String(n.id),o=m.query(e,"SELECT kind, title, detail FROM analysis_finding WHERE analysis_id = ? ORDER BY kind, sort_order",s),i=m.query(e,"SELECT rule FROM analysis_convention WHERE analysis_id = ? ORDER BY sort_order",s).map(d=>d.rule),l=m.query(e,"SELECT kind, name FROM analysis_stack_item WHERE analysis_id = ?",s),g=m.query(e,"SELECT name FROM analysis_domain WHERE analysis_id = ?",s).map(d=>d.name),r=m.query(e,"SELECT name, command FROM analysis_command WHERE analysis_id = ?",s);return o.length===0&&i.length===0&&l.length===0?null:{findings:o,conventions:i,stack:l,domains:g,commands:r}}getActive(e){let n=m.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return n?JSON.parse(n.analysis):null}getActiveSummary(e){let n=this.getActive(e);return n?{commitHash:n.commitHash,architectureStyle:n.architecture.style,patternCount:n.patterns.length,antiPatternCount:n.antiPatterns.length,analyzedAt:n.analyzedAt}:null}isCurrent(e,n){return n?m.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===n:!1}getAllFull(e){return m.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(s=>({id:s.id,status:s.status,commitHash:s.commit_hash,analyzedAt:s.analyzed_at,supersededAt:s.superseded_at,analysis:JSON.parse(s.analysis)}))}getHistory(e,n=10){return m.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",n).map(o=>{let i=JSON.parse(o.analysis);return{id:o.id,commitHash:o.commit_hash,status:o.status,analyzedAt:o.analyzed_at,patternCount:i.patterns.length}})}},R=new h,q=R;P();var M=["zod","better-sqlite3","@modelcontextprotocol/sdk","@modelcontextprotocol/client","@modelcontextprotocol/server","chalk","chokidar","commander","express","fastify","hono","react","next","vue","vitest","jest","typescript","biome","lefthook","drizzle-orm","prisma","@prisma/client"];function y(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"item"}c(y,"stableStyleKey");function _(t){return t?!!(t.architecture?.style&&t.architecture.style!=="unknown"||(t.patterns?.length??0)>0||(t.conventions?.length??0)>0||(t.antiPatterns?.length??0)>0||(t.stack?.frameworks?.length??0)>0||(t.stack?.languages?.length??0)>0):!1}c(_,"isRichLlmAnalysis");function J(t){return!_(t)}c(J,"isThinLlmAnalysis");function $(t){let e=w(t),n=x(t.commands),s=_(t.llmAnalysis)?t.llmAnalysis:null,o=D(s?.conventions?.map(r=>({key:y(r.category?`${r.category}-${r.rule}`:r.rule),rule:r.rule,category:r.category}))??[],t.memoryConventions?.map(r=>({key:y(r.category?`${r.category}-${r.rule}`:r.rule),rule:r.rule,category:r.category}))??[]),i=N(s?.patterns?.map(r=>({key:y(r.name),name:r.name,description:r.description,locations:r.locations,category:r.category}))??[],t.memoryPatterns?.map(r=>({key:y(r.name),name:r.name,description:r.description}))??[]),l=H(s?.antiPatterns?.map(r=>({key:y(r.issue),issue:r.issue,suggestion:r.suggestion,severity:r.severity}))??[],t.memoryAntiPatterns?.map(r=>({key:y(r.issue),issue:r.issue,suggestion:r.suggestion}))??[]);if(s?.stack?.languages?.length)for(let r of s.stack.languages)e.languages.includes(r)||e.languages.push(r);if(s?.stack?.frameworks?.length)for(let r of s.stack.frameworks)e.frameworks.includes(r)||e.frameworks.push(r);s?.stack?.packageManager&&!e.packageManager&&(e.packageManager=s.stack.packageManager);let g={symbols:t.structural?.symbols??0,files:t.structural?.files??t.stats.fileCount??0,packages:t.structural?.packages??[]};return{payloadVersion:1,stack:e,commands:n,conventions:o,patterns:i,antiPatterns:l,structural:g,metrics:{...t.metrics??{}}}}c($,"buildProjectStylePayload");function U(t){let e=$(t),n=t.capturedAt??f();return{id:t.id??`style_${n.replace(/[^0-9]/g,"").slice(0,14)}_${Math.random().toString(36).slice(2,8)}`,capturedAt:n,commitHash:t.commitHash??null,source:t.source??"sync-mechanical",patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,conventionCount:e.conventions.length,frameworkCount:e.stack.frameworks.length,symbolCount:e.structural.symbols,fileCount:e.structural.files,summary:T(e),payload:e}}c(U,"buildProjectStyleSnapshot");function T(t){let e=[t.stack.ecosystem!=="unknown"?t.stack.ecosystem:null,t.stack.languages.slice(0,2).join("+")||null,t.stack.frameworks.slice(0,3).join(", ")||null].filter(Boolean);return`${e.length>0?e.join(" \xB7 "):"stack unknown"}; ${t.patterns.length} patterns, ${t.antiPatterns.length} anti-patterns, ${t.conventions.length} conventions; ${t.structural.files} files`+(t.structural.symbols>0?`, ${t.structural.symbols} symbols`:"")}c(T,"buildStyleSummary");function w(t){let e=A([...t.stack.frameworks??[],...t.stats.frameworks??[]]),n=A([...t.stats.languages??[]]),s=O(t.packageDeps??{}),o=t.packageDeps??{};for(let l of s)["Hono","Express","Fastify","React","Next.js","Vue","NestJS"].includes(l)&&!e.includes(l)&&e.push(l);let i=t.stack.hasTesting===!0||!!(o.vitest||o.jest||o.mocha||o["bun-types"]||o["@types/bun"]||s.includes("Vitest")||s.includes("Jest"))||!!(t.commands?.test&&/test/i.test(t.commands.test));return{ecosystem:t.stats.ecosystem||"unknown",languages:n,frameworks:e,packageManager:t.packageManager??void 0,keyLibraries:s,hasTests:i,hasDocker:t.stack.hasDocker===!0}}c(w,"buildStack");function x(t){return t?{test:t.test,lint:t.lint,build:t.build,dev:t.dev,install:t.install,format:t.format}:{}}c(x,"buildCommands");function O(t){let e=new Set;for(let n of M)t[n]&&e.add(z(n));return[...e].slice(0,16)}c(O,"collectKeyLibraries");function z(t){return{hono:"Hono",express:"Express",fastify:"Fastify",react:"React",next:"Next.js",vue:"Vue",vitest:"Vitest",jest:"Jest",typescript:"TypeScript",zod:"Zod","better-sqlite3":"better-sqlite3","@modelcontextprotocol/sdk":"MCP SDK","@modelcontextprotocol/client":"MCP SDK","@modelcontextprotocol/server":"MCP SDK",biome:"Biome",lefthook:"Lefthook","drizzle-orm":"Drizzle",prisma:"Prisma","@prisma/client":"Prisma"}[t]??t}c(z,"displayLibName");function D(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(D,"mergeConventions");function N(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(N,"mergePatterns");function H(t,e){let n=new Map;for(let s of[...t,...e])n.has(s.key)||n.set(s.key,s);return[...n.values()].slice(0,40)}c(H,"mergeAntiPatterns");function A(t){let e=[],n=new Set;for(let s of t){let o=s.trim();if(!o)continue;let i=o.toLowerCase();n.has(i)||(n.add(i),e.push(o))}return e}c(A,"unique");function K(t,e={}){if(!t)return null;let n=e.maxConventions??5,s=e.maxPatterns??4,o=e.maxAnti??3,i=t.payload,l=["## How this repo works (project style)",""],g=[i.stack.ecosystem!=="unknown"?i.stack.ecosystem:null,i.stack.languages.join(", ")||null,i.stack.frameworks.join(", ")||null,i.stack.keyLibraries.slice(0,6).join(", ")||null].filter(Boolean);if(g.length>0&&l.push(`**Stack:** ${g.join(" \xB7 ")}`),i.conventions.length>0){l.push("","**Conventions (match):**");for(let r of i.conventions.slice(0,n))l.push(`- ${r.rule}`)}if(i.patterns.length>0){l.push("","**Patterns (match):**");for(let r of i.patterns.slice(0,s))l.push(`- **${r.name}** \u2014 ${E(r.description,120)}`)}if(i.antiPatterns.length>0){l.push("","**Anti-patterns (avoid):**");for(let r of i.antiPatterns.slice(0,o))l.push(`- ${r.issue}${r.suggestion?` \u2192 ${E(r.suggestion,80)}`:""}`)}return i.conventions.length===0&&i.patterns.length===0&&i.antiPatterns.length===0&&l.push("","_No durable house patterns yet \u2014 open a neighbor file and match local idiom. Prefer `prjct sync` + structured analysis-save-llm JSON to enrich._"),l.push("",`_${t.summary}_`),l.join(`
9
- `)}c(K,"formatProjectStyleDigest");function E(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}c(E,"truncate");export{q as a,_ as b,J as c,U as d,K as e};