prjct-cli 3.92.0 → 3.93.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 (89) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/bin/hook-chunks/{agent-switch-XMFUTNNV.mjs → agent-switch-A6AYZRJ5.mjs} +1 -1
  3. package/dist/bin/hook-chunks/{analysis-PFGKPYWQ.mjs → analysis-WPRPBYHY.mjs} +15 -15
  4. package/dist/bin/hook-chunks/{auto-flush-QZ3YIQP6.mjs → auto-flush-5D4PKOMM.mjs} +1 -1
  5. package/dist/bin/hook-chunks/{capture-gate-2FXYVHNF.mjs → capture-gate-EOOSAGAP.mjs} +1 -1
  6. package/dist/bin/hook-chunks/{chunk-DGBDMUBL.mjs → chunk-3WY2AYPE.mjs} +2 -2
  7. package/dist/bin/hook-chunks/{chunk-I5BDN25C.mjs → chunk-4OYUJTPR.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{chunk-XHDNPEAN.mjs → chunk-6WXGOGAN.mjs} +1 -1
  9. package/dist/bin/hook-chunks/{chunk-S4TB2OFJ.mjs → chunk-742LOGHA.mjs} +1 -1
  10. package/dist/bin/hook-chunks/{chunk-ZNQXFWSI.mjs → chunk-7AN7VQHN.mjs} +1 -1
  11. package/dist/bin/hook-chunks/{chunk-GELCZWKW.mjs → chunk-A7SGMNOK.mjs} +1 -1
  12. package/dist/bin/hook-chunks/{chunk-NLDL3N6R.mjs → chunk-ACKEPXP4.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-WSFHSXBZ.mjs → chunk-BNWB77U5.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-MQVVNX63.mjs → chunk-DLHSCKBJ.mjs} +1 -1
  15. package/dist/bin/hook-chunks/chunk-DV7KV2O4.mjs +38 -0
  16. package/dist/bin/hook-chunks/{chunk-7JE6VTLN.mjs → chunk-EHP4DYVQ.mjs} +9 -9
  17. package/dist/bin/hook-chunks/{chunk-CQUG6SO2.mjs → chunk-GIMUTVLP.mjs} +1 -1
  18. package/dist/bin/hook-chunks/{chunk-BZ5UR7G3.mjs → chunk-HT3ZCLLJ.mjs} +1 -1
  19. package/dist/bin/hook-chunks/{chunk-OLKNK2HB.mjs → chunk-JRKGG2E3.mjs} +1 -1
  20. package/dist/bin/hook-chunks/{chunk-OL6ITIAZ.mjs → chunk-KXWBIQGJ.mjs} +2 -2
  21. package/dist/bin/hook-chunks/{chunk-5PEHJEFE.mjs → chunk-L4376X2P.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-MAHTF6JG.mjs → chunk-LFY5O66D.mjs} +1 -1
  23. package/dist/bin/hook-chunks/{chunk-SY2FRLJF.mjs → chunk-MHRMV4WI.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-HX42HFII.mjs → chunk-OB5GRS7T.mjs} +4 -4
  25. package/dist/bin/hook-chunks/{chunk-2WPR5GFT.mjs → chunk-P4J6TY2L.mjs} +1 -1
  26. package/dist/bin/hook-chunks/{chunk-ZX6BC2EB.mjs → chunk-P5ZYAXSE.mjs} +1 -1
  27. package/dist/bin/hook-chunks/{chunk-2HTDCLZD.mjs → chunk-PWMMLXZS.mjs} +2 -2
  28. package/dist/bin/hook-chunks/{chunk-DVBBB5BS.mjs → chunk-QK2IMCDC.mjs} +1 -1
  29. package/dist/bin/hook-chunks/{chunk-TBM7736J.mjs → chunk-RXD7MHJ6.mjs} +1 -1
  30. package/dist/bin/hook-chunks/{chunk-AWD2AQVJ.mjs → chunk-TSCXXNUF.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-CPHUFXD2.mjs → chunk-UB53HQMG.mjs} +2 -2
  32. package/dist/bin/hook-chunks/{chunk-3X7TBM4A.mjs → chunk-UBMIPWJR.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-OP467HW6.mjs → chunk-UK7D7EFV.mjs} +2 -2
  34. package/dist/bin/hook-chunks/{chunk-CDCCAU22.mjs → chunk-VPPHD762.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-Y7CKMFNW.mjs → chunk-VV7VNUTF.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{codex-skill-2N6656SR.mjs → codex-skill-ZCAUF2RM.mjs} +1 -1
  37. package/dist/bin/hook-chunks/{command-installer-XSKQS3IS.mjs → command-installer-LNK7WC5I.mjs} +1 -1
  38. package/dist/bin/hook-chunks/{config-manager-YZANYLPV.mjs → config-manager-4VWDBPMG.mjs} +1 -1
  39. package/dist/bin/hook-chunks/{cwd-changed-NJ6RYVOJ.mjs → cwd-changed-FYNPPO73.mjs} +1 -1
  40. package/dist/bin/hook-chunks/detect-changes-M2OYIOE5.mjs +19 -0
  41. package/dist/bin/hook-chunks/{distill-IABVRW2U.mjs → distill-W7QGQUDX.mjs} +1 -1
  42. package/dist/bin/hook-chunks/{enriched-recall-NDASPZXZ.mjs → enriched-recall-W7KYRYVR.mjs} +1 -1
  43. package/dist/bin/hook-chunks/{format-NIBVWBGR.mjs → format-BOWFDUBP.mjs} +1 -1
  44. package/dist/bin/hook-chunks/{judgment-receipt-HTNEOJLT.mjs → judgment-receipt-WGTFKID7.mjs} +1 -1
  45. package/dist/bin/hook-chunks/{land-cue-FNLP4IAB.mjs → land-cue-WLGSULSO.mjs} +1 -1
  46. package/dist/bin/hook-chunks/{land-synthesis-HBPIXP5S.mjs → land-synthesis-V7UH5QV6.mjs} +1 -1
  47. package/dist/bin/hook-chunks/{legacy-crew-sweep-2MLYPNQR.mjs → legacy-crew-sweep-MFE4BDNR.mjs} +2 -2
  48. package/dist/bin/hook-chunks/{memory-index-MQCHZFUE.mjs → memory-index-B53F5HAX.mjs} +1 -1
  49. package/dist/bin/hook-chunks/{notification-VQM2AMNS.mjs → notification-HJLS4L7Y.mjs} +1 -1
  50. package/dist/bin/hook-chunks/{pack-integrity-BKLDNYE5.mjs → pack-integrity-62XJ5A75.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{pack-manager-ASWLKYGP.mjs → pack-manager-K3PQ7MCS.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{planning-QBSY272P.mjs → planning-WMLFXZMA.mjs} +2 -2
  53. package/dist/bin/hook-chunks/{post-edit-VTLDHWI3.mjs → post-edit-TT3XOG55.mjs} +1 -1
  54. package/dist/bin/hook-chunks/{pre-bash-JR6257XO.mjs → pre-bash-2KKF4V6G.mjs} +1 -1
  55. package/dist/bin/hook-chunks/{pre-commit-BYUFDN2N.mjs → pre-commit-UU4SKKWV.mjs} +1 -1
  56. package/dist/bin/hook-chunks/{pre-edit-MHROFDS3.mjs → pre-edit-RTBLZPWH.mjs} +1 -1
  57. package/dist/bin/hook-chunks/{pre-package-P7CLTJJV.mjs → pre-package-LQTINBT4.mjs} +1 -1
  58. package/dist/bin/hook-chunks/{pre-search-BCQHPE46.mjs → pre-search-UJU3XZ2K.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{prjct-md-WE6WFVL3.mjs → prjct-md-Q6C5YNI3.mjs} +1 -1
  60. package/dist/bin/hook-chunks/{project-agent-surfaces-A6HGZPAL.mjs → project-agent-surfaces-3BBZIQNI.mjs} +1 -1
  61. package/dist/bin/hook-chunks/{project-memory-ON54KZEM.mjs → project-memory-YHQBRX3D.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{project-style-evolution-T27I5N65.mjs → project-style-evolution-HS6HYI7W.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{prompt-JIOMJCGV.mjs → prompt-AYY7BZFG.mjs} +2 -2
  64. package/dist/bin/hook-chunks/{purge-QQ6XILZD.mjs → purge-AXMYTZVM.mjs} +1 -1
  65. package/dist/bin/hook-chunks/{retention-E7WGFL47.mjs → retention-22OSCAGV.mjs} +1 -1
  66. package/dist/bin/hook-chunks/{sdd-PV6KWXE4.mjs → sdd-W3OUQPHD.mjs} +1 -1
  67. package/dist/bin/hook-chunks/{session-continuity-5CLT5YBL.mjs → session-continuity-LO2KNHXU.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{session-start-ATYLOUKB.mjs → session-start-5UZSL6OY.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{setup-VL7YXVE5.mjs → setup-BSWLQJPE.mjs} +2 -2
  70. package/dist/bin/hook-chunks/{shipping-LVTFVSWJ.mjs → shipping-HV5IAM2J.mjs} +4 -4
  71. package/dist/bin/hook-chunks/{spec-context-inference-U6BGGB2Q.mjs → spec-context-inference-UBHJLOIJ.mjs} +1 -1
  72. package/dist/bin/hook-chunks/{spec-service-2DVDFOR7.mjs → spec-service-TA4Q5S3X.mjs} +2 -2
  73. package/dist/bin/hook-chunks/{spec-task-breakdown-MPNRRTNZ.mjs → spec-task-breakdown-QJWGCON2.mjs} +1 -1
  74. package/dist/bin/hook-chunks/{stop-GBUGB5OE.mjs → stop-QVDK6LUV.mjs} +2 -2
  75. package/dist/bin/hook-chunks/{subagent-start-HURF2GI7.mjs → subagent-start-UYBSD7VK.mjs} +1 -1
  76. package/dist/bin/hook-chunks/{subagent-stop-WJECHEXI.mjs → subagent-stop-FHLL7X66.mjs} +1 -1
  77. package/dist/bin/hook-chunks/{surface-attribution-BDKFYUOJ.mjs → surface-attribution-HYCBHBTC.mjs} +1 -1
  78. package/dist/bin/hook-chunks/{task-service-BM2JQXMS.mjs → task-service-RMCQEHV6.mjs} +1 -1
  79. package/dist/bin/hook-chunks/{tdd-UJDJUJ3E.mjs → tdd-LV63NXZ3.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{template-loader-BFTLPG2W.mjs → template-loader-SO6OHPJI.mjs} +1 -1
  81. package/dist/bin/hook-chunks/{weak-model-mode-GLXXHG32.mjs → weak-model-mode-VDYJ25PX.mjs} +1 -1
  82. package/dist/bin/hook-chunks/{work-scope-VTF6SKLY.mjs → work-scope-OKFSTW6D.mjs} +1 -1
  83. package/dist/bin/prjct-core.mjs +694 -692
  84. package/dist/bin/prjct-hooks.mjs +1 -1
  85. package/dist/daemon/entry.mjs +609 -607
  86. package/dist/mcp/server.mjs +309 -307
  87. package/package.json +1 -1
  88. package/dist/bin/hook-chunks/chunk-KB3P6XTL.mjs +0 -38
  89. package/dist/bin/hook-chunks/detect-changes-6N4DCWXQ.mjs +0 -17
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{b as Pt}from"./chunk-FGQZ62ZP.mjs";import{a as ft,b as gt,c as ht,d as yt,e as St}from"./chunk-TXJT3G53.mjs";import{a as dt}from"./chunk-A5RNWWTH.mjs";import{a as Je}from"./chunk-HZIORCPO.mjs";import{a as ze}from"./chunk-WDGDFXSB.mjs";import{a as se,b as Be}from"./chunk-NWY5M34K.mjs";import{a as qe,b as Ct}from"./chunk-PWMMLXZS.mjs";import{a as ut,b as mt}from"./chunk-UB53HQMG.mjs";import{d as pt}from"./chunk-A7SGMNOK.mjs";import{a as it,b as ct}from"./chunk-QDQ7DTDV.mjs";import{a as wt,b as kt,c as vt,d as bt}from"./chunk-ZTZTVBAZ.mjs";import{a as f}from"./chunk-DYHYDHCW.mjs";import{b as K,c as et,d as tt}from"./chunk-YJMWY4Y6.mjs";import{c as rt,d as st,e as ae,f as nt,g as at}from"./chunk-NJAMZSHM.mjs";import{a as ot}from"./chunk-DLHSCKBJ.mjs";import{i as lt}from"./chunk-J6JZ4PQA.mjs";import{a as Ze}from"./chunk-P4J6TY2L.mjs";import{b as Ye,c as Qe,d as Xe}from"./chunk-4DDCWMI6.mjs";import{a as Ke}from"./chunk-QK2IMCDC.mjs";import{a as ne,b as T}from"./chunk-BISPGBNN.mjs";import{a as Ve}from"./chunk-HJ4HEI45.mjs";import{c as We}from"./chunk-3LG3ACQV.mjs";import{c as Ue}from"./chunk-AOPJ4Z6O.mjs";import{b as M}from"./chunk-JRKGG2E3.mjs";import{d as P,e as j,g as q}from"./chunk-HDHVBB6Q.mjs";import{d as re}from"./chunk-VPPHD762.mjs";import{b,e as te,m as Ne,o as He,r as Pr,s as B,t as Le}from"./chunk-AKIN5WSQ.mjs";import{b as Oe,f as br}from"./chunk-HDSS6UB3.mjs";import{d as _e,e as Me,f as $e,j as L,n as J}from"./chunk-SVZHJZ5T.mjs";import{a as Te,o as vr}from"./chunk-CTWZQ7YI.mjs";import{a as Ge}from"./chunk-7AN7VQHN.mjs";import{d as w}from"./chunk-PKDYFXMI.mjs";import{a as _,d as Fe,e as k,f as N}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";function xt(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),o=e.patterns.map(u=>u.name);G("Patterns",s,o,t);let a=r.antiPatterns.map(u=>u.issue),n=e.antiPatterns.map(u=>u.issue);G("Anti-patterns",a,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(xt,"generateAnalysisDiff");function gs(r){if(!r.hasChanges)return`## Analysis Diff
9
+
10
+ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let o=s.type==="added"?"+":s.type==="removed"?"-":"~",a=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${o} | ${s.field} | ${a} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
11
+ `)}i(gs,"formatAnalysisDiffMd");function hs(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
12
+ `)}i(hs,"formatAnalysisDiffText");function G(r,e,t,s){let o=new Set(e),a=new Set(t);for(let n of t)o.has(n)||s.push({field:r,type:"added",after:n});for(let n of e)a.has(n)||s.push({field:r,type:"removed",before:n})}i(G,"diffStringArray");N();J();br();import oe from"node:fs/promises";import F from"node:path";import{z as p}from"zod";var Cr=p.enum(["draft","verified","sealed"]),xr=p.object({name:p.string(),description:p.string(),location:p.string().optional(),severity:p.enum(["low","medium","high"]).optional(),language:p.string().optional(),framework:p.string().optional(),source:p.enum(["baseline","repo","context7","feedback"]).optional(),confidence:p.number().min(0).max(1).optional()}),Dr=p.object({issue:p.string(),file:p.string(),suggestion:p.string(),severity:p.enum(["low","medium","high"]).optional(),language:p.string().optional(),framework:p.string().optional(),source:p.enum(["baseline","repo","context7","feedback"]).optional(),confidence:p.number().min(0).max(1).optional()}),ie=p.object({projectId:p.string(),languages:p.array(p.string()),frameworks:p.array(p.string()),packageManager:p.string().optional(),sourceDir:p.string().optional(),testDir:p.string().optional(),configFiles:p.array(p.string()),fileCount:p.number(),patterns:p.array(xr),antiPatterns:p.array(Dr),analyzedAt:p.string(),modelMetadata:Oe.optional(),status:Cr.default("draft"),commitHash:p.string().optional(),signature:p.string().optional(),sealedAt:p.string().optional(),verifiedAt:p.string().optional()});var Ar={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};async function jr(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=F.join(e,"package.json"),o=await oe.readFile(s,"utf-8"),a=JSON.parse(o),n={...a.dependencies,...a.devDependencies},l=[],c=[];for(let d of r.frameworks){let u=d.toLowerCase();Object.keys(n).some(h=>h.toLowerCase().includes(u))?c.push(d):l.push(d)}return l.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${l.join(", ")}`,durationMs:Date.now()-t}}catch(s){return _(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(jr,"verifyFrameworks");async function Ir(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await Fr(e),o=new Set(s),a=[],n=[];for(let l of r.languages){let c=Ar[l];if(!c)continue;c.some(u=>o.has(u))?a.push(l):n.push(l)}return n.length===0?{name:"Language verification",passed:!0,output:`${a.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${n.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(Ir,"verifyLanguages");async function Er(r,e){let t=Date.now(),s=r.patterns.filter(n=>n.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let o=[],a=[];for(let n of s){let l=n.location,c=F.join(e,l);await L(c)?a.push(l):o.push(`${n.name} (${l})`)}return o.length===0?{name:"Pattern location verification",passed:!0,output:`${a.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${o.join(", ")}`,durationMs:Date.now()-t}}i(Er,"verifyPatternLocations");async function Rr(r,e){let t=Date.now();try{let s=await _r(e),o=r.fileCount,a=.1,n=Math.abs(s-o),l=o*a;return n<=l?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${o}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${o}, actual ${s} (diff: ${n})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}i(Rr,"verifyFileCount");async function Tr(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let a of r.antiPatterns){let n=F.join(e,a.file);await L(n)?o.push(a.file):s.push(`${a.issue} (${a.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${o.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}i(Tr,"verifyAntiPatternFiles");async function Dt(r,e){let t=Date.now(),s=await Promise.all([jr(r,e),Ir(r,e),Er(r,e),Rr(r,e),Tr(r,e)]),o=s.filter(n=>!n.passed).length,a=s.filter(n=>n.passed).length;return{passed:o===0,checks:s,totalMs:Date.now()-t,failedCount:o,passedCount:a}}i(Dt,"semanticVerify");async function Fr(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(o){try{let a=await oe.readdir(o,{withFileTypes:!0});for(let n of a){let l=F.join(o,n.name),c=F.relative(r,l);if(!t.some(d=>d.test(c))){if(n.isDirectory())await s(l);else if(n.isFile()){let d=F.extname(n.name);d&&e.add(d)}}}}catch{}}return i(s,"scanDir"),await s(r),Array.from(e)}i(Fr,"getProjectExtensions");async function _r(r){let e=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function t(s){try{let o=await oe.readdir(s,{withFileTypes:!0});return(await Promise.all(o.map(async n=>{let l=F.join(s,n.name),c=F.relative(r,l);return e.some(d=>d.test(c))?0:n.isDirectory()?t(l):n.isFile()?1:0}))).reduce((n,l)=>n+l,0)}catch{return 0}}return i(t,"scanDir"),t(r)}i(_r,"countProjectFiles");te();var ce=class extends Ve{static{i(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};ie.parse(s),await this.update(e,o=>({...o,draft:s,lastUpdated:b()})),this.publishAnalysis(e,s)}publishAnalysis(e,t){Ue({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...t,id:e}})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),o=b(),a={...t.draft,status:"sealed",signature:s,sealedAt:o};return ie.parse(a),await this.write(e,{draft:null,sealed:a,previousSealed:t.sealed,lastUpdated:o}),this.publishAnalysis(e,a),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),this.publishAnalysis(e,t.previousSealed),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:xt(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),o=s.sealed??s.draft;return o?await Dt(o,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return it(JSON.stringify(t))}},Y=new ce;import us from"node:fs/promises";import Z from"node:path";Pr();Le();J();import le from"node:fs/promises";import At from"node:path";import{gunzipSync as Mr,gzipSync as $r}from"node:zlib";Le();q();var Or="code-graph.json.gz";function jt(r){return At.join(B.getGlobalProjectPath(r),Or)}i(jt,"artifactPath");async function Nr(r){if(!ae(r))return null;let e=at(r),t=(()=>{try{return j.query(r,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(c=>({src:c.src,dst:c.dst,edgeType:c.edge_type,confidence:c.confidence}))}catch{return[]}})(),s=nt(r)??{symbolCount:e.length,edgeCount:t.length,fileCount:new Set(e.map(c=>c.file)).size,builtAt:new Date().toISOString()},o={version:1,projectId:r,exportedAt:new Date().toISOString(),meta:s,symbols:e,edges:t},a=Buffer.from(JSON.stringify(o),"utf-8"),n=$r(a,{level:6}),l=jt(r);return await le.mkdir(At.dirname(l),{recursive:!0}),await le.writeFile(l,n),{path:l,bytes:n.length,symbols:e.length,edges:t.length}}i(Nr,"exportCodeGraphArtifact");async function Hr(r){let e=jt(r),t=await le.readFile(e).catch(()=>null);if(!t)return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"};let s=(()=>{try{let a=Mr(t).toString("utf-8");return{payload:JSON.parse(a)}}catch(a){return{error:`corrupt artifact: ${a instanceof Error?a.message:String(a)}`}}})();if("error"in s)return{imported:!1,symbols:0,edges:0,reason:s.error};let o=s.payload;return o.version!==1||!Array.isArray(o.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:o.projectId&&o.projectId!==r?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${o.projectId}, expected ${r})`}:(j.transaction(r,a=>{a.prepare("DELETE FROM code_symbols").run(),a.prepare("DELETE FROM code_symbol_edges").run();let n=a.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
13
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`),l=a.prepare(`INSERT OR IGNORE INTO code_symbol_edges (src, dst, edge_type, confidence)
14
+ VALUES (?, ?, ?, ?)`);for(let c of o.symbols)n.run(c.id,c.file,c.kind,c.name,c.qname,c.startLine,c.endLine,c.exported?1:0);for(let c of o.edges)l.run(c.src,c.dst,c.edgeType,c.confidence)}),j.setDoc(r,"symbol-graph",{...o.meta,builtAt:o.meta.builtAt??o.exportedAt}),{imported:!0,symbols:o.symbols.length,edges:o.edges.length})}i(Hr,"importCodeGraphArtifact");async function It(r){if(ae(r))return{bootstrapped:!1,detail:"local index already present"};let e=await Hr(r);return e.imported?{bootstrapped:!0,detail:`imported ${e.symbols} symbols / ${e.edges} edges from per-project cache`}:{bootstrapped:!1,detail:e.reason??"import failed"}}i(It,"bootstrapCodeGraphFromArtifact");function Et(r){return r?.cloud?.enabled===!0&&r.cloud.paused!==!0}i(Et,"shouldAutoUploadCodeGraph");async function Rt(r,e){try{await Nr(r)}catch{}if(e.uploadToCloud)try{await Lr(r,e.uploadDependencies)}catch{}}i(Rt,"maybeExportAfterIndex");async function Lr(r,e={}){let t=await import("./code-graph-cloud-65GCWNII.mjs"),s=(e.buildSnapshot??t.buildCloudCodeGraphSnapshot)(r);if(!t.isUploadableGraph(s))return{uploaded:!1,reason:"no symbol index or empty graph"};try{let a=await(e.upload??(async(n,l)=>{let{default:c}=await import("./sync-client-DJWOG2ZQ.mjs");return c.uploadCodeGraph(n,l)}))(r,s);return a.ok?{uploaded:!0,nodes:a.nodes??s.nodes.length,links:a.links??s.links.length}:{uploaded:!1,reason:a.reason??"upload failed or unauthenticated",nodes:s.nodes.length,links:s.links.length}}catch(o){return{uploaded:!1,reason:o instanceof Error?o.message:String(o)}}}i(Lr,"maybeUploadCodeGraphToCloud");import $ from"node:fs/promises";import Gr from"node:os";import x from"node:path";var de=[{name:"prjct",description:ft,allowedTools:[...gt],body:i(()=>yt(),"body"),reference:i(()=>St(),"reference"),referenceFile:ht}];function Ur(r){let e=r.userInvocable!==!1;return`---
15
+ description: "${r.description}"
16
+ allowed-tools: [${r.allowedTools.map(t=>`"${t}"`).join(", ")}]
17
+ user-invocable: ${e}
18
+ ---`}i(Ur,"buildFrontmatter");function Wr(r){return`${Ur(r)}
19
+
20
+ ${r.body()}`}i(Wr,"buildSkillContent");function Tt(){return process.env.HOME||Gr.homedir()}i(Tt,"homeDir");function Vr(){return x.join(Tt(),".claude","skills")}i(Vr,"claudeSkillsRoot");function zr(){let r=Tt();return[x.join(r,".codex","skills"),x.join(r,".gemini","skills"),x.join(r,".gemini","antigravity","global_skills")]}i(zr,"compactSkillRoots");function Jr(r){return!!(/^# [^\n]+\n[^\n]*\|\s*\d+\s+files\s*\|/m.test(r)||/## Recent Deliveries/m.test(r)||/## Velocity/m.test(r)&&/pts\/sprint/m.test(r))}i(Jr,"skillBodyHasProjectStamp");var ue=class{static{i(this,"SkillGenerator")}async generateAndInstall(){let e={generated:[],skipped:[]},t=Vr();for(let a of de)try{let n=Wr(a);if(Jr(n))throw new Error("refusing to install project-stamped skill body (isolation guard)");let l=x.join(t,a.name),c=x.join(l,"SKILL.md");await $.mkdir(l,{recursive:!0}),await $.writeFile(c,n,"utf-8"),a.reference&&a.referenceFile&&await $.writeFile(x.join(l,a.referenceFile),a.reference(),"utf-8"),e.generated.push({name:a.name,path:c})}catch(n){f.debug(`Failed to generate skill ${a.name}`,{error:w(n)}),e.skipped.push({name:a.name,reason:w(n)})}let s=Ge();for(let a of zr())try{let n=x.join(a,"prjct"),l=x.join(n,"SKILL.md");await $.mkdir(n,{recursive:!0}),await $.writeFile(l,s,"utf-8"),e.generated.push({name:"prjct-compact",path:l})}catch(n){f.debug("Compact skill install skipped",{root:a,error:w(n)})}let o=new Set(de.map(a=>a.name));try{let a=await $.readdir(t,{withFileTypes:!0}).catch(()=>[]);for(let n of a)n.isDirectory()&&n.name.startsWith("prjct-")&&!o.has(n.name)&&await $.rm(x.join(t,n.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return e.generated.length>0&&f.info("Generated portable multi-host skills",{count:e.generated.length,skills:e.generated.map(a=>a.name)}),e}getDefinitions(){return de}},Ft=new ue;function me(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}i(me,"emptyGitData");function pe(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}i(pe,"emptyStats");function fe(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}i(fe,"emptyCommands");function ge(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}i(ge,"emptyStack");function _t(r,e){let t=[...r.added,...r.modified],s=new Set(t),o=new Set,a=K(e);if(a)for(let c of t){let d=a.reverse[c];if(d)for(let u of d)s.has(u)||o.add(u)}let n=Array.from(o),l=[...t,...n];return{directlyChanged:t,affectedByImports:n,deleted:r.deleted,allAffected:l}}i(_t,"propagateChanges");function Mt(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}i(Mt,"affectedDomains");q();J();import $t from"node:fs/promises";import Br from"node:path";function qr(r){return typeof Bun<"u"&&Bun.hash?`xxh64:${Bun.hash(r).toString(36)}`:`fnv1a:${([...r].reduce((t,s)=>Math.imul(t^s.charCodeAt(0),16777619),2166136261)>>>0).toString(36)}`}i(qr,"hashContent");async function Kr(r,e={}){let t=await _e(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),s=new Map,o=e.changedFilesHint?.length?new Set(e.changedFilesHint):null,a=await Me(t,100,async n=>{try{let l=Br.join(r,n),c=await $t.stat(l),d=c.mtime.toISOString(),u=e.storedHashes?.get(n),y=o?.has(n)??!1;if(u&&!y&&u.size===c.size&&u.mtime===d&&u.hash)return{path:n,hash:u.hash,size:c.size,mtime:d};let h=await $t.readFile(l,"utf-8");return{path:n,hash:qr(h),size:c.size,mtime:d}}catch{return null}});for(let n of a)s.set(n.path,n);return s}i(Kr,"computeHashes");function Yr(r,e){let t=[],s=[],o=[];for(let[n,l]of r){let c=e.get(n);c?c.hash!==l.hash?s.push(n):o.push(n):t.push(n)}let a=[];for(let n of e.keys())r.has(n)||a.push(n);return{added:t,modified:s,deleted:a,unchanged:o}}i(Yr,"diffHashes");function he(r,e){let t=j.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,o]of e)s.run(o.path,o.hash,o.size,o.mtime)})(),j.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}i(he,"saveHashes");function Qr(r){let e=new Map;try{let t=j.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}i(Qr,"loadHashes");async function ye(r,e,t){let s=Qr(e),o=await Kr(r,{storedHashes:s,changedFilesHint:t});return{diff:Yr(o,s),currentHashes:o}}i(ye,"detectChanges");function Ot(r){return j.hasDoc(r,"file-hashes-meta")}i(Ot,"hasHashRegistry");N();var Xr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);async function Nt(r){let{projectId:e,projectPath:t,isFullSync:s,changedFilesHint:o}=r,a={shouldRebuildIndexes:!0,changedDomains:new Set,incrementalInfo:void 0,changedSourceFiles:[],deletedSourceFiles:[]};if(!s&&Ot(e)){try{let{diff:n,currentHashes:l}=await ye(t,e,o),c=n.added.length+n.modified.length+n.deleted.length,d=(()=>{if(c===0&&!o?.length)return{shouldRebuildIndexes:!1,changedDomains:new Set,incrementalInfo:{isIncremental:!0,filesChanged:0,filesUnchanged:n.unchanged.length,indexesRebuilt:!1,affectedDomains:[]},changedSourceFiles:[],deletedSourceFiles:[]};let u=_t(n,e),y=Mt(u.allAffected),h=u.allAffected.some(Se);return{shouldRebuildIndexes:h,changedDomains:y,incrementalInfo:{isIncremental:!0,filesChanged:c,filesUnchanged:n.unchanged.length,indexesRebuilt:h,affectedDomains:Array.from(y)},changedSourceFiles:[...n.added,...n.modified].filter(Se),deletedSourceFiles:n.deleted.filter(Se)}})();return he(e,l),d}catch(n){f.debug("Incremental detection failed, falling back to full sync",{error:k(n)})}return a}try{let{currentHashes:n}=await ye(t,e,o);he(e,n)}catch(n){f.debug("Hash computation failed (non-critical)",{error:k(n)})}return a}i(Nt,"detectIncrementalChanges");function Se(r){let e=r.substring(r.lastIndexOf("."));return Xr.has(e)}i(Se,"isSourceFile");import{z as D}from"zod";var yn=D.object({date:D.string(),tokensSaved:D.number(),syncs:D.number(),avgCompressionRate:D.number(),totalDuration:D.number()}),Sn=D.object({agentName:D.string(),usageCount:D.number(),tokensSaved:D.number()}),Ht={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};function Lt(r,e="default"){let t=Ht[e]||Ht.default;return r/1e3*t}i(Lt,"estimateCostSaved");function wn(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}i(wn,"formatCost");q();var Zr=i(r=>({date:r.date,tokensSaved:r.tokens_saved,syncs:r.syncs,avgCompressionRate:r.avg_compression_rate,totalDuration:r.total_duration}),"rowToDaily"),Q=i(r=>{let e=new Date;return e.setDate(e.getDate()-r),e.toISOString().split("T")[0]},"dayCutoff"),we=class{static{i(this,"MetricsStorage")}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),o=t.originalSize>0?s/t.originalSize:0,a=new Date().toISOString().split("T")[0];if(P.run(e,`INSERT INTO metrics_daily (date, tokens_saved, syncs, avg_compression_rate, total_duration)
21
+ VALUES (?, ?, 1, ?, ?)
22
+ ON CONFLICT(date) DO UPDATE SET
23
+ tokens_saved = metrics_daily.tokens_saved + excluded.tokens_saved,
24
+ avg_compression_rate =
25
+ (metrics_daily.avg_compression_rate * metrics_daily.syncs + excluded.avg_compression_rate)
26
+ / (metrics_daily.syncs + 1),
27
+ syncs = metrics_daily.syncs + 1,
28
+ total_duration = metrics_daily.total_duration + excluded.total_duration`,a,s,o,t.duration),t.agents?.length){let n=Math.floor(s/t.agents.length);for(let l of t.agents)P.run(e,`INSERT INTO metrics_agent_usage (agent_name, usage_count, tokens_saved)
29
+ VALUES (?, 1, ?)
30
+ ON CONFLICT(agent_name) DO UPDATE SET
31
+ usage_count = metrics_agent_usage.usage_count + 1,
32
+ tokens_saved = metrics_agent_usage.tokens_saved + excluded.tokens_saved`,l,n)}}async getSummary(e){let t=P.get(e,`SELECT COALESCE(SUM(tokens_saved), 0) AS tokens,
33
+ COALESCE(SUM(syncs), 0) AS syncs,
34
+ COALESCE(SUM(total_duration), 0) AS duration,
35
+ COALESCE(SUM(avg_compression_rate * syncs), 0) AS weighted_rate
36
+ FROM metrics_daily`),s=t?.syncs??0,o=t?.tokens??0,a=i((u,y)=>P.get(e,y?"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 >= ?",...y?[u,y]:[u])?.t??0,"rangeTokens"),n=a(Q(30)),l=a(Q(60),Q(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:o,estimatedCostSaved:Lt(o),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",Q(t)).map(Zr)}async getFirstSyncDate(e){return P.get(e,"SELECT MIN(date) AS d FROM metrics_daily")?.d??""}},Gt=new we;N();te();import es from"node:path";function ts(r){return ct(es.resolve(r))}i(ts,"repoHash");function U(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}i(U,"normalizeKey");function rs(r){return se(r,e=>`${U(e.name)}::${U(e.source)}`)}i(rs,"dedupePatterns");function ss(r){return se(r,e=>`${U(e.issue)}::${U(e.file)}::${U(e.source)}`)}i(ss,"dedupeAntiPatterns");var ke=class{static{i(this,"PatternExtractor")}async extract(e){let t=ts(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 o=(e.feedback?.patternsDiscovered||[]).map(c=>({name:c,description:`Confirmed during completed tasks: ${c}`,source:"feedback",confidence:.75})),a=(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=rs([...s,...o]),l=ss([...a]);return{patterns:n,antiPatterns:l,repoPathHash:t}}},ns=new ke,Ut=ns;var Wt=200;async function Vt(r,e,t){let{bm25Index:s,originalSize:o}=(()=>{try{let d=Ye(r),u=d?Object.values(d.documents).reduce((y,h)=>y+h.length,0):0;return{bm25Index:d,originalSize:u||e.fileCount*Wt}}catch(d){return f.debug("Could not load BM25 index for metrics",{error:k(d)}),{bm25Index:null,originalSize:e.fileCount*Wt}}})(),a=0,n=o>0?Math.max(0,(o-a)/o):0;try{await Gt.recordSync(r,{originalSize:o,filteredSize:a,duration:t,isWatch:!1})}catch(d){f.debug("Failed to record sync metrics",{error:k(d)})}try{let{velocityStorage:d}=await import("./velocity-storage-UPW6TLK6.mjs");await d.recompute(r)}catch(d){f.debug("Failed to recompute velocity",{error:k(d)})}let l=await import("./developer-evolution-R5BXQH6G.mjs").then(({captureDeveloperSnapshot:d})=>d(r)).catch(d=>(f.debug("Failed to capture dev snapshot",{error:k(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=K(r);u&&(c.importEdges=u.edgeCount,c.importFiles=u.fileCount);let y=ut(r);y&&(c.cochangeCommits=y.commitsAnalyzed,c.cochangeFiles=y.filesAnalyzed)}catch(d){f.debug("Could not load index stats",{error:k(d)})}return{duration:t,originalSize:o,filteredSize:a,compressionRate:n,indexes:c,developerSnapshotCaptured:l}}i(Vt,"recordSyncMetrics");async function zt(r,e,t,s,o,a){try{let n=t.recentCommits[0]?.hash||null,l=await T.getAggregatedFeedback(r).catch(()=>{});try{let{refreshSkillIndex:d}=await import("./skill-index-OOVAXHYJ.mjs");await d(r,e)}catch{}let c=await Ut.extract({projectId:r,projectPath:e,languages:s.languages,frameworks:Array.from(new Set([...s.frameworks,...o.frameworks])),feedback:l,context7Verified:a});await Y.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:k(n)})}}i(zt,"saveDraftAnalysis");async function Jt(r){try{let[e,t,s,o,a]=await Promise.all([ze.archiveOldShipped(r).catch(()=>0),Je.markDormantIdeas(r).catch(()=>0),Be.removeStaleCompleted(r).catch(()=>0),T.archiveStalePausedTasks(r).catch(()=>[]),Ke.capEntries(r).catch(()=>0)]),n=e+t+s+o.length+a;if(n>0){f.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:o.length,memoryCapped:a,total:n});let l=We.getStats(r);f.debug("Archive stats",l)}}catch(e){f.debug("Archival failed (non-critical)",{error:k(e)})}}i(Jt,"archiveStaleData");var os=6e4,ve=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 is(){return Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||os}i(is,"syncPhaseTimeoutMs");function Bt(r,e){let t=is(),s=(()=>{let o=Promise.withResolvers(),a=setTimeout(()=>o.reject(new ve(e,t)),t);return{promise:o.promise,cancel:i(()=>clearTimeout(a),"cancel")}})();return Promise.race([r,s.promise]).finally(s.cancel)}i(Bt,"withPhaseTimeout");async function qt(r,e,t){let s=Date.now();f.debug("sync phase start",{phase:r});try{let o=await e(),a=Date.now()-s;return f.debug("sync phase done",{phase:r,ms:a}),t?.push({phase:r,ms:a}),o}catch(o){let a=Date.now()-s;throw f.debug("sync phase failed",{phase:r,ms:a,error:w(o)}),t?.push({phase:r,ms:a}),o}}i(qt,"runSyncPhase");function Kt(r,e={}){let t=e.now??Date.now,s=t(),a=(()=>{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 a}}}i(Kt,"startPostIndexWork");q();import cs from"node:fs/promises";import ls from"node:path";N();te();N();J();import be from"node:fs/promises";import X from"node:path";var Pe=".prjct/.prjct-state.md",Ce=class{static{i(this,"LocalStateGenerator")}async generate(e,t){let s=X.join(e,Pe);await be.mkdir(X.dirname(s),{recursive:!0});let o=this.toMarkdown(t);await be.writeFile(s,o,"utf-8")}async remove(e){try{await be.unlink(X.join(e,Pe))}catch(t){if(!_(t))throw t}}async exists(e){let t=X.join(e,Pe);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 o=s.subtasks.filter(l=>l.status==="completed").length,a=s.subtasks.length,n=Math.round(o/a*100);t.push(`**Progress**: ${o}/${a} (${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 Ce;var ds=["storage","context","memory","analysis","config","sync"];async function Qt(r){try{await Promise.all(ds.map(e=>cs.mkdir(ls.join(r,e),{recursive:!0})))}catch(e){throw new Error(Fe(e,r,"project directories"))}}i(Qt,"ensureProjectDirectories");async function Xt(r){let{projectId:e,projectPath:t,cliVersion:s,git:o,stats:a}=r,n=P.getDoc(e,"project")||{},l={...n,projectId:e,repoPath:t,name:a.name,version:a.version,cliVersion:s,techStack:a.frameworks,fileCount:a.fileCount,commitCount:o.commits,stack:a.ecosystem,currentBranch:o.branch,hasUncommittedChanges:o.hasChanges,createdAt:n.createdAt||b(),lastSync:b(),lastSyncCommit:o.recentCommits[0]?.hash||null,lastSyncBranch:o.branch};P.setDoc(e,"project",l)}i(Xt,"updateProjectDoc");async function Zt(r){let{projectId:e,projectPath:t,stats:s,stack:o}=r,n={...await T.read(e)};n.projectId=e,n.stack={language:s.languages[0]||"Unknown",framework:s.frameworks[0]||null},n.domains={hasFrontend:o.hasFrontend,hasBackend:o.hasBackend,hasDatabase:o.hasDatabase,hasTesting:o.hasTesting,hasDocker:o.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 T.write(e,n);try{await Yt.remove(t)}catch(l){f.debug("Legacy local state cleanup failed (optional)",{error:k(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 xe from"node:path";N();vr();var rr={async jsonFilesValid(r){let e=Date.now(),t=[],s=xe.basename(r);try{await T.read(s)}catch(o){_(o)||t.push(`state: ${k(o)}`)}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=xe.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],o=[];try{let a=await tr.readdir(t);for(let n of a){if(!n.endsWith(".md"))continue;let l=await tr.readFile(xe.join(t,n),"utf-8");for(let c of s)if(c.test(l)){o.push(`${n}: potential sensitive data detected`);break}}}catch(a){if(!_(a))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(a)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:o.length===0,output:o.length===0?"No sensitive patterns found":void 0,error:o.length>0?o.join("; "):void 0,durationMs:Date.now()-e}}},De=class{static{i(this,"SyncVerifier")}async verify(e,t,s){let o=Date.now(),a=[],n=s?.failFast??!1,l=[],c=[rr.jsonFilesValid(t),rr.noSensitiveData(t)];for(let h of c){let v=await h;if(a.push(v),!v.passed&&n){l.push(...s?.checks?.filter(I=>I.enabled!==!1).map(I=>I.name)??[]);break}}if((!n||a.every(h=>h.passed))&&s?.checks)for(let h of s.checks){if(h.enabled===!1){l.push(h.name);continue}let v=await this.runCustomCheck(h,e);if(a.push(v),!v.passed&&n){let I=s.checks.slice(s.checks.indexOf(h)+1);l.push(...I.filter(E=>E.enabled!==!1).map(E=>E.name));break}}let u=a.filter(h=>!h.passed).length,y=a.filter(h=>h.passed).length;return{passed:u===0,checks:a,totalMs:Date.now()-o,failedCount:u,passedCount:y,skippedCount:l.length}}async runCustomCheck(e,t){let s=Date.now(),o=e.command||(e.script?`sh ${e.script}`:null);if(!o)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:a,stderr:n}=await Te(o,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(a.trim()||n.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(a){let n=a;return{name:e.name,passed:!1,error:(n.stderr?.trim()||n.message).slice(0,200),durationMs:Date.now()-s}}}},sr=new De;var Ae=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(),o=[],a=i((c,d)=>qt(c,d,o),"phase"),n={installed:!1,verified:!1,configPath:"",message:""},l=[];try{if(this.projectId=await M.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:me(),stats:pe(),commands:fe(),stack:ge(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=B.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await us.rm(Z.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await He()).installed){let m=await pt({autoRepair:!0});m.verified||f.warn(`Codex p. router not ready: ${m.message||"verification failed"}`)}await a("mcp-defaults",()=>dt({silent:!0,verifyContext7:!1}));let u=(await Ne().catch(()=>null))?.name??"claude";try{Object.assign(n,await a("context7",()=>lt.ensureReady(u)))}catch(m){let g=w(m);f.warn(`Context7 MCP not ready (continuing sync): ${g}`),Object.assign(n,{verified:!1,message:g})}await Qt(this.globalPath),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await a("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:m}=await import("./legacy-crew-sweep-MFE4BDNR.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[h,v,I,E]=await a("gather",()=>Bt(Promise.all([wt(this.projectPath),kt(this.projectPath),vt(this.projectPath),bt(this.projectPath)]),"gather")),{shouldRebuildIndexes:or,changedDomains:fs,incrementalInfo:Ee,changedSourceFiles:W,deletedSourceFiles:V}=await a("incremental",()=>Nt({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 It(this.projectId)}catch{}or&&await a("index",async()=>{try{let m=Ee?.isIncremental&&(W.length>0||V.length>0);await Promise.all([m?Xe(this.projectPath,this.projectId,W,V):Qe(this.projectPath,this.projectId),m?tt(this.projectPath,this.projectId,W,V):et(this.projectPath,this.projectId),m?st(this.projectPath,this.projectId,W,V):rt(this.projectPath,this.projectId),mt(this.projectPath,this.projectId)]);let g=this.projectId,S=this.projectPath,H=await M.readConfig(S).catch(()=>null),R=Et(H);l.push(Kt(()=>Rt(g,{uploadToCloud:R}),{onComplete:i(({totalMs:C,error:z})=>{f.debug("sync post-index work settled",{projectId:g,uploadToCloud:R,totalMs:C,...z===void 0?{}:{error:w(z)}})},"onComplete")}))}catch(m){f.debug("File ranking index build failed (non-critical)",{error:w(m)})}});let ir=Date.now();f.debug("sync phase start",{phase:"skills"});let cr=await Ft.generateAndInstall().catch(m=>{f.debug("Native skill generation failed (non-critical)",{error:w(m)})});f.debug("sync phase done",{phase:"skills",ms:Date.now()-ir}),await a("update-files",()=>Promise.all([Xt({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:h,stats:v}),Zt({projectId:this.projectId,projectPath:this.projectPath,stats:v,stack:E}),Promise.resolve(er(this.projectId,h,v)),zt(this.projectId,this.projectPath,h,v,E,n.verified)]));let ee=await Y.getActive(this.projectId),lr={patterns:ee?.patterns?.length||0,antiPatterns:ee?.antiPatterns?.length||0,criticalAntiPatterns:ee?.antiPatterns?.filter(m=>m.severity==="high").length||0},dr=Date.now()-s,Re=await a("metrics",()=>Vt(this.projectId,v,dr)),ur=Re.developerSnapshotCaptured===!0,mr=await(async()=>{try{let{recomputeProjectStyle:m,formatProjectStyleForSync:g}=await import("./project-style-evolution-HS6HYI7W.mjs"),S=await a("project-style",()=>m({projectId:this.projectId,projectPath:this.projectPath,stats:v,stack:E,commands:I,commitHash:h.recentCommits[0]?.hash??null,source:"sync-mechanical"})),H=g(S),R=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 R=="number"?R:Number(R)||0,isFirst:S.isFirst,hasChanges:S.delta.hasChanges}}catch(m){f.debug("Project style recompute failed (non-critical)",{error:w(m)});return}})(),pr=await a("work-cost",()=>Pt(this.projectId));await a("archive",()=>Jt(this.projectId));let fr=await a("context-quality",()=>Ze(this.projectPath,this.projectId)),gr=await a("retention",async()=>{try{let m=await M.readConfig(this.projectPath).catch(()=>null),g=m?.retention?.mode??"apply";if(g==="off")return;let S=g==="dry-run",{applyRetention:H,triageInbox:R}=await import("./retention-22OSCAGV.mjs"),C=H(this.projectId,{dryRun:S,maxArchive:m?.retention?.maxArchive,maxDelete:m?.retention?.maxDelete}),{inboxMerged:z,inboxArchived:yr}=S?{inboxMerged:0,inboxArchived:0}:(()=>{let A=R(this.projectId);return{inboxMerged:A.merged,inboxArchived:A.archived}})(),{runVaultPurge:Sr,vaultHealth:wr}=await import("./purge-AXMYTZVM.mjs"),O=await Sr(this.projectId,{projectPath:this.projectPath,dryRun:S,softDeletedPurgeDays:m?.retention?.softDeletedPurgeDays,archivePruneDays:m?.retention?.archivePruneDays,autoSourceMaxLive:m?.retention?.autoSourceMaxLive}),kr=wr(this.projectId);return{evaluated:C.evaluated,active:C.active,archive:C.wouldArchive,delete:C.wouldDelete,archived:C.archived,deleted:C.deleted,inboxMerged:z,inboxArchived:yr,dryRun:S,samples:C.samples.map(A=>({id:A.id,type:A.type,verdict:A.verdict,score:A.score,reasons:A.reasons,excess:A.excess})),referenceSize:C.referenceSize,vault:{...kr,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 a("install-global",async()=>{await re.installGlobalConfig(),await re.syncCommands()}),await a("install-agent-surfaces",async()=>{let{detectInstalledAgents:m}=await import("./detection-MEYHME4X.mjs"),g=await m(this.projectPath).catch(()=>[]);await ot(this.projectPath,{refreshIfAdopted:!0,agents:g})});let hr=await a("verify",async()=>{try{let m=await M.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?Z.resolve(process.env.PRJCT_CLI_HOME):Z.join(m.homedir(),".prjct-cli");g(S)}catch{}return await Promise.all(l.map(m=>m.settle())),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:h,stats:v,commands:I,stack:E,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:lr,contextQuality:fr,retentionDryRun:gr,syncMetrics:Re,workCost:pr,verification:hr,incremental:Ee,projectStyle:mr,developerSnapshotCaptured:ur,generatedSkills:cr,phaseTimings:o}}catch(c){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:me(),stats:pe(),commands:fe(),stack:ge(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:w(c)}}}async getCliVersion(){try{let e=Z.join(__dirname,"..","..","package.json");return(await $e(e))?.version||"0.0.0"}catch(e){return f.debug("Failed to read CLI version",{error:w(e)}),"0.0.0"}}},Qa=new Ae;import je 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"},ms={task:"work"};function Ie(r){return ms[r]??r}i(Ie,"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 ro(r,e={}){if(e.quiet)return;let t=ar[r]||"idle",s=ne.getValidCommands(t);if(s.length===0)return;let o=s.map(a=>({cmd:`p. ${Ie(a)}`,desc:nr[a]||a}));console.log(je.dim(`
38
+ Next:`));for(let a of o){let n=je.cyan(a.cmd.padEnd(12));console.log(je.dim(` ${n} \u2192 ${a.desc}`))}}i(ro,"showNextSteps");function so(r,e=!1){let t=ar[r]||"idle";return ne.getValidCommands(t).map(o=>({cmd:e?`prjct ${Ie(o)} --md`:`p. ${Ie(o)}`,desc:nr[o]||o}))}i(so,"getNextSteps");async function ps(r,e={}){let t=await M.getProjectId(r);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):qe.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}i(ps,"requireProjectId");async function ho(r,e={}){let t=await Ct.ensureInit(r);return t.success?ps(r,e):{ok:!1,result:t}}i(ho,"requireProject");export{gs as a,hs as b,Y as c,wn as d,Gt as e,Qa as f,ro as g,so as h,ho as i};