prjct-cli 3.94.0 → 3.95.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 (175) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +27 -21
  3. package/dist/bin/hook-chunks/{agent-switch-2U2LOBGR.mjs → agent-switch-4ZJJWKMD.mjs} +1 -1
  4. package/dist/bin/hook-chunks/{analysis-N4NYGIG3.mjs → analysis-UGHAG2SK.mjs} +3 -3
  5. package/dist/bin/hook-chunks/{auth-config-SP4PBALR.mjs → auth-config-JIITQ6GY.mjs} +1 -1
  6. package/dist/bin/hook-chunks/{auto-flush-BN6L6QHO.mjs → auto-flush-CXWTU3RF.mjs} +1 -1
  7. package/dist/bin/hook-chunks/{capture-gate-FRF2G3IG.mjs → capture-gate-PS6QUXLX.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{chunk-7GNWHWOO.mjs → chunk-22AXWLI6.mjs} +1 -1
  9. package/dist/bin/hook-chunks/chunk-32RX4YGI.mjs +9 -0
  10. package/dist/bin/hook-chunks/{chunk-OENWCYLF.mjs → chunk-3WQBTXUC.mjs} +1 -1
  11. package/dist/bin/hook-chunks/{chunk-QPRNRLG6.mjs → chunk-4HAKTI36.mjs} +1 -1
  12. package/dist/bin/hook-chunks/{chunk-4SKJWNKE.mjs → chunk-4KXXDQYI.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-S7HQQILD.mjs → chunk-4NTVXJD7.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-Y4DUB7UN.mjs → chunk-5H3KJWQS.mjs} +2 -2
  15. package/dist/bin/hook-chunks/{chunk-INXNK57E.mjs → chunk-5XA5RL5I.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-NBKEOLDH.mjs → chunk-6GAFRIUQ.mjs} +5 -5
  17. package/dist/bin/hook-chunks/{chunk-Q3Z53QTH.mjs → chunk-76GDLA3Z.mjs} +1 -1
  18. package/dist/bin/hook-chunks/chunk-A6K4H3YT.mjs +9 -0
  19. package/dist/bin/hook-chunks/{chunk-6RLCUGGG.mjs → chunk-ABJNOG2I.mjs} +1 -1
  20. package/dist/bin/hook-chunks/{chunk-EHEQOF6Z.mjs → chunk-B36LC2JR.mjs} +1 -1
  21. package/dist/bin/hook-chunks/{chunk-NCOOKPXX.mjs → chunk-BDOAQVIF.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-PUHX3ECX.mjs → chunk-BOBFTVAY.mjs} +1 -1
  23. package/dist/bin/hook-chunks/{chunk-AZYQFRPJ.mjs → chunk-BU22R6JX.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-NHIWYDQD.mjs → chunk-BX7VKYA7.mjs} +1 -1
  25. package/dist/bin/hook-chunks/{chunk-7JEKBJAP.mjs → chunk-C4O243NG.mjs} +1 -1
  26. package/dist/bin/hook-chunks/{chunk-V2BSS7HW.mjs → chunk-CYZ7ST2P.mjs} +5 -5
  27. package/dist/bin/hook-chunks/{chunk-JMCMTX6U.mjs → chunk-DCSKTMDX.mjs} +1 -1
  28. package/dist/bin/hook-chunks/{chunk-J6TAD3OZ.mjs → chunk-DVDZA63F.mjs} +1 -1
  29. package/dist/bin/hook-chunks/{chunk-D6IONKRA.mjs → chunk-EWOK4VE7.mjs} +1 -1
  30. package/dist/bin/hook-chunks/{chunk-EQ5KNMLG.mjs → chunk-FW4MEPTB.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-2HB2JHQE.mjs → chunk-FXFG6PV6.mjs} +4 -4
  32. package/dist/bin/hook-chunks/chunk-G7QQZMAO.mjs +9 -0
  33. package/dist/bin/hook-chunks/{chunk-EMTCZG5I.mjs → chunk-GCDLPKOH.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-X2AGNDGD.mjs → chunk-GDECEHO5.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-JUZ5LNDI.mjs → chunk-GDESYWTD.mjs} +2 -2
  36. package/dist/bin/hook-chunks/chunk-GLPKMG5A.mjs +18 -0
  37. package/dist/bin/hook-chunks/chunk-GPZP7NXL.mjs +11 -0
  38. package/dist/bin/hook-chunks/{chunk-SDUS2AT7.mjs → chunk-HEDZA6KC.mjs} +1 -1
  39. package/dist/bin/hook-chunks/{chunk-5EQLQ7GF.mjs → chunk-I26F7TLM.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{chunk-HHIGNKDO.mjs → chunk-IGHY4FGS.mjs} +1 -1
  41. package/dist/bin/hook-chunks/{chunk-QYEASMFV.mjs → chunk-IWJG7CZX.mjs} +1 -1
  42. package/dist/bin/hook-chunks/{chunk-7O6OMD4X.mjs → chunk-J5UQVJUW.mjs} +1 -1
  43. package/dist/bin/hook-chunks/chunk-J5UVRZ44.mjs +15 -0
  44. package/dist/bin/hook-chunks/{chunk-GFY4GY3Z.mjs → chunk-KHLYWNHT.mjs} +1 -1
  45. package/dist/bin/hook-chunks/{chunk-C3W2HLJT.mjs → chunk-KSSRINDX.mjs} +1 -1
  46. package/dist/bin/hook-chunks/{chunk-4O4D6DV7.mjs → chunk-MHNWIB7B.mjs} +2 -2
  47. package/dist/bin/hook-chunks/{chunk-3VWBNLBC.mjs → chunk-N3L77UNM.mjs} +1 -1
  48. package/dist/bin/hook-chunks/{chunk-IHECXD2M.mjs → chunk-NLKPAJND.mjs} +1 -1
  49. package/dist/bin/hook-chunks/{chunk-OIU4Y5WL.mjs → chunk-OC4CYF7V.mjs} +1 -1
  50. package/dist/bin/hook-chunks/{chunk-Q3EYM4GJ.mjs → chunk-OGIFB3OE.mjs} +2 -2
  51. package/dist/bin/hook-chunks/{chunk-AVRNHROK.mjs → chunk-OUAVSD47.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{chunk-Y3J7UUMR.mjs → chunk-PGWFGRX4.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{chunk-AZHE4VOM.mjs → chunk-PO3QDKTE.mjs} +1 -1
  54. package/dist/bin/hook-chunks/{chunk-ZMKTR2IO.mjs → chunk-PP6DANGV.mjs} +1 -1
  55. package/dist/bin/hook-chunks/{chunk-MHQTGU45.mjs → chunk-PTA7DMLM.mjs} +1 -1
  56. package/dist/bin/hook-chunks/{chunk-HRWXMF7P.mjs → chunk-QBYHZX33.mjs} +1 -1
  57. package/dist/bin/hook-chunks/{chunk-HNEKXKOI.mjs → chunk-QL3NYJTW.mjs} +1 -1
  58. package/dist/bin/hook-chunks/{chunk-UA4Z5TGG.mjs → chunk-QP5USCDX.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{chunk-JPSJWCFD.mjs → chunk-RHKF7EJW.mjs} +1 -1
  60. package/dist/bin/hook-chunks/{chunk-66GE3IHX.mjs → chunk-ROA2AJXY.mjs} +1 -1
  61. package/dist/bin/hook-chunks/{chunk-TG5CQJD5.mjs → chunk-RTEEXGEA.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{chunk-YUKGWWL7.mjs → chunk-S5ISOGDB.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{chunk-TKWAFYF7.mjs → chunk-S5N2ZZDL.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{chunk-F4T7IAA7.mjs → chunk-S6L3FECF.mjs} +1 -1
  65. package/dist/bin/hook-chunks/{chunk-JCYXFHQZ.mjs → chunk-T6ELTQZM.mjs} +1 -1
  66. package/dist/bin/hook-chunks/{chunk-NWZEBCTC.mjs → chunk-TXSLON7M.mjs} +2 -2
  67. package/dist/bin/hook-chunks/{chunk-IKIB42F7.mjs → chunk-U4OON3S7.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{chunk-KG7Z6OMK.mjs → chunk-UHVYBU7F.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{chunk-NWIQNII6.mjs → chunk-UYQC63MC.mjs} +1 -1
  70. package/dist/bin/hook-chunks/{chunk-27XFSCOE.mjs → chunk-V2FR2NPL.mjs} +2 -2
  71. package/dist/bin/hook-chunks/{chunk-XE4MJNBQ.mjs → chunk-WGWE3CSC.mjs} +1 -1
  72. package/dist/bin/hook-chunks/{chunk-MI3JEFON.mjs → chunk-X5W2UYQK.mjs} +2 -2
  73. package/dist/bin/hook-chunks/{chunk-TYEAIX3X.mjs → chunk-XDBJSJOT.mjs} +1 -1
  74. package/dist/bin/hook-chunks/{chunk-6UH244CC.mjs → chunk-XXRAQZNC.mjs} +1 -1
  75. package/dist/bin/hook-chunks/{chunk-OZJ6UKKP.mjs → chunk-YDBZO6I3.mjs} +1 -1
  76. package/dist/bin/hook-chunks/chunk-Z4X7JIAP.mjs +11 -0
  77. package/dist/bin/hook-chunks/{chunk-FX6VHIKB.mjs → chunk-Z6KVLCMK.mjs} +1 -1
  78. package/dist/bin/hook-chunks/{chunk-KOCROTRM.mjs → chunk-ZFLIVOFX.mjs} +1 -1
  79. package/dist/bin/hook-chunks/{chunk-T2FCU3ZS.mjs → chunk-ZOX6OV6X.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{client-ERZ5CM3D.mjs → client-CRXA774S.mjs} +3 -3
  81. package/dist/bin/hook-chunks/{code-graph-cloud-4GRWQSUK.mjs → code-graph-cloud-GTSLO7CD.mjs} +1 -1
  82. package/dist/bin/hook-chunks/{codex-skill-6DYQMPDJ.mjs → codex-skill-NUBNPSMF.mjs} +1 -1
  83. package/dist/bin/hook-chunks/{command-installer-MF4KUM3X.mjs → command-installer-UHSXC3UG.mjs} +1 -1
  84. package/dist/bin/hook-chunks/{config-manager-2VZPHUDG.mjs → config-manager-DX5OOPW5.mjs} +1 -1
  85. package/dist/bin/hook-chunks/{context7-service-V7CIDF3Q.mjs → context7-service-GDJ3QICX.mjs} +1 -1
  86. package/dist/bin/hook-chunks/{custom-workflow-storage-UOBQXY42.mjs → custom-workflow-storage-FD47DPA3.mjs} +1 -1
  87. package/dist/bin/hook-chunks/cwd-changed-EP3UIRK6.mjs +8 -0
  88. package/dist/bin/hook-chunks/{database-XYKQF3KR.mjs → database-ZUC7OEZG.mjs} +1 -1
  89. package/dist/bin/hook-chunks/{detect-changes-DFRJOOB3.mjs → detect-changes-OJUBWWTU.mjs} +1 -1
  90. package/dist/bin/hook-chunks/{developer-evolution-SLC34HUU.mjs → developer-evolution-WNSTHDAA.mjs} +1 -1
  91. package/dist/bin/hook-chunks/{distill-U2LJGUG3.mjs → distill-GOGPFQFK.mjs} +1 -1
  92. package/dist/bin/hook-chunks/{editors-config-6XFYIOE6.mjs → editors-config-2CACBNS4.mjs} +1 -1
  93. package/dist/bin/hook-chunks/{enriched-recall-X6RDNNIE.mjs → enriched-recall-QF22RIK7.mjs} +1 -1
  94. package/dist/bin/hook-chunks/{format-ALUX4QSI.mjs → format-J3X3R225.mjs} +1 -1
  95. package/dist/bin/hook-chunks/{judgment-ledger-storage-SCGU3URM.mjs → judgment-ledger-storage-FE4HXTHM.mjs} +1 -1
  96. package/dist/bin/hook-chunks/{judgment-orchestrator-BYPG65RS.mjs → judgment-orchestrator-YDJTKNV2.mjs} +1 -1
  97. package/dist/bin/hook-chunks/{judgment-receipt-GWSSCLAB.mjs → judgment-receipt-7A2DXVJA.mjs} +1 -1
  98. package/dist/bin/hook-chunks/{land-cue-MMISX2BI.mjs → land-cue-SZWJH6XP.mjs} +1 -1
  99. package/dist/bin/hook-chunks/{land-synthesis-WG5JAS7B.mjs → land-synthesis-JLYUBKHR.mjs} +1 -1
  100. package/dist/bin/hook-chunks/{legacy-crew-sweep-2WSO5KEB.mjs → legacy-crew-sweep-JXYO62UE.mjs} +2 -2
  101. package/dist/bin/hook-chunks/{memory-index-QK5QJOFJ.mjs → memory-index-CIYDXN2G.mjs} +1 -1
  102. package/dist/bin/hook-chunks/{notification-MPVWVV52.mjs → notification-UA7RTVHG.mjs} +1 -1
  103. package/dist/bin/hook-chunks/{pack-integrity-XRYOROK5.mjs → pack-integrity-GZC5NGFN.mjs} +1 -1
  104. package/dist/bin/hook-chunks/{pack-manager-WWGQNJDQ.mjs → pack-manager-AF5F7PRT.mjs} +1 -1
  105. package/dist/bin/hook-chunks/{path-manager-ZR5RAKTK.mjs → path-manager-375HH6TB.mjs} +1 -1
  106. package/dist/bin/hook-chunks/{planning-S55KBPN2.mjs → planning-M3RAOZVB.mjs} +2 -2
  107. package/dist/bin/hook-chunks/{post-edit-QMHSZHDN.mjs → post-edit-QRDYPZLZ.mjs} +1 -1
  108. package/dist/bin/hook-chunks/{pre-bash-RAM6L3G4.mjs → pre-bash-TWWFVNQ7.mjs} +1 -1
  109. package/dist/bin/hook-chunks/{pre-commit-736ZLMDL.mjs → pre-commit-PTFF7JIN.mjs} +1 -1
  110. package/dist/bin/hook-chunks/{pre-edit-GZ4QJ2MU.mjs → pre-edit-PMMWDR2B.mjs} +1 -1
  111. package/dist/bin/hook-chunks/{pre-package-LCIAWWGK.mjs → pre-package-325ALZKD.mjs} +1 -1
  112. package/dist/bin/hook-chunks/{pre-search-J5EOFMYN.mjs → pre-search-GOHVFAFH.mjs} +1 -1
  113. package/dist/bin/hook-chunks/{pre-secrets-TSUMTXHH.mjs → pre-secrets-MYNM5KI4.mjs} +1 -1
  114. package/dist/bin/hook-chunks/{prjct-md-T2DG236Y.mjs → prjct-md-RCB6FWD6.mjs} +1 -1
  115. package/dist/bin/hook-chunks/{project-agent-surfaces-VRY22I66.mjs → project-agent-surfaces-V4P5RTUR.mjs} +1 -1
  116. package/dist/bin/hook-chunks/{project-file-inventory-5DEN5VLF.mjs → project-file-inventory-OKIP4LBO.mjs} +1 -1
  117. package/dist/bin/hook-chunks/{project-memory-KKEMTEMP.mjs → project-memory-JK2MXRJB.mjs} +1 -1
  118. package/dist/bin/hook-chunks/{project-style-evolution-7MAUSED2.mjs → project-style-evolution-RPGATIYJ.mjs} +1 -1
  119. package/dist/bin/hook-chunks/prompt-DOENKHLQ.mjs +24 -0
  120. package/dist/bin/hook-chunks/{publish-helper-G54XQV5K.mjs → publish-helper-SX7HEV2L.mjs} +1 -1
  121. package/dist/bin/hook-chunks/{purge-MC5LFSAO.mjs → purge-XKHUAB4H.mjs} +1 -1
  122. package/dist/bin/hook-chunks/{retention-LWETHQX3.mjs → retention-C3NQT65W.mjs} +1 -1
  123. package/dist/bin/hook-chunks/{sdd-5UCVX43H.mjs → sdd-6PF7MBAY.mjs} +1 -1
  124. package/dist/bin/hook-chunks/{session-continuity-RKNAJJHR.mjs → session-continuity-UEXQDGZE.mjs} +1 -1
  125. package/dist/bin/hook-chunks/session-start-B4P7L33E.mjs +8 -0
  126. package/dist/bin/hook-chunks/{setup-WQRJ6TQL.mjs → setup-ZOHG6MGF.mjs} +3 -3
  127. package/dist/bin/hook-chunks/{shipping-5D5LTJ3P.mjs → shipping-QVGTOO6U.mjs} +4 -4
  128. package/dist/bin/hook-chunks/{skill-index-RAVJMC4P.mjs → skill-index-FGDQVYHM.mjs} +1 -1
  129. package/dist/bin/hook-chunks/{spec-context-inference-7DDSTRTV.mjs → spec-context-inference-6Z52BT37.mjs} +1 -1
  130. package/dist/bin/hook-chunks/{spec-service-LAO5Z2M5.mjs → spec-service-UAQ5AEXQ.mjs} +2 -2
  131. package/dist/bin/hook-chunks/{spec-task-breakdown-K3GMQKGH.mjs → spec-task-breakdown-LAXGVLMY.mjs} +1 -1
  132. package/dist/bin/hook-chunks/{state-storage-EIFGUO7X.mjs → state-storage-XU35ZYNA.mjs} +1 -1
  133. package/dist/bin/hook-chunks/stop-CFB2H3XC.mjs +16 -0
  134. package/dist/bin/hook-chunks/subagent-start-KFAZZUHS.mjs +8 -0
  135. package/dist/bin/hook-chunks/{subagent-stop-RBD2OILE.mjs → subagent-stop-OUG4PR7S.mjs} +1 -1
  136. package/dist/bin/hook-chunks/{surface-attribution-K37N2NK7.mjs → surface-attribution-A6GCGRFM.mjs} +1 -1
  137. package/dist/bin/hook-chunks/{symbol-graph-BKQIMFRG.mjs → symbol-graph-DMPBNBX7.mjs} +1 -1
  138. package/dist/bin/hook-chunks/{sync-client-EGBMWF3J.mjs → sync-client-PIRHMHXL.mjs} +1 -1
  139. package/dist/bin/hook-chunks/{sync-cursor-storage-E3LMZISA.mjs → sync-cursor-storage-VVLA3L2U.mjs} +1 -1
  140. package/dist/bin/hook-chunks/{task-orchestration-2ZYE5M6J.mjs → task-orchestration-HFZYWYLR.mjs} +1 -1
  141. package/dist/bin/hook-chunks/{task-overview-ITY5OSHX.mjs → task-overview-PCUZWL5Q.mjs} +1 -1
  142. package/dist/bin/hook-chunks/task-service-PXCDU55T.mjs +8 -0
  143. package/dist/bin/hook-chunks/{tdd-7S55S5C3.mjs → tdd-QZL4OSM7.mjs} +1 -1
  144. package/dist/bin/hook-chunks/{template-loader-SCM4C2A3.mjs → template-loader-SKXILJLJ.mjs} +1 -1
  145. package/dist/bin/hook-chunks/{transcript-jsonl-6X4DDD6R.mjs → transcript-jsonl-7W2NOJPZ.mjs} +1 -1
  146. package/dist/bin/hook-chunks/{usefulness-SCH5ARGV.mjs → usefulness-SZLG6LVC.mjs} +1 -1
  147. package/dist/bin/hook-chunks/{vault-retire-notice-HT756AND.mjs → vault-retire-notice-HOXPURNQ.mjs} +1 -1
  148. package/dist/bin/hook-chunks/{velocity-storage-47CF3XWZ.mjs → velocity-storage-5J6BAMCW.mjs} +1 -1
  149. package/dist/bin/hook-chunks/{weak-model-mode-FLCEQ2BV.mjs → weak-model-mode-ZRNKFTFF.mjs} +1 -1
  150. package/dist/bin/hook-chunks/{work-graph-JQHVVXIZ.mjs → work-graph-PGYHFLEL.mjs} +1 -1
  151. package/dist/bin/hook-chunks/work-scope-FIB6LBKE.mjs +8 -0
  152. package/dist/bin/hook-chunks/{workspace-occupancy-UUW4UGGB.mjs → workspace-occupancy-3D4OKQRB.mjs} +1 -1
  153. package/dist/bin/hook-fast-darwin-arm64 +0 -0
  154. package/dist/bin/hook-fast-darwin-x64 +0 -0
  155. package/dist/bin/hook-fast-linux-x64 +0 -0
  156. package/dist/bin/prjct-core.mjs +681 -668
  157. package/dist/bin/prjct-hooks.mjs +1 -1
  158. package/dist/bin/prjct.mjs +1 -1
  159. package/dist/daemon/entry.mjs +595 -582
  160. package/dist/mcp/server.mjs +232 -232
  161. package/package.json +1 -1
  162. package/dist/bin/hook-chunks/chunk-DRGI5UHQ.mjs +0 -10
  163. package/dist/bin/hook-chunks/chunk-JAMSIKDE.mjs +0 -9
  164. package/dist/bin/hook-chunks/chunk-NUJASVHN.mjs +0 -18
  165. package/dist/bin/hook-chunks/chunk-PW3KYKVS.mjs +0 -9
  166. package/dist/bin/hook-chunks/chunk-TFCLMTJ5.mjs +0 -9
  167. package/dist/bin/hook-chunks/chunk-VWOIUTAX.mjs +0 -15
  168. package/dist/bin/hook-chunks/chunk-ZJXH76Q5.mjs +0 -11
  169. package/dist/bin/hook-chunks/cwd-changed-J6O46KS7.mjs +0 -8
  170. package/dist/bin/hook-chunks/prompt-DVF6V2X2.mjs +0 -22
  171. package/dist/bin/hook-chunks/session-start-MFMFKUPK.mjs +0 -8
  172. package/dist/bin/hook-chunks/stop-RYLI4FGF.mjs +0 -16
  173. package/dist/bin/hook-chunks/subagent-start-CCUPSANT.mjs +0 -8
  174. package/dist/bin/hook-chunks/task-service-XREJLWEF.mjs +0 -8
  175. package/dist/bin/hook-chunks/work-scope-CDLSZ4U5.mjs +0 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "3.94.0",
3
+ "version": "3.95.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": {
@@ -1,10 +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{a}from"./chunk-GAOQHD5S.mjs";import{a as r}from"./chunk-E66B27AL.mjs";import{readSync as c}from"node:fs";import{isatty as d}from"node:tty";var p=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);function T(e,t){return{hookSpecificOutput:{hookEventName:e,permissionDecision:"deny",permissionDecisionReason:u(t)}}}r(T,"buildDenyOutput");function f(){let e=(process.env.PRJCT_HOOK_HOST??"claude").toLowerCase();return e==="gemini"||e==="codex"||e==="cursor"?e:"claude"}r(f,"currentHookHost");function l(e,t=f()){return t==="claude"||t==="codex"||!e||Object.keys(e).length===0?e:t==="gemini"?g(e):t==="cursor"?m(e):e}r(l,"adaptHookOutputForHost");function g(e){let t=e;if(t.hookSpecificOutput?.permissionDecision==="deny")return{decision:"deny",reason:t.hookSpecificOutput.permissionDecisionReason??"blocked by prjct"};let n=e,o=n.hookSpecificOutput;return o?.additionalContext?{hookSpecificOutput:{hookEventName:h(o.hookEventName),additionalContext:o.additionalContext}}:n.systemMessage?{systemMessage:n.systemMessage}:e}r(g,"adaptForGemini");function m(e){let t=e;if(t.hookSpecificOutput?.permissionDecision==="deny")return{decision:"deny",reason:t.hookSpecificOutput.permissionDecisionReason??"blocked by prjct",permissionDecision:"deny",permissionDecisionReason:t.hookSpecificOutput.permissionDecisionReason??"blocked by prjct"};let n=e,o=n.hookSpecificOutput;return o?.additionalContext?{hookSpecificOutput:{hookEventName:k(o.hookEventName),additionalContext:o.additionalContext,additional_context:o.additionalContext},additional_context:o.additionalContext}:n.systemMessage?{systemMessage:n.systemMessage}:e}r(m,"adaptForCursor");function h(e){switch(e){case"UserPromptSubmit":return"BeforeAgent";case"PreToolUse":return"BeforeTool";case"PostToolUse":return"AfterTool";case"Stop":return"AfterAgent";default:return e}}r(h,"mapClaudeEventToGemini");function k(e){switch(e){case"SessionStart":return"sessionStart";case"UserPromptSubmit":return"beforeSubmitPrompt";case"PreToolUse":return"preToolUse";case"PostToolUse":return"postToolUse";case"Stop":return"stop";case"SubagentStart":return"subagentStart";case"SubagentStop":return"subagentStop";default:return e.charAt(0).toLowerCase()+e.slice(1)}}r(k,"mapClaudeEventToCursor");function y(e){if(d(0))return Buffer.alloc(0);try{process.stdin.fd}catch{}let t=Date.now()+e,n=new Int32Array(new SharedArrayBuffer(4)),o=Buffer.alloc(65536),i=[];for(;;)try{let s=c(0,o,0,o.length,null);if(s===0)break;i.push(Buffer.from(o.subarray(0,s)))}catch(s){if(s.code==="EAGAIN"&&Date.now()<t){Atomics.wait(n,0,0,1);continue}break}return Buffer.concat(i)}r(y,"readStdinRaw");function R(){try{let e=y(200).toString("utf-8").trim();return e?JSON.parse(e):{}}catch{return{}}}r(R,"readStdinSafe");function S(e){let t=l(e);process.stdout.write(`${JSON.stringify(t)}
9
- `)}r(S,"emit");function O(){S({})}r(O,"emitEmpty");async function C(e){try{await e()}catch{O()}}r(C,"safeRun");var w=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function H(e,t=8){let n=a(e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),o=new Set,i=[];for(let s of n.split(/[^\p{L}\p{N}]+/u))if(!(s.length<3)&&!w.has(s)&&!o.has(s)&&(o.add(s),i.push(s),i.length>=t))break;return i}r(H,"extractKeywords");function u(e){return e.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}r(u,"stripLoneSurrogates");function v(e,t,n=`
10
- \u2026 [truncated]`){if(e.length<=t)return e;let o=Math.max(0,t-n.length),i=e.charCodeAt(o-1),s=i>=55296&&i<=56319?o-1:o;return e.slice(0,Math.max(0,s))+n}r(v,"safeTruncate");function E(e,t){if(!t)return{};let n=u(t);return p.has(e)?{hookSpecificOutput:{hookEventName:e,additionalContext:n}}:{systemMessage:n}}r(E,"buildHookOutput");export{T as a,l as b,y as c,R as d,S as e,C as f,H as g,v as h,E 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{c as y,d as D,e as Q,f as vt}from"./chunk-HDSS6UB3.mjs";import{a as Y,b as m,c as q,d as wt}from"./chunk-JQE2F2RK.mjs";import{a as K,b as Dt}from"./chunk-WUHGODSQ.mjs";import{g as W,k as u,l as N,m as P,o as S}from"./chunk-UH4MD3F3.mjs";import{a as z,b as A,p as J}from"./chunk-QWQFF2UG.mjs";import{a as i,c as h,d as yt,e as F}from"./chunk-E66B27AL.mjs";function $t(e){let t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function X(e){return{year:e.getFullYear().toString(),month:(e.getMonth()+1).toString().padStart(2,"0"),day:e.getDate().toString().padStart(2,"0")}}function _t(){return new Date().toISOString()}function xt(e){let t=new Date;return t.setDate(t.getDate()-e),t}function Bt(e){return xt(e).toISOString()}function Lt(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Ut(e,t){if(!e||!t)return null;let n=Date.parse(e),r=Date.parse(t);return!Number.isFinite(n)||!Number.isFinite(r)||r<n?null:Math.round((r-n)/6e4)}function Vt(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=Math.floor(n/60),s=Math.floor(r/24);return s>0?`${s}d ${r%24}h`:r>0?`${r}h ${n%60}m`:n>0?`${n}m`:`${t}s`}var zt,Z=h(()=>{"use strict";i($t,"formatDate");i(X,"getYearMonthDay");i(_t,"getTimestamp");i(xt,"getDaysAgo");i(Bt,"sinceIso");i(Lt,"nullableNumber");i(Ut,"durationMinutes");i(Vt,"formatDuration");zt=new Intl.RelativeTimeFormat("en",{numeric:"always"})});import St from"node:fs";import w from"node:fs/promises";import l from"node:path";async function R(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of n)if(await u(l.join(e,r.file))){t.isMonorepo=!0,t.type=r.type;break}if(!t.isMonorepo){let r=l.join(e,"package.json");if(await u(r))try{JSON.parse(await w.readFile(r,"utf-8")).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await T(e,t.type)),t}async function T(e,t){let n=[];try{let r=await(async()=>{if(t==="pnpm"){let g=(await w.readFile(l.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);return g?g[1].split(`
9
- `).map(c=>c.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean):[]}if(t==="npm"||t==="lerna"){let a=l.join(e,"package.json"),g=JSON.parse(await w.readFile(a,"utf-8")),c=Array.isArray(g.workspaces)?g.workspaces:g.workspaces?.packages??[];if(t==="lerna"){let d=l.join(e,"lerna.json");if(await u(d)){let p=JSON.parse(await w.readFile(d,"utf-8"));if(p.packages)return p.packages}}return c}if(t==="nx")return["apps/*","libs/*","packages/*"];if(t==="turborepo"){let a=JSON.parse(await w.readFile(l.join(e,"package.json"),"utf-8"));return Array.isArray(a.workspaces)?a.workspaces:[]}return[]})(),s=r.length>0?r:["packages/*","apps/*","libs/*"];for(let a of s){if(a.startsWith("!"))continue;let g=Ct(a,{cwd:e});for(let c of g){let d=l.join(e,c),p=l.join(d,"package.json");if(await u(p))try{let f=JSON.parse(await w.readFile(p,"utf-8")),j=l.join(d,"PRJCT.md");n.push({name:f.name||l.basename(c),path:d,relativePath:c,hasPrjctMd:await u(j)})}catch{}}}}catch{}return n}async function tt(e,t){if(!t.isMonorepo)return null;let n=l.resolve(e);for(let r of t.packages){let s=l.resolve(r.path);if(n.startsWith(s))return r}return null}async function E(e){let t=l.resolve(e),n=l.parse(t).root;return t===n?null:(await R(t)).isMonorepo?t:E(l.dirname(t))}var Ct,et=h(()=>{"use strict";S();Ct=St.globSync;i(R,"detectMonorepo");i(T,"discoverMonorepoPackages");i(tt,"findContainingPackage");i(E,"findMonorepoRoot")});function rt(e,t){let n=typeof e=="string"?new Date(e).getTime():e;return Date.now()-n>t}var nt,it=h(()=>{"use strict";i(rt,"isExpired");nt=class{static{i(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(t={}){this.ttl=t.ttl??5e3,this.maxSize=t.maxSize??50}isValid(t){let n=this.cache.get(t);return n?Date.now()-n.timestamp<this.ttl:!1}get(t){let n=this.cache.get(t);return n?this.isValid(t)?n.data:(this.cache.delete(t),null):null}set(t,n){this.cache.set(t,{data:n,timestamp:Date.now()}),this.evictOldEntries()}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}has(t){return this.cache.has(t)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let n=Array.from(this.cache.entries()).sort((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of n)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let t=[...this.cache.keys()].filter(n=>!this.isValid(n));for(let n of t)this.cache.delete(n);return t.length}}});import kt from"node:fs/promises";import Mt from"node:path";async function st(){try{let e=await kt.readFile(ot(),"utf-8"),t=JSON.parse(e);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||rt(t.timestamp,It)?null:t.detection}catch{return null}}async function at(e){let t={timestamp:new Date().toISOString(),detection:e};await W(ot(),t)}var ot,It,ct=h(()=>{"use strict";ut();it();S();ot=i(()=>Mt.join(lt.getCachePath(),"providers.json"),"cacheFile"),It=600*1e3;i(st,"readProviderCache");i(at,"writeProviderCache")});import{execFileSync as G}from"node:child_process";function x(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return n}return null}function gt(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let t=G("where.exe",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0});return x(t)}try{let t=G("which",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}catch{let t=G("/bin/sh",["-c",`command -v ${JSON.stringify(e)}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}}catch{return null}}async function H(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let{stdout:t}=await A("where.exe",[e],{encoding:"utf-8",windowsHide:!0});return x(String(t))}try{let{stdout:t}=await A("which",[e]);return x(String(t))}catch{return gt(e)}}catch{return null}}function le(e){return gt(e)!==null}var mt=h(()=>{"use strict";J();i(x,"firstNonEmptyLine");i(gt,"whichSync");i(H,"whichAsync");i(le,"commandOnPath")});var k={};yt(k,{ClaudeProvider:()=>C,CursorProvider:()=>pt,GeminiProvider:()=>_,Providers:()=>v,detectAllProviders:()=>U,detectAntigravity:()=>Tt,detectCodex:()=>ht,detectKimi:()=>Et,detectProvider:()=>$,getActiveProvider:()=>Nt,getProviderBranding:()=>Rt,selectProvider:()=>Gt,validateCliVersion:()=>ft});import O from"node:path";async function L(e){let t=await H(e);return t||(process.platform==="win32"?H(`${e}.cmd`):null)}async function At(e){try{let{stdout:t}=await z(`${e} --version`,{timeout:2e3}),n=t.match(/\d+\.\d+\.\d+/);return n?n[0]:t.trim()}catch{return null}}async function $(e){let t=v[e];if(!t.cliCommand)return{installed:!1};let n=await L(t.cliCommand);if(!n)return{installed:!1};let r=await At(t.cliCommand),s=ft(e,r||void 0);return{installed:!0,version:r||void 0,path:n,versionWarning:s||void 0}}function ft(e,t){let n=v[e];return!n.minCliVersion||!t?null:Q(t,n.minCliVersion)<0?`\u26A0\uFE0F ${n.displayName} v${t} is below minimum v${n.minCliVersion}. Some features may not work correctly.`:null}async function U(e=!1){if(!e){let g=await st();if(g)return g}let[t,n,r]=await Promise.all([$("claude"),$("gemini"),ht()]),s={installed:r.installed},a={claude:t,gemini:n,codex:s};return await at(a).catch(()=>{}),a}async function Nt(e){if(e&&v[e])return v[e];let t=await U(),n=[t.claude.installed?"claude":null,t.gemini.installed?"gemini":null,t.codex.installed?"codex":null].filter(Boolean);return n.length===1?v[n[0]]:t.claude.installed?C:t.gemini.installed?_:t.codex.installed?B:C}function Rt(e){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",codex:"\u26A1 prjct + Codex"}[e]||"\u26A1 prjct"}}async function Tt(){let e=dt.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=O.join(e,"skills","prjct","SKILL.md"),[n,r]=await Promise.all([u(e),u(t)]);return{installed:n,skillInstalled:r,configPath:n?e:void 0}}async function ht(){let e=B.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=await L("codex"),n=O.join(e,"skills","prjct","SKILL.md"),r=await u(n),s=!!t||await u(O.join(e,"auth.json"));return{installed:s,skillInstalled:r,configPath:s?e:void 0}}async function Et(){let e=m(".kimi"),[t,n]=await Promise.all([L("kimi"),u(e)]),r=!!t||n;return{installed:r,configPath:r?e:void 0}}async function Gt(){let e=await U();return{provider:e.claude.installed?"claude":e.gemini.installed?"gemini":e.codex.installed?"codex":"claude",detection:e}}var C,_,dt,pt,B,v,M=h(()=>{"use strict";wt();vt();J();S();ct();mt();q();C={name:"claude",displayName:"Claude Code",cliCommand:"claude",get configDir(){return m(".claude")},contextFile:"CLAUDE.md",get skillsDir(){return m(".claude","skills")},commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},_={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",get configDir(){return m(".gemini")},contextFile:"GEMINI.md",get skillsDir(){return m(".gemini","skills")},commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},dt={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,get configDir(){return m(".gemini","antigravity")},contextFile:"ANTIGRAVITY.md",get skillsDir(){return m(".gemini","antigravity","global_skills")},commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},pt={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},B={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",get configDir(){return m(".codex")},contextFile:"AGENTS.md",get skillsDir(){return m(".codex","skills")},commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},v={claude:C,gemini:_,cursor:pt,antigravity:dt,codex:B};i(L,"whichCommand");i(At,"getCliVersion");i($,"detectProvider");i(ft,"validateCliVersion");i(U,"detectAllProviders");i(Nt,"getActiveProvider");i(Rt,"getProviderBranding");i(Tt,"detectAntigravity");i(ht,"detectCodex");i(Et,"detectKimi");i(Gt,"selectProvider")});import Ht from"node:crypto";import I from"node:fs/promises";import o from"node:path";var V,Ot,lt,ut=h(()=>{Z();S();Dt();et();q();V=class{static{i(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=K(),this.globalConfigDir=o.join(this.globalBaseDir,"config")}get globalProjectsDir(){let t=process.env.PRJCT_PROJECTS_DIR;return t?o.resolve(t):o.join(this.globalBaseDir,"projects")}setGlobalBaseDir(t){this.globalBaseDir=o.resolve(t),this.globalConfigDir=o.join(this.globalBaseDir,"config")}generateProjectId(t){return Ht.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(t){return o.join(this.globalProjectsDir,t)}getLocalConfigPath(t){return o.join(t,".prjct","prjct.config.json")}getGlobalProjectConfigPath(t){return o.join(this.getGlobalProjectPath(t),"project.json")}getLegacyPrjctPath(t){return o.join(t,".prjct")}async hasLegacyStructure(t){return await N(this.getLegacyPrjctPath(t))}async hasConfig(t){return await u(this.getLocalConfigPath(t))}async ensureGlobalStructure(){await P(this.globalBaseDir),await P(this.globalProjectsDir),await P(this.globalConfigDir)}async ensureProjectStructure(t){await this.ensureGlobalStructure();let n=this.getGlobalProjectPath(t),r=["analysis","memory"];for(let s of r)await P(o.join(n,s));return await P(o.join(n,"sessions")),n}getSessionPath(t,n=new Date){let{year:r,month:s,day:a}=X(n);return o.join(this.getGlobalProjectPath(t),"sessions",r,s,a)}getCurrentSessionPath(t){return this.getSessionPath(t,new Date)}async ensureSessionPath(t,n=new Date){let r=this.getSessionPath(t,n);return await P(r),r}async listSessions(t,n=null,r=null){let s=o.join(this.getGlobalProjectPath(t),"sessions"),a=[];try{let g=await I.readdir(s,{withFileTypes:!0});for(let c of g){if(!c.isDirectory()||n&&c.name!==n.toString())continue;let d=o.join(s,c.name),p=await I.readdir(d,{withFileTypes:!0});for(let f of p){if(!f.isDirectory()||r&&f.name!==r.toString().padStart(2,"0"))continue;let j=o.join(d,f.name),Pt=await I.readdir(j,{withFileTypes:!0});for(let b of Pt)b.isDirectory()&&a.push({year:c.name,month:f.name,day:b.name,path:o.join(j,b.name),date:new Date(`${c.name}-${f.name}-${b.name}`)})}}return a.sort((c,d)=>d.date.getTime()-c.date.getTime()),a}catch{return[]}}async getSessionsInRange(t,n,r=new Date){return(await this.listSessions(t)).filter(a=>a.date>=n&&a.date<=r)}getFilePath(t,n,r){return o.join(this.getGlobalProjectPath(t),n,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await I.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}async projectExists(t){return await N(this.getGlobalProjectPath(t))}getDisplayPath(t){let n=Y();return t.startsWith(n)?t.replace(n,"~"):t}getAuthConfigPath(){return o.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(t){return o.join(this.getGlobalProjectPath(t),"sync","pending.json")}getLastSyncPath(t){return o.join(this.getGlobalProjectPath(t),"sync","last-sync.json")}getRunningStatusPath(){return o.join(this.globalBaseDir,".running")}getCachePath(){return o.join(this.globalBaseDir,"cache")}getStatePath(){return o.join(this.globalBaseDir,"state")}getStatusLinePath(){return o.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(M(),F(k)).getActiveProvider()).configDir}async getAgentSettingsPath(){let t=await(M(),F(k)).getActiveProvider();return(M(),F(k)).getGlobalSettingsPath(t.name)}getClaudeDir(){return m(".claude")}getClaudeSettingsPath(){return o.join(this.getClaudeDir(),"settings.json")}getStoragePath(t,n){return o.join(this.getGlobalProjectPath(t),"storage",n)}getContextPath(t){return o.join(this.getGlobalProjectPath(t),"context")}async detectMonorepo(t){return R(t)}async discoverMonorepoPackages(t,n){return T(t,n)}async findContainingPackage(t,n){return tt(t,n)}async findMonorepoRoot(t){return E(t)}},Ot=new V,lt=Ot});export{$t as a,_t as b,xt as c,Bt as d,Lt as e,Ut as f,Vt as g,Z as h,rt as i,nt as j,it as k,H as l,le as m,mt as n,v as o,Nt as p,Rt as q,ht as r,Et as s,k as t,M as u,lt as v,ut as w};
@@ -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{a as K}from"./chunk-HRWXMF7P.mjs";import{a as X}from"./chunk-ZJXH76Q5.mjs";import{a as q,j as H}from"./chunk-PUHX3ECX.mjs";import{a as J}from"./chunk-Q3EYM4GJ.mjs";import{e as Y}from"./chunk-AZYQFRPJ.mjs";import{c as P}from"./chunk-QPRNRLG6.mjs";import{d as M,e as I}from"./chunk-7JEKBJAP.mjs";import{a as x}from"./chunk-27XFSCOE.mjs";import{h as j}from"./chunk-DRGI5UHQ.mjs";import{b as E}from"./chunk-AZHE4VOM.mjs";import{d as f,g as G}from"./chunk-KG7Z6OMK.mjs";import{b,g as A,h as ct,i as W,k as ut,v as B,w as mt}from"./chunk-JAMSIKDE.mjs";import{d as lt}from"./chunk-JQE2F2RK.mjs";import{e as k,p as ot}from"./chunk-QWQFF2UG.mjs";import{b as _,e as dt}from"./chunk-EMTCZG5I.mjs";import{e as U,f as at}from"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";mt();import L from"node:fs";import pt from"node:path";var V=l(()=>B.getStatePath(),"stampDir"),z=l(()=>pt.join(V(),"installed-version"),"stampPath");function ft(){try{return L.readFileSync(z(),"utf-8").trim()}catch{return null}}l(ft,"readStamp");function ht(i){try{L.mkdirSync(V(),{recursive:!0}),L.writeFileSync(z(),i,"utf-8")}catch{}}l(ht,"writeStamp");function Q(i){return i?ft()===i:!0}l(Q,"isSyncCurrent");async function Z(i){if(i&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await import("./command-installer-MF4KUM3X.mjs");await e()}catch{}try{await(await import("./settings-installer-QDM3GB6J.mjs")).install()}catch{}try{let{SetupCommands:e}=await import("./setup-WQRJ6TQL.mjs");await new e().installStatusLine()}catch{}ht(i)}}l(Z,"runSelfHeal");G();at();ot();lt();G();ut();ct();var gt=50,N=class{static{l(this,"SessionTracker")}currentRow(e){try{return f.get(e,"SELECT * FROM cli_sessions WHERE status = 'active' ORDER BY last_activity DESC LIMIT 1")??null}catch{return null}}isExpired(e){return W(e,18e5)}toSessionData(e,t){return{id:t.id,projectId:e,status:t.status,createdAt:t.created_at,lastActivity:t.last_activity,commands:[],files:[]}}async touch(e){let t=b(),n=this.currentRow(e);if(n&&!this.isExpired(n.last_activity))return f.run(e,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",t,n.id),this.toSessionData(e,{...n,last_activity:t});n&&f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",n.id);let s=crypto.randomUUID();return f.run(e,"INSERT INTO cli_sessions (id, status, created_at, last_activity) VALUES (?, 'active', ?, ?)",s,t,t),this.toSessionData(e,{id:s,status:"active",created_at:t,last_activity:t})}async trackCommand(e,t,n){let s=this.currentRow(e);if(!s)return;let o=b();try{f.run(e,"INSERT INTO cli_session_commands (session_id, command, timestamp, duration_ms) VALUES (?, ?, ?, ?)",s.id,t,o,Math.round(n)),f.run(e,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",o,s.id)}catch{}}async getInfo(e){let t=this.currentRow(e);if(!t||this.isExpired(t.last_activity))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=Date.now(),s=new Date(t.created_at).getTime(),o=new Date(t.last_activity).getTime(),c=n-o,a=Math.max(0,18e5-c),r=f.query(e,"SELECT command FROM cli_session_commands WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?",t.id,gt);return{active:!0,id:t.id,duration:A(n-s),idleSince:t.last_activity,idleMs:c,expiresIn:A(a),commandCount:r.length,commands:r.map(m=>m.command).reverse(),filesRead:0,filesWritten:0}}async expire(e){try{f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE status = 'active'")}catch{}}async expireIfStale(e){let t=this.currentRow(e);return t&&this.isExpired(t.last_activity)?(f.run(e,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",t.id),!0):!1}},et=new N;var yt={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},F=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...yt,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n=(()=>{try{return f.getDoc(e,"project")}catch{return null}})();if(!n)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;let c={cwd:this.projectPath,timeoutMs:3e3,maxBuffer:1024*256},a=`${t.lastSyncCommit}..HEAD`,[r,m]=await Promise.all([k(["rev-parse","--short","HEAD"],c),k(["rev-list","--count",a],c)]);if(!r.ok)return t.reason=r.kind==="exit"?"Not a git repository":`git ${r.kind} \u2014 staleness unknown`,t;if(t.currentCommit=r.stdout.trim(),t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;if(!m.ok)return m.kind==="exit"?(t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`."):t.reason=`git ${m.kind} reading history \u2014 staleness unknown. Retry shortly.`,t;if(t.commitsSinceSync=parseInt(m.stdout.trim(),10)||0,s){let y=new Date(s),g=new Date;t.daysSinceSync=Math.floor((g.getTime()-y.getTime())/(1e3*60*60*24))}if(t.commitsSinceSync>0&&t.commitsSinceSync<this.config.commitThreshold){let y=await k(["diff","--name-only",a],c),g=y.ok?y.stdout.trim().split(`
9
- `).filter(Boolean).slice(0,200):[];t.changedFiles=g,t.significantChanges=g.filter(d=>this.config.significantFiles.some(p=>d.endsWith(p)||d.includes(p)))}else t.changedFiles=[],t.significantChanges=[];return t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${U(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0&&t.push(...nt(n)),e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
10
- `)}async getSessionInfo(e){return et.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
11
- `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let c of e.commands)s.has(c)||(s.add(c),o.push(c));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}return(e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0&&t.push(...nt(n)),t.join(`
12
- `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}};function nt(i){let e=Math.max(...i.map(n=>n.length)),t="\u2500".repeat(e+2);return[`\u250C${t}\u2510`,...i.map(n=>`\u2502 ${n.padEnd(e)} \u2502`),`\u2514${t}\u2518`]}l(nt,"boxLines");var st=l((i,e)=>new F(i,e),"createStalenessChecker");dt();var St=1600,R=3,Ct=4,O={minTeaser:24,maxTeaser:90};async function wt(i,e,t={}){let n=e??await E.readConfig(i);if(!n?.projectId)return null;let s=n.persona,o=t.digest?await(async()=>{try{let{memoryL0IndexForSession:h}=await import("./memory-index-QK5QJOFJ.mjs");return h(n.projectId,{rebuildIfStale:!0})||it(n.projectId)}catch{return it(n.projectId)}})():null,c=vt(i,n.projectId),a=import("./vault-retire-notice-HT756AND.mjs").then(({vaultRetirementNotice:h})=>h(n,n.projectId)),r=(async()=>{try{let{buildLandCue:h}=await import("./land-cue-MMISX2BI.mjs");return await h(n.projectId,i,n)}catch{return null}})(),m=(async()=>{try{let{effectiveWeakModelMode:h,weakModelBanner:C}=await import("./weak-model-mode-FLCEQ2BV.mjs");return h(n)==="on"?C():null}catch{return null}})(),w=t.digest?(async()=>{try{let{formatPendingHandoffCue:h}=await import("./agent-switch-2U2LOBGR.mjs"),C=h(n.projectId);return C?`# prjct: pending handoff
13
- ${C}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:C}=await import("./session-continuity-RKNAJJHR.mjs");return C(h(n.projectId))}catch{return null}})():Promise.resolve(null),g=Tt(i,n.projectId),[d,p,S,v,T,$,D]=await Promise.all([c,a,r,m,w,y,g]);if(!D&&!s&&!o&&!d&&!p&&!S&&!v&&!T&&!$)return null;let u=["# prjct: project context",""];return D&&u.push(D,""),s&&u.push(xt(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&u.push(""),u.push(o)),d&&((s||o)&&u.push(""),u.push(d)),p&&((s||o||d)&&u.push(""),u.push(p)),S&&((s||o||d||p)&&u.push(""),u.push(S)),v&&((s||o||d||p||S)&&u.push(""),u.push(v)),T&&((s||o||d||p||S||v)&&u.push(""),u.push(T)),$&&((s||o||d||p||S||v||T)&&u.push(""),u.push($)),u.join(`
14
- `)}l(wt,"buildSessionContext");async function vt(i,e){try{let t=st(i),n=await t.check(e);if(!n.isStale||n.commitsSinceSync<=0)return null;let s=t.getWarning(n);if(!s)return null;try{let c=await import("node:path"),a=await import("node:os"),{maybeDetachDriftRefresh:r,readDriftStamp:m,formatDriftNotice:w,driftStaleResolved:y}=await import("./drift-refresh-TD3PYPJN.mjs"),g=process.env.PRJCT_CLI_HOME?c.resolve(process.env.PRJCT_CLI_HOME):c.join(a.homedir(),".prjct-cli"),d=m(g);if(y(d))return w({warning:s,commitsSinceSync:n.commitsSinceSync,stamp:d,refreshScheduled:!1});let p=r({projectPath:i,cliHome:g,commitsSinceSync:n.commitsSinceSync}),S=m(g);return w({warning:s,commitsSinceSync:n.commitsSinceSync,stamp:S,refreshScheduled:p})}catch{}let o=await(async()=>{try{let{hasSymbolIndex:c,loadMeta:a}=await import("./symbol-graph-BKQIMFRG.mjs");if(!c(e))return" Code graph empty \u2014 `prjct code reindex` (or `prjct sync`) before trace/impact.";if(n.commitsSinceSync<5)return"";let r=a(e);return` Symbol index may lag${r?.builtAt?` (index ${r.builtAt.slice(0,10)})`:""} \u2014 prefer \`prjct code reindex\` after big pulls.`}catch{return""}})();return`**Understanding may be stale:** ${s} \u2014 run \`prjct sync\` before big calls.${o}`}catch{return null}}l(vt,"buildStalenessNotice");function it(i){let e=(()=>{try{let r=P.rerank(i,x.recall(i,{types:["gotcha","anti-pattern"],limit:R*4})).slice(0,R),m=P.rerank(i,x.recall(i,{types:["decision"],limit:R*4})).slice(0,R);return{gotchas:r,decisions:m}}catch{return null}})();if(!e)return null;let{gotchas:t,decisions:n}=e,s=(()=>{try{let r=x.recall(i,{types:["feedback","improvement-signal"],limit:40,dedupeByKey:!1});return q(r,Ct)}catch{return[]}})(),o=H(i,new Set([...t,...n].map(r=>r.id))),c=(()=>{try{let r=J(i);return r?Y(r,{maxConventions:4,maxPatterns:3,maxAnti:2}):null}catch{return null}})();if(t.length===0&&n.length===0&&!o&&s.length===0&&!c)return null;let a=["## What this project already knows",""];if(a.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not. Apply these; do not re-derive from source."),s.length>0){a.push("","**How this developer works (act as them):**");for(let r of s){let m=r.rule.length>140?`${r.rule.slice(0,139)}\u2026`:r.rule;a.push(`- ${m} \`${r.sourceId}\``)}}if(c){let r=c.replace(/^## How this repo works \(project style\)\n?/,"").trim();r&&a.push("","**How this repo works (match house style):**",r)}if(t.length>0){a.push("","**Traps to avoid:**");for(let r of t)a.push(`- ${I(r,O)}`)}if(n.length>0){a.push("","**Decisions in force:**");for(let r of n)a.push(`- ${I(r,O)}`)}return o&&a.push("","**Keeps being missed:**",`- ${I(o.entry,O)} \u2014 flagged relevant-but-unused ${o.count}\xD7. Apply it or supersede it.`),a.push("","> Resolve any `mem_id` with `prjct search <id>`. Full developer model: MCP `prjct_developer`. Project style: `prjct analysis` / sync evolution."),j(a.join(`
15
- `),St)}l(it,"buildKnowledgeDigest");var Et=500,rt=2;async function ne(i){let e=await E.readConfig(i).catch(()=>null);if(!e?.projectId)return null;let t=["# prjct: subagent context"];e.persona?.role&&t.push(`Role in this project: ${e.persona.role}`);try{let{resolveActiveTask:n}=await import("./task-service-XREJLWEF.mjs"),s=await n(e.projectId,i);s&&t.push(`Active work cycle (this worktree): ${s.description}`)}catch{}try{let n=P.rerank(e.projectId,x.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:rt*4})).slice(0,rt);if(n.length>0){t.push("Traps to avoid:");for(let o of n)t.push(`- ${M(o)} \`${o.id}\``)}let s=H(e.projectId,new Set(n.map(o=>o.id)));s&&t.push(`Keeps being missed: ${M(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:j(t.join(`
16
- `),Et)}l(ne,"buildSubagentDigest");function xt(i){let e=[];return e.push(`## Your role in this project: **${i.role}**`),i.focus&&e.push(`Focus: ${i.focus}`),i.mcps&&i.mcps.length>0&&e.push(`Available MCPs this project expects: ${i.mcps.join(", ")}`),i.packs&&i.packs.length>0&&e.push(`Active packs: ${i.packs.join(", ")}`),e.join(`
17
- `)}l(xt,"formatPersona");async function Tt(i,e){try{let t=await import("node:path"),{execFileAsync:n}=await import("./exec-2P5VOBHM.mjs"),s=t.basename(i),o=await(async()=>{try{let{stdout:r}=await n("git",["branch","--show-current"],{cwd:i});return r.trim()}catch{return""}})(),c=e.length>12?`${e.slice(0,8)}\u2026`:e,a=["## Project identity (cwd)",`- **${s}** \xB7 id \`${c}\``];return o&&a.push(`- Branch: \`${o}\``),a.push("- Skill is portable L0 \u2014 if skill text names another project, ignore it; trust this block + `prjct context --md`."),a.join(`
18
- `)}catch{return null}}l(Tt,"buildProjectIdentityLine");function se(i=process.cwd(),e){let t=E.readConfig(i).catch(()=>null);return X({event:"SessionStart",projectPath:i,build:l(async(n,s)=>{let o=s===i?await t:await E.readConfig(s).catch(()=>null),c=n.source??"startup";return wt(s,o,{digest:c==="startup"||c==="clear"||c==="compact"})},"build"),afterEmit:l(async(n,s)=>{let o=await t;if(o?.projectId){let c=await(async()=>{try{let{collectActiveTasks:a}=await import("./task-overview-ITY5OSHX.mjs"),r=await a(o.projectId,s);return{taskId:r.current?.id??null,goal:r.current?.description??n.source??null}}catch{return{taskId:null,goal:n.source??null}}})();K({projectId:o.projectId,sessionId:n.session_id,directory:s,taskId:c.taskId,goal:c.goal})}Q(_)||await Z(_).catch(()=>{});try{let{maybeAutoUpdate:c}=await import("./auto-updater-4TIXYSEX.mjs");c(_)}catch{}},"afterEmit")},e)}l(se,"runSessionStartHook");export{wt as a,ne as b,Tt as c,se as d};
@@ -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{a}from"./chunk-E66B27AL.mjs";function l(n){let e=new Set;for(let t of n){let s=c(t.message)?.model??t.model;typeof s=="string"&&s.trim()&&e.add(s.trim().slice(0,120))}return e.size===0?"unknown":e.size>1?"mixed":[...e][0]}a(l,"identifyTranscriptModel");function I(n){let e=[];for(let t of n.split(`
9
- `)){let o=t.trim();if(o)try{let s=JSON.parse(o);s&&typeof s=="object"&&e.push(s)}catch{}}return e}a(I,"parseTranscriptJsonl");function c(n){return n&&typeof n=="object"?n:null}a(c,"asRecord");function p(n){return typeof n=="number"&&Number.isFinite(n)?n:0}a(p,"num");function d(n){let e=p(n.input_tokens)+p(n.cache_creation_input_tokens)+p(n.prompt_tokens)+p(n.promptTokenCount),t=p(n.output_tokens)+p(n.completion_tokens)+p(n.candidatesTokenCount),o=p(n.cache_read_input_tokens);return{tokensIn:e,tokensOut:t,cacheRead:o}}a(d,"usagePairFrom");function f(n,e){if(!e?.sinceIso&&!e?.untilIso)return!0;let t=typeof n.timestamp=="string"?Date.parse(n.timestamp):Number.NaN;return!(!Number.isFinite(t)||e.sinceIso&&t<Date.parse(e.sinceIso)||e.untilIso&&t>=Date.parse(e.untilIso))}a(f,"inWindow");function g(n,e){let t=n.reduce((u,m)=>{if(!f(m,e))return u;let k=c(c(m.message)?.usage)??c(m.usage)??c(m.usageMetadata);if(!k)return u;let i=d(k);return{tokensInNew:u.tokensInNew+i.tokensIn,tokensOut:u.tokensOut+i.tokensOut,maxCacheRead:Math.max(u.maxCacheRead,i.cacheRead)}},{tokensInNew:0,tokensOut:0,maxCacheRead:0}),{tokensInNew:o,tokensOut:s,maxCacheRead:r}=t;return{tokensInNew:o,cacheReadMax:r,tokensIn:o+r,tokensOut:s}}a(g,"sumTranscriptUsageDetailed");function x(n,e){let t=g(n,e);return{tokensIn:t.tokensIn,tokensOut:t.tokensOut}}a(x,"sumTranscriptUsage");function T(n,e){let t=new Map;for(let s of n){if(!f(s,e))continue;let r=c(s.message),u=c(r?.usage)??c(s.usage)??c(s.usageMetadata);if(!u)continue;let m=typeof r?.model=="string"&&r.model?r.model:"unknown",k=d(u),i=t.get(m)??{tokensIn:0,tokensOut:0,maxCacheRead:0};i.tokensIn+=k.tokensIn,i.tokensOut+=k.tokensOut,k.cacheRead>i.maxCacheRead&&(i.maxCacheRead=k.cacheRead),t.set(m,i)}let o=new Map;for(let[s,r]of t)o.set(s,{tokensIn:r.tokensIn+r.maxCacheRead,tokensOut:r.tokensOut});return o}a(T,"sumTranscriptUsageByModel");export{l as a,I as b,g as c,x as d,T as e};
@@ -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{a as i,b as g,c,d as p,e as m,f as u,i as l}from"./chunk-NBKEOLDH.mjs";import{r as d,s as f,u as M}from"./chunk-JAMSIKDE.mjs";import{b as s,c as j}from"./chunk-JQE2F2RK.mjs";import{e as n,f as y}from"./chunk-BUDZL4DW.mjs";import{a as r}from"./chunk-E66B27AL.mjs";M();y();j();function v(){return process.env.PRJCT_TEST_MODE==="1"?s(".prjct-tests","kimi","mcp.json"):s(".kimi","mcp.json")}r(v,"getKimiMcpConfigPath");async function C(t=v()){let e=await c("context7",i.context7,t),o=await c("prjct",i.prjct,t);return{path:t,changed:e.changed||o.changed}}r(C,"ensureKimiMcpServer");var h=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];async function b(t={}){t.silent||console.log(`
9
- \u{1F50C} Configuring MCP servers...`);try{await l.install();let e=t.verifyContext7===!1?null:await l.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of h)try{let o=g(),a=await p(e.name,o),x=await c(e.name,i[e.name],o);a&&!x.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(o){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${n(o)}`),console.log(e.manual))}try{if((await d()).installed){let o=await m(),a=await u();t.silent||(o.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):o.changed||a.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await f()).installed){let o=await C();t.silent||console.log(o.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${n(e)}`),console.log(" Run `prjct start` again to retry."))}}r(b,"setupMcpServers");export{b as a};
@@ -1,15 +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{c as j}from"./chunk-IHECXD2M.mjs";import{n as w}from"./chunk-JAMSIKDE.mjs";import{c as C}from"./chunk-JQE2F2RK.mjs";import{k as r,o as u}from"./chunk-UH4MD3F3.mjs";import{c as A}from"./chunk-EQ5KNMLG.mjs";import{b as l,c,d as h,e as d}from"./chunk-SYHDEUVU.mjs";import{c as R,e as G}from"./chunk-EMTCZG5I.mjs";import{a as s}from"./chunk-E66B27AL.mjs";u();import a from"node:path";var b=`${h}
9
- - project facts (stack/commands): see \`PRJCT.md\``,P=`${l}
10
- ${b}
11
- ${c}
12
- `;async function T(e){return d(e,"AGENTS.md",P)}s(T,"writeProjectAgentsMd");var D="@PRJCT.md",I=`${l}
13
- ${D}
14
- ${c}
15
- `;async function N(e){return d(e,"CLAUDE.md",I)}s(N,"writeProjectClaudeMd");import g from"node:fs/promises";import p from"node:path";u();w();C();import m from"node:path";var F=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Claude Code + Opus frontier. CLAUDE.md, skills, hooks, MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Codex + GPT-5.x (TB leader). AGENTS.md, config.toml MCP (native), hooks opt-in (planned installer)."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.gemini/settings.json mcpServers",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Gemini CLI + Pro/Flash. GEMINI.md; prjct install writes MCP+hooks to ~/.gemini/settings.json."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[m.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"~/.config/opencode/opencode.json mcp.prjct",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Benchmark-tier open-source CLI (2026-07): most-starred multi-provider agent. AGENTS.md + prjct install writes mcp.prjct; Claude skill/CLAUDE.md compat."},{id:"pi",displayName:"Pi",kind:"cli",status:"stable",detectsBy:{homeDirs:[".pi",m.join(".pi","agent")],projectDirs:[".pi"],commands:["pi"]},contextFiles:["AGENTS.md","CLAUDE.md","SYSTEM.md","APPEND_SYSTEM.md"],supports:{agentsMd:!0,mcp:!1,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Benchmark-tier minimal harness (2026-07): AGENTS.md + prjct skill at ~/.pi/agent/skills/prjct. MCP only via optional extensions \u2014 do not require it."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.kimi/mcp.json",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"grok",displayName:"xAI Grok Build",kind:"cli",status:"stable",detectsBy:{homeDirs:[".grok"],commands:["grok"]},contextFiles:["AGENTS.md","CLAUDE.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.grok/config.toml",writable:!0},{format:"claude-json",pathHint:"~/.claude/mcp.json (Grok Claude-compat fallback)",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Grok Build. Native MCP + skill via prjct install (~/.grok/config.toml + ~/.grok/skills/prjct). Hooks still Claude-compat. See harness-surfaces."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier AI IDE (2026-07): agent mode + CLI. Rules under .cursor/rules; prjct install writes ~/.cursor/hooks.json."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"Benchmark-tier open agent (2026-07): VS Code + multi-model. AGENTS.md, rules, skills, hooks, MCP, ACP."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[m.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"GitHub Copilot coding agent / Copilot CLI (2026-07 benchmark field). Repo AGENTS.md + .github instructions + MCP."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];function y(){return F.flatMap(e=>e.projectRuleTargets??[])}s(y,"listProjectRuleTargets");u();G();async function B(e){let t=A(e);return t||g.readFile(p.join(R,"templates",e),"utf-8")}s(B,"loadTemplate");async function v(e,t,n){let o=p.join(e,t);await g.mkdir(p.dirname(o),{recursive:!0}),await g.writeFile(o,await B(n),"utf-8")}s(v,"writeRule");async function E(e,t={}){let n=new Set(t.agents??[]),o=[];for(let i of y())(n.has(i.relativePath.split("/")[0].replace(/^\./,""))||i.detectPath&&await r(p.join(e,i.detectPath)))&&(await v(e,i.relativePath,i.templateKey),o.push(i.relativePath));return{written:o}}s(E,"writeProjectIdeRules");async function L(e){let[t,n,o]=await Promise.all([r(a.join(e,"PRJCT.md")),r(a.join(e,"AGENTS.md")),r(a.join(e,"CLAUDE.md"))]);return t||n||o}s(L,"hasAdoptedSurfaces");async function ge(e,t={}){if(!(t.explicit||t.refreshIfAdopted&&await L(e)))return{prjctMd:{action:"unchanged",path:a.join(e,"PRJCT.md")},agentsMd:{action:"unchanged",path:a.join(e,"AGENTS.md")},ideRules:[]};let o=new Set(t.agents??[]),i=await r(a.join(e,"CLAUDE.md")),f=o.has("claude")||i,[M,S,k,x]=await Promise.all([j(e),T(e),f?N(e):void 0,E(e,t)]);return{prjctMd:M,agentsMd:S,...k?{claudeMd:k}:{},ideRules:x.written}}s(ge,"writeProjectAgentSurfaces");export{ge as a};
@@ -1,11 +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{a as c,b as o,d as l,e as u,f as s,i as d}from"./chunk-DRGI5UHQ.mjs";import{a as f}from"./chunk-E66B27AL.mjs";async function E(t,n){let e=t.projectPath??process.cwd();if(n){try{let i=n.input;if(n.afterEmitOnly){t.afterEmit&&n.detachAfterEmit(()=>t.afterEmit(i,e));return}let r=t.decide?await t.decide(i,e):null;if(r){let k=o(c(t.event,r.deny));n.sink(`${JSON.stringify(k)}
9
- `);return}let a=t.build?await t.build(i,e):null,m=o(d(t.event,a));n.sink(`${JSON.stringify(m)}
10
- `),t.afterEmit&&n.detachAfterEmit(()=>t.afterEmit(i,e))}catch{n.sink(`{}
11
- `)}return}await s(async()=>{let i=l(),r=t.decide?await t.decide(i,e):null;if(r){u(c(t.event,r.deny));return}let a=t.build?await t.build(i,e):null;u(d(t.event,a)),t.afterEmit&&await t.afterEmit(i,e)})}f(E,"runHook");export{E as a};
@@ -1,8 +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{a as t}from"./chunk-NUJASVHN.mjs";import"./chunk-HRWXMF7P.mjs";import{a as n}from"./chunk-ZJXH76Q5.mjs";import"./chunk-PUHX3ECX.mjs";import"./chunk-Q3EYM4GJ.mjs";import"./chunk-AZYQFRPJ.mjs";import"./chunk-JR542RI2.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-ZMLA5SKR.mjs";import"./chunk-QPRNRLG6.mjs";import"./chunk-7JEKBJAP.mjs";import"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import"./chunk-DXQMKW2B.mjs";import"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GVNMXVVA.mjs";import"./chunk-DRGI5UHQ.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as o}from"./chunk-E66B27AL.mjs";function p(r=process.cwd(),e){return n({event:"CwdChanged",projectPath:r,build:o(async(d,i)=>{let c=d.cwd||i;return t(c)},"build")},e)}o(p,"runCwdChangedHook");export{p as runCwdChangedHook};
@@ -1,22 +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{a as A,b as z}from"./chunk-MXHX44WF.mjs";import{a as K}from"./chunk-NCOOKPXX.mjs";import{a as V}from"./chunk-5WAONIPX.mjs";import{a as q}from"./chunk-ZJXH76Q5.mjs";import{b as x}from"./chunk-2UC4DTDO.mjs";import{a as F}from"./chunk-5TBQNW2G.mjs";import{a as B}from"./chunk-3VWBNLBC.mjs";import{a as _}from"./chunk-J6TAD3OZ.mjs";import{a as U}from"./chunk-D6IONKRA.mjs";import{a as M}from"./chunk-T2FCU3ZS.mjs";import{b as N}from"./chunk-XE4MJNBQ.mjs";import"./chunk-JCYXFHQZ.mjs";import{b as O}from"./chunk-JPSJWCFD.mjs";import"./chunk-TPESWBA7.mjs";import"./chunk-JUZ5LNDI.mjs";import{a as H,g as L}from"./chunk-7O6OMD4X.mjs";import"./chunk-OZJ6UKKP.mjs";import"./chunk-YQ55MHKL.mjs";import"./chunk-QSAA6LZF.mjs";import"./chunk-KOGZCFBC.mjs";import"./chunk-FX6VHIKB.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-KEJ5RMAI.mjs";import"./chunk-JMCMTX6U.mjs";import"./chunk-R4ILCXKE.mjs";import"./chunk-QPRNRLG6.mjs";import{d as S}from"./chunk-7JEKBJAP.mjs";import"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import"./chunk-DXQMKW2B.mjs";import{a as I}from"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import{b as $}from"./chunk-6UH244CC.mjs";import"./chunk-OUAS3LZ3.mjs";import"./chunk-INXNK57E.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GVNMXVVA.mjs";import{g as T,h as k}from"./chunk-DRGI5UHQ.mjs";import"./chunk-GAOQHD5S.mjs";import{b as v}from"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import{d as R,g as ie}from"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import{k as G,o as re}from"./chunk-UH4MD3F3.mjs";import{b as D,p as ne}from"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";import{createHash as E}from"node:crypto";import f from"node:fs/promises";import h from"node:path";var se=15;function W(t){let r=[],e=[];t.loop?.stopped&&t.loop.message&&(r.push("loop-hard-stop"),e.push(t.loop.message)),t.pressure?.level==="critical"&&t.pressure.cue?(r.push("context-pressure-critical"),e.push(t.pressure.cue)):t.pressure?.level==="warn"&&t.pressure.cue&&(r.push("context-pressure-warn"),e.push(t.pressure.cue)),t.qualityInject?.trim()&&(r.push("quality-ledger"),e.push(t.qualityInject.trim()));let i=t.turns??0,n=t.stuckThreshold??se;if(!t.loop?.stopped&&i>=n&&(r.push("stuck-cycle"),e.push(`\u26A0 ${i} 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.`)),e.length===0)return{level:"ok",markdown:null,cues:[]};let s=r.some(a=>["loop-hard-stop","context-pressure-critical","context-pressure-warn"].includes(a)),o=r.some(a=>["quality-ledger","stuck-cycle"].includes(a)),d=s?"hard":o?"warn":"ok",p=d==="hard"?"# prjct: alignment (MUST \u2014 hard gate)":"# prjct: alignment (mid-cycle)",g=e.join(`
9
-
10
- `),c=r.includes("quality-ledger")&&!g.includes("prjct ship")?`
11
-
12
- _${H}_`:"";return{level:d,cues:r,markdown:`${p}
13
-
14
- ${g}${c}`}}l(W,"buildAlignmentCard");ie();ne();re();var Y=1500,J=15,C=8,X=420,oe=2,ce=15e3;var ae=new Set(["address","apply","check","continue","create","current","description","feedback","handle","merge","monitor","please","review","should","title","watch","write"]),j=new WeakMap,b=new Map;async function Z(t,r){let e=r!==void 0?r:await v.readConfig(t);if(!e?.projectId)return null;let i=ue(e,t),n=["# prjct: project state"];try{let o=await U(e.projectId,t);if(o.current){let p=ee(o.current.startedAt);n.push(`- Active work cycle: "${o.current.description}" (${p}) [${o.current.label}]`),(e.land?.mode??"advisory")!=="off"&&n.push(' \u21B3 Before session end: `prjct land` \xB7 hand-off `prjct remember context "Session close: \u2026"`');let{turns:g,loopVerdict:c,currentTask:a}=(()=>{try{let u=o.mainTaskRaw;return{turns:u?.turnCount??0,currentTask:u,loopVerdict:V(e,u)}}catch{return{turns:0,currentTask:null,loopVerdict:null}}})();!c?.stopped&&g<J&&n.push(" \u21B3 Stay on this goal. Each turn, before acting: is this step ADVANCING it? If you have hit the same wall twice, or you are exploring rather than progressing, STOP \u2014 re-plan, split the cycle, or ask the user. Do not loop; finish the cycle, then `prjct status done`.");try{let u=e.maxTokensPerCycle??0;if(u>0&&a){let m=(a.tokensIn??0)+(a.tokensOut??0);m>=u?n.push(` \u26A0 Token budget: ${m.toLocaleString()} of ${u.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.`):m>=u*.8&&n.push(` \u21B3 Token budget: ${m.toLocaleString()} of ${u.toLocaleString()} (${Math.round(m/u*100)}%). Plan the close: prefer finishing over expanding scope.`)}}catch{}try{let u=o.current.startedAt;if(u){let m=R.get(e.projectId,`SELECT COUNT(DISTINCT json_extract(data, '$.file')) AS c
15
- FROM events WHERE type = 'memory.post_edit' AND timestamp >= ?`,u)?.c??0,w=O(m);w&&n.push(` ${w}`)}}catch{}try{let u=F(e,a),m=L(e.projectId),w=W({loop:c,pressure:u,qualityInject:m,turns:g,stuckThreshold:J});w.markdown&&(n.push(""),n.push(w.markdown))}catch{}a?.ownerAgent&&n.push(`- Owner: ${a.ownerAgent}${a.ownerIdentity?`/${a.ownerIdentity}`:""}${a.yieldStatus==="yielded"?" (yielded \u2014 awaiting accept)":""}`)}let d=o.all.filter(p=>!p.isCurrent);d.length>0&&n.push(`- ${d.length} task(s) active in other workspace(s)`),!o.current&&d.length>0&&n.push("- This workspace idle but siblings busy \u2014 `prjct work` auto-isolates to a worktree when needed")}catch{}let s=await i;for(let o of s)o&&n.push(o);return n.length===1?null:n.join(`
16
- `)}l(Z,"buildProjectState");function ue(t,r){return Promise.all([(async()=>{try{let{formatPendingHandoffCue:e}=await import("./agent-switch-2U2LOBGR.mjs"),i=e(t.projectId);return i?`- ${i.replace(/\n/g,`
17
- - `)}`:null}catch{return null}})(),(async()=>{try{let e=await M.getActiveTasks(t.projectId);return e.length>0?`- Pending: ${e.length} \xB7 Next: "${e[0].description}"`:null}catch{return null}})(),(async()=>{try{if(!await G(h.join(r,".git")))return null;let e=await ge(r);if(!e.branch)return null;let i=[];e.modified>0&&i.push(`${e.modified} modified`),e.staged>0&&i.push(`${e.staged} staged`),e.untracked>0&&i.push(`${e.untracked} untracked`);let n=i.length>0?` \u2014 working tree ${i.join(", ")}`:"",s=e.ahead>0?`${n?",":" \u2014"} ${e.ahead} unpushed`:"";return`- Branch: ${e.branch}${n}${s}`}catch{return null}})(),(async()=>{try{let e=await _.getRecent(t.projectId,1);if(e.length===0)return null;let i=e[0],n=ee(i.shippedAt??"");return`- Last ship: ${i.version?`v${i.version}`:i.name} (${n})`}catch{return null}})(),(async()=>{try{let e=I.countByType(t.projectId,"inbox");return e>0?`- Inbox: ${e} items pending`:null}catch{return null}})()])}l(ue,"collectSecondarySignals");function le(t){return t.type==="voice"||t.type==="glossary"?!0:t.type==="example"&&!!t.tags.domain&&(t.tags.polarity==="good"||t.tags.polarity==="bad")}l(le,"isValidGuidanceEntry");function de(t,r){try{let e=A(r),i=T(r).filter(c=>c.length>=5&&!ae.has(c)),n=i.length>0?I.searchFts(t,i,C*2):[],s=e?I.recall(t,{types:["voice","glossary","example"],limit:C*2}).filter(c=>c.tags.domain==="delivery"||c.tags.domain===e):[],o=new Map([...n,...s].map(c=>[c.id,c])),d=new Map([["voice",0],["glossary",1],["example",2]]),p=[...o.values()].filter(le).sort((c,a)=>(d.get(c.type)??3)-(d.get(a.type)??3)).slice(0,oe);if(p.length===0)return null;let g=["# prjct: selective guidance"];for(let c of p){let a=c.type==="example"?` ${c.tags.polarity}/${c.tags.domain}`:c.tags.domain?` ${c.tags.domain}`:"",u=X-g.join(`
18
- `).length-a.length-8;if(u<24)break;let m=k(c.content.replace(/\s+/g," ").trim(),Math.min(150,u));g.push(`- ${c.type}${a}: ${m}`)}return g.length===1?null:{text:k(g.join(`
19
- `),X),memoryIds:p.slice(0,g.length-1).map(c=>c.id)}}catch{return null}}l(de,"buildSelectiveGuidance");function pe(t,r){if(!r)return t;let e=t?`${t}
20
-
21
- ${r}`:r;return e.length<=Y?e:null}l(pe,"appendPromptSection");function Q(t,r){try{let e=T(r);if(e.length===0)return null;let i=I.searchFts(t,e,C),n=i.find(s=>s.type==="decision"||s.type==="gotcha"||s.type==="fact")??i.find(s=>s.type==="anti-pattern"||s.type==="pattern")??i.find(s=>s.type==="gotcha"||s.type==="anti-pattern");return n?n.type==="decision"||n.type==="gotcha"||n.type==="fact"?{cue:`> Tip\u2192user (SoT): ${S(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): ${S(n)} \`${n.id}\` \u2014 propose the live change in chat, then apply when editing`,memoryId:n.id}:{cue:`> Tip\u2192user: ${S(n)} \`${n.id}\``,memoryId:n.id}:null}catch{return null}}l(Q,"buildTopicalCueResult");function Ke(t,r,e){return Q(t,r)?.cue??null}l(Ke,"buildTopicalCue");var y=new Map,P={skipDiskSnapshotOnce:!1};function We(){y.clear(),P.skipDiskSnapshotOnce=!0}l(We,"_resetGitSnapshotCacheForTests");async function ge(t){let r=await f.stat(h.join(t,".git","index")).then(o=>o.mtimeMs).catch(()=>0),e=y.get(t);if(e&&e.expiresAt>Date.now()&&e.indexMtimeMs===r)return e.snapshot;let i=me(t);if(!e&&!P.skipDiskSnapshotOnce){let o=await f.readFile(i,"utf-8").then(d=>JSON.parse(d)).catch(()=>null);if(o&&o.expiresAt>Date.now()&&o.indexMtimeMs===r)return y.set(t,o),o.snapshot}P.skipDiskSnapshotOnce=!1;let n=await ye(t);y.size>32&&y.clear();let s={snapshot:n,expiresAt:Date.now()+ce,indexMtimeMs:r};return y.set(t,s),f.mkdir(h.dirname(i),{recursive:!0}).then(()=>f.writeFile(i,JSON.stringify(s))).catch(()=>{}),n}l(ge,"captureGit");function me(t){let r=E("sha1").update(h.resolve(t)).digest("hex").slice(0,16);return h.join(x.runDir(),`prompt-git-${r}.json`)}l(me,"gitSnapshotPath");function he(t,r){let e=E("sha1").update(h.resolve(r)).digest("hex").slice(0,12);return`${t.replace(/[^a-zA-Z0-9._-]/g,"_")}-${e}`}l(he,"promptHashKey");async function fe(t,r,e){let i=he(t,r),n=E("sha256").update(e).digest("hex");if(b.get(i)===n)return null;b.size>64&&b.clear(),b.set(i,n);let s=h.join(x.runDir(),`prompt-state-${i}.hash`);return(await f.readFile(s,"utf-8").catch(()=>"")).trim()===n?null:(await f.mkdir(h.dirname(s),{recursive:!0}).then(()=>f.writeFile(s,n)).catch(()=>{}),e)}l(fe,"dedupePromptPayload");async function ye(t){let r={branch:"",modified:0,staged:0,untracked:0,ahead:0},e=l(async c=>{try{return(await D("git",c,{cwd:t,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[i,n,s]=await Promise.all([e(["branch","--show-current"]),e(["status","--porcelain"]),e(["rev-list","--count","@{u}..HEAD"])]);if(!i)return r;let{modified:o,staged:d,untracked:p}=n.split(`
22
- `).filter(Boolean).reduce((c,a)=>{let u=a.slice(0,2);return u.startsWith("??")?c.untracked++:(u[0]!==" "&&u[0]!=="?"&&c.staged++,u[1]!==" "&&c.modified++),c},{modified:0,staged:0,untracked:0}),g=Number.parseInt(s,10)||0;return{branch:i,modified:o,staged:d,untracked:p,ahead:g}}l(ye,"captureGitUncached");function ee(t){if(!t)return"unknown";let r=Date.parse(t);if(Number.isNaN(r))return"unknown";let e=Math.max(0,Math.floor((Date.now()-r)/864e5));return e<1?"today":e<2?"yesterday":e<30?`${e}d ago`:`${Math.floor(e/30)}mo ago`}l(ee,"formatRelative");function te(t,r,e){let i=Q(t,r),n=N(t,r),s=z(r),o=de(t,r),d=[i?.cue,s,o?.text,n].filter(a=>!!a).reduce((a,u)=>pe(a,u)??a,k(e,Y)),p=!!(o?.text&&d.includes(o.text)),c=!!(s&&d.includes(s))?`delivery:${A(r)??"unknown"}`:p?o?.memoryIds[0]??null:null;return{prioritized:d,cueResult:i,guidance:o,guidanceIncluded:p,guidanceRuleId:c}}l(te,"computePromptGuidance");function Je(t=process.cwd(),r){return q({event:"UserPromptSubmit",projectPath:t,build:l(async(e,i)=>{let n=(e.prompt??"").trim();if(!n)return null;let s=await v.readConfig(i);if(!s?.projectId)return null;let o=await Z(i,s);if(!o)return null;let{prioritized:d,cueResult:p,guidance:g,guidanceIncluded:c,guidanceRuleId:a}=te(s.projectId,n,o);return j.set(e,{projectId:s.projectId,projectPath:i,bumpTurn:o.includes("Active work cycle:"),surfacedIds:[...p?[p.memoryId]:[],...c?g?.memoryIds??[]:[]],guidanceRuleId:a}),fe(s.projectId,i,d)},"build"),afterEmit:l(async(e,i)=>{let n=j.get(e)??await we(e,i);j.delete(e),n&&await Promise.all([n.bumpTurn?$.bumpTurnCount(n.projectId).then(()=>{}):Promise.resolve(),n.surfacedIds.length>0?B(n.projectId,n.projectPath,n.surfacedIds):Promise.resolve(),n.guidanceRuleId?Promise.resolve(K.recordGuidanceActivation(n.projectId,{ruleId:n.guidanceRuleId})).then(()=>{}):Promise.resolve()])},"afterEmit")},r)}l(Je,"runPromptHook");async function we(t,r){let e=(t.prompt??"").trim();if(!e)return null;let i=await v.readConfig(r).catch(()=>null);if(!i?.projectId)return null;let[n,s]=await Promise.all([$.getCurrentTask(i.projectId).catch(()=>null),Z(r,i)]),{cueResult:o,guidance:d,guidanceIncluded:p,guidanceRuleId:g}=te(i.projectId,e,s??"");return{projectId:i.projectId,projectPath:r,bumpTurn:!!n,surfacedIds:[...o?[o.memoryId]:[],...p?d?.memoryIds??[]:[]],guidanceRuleId:g}}l(we,"rebuildPromptAfterEmit");export{We as _resetGitSnapshotCacheForTests,z as buildDeliveryGuidance,Z as buildProjectState,de as buildSelectiveGuidance,Ke as buildTopicalCue,A as classifyDeliveryIntent,Je as runPromptHook};
@@ -1,8 +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{a,b,c,d}from"./chunk-NUJASVHN.mjs";import"./chunk-HRWXMF7P.mjs";import"./chunk-ZJXH76Q5.mjs";import"./chunk-PUHX3ECX.mjs";import"./chunk-Q3EYM4GJ.mjs";import"./chunk-AZYQFRPJ.mjs";import"./chunk-JR542RI2.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-ZMLA5SKR.mjs";import"./chunk-QPRNRLG6.mjs";import"./chunk-7JEKBJAP.mjs";import"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import"./chunk-DXQMKW2B.mjs";import"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GVNMXVVA.mjs";import"./chunk-DRGI5UHQ.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import"./chunk-E66B27AL.mjs";export{c as buildProjectIdentityLine,a as buildSessionContext,b as buildSubagentDigest,d as runSessionStartHook};
@@ -1,16 +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{a as oe,b as R,d as G}from"./chunk-PW3KYKVS.mjs";import{b as se}from"./chunk-HRWXMF7P.mjs";import{a as L}from"./chunk-NCOOKPXX.mjs";import{a as ie}from"./chunk-ZJXH76Q5.mjs";import{b as re}from"./chunk-2UC4DTDO.mjs";import{a as B}from"./chunk-Y3J7UUMR.mjs";import{a as te,b as ne}from"./chunk-TRMBRDKH.mjs";import"./chunk-TPESWBA7.mjs";import{b as ee}from"./chunk-FEFP6JOL.mjs";import{c as M}from"./chunk-QPRNRLG6.mjs";import{c as Z}from"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import{a as m}from"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import{g as et,h as tt}from"./chunk-UUULLTQV.mjs";import{a as Q,c as U}from"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-DRGI5UHQ.mjs";import"./chunk-GAOQHD5S.mjs";import{b as v}from"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import{a as V,b as Qe,e as b,f as Ze,g as j}from"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import{b as Y,h as qe,v as q,w as Ve}from"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import{e as _,g as x,l as A,p as K}from"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as c,b as X,e as z}from"./chunk-E66B27AL.mjs";import k from"node:fs/promises";import ze from"node:path";import nt from"node:crypto";import rt from"node:fs/promises";function P(n){return typeof n=="string"?n:Array.isArray(n)?n.map(t=>{if(typeof t=="string")return t;if(t&&typeof t=="object"&&"text"in t){let e=t.text;return typeof e=="string"?e:""}return""}).join(`
9
- `).trim():""}c(P,"textOf");function C(n){try{let t=X("node:fs"),s=X("node:path").join(n,".prjct","prjct.config.json"),r=t.readFileSync(s,"utf-8");return JSON.parse(r).projectId??null}catch{return null}}c(C,"projectIdFromPath");var ue="friction-detector",ae="friction-promote",ce=5,le=400,pe=160,st=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],it=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i],ot=[/\bdoesn'?t work\b/i,/\bbroken\b/i,/\bagain\b.*\bsame\b/i];async function de(n,t,e,s={}){let r=s.preloadedLines?s.preloadedLines:await rt.readFile(t,"utf-8").then(at).catch(()=>null);if(!r)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let i=ct(r);if(i.length===0)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let o=i.slice(0,ce).map(p=>({category:p.category,expectedBehavior:"Follow the user constraint without requiring correction.",observedBehavior:`The assistant response triggered user ${p.category}.`,relatedRuleId:null})),a=ft(n),l=C(n)??void 0;return{...await i.slice(0,ce).reduce(async(p,f)=>{let d=await p,y=ge(f.excerpt).slice(0,12);if(a.has(y))return await pt(n,l,f).catch(()=>{}),{...d,signalsSkipped:d.signalsSkipped+1};try{return await m.remember(n,{type:"improvement-signal",content:ut(f),tags:{source:ue,category:f.category,...s.runtime?{runtime:s.runtime}:{},...s.model?{model:s.model}:{},...e?{session:e}:{},key:y},provenance:"extracted",projectId:l}),a.add(y),{...d,signalsRecorded:d.signalsRecorded+1}}catch{return{...d,signalsSkipped:d.signalsSkipped+1}}},Promise.resolve({signalsRecorded:0,signalsSkipped:0})),failures:o}}c(de,"detectFriction");function at(n){return R(n)}c(at,"parseJsonl");function ct(n){let t={signals:[],lastAssistantText:""};for(let e of n){let s=e.role??e.message?.role,r=P(e.content??e.message?.content);if(!r)continue;if(s==="assistant"){t.lastAssistantText=r;continue}if(s!=="user")continue;let i=lt(r.slice(0,300));i&&t.signals.push({excerpt:r.slice(0,le).trim(),category:i,precedingAssistantPreview:t.lastAssistantText.slice(0,le).trim()})}return t.signals}c(ct,"extractSignals");function lt(n){return ot.some(t=>t.test(n))?"complaint":st.some(t=>t.test(n))?"negation":it.some(t=>t.test(n))?"correction":null}c(lt,"classify");function ut(n){let t=dt(n.category),e=fe(n.excerpt),s=e?`Obey developer constraint: ${e}`:t.lesson,r=e?`Always: ${e}`:t.nextAction;return[`[${n.category}] Lesson: ${s}`,"What happened: The user pushed back after the assistant response.",`Why it mattered: ${t.why}`,`Pattern: ${t.pattern}`,`Anti-pattern: ${t.antiPattern}`,`Next action: ${r}`].join(`
10
- `)}c(ut,"formatSignal");function fe(n){let t=n.replace(/\s+/g," ").trim();if(!t)return null;let e=t.replace(/^\s*(?:nope|no|stop|wait|cancel)[,.!\s:—-]*/i,"").trim(),s=e.match(/\bshould be\b\s+(.+?)$/i);if(s?.[1])return T(`Prefer ${s[1]}`);let r=e.match(/^(.+?)\s+rather than\s+(.+?)$/i);if(r?.[1]&&r[2])return T(`Prefer ${r[1].trim()} rather than ${r[2].trim()}`);let i=e.match(/\b(?:use|prefer|do|run|ship|write|keep)\s+(.+?)\s+instead(?:\s+of\s+(.+))?$/i);if(i?.[1]){let u=i[2]?` instead of ${i[2].trim()}`:" instead";return T(`Use ${i[1].trim()}${u}`)}let o=e.match(/\binstead of\b\s+(.+?)$/i);if(o?.[1])return T(`Avoid ${o[1].trim()}`);let a=e.match(/\b(?:don'?t|do not|never)\s+(.+?)$/i);if(a?.[1])return T(`Never ${a[1].trim()}`);let l=e.match(/\balways\s+(.+?)$/i);if(l?.[1])return T(`Always ${l[1].trim()}`);if(e.length>=12&&e.length<=pe&&/^(?:run|use|do|ship|write|keep|add|fix|remove|prefer|test|check|verify|read|ask|stop|start)\b/i.test(e)){let u=e.charAt(0).toUpperCase()+e.slice(1);return T(u.replace(/[.!?]+$/,""))}return null}c(fe,"extractSpecificConstraint");function T(n){let t=n.replace(/\s+/g," ").trim().replace(/^[-*•]\s+/,"").replace(/[.!?]+$/,"").slice(0,pe);return t.length<12||/^(?:nope|no|stop|wait|cancel)\b/i.test(t)?null:t}c(T,"cleanConstraint");async function pt(n,t,e){if(!t)return;let s=fe(e.excerpt);if(!s)return;let r=`Always: ${s}`,i=`fp:${ge(s).slice(0,12)}`;try{if(m.recall(t,{types:["feedback"],tags:{source:ae,key:i},limit:1,dedupeByKey:!1}).length>0)return;await m.remember(n,{type:"feedback",content:r,tags:{source:ae,key:i,category:e.category,from:"recurring-friction"},provenance:"extracted",projectId:t})}catch{}}c(pt,"maybePromoteStandingPreference");function dt(n){return n==="complaint"?{lesson:"Treat explicit failure complaints as evidence that the last result needs diagnosis, not repetition.",why:"The user reported that the delivered behavior or command did not work.",pattern:"User names a broken or non-working result after an assistant action.",antiPattern:"Retrying the same path or moving on without isolating the failure.",nextAction:"Stop, inspect the failing output or assumption, and propose the smallest verifiable fix."}:n==="correction"?{lesson:"Update the working assumption when the user corrects the intended direction.",why:"The assistant was using an assumption that did not match what the user wanted.",pattern:"User redirects the implementation or workflow with a correction.",antiPattern:"Continuing with the original plan after the user clarified a different target.",nextAction:"Restate the corrected target as an actionable rule before continuing."}:{lesson:"Recalibrate before continuing when the user rejects the assistant\u2019s last step.",why:"The assistant likely violated sequencing, scope, or approval expectations.",pattern:"User immediately rejects an assistant action or proposed next step.",antiPattern:"Treating the rejected action as acceptable and continuing without changing course.",nextAction:"Pause, convert the pushback into a workflow constraint, and adjust the next tool use."}}c(dt,"lessonTemplate");function ge(n){let t=n.toLowerCase().replace(/\s+/g," ").trim();return nt.createHash("sha256").update(t).digest("hex")}c(ge,"hashSignal");function ft(n){try{let t=C(n);if(!t)return new Set;let e=m.recall(t,{types:["improvement-signal"],tags:{source:ue},limit:100,dedupeByKey:!1}),s=new Set;for(let r of e){let i=r.tags.key;i&&s.add(i)}return s}catch{return new Set}}c(ft,"projectMemoryHashes");var gt=32;function me(n={}){let e=(n.hookHost===void 0?process.env.PRJCT_HOOK_HOST:n.hookHost)?.trim().toLowerCase().slice(0,gt);return e&&te.has(e)?e:n.detectedRuntime??ne()}c(me,"resolveInstructionRuntime");K();function he(n){try{return JSON.parse(n)}catch{return null}}c(he,"safeJsonParse");function S(n,t,e,s){let r=[];try{let{prjctDb:i}=(j(),z(Ze)),o=i.query(n,t,...e);for(let a of o){let l=he(a.data);if(!l||typeof l!="object")continue;let u=l.tags;if(!u)continue;let p=s(u,l);p!==void 0&&r.push(p)}}catch{}return r}c(S,"collectFromPersistedEvents");var we="lean-detector",mt="lean-debt-growth",ht=3,ye=["off","lite","full","ultra"];function yt(n){let t=n?.lean?.mode;if(t&&ye.includes(t))return t;let e=process.env.PRJCT_LEAN_MODE?.toLowerCase();return e&&ye.includes(e)?e:"off"}c(yt,"effectiveMode");async function be(n,t){let e={active:!1,total:0,previous:0,persisted:!1},s=t!==void 0?t:await v.readConfig(n).catch(()=>null);if(!s?.projectId||yt(s)==="off")return e;e.active=!0;try{let r=await wt(n);if(e.total=r,r===0)return e;let i=bt(s.projectId);e.previous=i;let o=r-i;i>0&&o>=ht&&(await m.remember(n,{type:"lean-debt",content:`Lean debt growing: \`lean:\` markers rose by ${o} (now ${r}, was ${i}). Deferred simplifications are accumulating \u2014 consider a leaning pass via \`prjct lean debt\`.`,tags:{source:we,pattern:mt,total:String(r),previous:String(i),delta:String(o)},provenance:"inferred",projectId:s.projectId}),e.persisted=!0)}catch{}return e}c(be,"detectAndPersistLeanDebt");async function wt(n){let t=await _(["grep","-cI","-e","lean:"],{cwd:n,maxBuffer:16777216});if(!t.ok){if(x(t,1))return 0;A(t)}return t.stdout.split(`
11
- `).reduce((e,s)=>{let r=s.lastIndexOf(":");if(r<=0)return e;let i=Number.parseInt(s.slice(r+1),10);return Number.isFinite(i)?e+i:e},0)}c(wt,"measureLeanMarkers");function bt(n){return S(n,"SELECT data FROM events WHERE type = 'memory.remember.lean-debt' ORDER BY id DESC LIMIT 50",[],e=>{if(e.source!==we)return;let s=typeof e.total=="string"?Number.parseInt(e.total,10):0;return Number.isFinite(s)?s:void 0})[0]??0}c(bt,"collectPreviousSnapshot");import St from"node:path";K();var kt="hot-file",Se="pattern-detector-auto",vt="recurring-bug",ke="pattern-detector-recurring",Rt="tech-debt-growth",ve="pattern-detector-debt",D=7,Tt=3,O=30,Et=2,_t=5,At=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];async function Re(n,t){let e={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},s=t!==void 0?t:await v.readConfig(n).catch(()=>null);if(!s?.projectId)return e.errors.push("no project config"),e;try{let r=await Ct(n);if(e.scanned+=r.length,e.hotFiles=r,r.length>0){let i=Pt(s.projectId);for(let o of r){if(i.has(o.path)){e.skipped.push({reason:"already-marked-this-window",file:o.path});continue}try{await m.remember(n,{type:"learning",content:`Hot file: \`${o.path}\` \u2014 ${o.touches} touches in the last ${D} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:Se,pattern:kt,file:o.path,touches:String(o.touches),window_days:String(D)},provenance:"inferred"}),e.persisted+=1}catch(a){e.errors.push(`remember failed for ${o.path}: ${a.message}`)}}}}catch(r){e.errors.push(`hot-file detection failed: ${r.message}`)}try{let r=xt(s.projectId);if(r.length>0){let i=Dt(s.projectId);for(let o of r){if(i.has(o.topic)){e.skipped.push({reason:"recurring-bug-already-marked",file:o.topic});continue}try{await m.remember(n,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${o.topic}\` reported ${o.occurrences} times in the last ${O} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:ke,pattern:vt,topic:o.topic,occurrences:String(o.occurrences),window_days:String(O)},provenance:"inferred"}),e.persisted+=1}catch(a){e.errors.push(`remember failed for recurring ${o.topic}: ${a.message}`)}}}}catch(r){e.errors.push(`recurring-bug detection failed: ${r.message}`)}try{let r=await Mt(n);if(r.totalCount>0){let i=Lt(s.projectId),o=r.totalCount-i;if(i>0&&o>=_t)try{await m.remember(n,{type:"learning",content:`Tech debt growing: TODO/FIXME/XXX count rose by ${o} (now ${r.totalCount}, was ${i}). Consider a focused debt-reduction pass before adding more features.`,tags:{source:ve,pattern:Rt,total:String(r.totalCount),previous:String(i),delta:String(o)},provenance:"inferred"}),e.persisted+=1}catch(a){e.errors.push(`remember failed for tech-debt: ${a.message}`)}}}catch(r){e.errors.push(`tech-debt detection failed: ${r.message}`)}return e}c(Re,"detectAndPersistPatterns");async function Ct(n){let t=await _(["log",`--since=${D}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:n,maxBuffer:16777216,timeoutMs:15e3});if(!t.ok){if(t.kind==="exit")return[];A(t)}let e=new Map;for(let r of t.stdout.split("\0")){let i=r.trim();i&&(It(i)||e.set(i,(e.get(i)??0)+1))}let s=[];for(let[r,i]of e)i<Tt||s.push({path:r,touches:i});return s.sort((r,i)=>i.touches-r.touches),s}c(Ct,"detectHotFiles");function It(n){let t=St.basename(n);for(let e of At)if(e.test(n)||e.test(t))return!0;return!1}c(It,"isIgnored");function xt(n){let t=new Date(Date.now()-O*24*60*60*1e3).toISOString(),e=S(n,"SELECT data, timestamp FROM events WHERE type = 'memory.remember.gotcha' AND timestamp >= ? ORDER BY id DESC LIMIT 500",[t],i=>{if(i.source==="transcript-auto")return;let o=typeof i.topic=="string"?i.topic:void 0,a=typeof i.area=="string"?i.area:void 0;return(o??a)||void 0}),s=new Map;for(let i of e)s.set(i,(s.get(i)??0)+1);let r=[];for(let[i,o]of s)o<Et||r.push({topic:i,occurrences:o});return r.sort((i,o)=>o.occurrences-i.occurrences),r}c(xt,"detectRecurringBugs");async function Mt(n){let t=await _(["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:n,maxBuffer:16777216});if(!t.ok){if(x(t,1))return{totalCount:0};A(t)}return{totalCount:t.stdout.split(`
12
- `).reduce((s,r)=>{let i=r.lastIndexOf(":");if(i<=0)return s;let o=Number.parseInt(r.slice(i+1),10);return Number.isFinite(o)?s+o:s},0)}}c(Mt,"measureTechDebt");function Lt(n){return S(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50",[],e=>{if(e.source!==ve)return;let s=typeof e.total=="string"?Number.parseInt(e.total,10):0;return Number.isFinite(s)?s:void 0})[0]??0}c(Lt,"collectPreviousDebtSnapshot");function Pt(n){let t=Date.now()-D*24*60*60*1e3,e=S(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200",[],(s,r)=>{if(s.source!==Se)return;let i=s.file,o=r.rememberedAt;if(typeof i=="string"){if(typeof o=="string"){let a=Date.parse(o);if(!Number.isNaN(a)&&a<t)return}return i}});return new Set(e)}c(Pt,"collectAlreadyMarkedHotFiles");function Dt(n){let t=Date.now()-O*24*60*60*1e3,e=S(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200",[],(s,r)=>{if(s.source!==ke)return;let i=s.topic,o=r.rememberedAt;if(typeof i=="string"){if(typeof o=="string"){let a=Date.parse(o);if(!Number.isNaN(a)&&a<t)return}return i}});return new Set(e)}c(Dt,"collectAlreadyMarkedRecurringBugs");Ve();Qe();import I from"node:fs/promises";import Te from"node:path";j();var Ot={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};function Nt(n=process.env){let t=(n.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return Ot[t==="conservative"||t==="standard"||t==="aggressive"?t:"standard"]}c(Nt,"resolveProfile");async function $t(n,t){let e=Date.now()-t*24*60*60*1e3,r=m.recall(n,{types:["inbox"],limit:200}).filter(o=>Date.parse(o.rememberedAt)<e);if(r.length===0)return 0;let i=[];for(let o of r)try{U.archive(n,{entityType:"memory_entry",entityId:o.id,entityData:{type:o.type,content:o.content,tags:o.tags,rememberedAt:o.rememberedAt},summary:o.content.slice(0,80),reason:`inbox-age-out (>${t}d)`});let a=o.id.startsWith("mem_")?o.id.slice(4):null;a&&b.run(n,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(a)),b.run(n,"UPDATE memory_entries SET deleted_at = ? WHERE id = ?",Date.now(),o.id),i.push(o.id)}catch{}return i.length}c($t,"archiveAgedInbox");async function Ht(n,t){if(t===null)return 0;let e=Te.join(q.getGlobalProjectPath(n),"checkpoints"),s=await I.readdir(e).catch(()=>null);if(!s)return 0;let r=Date.now()-t*24*60*60*1e3,i=[];for(let o of s){if(!o.endsWith(".json"))continue;let a=Te.join(e,o);try{(await I.stat(a)).mtimeMs<r&&(await I.unlink(a),i.push(a))}catch{}}return i.length}c(Ht,"pruneOldCheckpoints");async function Ft(){let{getVerifyCachePath:n}=await import("./context7-service-V7CIDF3Q.mjs"),t=n();try{let e=await I.stat(t);if((Date.now()-e.mtimeMs)/(1440*60*1e3)>7)return await I.unlink(t),!0}catch{}return!1}c(Ft,"rotateContext7Cache");async function Ee(n){let t=Nt(),e={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{e.inboxArchived=await $t(n,t.inboxDays)}catch{}try{e.archivesPruned=U.pruneOldArchives(n,t.archivesDays)}catch{}try{e.checkpointsRemoved=await Ht(n,t.checkpointsDays)}catch{}try{e.context7CacheRotated=await Ft()}catch{}return e}c(Ee,"runSessionCleanup");async function _e(n,t){if(t.inboxArchived+t.archivesPruned+t.checkpointsRemoved+(t.context7CacheRotated?1:0)===0)return;let r=`Session cleanup: ${[t.inboxArchived>0?`${t.inboxArchived} inbox archived`:null,t.archivesPruned>0?`${t.archivesPruned} archives pruned`:null,t.checkpointsRemoved>0?`${t.checkpointsRemoved} checkpoints removed`:null,t.context7CacheRotated?"context7 cache rotated":null].filter(i=>!!i).join(", ")}`;b.appendEvent(n,"memory.remember.system-event",{content:r,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted",content_hash:V(r),project_id:n})}c(_e,"recordCleanupReport");import jt from"node:crypto";import Ut from"node:fs/promises";import{z as w}from"zod";qe();j();var Ce="crew-run:",Ae=w.object({id:w.string().min(1),spec_id:w.string().nullable().default(null),task_id:w.string().nullable().default(null),started_at:w.string().min(1),ended_at:w.string().min(1),implementer_summary:w.string().default(""),files_touched:w.array(w.string()).default([]),reviewer_verdict:w.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:w.string().nullable().default(null)});function N(n){return`${Ce}${n}`}c(N,"keyFor");var J=class{static{c(this,"CrewRunStorage")}record(t,e){let s=e.runId??Q(),r=b.getDoc(t,N(s));if(r)return r;let i=Y(),o=Ae.parse({id:s,spec_id:e.specId??null,task_id:e.taskId??null,started_at:e.startedAt??i,ended_at:e.endedAt??i,implementer_summary:e.implementerSummary,files_touched:e.filesTouched,reviewer_verdict:e.reviewerVerdict,reviewer_notes:e.reviewerNotes??null});return b.setDoc(t,N(s),o),o}get(t,e){return b.getDoc(t,N(e))}list(t){return b.listDocsByPrefix(t,Ce).map(s=>Ae.parse(s.data))}delete(t,e){b.deleteDoc(t,N(e))}},Ie=new J;var Pe="skill-miss-detector",xe=3,Bt=280,Gt=["decision","gotcha","anti-pattern"],Jt=5400*1e3,Wt=360*60*1e3,Xt=2,De=5,zt=8,Oe=new Set(["should","because","project","prjct","instead","always","never","using","value","state","change","changes","update","updated","function","return","returns","error","errors","tests","testing","config","default","import","export","before","after","without"]);async function Ne(n,t,e,s={}){let r=s.preloadedLines?s.preloadedLines:await Ut.readFile(t,"utf-8").then(Yt).catch(()=>null);if(!r)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let i=C(n);if(!i)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let o=qt(r);if(!o)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let a=(()=>{try{return en(i,e)}catch{return null}})();if(!a)return{signalsRecorded:0,signalsSkipped:0,failures:[]};if(a.length===0)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let l=await ee(n).catch(()=>[]),u=(()=>{try{let h=Date.now()-Wt;return new Set(Ie.list(i).filter(g=>Date.parse(g.ended_at)>h).flatMap(g=>g.files_touched))}catch{return new Set}})(),p=Kt(o,l,a,u);if(p.length===0)return{signalsRecorded:0,signalsSkipped:0,failures:[]};let f=tn(i),d=[];for(let h of p.slice(0,xe)){let g=Zt(h.memId,h.excerpt).slice(0,12);if(f.has(g)){d.push("skipped");continue}try{await m.remember(n,{type:"improvement-signal",content:Qt(h),tags:{source:Pe,kind:"skill-miss",category:"skill-miss",...s.runtime?{runtime:s.runtime}:{},...s.model?{model:s.model}:{},relates:h.memId,file:h.evidenceFile,key:g,...e?{session:e}:{}},provenance:"extracted",projectId:i}),M.penalizeSkillMiss(i,h.memId),d.push("recorded")}catch{d.push("skipped")}}let y=d.filter(h=>h==="recorded").length,W=d.filter(h=>h==="skipped").length;return{signalsRecorded:y,signalsSkipped:W,failures:p.slice(0,xe).map(h=>({category:"skill-miss",expectedBehavior:`Apply relevant project rule ${h.memId}.`,observedBehavior:"Relevant project knowledge was not referenced in the session.",relatedRuleId:h.memId}))}}c(Ne,"detectSkillMisses");function Kt(n,t,e,s=new Set){let r=Me(n);if(r.size===0)return[];let i=t.filter(l=>!s.has(l)),o=$(i),a=[];for(let l of e){let u=Me(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let p=l.fileTag!==""&&i.some(g=>Le(g,l.fileTag))||[...o].some(g=>u.has(g)),f=Vt(u),d=[...u].filter(g=>!f.has(g)&&r.has(g)).length;if(!(p||d>=Xt)||[...f].some(g=>r.has(g)))continue;let h=l.fileTag!==""&&i.some(g=>Le(g,l.fileTag))?l.fileTag:i.find(g=>[...$([g])].some(Ye=>u.has(Ye)))??"";a.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,Bt),evidenceFile:h,reason:p?"path-overlap-unused":"topic-overlap-unused"},rank:p?2:1,overlap:d})}return a.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),a.map(l=>l.miss)}c(Kt,"analyze");function Yt(n){return R(n)}c(Yt,"parseJsonl");function qt(n){let t=[];for(let e of n){let s=e.role??e.message?.role;if(s!=="user"&&s!=="assistant")continue;let r=P(e.content??e.message?.content);r&&t.push(r)}return t.join(`
13
- `).toLowerCase()}c(qt,"transcriptTextOf");function Me(n){let t=new Set;for(let e of n.toLowerCase().split(/[^a-z0-9]+/))e.length<De||Oe.has(e)||t.add(e);return t}c(Me,"tokenize");function Vt(n){let t=[...n].filter(s=>s.length>=zt);if(t.length>0)return new Set(t);let e=[...n].sort((s,r)=>r.length-s.length||s.localeCompare(r))[0]??"";return e?new Set([e]):new Set}c(Vt,"signatureOf");function $(n){let t=new Set;for(let e of n)for(let s of e.split("/")){let r=s.replace(/\.[a-z0-9]+$/i,"").toLowerCase();r.length>=De&&!Oe.has(r)&&t.add(r)}return t}c($,"fileStems");function Le(n,t){let e=$([n]);for(let s of $([t]))if(e.has(s))return!0;return!1}c(Le,"sharesStem");function Qt(n){let t=n.evidenceFile!==""?`touched \`${n.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${n.memType}, ${n.memId}): "${n.excerpt}"`,`This session ${t} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${n.memId}`].join(`
14
- `)}c(Qt,"formatSkillMiss");function Zt(n,t){let e=`${n}::${t.toLowerCase().replace(/\s+/g," ").trim()}`;return jt.createHash("sha256").update(e).digest("hex")}c(Zt,"hashKey");function en(n,t){let e=m.recall(n,{types:[...Gt],limit:120}),s=Date.now()-Jt,r=[];for(let i of e)i.provenance!=="inferred"&&(Date.parse(i.rememberedAt)>s||t&&i.tags.session===t||r.push({id:i.id,type:i.type,content:i.content,fileTag:i.tags.file??"",rememberedAt:i.rememberedAt,provenance:i.provenance,session:i.tags.session??""}));return r}c(en,"recallCandidates");function tn(n){try{let t=m.recall(n,{types:["improvement-signal"],tags:{source:Pe},limit:100,dedupeByKey:!1}),e=new Set;for(let s of t)s.tags.key&&e.add(s.tags.key);return e}catch{return new Set}}c(tn,"existingSkillMissKeys");import nn from"node:crypto";import rn from"node:fs/promises";var Fe="transcript-auto",sn="v2",je=80,Ue=20,H=1500,on=12,$e=4,an=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"we will use",type:"decision"},{phrase:"shipping with",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"root cause is",type:"learning"},{phrase:"root cause was",type:"learning"},{phrase:"the fix is",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"},{phrase:"never do this",type:"gotcha"},{phrase:"trap:",type:"gotcha"},{phrase:"important:",type:"fact"},{phrase:"always use",type:"fact"},{phrase:"never write",type:"fact"},{phrase:"the pattern is",type:"pattern"},{phrase:"anti-pattern:",type:"anti-pattern"},{phrase:"antipattern:",type:"anti-pattern"}],Be=[{re:/^(?:[-*•]\s+)?(?:\*\*)?decision(?:\*\*)?\s*[:—-]\s+/i,type:"decision",phrase:"label:decision"},{re:/^(?:[-*•]\s+)?(?:\*\*)?(learning|insight)(?:\*\*)?\s*[:—-]\s+/i,type:"learning",phrase:"label:learning"},{re:/^(?:[-*•]\s+)?(?:\*\*)?(gotcha|trap|warning)(?:\*\*)?\s*[:—-]\s+/i,type:"gotcha",phrase:"label:gotcha"},{re:/^(?:[-*•]\s+)?(?:\*\*)?(fact|note)(?:\*\*)?\s*[:—-]\s+/i,type:"fact",phrase:"label:fact"},{re:/^(?:[-*•]\s+)?(?:\*\*)?root\s*cause(?:\*\*)?\s*[:—-]\s+/i,type:"learning",phrase:"label:root-cause"},{re:/^(?:[-*•]\s+)?(?:\*\*)?pattern(?:\*\*)?\s*[:—-]\s+/i,type:"pattern",phrase:"label:pattern"},{re:/^(?:[-*•]\s+)?(?:\*\*)?anti[- ]?pattern(?:\*\*)?\s*[:—-]\s+/i,type:"anti-pattern",phrase:"label:anti-pattern"}];async function Ge(n,t,e,s={}){let r={scanned:0,ingested:0,skipped:[],errors:[]},i=s.preloadedConfig!==void 0?s.preloadedConfig:await v.readConfig(n).catch(()=>null);if(!i?.projectId)return r.errors.push("no project config"),r;let o=await(async()=>{if(s.preloadedLines)return s.preloadedLines;try{return R(await rn.readFile(t,"utf-8"))}catch(d){return r.errors.push(`transcript read failed: ${d.message}`),null}})();if(o===null)return r;let a=cn(o),l=ln(o);if(r.scanned=a.length+l.length,a.length===0&&l.length===0)return r;let u=[...fn(a),...pn(l)];if(u.length===0)return r;let p=mn(i.projectId),f=e?e.slice(0,12):"unknown";for(let d of u){if(p.has(d.hash)){r.skipped.push({reason:"duplicate",phrase:d.matchedPhrase});continue}try{await m.remember(n,{type:d.type,content:d.content,tags:{source:Fe,capture:sn,session:f,hash:d.hash,phrase:d.matchedPhrase},provenance:"inferred",projectId:i.projectId}),r.ingested+=1}catch(y){r.errors.push(`remember failed: ${y.message}`)}}return r}c(Ge,"ingestTranscript");function cn(n){let t=[];for(let e of n){let s=Je(e);if(s!=="assistant")continue;let r=We(e);!r||r.length<je||t.push({role:s,text:r})}return t}c(cn,"projectMessages");function ln(n){let t=[];for(let e of n){let s=Je(e);if(s!=="user")continue;let r=We(e);!r||r.length<Ue||t.push({role:s,text:r})}return t}c(ln,"projectUserMessages");var un=[{re:/^(?:please\s+)?always\b/i,phrase:"user:always"},{re:/^(?:please\s+)?never\b/i,phrase:"user:never"},{re:/\bi (?:always|never|prefer)\b/i,phrase:"user:i-prefer"},{re:/^(?:rule|preference)\s*[:—-]/i,phrase:"user:rule"},{re:/\bno more\s+(?:features?|feature\s+creep)\b/i,phrase:"user:no-more-features"},{re:/\bdon'?t add (?:more )?(?:features?|surface)\b/i,phrase:"user:dont-add-features"}];function pn(n){let t=[],e=new Set;for(let s of n){if(t.length>=$e)break;let r=s.text.split(/\n/).map(o=>o.replace(/^[-*•]\s+/,"").trim()).filter(o=>o.length>=Ue),i=r.length>0?r:[s.text.trim()];for(let o of i){if(t.length>=$e)break;let a=un.find(p=>p.re.test(o));if(!a)continue;let l=o.length>H?`${o.slice(0,H)}\u2026`:o,u=Xe(l);e.has(u)||(e.add(u),t.push({type:"feedback",content:l,hash:u,matchedPhrase:a.phrase}))}}return t}c(pn,"extractUserPreferenceCandidates");function Je(n){let t=n.role;if(typeof t=="string")return He(t);let e=n.message;if(e&&typeof e=="object"&&"role"in e){let r=e.role;if(typeof r=="string")return He(r)}let s=n.type;return s==="assistant"||s==="user"||s==="system"?s:null}c(Je,"inferRole");function He(n){let t=n.toLowerCase();return t==="assistant"||t==="user"||t==="system"?t:null}c(He,"normalizeRole");function We(n){let t=n.content===void 0&&n.message&&typeof n.message=="object"?n.message.content:n.content;if(typeof t=="string")return t.trim();if(Array.isArray(t)){let e=[];for(let s of t){if(!s||typeof s!="object")continue;let r=s;r.type==="text"&&typeof r.text=="string"&&e.push(r.text)}return e.join(`
15
- `).trim()}return""}c(We,"extractText");function dn(n){let t=n.trim();if(t.length<je)return null;for(let r of Be)if(r.re.test(t))return{type:r.type,matchedPhrase:r.phrase};let e=t.toLowerCase(),s=an.find(r=>e.includes(r.phrase));return s?{type:s.type,matchedPhrase:s.phrase}:null}c(dn,"classifyCaptureParagraph");function fn(n){let t=[],e=new Set;for(let s of n){let r=gn(s.text);for(let i of r){if(t.length>=on)return t;let o=dn(i);if(!o)continue;let a=i.length>H?`${i.slice(0,H)}\u2026`:i,l=Xe(a);e.has(l)||(e.add(l),t.push({type:o.type,content:a,hash:l,matchedPhrase:o.matchedPhrase}))}}return t}c(fn,"extractCandidates");function gn(n){let t=n.split(/\n\s*\n/).map(s=>s.trim()).filter(Boolean),e=[];for(let s of t){let r=s.split(`
16
- `).map(o=>o.trim()).filter(Boolean);if(r.some(o=>Be.some(a=>a.re.test(o)))&&r.length>1)for(let o of r)e.push(o);else e.push(s)}return e}c(gn,"splitParagraphs");function Xe(n){return nn.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}c(Xe,"hashContent");function mn(n){try{let{REMEMBER_EVENT_RANGE:t}=(tt(),z(et)),e=S(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",[...t],s=>{if(s.source!==Fe)return;let r=s.hash;return typeof r=="string"?r:void 0});return new Set(e)}catch{return new Set}}c(mn,"collectExistingAutoHashes");var F=600*1e3,E=new Map;function hn(n){let t=n.replace(/[^a-zA-Z0-9._-]/g,"_");return ze.join(re.runDir(),`stop-heavy-${t}.stamp`)}c(hn,"heavyStepStampPath");async function Ke(n,t,e=!0){if(await k.stat(n).then(i=>t-i.mtimeMs<F).catch(()=>!1))return!1;let r=`${n}.lock`;try{await k.mkdir(r)}catch(i){if(i.code!=="EEXIST")throw i;return!await k.stat(r).then(a=>t-a.mtimeMs>=F).catch(()=>!1)||!e?!1:(await k.rmdir(r).catch(()=>{}),Ke(n,t,!1))}try{return await k.stat(n).then(o=>t-o.mtimeMs<F).catch(()=>!1)?!1:(await k.writeFile(n,String(t)),!0)}finally{await k.rmdir(r).catch(()=>{})}}c(Ke,"claimHeavyStep");async function yn(n){let t=Date.now(),e=E.get(n)??0;if(t-e<F)return!1;try{let s=hn(n);await k.mkdir(ze.dirname(s),{recursive:!0});let r=await Ke(s,t);return E.size>32&&E.clear(),E.set(n,t),r}catch{}return E.size>32&&E.clear(),E.set(n,t),!0}c(yn,"heavyStepsDue");function Wr(n=process.cwd(),t){return ie({event:"Stop",projectPath:n,afterEmit:c(async(e,s)=>{let r=await v.readConfig(s).catch(()=>null);if(!r?.projectId)return;let i=me(),o=await yn(r.projectId),a={};if(o&&e.transcript_path){let u=await k.readFile(e.transcript_path,"utf-8").catch(()=>null);u!==null&&(a.transcriptLines=R(u))}let l=oe(a.transcriptLines??[]);if(o)try{let{collectActiveTasks:u}=await import("./task-overview-ITY5OSHX.mjs"),p=await u(r.projectId,s);a.activeTaskId=p.current?.id,a.activeTaskDescription=p.current?.description,a.activeTaskStartedAt=p.current?.startedAt}catch{}if(a.transcriptLines&&a.transcriptLines.length>0)try{if(a.transcriptUsage=G(a.transcriptLines),a.transcriptUsage.tokensIn+a.transcriptUsage.tokensOut>0){let u=a.activeTaskStartedAt?{sinceIso:a.activeTaskStartedAt}:void 0,p=G(a.transcriptLines,u);if(a.activeTaskId&&p.tokensIn+p.tokensOut>0){B(r.projectId,a.activeTaskId,p.tokensIn,p.tokensOut,{description:a.activeTaskDescription,agent:i,source:`${i}-transcript`});try{let{sumTranscriptUsageByModel:f}=await import("./transcript-jsonl-6X4DDD6R.mjs");for(let[d,y]of f(a.transcriptLines,u))y.tokensIn+y.tokensOut<=0||B(r.projectId,a.activeTaskId,y.tokensIn,y.tokensOut,{model:d,agent:i,source:`${i}-transcript:${d}`})}catch{}}}}catch{}if(se({projectId:r.projectId,sessionId:e.session_id,directory:s,taskId:a.activeTaskId,goal:a.activeTaskDescription,tokensIn:a.transcriptUsage?.tokensIn,tokensOut:a.transcriptUsage?.tokensOut,agent:i,model:l}),o&&e.transcript_path)try{await Ge(s,e.transcript_path,e.session_id??null,{preloadedConfig:r,preloadedLines:a.transcriptLines})}catch{}if(o){try{await Re(s,r)}catch{}try{await be(s,r)}catch{}try{let u=await Ee(r.projectId);await _e(r.projectId,u),L.pruneRetained(r.projectId)}catch{}}if(o&&e.transcript_path)try{let u=await de(s,e.transcript_path,e.session_id??null,{preloadedLines:a.transcriptLines,runtime:i,model:l});for(let p of u.failures)try{L.record(r.projectId,{source:"friction-detector",runtime:i,model:l,sessionId:e.session_id??null,taskId:a.activeTaskId??null,...p})}catch{}u.signalsRecorded>0&&a.activeTaskId&&M.penalizeSurfaced(r.projectId,a.activeTaskId)}catch{}if(o&&e.transcript_path)try{let u=await Ne(s,e.transcript_path,e.session_id??null,{preloadedLines:a.transcriptLines,runtime:i,model:l});for(let p of u.failures)try{L.record(r.projectId,{source:"skill-miss-detector",runtime:i,model:l,sessionId:e.session_id??null,taskId:a.activeTaskId??null,...p})}catch{}}catch{}if(o)try{await Z.backfill(r.projectId,r,new Date().toISOString())}catch{}if(o&&a.activeTaskId){let u={projectId:r.projectId,projectPath:s,cycleDescription:a.activeTaskDescription??null,cycleId:a.activeTaskId,tokensIn:a.transcriptUsage?.tokensIn,tokensOut:a.transcriptUsage?.tokensOut,model:l},p=c(async f=>{try{await f()}catch{}},"runBestEffort");await p(async()=>{let{synthesizeLandHandoff:f}=await import("./land-synthesis-WG5JAS7B.mjs");await f(u)}),await p(async()=>{let{synthesizeJudgmentReceipt:f}=await import("./judgment-receipt-GWSSCLAB.mjs");await f(u)})}try{let{flushIfLinked:u}=await import("./auto-flush-BN6L6QHO.mjs");await u(s,r)}catch{}},"afterEmit")},t)}c(Wr,"runStopHook");export{hn as heavyStepStampPath,yn as heavyStepsDue,Wr as runStopHook};
@@ -1,8 +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 a}from"./chunk-NUJASVHN.mjs";import"./chunk-HRWXMF7P.mjs";import{a as i}from"./chunk-ZJXH76Q5.mjs";import"./chunk-PUHX3ECX.mjs";import"./chunk-Q3EYM4GJ.mjs";import"./chunk-AZYQFRPJ.mjs";import"./chunk-JR542RI2.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-ZMLA5SKR.mjs";import"./chunk-QPRNRLG6.mjs";import"./chunk-7JEKBJAP.mjs";import"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import"./chunk-DXQMKW2B.mjs";import"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GVNMXVVA.mjs";import"./chunk-DRGI5UHQ.mjs";import"./chunk-GAOQHD5S.mjs";import{b as n}from"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import{d as e,g as m}from"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import{a as o}from"./chunk-E66B27AL.mjs";m();function l(c=process.cwd(),p){return i({event:"SubagentStart",projectPath:c,build:o((u,t)=>a(t),"build"),afterEmit:o(async(u,t)=>{try{let r=await n.readConfig(t);if(!r?.projectId)return;let{collectActiveTasks:s}=await import("./task-overview-ITY5OSHX.mjs"),d=await s(r.projectId,t);e.appendEvent(r.projectId,"subagent.spawned",{taskId:d.current?.id??null})}catch{}},"afterEmit")},p)}o(l,"runSubagentStartHook");export{l as runSubagentStartHook};
@@ -1,8 +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 a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i}from"./chunk-2HB2JHQE.mjs";import"./chunk-XE4MJNBQ.mjs";import"./chunk-C3W2HLJT.mjs";import"./chunk-H4CA3XZ6.mjs";import"./chunk-4O4D6DV7.mjs";import"./chunk-JCYXFHQZ.mjs";import"./chunk-JPSJWCFD.mjs";import"./chunk-TPESWBA7.mjs";import"./chunk-FEFP6JOL.mjs";import"./chunk-JUZ5LNDI.mjs";import"./chunk-7O6OMD4X.mjs";import"./chunk-OZJ6UKKP.mjs";import"./chunk-YQ55MHKL.mjs";import"./chunk-QSAA6LZF.mjs";import"./chunk-KOGZCFBC.mjs";import"./chunk-FX6VHIKB.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-OENWCYLF.mjs";import"./chunk-SJ75V4WG.mjs";import"./chunk-JMCMTX6U.mjs";import"./chunk-R4ILCXKE.mjs";import"./chunk-7JEKBJAP.mjs";import"./chunk-MI3JEFON.mjs";import"./chunk-Y5NQV46G.mjs";import"./chunk-DXQMKW2B.mjs";import"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-3FBCOCPD.mjs";import"./chunk-6UH244CC.mjs";import"./chunk-OUAS3LZ3.mjs";import"./chunk-INXNK57E.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GVNMXVVA.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import"./chunk-E66B27AL.mjs";export{e as TASK_CONTEXT_PROMPT,h as completeActiveTask,a as formatRelatedContextForAgent,b as formatRiskForAgent,i as readLastStatus,d as recallRisksForFiles,g as resolveActiveTask,f as setTaskStatus,c as startTask};
@@ -1,8 +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{c as a,d as b,e as c,f as d,g as e,h as f}from"./chunk-JUZ5LNDI.mjs";import"./chunk-FX6VHIKB.mjs";import"./chunk-HHIGNKDO.mjs";import"./chunk-7GNWHWOO.mjs";import"./chunk-JMCMTX6U.mjs";import"./chunk-R4ILCXKE.mjs";import"./chunk-27XFSCOE.mjs";import"./chunk-YUKGWWL7.mjs";import"./chunk-UUULLTQV.mjs";import"./chunk-5EQLQ7GF.mjs";import"./chunk-UA4Z5TGG.mjs";import"./chunk-TG5CQJD5.mjs";import"./chunk-M5E2YOZ4.mjs";import"./chunk-GAOQHD5S.mjs";import"./chunk-AZHE4VOM.mjs";import"./chunk-6RLCUGGG.mjs";import"./chunk-KG7Z6OMK.mjs";import"./chunk-CE4RCNC7.mjs";import"./chunk-JAMSIKDE.mjs";import"./chunk-HDSS6UB3.mjs";import"./chunk-JQE2F2RK.mjs";import"./chunk-WUHGODSQ.mjs";import"./chunk-UH4MD3F3.mjs";import"./chunk-QWQFF2UG.mjs";import"./chunk-GCKILEXJ.mjs";import"./chunk-EMTCZG5I.mjs";import"./chunk-PKDYFXMI.mjs";import"./chunk-BUDZL4DW.mjs";import"./chunk-E66B27AL.mjs";export{c as extractFilePathsFromEntries,d as formatWorkScopeBlock,f as isUsefulScopePath,b as resolveWorkScope,a as resolveWorkScopeSync,e as toLikelyFileHits};