prjct-cli 3.88.0 → 3.91.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 (220) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/bin/hook-chunks/agent-identity-45BYQBU2.mjs +8 -0
  3. package/dist/bin/hook-chunks/agent-switch-IQ5KSRKD.mjs +22 -0
  4. package/dist/bin/hook-chunks/analysis-LBYZSJKT.mjs +42 -0
  5. package/dist/bin/hook-chunks/auth-config-WNUARXTJ.mjs +8 -0
  6. package/dist/bin/hook-chunks/auto-flush-GW3FP763.mjs +8 -0
  7. package/dist/bin/hook-chunks/auto-updater-EHRRMCYY.mjs +9 -0
  8. package/dist/bin/hook-chunks/capture-gate-BQCNMHUC.mjs +8 -0
  9. package/dist/bin/hook-chunks/chunk-2NMSEZTQ.mjs +8 -0
  10. package/dist/bin/hook-chunks/chunk-2OU2MKNS.mjs +8 -0
  11. package/dist/bin/hook-chunks/chunk-2UC4DTDO.mjs +9 -0
  12. package/dist/bin/hook-chunks/chunk-3FBCOCPD.mjs +8 -0
  13. package/dist/bin/hook-chunks/chunk-3JUE6MNF.mjs +8 -0
  14. package/dist/bin/hook-chunks/chunk-3LG3ACQV.mjs +8 -0
  15. package/dist/bin/hook-chunks/chunk-3WKDMAS7.mjs +16 -0
  16. package/dist/bin/hook-chunks/chunk-45I2C2UB.mjs +25 -0
  17. package/dist/bin/hook-chunks/chunk-4DDCWMI6.mjs +8 -0
  18. package/dist/bin/hook-chunks/chunk-4KY2EHXS.mjs +9 -0
  19. package/dist/bin/hook-chunks/chunk-4WHS7CO7.mjs +8 -0
  20. package/dist/bin/hook-chunks/chunk-54LH63LM.mjs +7 -0
  21. package/dist/bin/hook-chunks/chunk-5TBQNW2G.mjs +17 -0
  22. package/dist/bin/hook-chunks/chunk-5WAONIPX.mjs +8 -0
  23. package/dist/bin/hook-chunks/chunk-6AFM6WRB.mjs +13 -0
  24. package/dist/bin/hook-chunks/chunk-6EWGHM32.mjs +9 -0
  25. package/dist/bin/hook-chunks/chunk-6IKHMK2U.mjs +10 -0
  26. package/dist/bin/hook-chunks/chunk-75UJIVMO.mjs +10 -0
  27. package/dist/bin/hook-chunks/chunk-7OZDWT6C.mjs +9 -0
  28. package/dist/bin/hook-chunks/chunk-7SI6X3Z7.mjs +8 -0
  29. package/dist/bin/hook-chunks/chunk-A5MUSARI.mjs +9 -0
  30. package/dist/bin/hook-chunks/chunk-A5RNWWTH.mjs +9 -0
  31. package/dist/bin/hook-chunks/chunk-AEYONUUY.mjs +31 -0
  32. package/dist/bin/hook-chunks/chunk-AKIN5WSQ.mjs +9 -0
  33. package/dist/bin/hook-chunks/chunk-AOPJ4Z6O.mjs +8 -0
  34. package/dist/bin/hook-chunks/chunk-AUUWQH3S.mjs +14 -0
  35. package/dist/bin/hook-chunks/chunk-AW25AWN5.mjs +31 -0
  36. package/dist/bin/hook-chunks/chunk-B7GMU46T.mjs +71 -0
  37. package/dist/bin/hook-chunks/chunk-BISPGBNN.mjs +35 -0
  38. package/dist/bin/hook-chunks/chunk-BUDZL4DW.mjs +8 -0
  39. package/dist/bin/hook-chunks/chunk-CE4RCNC7.mjs +8 -0
  40. package/dist/bin/hook-chunks/chunk-CQHPIYNM.mjs +8 -0
  41. package/dist/bin/hook-chunks/chunk-CREPUNOS.mjs +24 -0
  42. package/dist/bin/hook-chunks/chunk-CTWZQ7YI.mjs +8 -0
  43. package/dist/bin/hook-chunks/chunk-D4S3IRD3.mjs +8 -0
  44. package/dist/bin/hook-chunks/chunk-D6KT763C.mjs +9 -0
  45. package/dist/bin/hook-chunks/chunk-D7TRY3CO.mjs +8 -0
  46. package/dist/bin/hook-chunks/chunk-DGQYQSUK.mjs +19 -0
  47. package/dist/bin/hook-chunks/chunk-DMXFGLZE.mjs +21 -0
  48. package/dist/bin/hook-chunks/chunk-DXQMKW2B.mjs +10 -0
  49. package/dist/bin/hook-chunks/chunk-DYHYDHCW.mjs +8 -0
  50. package/dist/bin/hook-chunks/chunk-E66B27AL.mjs +8 -0
  51. package/dist/bin/hook-chunks/chunk-EHBEHLYN.mjs +15 -0
  52. package/dist/bin/hook-chunks/chunk-EM6ZDJAK.mjs +45 -0
  53. package/dist/bin/hook-chunks/chunk-FEH4IPIC.mjs +15 -0
  54. package/dist/bin/hook-chunks/chunk-FGQZ62ZP.mjs +47 -0
  55. package/dist/bin/hook-chunks/chunk-GAOQHD5S.mjs +8 -0
  56. package/dist/bin/hook-chunks/chunk-GCKILEXJ.mjs +8 -0
  57. package/dist/bin/hook-chunks/chunk-GVNMXVVA.mjs +8 -0
  58. package/dist/bin/hook-chunks/chunk-HBLR7BVG.mjs +11 -0
  59. package/dist/bin/hook-chunks/chunk-HDHVBB6Q.mjs +1260 -0
  60. package/dist/bin/hook-chunks/chunk-HDSS6UB3.mjs +8 -0
  61. package/dist/bin/hook-chunks/chunk-HJ4HEI45.mjs +8 -0
  62. package/dist/bin/hook-chunks/chunk-HZIORCPO.mjs +16 -0
  63. package/dist/bin/hook-chunks/chunk-IKUGYUAI.mjs +8 -0
  64. package/dist/bin/hook-chunks/chunk-J6JZ4PQA.mjs +18 -0
  65. package/dist/bin/hook-chunks/chunk-JQE2F2RK.mjs +8 -0
  66. package/dist/bin/hook-chunks/chunk-KEJ5RMAI.mjs +9 -0
  67. package/dist/bin/hook-chunks/chunk-L4COZ7ZH.mjs +13 -0
  68. package/dist/bin/hook-chunks/chunk-LGJUQEAU.mjs +8 -0
  69. package/dist/bin/hook-chunks/chunk-LJLUP4FF.mjs +8 -0
  70. package/dist/bin/hook-chunks/chunk-LLQUB6YR.mjs +11 -0
  71. package/dist/bin/hook-chunks/chunk-LPB3HUJ2.mjs +19 -0
  72. package/dist/bin/hook-chunks/chunk-LT5WSSQO.mjs +8 -0
  73. package/dist/bin/hook-chunks/chunk-LWCHQIJ7.mjs +11 -0
  74. package/dist/bin/hook-chunks/chunk-M3ZOJVPA.mjs +13 -0
  75. package/dist/bin/hook-chunks/chunk-MEQS4VPO.mjs +8 -0
  76. package/dist/bin/hook-chunks/chunk-MXHX44WF.mjs +9 -0
  77. package/dist/bin/hook-chunks/chunk-N5WOHG36.mjs +8 -0
  78. package/dist/bin/hook-chunks/chunk-NJAMZSHM.mjs +26 -0
  79. package/dist/bin/hook-chunks/chunk-NLG2EW6M.mjs +8 -0
  80. package/dist/bin/hook-chunks/chunk-NWY5M34K.mjs +12 -0
  81. package/dist/bin/hook-chunks/chunk-ODWWIFSN.mjs +9 -0
  82. package/dist/bin/hook-chunks/chunk-OIEZAHLC.mjs +16 -0
  83. package/dist/bin/hook-chunks/chunk-PKDYFXMI.mjs +8 -0
  84. package/dist/bin/hook-chunks/chunk-PSP56GGF.mjs +13 -0
  85. package/dist/bin/hook-chunks/chunk-PSSR7LSW.mjs +8 -0
  86. package/dist/bin/hook-chunks/chunk-PW3KYKVS.mjs +9 -0
  87. package/dist/bin/hook-chunks/chunk-PXJKXBTM.mjs +53 -0
  88. package/dist/bin/hook-chunks/chunk-Q5I2UPD6.mjs +9 -0
  89. package/dist/bin/hook-chunks/chunk-QDQ7DTDV.mjs +8 -0
  90. package/dist/bin/hook-chunks/chunk-QSAA6LZF.mjs +8 -0
  91. package/dist/bin/hook-chunks/chunk-QZSJSXJV.mjs +10 -0
  92. package/dist/bin/hook-chunks/chunk-RAHFKGM6.mjs +19 -0
  93. package/dist/bin/hook-chunks/chunk-RJ2BRRMH.mjs +38 -0
  94. package/dist/bin/hook-chunks/chunk-RRWPDRYR.mjs +43 -0
  95. package/dist/bin/hook-chunks/chunk-SJ75V4WG.mjs +9 -0
  96. package/dist/bin/hook-chunks/chunk-SOPRYWUY.mjs +11 -0
  97. package/dist/bin/hook-chunks/chunk-SVZHJZ5T.mjs +9 -0
  98. package/dist/bin/hook-chunks/chunk-SYHDEUVU.mjs +10 -0
  99. package/dist/bin/hook-chunks/chunk-TFGJVT6F.mjs +8 -0
  100. package/dist/bin/hook-chunks/chunk-TPESWBA7.mjs +8 -0
  101. package/dist/bin/hook-chunks/chunk-TRMBRDKH.mjs +8 -0
  102. package/dist/bin/hook-chunks/chunk-TXJT3G53.mjs +10 -0
  103. package/dist/bin/hook-chunks/chunk-UHW35BPE.mjs +18 -0
  104. package/dist/bin/hook-chunks/chunk-UQVJQME2.mjs +8 -0
  105. package/dist/bin/hook-chunks/chunk-UUULLTQV.mjs +8 -0
  106. package/dist/bin/hook-chunks/chunk-V37VTXDW.mjs +10 -0
  107. package/dist/bin/hook-chunks/chunk-W5OWBOLH.mjs +8 -0
  108. package/dist/bin/hook-chunks/chunk-WDGDFXSB.mjs +10 -0
  109. package/dist/bin/hook-chunks/chunk-WUHGODSQ.mjs +8 -0
  110. package/dist/bin/hook-chunks/chunk-X5RDLFPM.mjs +8 -0
  111. package/dist/bin/hook-chunks/chunk-XEFIIDHM.mjs +11 -0
  112. package/dist/bin/hook-chunks/chunk-Y5NQV46G.mjs +9 -0
  113. package/dist/bin/hook-chunks/chunk-YG7KBQYJ.mjs +16 -0
  114. package/dist/bin/hook-chunks/chunk-YJMWY4Y6.mjs +8 -0
  115. package/dist/bin/hook-chunks/chunk-YKMJI6TF.mjs +14 -0
  116. package/dist/bin/hook-chunks/chunk-YUOTOCKK.mjs +103 -0
  117. package/dist/bin/hook-chunks/chunk-ZTZTVBAZ.mjs +12 -0
  118. package/dist/bin/hook-chunks/chunk-ZX2KFQV5.mjs +11 -0
  119. package/dist/bin/hook-chunks/chunk-ZZ65CN5F.mjs +20 -0
  120. package/dist/bin/hook-chunks/client-SKFMAUI5.mjs +10 -0
  121. package/dist/bin/hook-chunks/code-graph-cloud-65GCWNII.mjs +8 -0
  122. package/dist/bin/hook-chunks/codex-skill-7IURPY6B.mjs +8 -0
  123. package/dist/bin/hook-chunks/command-installer-BVHQUSL4.mjs +8 -0
  124. package/dist/bin/hook-chunks/config-manager-KYC7WUOS.mjs +8 -0
  125. package/dist/bin/hook-chunks/content-bound-stamp-72EQVZLP.mjs +10 -0
  126. package/dist/bin/hook-chunks/context-pressure-OUN5PFMN.mjs +8 -0
  127. package/dist/bin/hook-chunks/context7-service-4C6VNJUS.mjs +8 -0
  128. package/dist/bin/hook-chunks/custom-workflow-storage-M77INP6Z.mjs +8 -0
  129. package/dist/bin/hook-chunks/cwd-changed-56X7BNS6.mjs +8 -0
  130. package/dist/bin/hook-chunks/cycle-budget-card-O5WAGNGC.mjs +9 -0
  131. package/dist/bin/hook-chunks/database-SLDTQXWG.mjs +8 -0
  132. package/dist/bin/hook-chunks/delivery-geometry-VHCURJ7E.mjs +8 -0
  133. package/dist/bin/hook-chunks/detect-changes-6N4DCWXQ.mjs +17 -0
  134. package/dist/bin/hook-chunks/detection-MEYHME4X.mjs +8 -0
  135. package/dist/bin/hook-chunks/developer-evolution-R5BXQH6G.mjs +12 -0
  136. package/dist/bin/hook-chunks/discuss-lock-55GER2LR.mjs +8 -0
  137. package/dist/bin/hook-chunks/distill-6C6YIFOE.mjs +8 -0
  138. package/dist/bin/hook-chunks/drift-refresh-TD3PYPJN.mjs +8 -0
  139. package/dist/bin/hook-chunks/editors-config-3N6VREZR.mjs +8 -0
  140. package/dist/bin/hook-chunks/enriched-recall-6ZZNKAJZ.mjs +8 -0
  141. package/dist/bin/hook-chunks/exec-I7XE7NMD.mjs +8 -0
  142. package/dist/bin/hook-chunks/format-YOYMJSLY.mjs +8 -0
  143. package/dist/bin/hook-chunks/git-helpers-6JLP2OJZ.mjs +8 -0
  144. package/dist/bin/hook-chunks/infer-memory-file-PIAZ542H.mjs +8 -0
  145. package/dist/bin/hook-chunks/judgment-ledger-storage-UKROWRVA.mjs +8 -0
  146. package/dist/bin/hook-chunks/judgment-orchestrator-UFGNBTEK.mjs +8 -0
  147. package/dist/bin/hook-chunks/judgment-receipt-2U7D6HS4.mjs +8 -0
  148. package/dist/bin/hook-chunks/land-cue-SS23JBAX.mjs +9 -0
  149. package/dist/bin/hook-chunks/land-synthesis-OATL5BNP.mjs +8 -0
  150. package/dist/bin/hook-chunks/legacy-crew-sweep-NH5EWEXF.mjs +24 -0
  151. package/dist/bin/hook-chunks/memory-index-677MUBCZ.mjs +10 -0
  152. package/dist/bin/hook-chunks/notification-S2IJJ6JW.mjs +8 -0
  153. package/dist/bin/hook-chunks/nyquist-lite-GE7OAFLC.mjs +10 -0
  154. package/dist/bin/hook-chunks/pack-integrity-L3BL7CGO.mjs +10 -0
  155. package/dist/bin/hook-chunks/pack-manager-SU53HCKK.mjs +8 -0
  156. package/dist/bin/hook-chunks/package-legitimacy-HXC4L73B.mjs +8 -0
  157. package/dist/bin/hook-chunks/path-manager-F2HE2GGK.mjs +8 -0
  158. package/dist/bin/hook-chunks/planning-ZYFCFU7N.mjs +9 -0
  159. package/dist/bin/hook-chunks/post-edit-JD7YFEBZ.mjs +8 -0
  160. package/dist/bin/hook-chunks/pr-convention-7UGI7TFA.mjs +8 -0
  161. package/dist/bin/hook-chunks/pre-bash-VIABNO5E.mjs +11 -0
  162. package/dist/bin/hook-chunks/pre-commit-NVQVXHZQ.mjs +8 -0
  163. package/dist/bin/hook-chunks/pre-edit-V4RD45C4.mjs +11 -0
  164. package/dist/bin/hook-chunks/pre-package-KFJZXI5T.mjs +8 -0
  165. package/dist/bin/hook-chunks/pre-search-7KRU5D2O.mjs +9 -0
  166. package/dist/bin/hook-chunks/pre-secrets-IE5NX5X5.mjs +8 -0
  167. package/dist/bin/hook-chunks/precision-classifier-IVVAXE26.mjs +8 -0
  168. package/dist/bin/hook-chunks/precision-judgment-WPTCNTGV.mjs +8 -0
  169. package/dist/bin/hook-chunks/prjct-md-FMCPUMQT.mjs +8 -0
  170. package/dist/bin/hook-chunks/project-agent-surfaces-TD7BHI25.mjs +8 -0
  171. package/dist/bin/hook-chunks/project-file-inventory-ZAPKPKY6.mjs +8 -0
  172. package/dist/bin/hook-chunks/project-memory-ZVZSLPB5.mjs +8 -0
  173. package/dist/bin/hook-chunks/project-style-evolution-7JS75AUP.mjs +8 -0
  174. package/dist/bin/hook-chunks/prompt-S4MMIXH5.mjs +22 -0
  175. package/dist/bin/hook-chunks/publish-helper-I37V4L7U.mjs +8 -0
  176. package/dist/bin/hook-chunks/purge-BDREPWEE.mjs +8 -0
  177. package/dist/bin/hook-chunks/retention-D2MVQLOF.mjs +8 -0
  178. package/dist/bin/hook-chunks/sdd-ZO4DP23G.mjs +10 -0
  179. package/dist/bin/hook-chunks/session-continuity-FNNUMOXB.mjs +11 -0
  180. package/dist/bin/hook-chunks/session-start-HA7IRBFX.mjs +8 -0
  181. package/dist/bin/hook-chunks/settings-installer-QDM3GB6J.mjs +9 -0
  182. package/dist/bin/hook-chunks/setup-7L3NXNRH.mjs +142 -0
  183. package/dist/bin/hook-chunks/shipping-GX4HFYJ3.mjs +13 -0
  184. package/dist/bin/hook-chunks/skill-index-OOVAXHYJ.mjs +12 -0
  185. package/dist/bin/hook-chunks/spec-context-inference-KER2R3F3.mjs +15 -0
  186. package/dist/bin/hook-chunks/spec-service-G3RLCJ2G.mjs +11 -0
  187. package/dist/bin/hook-chunks/spec-task-breakdown-YPJ76OWR.mjs +8 -0
  188. package/dist/bin/hook-chunks/state-storage-KNGP2CQV.mjs +8 -0
  189. package/dist/bin/hook-chunks/stop-HPZCLDPM.mjs +17 -0
  190. package/dist/bin/hook-chunks/subagent-start-7KZUTKV5.mjs +8 -0
  191. package/dist/bin/hook-chunks/subagent-stop-7C72RWGO.mjs +8 -0
  192. package/dist/bin/hook-chunks/surface-attribution-PDYR6DVA.mjs +8 -0
  193. package/dist/bin/hook-chunks/symbol-graph-LZM4RZXZ.mjs +8 -0
  194. package/dist/bin/hook-chunks/sync-analyzer-FKC57RTV.mjs +8 -0
  195. package/dist/bin/hook-chunks/sync-client-DJWOG2ZQ.mjs +8 -0
  196. package/dist/bin/hook-chunks/sync-cursor-storage-2VKG757H.mjs +19 -0
  197. package/dist/bin/hook-chunks/task-orchestration-MLOCR7GA.mjs +8 -0
  198. package/dist/bin/hook-chunks/task-overview-6ZQKJGSH.mjs +8 -0
  199. package/dist/bin/hook-chunks/task-service-RRFG5P7N.mjs +8 -0
  200. package/dist/bin/hook-chunks/tdd-XQUU4C23.mjs +10 -0
  201. package/dist/bin/hook-chunks/template-loader-4QMIMOBY.mjs +8 -0
  202. package/dist/bin/hook-chunks/transcript-jsonl-6X4DDD6R.mjs +8 -0
  203. package/dist/bin/hook-chunks/trust-boundary-ERMDF2C5.mjs +8 -0
  204. package/dist/bin/hook-chunks/usefulness-253CZLNY.mjs +8 -0
  205. package/dist/bin/hook-chunks/vault-retire-notice-GRT3QRLZ.mjs +9 -0
  206. package/dist/bin/hook-chunks/velocity-storage-UPW6TLK6.mjs +8 -0
  207. package/dist/bin/hook-chunks/weak-model-mode-M6D23IIM.mjs +8 -0
  208. package/dist/bin/hook-chunks/work-graph-QJGNBVIP.mjs +49 -0
  209. package/dist/bin/hook-chunks/work-scope-6FG6PSAV.mjs +8 -0
  210. package/dist/bin/hook-chunks/workspace-occupancy-UVIRHY5Z.mjs +8 -0
  211. package/dist/bin/hook-chunks/worktree-service-XGRN5TTE.mjs +12 -0
  212. package/dist/bin/hook-fast-darwin-arm64 +0 -0
  213. package/dist/bin/hook-fast-darwin-x64 +0 -0
  214. package/dist/bin/hook-fast-linux-x64 +0 -0
  215. package/dist/bin/prjct-core.mjs +625 -624
  216. package/dist/bin/prjct-hooks.mjs +3 -2282
  217. package/dist/bin/prjct.mjs +17 -2
  218. package/dist/daemon/entry.mjs +545 -544
  219. package/dist/mcp/server.mjs +196 -195
  220. package/package.json +1 -1
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{d as p}from"./chunk-A5MUSARI.mjs";import{e as f}from"./chunk-DGQYQSUK.mjs";import{a as g}from"./chunk-RRWPDRYR.mjs";import{e as m,g as _}from"./chunk-HDHVBB6Q.mjs";import{a as l}from"./chunk-E66B27AL.mjs";_();var S=8,y=140;function h(d,r){if(r.length===0)return 0;let n=[];try{m.transaction(d,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=s.prepare("DELETE FROM memory_entries WHERE id = ?"),t=s.prepare("DELETE FROM events WHERE id = ? AND type LIKE 'memory.remember.%'");for(let e of r){try{i.run(e)}catch{}c.run(e).changes&&n.push(e);let a=e.match(/^mem_(\d+)$/);if(a)try{t.run(Number(a[1]))}catch{}}})}catch{return n.length}return n.length}l(h,"hardDeleteEntries");function w(d,r,n){let s=new Map;for(let e of r)s.set(e.type,(s.get(e.type)??0)+1);let i=[...s.entries()].sort((e,o)=>o[1]-e[1]).map(([e,o])=>`${e}\xD7${o}`).join(", "),c=r.map(e=>p(e).replace(/\s+/g," ").trim()).filter(e=>e.length>20).slice(0,S).map(e=>`- ${e.length>y?`${e.slice(0,y-1)}\u2026`:e}`),t=[`Distill of discarded auto-history (${d}).`,`Context synthesis: ${r.length} low-value rows collapsed \u2014 raw history deleted; only this digest remains for the project model.`,`Key data: source=retention-distill; discarded=${r.length}; types=${i}; at=${n}`,"What happened: purged auto-generated / redundant captures that added no excess vs the reference model.","Why it mattered: prevent vault bloat; agents must not re-read detector noise.",`Outcome: ${r.length} raw entries hard-deleted after distillation.`,"Next implication: prefer high-excess judgment; re-run detectors only when code/model changes."];return c.length>0&&t.push(`Sample cues (not full bodies):
9
+ ${c.join(`
10
+ `)}`),t.join(" ")}l(w,"buildDistillContent");async function A(d,r,n,s,i){if(s.length<=i)return{discarded:0,digested:!1};let t=[...s].sort((u,b)=>b.rememberedAt.localeCompare(u.rememberedAt)).slice(i);if(t.length===0)return{discarded:0,digested:!1};let e=new Date().toISOString(),o=`auto-distill:${n}`,a=w(n,t,e),E=await g.remember(d,{type:"learning",content:a,tags:{source:"retention-distill",topic:o,capture:"distill-discard-v1",context_schema:"living-v2",synthesis:"deterministic",discarded_count:String(t.length),auto_source:n},provenance:"inferred",projectId:r}).then(()=>!0).catch(()=>!1),D=t.map(u=>u.id);return{discarded:h(r,D),digested:E,digestTopic:o}}l(A,"distillAndDiscardAutoSource");async function v(d,r,n){let s=g.allEntriesForIndex(r),i=new Map;for(let t of s){let e=t.tags?.source;if(!f(e)||e==="retention-distill"||t.tags?.source==="retention-distill")continue;let o=i.get(e)??[];o.push(t),i.set(e,o)}let c=[];for(let[t,e]of i){if(e.length<=n)continue;let o=await A(d,r,t,e,n);c.push(o)}return{discarded:c.reduce((t,e)=>t+e.discarded,0),digests:c.filter(t=>t.digested).length}}l(v,"distillAndDiscardAllAutoSources");function x(d,r,n=1e3){let s=Date.now()-r*864e5;try{let i=m.query(d,`SELECT id, type, content FROM memory_entries
11
+ WHERE deleted_at IS NOT NULL AND deleted_at < ?
12
+ ORDER BY deleted_at ASC
13
+ LIMIT ?`,s,n);return i.length===0?{purged:0,digested:!1}:{purged:h(d,i.map(t=>t.id)),digested:!1}}catch{return{purged:0,digested:!1}}}l(x,"eliminateSoftDeletedNoValue");export{h as a,w as b,A as c,v as d,x as e};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{f as d,h as p,j as i,m as u,n as F}from"./chunk-SVZHJZ5T.mjs";import{a as c}from"./chunk-E66B27AL.mjs";F();import t from"node:path";async function E(e,s){let o=s?.packageManager?.trim().toLowerCase();return o?.startsWith("pnpm@")?"pnpm":o?.startsWith("yarn@")?"yarn":o?.startsWith("bun@")?"bun":o?.startsWith("npm@")?"npm":await i(t.join(e,"pnpm-lock.yaml"))?"pnpm":await i(t.join(e,"yarn.lock"))?"yarn":await i(t.join(e,"bun.lockb"))||await i(t.join(e,"bun.lock"))?"bun":(await i(t.join(e,"package-lock.json")),"npm")}c(E,"detectPackageManager");function w(e,s){return e==="yarn"?`yarn ${s}`:e==="pnpm"?`pnpm run ${s}`:e==="bun"?`bun run ${s}`:`npm run ${s}`}c(w,"pmRun");function H(e){return e==="yarn"?"yarn test":e==="pnpm"?"pnpm test":e==="bun"?"bun test":"npm test"}c(H,"pmTest");var x=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],b=".csproj",v=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];async function g(e,s){for(let l of x)if(await i(t.join(e,l)))return l;let m=(s??await u(e)).find(l=>l.endsWith(b));if(m)return m}c(g,"detectVersionFile");async function r(e){for(let s of v)if(await i(t.join(e,s)))return s}c(r,"detectChangelogFile");async function M(e){let s=t.join(e,"package.json"),o=await d(s,null);if(o){let n=await E(e,o),a=o.scripts||{},f={stack:"js",packageManager:n};return a.lint&&(f.lint={tool:n,command:w(n,"lint")}),a.typecheck&&(f.typecheck={tool:n,command:w(n,"typecheck")}),a.test&&(f.test={tool:n,command:H(n)}),f.versionFile=await g(e),f.changelogFile=await r(e),f}if(await i(t.join(e,"pytest.ini"))){let n=await g(e),a=await r(e);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:n,changelogFile:a}}let m=await p(t.join(e,"pyproject.toml"),"");if(m.includes("[tool.pytest")||m.includes("pytest")){let n=await g(e),a=await r(e);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:n,changelogFile:a}}if(await i(t.join(e,"Cargo.toml"))){let n=await r(e);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:n}}if(await i(t.join(e,"go.mod"))){let n=await g(e),a=await r(e);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:n,changelogFile:a}}let l=await u(e);if(l.some(n=>n.endsWith(".sln")||n.endsWith(".csproj")||n.endsWith(".fsproj"))){let n=await g(e,l),a=await r(e);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:n,changelogFile:a}}if(await i(t.join(e,"pom.xml"))){let n=await r(e);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:n}}if(await i(t.join(e,"gradlew"))&&(await i(t.join(e,"build.gradle"))||await i(t.join(e,"build.gradle.kts")))){let n=await r(e);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:n}}let k=await g(e),y=await r(e);return{stack:"unknown",versionFile:k,changelogFile:y}}c(M,"detectProjectCommands");export{M as a};
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a}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};
@@ -0,0 +1,53 @@
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,b as a}from"./chunk-6AFM6WRB.mjs";import{a as E}from"./chunk-UQVJQME2.mjs";import{j as l,n as A}from"./chunk-SVZHJZ5T.mjs";import{c as d}from"./chunk-PKDYFXMI.mjs";import{e as c,f as v}from"./chunk-BUDZL4DW.mjs";import{a as n}from"./chunk-E66B27AL.mjs";v();function C(r,e,t){if(t.md){console.log(`> ${e}`);return}k[r](e)}n(C,"notify");var B=n((r,e={})=>C("warn",r,e),"notifyWarn");var D=n((r,e={})=>C("fail",r,e),"notifyFail");function J(r,e={}){return B(r,e),{success:!1,error:r}}n(J,"failWith");function Z(r,e={}){return D(r,e),{success:!1,error:r}}n(Z,"failHard");function ee(r,e){let t=c(r);return e&&D(t,e),{success:!1,error:t}}n(ee,"failFromError");A();import x from"node:path";var f={value:null},$={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"p.",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},j={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};async function L(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await l(x.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await l(x.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}n(L,"isClaudeEnvironment");function V(){return{...$}}n(V,"getClaudeAgent");function U(){return{...j}}n(U,"getTerminalAgent");function G(){return!!(process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1")}n(G,"isSandboxed");async function T(){if(f.value)return f.value;let r=await L()?V():U();return r.environment={...r.environment,sandboxed:G()},f.value=r,r}n(T,"detect");v();A();import p from"node:fs/promises";var y=class{static{n(this,"RuntimeClaude")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let i={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${i[t]||i.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${c(t)}`)}return await p.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(i){console.warn(`MCP writeFile failed, falling back to fs: ${c(i)}`)}await p.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${c(t)}`)}return await p.readdir(e)}async fileExists(e){return l(e)}async createDirectory(e){await p.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
9
+ ${e.map((t,i)=>`${i+1}. ${t}`).join(`
10
+ `)}`}formatRecap(e){return`\u{1F4CA} Recap
11
+
12
+ \u{1F3AF} Current: ${e.currentTask||"None"}
13
+ \u{1F680} Shipped: ${e.shippedCount}
14
+ \u{1F4DD} Queue: ${e.queuedCount}
15
+ \u{1F4A1} Ideas: ${e.ideasCount}
16
+ ${e.recentActivity?`
17
+ ${e.recentActivity}`:""}`}formatProgress(e){let t=e.velocity>e.previousVelocity?"\u{1F4C8}":e.velocity<e.previousVelocity?"\u{1F4C9}":"\u27A1\uFE0F";return`\u{1F4CA} ${e.period}
18
+
19
+ Shipped: ${e.count}
20
+ Velocity: ${e.velocity.toFixed(1)}/day ${t}
21
+ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolate code causing error
22
+ 2. Add logs at key points
23
+ 3. Search exact error message`,design:`\u{1F3A8} 1. Define problem clearly
24
+ 2. Start with simplest solution
25
+ 3. Ship MVP, iterate`,performance:`\u26A1 1. Profile/measure first
26
+ 2. Optimize slowest parts
27
+ 3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
28
+ 2. Start with simplest part
29
+ 3. Ship it`},i=Object.keys(t).find(s=>e.toLowerCase().includes(s))||"default";return t[i]}suggestNextAction(e){return{taskCompleted:`What's next?
30
+ \u2022 "start [task]" \u2192 Begin working
31
+ \u2022 "ship feature" \u2192 Track & celebrate
32
+ \u2022 "add idea" \u2192 Brainstorm
33
+
34
+ Or: p. work | p. ship | p. remember`,featureShipped:`Keep the momentum!
35
+ \u2022 "start next task" \u2192 Keep building
36
+ \u2022 "see progress" \u2192 View stats
37
+ \u2022 "plan ahead" \u2192 Strategic thinking
38
+
39
+ Or: p. work | p. insights | p. performance`,ideaCaptured:`Ready to start?
40
+ \u2022 "start this" \u2192 Begin now
41
+ \u2022 "plan more" \u2192 Keep brainstorming
42
+ \u2022 "see ideas" \u2192 View backlog
43
+
44
+ Or: p. work | p. remember | p. insights`,initialized:`Ready to start? Tell me what you want to build!
45
+
46
+ Or type p. help to see all options`,stuck:`Let's break it down:
47
+ \u2022 "start the first part"
48
+ \u2022 "add as tasks"
49
+ \u2022 "think more"
50
+
51
+ Or: p. work | p. remember | p. insights`}[e]||`What would you like to do?
52
+
53
+ Type p. help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},S=y;var q=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),O=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);function P(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&q.has(e.code))return!0;if(e.code&&O.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}n(P,"isTransientError");function H(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&O.has(e.code))}n(H,"isPermanentError");var o=new Map;function R(r,e,t){let i=o.get(r);return i&&i.consecutiveFailures>=e&&i.openedAt?Date.now()-i.openedAt>=t?(o.delete(r),!1):!0:!1}n(R,"isCircuitOpen");function M(r,e){let t=o.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),o.set(r,t)}n(M,"recordFailure");function W(r){o.delete(r)}n(W,"recordSuccess");var m=class{static{n(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(R(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let i=n(async s=>{try{let u=await e();return W(t),u}catch(u){if(H(u))throw M(t,this.options.circuitBreakerThreshold),u;if(!(P(u)&&s<this.options.maxAttempts))throw M(t,this.options.circuitBreakerThreshold),u;let F=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);return await new Promise(_=>setTimeout(_,F)),i(s+1)}},"executeAttempt");return i(1)}isTransientError(e){return P(e)}isCircuitOpen(e){return R(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return o.get(e)}resetCircuit(e){o.delete(e)}resetAllCircuits(){o.clear()}},I=new m({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),pe=new m({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3});var K=["claude"],h=class{static{n(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await I.execute(async()=>{if(this.agentInfo=await T(),!this.agentInfo?.isSupported)throw d.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!K.includes(e))throw d.notSupported(this.agentInfo?.type??"unknown");return this.agent=new S,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},g=new h;var w=class{static{n(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},b=new w;var N=class{static{n(this,"PrjctCommandsBase")}prjctDir;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateNotificationShown=!1}get agent(){return g.getAgent()}get agentInfo(){return g.getInfo()}get currentAuthor(){return a.getCurrentAuthor()}async initializeAgent(){return g.initialize()}async ensureProjectInit(e){return a.ensureInit(e)}async ensureAuthor(){return a.ensureAuthor()}async getGlobalProjectPath(e){return a.getGlobalPath(e)}async logToMemory(e,t,i){let s=await this.ensureAuthor();await E.log(e,t,i,s.name)}async _detectEmptyDirectory(e){return a.isEmptyDirectory(e)}async _detectExistingCode(e){return a.hasExistingCode(e)}_breakdownFeatureTasks(e){return b.breakdownFeature(e)}_detectBugSeverity(e){return b.detectBugSeverity(e)}};export{J as a,Z as b,ee as c,N as d};
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as f}from"./chunk-6EWGHM32.mjs";import{c as m}from"./chunk-AOPJ4Z6O.mjs";import{d as r,g}from"./chunk-HDHVBB6Q.mjs";import{a as i}from"./chunk-E66B27AL.mjs";g();var _=["hook","gate","step","instruction"];function d(o){let t=o.trust_source==="imported"?"imported":"local",e=_.includes(o.type)?o.type:"step";return{id:o.id,type:e,command:o.command,position:o.position,action:o.action,description:o.description,enabled:o.enabled===1,timeoutMs:o.timeout_ms,createdAt:o.created_at,sortOrder:o.sort_order,whenExpr:o.when_expr??null,parallel:o.parallel===null?!0:o.parallel===1,trustSource:t}}i(d,"rowToRule");var p=class{static{i(this,"WorkflowRuleStorage")}addRule(t,e){let n=r.get(t,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",e.command),u=e.sortOrder||(n?.m??-1)+1;r.run(t,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
9
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.type,e.command,e.position,e.action,e.description??null,e.enabled?1:0,e.timeoutMs,e.createdAt,u,e.whenExpr??null,e.parallel===!1?0:1,e.trustSource??"local");let l=r.get(t,"SELECT last_insert_rowid() as id")?.id??0;return l>0&&m({projectId:t,entityType:"workflow_rules",entityId:String(l),eventType:"upsert",data:{id:l,type:e.type,command:e.command,position:e.position,action:e.action,description:e.description??null,enabled:e.enabled?1:0,timeout_ms:e.timeoutMs,sort_order:u,when_expr:e.whenExpr??null,parallel:e.parallel===!1?0:1,trust_source:e.trustSource??"local",created_at:e.createdAt}}),l}removeRule(t,e){return r.get(t,"SELECT id FROM workflow_rules WHERE id = ?",e)?(r.run(t,"DELETE FROM workflow_rules WHERE id = ?",e),m({projectId:t,entityType:"workflow_rules",entityId:String(e),eventType:"delete",data:{id:e}}),!0):!1}updateRule(t,e,n){if(!r.get(t,"SELECT id FROM workflow_rules WHERE id = ?",e))return!1;let w={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:i(s=>s?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:i(s=>s===!1?0:1,"transform")},trustSource:{column:"trust_source"}},l=[],c=[];for(let[s,E]of Object.entries(n)){let a=w[s];if(!a)continue;l.push(`${a.column} = ?`);let R=E;c.push(a.transform?a.transform(R):R)}return l.length===0||(c.push(e),r.run(t,`UPDATE workflow_rules SET ${l.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(t,e){let n=r.get(t,"SELECT * FROM workflow_rules WHERE id = ?",e);return n?d(n):null}getRulesForCommand(t,e){let n=f.getWorkflow(t,e);return!n||!n.enabled?[]:r.query(t,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",e).map(d)}getAllRules(t){return r.query(t,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(d)}resetRules(t){let e=r.get(t,"SELECT COUNT(*) as c FROM workflow_rules");return r.run(t,"DELETE FROM workflow_rules"),e?.c??0}},S=new p;export{S as a};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as r}from"./chunk-E66B27AL.mjs";import{createHash as e}from"node:crypto";function n(t){return e("sha256").update(t).digest("hex")}r(n,"sha256");function s(t){return n(t).slice(0,16)}r(s,"sha256Short");export{n as a,s as b};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{z as e}from"zod";var n=e.enum(["skip","standard","full"]),i=e.enum(["blocker","critical","warning","suggestion"]),o=e.enum(["candidate","stands","refuted","info","fixed","verified","open"]),r=e.enum(["stands","refuted"]),a=e.enum(["in_progress","approved","escalated","blocked"]),s=e.enum(["red","blue","solo"]),m=e.object({id:e.string().min(1),severity:i,status:o,title:e.string().min(1),file:e.string().optional(),line:e.number().int().positive().optional(),evidence:e.string().optional(),judge:e.string().optional(),role:s.optional(),dna:e.string().optional(),evidenceScore:e.number().int().min(0).max(3).optional(),blast:e.number().optional(),knownFalsePositive:e.boolean().optional(),agreedBy:e.array(e.string()).optional(),refuteVotes:e.array(r).optional()}),t=2,g=e.object({id:e.string().min(1),target:e.string().min(1),intensity:n,maxFixRounds:e.literal(t).default(t),fixRound:e.number().int().min(0).max(t),findings:e.array(m),verdict:a,createdAt:e.string().min(1),updatedAt:e.string().min(1),baseSha:e.string().optional(),headSha:e.string().optional(),escalateReason:e.string().optional(),deliveryTier:e.enum(["trivial","normal","large"]).optional(),merge:e.object({agreed:e.number().int().min(0),onlyRed:e.number().int().min(0),onlyBlue:e.number().int().min(0),contradicted:e.number().int().min(0)}).optional(),precisionHint:e.number().min(0).max(1).optional(),scopePaths:e.array(e.string().min(1)).optional(),scopeFrozenAt:e.string().optional(),contentBound:e.object({version:e.literal(1),treeHash:e.string().min(8),pathCount:e.number().int().min(0),paths:e.array(e.object({path:e.string().min(1),blobHash:e.string().min(1)})),stampedAt:e.string().min(1),headSha:e.string().optional()}).optional()}),p=e.object({dna:e.string().min(1),title:e.string().min(1),times:e.number().int().positive(),lastSeenAt:e.string().min(1),lastReason:e.string().optional()}),c=e.object({ghosts:e.array(p),updatedAt:e.string().min(1)});export{t as a,g as b,c};
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{b as a,c as f}from"./chunk-L4COZ7ZH.mjs";import{f as u}from"./chunk-A5MUSARI.mjs";import{a as m}from"./chunk-RRWPDRYR.mjs";import{b as l}from"./chunk-W5OWBOLH.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execSync as d}from"node:child_process";var h=1200,y=3;function C(t){try{return d("git diff --cached --name-only",{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
9
+ `).map(o=>o.trim()).filter(Boolean)}catch{return[]}}i(C,"stagedFiles");function b(t){let o=new Set;for(let r of t){let n=r.split("/").filter(Boolean);for(let s of n){let e=s.replace(/\.[^.]+$/,"").toLowerCase();e.length>=3&&o.add(e)}}return[...o]}i(b,"pathFragments");function k(t,o){let r=t.content.toLowerCase();if(o.some(n=>r.includes(n)))return!0;for(let n of Object.values(t.tags)){let s=n.toLowerCase();if(o.some(e=>s.includes(e)))return!0}return!1}i(k,"mentionsFragment");async function I(t){let o=await l.readConfig(t);if(!o?.projectId)return null;let r=C(t);if(r.length===0)return null;let n=b(r);if(n.length===0)return null;let s=(()=>{try{return m.recall(o.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}})();if(!s)return null;let e=s.filter(g=>k(g,n)).slice(0,y);if(e.length===0)return null;let c=["# prjct: heads-up for this commit",""];c.push(`${e.length} anti-pattern/gotcha entr${e.length===1?"y":"ies"} match the staged files.`),c.push(""),c.push(u(e)),c.push(""),c.push("> Nudge, not block. Proceed if you think it still applies.");let p=c.join(`
10
+ `);return a(p,h)}i(I,"buildPreCommitContext");function _(t=process.cwd(),o){return f({event:"PreToolUse",projectPath:t,build:i(async(r,n)=>w(r)?I(n):null,"build")},o)}i(_,"runPreCommitHook");function w(t){return/\bgit\s+commit\b/.test(t.tool_input?.command??"")}i(w,"isCommitInput");export{I as a,_ as b,w as c};
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as p}from"./chunk-RRWPDRYR.mjs";import{d as g,g as M}from"./chunk-HDHVBB6Q.mjs";import{a as o}from"./chunk-E66B27AL.mjs";M();var h=300,x=3;function v(t){let e=t?.judgment?.conflictMode;if(e==="off"||e==="advisory"||e==="strict")return e;let n=t?.persona?.packs??[];return n.includes("code-strict")?"strict":n.includes("code")?"advisory":"off"}o(v,"effectiveConflictMode");function N(t){let e={action:"none",memoryIds:[],reason:"",recovery:"",message:""};if(t.mode==="off")return e;let n=new Set(t.overriddenIds??[]),r=t.candidates.filter(c=>c.id&&!n.has(c.id));if(r.length===0)return e;let i=r.filter(c=>c.confidence==="high"),l=r.filter(c=>c.confidence==="low"),s=i[0]??l[0];if(!s)return e;let f=r.map(c=>c.id),u=t.fileLabel?` on \`${t.fileLabel}\``:"",a=`Edit may contradict [${s.type}] ${m(s.content,80)} (\`${s.id}\`)${u}`,d='To supersede: `prjct remember decision "\u2026why supersede\u2026" --tags supersedes:'+s.id+'`. To lift deny for this memory: `prjct remember feedback "override conflict '+s.id+': <why>" --tags conflict:override,memory:'+s.id+"`.";return i.length===0?{action:"warn",memoryIds:f,reason:`Low-confidence preventive signal${u}: ${m(s.content,80)}`,recovery:d,message:y(a,d,f,!1)}:t.mode==="strict"?{action:"deny",memoryIds:i.map(c=>c.id),reason:a,recovery:d,message:_(a,d,i.map(c=>c.id))}:{action:"warn",memoryIds:f,reason:a,recovery:d,message:y(a,d,f,!0)}}o(N,"decisionConflictVerdict");function y(t,e,n,r){return[r?"# prjct: CONFLICT \u2014 decision/gotcha may block this path":"# prjct: heads-up \u2014 weak preventive signal","",t,"",`Memory: ${n.map(l=>`\`${l}\``).join(", ")}`,"",e,"",r?"> Not a soft nudge. Revise the edit or supersede the decision with rationale before proceeding.":"> Apply if it still holds; proceed if not."].join(`
9
+ `)}o(y,"formatWarnMessage");function _(t,e,n){return[`\u26D4 prjct conflict deny: ${t}`,`Memories: ${n.join(", ")}`,e,"Host will block Edit|Write until override or supersede. Fail-open only on hook errors, not on intentional deny."].join(" ")}o(_,"formatDenyMessage");function E(t){let e=new Set;try{let n=Date.now()-6048e5,r=g.query(t,`SELECT t.value AS value
10
+ FROM memory_entry_tags t
11
+ JOIN memory_entries me ON me.id = t.entry_id
12
+ WHERE me.deleted_at IS NULL
13
+ AND me.created_at >= ?
14
+ AND t.key = 'memory'
15
+ AND EXISTS (
16
+ SELECT 1 FROM memory_entry_tags t2
17
+ WHERE t2.entry_id = me.id AND t2.key = 'conflict' AND t2.value = 'override'
18
+ )`,n);for(let i of r)i.value&&e.add(i.value.startsWith("mem_")?i.value:`mem_${i.value}`)}catch{}return e}o(E,"loadConflictOverrides");async function k(t,e,n,r,i){if(n==="deny")try{await p.remember(t,{type:"fact",content:`conflict-gate ${n}: ${m(i,200)}`,tags:{source:"conflict-gate",conflict_action:n,memory:r[0]??""},provenance:"extracted",projectId:e})}catch{}}o(k,"recordConflictEvent");function b(t){return t.map(e=>{let n=e.type==="gotcha"||e.type==="anti-pattern"||e.type==="decision"||e.tags?.pattern==="recurring-bug",r=(e.content?.trim().length??0)>=20;return{id:e.id,type:e.type,content:e.content,confidence:n&&r?"high":"low"}})}o(b,"candidatesFromPreventive");function j(t,e=h){return Date.now()-t>e}o(j,"budgetExceeded");function m(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}o(m,"truncate");function C(t){return t?.judgment?.weakModelMode==="on"?"on":"off"}o(C,"effectiveWeakModelMode");function W(t){return t?.judgment?.conflictMode==="off"?"off":C(t)==="on"?"strict":v(t)}o(W,"conflictModeWithWeakModel");function O(t,e){return(e==="on"||e==="off"?e:C(e))!=="on"?t:t==="none"?"standard":t==="standard"?"full":t}o(O,"qualityFloorWithWeakModel");function $(){return["# prjct: WEAK-MODEL PRODUCT MODE","Harness intensified: conflict gate \u2192 strict (unless conflictMode=off), quality ceremony elevated, lean on SQLite judgment (receipts/gotchas/decisions) over model instinct.","North star: weak-model + prjct \u2265 good-model alone on cadence + quality."].join(`
19
+ `)}o($,"weakModelBanner");function S(){return"Weak-model product mode ON \u2014 strict conflict + elevated quality; compound judgment over thrash."}o(S,"weakModelOneLiner");export{h as a,x as b,N as c,E as d,k as e,b as f,j as g,C as h,W as i,O as j,$ as k,S as l};
@@ -0,0 +1,38 @@
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 Ct}from"./chunk-FGQZ62ZP.mjs";import{a as gt,b as ht,c as yt,d as St,e as wt}from"./chunk-TXJT3G53.mjs";import{a as ut}from"./chunk-A5RNWWTH.mjs";import{a as Be}from"./chunk-HZIORCPO.mjs";import{a as Je}from"./chunk-WDGDFXSB.mjs";import{a as ne,b as qe}from"./chunk-NWY5M34K.mjs";import{a as Ke,b as xt}from"./chunk-6AFM6WRB.mjs";import{a as mt,b as pt}from"./chunk-YKMJI6TF.mjs";import{d as ft}from"./chunk-XEFIIDHM.mjs";import{a as ct,b as lt}from"./chunk-QDQ7DTDV.mjs";import{a as kt,b as vt,c as bt,d as Pt}from"./chunk-ZTZTVBAZ.mjs";import{a as f}from"./chunk-DYHYDHCW.mjs";import{b as Y,c as tt,d as rt}from"./chunk-YJMWY4Y6.mjs";import{c as st,d as nt,e as oe,f as at,g as ot}from"./chunk-NJAMZSHM.mjs";import{a as it}from"./chunk-FEH4IPIC.mjs";import{i as dt}from"./chunk-J6JZ4PQA.mjs";import{a as et}from"./chunk-LGJUQEAU.mjs";import{b as Qe,c as Xe,d as Ze}from"./chunk-4DDCWMI6.mjs";import{a as Ye}from"./chunk-UQVJQME2.mjs";import{a as ae,b as R}from"./chunk-BISPGBNN.mjs";import{a as ze}from"./chunk-HJ4HEI45.mjs";import{c as Ve}from"./chunk-3LG3ACQV.mjs";import{c as We}from"./chunk-AOPJ4Z6O.mjs";import{b as T}from"./chunk-W5OWBOLH.mjs";import{d as P,e as I,g as K}from"./chunk-HDHVBB6Q.mjs";import{d as se}from"./chunk-HBLR7BVG.mjs";import{b,e as re,m as He,o as Le,r as br,s as q,t as Ge}from"./chunk-AKIN5WSQ.mjs";import{b as Ne,f as vr}from"./chunk-HDSS6UB3.mjs";import{d as Te,e as $e,f as Oe,j as L,n as B}from"./chunk-SVZHJZ5T.mjs";import{a as _e,o as kr}from"./chunk-CTWZQ7YI.mjs";import{a as Ue}from"./chunk-OIEZAHLC.mjs";import{d as w}from"./chunk-PKDYFXMI.mjs";import{a as M,d as Me,e as v,f as N}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";function Dt(r,e){let t=[];G("Languages",r.languages,e.languages,t),G("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),G("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(u=>u.name),a=e.patterns.map(u=>u.name);G("Patterns",s,a,t);let o=r.antiPatterns.map(u=>u.issue),n=e.antiPatterns.map(u=>u.issue);G("Anti-patterns",o,n,t);let l=t.filter(u=>u.type==="added").length,c=t.filter(u=>u.type==="removed").length,d=t.filter(u=>u.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:l,removed:c,changed:d},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}i(Dt,"generateAnalysisDiff");function ps(r){if(!r.hasChanges)return`## Analysis Diff
9
+
10
+ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let a=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${a} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
11
+ `)}i(ps,"formatAnalysisDiffMd");function fs(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
12
+ `)}i(fs,"formatAnalysisDiffText");function G(r,e,t,s){let a=new Set(e),o=new Set(t);for(let n of t)a.has(n)||s.push({field:r,type:"added",after:n});for(let n of e)o.has(n)||s.push({field:r,type:"removed",before:n})}i(G,"diffStringArray");N();B();vr();import ie from"node:fs/promises";import F from"node:path";import{z as p}from"zod";var Pr=p.enum(["draft","verified","sealed"]),Cr=p.object({name:p.string(),description:p.string(),location:p.string().optional(),severity:p.enum(["low","medium","high"]).optional(),language:p.string().optional(),framework:p.string().optional(),source:p.enum(["baseline","repo","context7","feedback"]).optional(),confidence:p.number().min(0).max(1).optional()}),xr=p.object({issue:p.string(),file:p.string(),suggestion:p.string(),severity:p.enum(["low","medium","high"]).optional(),language:p.string().optional(),framework:p.string().optional(),source:p.enum(["baseline","repo","context7","feedback"]).optional(),confidence:p.number().min(0).max(1).optional()}),ce=p.object({projectId:p.string(),languages:p.array(p.string()),frameworks:p.array(p.string()),packageManager:p.string().optional(),sourceDir:p.string().optional(),testDir:p.string().optional(),configFiles:p.array(p.string()),fileCount:p.number(),patterns:p.array(Cr),antiPatterns:p.array(xr),analyzedAt:p.string(),modelMetadata:Ne.optional(),status:Pr.default("draft"),commitHash:p.string().optional(),signature:p.string().optional(),sealedAt:p.string().optional(),verifiedAt:p.string().optional()});var Dr={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};async function Ar(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=F.join(e,"package.json"),a=await ie.readFile(s,"utf-8"),o=JSON.parse(a),n={...o.dependencies,...o.devDependencies},l=[],c=[];for(let d of r.frameworks){let u=d.toLowerCase();Object.keys(n).some(y=>y.toLowerCase().includes(u))?c.push(d):l.push(d)}return l.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${l.join(", ")}`,durationMs:Date.now()-t}}catch(s){return M(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(Ar,"verifyFrameworks");async function jr(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await Fr(e),a=new Set(s),o=[],n=[];for(let l of r.languages){let c=Dr[l];if(!c)continue;c.some(u=>a.has(u))?o.push(l):n.push(l)}return n.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${n.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(jr,"verifyLanguages");async function Ir(r,e){let t=Date.now(),s=r.patterns.filter(n=>n.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let a=[],o=[];for(let n of s){let l=n.location,c=F.join(e,l);await L(c)?o.push(l):a.push(`${n.name} (${l})`)}return a.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${a.join(", ")}`,durationMs:Date.now()-t}}i(Ir,"verifyPatternLocations");async function Er(r,e){let t=Date.now();try{let s=await _r(e),a=r.fileCount,o=.1,n=Math.abs(s-a),l=a*o;return n<=l?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${a}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${a}, actual ${s} (diff: ${n})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(Er,"verifyFileCount");async function Rr(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],a=[];for(let o of r.antiPatterns){let n=F.join(e,o.file);await L(n)?a.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${a.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}i(Rr,"verifyAntiPatternFiles");async function At(r,e){let t=Date.now(),s=await Promise.all([Ar(r,e),jr(r,e),Ir(r,e),Er(r,e),Rr(r,e)]),a=s.filter(n=>!n.passed).length,o=s.filter(n=>n.passed).length;return{passed:a===0,checks:s,totalMs:Date.now()-t,failedCount:a,passedCount:o}}i(At,"semanticVerify");async function Fr(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(a){try{let o=await ie.readdir(a,{withFileTypes:!0});for(let n of o){let l=F.join(a,n.name),c=F.relative(r,l);if(!t.some(d=>d.test(c))){if(n.isDirectory())await s(l);else if(n.isFile()){let d=F.extname(n.name);d&&e.add(d)}}}}catch{}}return i(s,"scanDir"),await s(r),Array.from(e)}i(Fr,"getProjectExtensions");async function _r(r){let e=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function t(s){try{let a=await ie.readdir(s,{withFileTypes:!0});return(await Promise.all(a.map(async n=>{let l=F.join(s,n.name),c=F.relative(r,l);return e.some(d=>d.test(c))?0:n.isDirectory()?t(l):n.isFile()?1:0}))).reduce((n,l)=>n+l,0)}catch{return 0}}return i(t,"scanDir"),t(r)}i(_r,"countProjectFiles");re();var le=class extends ze{static{i(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};ce.parse(s),await this.update(e,a=>({...a,draft:s,lastUpdated:b()})),this.publishAnalysis(e,s)}publishAnalysis(e,t){We({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...t,id:e}})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),a=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:a};return ce.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:a}),this.publishAnalysis(e,o),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),this.publishAnalysis(e,t.previousSealed),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Dt(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),a=s.sealed??s.draft;return a?await At(a,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return ct(JSON.stringify(t))}},Q=new le;import ds from"node:fs/promises";import ee from"node:path";br();Ge();B();import de from"node:fs/promises";import jt from"node:path";import{gunzipSync as Mr,gzipSync as Tr}from"node:zlib";Ge();K();var $r="code-graph.json.gz";function It(r){return jt.join(q.getGlobalProjectPath(r),$r)}i(It,"artifactPath");async function Or(r){if(!oe(r))return null;let e=ot(r),t=(()=>{try{return I.query(r,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(c=>({src:c.src,dst:c.dst,edgeType:c.edge_type,confidence:c.confidence}))}catch{return[]}})(),s=at(r)??{symbolCount:e.length,edgeCount:t.length,fileCount:new Set(e.map(c=>c.file)).size,builtAt:new Date().toISOString()},a={version:1,projectId:r,exportedAt:new Date().toISOString(),meta:s,symbols:e,edges:t},o=Buffer.from(JSON.stringify(a),"utf-8"),n=Tr(o,{level:6}),l=It(r);return await de.mkdir(jt.dirname(l),{recursive:!0}),await de.writeFile(l,n),{path:l,bytes:n.length,symbols:e.length,edges:t.length}}i(Or,"exportCodeGraphArtifact");async function Nr(r){let e=It(r),t=await de.readFile(e).catch(()=>null);if(!t)return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"};let s=(()=>{try{let o=Mr(t).toString("utf-8");return{payload:JSON.parse(o)}}catch(o){return{error:`corrupt artifact: ${o instanceof Error?o.message:String(o)}`}}})();if("error"in s)return{imported:!1,symbols:0,edges:0,reason:s.error};let a=s.payload;return a.version!==1||!Array.isArray(a.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:a.projectId&&a.projectId!==r?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${a.projectId}, expected ${r})`}:(I.transaction(r,o=>{o.prepare("DELETE FROM code_symbols").run(),o.prepare("DELETE FROM code_symbol_edges").run();let n=o.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
13
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`),l=o.prepare(`INSERT OR IGNORE INTO code_symbol_edges (src, dst, edge_type, confidence)
14
+ VALUES (?, ?, ?, ?)`);for(let c of a.symbols)n.run(c.id,c.file,c.kind,c.name,c.qname,c.startLine,c.endLine,c.exported?1:0);for(let c of a.edges)l.run(c.src,c.dst,c.edgeType,c.confidence)}),I.setDoc(r,"symbol-graph",{...a.meta,builtAt:a.meta.builtAt??a.exportedAt}),{imported:!0,symbols:a.symbols.length,edges:a.edges.length})}i(Nr,"importCodeGraphArtifact");async function Et(r){if(oe(r))return{bootstrapped:!1,detail:"local index already present"};let e=await Nr(r);return e.imported?{bootstrapped:!0,detail:`imported ${e.symbols} symbols / ${e.edges} edges from per-project cache`}:{bootstrapped:!1,detail:e.reason??"import failed"}}i(Et,"bootstrapCodeGraphFromArtifact");function Rt(r){return r?.cloud?.enabled===!0&&r.cloud.paused!==!0}i(Rt,"shouldAutoUploadCodeGraph");async function Ft(r,e){try{await Or(r)}catch{}if(e.uploadToCloud)try{await Hr(r,e.uploadDependencies)}catch{}}i(Ft,"maybeExportAfterIndex");async function Hr(r,e={}){let t=await import("./code-graph-cloud-65GCWNII.mjs"),s=(e.buildSnapshot??t.buildCloudCodeGraphSnapshot)(r);if(!t.isUploadableGraph(s))return{uploaded:!1,reason:"no symbol index or empty graph"};try{let o=await(e.upload??(async(n,l)=>{let{default:c}=await import("./sync-client-DJWOG2ZQ.mjs");return c.uploadCodeGraph(n,l)}))(r,s);return o.ok?{uploaded:!0,nodes:o.nodes??s.nodes.length,links:o.links??s.links.length}:{uploaded:!1,reason:o.reason??"upload failed or unauthenticated",nodes:s.nodes.length,links:s.links.length}}catch(a){return{uploaded:!1,reason:a instanceof Error?a.message:String(a)}}}i(Hr,"maybeUploadCodeGraphToCloud");import $ from"node:fs/promises";import Lr from"node:os";import D from"node:path";var ue=[{name:"prjct",description:gt,allowedTools:[...ht],body:i(()=>St(),"body"),reference:i(()=>wt(),"reference"),referenceFile:yt}];function Gr(r){let e=r.userInvocable!==!1;return`---
15
+ description: "${r.description}"
16
+ allowed-tools: [${r.allowedTools.map(t=>`"${t}"`).join(", ")}]
17
+ user-invocable: ${e}
18
+ ---`}i(Gr,"buildFrontmatter");function Ur(r){return`${Gr(r)}
19
+
20
+ ${r.body()}`}i(Ur,"buildSkillContent");function _t(){return process.env.HOME||Lr.homedir()}i(_t,"homeDir");function Wr(){return D.join(_t(),".claude","skills")}i(Wr,"claudeSkillsRoot");function Vr(){let r=_t();return[D.join(r,".codex","skills"),D.join(r,".gemini","skills"),D.join(r,".gemini","antigravity","global_skills")]}i(Vr,"compactSkillRoots");function zr(r){return!!(/^# [^\n]+\n[^\n]*\|\s*\d+\s+files\s*\|/m.test(r)||/## Recent Deliveries/m.test(r)||/## Velocity/m.test(r)&&/pts\/sprint/m.test(r))}i(zr,"skillBodyHasProjectStamp");var me=class{static{i(this,"SkillGenerator")}async generateAndInstall(){let e={generated:[],skipped:[]},t=Wr();for(let o of ue)try{let n=Ur(o);if(zr(n))throw new Error("refusing to install project-stamped skill body (isolation guard)");let l=D.join(t,o.name),c=D.join(l,"SKILL.md");await $.mkdir(l,{recursive:!0}),await $.writeFile(c,n,"utf-8"),o.reference&&o.referenceFile&&await $.writeFile(D.join(l,o.referenceFile),o.reference(),"utf-8"),e.generated.push({name:o.name,path:c})}catch(n){f.debug(`Failed to generate skill ${o.name}`,{error:w(n)}),e.skipped.push({name:o.name,reason:w(n)})}let s=Ue();for(let o of Vr())try{let n=D.join(o,"prjct"),l=D.join(n,"SKILL.md");await $.mkdir(n,{recursive:!0}),await $.writeFile(l,s,"utf-8"),e.generated.push({name:"prjct-compact",path:l})}catch(n){f.debug("Compact skill install skipped",{root:o,error:w(n)})}let a=new Set(ue.map(o=>o.name));try{let o=await $.readdir(t,{withFileTypes:!0}).catch(()=>[]);for(let n of o)n.isDirectory()&&n.name.startsWith("prjct-")&&!a.has(n.name)&&await $.rm(D.join(t,n.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return e.generated.length>0&&f.info("Generated portable multi-host skills",{count:e.generated.length,skills:e.generated.map(o=>o.name)}),e}getDefinitions(){return ue}},Mt=new me;function pe(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}i(pe,"emptyGitData");function fe(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}i(fe,"emptyStats");function ge(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}i(ge,"emptyCommands");function he(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}i(he,"emptyStack");function Tt(r,e){let t=[...r.added,...r.modified],s=new Set(t),a=new Set,o=Y(e);if(o)for(let c of t){let d=o.reverse[c];if(d)for(let u of d)s.has(u)||a.add(u)}let n=Array.from(a),l=[...t,...n];return{directlyChanged:t,affectedByImports:n,deleted:r.deleted,allAffected:l}}i(Tt,"propagateChanges");function $t(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}i($t,"affectedDomains");K();B();import Ot from"node:fs/promises";import Jr from"node:path";function Br(r){return typeof Bun<"u"&&Bun.hash?`xxh64:${Bun.hash(r).toString(36)}`:`fnv1a:${([...r].reduce((t,s)=>Math.imul(t^s.charCodeAt(0),16777619),2166136261)>>>0).toString(36)}`}i(Br,"hashContent");async function qr(r,e={}){let t=await Te(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),s=new Map,a=e.changedFilesHint?.length?new Set(e.changedFilesHint):null,o=await $e(t,100,async n=>{try{let l=Jr.join(r,n),c=await Ot.stat(l),d=c.mtime.toISOString(),u=e.storedHashes?.get(n),h=a?.has(n)??!1;if(u&&!h&&u.size===c.size&&u.mtime===d&&u.hash)return{path:n,hash:u.hash,size:c.size,mtime:d};let y=await Ot.readFile(l,"utf-8");return{path:n,hash:Br(y),size:c.size,mtime:d}}catch{return null}});for(let n of o)s.set(n.path,n);return s}i(qr,"computeHashes");function Kr(r,e){let t=[],s=[],a=[];for(let[n,l]of r){let c=e.get(n);c?c.hash!==l.hash?s.push(n):a.push(n):t.push(n)}let o=[];for(let n of e.keys())r.has(n)||o.push(n);return{added:t,modified:s,deleted:o,unchanged:a}}i(Kr,"diffHashes");function ye(r,e){let t=I.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,a]of e)s.run(a.path,a.hash,a.size,a.mtime)})(),I.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}i(ye,"saveHashes");function Yr(r){let e=new Map;try{let t=I.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}i(Yr,"loadHashes");async function Se(r,e,t){let s=Yr(e),a=await qr(r,{storedHashes:s,changedFilesHint:t});return{diff:Kr(a,s),currentHashes:a}}i(Se,"detectChanges");function Nt(r){return I.hasDoc(r,"file-hashes-meta")}i(Nt,"hasHashRegistry");N();var Qr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);async function Ht(r){let{projectId:e,projectPath:t,isFullSync:s,changedFilesHint:a}=r,o={shouldRebuildIndexes:!0,changedDomains:new Set,incrementalInfo:void 0,changedSourceFiles:[],deletedSourceFiles:[]};if(!s&&Nt(e)){try{let{diff:n,currentHashes:l}=await Se(t,e,a),c=n.added.length+n.modified.length+n.deleted.length,d=(()=>{if(c===0&&!a?.length)return{shouldRebuildIndexes:!1,changedDomains:new Set,incrementalInfo:{isIncremental:!0,filesChanged:0,filesUnchanged:n.unchanged.length,indexesRebuilt:!1,affectedDomains:[]},changedSourceFiles:[],deletedSourceFiles:[]};let u=Tt(n,e),h=$t(u.allAffected),y=u.allAffected.some(we);return{shouldRebuildIndexes:y,changedDomains:h,incrementalInfo:{isIncremental:!0,filesChanged:c,filesUnchanged:n.unchanged.length,indexesRebuilt:y,affectedDomains:Array.from(h)},changedSourceFiles:[...n.added,...n.modified].filter(we),deletedSourceFiles:n.deleted.filter(we)}})();return ye(e,l),d}catch(n){f.debug("Incremental detection failed, falling back to full sync",{error:v(n)})}return o}try{let{currentHashes:n}=await Se(t,e,a);ye(e,n)}catch(n){f.debug("Hash computation failed (non-critical)",{error:v(n)})}return o}i(Ht,"detectIncrementalChanges");function we(r){let e=r.substring(r.lastIndexOf("."));return Qr.has(e)}i(we,"isSourceFile");import{z as A}from"zod";var gn=A.object({date:A.string(),tokensSaved:A.number(),syncs:A.number(),avgCompressionRate:A.number(),totalDuration:A.number()}),hn=A.object({agentName:A.string(),usageCount:A.number(),tokensSaved:A.number()}),Lt={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};function Gt(r,e="default"){let t=Lt[e]||Lt.default;return r/1e3*t}i(Gt,"estimateCostSaved");function yn(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}i(yn,"formatCost");K();var Xr=i(r=>({date:r.date,tokensSaved:r.tokens_saved,syncs:r.syncs,avgCompressionRate:r.avg_compression_rate,totalDuration:r.total_duration}),"rowToDaily"),X=i(r=>{let e=new Date;return e.setDate(e.getDate()-r),e.toISOString().split("T")[0]},"dayCutoff"),ke=class{static{i(this,"MetricsStorage")}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),a=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];if(P.run(e,`INSERT INTO metrics_daily (date, tokens_saved, syncs, avg_compression_rate, total_duration)
21
+ VALUES (?, ?, 1, ?, ?)
22
+ ON CONFLICT(date) DO UPDATE SET
23
+ tokens_saved = metrics_daily.tokens_saved + excluded.tokens_saved,
24
+ avg_compression_rate =
25
+ (metrics_daily.avg_compression_rate * metrics_daily.syncs + excluded.avg_compression_rate)
26
+ / (metrics_daily.syncs + 1),
27
+ syncs = metrics_daily.syncs + 1,
28
+ total_duration = metrics_daily.total_duration + excluded.total_duration`,o,s,a,t.duration),t.agents?.length){let n=Math.floor(s/t.agents.length);for(let l of t.agents)P.run(e,`INSERT INTO metrics_agent_usage (agent_name, usage_count, tokens_saved)
29
+ VALUES (?, 1, ?)
30
+ ON CONFLICT(agent_name) DO UPDATE SET
31
+ usage_count = metrics_agent_usage.usage_count + 1,
32
+ tokens_saved = metrics_agent_usage.tokens_saved + excluded.tokens_saved`,l,n)}}async getSummary(e){let t=P.get(e,`SELECT COALESCE(SUM(tokens_saved), 0) AS tokens,
33
+ COALESCE(SUM(syncs), 0) AS syncs,
34
+ COALESCE(SUM(total_duration), 0) AS duration,
35
+ COALESCE(SUM(avg_compression_rate * syncs), 0) AS weighted_rate
36
+ FROM metrics_daily`),s=t?.syncs??0,a=t?.tokens??0,o=i((u,h)=>P.get(e,h?"SELECT COALESCE(SUM(tokens_saved), 0) AS t FROM metrics_daily WHERE date >= ? AND date < ?":"SELECT COALESCE(SUM(tokens_saved), 0) AS t FROM metrics_daily WHERE date >= ?",...h?[u,h]:[u])?.t??0,"rangeTokens"),n=o(X(30)),l=o(X(60),X(30)),c=l>0?(n-l)/l*100:0,d=P.query(e,"SELECT * FROM metrics_agent_usage ORDER BY usage_count DESC LIMIT 5").map(u=>({agentName:u.agent_name,usageCount:u.usage_count,tokensSaved:u.tokens_saved}));return{totalTokensSaved:a,estimatedCostSaved:Gt(a),compressionRate:s>0?(t?.weighted_rate??0)/s:0,syncCount:s,avgSyncDuration:s>0?(t?.duration??0)/s:0,topAgents:d,last30DaysTokens:n,trend:c}}async getDailyStats(e,t=30){return P.query(e,"SELECT * FROM metrics_daily WHERE date >= ? ORDER BY date ASC",X(t)).map(Xr)}async getFirstSyncDate(e){return P.get(e,"SELECT MIN(date) AS d FROM metrics_daily")?.d??""}},Ut=new ke;N();re();import Zr from"node:path";function es(r){return lt(Zr.resolve(r))}i(es,"repoHash");function U(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}i(U,"normalizeKey");function ts(r){return ne(r,e=>`${U(e.name)}::${U(e.source)}`)}i(ts,"dedupePatterns");function rs(r){return ne(r,e=>`${U(e.issue)}::${U(e.file)}::${U(e.source)}`)}i(rs,"dedupeAntiPatterns");var ve=class{static{i(this,"PatternExtractor")}async extract(e){let t=es(e.projectPath),s=[];if(e.context7Verified)for(let c of e.frameworks)s.push({name:`${c} API validation via Context7`,description:`Validate ${c} APIs against current documentation through Context7 before implementation.`,framework:c,source:"context7",confidence:.7});let a=(e.feedback?.patternsDiscovered||[]).map(c=>({name:c,description:`Confirmed during completed tasks: ${c}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(c=>({issue:c,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${c}`,source:"feedback",severity:"medium",confidence:.7})),n=ts([...s,...a]),l=rs([...o]);return{patterns:n,antiPatterns:l,repoPathHash:t}}},ss=new ve,Wt=ss;var Vt=200;async function zt(r,e,t){let{bm25Index:s,originalSize:a}=(()=>{try{let d=Qe(r),u=d?Object.values(d.documents).reduce((h,y)=>h+y.length,0):0;return{bm25Index:d,originalSize:u||e.fileCount*Vt}}catch(d){return f.debug("Could not load BM25 index for metrics",{error:v(d)}),{bm25Index:null,originalSize:e.fileCount*Vt}}})(),o=0,n=a>0?Math.max(0,(a-o)/a):0;try{await Ut.recordSync(r,{originalSize:a,filteredSize:o,duration:t,isWatch:!1})}catch(d){f.debug("Failed to record sync metrics",{error:v(d)})}try{let{velocityStorage:d}=await import("./velocity-storage-UPW6TLK6.mjs");await d.recompute(r)}catch(d){f.debug("Failed to recompute velocity",{error:v(d)})}let l=await import("./developer-evolution-R5BXQH6G.mjs").then(({captureDeveloperSnapshot:d})=>d(r)).catch(d=>(f.debug("Failed to capture dev snapshot",{error:v(d)}),!1)),c={};try{let d=s;d&&(c.bm25Files=d.totalDocs,c.bm25AvgTokens=Math.round(d.avgDocLength),c.bm25VocabSize=Object.keys(d.invertedIndex).length);let u=Y(r);u&&(c.importEdges=u.edgeCount,c.importFiles=u.fileCount);let h=mt(r);h&&(c.cochangeCommits=h.commitsAnalyzed,c.cochangeFiles=h.filesAnalyzed)}catch(d){f.debug("Could not load index stats",{error:v(d)})}return{duration:t,originalSize:a,filteredSize:o,compressionRate:n,indexes:c,developerSnapshotCaptured:l}}i(zt,"recordSyncMetrics");async function Jt(r,e,t,s,a,o){try{let n=t.recentCommits[0]?.hash||null,l=await R.getAggregatedFeedback(r).catch(()=>{});try{let{refreshSkillIndex:d}=await import("./skill-index-OOVAXHYJ.mjs");await d(r,e)}catch{}let c=await Wt.extract({projectId:r,projectPath:e,languages:s.languages,frameworks:Array.from(new Set([...s.frameworks,...a.frameworks])),feedback:l,context7Verified:o});await Q.saveDraft(r,{projectId:r,languages:s.languages,frameworks:s.frameworks,configFiles:[],fileCount:s.fileCount,patterns:c.patterns,antiPatterns:c.antiPatterns,analyzedAt:b(),status:"draft",commitHash:n??void 0})}catch(n){f.debug("Failed to save draft analysis (non-critical)",{error:v(n)})}}i(Jt,"saveDraftAnalysis");async function Bt(r){try{let[e,t,s,a,o]=await Promise.all([Je.archiveOldShipped(r).catch(()=>0),Be.markDormantIdeas(r).catch(()=>0),qe.removeStaleCompleted(r).catch(()=>0),R.archiveStalePausedTasks(r).catch(()=>[]),Ye.capEntries(r).catch(()=>0)]),n=e+t+s+a.length+o;if(n>0){f.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:a.length,memoryCapped:o,total:n});let l=Ve.getStats(r);f.debug("Archive stats",l)}}catch(e){f.debug("Archival failed (non-critical)",{error:v(e)})}}i(Bt,"archiveStaleData");var as=6e4,be=class extends Error{static{i(this,"SyncPhaseTimeoutError")}phase;timeoutMs;constructor(e,t){super(`sync phase '${e}' timed out after ${t}ms. Set PRJCT_SYNC_PHASE_TIMEOUT_MS to tune this guard, or run \`prjct sync --full --md\` if incremental state looks stale.`),this.name="SyncPhaseTimeoutError",this.phase=e,this.timeoutMs=t}};function os(){return Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||as}i(os,"syncPhaseTimeoutMs");function qt(r,e){let t=os(),s=(()=>{let a=Promise.withResolvers(),o=setTimeout(()=>a.reject(new be(e,t)),t);return{promise:a.promise,cancel:i(()=>clearTimeout(o),"cancel")}})();return Promise.race([r,s.promise]).finally(s.cancel)}i(qt,"withPhaseTimeout");async function k(r,e){let t=Date.now();f.debug("sync phase start",{phase:r});try{let s=await e();return f.debug("sync phase done",{phase:r,ms:Date.now()-t}),s}catch(s){throw f.debug("sync phase failed",{phase:r,ms:Date.now()-t,error:w(s)}),s}}i(k,"runSyncPhase");function Kt(r,e={}){let t=e.now??Date.now,s=t(),o=(()=>{try{return r().then(()=>({}),n=>({error:n}))}catch(n){return Promise.resolve({error:n})}})().then(n=>{try{e.onComplete?.({totalMs:t()-s,...n})}catch{}});return{async settle(){await o}}}i(Kt,"startPostIndexWork");K();import is from"node:fs/promises";import cs from"node:path";N();re();N();B();import Pe from"node:fs/promises";import Z from"node:path";var Ce=".prjct/.prjct-state.md",xe=class{static{i(this,"LocalStateGenerator")}async generate(e,t){let s=Z.join(e,Ce);await Pe.mkdir(Z.dirname(s),{recursive:!0});let a=this.toMarkdown(t);await Pe.writeFile(s,a,"utf-8")}async remove(e){try{await Pe.unlink(Z.join(e,Ce))}catch(t){if(!M(t))throw t}}async exists(e){let t=Z.join(e,Ce);return L(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Work Cycle"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((l,c)=>{let d=l.status==="completed"?"\u2705":l.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",u=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${d} ${l.description}${u}`)}),t.push("");let a=s.subtasks.filter(l=>l.status==="completed").length,o=s.subtasks.length,n=Math.round(a/o*100);t.push(`**Progress**: ${a}/${o} (${n}%)`),t.push("")}}else t.push("*No active work cycle*"),t.push(""),t.push('Start work with `p. work "intent"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Work Cycle"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
37
+ `)}},Yt=new xe;var ls=["storage","context","memory","analysis","config","sync"];async function Qt(r){try{await Promise.all(ls.map(e=>is.mkdir(cs.join(r,e),{recursive:!0})))}catch(e){throw new Error(Me(e,r,"project directories"))}}i(Qt,"ensureProjectDirectories");async function Xt(r){let{projectId:e,projectPath:t,cliVersion:s,git:a,stats:o}=r,n=P.getDoc(e,"project")||{},l={...n,projectId:e,repoPath:t,name:o.name,version:o.version,cliVersion:s,techStack:o.frameworks,fileCount:o.fileCount,commitCount:a.commits,stack:o.ecosystem,currentBranch:a.branch,hasUncommittedChanges:a.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:a.recentCommits[0]?.hash||null,lastSyncBranch:a.branch};P.setDoc(e,"project",l)}i(Xt,"updateProjectDoc");async function Zt(r){let{projectId:e,projectPath:t,stats:s,stack:a}=r,n={...await R.read(e)};n.projectId=e,n.stack={language:s.languages[0]||"Unknown",framework:s.frameworks[0]||null},n.domains={hasFrontend:a.hasFrontend,hasBackend:a.hasBackend,hasDatabase:a.hasDatabase,hasTesting:a.hasTesting,hasDocker:a.hasDocker},n.projectType=s.projectType,n.metrics={totalFiles:s.fileCount},n.lastSync=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. work "intent"` to start a work cycle'},await R.write(e,n);try{await Yt.remove(t)}catch(l){f.debug("Legacy local state cleanup failed (optional)",{error:v(l)})}}i(Zt,"updateStateDoc");function er(r,e,t){P.appendEvent(r,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}i(er,"logSyncEvent");import tr from"node:fs/promises";import De from"node:path";N();kr();var rr={async jsonFilesValid(r){let e=Date.now(),t=[],s=De.basename(r);try{await R.read(s)}catch(a){M(a)||t.push(`state: ${v(a)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=De.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],a=[];try{let o=await tr.readdir(t);for(let n of o){if(!n.endsWith(".md"))continue;let l=await tr.readFile(De.join(t,n),"utf-8");for(let c of s)if(c.test(l)){a.push(`${n}: potential sensitive data detected`);break}}}catch(o){if(!M(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${v(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:a.length===0,output:a.length===0?"No sensitive patterns found":void 0,error:a.length>0?a.join("; "):void 0,durationMs:Date.now()-e}}},Ae=class{static{i(this,"SyncVerifier")}async verify(e,t,s){let a=Date.now(),o=[],n=s?.failFast??!1,l=[],c=[rr.jsonFilesValid(t),rr.noSensitiveData(t)];for(let y of c){let C=await y;if(o.push(C),!C.passed&&n){l.push(...s?.checks?.filter(_=>_.enabled!==!1).map(_=>_.name)??[]);break}}if((!n||o.every(y=>y.passed))&&s?.checks)for(let y of s.checks){if(y.enabled===!1){l.push(y.name);continue}let C=await this.runCustomCheck(y,e);if(o.push(C),!C.passed&&n){let _=s.checks.slice(s.checks.indexOf(y)+1);l.push(..._.filter(W=>W.enabled!==!1).map(W=>W.name));break}}let u=o.filter(y=>!y.passed).length,h=o.filter(y=>y.passed).length;return{passed:u===0,checks:o,totalMs:Date.now()-a,failedCount:u,passedCount:h,skippedCount:l.length}}async runCustomCheck(e,t){let s=Date.now(),a=e.command||(e.script?`sh ${e.script}`:null);if(!a)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:n}=await _e(a,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||n.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let n=o;return{name:e.name,passed:!1,error:(n.stderr?.trim()||n.message).slice(0,200),durationMs:Date.now()-s}}}},sr=new Ae;var je=class{static{i(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),a={installed:!1,verified:!1,configPath:"",message:""},o=[];try{if(this.projectId=await T.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:pe(),stats:fe(),commands:ge(),stack:he(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=q.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await ds.rm(ee.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Le()).installed){let m=await ft({autoRepair:!0});m.verified||f.warn(`Codex p. router not ready: ${m.message||"verification failed"}`)}await k("mcp-defaults",()=>ut({silent:!0,verifyContext7:!1}));let c=(await He().catch(()=>null))?.name??"claude";try{Object.assign(a,await k("context7",()=>dt.ensureReady(c)))}catch(m){let g=w(m);f.warn(`Context7 MCP not ready (continuing sync): ${g}`),Object.assign(a,{verified:!1,message:g})}await Qt(this.globalPath),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await k("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:m}=await import("./legacy-crew-sweep-NH5EWEXF.mjs"),g=await m(this.projectPath,this.projectId);(g.checkpointsMigrated||g.teamMigrated||g.checkpointsHandEditWarned||g.teamHandEditWarned||g.ghostDirsPurged.length>0||g.agentFilesRepaired.length>0||g.clientPrjctJunkPurged.length>0||g.errors.length>0)&&f.info("Legacy crew sweep ran",{checkpointsMigrated:g.checkpointsMigrated,teamMigrated:g.teamMigrated,checkpointsHandEditWarned:g.checkpointsHandEditWarned,teamHandEditWarned:g.teamHandEditWarned,ghostDirsPurged:g.ghostDirsPurged,agentFilesRepaired:g.agentFilesRepaired,ghostFilesIngested:g.ghostFilesIngested,clientPrjctJunkPurged:g.clientPrjctJunkPurged,errors:g.errors.length})}catch(m){f.debug("Legacy crew sweep failed (non-critical)",{error:w(m)})}});let[u,h,y,C]=await k("gather",()=>qt(Promise.all([kt(this.projectPath),vt(this.projectPath),bt(this.projectPath),Pt(this.projectPath)]),"gather")),{shouldRebuildIndexes:_,changedDomains:W,incrementalInfo:Re,changedSourceFiles:V,deletedSourceFiles:z}=await k("incremental",()=>Ht({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));try{let{refreshFileInventory:m}=await import("./project-file-inventory-ZAPKPKY6.mjs");await m(this.projectId,this.projectPath)}catch{}try{await Et(this.projectId)}catch{}_&&await k("index",async()=>{try{let m=Re?.isIncremental&&(V.length>0||z.length>0);await Promise.all([m?Ze(this.projectPath,this.projectId,V,z):Xe(this.projectPath,this.projectId),m?rt(this.projectPath,this.projectId,V,z):tt(this.projectPath,this.projectId),m?nt(this.projectPath,this.projectId,V,z):st(this.projectPath,this.projectId),pt(this.projectPath,this.projectId)]);let g=this.projectId,S=this.projectPath,H=await T.readConfig(S).catch(()=>null),E=Rt(H);o.push(Kt(()=>Ft(g,{uploadToCloud:E}),{onComplete:i(({totalMs:x,error:J})=>{f.debug("sync post-index work settled",{projectId:g,uploadToCloud:E,totalMs:x,...J===void 0?{}:{error:w(J)}})},"onComplete")}))}catch(m){f.debug("File ranking index build failed (non-critical)",{error:w(m)})}});let or=Date.now();f.debug("sync phase start",{phase:"skills"});let ir=await Mt.generateAndInstall().catch(m=>{f.debug("Native skill generation failed (non-critical)",{error:w(m)})});f.debug("sync phase done",{phase:"skills",ms:Date.now()-or}),await k("update-files",()=>Promise.all([Xt({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:u,stats:h}),Zt({projectId:this.projectId,projectPath:this.projectPath,stats:h,stack:C}),Promise.resolve(er(this.projectId,u,h)),Jt(this.projectId,this.projectPath,u,h,C,a.verified)]));let te=await Q.getActive(this.projectId),cr={patterns:te?.patterns?.length||0,antiPatterns:te?.antiPatterns?.length||0,criticalAntiPatterns:te?.antiPatterns?.filter(m=>m.severity==="high").length||0},lr=Date.now()-s,Fe=await k("metrics",()=>zt(this.projectId,h,lr)),dr=Fe.developerSnapshotCaptured===!0,ur=await(async()=>{try{let{recomputeProjectStyle:m,formatProjectStyleForSync:g}=await import("./project-style-evolution-7JS75AUP.mjs"),S=await k("project-style",()=>m({projectId:this.projectId,projectPath:this.projectPath,stats:h,stack:C,commands:y,commitHash:u.recentCommits[0]?.hash??null,source:"sync-mechanical"})),H=g(S),E=S.snapshot.payload.metrics.styleCoverage;return{summary:S.snapshot.summary,evolutionMd:H.evolutionMd,patternCount:S.snapshot.patternCount,antiPatternCount:S.snapshot.antiPatternCount,conventionCount:S.snapshot.conventionCount,styleCoverage:typeof E=="number"?E:Number(E)||0,isFirst:S.isFirst,hasChanges:S.delta.hasChanges}}catch(m){f.debug("Project style recompute failed (non-critical)",{error:w(m)});return}})(),mr=await k("work-cost",()=>Ct(this.projectId));await k("archive",()=>Bt(this.projectId));let pr=await k("context-quality",()=>et(this.projectPath,this.projectId)),fr=await k("retention",async()=>{try{let m=await T.readConfig(this.projectPath).catch(()=>null),g=m?.retention?.mode??"apply";if(g==="off")return;let S=g==="dry-run",{applyRetention:H,triageInbox:E}=await import("./retention-D2MVQLOF.mjs"),x=H(this.projectId,{dryRun:S,maxArchive:m?.retention?.maxArchive,maxDelete:m?.retention?.maxDelete}),{inboxMerged:J,inboxArchived:hr}=S?{inboxMerged:0,inboxArchived:0}:(()=>{let j=E(this.projectId);return{inboxMerged:j.merged,inboxArchived:j.archived}})(),{runVaultPurge:yr,vaultHealth:Sr}=await import("./purge-BDREPWEE.mjs"),O=await yr(this.projectId,{projectPath:this.projectPath,dryRun:S,softDeletedPurgeDays:m?.retention?.softDeletedPurgeDays,archivePruneDays:m?.retention?.archivePruneDays,autoSourceMaxLive:m?.retention?.autoSourceMaxLive}),wr=Sr(this.projectId);return{evaluated:x.evaluated,active:x.active,archive:x.wouldArchive,delete:x.wouldDelete,archived:x.archived,deleted:x.deleted,inboxMerged:J,inboxArchived:hr,dryRun:S,samples:x.samples.map(j=>({id:j.id,type:j.type,verdict:j.verdict,score:j.score,reasons:j.reasons,excess:j.excess})),referenceSize:x.referenceSize,vault:{...wr,softDeletedPurged:O.softDeletedPurged,orphanEventsPurged:O.orphanEventsPurged,archivesPruned:O.archivesPruned,autoSourceTrimmed:O.autoSourceTrimmed,distilledDiscarded:O.distilledDiscarded,digestsWritten:O.digestsWritten}}}catch(m){f.debug("retention phase failed",{error:w(m)});return}});await k("install-global",async()=>{await se.installGlobalConfig(),await se.syncCommands()}),await k("install-agent-surfaces",async()=>{let{detectInstalledAgents:m}=await import("./detection-MEYHME4X.mjs"),g=await m(this.projectPath).catch(()=>[]);await it(this.projectPath,{refreshIfAdopted:!0,agents:g})});let gr=await k("verify",async()=>{try{let m=await T.readConfig(this.projectPath);return await sr.verify(this.projectPath,this.globalPath,m?.verification)}catch(m){f.debug("Verification failed (non-critical)",{error:w(m)});return}});if(process.env.PRJCT_WORLD_MODEL_REFRESH==="1"||process.env.PRJCT_DRIFT_REFRESH==="1")try{let m=await import("node:os"),{markDriftRefreshApplied:g}=await import("./drift-refresh-TD3PYPJN.mjs"),S=process.env.PRJCT_CLI_HOME?ee.resolve(process.env.PRJCT_CLI_HOME):ee.join(m.homedir(),".prjct-cli");g(S)}catch{}return await Promise.all(o.map(m=>m.settle())),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:u,stats:h,commands:y,stack:C,context7:{installed:a.installed,verified:a.verified,message:a.message},analysisSummary:cr,contextQuality:pr,retentionDryRun:fr,syncMetrics:Fe,workCost:mr,verification:gr,incremental:Re,projectStyle:ur,developerSnapshotCaptured:dr,generatedSkills:ir}}catch(n){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:pe(),stats:fe(),commands:ge(),stack:he(),context7:{installed:a.installed,verified:a.verified,message:a.message},error:w(n)}}}async getCliVersion(){try{let e=ee.join(__dirname,"..","..","package.json");return(await Oe(e))?.version||"0.0.0"}catch(e){return f.debug("Failed to read CLI version",{error:w(e)}),"0.0.0"}}},Ka=new je;import Ie from"chalk";var nr={task:"Start new work cycle",done:"Complete current work",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},us={task:"work"};function Ee(r){return us[r]??r}i(Ee,"publicCommand");var ar={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};function eo(r,e={}){if(e.quiet)return;let t=ar[r]||"idle",s=ae.getValidCommands(t);if(s.length===0)return;let a=s.map(o=>({cmd:`p. ${Ee(o)}`,desc:nr[o]||o}));console.log(Ie.dim(`
38
+ Next:`));for(let o of a){let n=Ie.cyan(o.cmd.padEnd(12));console.log(Ie.dim(` ${n} \u2192 ${o.desc}`))}}i(eo,"showNextSteps");function to(r,e=!1){let t=ar[r]||"idle";return ae.getValidCommands(t).map(a=>({cmd:e?`prjct ${Ee(a)} --md`:`p. ${Ee(a)}`,desc:nr[a]||a}))}i(to,"getNextSteps");async function ms(r,e={}){let t=await T.getProjectId(r);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):Ke.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}i(ms,"requireProjectId");async function fo(r,e={}){let t=await xt.ensureInit(r);return t.success?ms(r,e):{ok:!1,result:t}}i(fo,"requireProject");export{ps as a,fs as b,Q as c,yn as d,Ut as e,Ka as f,eo as g,to as h,fo as i};
@@ -0,0 +1,43 @@
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}from"./chunk-GAOQHD5S.mjs";import{a as O}from"./chunk-UQVJQME2.mjs";import{a as w,b as I,h as B}from"./chunk-UUULLTQV.mjs";import{a as D,b as W,e as u,g as k}from"./chunk-HDHVBB6Q.mjs";import{c as S,d as T,e as v,f as N,g as M}from"./chunk-GCKILEXJ.mjs";import{a as h}from"./chunk-E66B27AL.mjs";k();W();B();var H=25,$=4,q=100,C=["supersedes","duplicates","superseded-by"];function L(r,e,t){let n=r.get(e);if(n!==void 0)return n;let i=t();return r.set(e,i),i}h(L,"getOrCreateMapValue");function U(r){try{let e=C.map(()=>"?").join(","),t=u.query(r,`SELECT t.entry_id, t.key, t.value
9
+ FROM memory_entry_tags t
10
+ JOIN memory_entries m ON m.id = t.entry_id
11
+ WHERE m.deleted_at IS NULL
12
+ AND t.is_machine = 0
13
+ AND t.key IN (${e})`,...C),n=new Map;for(let o of t){let a=L(n,o.entry_id,()=>({}));a[o.key]=o.value}let i=[...n.entries()].map(([o,a])=>({id:o,tags:a}));return M(i)}catch{return new Set}}h(U,"collectMirrorSupersededIds");function b(r,e){let t=new Map;if(e.length===0)return t;let n=e.map(()=>"?").join(","),i=u.query(r,`SELECT entry_id, key, value FROM memory_entry_tags WHERE entry_id IN (${n})`,...e);for(let o of i){let a=L(t,o.entry_id,()=>({}));a[o.key]=o.value}return t}h(b,"batchTagsByEntryId");function _(r,e,...t){let n=u.query(r,`SELECT id, type, content, provenance, created_at
14
+ FROM memory_entries
15
+ WHERE deleted_at IS NULL ${e}`,...t);if(n.length===0)return[];let i=b(r,n.map(o=>o.id));return n.map(o=>({id:o.id,type:o.type,content:o.content,tags:i.get(o.id)??{},rememberedAt:new Date(o.created_at).toISOString(),provenance:o.provenance??"declared"}))}h(_,"loadV2Entries");function x(r,e,t){if(t&&t.length>0){let n=t.map(()=>"?").join(",");return _(r,`AND type IN (${n}) ORDER BY created_at DESC, rowid DESC LIMIT ?`,...t,e)}return _(r,"ORDER BY created_at DESC, rowid DESC LIMIT ?",e)}h(x,"recallEntriesFromV2");var Y={applyTopicSupersession(r,e,t,n){try{let i=u.get(r,`SELECT COUNT(*) AS c FROM memory_entries
16
+ WHERE project_id = ? AND type = ? AND content_hash != ?
17
+ AND (topic_key = ? OR id IN (
18
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
19
+ ))`,r,e,t,n,n)?.c??0;u.run(r,`UPDATE memory_entries SET topic_key = ?, revision_count = ?
20
+ WHERE project_id = ? AND type = ? AND content_hash = ? AND deleted_at IS NULL`,n,i,r,e,t),u.run(r,`UPDATE memory_entries SET deleted_at = ?
21
+ WHERE project_id = ? AND type = ? AND deleted_at IS NULL AND content_hash != ?
22
+ AND (topic_key = ? OR id IN (
23
+ SELECT entry_id FROM memory_entry_tags WHERE key IN ('topic', 'key') AND value = ?
24
+ ))`,Date.now(),r,e,t,n,n)}catch{}},async remember(r,e){let t={...e.tags??{}},n=e.provenance??"declared",i=D(e.content);{let c=await import("./trust-boundary-ERMDF2C5.mjs").then(l=>l.evaluateMemoryContent).catch(()=>null);if(c){let l=c(e.content,{force:e.force});if(!l.allow){if(e.requireWrite)throw new Error(l.denyMessage);return}}}let{classifyCapturePrecision:o}=await import("./precision-classifier-IVVAXE26.mjs"),a=o(e.content,e.type,{force:e.force===!0});if(a.action==="refuse"){if(e.requireWrite)throw new Error(`precision refuse (${a.reasonCode}): ${a.reason}`);return}a.action==="demote"&&a.demoteTo&&(t.shape_demoted="true",t.original_type=e.type,t.precision_reason=a.reasonCode),e.force&&(t["precision:force"]="true");let m=a.action==="demote"&&a.demoteTo?a.demoteTo:e.type,d=e.projectId??await(async()=>{try{let{default:c}=await import("./config-manager-KYC7WUOS.mjs");return(await c.readConfig(r))?.projectId}catch{return}})();if(!t.file)try{let{inferMemoryFileTag:c}=await import("./infer-memory-file-PIAZ542H.mjs"),l=d?await(async()=>{try{let{stateStorage:E}=await import("./state-storage-KNGP2CQV.mjs"),p=(await E.getCurrentTask(d))?.likelyFiles;return Array.isArray(p)?p.map(f=>typeof f=="string"?f:f?.path).filter(f=>typeof f=="string"&&f.length>0):null}catch{return null}})():null,R=c({content:e.content,tags:t,projectPath:r,cycleFiles:l});R&&(t.file=R,t.file_source="inferred")}catch{}let y=t.topic??t.key;if(d){try{if(u.get(d,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",i,m)){y&&this.applyTopicSupersession(d,m,i,y);return}}catch{}try{let{captureGate:c}=await import("./capture-gate-BQCNMHUC.mjs"),l=c(d,m,e.content,t);if(!l.accept){if(e.requireWrite)throw new Error(`capture refused: ${l.reason}`);return}}catch(c){if(e.requireWrite&&c instanceof Error&&c.message.startsWith("capture refused"))throw c}}let s=await O.log(r,`${w}${m}`,{content:e.content,tags:t,source:e.source,provenance:n,content_hash:i,...d?{project_id:d}:{}},void 0,d||e.requireWrite?{...d?{projectId:d}:{},required:e.requireWrite}:void 0),g=d??s?.projectId;if(g&&y&&s?.eventId!=null&&this.applyTopicSupersession(g,m,i,y),s?.projectId)try{let{usefulnessService:c}=await import("./usefulness-253CZLNY.mjs");c.recordReferences(s.projectId,e.content,t),c.recordCorrection(s.projectId,t)}catch{}if(g)try{let{publishCRUD:c}=await import("./publish-helper-I37V4L7U.mjs"),l=t.spec_id??t.task_id??t.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await c({projectId:g,entityType:"memories",entityId:l,eventType:"upsert",data:{id:l,type:m,content:e.content,tags:t,source:e.source??null,provenance:n,created_at:new Date().toISOString(),rememberedAt:new Date().toISOString()}})}catch{}},searchFts(r,e,t){if(e.length===0||t<=0)return[];let n=e.map(s=>A(s).replace(/[^a-z0-9-]/gi,"")).filter(s=>s.length>=2);if(n.length===0)return[];let i=n.map(s=>`"${s}"*`).join(" OR "),o=(()=>{try{return u.query(r,`SELECT m.id, m.content, m.type, m.provenance, m.created_at
25
+ FROM memory_entries_fts ft
26
+ JOIN memory_entries m ON m.rowid = ft.rowid
27
+ WHERE memory_entries_fts MATCH ?
28
+ AND m.deleted_at IS NULL
29
+ ORDER BY bm25(memory_entries_fts) ASC, m.created_at DESC
30
+ LIMIT ?`,i,t*2)}catch{return[]}})();if(o.length===0)return[];let a=b(r,o.map(s=>s.id)),m=o.map(s=>({id:s.id,type:s.type??"fact",content:s.content,tags:a.get(s.id)??{},rememberedAt:new Date(s.created_at).toISOString(),provenance:s.provenance??"declared"})),d=U(r);return(d.size>0?m.filter(s=>!d.has(s.id)):m).slice(0,t)},recall(r,e={}){let t=e.limit??H,n=Math.max(t*$,q),i=e.types&&e.types.length>0?new Set(e.types):null,o=i?i.has("shipped"):!0,a=i?[...i].some(p=>p!=="shipped"):!0,m=i?[...i].filter(p=>p!=="shipped"):void 0,d=a?x(r,n,m):[],y=o?u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",n):[],s=[...d,...y.map(S)],g=i?s.filter(p=>i.has(p.type)):s,c=e.tags?g.filter(p=>v(p,e.tags??{})):g,R=[...e.topic?c.filter(p=>T(p,e.topic)):c].sort((p,f)=>f.rememberedAt.localeCompare(p.rememberedAt)),E=e.dedupeByKey!==!1?N(R):R;return(()=>{if(e.pruneSuperseded===!1)return E;let p=M(E);return p.size>0?E.filter(f=>!p.has(f.id)):E})().slice(0,t)},recallForFile(r,e,t=3,n={}){if(!e)return[];let i=e.split("/").pop()??e,o=h(c=>c.type==="gotcha"||c.type==="red-herring"||c.type==="anti-pattern"||c.tags?.pattern==="recurring-bug","isPreventive"),a=Math.max(t*5,15),m=(()=>{try{return _(r,`AND file IS NOT NULL
31
+ AND (file = ? OR ? LIKE '%/' || file OR file = ? OR file LIKE '%/' || ?)
32
+ ORDER BY created_at DESC, rowid DESC
33
+ LIMIT ?`,e,e,i,i,a).filter(o)}catch{return[]}})(),d=n.preventiveOnly?[]:(()=>{try{return _(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT 200","context").filter(l=>(l.tags?.files??"").split(",").map(E=>E.trim()).some(E=>E===e||E===i||E.endsWith(`/${i}`)))}catch{return[]}})(),y=[...m,...d],s=M(y);return(s.size>0?y.filter(c=>!s.has(c.id)):y).slice(0,t)},getById(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;try{return _(r,"AND id = ?",`mem_${t[1]}`)[0]??null}catch{return null}},countByType(r,e){try{return u.get(r,"SELECT COUNT(*) AS n FROM memory_entries WHERE project_id IN (?, 'local') AND type = ? AND deleted_at IS NULL",r,e)?.n??0}catch{return 0}},recallByType(r,e,t){if(t<=0)return[];try{return _(r,"AND type = ? ORDER BY created_at DESC, rowid DESC LIMIT ?",e,t)}catch{return[]}},forget(r,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return!1;let n=Number(t[1]),i=`mem_${n}`,o=(()=>{try{return u.get(r,"SELECT id FROM events WHERE id = ? AND type LIKE ?",n,`${I}%`)?(u.run(r,"DELETE FROM events WHERE id = ?",n),!0):!1}catch{return!1}})();try{u.run(r,"DELETE FROM memory_embeddings WHERE memory_id = ?",i)}catch{}let a=(()=>{try{return u.run(r,"UPDATE memory_entries SET deleted_at = ? WHERE id = ? AND deleted_at IS NULL",Date.now(),i).changes>0}catch{return!1}})();return o||a},expandWithLinks(r,e,t=5){if(e.length===0||t<=0)return[];let n=/\bmem[_-](\d+)\b/g,i=["resolves","relates","supersedes","superseded-by","duplicates","spec"],o=new Set(e.map(m=>m.id)),a=[];for(let m of e){if(a.length>=t)break;let d=new Set;for(let y of i){let s=m.tags?.[y];if(s)for(let g of String(s).matchAll(n))d.add(`mem_${g[1]}`)}for(let y of m.content.matchAll(n))d.add(`mem_${y[1]}`);for(let y of d){if(a.length>=t)break;if(o.has(y))continue;o.add(y);let s=Y.getById(r,y);s&&a.push(s)}}return a},unembeddedEntriesForIndex(r,e){try{let t=_(r,`AND type != ?
34
+ AND NOT EXISTS (
35
+ SELECT 1 FROM memory_embeddings me
36
+ WHERE me.memory_id = memory_entries.id AND me.model = ?
37
+ )
38
+ ORDER BY created_at DESC, rowid DESC`,"improvement-signal",e),n=u.query(r,`SELECT s.id, s.name, s.type, s.shipped_at, s.data FROM shipped_features s
39
+ WHERE NOT EXISTS (
40
+ SELECT 1 FROM memory_embeddings me
41
+ WHERE me.memory_id = 'ship_' || s.id AND me.model = ?
42
+ )
43
+ ORDER BY s.shipped_at DESC`,e);return[...t,...n.map(S)]}catch{return[]}},allEntriesForIndex(r){try{let e=_(r,"ORDER BY created_at DESC, rowid DESC"),t=u.query(r,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e,...t.map(S)]}catch{return[]}}};export{Y as a};
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as i}from"./chunk-E66B27AL.mjs";var h=["Context synthesis","Key data","What happened","Why it mattered","Who/author","Model","Token usage","Sentiment","Related files","Feature/domain","Pattern","Anti-pattern","Decision/trap","Outcome","Next implication"],u=h.join(" \xB7 "),p=`Living context synthesis: the same model that just executed the task writes durable project context while fresh. Capture: ${u}. Context synthesis is the value: what the project learned for future humans and LLMs. Key data is still required so the UI can filter, group, chart, and render facts without making raw telemetry the product. For Model and Token usage, write exact values or \`unknown\`. Raw detector output is input, not the final context.`,m='prjct remember context "<Context synthesis: ... \xB7 Key data: ... \xB7 What happened: ... \xB7 Why it mattered: ... \xB7 Who/author: ... \xB7 Model: ... \xB7 Token usage: ... \xB7 Sentiment: ... \xB7 Related files: ... \xB7 Feature/domain: ... \xB7 Pattern: ... \xB7 Anti-pattern: ... \xB7 Decision/trap: ... \xB7 Outcome: ... \xB7 Next implication: ...>"',g={"context synthesis":"contextSynthesis","key data":"keyData","what happened":"whatHappened","why it mattered":"whyItMattered","who/author":"whoAuthor",model:"model","token usage":"tokenUsage",sentiment:"sentiment","related files":"relatedFiles","feature/domain":"featureDomain",pattern:"pattern","anti-pattern":"antiPattern","decision/trap":"decisionTrap",outcome:"outcome","next implication":"nextImplication"};function x(){return["Task closed. Capture rich CONTEXT for this project before details fade.",p,"","Write one concise English entry with this command:",` ${m}`,"","Ground it in the actual task, changed files, user intent/sentiment, and outcome. Do not store a raw quote, transcript snippet, hot-file counter, or detector row as final context.","prjct auto-anchors context entries to commit, author, and files so future sessions can recall the living synthesis."].join(`
9
+ `)}i(x,"buildLivingContextPrompt");function y(t){let e={},d=/(Context synthesis|Key data|What happened|Why it mattered|Who\/author|Model|Token usage|Sentiment|Related files|Feature\/domain|Pattern|Anti-pattern|Decision\/trap|Outcome|Next implication)\s*:\s*/gi,a=[...t.matchAll(d)];for(let r of a.keys()){let n=a[r],o=g[n[1].toLowerCase()];if(!o||n.index===void 0)continue;let c=n.index+n[0].length,l=a[r+1]?.index??t.length,s=t.slice(c,l).replace(/^[\s·|,;-]+|[\s·|,;-]+$/g,"").trim();s&&(o==="relatedFiles"?e.relatedFiles=f(s):e[o]=s)}return e}i(y,"parseLivingContextFields");function f(t){return t.split(/[,;\n]/).map(e=>e.trim()).filter(Boolean)}i(f,"splitRelatedFiles");export{x as a,y as b};
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as h}from"./chunk-GVNMXVVA.mjs";import{b as k}from"./chunk-V37VTXDW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";var _=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"prjct live token",re:/\bprjct_sk_(?:live|test)_[A-Za-z0-9_-]{8,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"GitHub fine-grained PAT",re:/\bgithub_pat_[A-Za-z0-9_]{20,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"Supabase access token",re:/\bsbp_[A-Za-z0-9]{20,}/},{name:"OpenAI project key",re:/\bsk-proj-[A-Za-z0-9_-]{20,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/}];function p(n){if(!n)return[];let o=[];for(let{name:e,re:s}of _)s.test(n)&&o.push(e);return o}i(p,"scanForSecrets");function A(n,o=2e5){let e=Math.max(0,o),s=Math.ceil(e/2),r=Math.floor(e/2),t={head:"",tail:"",full:"",totalChars:0,hasPart:!1},c=i(a=>{if(!a||e===0)return;let l=`${t.hasPart?`
9
+ `:""}${a}`;t.hasPart=!0,t.totalChars+=l.length,t.full!==null&&(t.totalChars<=e?t.full+=l:t.full=null),t.head.length<s&&(t.head+=l.slice(0,s-t.head.length)),r>0&&(t.tail=l.length>=r?l.slice(-r):`${t.tail}${l}`.slice(-r))},"push"),u=i((a,l)=>{if(!(l>8)){if(typeof a=="string"){c(a);return}if(Array.isArray(a)){for(let f of a)u(f,l+1);return}if(a&&typeof a=="object")for(let[f,d]of Object.entries(a))/token|secret|password|api[_-]?key|authorization/i.test(f)&&typeof d=="string"?c(`${f}=${d}`):u(d,l+1)}},"walk");return u(n,0),t.full!==null?t.full:t.totalChars>e?`${t.head}
10
+ ${t.tail}`:t.head}i(A,"flattenToolInputText");var m=64*1024,T=512;function y(n,o){if(!n)return;if(n.length<=2e5){for(let r of p(A(n)))o.add(r);return}let e=m-T,s=Array.from({length:Math.ceil(n.length/e)},(r,t)=>t*e);for(let r of s){let t=Math.min(n.length,r+m);for(let c of p(n.slice(r,t)))o.add(c);if(t===n.length)break}}i(y,"addSecretHits");function b(n,o){let e=[n],s=new WeakSet;for(;e.length>0;){let r=e.pop();if(typeof r=="string"){y(r,o);continue}if(!r||typeof r!="object"||s.has(r))continue;if(s.add(r),Array.isArray(r)){for(let c of[...r].reverse())e.push(c);continue}let t=Object.entries(r);for(let[c,u]of t.reverse())/token|secret|password|api[_-]?key|authorization/i.test(c)&&typeof u=="string"?e.push(`${c}=${u}`):e.push(u)}}i(b,"scanUnknownStrings");function w(n){if(n==null)return[];let o=n,e=o.tool_input??o.toolInput??o.parameters??n,s=new Set;b(e,s);for(let r of[o.command,o.prompt,o.content])typeof r=="string"&&y(r,s);return[...s]}i(w,"scanHookToolInput");var g={allow:!0};function x(n,o={}){let e=n??"";if(!e.trim())return{allow:!1,kind:"memory_content",reason:"empty content",hits:[],denyMessage:"refusing empty memory content"};if(o.force)return g;let s=p(e);if(s.length>0){let t=s.join(", ");return{allow:!1,kind:"secrets",reason:"secret-like content",hits:s,denyMessage:`refusing to store memory that looks like a secret (${t}). Re-run with --force if intentional.`}}let r=h(e);if(r.length>0){let t=r.join(", ");return{allow:!1,kind:"prompt_injection",reason:"prompt-injection-like content",hits:r,denyMessage:`refusing to store memory that looks like prompt injection (${t}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`}}return g}i(x,"evaluateMemoryContent");function $(n){let o=w(n);if(o.length===0)return g;let e=o.join(", ");return{allow:!1,kind:"secrets",reason:"secret pattern in tool input",hits:o,denyMessage:`\u26D4 prjct credential guard: tool input matches secret pattern(s): ${e}. Refusing to run this tool so credentials are not exposed. Remove the secret from the command/content and retry. (This MUST runs on every host \u2014 no PPID / host-env dependency.)`}}i($,"evaluateToolInputSecrets");function M(n,o){let e=k(n,o);return!e.risky||!e.message?{allow:!0,decision:e}:{allow:!1,kind:"package_install",reason:"unknown new packages",hits:e.newPackages,denyMessage:`\u26D4 ${e.message}
11
+ Install denied (strict pack). Verify packages before adding them.`,decision:e}}i(M,"evaluatePackageInstallTrust");function E(n,o){if(n==="imported"){let e=o?.trim()||"workflow rule";return{allow:!1,kind:"workflow_rule",reason:"imported trust_source",hits:["imported"],denyMessage:`Refusing to run imported rule without approval: ${e}. Re-create the rule locally if you trust it.`}}return g}i(E,"evaluateWorkflowRuleExecutable");function Z(n){return n==="imported"}i(Z,"isImportedWorkflowTrust");export{x as a,$ as b,M as c,E as d,Z as e};
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as c,b as w,c as y,d as x,f as h}from"./chunk-BUDZL4DW.mjs";import{a as n,c as d}from"./chunk-E66B27AL.mjs";var j,P,_,v=d(()=>{"use strict";j=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),P=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],_=/(?:import|from)\s+['"]([^'"]+)['"]/g});import E from"node:fs/promises";async function S(t,r){let e=await E.readFile(t,"utf-8").catch(a=>{if(c(a))return null;throw a});if(e===null)return null;let i=(()=>{try{return JSON.parse(e)}catch{return null}})();if(i===null)return await F(t,e),k(t,"Malformed JSON"),null;let o=r.safeParse(i);return o.success?i:(await F(t,e),k(t,O(o.error)),null)}async function F(t,r){let e=`${t}.backup`;try{await E.writeFile(e,r,{encoding:"utf-8",flag:"wx"})}catch{}}function k(t,r){console.error(`[prjct] Warning: Corrupted storage file: ${t}`),console.error(`[prjct] Reason: ${r}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function O(t){return t.issues.slice(0,3).map(r=>`${r.path.join(".")}: ${r.message}`).join("; ")}var T=d(()=>{"use strict";h();n(S,"safeRead");n(F,"createBackup");n(k,"logCorruption");n(O,"formatZodError")});import s from"node:fs/promises";import m from"node:path";async function b(t,r,e){try{return await e()}catch(i){throw y(i)||w(i)?new Error(x(i,t,r)):i}}async function M(t,r={}){let e=[],i=r.maxFiles??1/0,o=r.dotfileAllowlist?new Set(r.dotfileAllowlist):null;async function a(l){if(e.length>=i)return;let u=await s.readdir(l,{withFileTypes:!0}).catch(()=>[]);for(let p of u){if(e.length>=i)break;let f=String(p.name);if(j.has(f)||r.skipDotfiles&&f.startsWith(".")&&(!o||!o.has(f)))continue;let g=m.join(l,f);p.isDirectory()?await a(g):p.isFile()&&e.push(m.relative(t,g))}}return n(a,"walk"),await a(t),e}async function Z(t,r,e){let i=[],o=Array.from({length:Math.ceil(t.length/r)},(a,l)=>l*r);for(let a of o){let l=await Promise.all(t.slice(a,a+r).map(e));for(let u of l)u!==null&&i.push(u)}return i}async function G(t,r=null,e){if(e)return await S(t,e)??r;try{let i=await s.readFile(t,"utf-8");return JSON.parse(i)}catch(i){if(c(i))return r;throw i}}async function K(t,r,e=2){await b(t,"config",async()=>{let i=m.dirname(t);await s.mkdir(i,{recursive:!0});let o=`${JSON.stringify(r,null,e)}
9
+ `;await s.writeFile(t,o,"utf-8")})}async function X(t,r=""){try{return await s.readFile(t,"utf-8")}catch(e){if(c(e))return r;throw e}}async function q(t,r){await b(t,"file",async()=>{let e=m.dirname(t);await s.mkdir(e,{recursive:!0}),await s.writeFile(t,r,"utf-8")})}async function B(t){try{return await s.access(t),!0}catch(r){if(c(r))return!1;throw r}}async function H(t){try{return(await s.stat(t)).isDirectory()}catch(r){if(c(r))return!1;throw r}}async function Q(t){await s.mkdir(t,{recursive:!0})}async function U(t,r={}){try{return(await s.readdir(t,{withFileTypes:!0})).filter(o=>!r.filesOnly||o.isFile()).filter(o=>!r.dirsOnly||o.isDirectory()).filter(o=>!r.extension||o.name.endsWith(r.extension)).map(o=>o.name)}catch(e){if(c(e))return[];throw e}}var R=d(()=>{"use strict";v();T();h();n(b,"withWriteErrorContext");n(M,"walkDir");n(Z,"batchProcess");n(G,"readJson");n(K,"writeJson");n(X,"readFile");n(q,"writeFile");n(B,"fileExists");n(H,"dirExists");n(Q,"ensureDir");n(U,"listFiles")});export{P as a,_ as b,v as c,M as d,Z as e,G as f,K as g,X as h,q as i,B as j,H as k,Q as l,U as m,R as n};
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as u,e as a,f as g}from"./chunk-BUDZL4DW.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import f from"node:fs/promises";import h from"node:path";function p(t,n,e,r){if(!t)return{content:n,action:"created"};if(!(t.includes(e)&&t.includes(r)))return{content:`${t}
9
+
10
+ ${n}`,action:"appended"};let i=t.substring(0,t.indexOf(e)),s=t.substring(t.indexOf(r)+r.length),c=n.includes(e)&&n.includes(r)?n.substring(n.indexOf(e),n.indexOf(r)+r.length):n;return{content:i+c+s,action:"updated"}}d(p,"mergeWithMarkers");g();var l="<!-- prjct:routing - do not edit between markers -->",m="<!-- /prjct:routing - managed by prjct -->",E="## prjct\nThis file holds no rules. Tasks: `work` \xB7 ships: `ship` (confirm). Rest pull-on-demand; known verbs bare (never work-wrap).\n- work: `prjct work --md` \xB7 ship: `prjct ship`\n- pull: `sync` / `search` / `remember` / `guard` / `land` / `prime`\n- deep: `prjct workflows --md` \xB7 grade: `prjct harness score --md`";async function T(t,n,e){let r=h.join(t,n),o=await f.readFile(r,"utf-8").catch(c=>{if(!u(c))throw new Error(`Could not read ${r}: ${a(c)}`);return null}),i=o!==null,s=p(o??"",e,l,m);return i&&s.content===o?{action:"unchanged",path:r}:(await f.writeFile(r,s.content,"utf-8"),{action:i?"updated":"created",path:r})}d(T,"writeRoutingBlock");export{p as a,l as b,m as c,E as d,T as e};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{c as t}from"./chunk-ZZ65CN5F.mjs";import{a as e}from"./chunk-E66B27AL.mjs";async function f(r,o,i){if(i.length!==0)try{let{resolveActiveTask:s}=await import("./task-service-RRFG5P7N.mjs"),c=await s(r,o);c?.id&&t.recordSurfaced(r,i,c.id);for(let n of i)t.recordFetch(r,n)}catch{}}e(f,"recordSurfacedForActiveTask");export{f as a};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as r}from"./chunk-E66B27AL.mjs";var c=["Popper","Copernicus","McClintock","Volta","Ada","Turing","Hypatia","Feynman","Lovelace","Curie","Hopper","Tesla","Noether","Faraday","Kepler","Mendel","Dirac","Shannon","Babbage","Boole","Planck","Hubble","Sagan","Meitner","Ramanujan","Euclid","Gauss","Fourier","Pascal","Archimedes"];function u(e){return e.split("").reduce((t,n)=>Math.imul(t^n.charCodeAt(0),16777619),2166136261)>>>0}r(u,"hashSeed");function g(e,t=[]){let n=new Set([...t].map(i=>i.toLowerCase())),a=c.filter(i=>!n.has(i.toLowerCase())),s=a.length>0?a:[...c],o=u(e)%s.length;return s[o]}r(g,"pickCodename");function l(e,t){let n=new Set;return e.map((a,s)=>{let o=g(`${t}::${a}::${s}`,n);return n.add(o.toLowerCase()),{role:a,name:o}})}r(l,"assignAgentCast");var p=["explore","implement","review"],m=["leader","implementer","reviewer"];function C(e){return e.length===0?"":`Cast: ${e.map(t=>`${t.role}\u2192${t.name}`).join(" \xB7 ")}`}r(C,"formatAgentCastLine");function h(e){return e.length===0?"":`Name each subagent when you dispatch: ${e.map(n=>`\`${n.name}\` (${n.role})`).join(", ")}. Reuse these labels in logs/claims so the cast stays legible.`}r(h,"formatAgentCastDispatchHint");function A(e,t){return e==="parallel"?l([...p],t):e==="crew"?l([...m],t):[]}r(A,"castForFanout");export{g as a,C as b,h as c,A as d};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as o}from"./chunk-TPESWBA7.mjs";import{a as r}from"./chunk-E66B27AL.mjs";var c=new Set(["claude","codex","gemini","grok","cursor","opencode","pi","antigravity","unknown"]);function p(){let n=process.env.PRJCT_AGENT_RUNTIME?.trim().toLowerCase();return n&&c.has(n)?n:n?n.slice(0,32):process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||process.env.CLAUDECODE?"claude":process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1"?"codex":process.env.GEMINI_CLI||process.env.GEMINI_API_KEY?"gemini":process.env.CURSOR_TRACE_ID||process.env.CURSOR_AGENT||process.env.CURSOR_SESSION_ID?"cursor":process.env.GROK_API_KEY||process.env.XAI_API_KEY||process.env.GROK_SESSION?"grok":process.env.OPENCODE||process.env.OPENCODE_SESSION||process.env.OPENCODE_CONFIG?"opencode":process.env.PI_CODING_AGENT_DIR||process.env.PI_SESSION||process.env.PI_AGENT?"pi":"unknown"}r(p,"detectRuntimeAgent");function u(n="session"){let e=p(),s=process.env.CLAUDE_SESSION_ID||process.env.CODEX_SESSION_ID||process.env.PRJCT_SESSION_ID||void 0,t=process.env.PRJCT_AGENT?.trim(),i=t&&t.length>0?t:o(`identity:${e}:${n}`);return{agent:e,identity:i,sessionId:s}}r(u,"resolveCallerIdentity");function d(n){let e=n.trim().toLowerCase();return e==="claude-code"||e==="anthropic"?"claude":e==="openai"||e==="oai"?"codex":e==="google"?"gemini":e==="xai"||e==="grok-build"?"grok":e==="opencode-ai"||e==="open-code"?"opencode":e==="pi-coding-agent"||e==="pi-agent"?"pi":e.slice(0,32)}r(d,"normalizeAgentName");function E(n,e){return n?!!(n.ownerSessionId&&e.sessionId&&n.ownerSessionId===e.sessionId||n.ownerIdentity&&e.identity&&n.ownerIdentity===e.identity):!1}r(E,"sameOwner");export{c as a,p as b,u as c,d,E as e};