prjct-cli 3.91.0 → 3.92.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 (92) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/bin/hook-chunks/{agent-switch-IQ5KSRKD.mjs → agent-switch-XMFUTNNV.mjs} +1 -1
  3. package/dist/bin/hook-chunks/{analysis-LBYZSJKT.mjs → analysis-PFGKPYWQ.mjs} +6 -6
  4. package/dist/bin/hook-chunks/auto-flush-QZ3YIQP6.mjs +8 -0
  5. package/dist/bin/hook-chunks/{capture-gate-BQCNMHUC.mjs → capture-gate-2FXYVHNF.mjs} +1 -1
  6. package/dist/bin/hook-chunks/{chunk-6AFM6WRB.mjs → chunk-2HTDCLZD.mjs} +2 -2
  7. package/dist/bin/hook-chunks/{chunk-LGJUQEAU.mjs → chunk-2WPR5GFT.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{chunk-LPB3HUJ2.mjs → chunk-3X7TBM4A.mjs} +1 -1
  9. package/dist/bin/hook-chunks/{chunk-LJLUP4FF.mjs → chunk-5PEHJEFE.mjs} +1 -1
  10. package/dist/bin/hook-chunks/{chunk-B7GMU46T.mjs → chunk-7JE6VTLN.mjs} +3 -3
  11. package/dist/bin/hook-chunks/{chunk-EHBEHLYN.mjs → chunk-AWD2AQVJ.mjs} +1 -1
  12. package/dist/bin/hook-chunks/{chunk-IKUGYUAI.mjs → chunk-BZ5UR7G3.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-HBLR7BVG.mjs → chunk-CDCCAU22.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-YKMJI6TF.mjs → chunk-CPHUFXD2.mjs} +2 -2
  15. package/dist/bin/hook-chunks/{chunk-PSP56GGF.mjs → chunk-CQUG6SO2.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-RRWPDRYR.mjs → chunk-DGBDMUBL.mjs} +2 -2
  17. package/dist/bin/hook-chunks/{chunk-UQVJQME2.mjs → chunk-DVBBB5BS.mjs} +1 -1
  18. package/dist/bin/hook-chunks/{chunk-XEFIIDHM.mjs → chunk-GELCZWKW.mjs} +1 -1
  19. package/dist/bin/hook-chunks/{chunk-AW25AWN5.mjs → chunk-HIFIDMH5.mjs} +1 -1
  20. package/dist/bin/hook-chunks/{chunk-UHW35BPE.mjs → chunk-HX42HFII.mjs} +4 -4
  21. package/dist/bin/hook-chunks/{chunk-QZSJSXJV.mjs → chunk-I5BDN25C.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-RJ2BRRMH.mjs → chunk-KB3P6XTL.mjs} +2 -2
  23. package/dist/bin/hook-chunks/{chunk-TFGJVT6F.mjs → chunk-MAHTF6JG.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-FEH4IPIC.mjs → chunk-MQVVNX63.mjs} +1 -1
  25. package/dist/bin/hook-chunks/{chunk-3WKDMAS7.mjs → chunk-NLDL3N6R.mjs} +1 -1
  26. package/dist/bin/hook-chunks/chunk-OGOCHZ3S.mjs +13 -0
  27. package/dist/bin/hook-chunks/{chunk-M3ZOJVPA.mjs → chunk-OL6ITIAZ.mjs} +2 -2
  28. package/dist/bin/hook-chunks/{chunk-W5OWBOLH.mjs → chunk-OLKNK2HB.mjs} +1 -1
  29. package/dist/bin/hook-chunks/{chunk-DGQYQSUK.mjs → chunk-OP467HW6.mjs} +2 -2
  30. package/dist/bin/hook-chunks/{chunk-PXJKXBTM.mjs → chunk-S4TB2OFJ.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-AEYONUUY.mjs → chunk-SY2FRLJF.mjs} +1 -1
  32. package/dist/bin/hook-chunks/{chunk-RAHFKGM6.mjs → chunk-TBM7736J.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-A5MUSARI.mjs → chunk-WSFHSXBZ.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-D6KT763C.mjs → chunk-XHDNPEAN.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-YG7KBQYJ.mjs → chunk-Y7CKMFNW.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{chunk-OIEZAHLC.mjs → chunk-ZNQXFWSI.mjs} +1 -1
  37. package/dist/bin/hook-chunks/{chunk-D4S3IRD3.mjs → chunk-ZX6BC2EB.mjs} +1 -1
  38. package/dist/bin/hook-chunks/{codex-skill-7IURPY6B.mjs → codex-skill-2N6656SR.mjs} +1 -1
  39. package/dist/bin/hook-chunks/{command-installer-BVHQUSL4.mjs → command-installer-XSKQS3IS.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{config-manager-KYC7WUOS.mjs → config-manager-YZANYLPV.mjs} +1 -1
  41. package/dist/bin/hook-chunks/{cwd-changed-56X7BNS6.mjs → cwd-changed-NJ6RYVOJ.mjs} +1 -1
  42. package/dist/bin/hook-chunks/{distill-6C6YIFOE.mjs → distill-IABVRW2U.mjs} +1 -1
  43. package/dist/bin/hook-chunks/{enriched-recall-6ZZNKAJZ.mjs → enriched-recall-NDASPZXZ.mjs} +1 -1
  44. package/dist/bin/hook-chunks/{format-YOYMJSLY.mjs → format-NIBVWBGR.mjs} +1 -1
  45. package/dist/bin/hook-chunks/{judgment-receipt-2U7D6HS4.mjs → judgment-receipt-HTNEOJLT.mjs} +1 -1
  46. package/dist/bin/hook-chunks/{land-cue-SS23JBAX.mjs → land-cue-FNLP4IAB.mjs} +1 -1
  47. package/dist/bin/hook-chunks/{land-synthesis-OATL5BNP.mjs → land-synthesis-HBPIXP5S.mjs} +1 -1
  48. package/dist/bin/hook-chunks/{legacy-crew-sweep-NH5EWEXF.mjs → legacy-crew-sweep-2MLYPNQR.mjs} +2 -2
  49. package/dist/bin/hook-chunks/{memory-index-677MUBCZ.mjs → memory-index-MQCHZFUE.mjs} +1 -1
  50. package/dist/bin/hook-chunks/{notification-S2IJJ6JW.mjs → notification-VQM2AMNS.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{pack-integrity-L3BL7CGO.mjs → pack-integrity-BKLDNYE5.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{pack-manager-SU53HCKK.mjs → pack-manager-ASWLKYGP.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{planning-ZYFCFU7N.mjs → planning-QBSY272P.mjs} +2 -2
  54. package/dist/bin/hook-chunks/{post-edit-JD7YFEBZ.mjs → post-edit-VTLDHWI3.mjs} +1 -1
  55. package/dist/bin/hook-chunks/{pre-bash-VIABNO5E.mjs → pre-bash-JR6257XO.mjs} +1 -1
  56. package/dist/bin/hook-chunks/{pre-commit-NVQVXHZQ.mjs → pre-commit-BYUFDN2N.mjs} +1 -1
  57. package/dist/bin/hook-chunks/{pre-edit-V4RD45C4.mjs → pre-edit-MHROFDS3.mjs} +1 -1
  58. package/dist/bin/hook-chunks/{pre-package-KFJZXI5T.mjs → pre-package-P7CLTJJV.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{pre-search-7KRU5D2O.mjs → pre-search-BCQHPE46.mjs} +1 -1
  60. package/dist/bin/hook-chunks/{prjct-md-FMCPUMQT.mjs → prjct-md-WE6WFVL3.mjs} +1 -1
  61. package/dist/bin/hook-chunks/{project-agent-surfaces-TD7BHI25.mjs → project-agent-surfaces-A6HGZPAL.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{project-memory-ZVZSLPB5.mjs → project-memory-ON54KZEM.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{project-style-evolution-7JS75AUP.mjs → project-style-evolution-T27I5N65.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{prompt-S4MMIXH5.mjs → prompt-JIOMJCGV.mjs} +2 -2
  65. package/dist/bin/hook-chunks/{purge-BDREPWEE.mjs → purge-QQ6XILZD.mjs} +1 -1
  66. package/dist/bin/hook-chunks/{retention-D2MVQLOF.mjs → retention-E7WGFL47.mjs} +1 -1
  67. package/dist/bin/hook-chunks/{sdd-ZO4DP23G.mjs → sdd-PV6KWXE4.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{session-continuity-FNNUMOXB.mjs → session-continuity-5CLT5YBL.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{session-start-HA7IRBFX.mjs → session-start-ATYLOUKB.mjs} +1 -1
  70. package/dist/bin/hook-chunks/{setup-7L3NXNRH.mjs → setup-VL7YXVE5.mjs} +2 -2
  71. package/dist/bin/hook-chunks/{shipping-GX4HFYJ3.mjs → shipping-LVTFVSWJ.mjs} +4 -4
  72. package/dist/bin/hook-chunks/{spec-context-inference-KER2R3F3.mjs → spec-context-inference-U6BGGB2Q.mjs} +2 -2
  73. package/dist/bin/hook-chunks/spec-service-2DVDFOR7.mjs +11 -0
  74. package/dist/bin/hook-chunks/spec-task-breakdown-MPNRRTNZ.mjs +8 -0
  75. package/dist/bin/hook-chunks/{stop-HPZCLDPM.mjs → stop-GBUGB5OE.mjs} +2 -2
  76. package/dist/bin/hook-chunks/{subagent-start-7KZUTKV5.mjs → subagent-start-HURF2GI7.mjs} +1 -1
  77. package/dist/bin/hook-chunks/{subagent-stop-7C72RWGO.mjs → subagent-stop-WJECHEXI.mjs} +1 -1
  78. package/dist/bin/hook-chunks/{surface-attribution-PDYR6DVA.mjs → surface-attribution-BDKFYUOJ.mjs} +1 -1
  79. package/dist/bin/hook-chunks/{task-service-RRFG5P7N.mjs → task-service-BM2JQXMS.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{tdd-XQUU4C23.mjs → tdd-UJDJUJ3E.mjs} +1 -1
  81. package/dist/bin/hook-chunks/{template-loader-4QMIMOBY.mjs → template-loader-BFTLPG2W.mjs} +1 -1
  82. package/dist/bin/hook-chunks/{weak-model-mode-M6D23IIM.mjs → weak-model-mode-GLXXHG32.mjs} +1 -1
  83. package/dist/bin/hook-chunks/{work-scope-6FG6PSAV.mjs → work-scope-VTF6SKLY.mjs} +1 -1
  84. package/dist/bin/prjct-core.mjs +686 -682
  85. package/dist/bin/prjct-hooks.mjs +1 -1
  86. package/dist/daemon/entry.mjs +589 -585
  87. package/dist/mcp/server.mjs +299 -296
  88. package/package.json +1 -1
  89. package/dist/bin/hook-chunks/auto-flush-GW3FP763.mjs +0 -8
  90. package/dist/bin/hook-chunks/chunk-LWCHQIJ7.mjs +0 -11
  91. package/dist/bin/hook-chunks/spec-service-G3RLCJ2G.mjs +0 -11
  92. package/dist/bin/hook-chunks/spec-task-breakdown-YPJ76OWR.mjs +0 -8
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as 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
8
+ import{a as A}from"./chunk-GAOQHD5S.mjs";import{a as O}from"./chunk-DVBBB5BS.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
9
  FROM memory_entry_tags t
10
10
  JOIN memory_entries m ON m.id = t.entry_id
11
11
  WHERE m.deleted_at IS NULL
@@ -21,7 +21,7 @@ import{a as A}from"./chunk-GAOQHD5S.mjs";import{a as O}from"./chunk-UQVJQME2.mjs
21
21
  WHERE project_id = ? AND type = ? AND deleted_at IS NULL AND content_hash != ?
22
22
  AND (topic_key = ? OR id IN (
23
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
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-YZANYLPV.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-2FXYVHNF.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
25
  FROM memory_entries_fts ft
26
26
  JOIN memory_entries m ON m.rowid = ft.rowid
27
27
  WHERE memory_entries_fts MATCH ?
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as c,e as p,h as l}from"./chunk-UUULLTQV.mjs";import{b as E,c as d}from"./chunk-3LG3ACQV.mjs";import{b as m}from"./chunk-W5OWBOLH.mjs";import{e as i,g as R}from"./chunk-HDHVBB6Q.mjs";import{a as g}from"./chunk-E66B27AL.mjs";l();R();var y=class{static{g(this,"MemoryService")}async log(t,r,n,o,s){try{let e=s?.projectId??await m.getProjectId(t);return e?{eventId:i.appendEvent(e,`memory.${r}`,{...n,author:o}),projectId:e}:null}catch(e){let a=e instanceof Error?e.message:String(e);if(s?.required)throw new Error(a);return console.error(`Memory log error: ${a}`),null}}async clear(t){try{let r=await m.getProjectId(t);if(!r)return;i.run(r,"DELETE FROM events WHERE type >= ? AND type < ?",...c)}catch(r){console.error(`Memory clear error: ${r instanceof Error?r.message:String(r)}`)}}async getRecentEvents(t,r=100){try{return i.query(t,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...c,r).reverse().map(o=>{let s=JSON.parse(o.data);return{timestamp:o.timestamp,action:o.type.replace("memory.",""),...s}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(t){try{let n=i.get(t,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...c,...p)?.cnt??0;if(n<=E.MEMORY_MAX_ENTRIES)return 0;let o=n-E.MEMORY_MAX_ENTRIES,s=i.query(t,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...c,...p,o);return d.archiveMany(t,s.map((e,a)=>({entityType:"memory_entry",entityId:`memory-${e.timestamp||a}`,entityData:{type:e.type,data:JSON.parse(e.data),timestamp:e.timestamp},summary:e.type.replace("memory.",""),reason:"overflow"}))),i.transaction(t,e=>{let a=e.prepare("DELETE FROM events WHERE id = ?");for(let u of s)a.run(u.id)}),o}catch(r){return console.error(`Memory cap error: ${r instanceof Error?r.message:String(r)}`),0}}},O=new y;export{O as a};
8
+ import{d as c,e as p,h as l}from"./chunk-UUULLTQV.mjs";import{b as E,c as d}from"./chunk-3LG3ACQV.mjs";import{b as m}from"./chunk-OLKNK2HB.mjs";import{e as i,g as R}from"./chunk-HDHVBB6Q.mjs";import{a as g}from"./chunk-E66B27AL.mjs";l();R();var y=class{static{g(this,"MemoryService")}async log(t,r,n,o,s){try{let e=s?.projectId??await m.getProjectId(t);return e?{eventId:i.appendEvent(e,`memory.${r}`,{...n,author:o}),projectId:e}:null}catch(e){let a=e instanceof Error?e.message:String(e);if(s?.required)throw new Error(a);return console.error(`Memory log error: ${a}`),null}}async clear(t){try{let r=await m.getProjectId(t);if(!r)return;i.run(r,"DELETE FROM events WHERE type >= ? AND type < ?",...c)}catch(r){console.error(`Memory clear error: ${r instanceof Error?r.message:String(r)}`)}}async getRecentEvents(t,r=100){try{return i.query(t,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...c,r).reverse().map(o=>{let s=JSON.parse(o.data);return{timestamp:o.timestamp,action:o.type.replace("memory.",""),...s}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(t){try{let n=i.get(t,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...c,...p)?.cnt??0;if(n<=E.MEMORY_MAX_ENTRIES)return 0;let o=n-E.MEMORY_MAX_ENTRIES,s=i.query(t,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...c,...p,o);return d.archiveMany(t,s.map((e,a)=>({entityType:"memory_entry",entityId:`memory-${e.timestamp||a}`,entityData:{type:e.type,data:JSON.parse(e.data),timestamp:e.timestamp},summary:e.type.replace("memory.",""),reason:"overflow"}))),i.transaction(t,e=>{let a=e.prepare("DELETE FROM events WHERE id = ?");for(let u of s)a.run(u.id)}),o}catch(r){return console.error(`Memory cap error: ${r instanceof Error?r.message:String(r)}`),0}}},O=new y;export{O as a};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as g}from"./chunk-QDQ7DTDV.mjs";import{a as o}from"./chunk-DYHYDHCW.mjs";import{o as x,r as R}from"./chunk-AKIN5WSQ.mjs";import{j as d,n as H}from"./chunk-SVZHJZ5T.mjs";import{c as h}from"./chunk-OIEZAHLC.mjs";import{b as m,e as j}from"./chunk-D4S3IRD3.mjs";import{e as p,f as v}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import l from"node:fs/promises";import b from"node:os";import S from"node:path";v();H();j();R();var k="prjct-codex-router",C=1024;function w(){return S.join(b.homedir(),".codex","skills","prjct","SKILL.md")}i(w,"getCodexSkillPath");function E(t){return`<!-- ${k}: ${JSON.stringify({v:m,h:t})} -->`}i(E,"getCodexSkillMetadata");function I(t){let e=t.match(new RegExp(`<!--\\s*${k}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let r=JSON.parse(e[1]);return{version:r.v??r.version,templateHash:r.h??r.templateHash}}catch{return null}}i(I,"parseCodexSkillMetadata");function K(t){return g(t).slice(0,12)}i(K,"hashContent");async function y(){return h("codex/SKILL.md")}i(y,"loadCodexSkillTemplate");function L(t){let e=t.trimEnd(),r=K(e),s=E(r);return{content:`${e}
8
+ import{a as g}from"./chunk-QDQ7DTDV.mjs";import{a as o}from"./chunk-DYHYDHCW.mjs";import{o as x,r as R}from"./chunk-AKIN5WSQ.mjs";import{j as d,n as H}from"./chunk-SVZHJZ5T.mjs";import{c as h}from"./chunk-ZNQXFWSI.mjs";import{b as m,e as j}from"./chunk-ZX6BC2EB.mjs";import{e as p,f as v}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import l from"node:fs/promises";import b from"node:os";import S from"node:path";v();H();j();R();var k="prjct-codex-router",C=1024;function w(){return S.join(b.homedir(),".codex","skills","prjct","SKILL.md")}i(w,"getCodexSkillPath");function E(t){return`<!-- ${k}: ${JSON.stringify({v:m,h:t})} -->`}i(E,"getCodexSkillMetadata");function I(t){let e=t.match(new RegExp(`<!--\\s*${k}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let r=JSON.parse(e[1]);return{version:r.v??r.version,templateHash:r.h??r.templateHash}}catch{return null}}i(I,"parseCodexSkillMetadata");function K(t){return g(t).slice(0,12)}i(K,"hashContent");async function y(){return h("codex/SKILL.md")}i(y,"loadCodexSkillTemplate");function L(t){let e=t.trimEnd(),r=K(e),s=E(r);return{content:`${e}
9
9
 
10
10
  ${s}
11
11
  `,templateHash:r}}i(L,"buildCodexSkillContent");async function P(){try{let t=w(),e=S.dirname(t);await l.mkdir(e,{recursive:!0});let r=await d(t),s=await y();if(!s)return o.warn("Codex SKILL.md template not found"),{success:!1,action:null};let a=L(s),n=Buffer.byteLength(a.content,"utf-8");return n>C&&o.warn(`Codex SKILL.md is ${n} bytes \u2014 over Codex's ~${C}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),r&&await l.readFile(t,"utf-8").catch(()=>"")===a.content?{success:!0,action:"unchanged"}:(await l.writeFile(t,a.content,"utf-8"),{success:!0,action:r?"updated":"created"})}catch(t){return o.warn(`Codex skill warning: ${p(t)}`),{success:!1,action:null}}}i(P,"installCodexSkill");async function B(t={}){let e=w();if(!(await x()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await y();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let a=L(s),n=i(async()=>t.autoRepair?(await P()).success:!1,"maybeRepair");if(!await d(e)&&!await n())return{installed:!0,verified:!1,skillPath:e,templateHash:a.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};let c=i(async()=>{let u=await l.readFile(e,"utf-8").catch(()=>""),f=I(u);return{matches:f?.version===m&&f?.templateHash===a.templateHash}},"readVerification");if(!(await c()).matches){if(!await n())return{installed:!0,verified:!1,skillPath:e,templateHash:a.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(!(await c()).matches)return{installed:!0,verified:!1,skillPath:e,templateHash:a.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:a.templateHash,message:"Codex p. router ready"}}i(B,"verifyCodexPRouterReady");export{C as a,L as b,P as c,B as d};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as O}from"./chunk-HZIORCPO.mjs";import{a as A}from"./chunk-WDGDFXSB.mjs";import{b as h}from"./chunk-NWY5M34K.mjs";import{b as I}from"./chunk-LWCHQIJ7.mjs";import{a as P,h as tt}from"./chunk-UUULLTQV.mjs";import{a as w,b,c as S}from"./chunk-3JUE6MNF.mjs";import{c as E}from"./chunk-YUOTOCKK.mjs";import{b as R}from"./chunk-BISPGBNN.mjs";import{a as x}from"./chunk-AOPJ4Z6O.mjs";import{a as m}from"./chunk-AUUWQH3S.mjs";import{b as N}from"./chunk-MEQS4VPO.mjs";import{a as T,b as j,e as p,g as _}from"./chunk-HDHVBB6Q.mjs";import{b as D,e as Z}from"./chunk-AKIN5WSQ.mjs";import{a as d}from"./chunk-E66B27AL.mjs";_();function g(e,t,n){return e[t]??e[n]??""}d(g,"str");var L={async upsert(e,t){let n=g(t,"id","id"),r=g(t,"entity_type","entityType"),s=g(t,"entity_id","entityId");if(!n||!r||!s||p.get(e,"SELECT id FROM archives WHERE entity_type = ? AND entity_id = ? LIMIT 1",r,s))return;let c=typeof t.entity_data=="string"?t.entity_data:t.entity_data!=null?JSON.stringify(t.entity_data):"{}",o=g(t,"archived_at","archivedAt")||g(t,"created_at","createdAt")||new Date().toISOString(),a=t.summary??null,u=g(t,"reason","reason")||"sync";try{p.run(e,`INSERT OR IGNORE INTO archives
8
+ import{a as O}from"./chunk-HZIORCPO.mjs";import{a as A}from"./chunk-WDGDFXSB.mjs";import{b as h}from"./chunk-NWY5M34K.mjs";import{c as I}from"./chunk-OGOCHZ3S.mjs";import{a as P,h as tt}from"./chunk-UUULLTQV.mjs";import{a as w,b,c as S}from"./chunk-3JUE6MNF.mjs";import{c as E}from"./chunk-YUOTOCKK.mjs";import{b as R}from"./chunk-BISPGBNN.mjs";import{a as x}from"./chunk-AOPJ4Z6O.mjs";import{a as m}from"./chunk-AUUWQH3S.mjs";import{b as N}from"./chunk-MEQS4VPO.mjs";import{a as T,b as j,e as p,g as _}from"./chunk-HDHVBB6Q.mjs";import{b as D,e as Z}from"./chunk-AKIN5WSQ.mjs";import{a as d}from"./chunk-E66B27AL.mjs";_();function g(e,t,n){return e[t]??e[n]??""}d(g,"str");var L={async upsert(e,t){let n=g(t,"id","id"),r=g(t,"entity_type","entityType"),s=g(t,"entity_id","entityId");if(!n||!r||!s||p.get(e,"SELECT id FROM archives WHERE entity_type = ? AND entity_id = ? LIMIT 1",r,s))return;let c=typeof t.entity_data=="string"?t.entity_data:t.entity_data!=null?JSON.stringify(t.entity_data):"{}",o=g(t,"archived_at","archivedAt")||g(t,"created_at","createdAt")||new Date().toISOString(),a=t.summary??null,u=g(t,"reason","reason")||"sync";try{p.run(e,`INSERT OR IGNORE INTO archives
9
9
  (id, entity_type, entity_id, entity_data, summary, archived_at, reason)
10
10
  VALUES (?, ?, ?, ?, ?, ?, ?)`,n,r,s,c,a,o,u)}catch{}},async delete(e,t){}};_();var C={async upsert(e,t){let n=t.name||"";if(!n)return;let r=t.description??null,s=et(t.metadata),i=new Date().toISOString(),c=p.get(e,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",n);if(c){if(c.is_builtin===1)return;p.run(e,"UPDATE custom_workflows SET description = ?, metadata = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",r,s,i,n);return}p.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
11
11
  VALUES (?, ?, ?, ?, 0, 0, ?)`,n,r,t.created_at||i,i,s)},async delete(e,t){}};function et(e){if(e==null)return null;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return null}}d(et,"serializeMetadata");var M={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.title||t.text||"";if(!r.trim())return;let s=t.priority||"medium",i=t.status||"active";await O.upsertIdea(e,{id:n,text:r,priority:s,status:i==="archived"?"archived":"pending",addedAt:t.created_at??t.addedAt??new Date().toISOString()})},async delete(e,t){}};j();tt();_();function nt(e){if(!e)return{};if(typeof e=="string")try{return JSON.parse(e)}catch{return{}}return typeof e=="object"?e:{}}d(nt,"asTags");function f(e,t,n){return e[t]??e[n]??""}d(f,"field");var W={async upsert(e,t){let n=f(t,"content","content"),r=f(t,"type","type");if(!n||!r)return;let s=nt(t.tags),i=f(t,"provenance","provenance")||"declared",c=t.source??null,o=T(n);if(p.get(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",o,r))return;let u=t.created_at||t.createdAt||new Date().toISOString();p.appendEvent(e,`memory.${P}${r}`,{content:n,tags:s,source:c,provenance:i,content_hash:o,project_id:e,created_at:u})},async delete(e,t){let n=f(t,"id","id"),r=f(t,"content","content"),s=f(t,"type","type"),i=[];if(/^mem_\d+$/.test(n)&&i.push(n),r&&s){let o=T(r),a=p.query(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL",o,s);i.push(...a.map(u=>u.id))}let c=[...new Set(i)];for(let o of c){let a=o.match(/^mem_(\d+)$/)?.[1];a&&p.run(e,"UPDATE events SET type = ? WHERE id = ?","memory.deleted.context-quality",Number(a)),p.run(e,"UPDATE memory_entries SET deleted_at = ? WHERE id = ?",Date.now(),o),p.run(e,"DELETE FROM memory_embeddings WHERE memory_id = ?",o)}}};var F={async upsert(e,t){let n=t.description||"";if(!n.trim())return;let r=t.id||"";if(!r){await h.addTask(e,{description:n,priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"});return}await h.upsertTask(e,{id:r,description:n,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{},...t.section?{section:t.section}:{}})},async delete(e,t){}};var k={async upsert(e,t){await A.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""},t.created_at||t.shippedAt||t.shipped_at)},async delete(e,t){}};var U={async upsert(e,t){let n=t.id||"";n&&I.applyRemote(e,{id:n,title:t.title,status:t.status,content:t.content??{},tags:t.tags,created_at:t.created_at,updated_at:t.updated_at})},async delete(e,t){}};var $={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.status||"";if(r==="completed"||r==="shipped"){await R.update(e,s=>s.currentTask?.id===n?{...s,currentTask:null}:s);return}if(r==="active"||t.started_at||t.startedAt){await R.update(e,s=>({...s,currentTask:{id:n,description:t.description,startedAt:t.started_at||t.startedAt||new Date().toISOString(),sessionId:t.session_id||t.sessionId||""}}));return}(t.description||"").trim()&&await h.upsertTask(e,{id:n,description:t.description,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{}})},async delete(e,t){}};_();var q={async upsert(e,t){let n=Number(t.id);if(!Number.isSafeInteger(n)||n<=0)return;let r=-n;p.transaction(e,s=>{s.prepare(`INSERT INTO workflow_rules
@@ -5,14 +5,14 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as Y}from"./chunk-45I2C2UB.mjs";import{b as A,c as J}from"./chunk-L4COZ7ZH.mjs";import{a as K}from"./chunk-4KY2EHXS.mjs";import{a as G}from"./chunk-LPB3HUJ2.mjs";import{e as B}from"./chunk-7OZDWT6C.mjs";import{c as I}from"./chunk-ZZ65CN5F.mjs";import{d as _}from"./chunk-A5MUSARI.mjs";import{a as w}from"./chunk-RRWPDRYR.mjs";import{b as $}from"./chunk-W5OWBOLH.mjs";import{d as f,g as W}from"./chunk-HDHVBB6Q.mjs";import{b as j,d as b,e as rt,f as O,h as at,s as U,t as lt}from"./chunk-AKIN5WSQ.mjs";import{d as ct}from"./chunk-JQE2F2RK.mjs";import{e as k,o as it}from"./chunk-CTWZQ7YI.mjs";import{b as T,e as ut}from"./chunk-D4S3IRD3.mjs";import{e as F,f as ot}from"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";lt();import M from"node:fs";import mt from"node:path";var q=l(()=>U.getStatePath(),"stampDir"),X=l(()=>mt.join(q(),"installed-version"),"stampPath");function dt(){try{return M.readFileSync(X(),"utf-8").trim()}catch{return null}}l(dt,"readStamp");function pt(i){try{M.mkdirSync(q(),{recursive:!0}),M.writeFileSync(X(),i,"utf-8")}catch{}}l(pt,"writeStamp");function V(i){return i?dt()===i:!0}l(V,"isSyncCurrent");async function z(i){if(i&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:n}=await import("./command-installer-BVHQUSL4.mjs");await n()}catch{}try{await(await import("./settings-installer-QDM3GB6J.mjs")).install()}catch{}try{let{SetupCommands:n}=await import("./setup-7L3NXNRH.mjs");await new n().installStatusLine()}catch{}pt(i)}}l(z,"runSelfHeal");W();ot();it();ct();W();at();rt();var ft=50,H=class{static{l(this,"SessionTracker")}currentRow(n){try{return f.get(n,"SELECT * FROM cli_sessions WHERE status = 'active' ORDER BY last_activity DESC LIMIT 1")??null}catch{return null}}isExpired(n){return O(n,18e5)}toSessionData(n,t){return{id:t.id,projectId:n,status:t.status,createdAt:t.created_at,lastActivity:t.last_activity,commands:[],files:[]}}async touch(n){let t=j(),e=this.currentRow(n);if(e&&!this.isExpired(e.last_activity))return f.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",t,e.id),this.toSessionData(n,{...e,last_activity:t});e&&f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",e.id);let s=crypto.randomUUID();return f.run(n,"INSERT INTO cli_sessions (id, status, created_at, last_activity) VALUES (?, 'active', ?, ?)",s,t,t),this.toSessionData(n,{id:s,status:"active",created_at:t,last_activity:t})}async trackCommand(n,t,e){let s=this.currentRow(n);if(!s)return;let r=j();try{f.run(n,"INSERT INTO cli_session_commands (session_id, command, timestamp, duration_ms) VALUES (?, ?, ?, ?)",s.id,t,r,Math.round(e)),f.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",r,s.id)}catch{}}async getInfo(n){let t=this.currentRow(n);if(!t||this.isExpired(t.last_activity))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let e=Date.now(),s=new Date(t.created_at).getTime(),r=new Date(t.last_activity).getTime(),c=e-r,a=Math.max(0,18e5-c),o=f.query(n,"SELECT command FROM cli_session_commands WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?",t.id,ft);return{active:!0,id:t.id,duration:b(e-s),idleSince:t.last_activity,idleMs:c,expiresIn:b(a),commandCount:o.length,commands:o.map(m=>m.command).reverse(),filesRead:0,filesWritten:0}}async expire(n){try{f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE status = 'active'")}catch{}}async expireIfStale(n){let t=this.currentRow(n);return t&&this.isExpired(t.last_activity)?(f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",t.id),!0):!1}},Z=new H;var ht={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},L=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(n,t={}){this.projectPath=n,this.config={...ht,...t}}async check(n){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let e=(()=>{try{return f.getDoc(n,"project")}catch{return null}})();if(!e)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;t.lastSyncCommit=e.lastSyncCommit||null;let s=e.lastSync;if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;let c={cwd:this.projectPath,timeoutMs:3e3,maxBuffer:1024*256},a=`${t.lastSyncCommit}..HEAD`,[o,m]=await Promise.all([k(["rev-parse","--short","HEAD"],c),k(["rev-list","--count",a],c)]);if(!o.ok)return t.reason=o.kind==="exit"?"Not a git repository":`git ${o.kind} \u2014 staleness unknown`,t;if(t.currentCommit=o.stdout.trim(),t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;if(!m.ok)return m.kind==="exit"?(t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`."):t.reason=`git ${m.kind} reading history \u2014 staleness unknown. Retry shortly.`,t;if(t.commitsSinceSync=parseInt(m.stdout.trim(),10)||0,s){let y=new Date(s),g=new Date;t.daysSinceSync=Math.floor((g.getTime()-y.getTime())/(1e3*60*60*24))}if(t.commitsSinceSync>0&&t.commitsSinceSync<this.config.commitThreshold){let y=await k(["diff","--name-only",a],c),g=y.ok?y.stdout.trim().split(`
8
+ import{a as Y}from"./chunk-45I2C2UB.mjs";import{b as A,c as J}from"./chunk-L4COZ7ZH.mjs";import{a as K}from"./chunk-4KY2EHXS.mjs";import{a as G}from"./chunk-3X7TBM4A.mjs";import{e as B}from"./chunk-7OZDWT6C.mjs";import{c as I}from"./chunk-ZZ65CN5F.mjs";import{d as _}from"./chunk-WSFHSXBZ.mjs";import{a as w}from"./chunk-DGBDMUBL.mjs";import{b as $}from"./chunk-OLKNK2HB.mjs";import{d as f,g as W}from"./chunk-HDHVBB6Q.mjs";import{b as j,d as b,e as rt,f as O,h as at,s as U,t as lt}from"./chunk-AKIN5WSQ.mjs";import{d as ct}from"./chunk-JQE2F2RK.mjs";import{e as k,o as it}from"./chunk-CTWZQ7YI.mjs";import{b as T,e as ut}from"./chunk-ZX6BC2EB.mjs";import{e as F,f as ot}from"./chunk-BUDZL4DW.mjs";import{a as l}from"./chunk-E66B27AL.mjs";lt();import M from"node:fs";import mt from"node:path";var q=l(()=>U.getStatePath(),"stampDir"),X=l(()=>mt.join(q(),"installed-version"),"stampPath");function dt(){try{return M.readFileSync(X(),"utf-8").trim()}catch{return null}}l(dt,"readStamp");function pt(i){try{M.mkdirSync(q(),{recursive:!0}),M.writeFileSync(X(),i,"utf-8")}catch{}}l(pt,"writeStamp");function V(i){return i?dt()===i:!0}l(V,"isSyncCurrent");async function z(i){if(i&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:n}=await import("./command-installer-XSKQS3IS.mjs");await n()}catch{}try{await(await import("./settings-installer-QDM3GB6J.mjs")).install()}catch{}try{let{SetupCommands:n}=await import("./setup-VL7YXVE5.mjs");await new n().installStatusLine()}catch{}pt(i)}}l(z,"runSelfHeal");W();ot();it();ct();W();at();rt();var ft=50,H=class{static{l(this,"SessionTracker")}currentRow(n){try{return f.get(n,"SELECT * FROM cli_sessions WHERE status = 'active' ORDER BY last_activity DESC LIMIT 1")??null}catch{return null}}isExpired(n){return O(n,18e5)}toSessionData(n,t){return{id:t.id,projectId:n,status:t.status,createdAt:t.created_at,lastActivity:t.last_activity,commands:[],files:[]}}async touch(n){let t=j(),e=this.currentRow(n);if(e&&!this.isExpired(e.last_activity))return f.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",t,e.id),this.toSessionData(n,{...e,last_activity:t});e&&f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",e.id);let s=crypto.randomUUID();return f.run(n,"INSERT INTO cli_sessions (id, status, created_at, last_activity) VALUES (?, 'active', ?, ?)",s,t,t),this.toSessionData(n,{id:s,status:"active",created_at:t,last_activity:t})}async trackCommand(n,t,e){let s=this.currentRow(n);if(!s)return;let r=j();try{f.run(n,"INSERT INTO cli_session_commands (session_id, command, timestamp, duration_ms) VALUES (?, ?, ?, ?)",s.id,t,r,Math.round(e)),f.run(n,"UPDATE cli_sessions SET last_activity = ? WHERE id = ?",r,s.id)}catch{}}async getInfo(n){let t=this.currentRow(n);if(!t||this.isExpired(t.last_activity))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let e=Date.now(),s=new Date(t.created_at).getTime(),r=new Date(t.last_activity).getTime(),c=e-r,a=Math.max(0,18e5-c),o=f.query(n,"SELECT command FROM cli_session_commands WHERE session_id = ? ORDER BY timestamp DESC LIMIT ?",t.id,ft);return{active:!0,id:t.id,duration:b(e-s),idleSince:t.last_activity,idleMs:c,expiresIn:b(a),commandCount:o.length,commands:o.map(m=>m.command).reverse(),filesRead:0,filesWritten:0}}async expire(n){try{f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE status = 'active'")}catch{}}async expireIfStale(n){let t=this.currentRow(n);return t&&this.isExpired(t.last_activity)?(f.run(n,"UPDATE cli_sessions SET status = 'expired' WHERE id = ?",t.id),!0):!1}},Z=new H;var ht={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},L=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(n,t={}){this.projectPath=n,this.config={...ht,...t}}async check(n){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let e=(()=>{try{return f.getDoc(n,"project")}catch{return null}})();if(!e)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;t.lastSyncCommit=e.lastSyncCommit||null;let s=e.lastSync;if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;let c={cwd:this.projectPath,timeoutMs:3e3,maxBuffer:1024*256},a=`${t.lastSyncCommit}..HEAD`,[o,m]=await Promise.all([k(["rev-parse","--short","HEAD"],c),k(["rev-list","--count",a],c)]);if(!o.ok)return t.reason=o.kind==="exit"?"Not a git repository":`git ${o.kind} \u2014 staleness unknown`,t;if(t.currentCommit=o.stdout.trim(),t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;if(!m.ok)return m.kind==="exit"?(t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`."):t.reason=`git ${m.kind} reading history \u2014 staleness unknown. Retry shortly.`,t;if(t.commitsSinceSync=parseInt(m.stdout.trim(),10)||0,s){let y=new Date(s),g=new Date;t.daysSinceSync=Math.floor((g.getTime()-y.getTime())/(1e3*60*60*24))}if(t.commitsSinceSync>0&&t.commitsSinceSync<this.config.commitThreshold){let y=await k(["diff","--name-only",a],c),g=y.ok?y.stdout.trim().split(`
9
9
  `).filter(Boolean).slice(0,200):[];t.changedFiles=g,t.significantChanges=g.filter(d=>this.config.significantFiles.some(p=>d.endsWith(p)||d.includes(p)))}else t.changedFiles=[],t.significantChanges=[];return t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(e){return t.reason=`Error checking staleness: ${F(e)}`,t}}formatStatus(n){let t=[];n.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let e=[];if(n.lastSyncCommit&&e.push(`Last sync: ${n.lastSyncCommit}`),n.currentCommit&&e.push(`Current: ${n.currentCommit}`),n.commitsSinceSync>0&&e.push(`Commits since: ${n.commitsSinceSync}`),n.daysSinceSync>0&&e.push(`Days since: ${n.daysSinceSync}`),n.changedFiles.length>0&&e.push(`Files changed: ${n.changedFiles.length}`),e.length>0){let s=Math.max(...e.map(c=>c.length)),r="\u2500".repeat(s+2);t.push(`\u250C${r}\u2510`);for(let c of e)t.push(`\u2502 ${c.padEnd(s)} \u2502`);t.push(`\u2514${r}\u2518`)}if(n.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of n.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);n.significantChanges.length>5&&t.push(` ... and ${n.significantChanges.length-5} more`)}return n.reason&&(t.push(""),t.push(n.reason)),n.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
10
10
  `)}async getSessionInfo(n){return Z.getInfo(n)}formatSessionInfo(n){let t=[];if(!n.active)return t.push("Session: \u25CB No active session"),t.join(`
11
11
  `);t.push(`Session: \u25B6 Active (${n.duration})`);let e=[];if(n.commandCount>0){let s=new Set,r=[];for(let c of n.commands)s.has(c)||(s.add(c),r.push(c));e.push(`Commands: ${r.join(" \u2192 ")} (${n.commandCount} total)`)}if((n.filesRead>0||n.filesWritten>0)&&e.push(`Files: ${n.filesRead} read, ${n.filesWritten} written`),e.push(`Idle: ${n.expiresIn} until timeout`),e.length>0){let s=Math.max(...e.map(c=>c.length)),r="\u2500".repeat(s+2);t.push(`\u250C${r}\u2510`);for(let c of e)t.push(`\u2502 ${c.padEnd(s)} \u2502`);t.push(`\u2514${r}\u2518`)}return t.join(`
12
- `)}getWarning(n){return n.isStale?n.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${n.commitsSinceSync} commits behind). Run \`prjct sync\``:n.daysSinceSync>0?`\u26A0\uFE0F Context stale (${n.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},tt=l((i,n)=>new L(i,n),"createStalenessChecker");ut();var gt=1600,P=3,yt=4;async function St(i,n,t={}){let e=n??await $.readConfig(i);if(!e?.projectId)return null;let s=e.persona,r=t.digest?await(async()=>{try{let{memoryL0IndexForSession:h}=await import("./memory-index-677MUBCZ.mjs");return h(e.projectId,{rebuildIfStale:!0})||nt(e.projectId)}catch{return nt(e.projectId)}})():null,c=Ct(i,e.projectId),a=import("./vault-retire-notice-GRT3QRLZ.mjs").then(({vaultRetirementNotice:h})=>h(e,e.projectId)),o=(async()=>{try{let{buildLandCue:h}=await import("./land-cue-SS23JBAX.mjs");return await h(e.projectId,i,e)}catch{return null}})(),m=(async()=>{try{let{effectiveWeakModelMode:h,weakModelBanner:C}=await import("./weak-model-mode-M6D23IIM.mjs");return h(e)==="on"?C():null}catch{return null}})(),v=t.digest?(async()=>{try{let{formatPendingHandoffCue:h}=await import("./agent-switch-IQ5KSRKD.mjs"),C=h(e.projectId);return C?`# prjct: pending handoff
13
- ${C}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:C}=await import("./session-continuity-FNNUMOXB.mjs");return C(h(e.projectId))}catch{return null}})():Promise.resolve(null),g=$t(i,e.projectId),[d,p,S,E,x,R,D]=await Promise.all([c,a,o,m,v,y,g]);if(!D&&!s&&!r&&!d&&!p&&!S&&!E&&!x&&!R)return null;let u=["# prjct: project context",""];return D&&u.push(D,""),s&&u.push(Et(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),r&&(s&&u.push(""),u.push(r)),d&&((s||r)&&u.push(""),u.push(d)),p&&((s||r||d)&&u.push(""),u.push(p)),S&&((s||r||d||p)&&u.push(""),u.push(S)),E&&((s||r||d||p||S)&&u.push(""),u.push(E)),x&&((s||r||d||p||S||E)&&u.push(""),u.push(x)),R&&((s||r||d||p||S||E||x)&&u.push(""),u.push(R)),u.join(`
12
+ `)}getWarning(n){return n.isStale?n.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${n.commitsSinceSync} commits behind). Run \`prjct sync\``:n.daysSinceSync>0?`\u26A0\uFE0F Context stale (${n.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},tt=l((i,n)=>new L(i,n),"createStalenessChecker");ut();var gt=1600,P=3,yt=4;async function St(i,n,t={}){let e=n??await $.readConfig(i);if(!e?.projectId)return null;let s=e.persona,r=t.digest?await(async()=>{try{let{memoryL0IndexForSession:h}=await import("./memory-index-MQCHZFUE.mjs");return h(e.projectId,{rebuildIfStale:!0})||nt(e.projectId)}catch{return nt(e.projectId)}})():null,c=Ct(i,e.projectId),a=import("./vault-retire-notice-GRT3QRLZ.mjs").then(({vaultRetirementNotice:h})=>h(e,e.projectId)),o=(async()=>{try{let{buildLandCue:h}=await import("./land-cue-FNLP4IAB.mjs");return await h(e.projectId,i,e)}catch{return null}})(),m=(async()=>{try{let{effectiveWeakModelMode:h,weakModelBanner:C}=await import("./weak-model-mode-GLXXHG32.mjs");return h(e)==="on"?C():null}catch{return null}})(),v=t.digest?(async()=>{try{let{formatPendingHandoffCue:h}=await import("./agent-switch-XMFUTNNV.mjs"),C=h(e.projectId);return C?`# prjct: pending handoff
13
+ ${C}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:C}=await import("./session-continuity-5CLT5YBL.mjs");return C(h(e.projectId))}catch{return null}})():Promise.resolve(null),g=$t(i,e.projectId),[d,p,S,E,x,R,D]=await Promise.all([c,a,o,m,v,y,g]);if(!D&&!s&&!r&&!d&&!p&&!S&&!E&&!x&&!R)return null;let u=["# prjct: project context",""];return D&&u.push(D,""),s&&u.push(Et(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),r&&(s&&u.push(""),u.push(r)),d&&((s||r)&&u.push(""),u.push(d)),p&&((s||r||d)&&u.push(""),u.push(p)),S&&((s||r||d||p)&&u.push(""),u.push(S)),E&&((s||r||d||p||S)&&u.push(""),u.push(E)),x&&((s||r||d||p||S||E)&&u.push(""),u.push(x)),R&&((s||r||d||p||S||E||x)&&u.push(""),u.push(R)),u.join(`
14
14
  `)}l(St,"buildSessionContext");async function Ct(i,n){try{let t=tt(i),e=await t.check(n);if(!e.isStale||e.commitsSinceSync<=0)return null;let s=t.getWarning(e);if(!s)return null;try{let c=await import("node:path"),a=await import("node:os"),{maybeDetachDriftRefresh:o,readDriftStamp:m,formatDriftNotice:v,driftStaleResolved:y}=await import("./drift-refresh-TD3PYPJN.mjs"),g=process.env.PRJCT_CLI_HOME?c.resolve(process.env.PRJCT_CLI_HOME):c.join(a.homedir(),".prjct-cli"),d=m(g);if(y(d))return v({warning:s,commitsSinceSync:e.commitsSinceSync,stamp:d,refreshScheduled:!1});let p=o({projectPath:i,cliHome:g,commitsSinceSync:e.commitsSinceSync}),S=m(g);return v({warning:s,commitsSinceSync:e.commitsSinceSync,stamp:S,refreshScheduled:p})}catch{}let r=await(async()=>{try{let{hasSymbolIndex:c,loadMeta:a}=await import("./symbol-graph-LZM4RZXZ.mjs");if(!c(n))return" Code graph empty \u2014 `prjct code reindex` (or `prjct sync`) before trace/impact.";if(e.commitsSinceSync<5)return"";let o=a(n);return` Symbol index may lag${o?.builtAt?` (index ${o.builtAt.slice(0,10)})`:""} \u2014 prefer \`prjct code reindex\` after big pulls.`}catch{return""}})();return`**Understanding may be stale:** ${s} \u2014 run \`prjct sync\` before big calls.${r}`}catch{return null}}l(Ct,"buildStalenessNotice");function nt(i){let n=(()=>{try{let o=I.rerank(i,w.recall(i,{types:["gotcha","anti-pattern"],limit:P*4})).slice(0,P),m=I.rerank(i,w.recall(i,{types:["decision"],limit:P*4})).slice(0,P);return{gotchas:o,decisions:m}}catch{return null}})();if(!n)return null;let{gotchas:t,decisions:e}=n,s=(()=>{try{let o=w.recall(i,{types:["feedback","improvement-signal"],limit:40,dedupeByKey:!1});return K(o,yt)}catch{return[]}})(),r=st(i,new Set([...t,...e].map(o=>o.id))),c=(()=>{try{let o=G(i);return o?B(o,{maxConventions:4,maxPatterns:3,maxAnti:2}):null}catch{return null}})();if(t.length===0&&e.length===0&&!r&&s.length===0&&!c)return null;let a=["## What this project already knows",""];if(a.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not. Apply these; do not re-derive from source."),s.length>0){a.push("","**How this developer works (act as them):**");for(let o of s){let m=o.rule.length>140?`${o.rule.slice(0,139)}\u2026`:o.rule;a.push(`- ${m} \`${o.sourceId}\``)}}if(c){let o=c.replace(/^## How this repo works \(project style\)\n?/,"").trim();o&&a.push("","**How this repo works (match house style):**",o)}if(t.length>0){a.push("","**Traps to avoid:**");for(let o of t)a.push(`- ${N(o)}`)}if(e.length>0){a.push("","**Decisions in force:**");for(let o of e)a.push(`- ${N(o)}`)}return r&&a.push("","**Keeps being missed:**",`- ${N(r.entry)} \u2014 flagged relevant-but-unused ${r.count}\xD7. Apply it or supersede it.`),a.push("","> Resolve any `mem_id` with `prjct search <id>`. Full developer model: MCP `prjct_developer`. Project style: `prjct analysis` / sync evolution."),A(a.join(`
15
- `),gt)}l(nt,"buildKnowledgeDigest");function N(i){let n=_(i),t=(i.content??"").replace(/\s+/g," ").trim();if(t.length<=n.length+8)return`${n} \`${i.id}\``;let e=t.slice(n.length).replace(/^[\s.:;—-]+/,"").trim();if(e.length<24)return`${n} \`${i.id}\``;let s=e.length>90?`${e.slice(0,89)}\u2026`:e;return`${n} \u2014 ${s} \`${i.id}\``}l(N,"digestLine");var wt=2;function st(i,n){try{let t=w.recall(i,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),e=new Map;for(let a of t){let o=a.tags?.relates;o&&e.set(o,(e.get(o)??0)+1)}let[s,r]=[...e].reduce((a,o)=>o[1]>a[1]?o:a,[null,0]);if(!s||r<wt||n.has(s))return null;let c=w.getById(i,s);return c?{entry:c,count:r}:null}catch{return null}}l(st,"findRepeatMissedEntry");var vt=500,et=2;async function tn(i){let n=await $.readConfig(i).catch(()=>null);if(!n?.projectId)return null;let t=["# prjct: subagent context"];n.persona?.role&&t.push(`Role in this project: ${n.persona.role}`);try{let{resolveActiveTask:e}=await import("./task-service-RRFG5P7N.mjs"),s=await e(n.projectId,i);s&&t.push(`Active work cycle (this worktree): ${s.description}`)}catch{}try{let e=I.rerank(n.projectId,w.recall(n.projectId,{types:["gotcha","anti-pattern"],limit:et*4})).slice(0,et);if(e.length>0){t.push("Traps to avoid:");for(let r of e)t.push(`- ${_(r)} \`${r.id}\``)}let s=st(n.projectId,new Set(e.map(r=>r.id)));s&&t.push(`Keeps being missed: ${_(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:A(t.join(`
15
+ `),gt)}l(nt,"buildKnowledgeDigest");function N(i){let n=_(i),t=(i.content??"").replace(/\s+/g," ").trim();if(t.length<=n.length+8)return`${n} \`${i.id}\``;let e=t.slice(n.length).replace(/^[\s.:;—-]+/,"").trim();if(e.length<24)return`${n} \`${i.id}\``;let s=e.length>90?`${e.slice(0,89)}\u2026`:e;return`${n} \u2014 ${s} \`${i.id}\``}l(N,"digestLine");var wt=2;function st(i,n){try{let t=w.recall(i,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),e=new Map;for(let a of t){let o=a.tags?.relates;o&&e.set(o,(e.get(o)??0)+1)}let[s,r]=[...e].reduce((a,o)=>o[1]>a[1]?o:a,[null,0]);if(!s||r<wt||n.has(s))return null;let c=w.getById(i,s);return c?{entry:c,count:r}:null}catch{return null}}l(st,"findRepeatMissedEntry");var vt=500,et=2;async function tn(i){let n=await $.readConfig(i).catch(()=>null);if(!n?.projectId)return null;let t=["# prjct: subagent context"];n.persona?.role&&t.push(`Role in this project: ${n.persona.role}`);try{let{resolveActiveTask:e}=await import("./task-service-BM2JQXMS.mjs"),s=await e(n.projectId,i);s&&t.push(`Active work cycle (this worktree): ${s.description}`)}catch{}try{let e=I.rerank(n.projectId,w.recall(n.projectId,{types:["gotcha","anti-pattern"],limit:et*4})).slice(0,et);if(e.length>0){t.push("Traps to avoid:");for(let r of e)t.push(`- ${_(r)} \`${r.id}\``)}let s=st(n.projectId,new Set(e.map(r=>r.id)));s&&t.push(`Keeps being missed: ${_(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:A(t.join(`
16
16
  `),vt)}l(tn,"buildSubagentDigest");function Et(i){let n=[];return n.push(`## Your role in this project: **${i.role}**`),i.focus&&n.push(`Focus: ${i.focus}`),i.mcps&&i.mcps.length>0&&n.push(`Available MCPs this project expects: ${i.mcps.join(", ")}`),i.packs&&i.packs.length>0&&n.push(`Active packs: ${i.packs.join(", ")}`),n.join(`
17
17
  `)}l(Et,"formatPersona");async function $t(i,n){try{let t=await import("node:path"),{execFileAsync:e}=await import("./exec-I7XE7NMD.mjs"),s=t.basename(i),r=await(async()=>{try{let{stdout:o}=await e("git",["branch","--show-current"],{cwd:i});return o.trim()}catch{return""}})(),c=n.length>12?`${n.slice(0,8)}\u2026`:n,a=["## Project identity (cwd)",`- **${s}** \xB7 id \`${c}\``];return r&&a.push(`- Branch: \`${r}\``),a.push("- Skill is portable L0 \u2014 if skill text names another project, ignore it; trust this block + `prjct context --md`."),a.join(`
18
18
  `)}catch{return null}}l($t,"buildProjectIdentityLine");function nn(i=process.cwd(),n){let t=$.readConfig(i).catch(()=>null);return J({event:"SessionStart",projectPath:i,build:l(async(e,s)=>{let r=s===i?await t:await $.readConfig(s).catch(()=>null),c=e.source??"startup";return St(s,r,{digest:c==="startup"||c==="clear"||c==="compact"})},"build"),afterEmit:l(async(e,s)=>{let r=await t;if(r?.projectId){let c=await(async()=>{try{let{collectActiveTasks:a}=await import("./task-overview-6ZQKJGSH.mjs"),o=await a(r.projectId,s);return{taskId:o.current?.id??null,goal:o.current?.description??e.source??null}}catch{return{taskId:null,goal:e.source??null}}})();Y({projectId:r.projectId,sessionId:e.session_id,directory:s,taskId:c.taskId,goal:c.goal})}V(T)||await z(T).catch(()=>{});try{let{maybeAutoUpdate:c}=await import("./auto-updater-EHRRMCYY.mjs");c(T)}catch{}},"afterEmit")},n)}l(nn,"runSessionStartHook");export{St as a,tn as b,$t as c,nn as d};
@@ -5,6 +5,6 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{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(`
8
+ import{b as a,c as f}from"./chunk-L4COZ7ZH.mjs";import{f as u}from"./chunk-WSFHSXBZ.mjs";import{a as m}from"./chunk-DGBDMUBL.mjs";import{b as l}from"./chunk-OLKNK2HB.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execSync as d}from"node:child_process";var h=1200,y=3;function C(t){try{return d("git diff --cached --name-only",{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
9
9
  `).map(o=>o.trim()).filter(Boolean)}catch{return[]}}i(C,"stagedFiles");function b(t){let o=new Set;for(let r of t){let n=r.split("/").filter(Boolean);for(let s of n){let e=s.replace(/\.[^.]+$/,"").toLowerCase();e.length>=3&&o.add(e)}}return[...o]}i(b,"pathFragments");function k(t,o){let r=t.content.toLowerCase();if(o.some(n=>r.includes(n)))return!0;for(let n of Object.values(t.tags)){let s=n.toLowerCase();if(o.some(e=>s.includes(e)))return!0}return!1}i(k,"mentionsFragment");async function I(t){let o=await 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
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};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{b as 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
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-2HTDCLZD.mjs";import{a as mt,b as pt}from"./chunk-CPHUFXD2.mjs";import{d as ft}from"./chunk-GELCZWKW.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-MQVVNX63.mjs";import{i as dt}from"./chunk-J6JZ4PQA.mjs";import{a as et}from"./chunk-2WPR5GFT.mjs";import{b as Qe,c as Xe,d as Ze}from"./chunk-4DDCWMI6.mjs";import{a as Ye}from"./chunk-DVBBB5BS.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-OLKNK2HB.mjs";import{d as P,e as I,g as K}from"./chunk-HDHVBB6Q.mjs";import{d as se}from"./chunk-CDCCAU22.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-ZNQXFWSI.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
9
 
10
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
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(`
@@ -34,5 +34,5 @@ ${r.body()}`}i(Ur,"buildSkillContent");function _t(){return process.env.HOME||Lr
34
34
  COALESCE(SUM(total_duration), 0) AS duration,
35
35
  COALESCE(SUM(avg_compression_rate * syncs), 0) AS weighted_rate
36
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(`
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-2MLYPNQR.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-T27I5N65.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-E7WGFL47.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-QQ6XILZD.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
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};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{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};
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-BM2JQXMS.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};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{c as j}from"./chunk-EHBEHLYN.mjs";import{k as w}from"./chunk-AKIN5WSQ.mjs";import{c as C}from"./chunk-JQE2F2RK.mjs";import{j as r,n as u}from"./chunk-SVZHJZ5T.mjs";import{c as A}from"./chunk-OIEZAHLC.mjs";import{b as l,c,d as h,e as d}from"./chunk-SYHDEUVU.mjs";import{c as R,e as G}from"./chunk-D4S3IRD3.mjs";import{a as s}from"./chunk-E66B27AL.mjs";u();import a from"node:path";var b=`${h}
8
+ import{c as j}from"./chunk-AWD2AQVJ.mjs";import{k as w}from"./chunk-AKIN5WSQ.mjs";import{c as C}from"./chunk-JQE2F2RK.mjs";import{j as r,n as u}from"./chunk-SVZHJZ5T.mjs";import{c as A}from"./chunk-ZNQXFWSI.mjs";import{b as l,c,d as h,e as d}from"./chunk-SYHDEUVU.mjs";import{c as R,e as G}from"./chunk-ZX6BC2EB.mjs";import{a as s}from"./chunk-E66B27AL.mjs";u();import a from"node:path";var b=`${h}
9
9
  - project facts (stack/commands): see \`PRJCT.md\``,P=`${l}
10
10
  ${b}
11
11
  ${c}
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as u,e as c}from"./chunk-D4S3IRD3.mjs";import{a as r}from"./chunk-E66B27AL.mjs";c();function g(){return"---"}r(g,"mdHeader");function a(){return`---
8
+ import{a as u,e as c}from"./chunk-ZX6BC2EB.mjs";import{a as r}from"./chunk-E66B27AL.mjs";c();function g(){return"---"}r(g,"mdHeader");function a(){return`---
9
9
  prjct v${u()}`}r(a,"mdFooter");function f(...n){return m(g(),...n.filter(Boolean),a())}r(f,"mdOutput");function d(n,t){let i=`| ${n.join(" | ")} |`,e=`|${n.map(()=>"---").join("|")}|`,o=t.map(s=>`| ${s.join(" | ")} |`);return[i,e,...o].join(`
10
10
  `)}r(d,"mdTable");function l(n,t,i=3){return`### ${n}
11
11
  ${t}`}r(l,"mdSection");function $(n,t=!1){return n.map((i,e)=>t?`${e+1}. ${i}`:`- ${i}`).join(`
@@ -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{a as D}from"./chunk-DYHYDHCW.mjs";import{a as x}from"./chunk-3LG3ACQV.mjs";import{c as N}from"./chunk-AOPJ4Z6O.mjs";import{e as u,g as M}from"./chunk-HDHVBB6Q.mjs";import{b as m,e as C}from"./chunk-AKIN5WSQ.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as r}from"zod";var R=["draft","reviewed","in_progress","shipped","archived"];var k=r.object({verdict:r.enum(["pass","fail"]),notes:r.string(),ts:r.string(),candidateHash:r.string().optional()}),P=r.object({risk:r.string().min(1),mitigation:r.string().min(1)}),b=r.object({name:r.string().min(1),given:r.array(r.string()).default([]),when:r.array(r.string()).default([]),then:r.array(r.string()).default([])}),q=r.object({slug:r.string().min(1),name:r.string().min(1),statement:r.string().min(1),scenarios:r.array(b).default([])}),$=r.object({added:r.array(q).default([]),modified:r.array(q).default([]),removed:r.array(r.string().min(1)).default([])}),H=r.object({id:r.string().min(1),ts:r.string(),ops:$}),h=r.object({goal:r.string().min(1),eli10:r.string().default(""),stakes:r.string().default(""),acceptance_criteria:r.array(r.string().min(1)).default([]),scope:r.array(r.string()).default([]),out_of_scope:r.array(r.string()).default([]),risks:r.array(P).default([]),test_plan:r.array(r.string()).default([]),reviews:r.record(r.string(),k).optional(),selected_reviewers:r.array(r.string()).default([]),linked_tasks:r.array(r.string()).default([]),notes:r.string().default(""),tasks_created_at:r.string().nullable().default(null),audit_candidate_hash:r.string().nullable().default(null),scenarios:r.record(r.string(),r.array(b)).default({}),delta_log:r.array(H).default([])});import{createHash as W}from"node:crypto";C();function F(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}d(F,"slugifyRequirement");function z(l){return`delta-${W("sha256").update(l.trim()).digest("hex").slice(0,12)}`}d(z,"deltaIdFor");function v(l){return[...l].sort((t,e)=>t.ts===e.ts?t.id<e.id?-1:t.id>e.id?1:0:t.ts<e.ts?-1:1)}d(v,"sortDeltaLog");function L(l,t){let e=new Map;for(let n of[...l,...t])e.has(n.id)||e.set(n.id,n);return v([...e.values()])}d(L,"mergeDeltaLogs");function A(l){let t=new Set;for(let e of l)for(let n of[...e.ops.added,...e.ops.modified])t.add(n.statement);return t}d(A,"allDeltaStatements");function U(l){let t={order:[],statements:new Map,scenarios:new Map},e=d(n=>{t.statements.has(n.slug)||t.order.push(n.slug),t.statements.set(n.slug,n.statement),n.scenarios.length>0?t.scenarios.set(n.slug,n.scenarios):t.scenarios.delete(n.slug)},"upsert");for(let n of v(l)){for(let s of n.ops.added)e(s);for(let s of n.ops.modified)e(s);for(let s of n.ops.removed){t.statements.delete(s),t.scenarios.delete(s);let i=t.order.indexOf(s);i>=0&&t.order.splice(i,1)}}return t}d(U,"foldEntries");function O(l){let t=U(l),e={};for(let n of t.order){let s=t.scenarios.get(n);s&&(e[n]=s)}return{acceptance_criteria:t.order.map(n=>t.statements.get(n)??""),scenarios:e}}d(O,"materializeDeltas");function J(l){let t=[],e=[],n=[],s={section:null,req:null,scenario:null},i=d(()=>{s.scenario&&s.req&&s.req.scenarios.push({name:s.scenario.name,given:s.scenario.given,when:s.scenario.when,then:s.scenario.then}),s.scenario=null},"flushScenario"),c=d(()=>{i();let a=s.req;if(s.req=null,!a)return;let o=F(a.name);if(!o)throw new Error(`DELTA_PARSE: requirement name yields an empty slug: "${a.name}"`);if(s.section==="removed"){n.push(o);return}let g=a.statementLines.join(`
9
+ `).trim();if(!g)throw new Error(`DELTA_PARSE: requirement "${a.name}" has no SHALL statement`);(s.section==="modified"?e:t).push({slug:o,name:a.name,statement:g,scenarios:a.scenarios})},"flushReq");for(let a of l.split(`
10
+ `)){let o=a.trim(),g=o.match(/^##\s+(ADDED|MODIFIED|REMOVED)\s+Requirements\s*$/i);if(g){c(),s.section=g[1].toLowerCase();continue}if(/^#{1,2}\s/.test(o)){c(),s.section=null;continue}let f=o.match(/^###\s+Requirement:\s*(.+)$/i);if(f){if(c(),!s.section)throw new Error('DELTA_PARSE: "### Requirement:" outside an ADDED/MODIFIED/REMOVED Requirements section');s.req={name:f[1].trim(),statementLines:[],scenarios:[]};continue}let S=o.match(/^####\s+Scenario:\s*(.+)$/i);if(S){if(i(),!s.req)throw new Error('DELTA_PARSE: "#### Scenario:" outside a "### Requirement:" block');s.scenario={name:S[1].trim(),given:[],when:[],then:[],last:null};continue}if(s.scenario&&o.startsWith("-")){let p=o.replace(/^-\s+/,"").match(/^(?:\*\*)?(GIVEN|WHEN|THEN|AND)\b\s*:?\s*(?:\*\*)?\s*(.*)$/i);if(p){let _=p[1].toUpperCase(),y=_==="AND"?s.scenario.last??"when":_.toLowerCase();s.scenario[y].push(p[2].trim()),s.scenario.last=y}continue}s.req&&!s.scenario&&o!==""&&s.req.statementLines.push(o)}if(c(),t.length+e.length+n.length===0)throw new Error("DELTA_EMPTY: no ADDED/MODIFIED/REMOVED Requirements sections found");return{added:t,modified:e,removed:n}}d(J,"parseDelta");function X(l,t,e={}){let n=J(t),s=e.id??z(t);if(l.delta_log.some(p=>p.id===s))return l;let i=U(l.delta_log).statements,c=new Set(n.added.map(p=>p.slug));for(let p of n.modified)if(!i.has(p.slug)&&!c.has(p.slug))throw new Error(`DELTA_UNKNOWN_REQUIREMENT: MODIFIED target "${p.name}" (slug: ${p.slug}) does not exist`);for(let p of n.removed)if(!i.has(p)&&!c.has(p))throw new Error(`DELTA_UNKNOWN_REQUIREMENT: REMOVED target slug "${p}" does not exist`);let a={id:s,ts:e.ts??m(),ops:n},o=v([...l.delta_log,a]),g=A(o),f=l.acceptance_criteria.filter(p=>!g.has(p)),S=O(o);return h.parse({...l,acceptance_criteria:[...f,...S.acceptance_criteria],scenarios:S.scenarios,delta_log:o})}d(X,"applyDelta");C();M();var E=class extends Error{constructor(e,n){super(`spec relational projection failed for ${e} (content write rolled back): ${n instanceof Error?n.message:String(n)}`);this.specId=e;this.name="SpecProjectionError"}specId;static{d(this,"SpecProjectionError")}};function w(l,t,e){try{u.run(l,"DELETE FROM spec_review WHERE spec_id = ?",t),u.run(l,"DELETE FROM spec_selected_reviewer WHERE spec_id = ?",t);for(let[n,s]of Object.entries(e.reviews??{}))u.run(l,"INSERT INTO spec_review (id, spec_id, lens, verdict, notes, created_at) VALUES (?, ?, ?, ?, ?, ?)",`${t}-rev-${n}`,t,n,s.verdict,s.notes??null,Date.now());for(let n of e.selected_reviewers)u.run(l,"INSERT OR IGNORE INTO spec_selected_reviewer (spec_id, lens) VALUES (?, ?)",t,n)}catch(n){throw new E(t,n)}}d(w,"projectSpecRelational");var T=class{static{d(this,"SpecStorage")}nextUpdatedAt(t,e){let n=m(),i=u.get(t,"SELECT updated_at FROM specs WHERE id = ?",e)?.updated_at;return!i||n>i?n:new Date(new Date(i).getTime()+1).toISOString()}create(t,e){let n=x(),s=m(),i=h.parse(e.content);try{u.transaction(t,()=>{u.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
11
+ VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,e.title,JSON.stringify(i),e.tags?JSON.stringify(e.tags):null,s,s),w(t,n,i)})}catch(a){if(a instanceof E)D.warn(a.message);else throw a}let c={id:n,title:e.title,status:"draft",content:i,tags:e.tags??{},createdAt:s,updatedAt:s,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null};return this.publishSync(t,c),c}get(t,e){let n=u.get(t,"SELECT * FROM specs WHERE id = ?",e);return n?this.rowToSpec(n):null}list(t,e={}){let n=[];e.status&&n.push(e.status);let i=`SELECT * FROM specs WHERE 1=1${e.status?" AND status = ?":e.includeArchived?"":" AND status != 'archived'"} ORDER BY created_at DESC`;return u.query(t,i,...n).map(a=>this.rowToSpec(a))}search(t,e){let n=`%${e}%`;return u.query(t,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(i=>this.rowToSpec(i))}updateContent(t,e,n){let s=h.parse(n),i=this.nextUpdatedAt(t,e);try{u.transaction(t,()=>{u.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(s),i,e),w(t,e,s)})}catch(a){if(a instanceof E)D.warn(a.message);else throw a}let c=this.get(t,e);return c&&this.publishSync(t,c),c}casUpdate(t,e,n,s){let i=h.parse(n),c=this.nextUpdatedAt(t,e),a=(()=>{try{return u.transaction(t,()=>{let g=u.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(i),c,e,s).changes===1;return g&&w(t,e,i),g})}catch(o){if(o instanceof E)return D.warn(o.message),!1;throw o}})();if(a){let o=this.get(t,e);o&&this.publishSync(t,o)}return a}setStatus(t,e,n){if(!R.includes(n))throw new Error(`invalid spec status: ${n}`);let s=this.nextUpdatedAt(t,e),i=[],c=[n,s];n==="shipped"&&(i.push("shipped_at = ?"),c.push(s)),n==="archived"&&(i.push("archived_at = ?"),c.push(s));let a=["status = ?","updated_at = ?",...i].join(", ");c.push(e),u.run(t,`UPDATE specs SET ${a} WHERE id = ?`,...c);let o=this.get(t,e);return o&&this.publishSync(t,o),o}setShippedPr(t,e,n){u.run(t,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(t,e),e);let s=this.get(t,e);return s&&this.publishSync(t,s),s}setShippedSha(t,e,n){u.run(t,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(t,e),e);let s=this.get(t,e);return s&&this.publishSync(t,s),s}linkTask(t,e,n){let s=this.get(t,e);if(!s)return null;if(s.content.linked_tasks.includes(n))return s;let i={...s.content,linked_tasks:[...s.content.linked_tasks,n]};return this.updateContent(t,e,i)}delete(t,e){let n=this.get(t,e);return n?(u.run(t,"DELETE FROM specs WHERE id = ?",e),this.publishSync(t,n,"delete"),!0):!1}applyRemote(t,e){if(!e.id)return;let n=typeof e.content=="string"?e.content:JSON.stringify(e.content??{}),s=R.includes(e.status)?e.status:"draft",i=e.tags==null?null:typeof e.tags=="string"?e.tags:JSON.stringify(e.tags),c=m();if(u.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
12
+ VALUES (?, ?, ?, ?, ?, ?, ?)
13
+ ON CONFLICT(id) DO NOTHING`,e.id,e.title??"",s,n,i,e.created_at||c,e.updated_at||c).changes>0){try{let o=h.parse(JSON.parse(n));w(t,e.id,o)}catch{}return}this.mergeRemoteContent(t,e.id,n,e.updated_at)}mergeRemoteContent(t,e,n,s){let i=this.get(t,e);if(!i)return;let c=(()=>{try{return h.parse(JSON.parse(n))}catch{return null}})();if(!c||i.content.delta_log.length===0||c.delta_log.length===0)return;let a=L(i.content.delta_log,c.delta_log),o=(s??"")>i.updatedAt?c:i.content,g=A(a),f=o.acceptance_criteria.filter(y=>!g.has(y)),S=O(a),p=a.length===i.content.delta_log.length&&a.length===c.delta_log.length,_={...o,acceptance_criteria:[...f,...S.acceptance_criteria],scenarios:S.scenarios,delta_log:a,reviews:p?i.content.reviews:{},selected_reviewers:p?i.content.selected_reviewers:[],audit_candidate_hash:p?i.content.audit_candidate_hash:null};JSON.stringify(_)!==JSON.stringify(i.content)&&this.casUpdate(t,e,_,i.updatedAt)}count(t){let e=u.query(t,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let s of e)n.total+=s.n,s.status==="draft"&&(n.draft=s.n),s.status==="shipped"&&(n.shipped=s.n);return n}publishSync(t,e,n="upsert"){N({projectId:t,entityType:"specs",entityId:e.id,eventType:n,data:{id:e.id,title:e.title,status:e.status,content:e.content,tags:e.tags,created_at:e.createdAt,updated_at:e.updatedAt,shipped_at:e.shippedAt,shipped_pr:e.shippedPr,shipped_sha:e.shippedSha,archived_at:e.archivedAt}})}rowToSpec(t){return{id:t.id,title:t.title,status:R.includes(t.status)?t.status:"draft",content:h.parse(JSON.parse(t.content)),tags:t.tags?JSON.parse(t.tags):{},createdAt:t.created_at,updatedAt:t.updated_at,shippedAt:t.shipped_at,shippedPr:t.shipped_pr,shippedSha:t.shipped_sha,archivedAt:t.archived_at}}},at=new T;export{h as a,X as b,at as c};
@@ -5,9 +5,9 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as f}from"./chunk-Y5NQV46G.mjs";import{a as v}from"./chunk-RRWPDRYR.mjs";import{e as p,g as I}from"./chunk-HDHVBB6Q.mjs";import{a as R,b as q}from"./chunk-WUHGODSQ.mjs";import{b as H,o as F}from"./chunk-CTWZQ7YI.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var U="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??U);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");q();F();import X from"node:fs";import Q from"node:path";var D="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(R(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await H("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function k(){if(S.value!==void 0)return S.value;let r=process.env[D]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(k,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await k(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",N=256,ae=800;function ce(r){return r.split("").reduce((n,t)=>Math.imul(n^t.charCodeAt(0),16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function P(r){let e=new Float64Array(N),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%N,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(P,"embedLocal");function Oe(r){return P(r)}s(Oe,"embedLocalText");var L=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>P(n))}};function O(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new L}s(O,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Ce(r,e){let n=E(r)*E(e);return n===0?0:T(r,e)/n}s(Ce,"cosineSimilarity");function E(r){let e=Array.from({length:r.length},(n,t)=>r[t]).reduce((n,t)=>n+t*t,0);return Math.sqrt(e)}s(E,"l2Norm");function T(r,e){let n=Math.min(r.length,e.length);return Array.from({length:n},(t,i)=>r[i]*e[i]).reduce((t,i)=>t+i,0)}s(T,"dot");var ge=2e3,fe=10,C=new Map,Pe={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
8
+ import{a as f}from"./chunk-Y5NQV46G.mjs";import{a as v}from"./chunk-DGBDMUBL.mjs";import{e as p,g as I}from"./chunk-HDHVBB6Q.mjs";import{a as R,b as q}from"./chunk-WUHGODSQ.mjs";import{b as H,o as F}from"./chunk-CTWZQ7YI.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var U="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??U);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");q();F();import X from"node:fs";import Q from"node:path";var D="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(R(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await H("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function k(){if(S.value!==void 0)return S.value;let r=process.env[D]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(k,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await k(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",N=256,ae=800;function ce(r){return r.split("").reduce((n,t)=>Math.imul(n^t.charCodeAt(0),16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function P(r){let e=new Float64Array(N),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%N,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(P,"embedLocal");function Oe(r){return P(r)}s(Oe,"embedLocalText");var L=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>P(n))}};function O(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new L}s(O,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Ce(r,e){let n=E(r)*E(e);return n===0?0:T(r,e)/n}s(Ce,"cosineSimilarity");function E(r){let e=Array.from({length:r.length},(n,t)=>r[t]).reduce((n,t)=>n+t*t,0);return Math.sqrt(e)}s(E,"l2Norm");function T(r,e){let n=Math.min(r.length,e.length);return Array.from({length:n},(t,i)=>r[i]*e[i]).reduce((t,i)=>t+i,0)}s(T,"dot");var ge=2e3,fe=10,C=new Map,Pe={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
9
9
  VALUES (?, ?, ?, ?, ?, ?)
10
10
  ON CONFLICT(memory_id) DO UPDATE SET
11
11
  vector = excluded.vector, model = excluded.model,
12
- dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??O(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-D2MVQLOF.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!x(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!x(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,B,K)=>{let A=c[K];return!A||A.length===0?y:(this.store(r,B.id,A,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=C.get(r)??0;return C.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??O(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
12
+ dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??O(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-E7WGFL47.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!x(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!x(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,B,K)=>{let A=c[K];return!A||A.length===0?y:(this.store(r,B.id,A,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=C.get(r)??0;return C.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??O(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
13
13
  WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,ge)}catch{return null}})();if(!u)return[];let l=E(a);if(l===0)return[];let g=u.map(m=>{let d=le(m.vector),c=l*(m.norm??E(d));return{id:m.memory_id,score:c===0?0:T(a,d)/c}}).sort((m,d)=>d.score-m.score).slice(0,t),b=[];for(let m of g){let d=v.getById(r,m.id);d&&b.push(d)}return b}};export{Oe as a,Ce as b,Pe as c};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as v}from"./chunk-MEQS4VPO.mjs";import{b as u,e as S,s,t as $}from"./chunk-AKIN5WSQ.mjs";import{g as C,n as j}from"./chunk-SVZHJZ5T.mjs";import{a as y,b as P,o as G}from"./chunk-CTWZQ7YI.mjs";import{b,e as E}from"./chunk-D4S3IRD3.mjs";import{d as w}from"./chunk-PKDYFXMI.mjs";import{a as f,f as M}from"./chunk-BUDZL4DW.mjs";import{a as c}from"./chunk-E66B27AL.mjs";import h from"node:fs/promises";import W from"node:path";import*as d from"jsonc-parser";G();import k from"node:crypto";var D="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";function F(r,t=D){let n=Buffer.from(t.replace(/-/g,""),"hex"),i=k.createHash("sha1").update(n).update(r,"utf8").digest().subarray(0,16);i[6]=i[6]&15|80,i[8]=i[8]&63|128;let e=i.toString("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20,32)}`}c(F,"uuidv5");async function N(r){let t=await P("git",["remote","get-url","origin"],{cwd:r}).then(({stdout:i})=>i.trim()||null).catch(()=>null);if(!t)return null;let{provider:n,repoSlug:o}=v(t);return!n||!o?null:`${n}:${o}`.toLowerCase()}c(N,"repoKey");async function x(r){let t=await N(r);return t?F(t):null}c(x,"deriveProjectId");M();S();j();E();G();async function m(r){try{let{stdout:t}=await y(r,{timeout:5e3});return{success:!0,output:t.trim()}}catch{return{success:!1,output:""}}}c(m,"execCommand");async function R(){let r=await m("gh api user --jq .login");if(r.success&&r.output)return r.output;let t=await m("git config --global github.user");return t.success&&t.output?t.output:null}c(R,"detectGitHubUsername");async function T(){let r=await m("git config user.name");return r.success&&r.output?r.output:null}c(T,"detectGitName");async function U(){let r=await m("git config user.email");return r.success&&r.output?r.output:null}c(U,"detectGitEmail");async function A(){let[r,t,n]=await Promise.all([R(),T(),U()]);return{github:r,email:n,name:t||r||"Unknown"}}c(A,"detect");$();function I(r){let t=[],n=d.parse(r,t,{allowTrailingComma:!0,disallowComments:!1});if(t.length>0){let o=t[0];throw new SyntaxError(`JSON parse error at offset ${o.offset}: ${d.printParseErrorCode(o.error)}`)}return n}c(I,"parseJsonc");var l=new Map,p=class{static{c(this,"ConfigManager")}async readConfig(t){let n=s.getLocalConfigPath(t),o=await h.stat(n).catch(()=>null);if(!o)return l.delete(n),null;let i=o.mtimeMs,e=l.get(n);if(e&&e.mtimeMs===i)return e.config;try{let a=await h.readFile(n,"utf-8"),g=I(a);return l.size>32&&l.clear(),l.set(n,{mtimeMs:i,config:g}),g}catch(a){return f(a)?(l.delete(n),null):(console.warn(`Warning: Could not read config at ${t}: ${w(a)}`),null)}}async writeConfig(t,n){let o=s.getLocalConfigPath(t);await C(o,n),l.delete(o)}async readGlobalConfig(t){try{let n=s.getGlobalProjectConfigPath(t),o=await h.readFile(n,"utf-8");return I(o)}catch(n){return f(n)||console.warn(`Warning: Could not read global config for ${t}: ${w(n)}`),null}}async writeGlobalConfig(t,n){let o=s.getGlobalProjectConfigPath(t);await C(o,n)}async ensureGlobalConfig(t){let n=await this.readGlobalConfig(t),o=n??(()=>{let i=u();return{projectId:t,authors:[],version:b,lastSync:i}})();return n||await this.writeGlobalConfig(t,o),o}async createConfig(t,n){let o=await x(t)??s.generateProjectId(t),i=s.getGlobalProjectPath(o),e=s.getDisplayPath(i),a=u(),g={projectId:o,dataPath:e,showMetrics:!0};await this.writeConfig(t,g);let L={projectId:o,authors:[{name:n.name||"Unknown",email:n.email||"",github:n.github||"",firstContribution:a,lastActivity:a}],version:b,created:a,lastSync:a};return await this.writeGlobalConfig(o,L),g}async updateLastSync(t){let n=await this.getProjectId(t),o=await this.readGlobalConfig(n);o&&(o.lastSync=u(),await this.writeGlobalConfig(n,o))}validateConfig(t){return!(!t||!t.projectId||!t.dataPath)}async needsMigration(t){if(!await s.hasLegacyStructure(t))return!1;if(!await s.hasConfig(t))return!0;let i=await this.readConfig(t);if(!i||!i.projectId)return!0;let e=s.getGlobalProjectPath(i.projectId);try{return(await h.readdir(W.join(e,"core"))).length===0}catch(a){return f(a),!0}}async getProjectId(t){let n=await this.readConfig(t);if(n?.projectId)return n.projectId;try{let{worktreeService:o}=await import("./worktree-service-XGRN5TTE.mjs");if(await o.detect(t)){let e=await o.getMainWorktree(t);if(e!==t){let a=await this.readConfig(e);if(a?.projectId)return a.projectId}}}catch{}return""}async findAuthor(t,n){let o=await this.readGlobalConfig(t);return!o||!o.authors?null:o.authors.find(i=>i.github===n)||null}async addAuthor(t,n){let o=await this.ensureGlobalConfig(t);if(o.authors.some(a=>a.github===n.github))return;let e=u();o.authors.push({name:n.name||"Unknown",email:n.email||"",github:n.github||"",firstContribution:e,lastActivity:e}),o.lastSync=e,await this.writeGlobalConfig(t,o)}async updateAuthorActivity(t,n){let o=await this.readGlobalConfig(t);if(!o||!o.authors)return;let i=o.authors.find(e=>e.github===n);i&&(i.lastActivity=u(),o.lastSync=i.lastActivity,await this.writeGlobalConfig(t,o))}async getCurrentAuthor(t){let n=await A(),o=await this.getProjectId(t);return await this.addAuthor(o,{name:n.name??void 0,email:n.email??void 0,github:n.github??void 0}),n.github||n.name||"Unknown"}async isConfigured(t){let n=await this.readConfig(t);return this.validateConfig(n)}async getShowMetrics(t){return(await this.readConfig(t))?.showMetrics??!0}async setShowMetrics(t,n){let o=await this.readConfig(t);o&&(o.showMetrics=n,await this.writeConfig(t,o))}async getConfigWithDefaults(t){let n=await this.readConfig(t);if(n)return n;let o=s.generateProjectId(t);return{projectId:o,dataPath:s.getDisplayPath(s.getGlobalProjectPath(o))}}},H=new p,et=H;export{A as a,et as b};
8
+ import{a as v}from"./chunk-MEQS4VPO.mjs";import{b as u,e as S,s,t as $}from"./chunk-AKIN5WSQ.mjs";import{g as C,n as j}from"./chunk-SVZHJZ5T.mjs";import{a as y,b as P,o as G}from"./chunk-CTWZQ7YI.mjs";import{b,e as E}from"./chunk-ZX6BC2EB.mjs";import{d as w}from"./chunk-PKDYFXMI.mjs";import{a as f,f as M}from"./chunk-BUDZL4DW.mjs";import{a as c}from"./chunk-E66B27AL.mjs";import h from"node:fs/promises";import W from"node:path";import*as d from"jsonc-parser";G();import k from"node:crypto";var D="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";function F(r,t=D){let n=Buffer.from(t.replace(/-/g,""),"hex"),i=k.createHash("sha1").update(n).update(r,"utf8").digest().subarray(0,16);i[6]=i[6]&15|80,i[8]=i[8]&63|128;let e=i.toString("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20,32)}`}c(F,"uuidv5");async function N(r){let t=await P("git",["remote","get-url","origin"],{cwd:r}).then(({stdout:i})=>i.trim()||null).catch(()=>null);if(!t)return null;let{provider:n,repoSlug:o}=v(t);return!n||!o?null:`${n}:${o}`.toLowerCase()}c(N,"repoKey");async function x(r){let t=await N(r);return t?F(t):null}c(x,"deriveProjectId");M();S();j();E();G();async function m(r){try{let{stdout:t}=await y(r,{timeout:5e3});return{success:!0,output:t.trim()}}catch{return{success:!1,output:""}}}c(m,"execCommand");async function R(){let r=await m("gh api user --jq .login");if(r.success&&r.output)return r.output;let t=await m("git config --global github.user");return t.success&&t.output?t.output:null}c(R,"detectGitHubUsername");async function T(){let r=await m("git config user.name");return r.success&&r.output?r.output:null}c(T,"detectGitName");async function U(){let r=await m("git config user.email");return r.success&&r.output?r.output:null}c(U,"detectGitEmail");async function A(){let[r,t,n]=await Promise.all([R(),T(),U()]);return{github:r,email:n,name:t||r||"Unknown"}}c(A,"detect");$();function I(r){let t=[],n=d.parse(r,t,{allowTrailingComma:!0,disallowComments:!1});if(t.length>0){let o=t[0];throw new SyntaxError(`JSON parse error at offset ${o.offset}: ${d.printParseErrorCode(o.error)}`)}return n}c(I,"parseJsonc");var l=new Map,p=class{static{c(this,"ConfigManager")}async readConfig(t){let n=s.getLocalConfigPath(t),o=await h.stat(n).catch(()=>null);if(!o)return l.delete(n),null;let i=o.mtimeMs,e=l.get(n);if(e&&e.mtimeMs===i)return e.config;try{let a=await h.readFile(n,"utf-8"),g=I(a);return l.size>32&&l.clear(),l.set(n,{mtimeMs:i,config:g}),g}catch(a){return f(a)?(l.delete(n),null):(console.warn(`Warning: Could not read config at ${t}: ${w(a)}`),null)}}async writeConfig(t,n){let o=s.getLocalConfigPath(t);await C(o,n),l.delete(o)}async readGlobalConfig(t){try{let n=s.getGlobalProjectConfigPath(t),o=await h.readFile(n,"utf-8");return I(o)}catch(n){return f(n)||console.warn(`Warning: Could not read global config for ${t}: ${w(n)}`),null}}async writeGlobalConfig(t,n){let o=s.getGlobalProjectConfigPath(t);await C(o,n)}async ensureGlobalConfig(t){let n=await this.readGlobalConfig(t),o=n??(()=>{let i=u();return{projectId:t,authors:[],version:b,lastSync:i}})();return n||await this.writeGlobalConfig(t,o),o}async createConfig(t,n){let o=await x(t)??s.generateProjectId(t),i=s.getGlobalProjectPath(o),e=s.getDisplayPath(i),a=u(),g={projectId:o,dataPath:e,showMetrics:!0};await this.writeConfig(t,g);let L={projectId:o,authors:[{name:n.name||"Unknown",email:n.email||"",github:n.github||"",firstContribution:a,lastActivity:a}],version:b,created:a,lastSync:a};return await this.writeGlobalConfig(o,L),g}async updateLastSync(t){let n=await this.getProjectId(t),o=await this.readGlobalConfig(n);o&&(o.lastSync=u(),await this.writeGlobalConfig(n,o))}validateConfig(t){return!(!t||!t.projectId||!t.dataPath)}async needsMigration(t){if(!await s.hasLegacyStructure(t))return!1;if(!await s.hasConfig(t))return!0;let i=await this.readConfig(t);if(!i||!i.projectId)return!0;let e=s.getGlobalProjectPath(i.projectId);try{return(await h.readdir(W.join(e,"core"))).length===0}catch(a){return f(a),!0}}async getProjectId(t){let n=await this.readConfig(t);if(n?.projectId)return n.projectId;try{let{worktreeService:o}=await import("./worktree-service-XGRN5TTE.mjs");if(await o.detect(t)){let e=await o.getMainWorktree(t);if(e!==t){let a=await this.readConfig(e);if(a?.projectId)return a.projectId}}}catch{}return""}async findAuthor(t,n){let o=await this.readGlobalConfig(t);return!o||!o.authors?null:o.authors.find(i=>i.github===n)||null}async addAuthor(t,n){let o=await this.ensureGlobalConfig(t);if(o.authors.some(a=>a.github===n.github))return;let e=u();o.authors.push({name:n.name||"Unknown",email:n.email||"",github:n.github||"",firstContribution:e,lastActivity:e}),o.lastSync=e,await this.writeGlobalConfig(t,o)}async updateAuthorActivity(t,n){let o=await this.readGlobalConfig(t);if(!o||!o.authors)return;let i=o.authors.find(e=>e.github===n);i&&(i.lastActivity=u(),o.lastSync=i.lastActivity,await this.writeGlobalConfig(t,o))}async getCurrentAuthor(t){let n=await A(),o=await this.getProjectId(t);return await this.addAuthor(o,{name:n.name??void 0,email:n.email??void 0,github:n.github??void 0}),n.github||n.name||"Unknown"}async isConfigured(t){let n=await this.readConfig(t);return this.validateConfig(n)}async getShowMetrics(t){return(await this.readConfig(t))?.showMetrics??!0}async setShowMetrics(t,n){let o=await this.readConfig(t);o&&(o.showMetrics=n,await this.writeConfig(t,o))}async getConfigWithDefaults(t){let n=await this.readConfig(t);if(n)return n;let o=s.generateProjectId(t);return{projectId:o,dataPath:s.getDisplayPath(s.getGlobalProjectPath(o))}}},H=new p,et=H;export{A as a,et as b};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as d}from"./chunk-RRWPDRYR.mjs";import{c as l}from"./chunk-3LG3ACQV.mjs";import{e as a,g as p}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";p();var E=7,T=90,f=20,A=["pattern-detector","transcript-auto","skill-miss","friction","land-auto","sync-context-quality"];function h(e){return e?A.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(t)):!1}m(h,"isAutoSource");function L(e,t=E,o=500){let u=Date.now()-t*864e5;try{let n=a.query(e,`SELECT id FROM memory_entries
8
+ import{a as d}from"./chunk-DGBDMUBL.mjs";import{c as l}from"./chunk-3LG3ACQV.mjs";import{e as a,g as p}from"./chunk-HDHVBB6Q.mjs";import{a as m}from"./chunk-E66B27AL.mjs";p();var E=7,T=90,f=20,A=["pattern-detector","transcript-auto","skill-miss","friction","land-auto","sync-context-quality"];function h(e){return e?A.some(t=>e===t||e.startsWith(`${t}-`)||e.startsWith(t)):!1}m(h,"isAutoSource");function L(e,t=E,o=500){let u=Date.now()-t*864e5;try{let n=a.query(e,`SELECT id FROM memory_entries
9
9
  WHERE deleted_at IS NOT NULL AND deleted_at < ?
10
10
  ORDER BY deleted_at ASC
11
11
  LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),r=s.prepare("DELETE FROM memory_entries WHERE id = ?");for(let c of n){try{i.run(c.id)}catch{}r.run(c.id)}}),n.length)}catch{return 0}}m(L,"purgeSoftDeleted");function O(e,t=E,o=500){let u=new Date(Date.now()-t*864e5).toISOString();try{let n=a.query(e,`SELECT e.id FROM events e
@@ -16,4 +16,4 @@ import{a as d}from"./chunk-RRWPDRYR.mjs";import{c as l}from"./chunk-3LG3ACQV.mjs
16
16
  WHERE m.id = 'mem_' || e.id AND m.deleted_at IS NULL
17
17
  )
18
18
  ORDER BY e.id ASC
19
- LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM events WHERE id = ?");for(let r of n)i.run(r.id)}),n.length)}catch{return 0}}m(O,"purgeOrphanRememberEvents");function g(e,t=f){if(t<=0)return 0;let o=[];try{let u=d.allEntriesForIndex(e),n=new Map;for(let s of u){let i=s.tags?.source;if(!h(i))continue;let r=i,c=n.get(r)??[];c.push(s),n.set(r,c)}for(let[,s]of n){if(s.length<=t)continue;s.sort((r,c)=>r.rememberedAt.localeCompare(c.rememberedAt));let i=s.slice(0,s.length-t);for(let r of i){try{l.archive(e,{entityType:"memory_entry",entityId:r.id,entityData:{id:r.id,type:r.type,content:r.content,tags:r.tags,rememberedAt:r.rememberedAt},summary:r.content.slice(0,80),reason:`auto-source-cap (>${t})`})}catch{}d.forget(e,r.id)&&o.push(r)}}}catch{return o.length}return o.length}m(g,"trimAutoSourceCap");function F(e){let t=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NULL")?.c??0,o=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NOT NULL")?.c??0,u=a.get(e,"SELECT COUNT(*) AS c FROM archives")?.c??0,n=a.get(e,"SELECT COUNT(*) AS c FROM events WHERE type LIKE 'memory.remember.%'")?.c??0,s=(()=>{try{return d.allEntriesForIndex(e).filter(i=>h(i.tags?.source)).length}catch{return 0}})();return{live:t,softDeleted:o,archives:u,rememberEvents:n,autoSourceLive:s}}m(F,"vaultHealth");async function N(e,t={}){let o=t.softDeletedPurgeDays??E,u=t.archivePruneDays??T,n=t.autoSourceMaxLive??f;if(t.dryRun===!0)return{softDeletedPurged:0,orphanEventsPurged:0,archivesPruned:0,autoSourceTrimmed:0,distilledDiscarded:0,digestsWritten:0};let i=await(async()=>{if(t.projectPath)try{let{distillAndDiscardAllAutoSources:_}=await import("./distill-6C6YIFOE.mjs"),y=await _(t.projectPath,e,n);return{distilledDiscarded:y.discarded,digestsWritten:y.digests}}catch{return g(e,n),{distilledDiscarded:0,digestsWritten:0}}else return g(e,n),{distilledDiscarded:0,digestsWritten:0}})(),{distilledDiscarded:r,digestsWritten:c}=i,{eliminateSoftDeletedNoValue:D}=await import("./distill-6C6YIFOE.mjs"),b=D(e,o).purged||L(e,o),S=O(e,o),R=(()=>{try{return l.pruneOldArchives(e,u)}catch{return 0}})();return{softDeletedPurged:b,orphanEventsPurged:S,archivesPruned:R,autoSourceTrimmed:r,distilledDiscarded:r,digestsWritten:c}}m(N,"runVaultPurge");export{E as a,T as b,f as c,A as d,h as e,L as f,O as g,g as h,F as i,N as j};
19
+ LIMIT ?`,u,o);return n.length===0?0:(a.transaction(e,s=>{let i=s.prepare("DELETE FROM events WHERE id = ?");for(let r of n)i.run(r.id)}),n.length)}catch{return 0}}m(O,"purgeOrphanRememberEvents");function g(e,t=f){if(t<=0)return 0;let o=[];try{let u=d.allEntriesForIndex(e),n=new Map;for(let s of u){let i=s.tags?.source;if(!h(i))continue;let r=i,c=n.get(r)??[];c.push(s),n.set(r,c)}for(let[,s]of n){if(s.length<=t)continue;s.sort((r,c)=>r.rememberedAt.localeCompare(c.rememberedAt));let i=s.slice(0,s.length-t);for(let r of i){try{l.archive(e,{entityType:"memory_entry",entityId:r.id,entityData:{id:r.id,type:r.type,content:r.content,tags:r.tags,rememberedAt:r.rememberedAt},summary:r.content.slice(0,80),reason:`auto-source-cap (>${t})`})}catch{}d.forget(e,r.id)&&o.push(r)}}}catch{return o.length}return o.length}m(g,"trimAutoSourceCap");function F(e){let t=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NULL")?.c??0,o=a.get(e,"SELECT COUNT(*) AS c FROM memory_entries WHERE deleted_at IS NOT NULL")?.c??0,u=a.get(e,"SELECT COUNT(*) AS c FROM archives")?.c??0,n=a.get(e,"SELECT COUNT(*) AS c FROM events WHERE type LIKE 'memory.remember.%'")?.c??0,s=(()=>{try{return d.allEntriesForIndex(e).filter(i=>h(i.tags?.source)).length}catch{return 0}})();return{live:t,softDeleted:o,archives:u,rememberEvents:n,autoSourceLive:s}}m(F,"vaultHealth");async function N(e,t={}){let o=t.softDeletedPurgeDays??E,u=t.archivePruneDays??T,n=t.autoSourceMaxLive??f;if(t.dryRun===!0)return{softDeletedPurged:0,orphanEventsPurged:0,archivesPruned:0,autoSourceTrimmed:0,distilledDiscarded:0,digestsWritten:0};let i=await(async()=>{if(t.projectPath)try{let{distillAndDiscardAllAutoSources:_}=await import("./distill-IABVRW2U.mjs"),y=await _(t.projectPath,e,n);return{distilledDiscarded:y.discarded,digestsWritten:y.digests}}catch{return g(e,n),{distilledDiscarded:0,digestsWritten:0}}else return g(e,n),{distilledDiscarded:0,digestsWritten:0}})(),{distilledDiscarded:r,digestsWritten:c}=i,{eliminateSoftDeletedNoValue:D}=await import("./distill-IABVRW2U.mjs"),b=D(e,o).purged||L(e,o),S=O(e,o),R=(()=>{try{return l.pruneOldArchives(e,u)}catch{return 0}})();return{softDeletedPurged:b,orphanEventsPurged:S,archivesPruned:R,autoSourceTrimmed:r,distilledDiscarded:r,digestsWritten:c}}m(N,"runVaultPurge");export{E as a,T as b,f as c,A as d,h as e,L as f,O as g,g as h,F as i,N as j};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{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:
8
+ import{a as k,b as a}from"./chunk-2HTDCLZD.mjs";import{a as E}from"./chunk-DVBBB5BS.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
9
  ${e.map((t,i)=>`${i+1}. ${t}`).join(`
10
10
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
11
11
 
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as h}from"./chunk-RRWPDRYR.mjs";import{d as a,g as E}from"./chunk-HDHVBB6Q.mjs";import{a as c}from"./chunk-E66B27AL.mjs";E();var I="land-receipt",_="judgment-receipt",g="receipt-v1";function D(e){let r=e.trapsSurfaced??[],t=e.decisions??[],n=(e.journal??[]).filter(s=>s.trim()),o=(e.openRisksNext??[]).filter(s=>s.trim()),l=e.cycleDescription?.trim()||null,y=e.tokensIn!=null||e.tokensOut!=null||!!e.model;if(!l&&r.length===0&&t.length===0&&n.length===0&&o.length===0&&!y)return null;let i=["# Judgment Receipt",""],m=[];if(l&&m.push(`cycle: "${u(l,100)}"`),n.length>0&&m.push(`journal: ${n.slice(0,4).map(s=>u(s,70)).join(" \xB7 ")}`),m.length>0&&i.push("## Applied judgment",...m.map(s=>`- ${s}`),""),r.length>0&&i.push("## Traps re-surfaced",...r.slice(0,8).map(s=>`- **[${s.type}]** ${u(s.title,100)} \`${s.id}\``),""),t.length>0&&i.push("## Decisions contested or honored",...t.slice(0,8).map(s=>`- **${s.status}** [${s.type}] ${u(s.title,100)} \`${s.id}\``),""),o.length>0||l){let s=o.length>0?o.slice(0,5).map(d=>`- ${u(d,120)}`):["- Finish or pause open cycle; next agent: `prjct prime` / `prjct work --md`."];i.push("## Open risks / next",...s,"")}if(y){let s=[];if(e.tokensIn!=null||e.tokensOut!=null){let d=e.tokensIn??0,f=e.tokensOut??0;s.push(`tokens in=${d} out=${f} total=${d+f}`)}e.model&&s.push(`model=${e.model}`),e.author&&s.push(`author=${e.author}`),i.push("## Session economics",`- ${s.join(" \xB7 ")}`,"")}return i.push("_Closed-loop judgment continuity \u2014 not bulk memory. Proof of traps prevented and decisions applied._"),i.join(`
8
+ import{a as h}from"./chunk-DGBDMUBL.mjs";import{d as a,g as E}from"./chunk-HDHVBB6Q.mjs";import{a as c}from"./chunk-E66B27AL.mjs";E();var I="land-receipt",_="judgment-receipt",g="receipt-v1";function D(e){let r=e.trapsSurfaced??[],t=e.decisions??[],n=(e.journal??[]).filter(s=>s.trim()),o=(e.openRisksNext??[]).filter(s=>s.trim()),l=e.cycleDescription?.trim()||null,y=e.tokensIn!=null||e.tokensOut!=null||!!e.model;if(!l&&r.length===0&&t.length===0&&n.length===0&&o.length===0&&!y)return null;let i=["# Judgment Receipt",""],m=[];if(l&&m.push(`cycle: "${u(l,100)}"`),n.length>0&&m.push(`journal: ${n.slice(0,4).map(s=>u(s,70)).join(" \xB7 ")}`),m.length>0&&i.push("## Applied judgment",...m.map(s=>`- ${s}`),""),r.length>0&&i.push("## Traps re-surfaced",...r.slice(0,8).map(s=>`- **[${s.type}]** ${u(s.title,100)} \`${s.id}\``),""),t.length>0&&i.push("## Decisions contested or honored",...t.slice(0,8).map(s=>`- **${s.status}** [${s.type}] ${u(s.title,100)} \`${s.id}\``),""),o.length>0||l){let s=o.length>0?o.slice(0,5).map(d=>`- ${u(d,120)}`):["- Finish or pause open cycle; next agent: `prjct prime` / `prjct work --md`."];i.push("## Open risks / next",...s,"")}if(y){let s=[];if(e.tokensIn!=null||e.tokensOut!=null){let d=e.tokensIn??0,f=e.tokensOut??0;s.push(`tokens in=${d} out=${f} total=${d+f}`)}e.model&&s.push(`model=${e.model}`),e.author&&s.push(`author=${e.author}`),i.push("## Session economics",`- ${s.join(" \xB7 ")}`,"")}return i.push("_Closed-loop judgment continuity \u2014 not bulk memory. Proof of traps prevented and decisions applied._"),i.join(`
9
9
  `).trim()}c(D,"buildJudgmentReceipt");function R(e){if(!e)return null;let r=(e.match(/## Traps re-surfaced/g)||[]).length,t=p(e,"Traps re-surfaced"),n=p(e,"Decisions contested or honored"),o=[];return t>0&&o.push(`${t} trap(s) re-surfaced`),n>0&&o.push(`${n} decision(s) tracked`),o.length===0&&o.push("session judgment landed"),`Judgment receipt: ${o.join(", ")}`}c(R,"summarizeJudgmentReceipt");function p(e,r){let t=new RegExp(`## ${r}\\n([\\s\\S]*?)(?=\\n## |\\n_|$)`),n=e.match(t);return n?(n[1].match(/^- /gm)||[]).length:0}c(p,"countSectionBullets");async function k(e,r,t){let n=D(t);if(!n)return{wrote:!1,content:null,summary:null,reason:"nothing-to-receipt"};try{return await h.remember(e,{type:"context",content:n,tags:{source:I,topic:_,capture:g,synthesis:"deterministic"},provenance:"extracted",projectId:r}),{wrote:!0,content:n,summary:R(n)}}catch(o){return{wrote:!1,content:n,summary:R(n),reason:`remember-failed: ${o.message}`}}}c(k,"persistJudgmentReceipt");async function C(e){let r=S(e.projectId,e.cycleId),t=O(e.projectId),n=$(e.projectId);return k(e.projectPath,e.projectId,{cycleDescription:e.cycleDescription,cycleId:e.cycleId,journal:r,trapsSurfaced:t,decisions:n,tokensIn:e.tokensIn,tokensOut:e.tokensOut,model:e.model,author:e.author,openRisksNext:e.cycleDescription?["Open cycle still needs finish or pause before context dies."]:[]})}c(C,"synthesizeJudgmentReceipt");function T(e){try{let r=Date.now()-864e5,n=a.query(e,`SELECT me.id, me.content
10
10
  FROM memory_entries me
11
11
  JOIN memory_entry_tags t ON t.entry_id = me.id
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as 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(`
8
+ import{a as p}from"./chunk-DGBDMUBL.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
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
10
  FROM memory_entry_tags t
11
11
  JOIN memory_entries me ON me.id = t.entry_id