prjct-cli 3.89.0 → 3.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/bin/hook-chunks/{agent-switch-FBQDHWAO.mjs → agent-switch-IQ5KSRKD.mjs} +1 -1
- package/dist/bin/hook-chunks/{analysis-NRRZYJ6G.mjs → analysis-LBYZSJKT.mjs} +2 -2
- package/dist/bin/hook-chunks/{auto-flush-D3X3U4CP.mjs → auto-flush-GW3FP763.mjs} +1 -1
- package/dist/bin/hook-chunks/{capture-gate-BFOABO2Y.mjs → capture-gate-BQCNMHUC.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-5T5PZKHW.mjs → chunk-3WKDMAS7.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-YGHIPTJN.mjs → chunk-6AFM6WRB.mjs} +2 -2
- package/dist/bin/hook-chunks/{chunk-JQLJM4BK.mjs → chunk-A5MUSARI.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-GHBGBP2M.mjs → chunk-AEYONUUY.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-H6KVNDQD.mjs → chunk-B7GMU46T.mjs} +3 -3
- package/dist/bin/hook-chunks/{chunk-HE5RSIHG.mjs → chunk-D4S3IRD3.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-SN224ILI.mjs → chunk-D6KT763C.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-3HDIQJ55.mjs → chunk-DGQYQSUK.mjs} +2 -2
- package/dist/bin/hook-chunks/{chunk-SNISJ7HR.mjs → chunk-EHBEHLYN.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-F652GI4F.mjs → chunk-FEH4IPIC.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-YORSHLFH.mjs → chunk-HBLR7BVG.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-VAXQ5IDD.mjs → chunk-IKUGYUAI.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-PTVXWPQH.mjs → chunk-LGJUQEAU.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-NN65WGGN.mjs → chunk-LJLUP4FF.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-GJFWVCTS.mjs → chunk-LPB3HUJ2.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-OVR6RUUZ.mjs → chunk-M3ZOJVPA.mjs} +2 -2
- package/dist/bin/hook-chunks/{chunk-GSMDQ7VM.mjs → chunk-OIEZAHLC.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-GVJZPOG2.mjs → chunk-PSP56GGF.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-R77TXXPP.mjs → chunk-PXJKXBTM.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-MECJJJ7R.mjs → chunk-QZSJSXJV.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-A4OFZ2SK.mjs → chunk-RAHFKGM6.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-2H57GV2T.mjs → chunk-RJ2BRRMH.mjs} +2 -2
- package/dist/bin/hook-chunks/{chunk-DAOC3T5G.mjs → chunk-RRWPDRYR.mjs} +2 -2
- package/dist/bin/hook-chunks/{chunk-XGYCAVB2.mjs → chunk-TFGJVT6F.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-RNCLLUMK.mjs → chunk-UHW35BPE.mjs} +4 -4
- package/dist/bin/hook-chunks/{chunk-OFVLGJ76.mjs → chunk-UQVJQME2.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-HZXDF2TQ.mjs → chunk-W5OWBOLH.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-UDUUEZD3.mjs → chunk-XEFIIDHM.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-CULYIJJZ.mjs → chunk-YG7KBQYJ.mjs} +1 -1
- package/dist/bin/hook-chunks/{chunk-P43HDWI5.mjs → chunk-YKMJI6TF.mjs} +2 -2
- package/dist/bin/hook-chunks/{codex-skill-MNY46575.mjs → codex-skill-7IURPY6B.mjs} +1 -1
- package/dist/bin/hook-chunks/{command-installer-ZOQQLRCI.mjs → command-installer-BVHQUSL4.mjs} +1 -1
- package/dist/bin/hook-chunks/{config-manager-KJCMN7PV.mjs → config-manager-KYC7WUOS.mjs} +1 -1
- package/dist/bin/hook-chunks/{cwd-changed-KXOCN55N.mjs → cwd-changed-56X7BNS6.mjs} +1 -1
- package/dist/bin/hook-chunks/{distill-R477XZE3.mjs → distill-6C6YIFOE.mjs} +1 -1
- package/dist/bin/hook-chunks/{enriched-recall-65X44HBM.mjs → enriched-recall-6ZZNKAJZ.mjs} +1 -1
- package/dist/bin/hook-chunks/{format-UF2TLTKX.mjs → format-YOYMJSLY.mjs} +1 -1
- package/dist/bin/hook-chunks/{judgment-receipt-NXL5Q4CE.mjs → judgment-receipt-2U7D6HS4.mjs} +1 -1
- package/dist/bin/hook-chunks/{land-cue-SRIIDHMN.mjs → land-cue-SS23JBAX.mjs} +1 -1
- package/dist/bin/hook-chunks/{land-synthesis-ANVOY7AM.mjs → land-synthesis-OATL5BNP.mjs} +1 -1
- package/dist/bin/hook-chunks/{legacy-crew-sweep-PSJCO5UP.mjs → legacy-crew-sweep-NH5EWEXF.mjs} +2 -2
- package/dist/bin/hook-chunks/{memory-index-7LM2BMWZ.mjs → memory-index-677MUBCZ.mjs} +1 -1
- package/dist/bin/hook-chunks/{notification-2TZO3WRM.mjs → notification-S2IJJ6JW.mjs} +1 -1
- package/dist/bin/hook-chunks/{pack-integrity-6VKUAISJ.mjs → pack-integrity-L3BL7CGO.mjs} +1 -1
- package/dist/bin/hook-chunks/{pack-manager-KQBNP6XR.mjs → pack-manager-SU53HCKK.mjs} +1 -1
- package/dist/bin/hook-chunks/{planning-ZQNNDOEL.mjs → planning-ZYFCFU7N.mjs} +2 -2
- package/dist/bin/hook-chunks/{post-edit-AEFFZFPO.mjs → post-edit-JD7YFEBZ.mjs} +1 -1
- package/dist/bin/hook-chunks/{pre-bash-3FACZOB5.mjs → pre-bash-VIABNO5E.mjs} +1 -1
- package/dist/bin/hook-chunks/{pre-commit-MDFDQ5QZ.mjs → pre-commit-NVQVXHZQ.mjs} +1 -1
- package/dist/bin/hook-chunks/{pre-edit-ORX656T5.mjs → pre-edit-V4RD45C4.mjs} +1 -1
- package/dist/bin/hook-chunks/{pre-package-ITHMLNGN.mjs → pre-package-KFJZXI5T.mjs} +1 -1
- package/dist/bin/hook-chunks/{pre-search-UFS2Z5VJ.mjs → pre-search-7KRU5D2O.mjs} +1 -1
- package/dist/bin/hook-chunks/{prjct-md-IKUVPUGT.mjs → prjct-md-FMCPUMQT.mjs} +1 -1
- package/dist/bin/hook-chunks/{project-agent-surfaces-VCOI4GHT.mjs → project-agent-surfaces-TD7BHI25.mjs} +1 -1
- package/dist/bin/hook-chunks/{project-memory-KRA3BH7A.mjs → project-memory-ZVZSLPB5.mjs} +1 -1
- package/dist/bin/hook-chunks/{project-style-evolution-363CLE32.mjs → project-style-evolution-7JS75AUP.mjs} +1 -1
- package/dist/bin/hook-chunks/{prompt-6L7B546V.mjs → prompt-S4MMIXH5.mjs} +2 -2
- package/dist/bin/hook-chunks/{purge-IPK4NJN6.mjs → purge-BDREPWEE.mjs} +1 -1
- package/dist/bin/hook-chunks/{retention-S2GGTVY2.mjs → retention-D2MVQLOF.mjs} +1 -1
- package/dist/bin/hook-chunks/{sdd-JIPV7QJP.mjs → sdd-ZO4DP23G.mjs} +1 -1
- package/dist/bin/hook-chunks/{session-continuity-DABISZYM.mjs → session-continuity-FNNUMOXB.mjs} +1 -1
- package/dist/bin/hook-chunks/{session-start-GJPAQ3GL.mjs → session-start-HA7IRBFX.mjs} +1 -1
- package/dist/bin/hook-chunks/{setup-TG5O5TKD.mjs → setup-7L3NXNRH.mjs} +2 -2
- package/dist/bin/hook-chunks/{shipping-VCLQS7GP.mjs → shipping-GX4HFYJ3.mjs} +4 -4
- package/dist/bin/hook-chunks/{spec-context-inference-MOOQL2VC.mjs → spec-context-inference-KER2R3F3.mjs} +1 -1
- package/dist/bin/hook-chunks/{spec-service-33UDKWXT.mjs → spec-service-G3RLCJ2G.mjs} +2 -2
- package/dist/bin/hook-chunks/{spec-task-breakdown-FES465AB.mjs → spec-task-breakdown-YPJ76OWR.mjs} +1 -1
- package/dist/bin/hook-chunks/{stop-IWI5SQG6.mjs → stop-HPZCLDPM.mjs} +2 -2
- package/dist/bin/hook-chunks/{subagent-start-NJZOWV2P.mjs → subagent-start-7KZUTKV5.mjs} +1 -1
- package/dist/bin/hook-chunks/{subagent-stop-R6HIIVWQ.mjs → subagent-stop-7C72RWGO.mjs} +1 -1
- package/dist/bin/hook-chunks/{surface-attribution-JYE6VDZR.mjs → surface-attribution-PDYR6DVA.mjs} +1 -1
- package/dist/bin/hook-chunks/{task-service-NSS5SVJE.mjs → task-service-RRFG5P7N.mjs} +1 -1
- package/dist/bin/hook-chunks/{tdd-AKXWUK2Y.mjs → tdd-XQUU4C23.mjs} +1 -1
- package/dist/bin/hook-chunks/{template-loader-KLKEG7XM.mjs → template-loader-4QMIMOBY.mjs} +1 -1
- package/dist/bin/hook-chunks/{weak-model-mode-JQ23PTXN.mjs → weak-model-mode-M6D23IIM.mjs} +1 -1
- package/dist/bin/hook-chunks/{work-scope-C7BJX6QE.mjs → work-scope-6FG6PSAV.mjs} +1 -1
- package/dist/bin/hook-fast-darwin-arm64 +0 -0
- package/dist/bin/hook-fast-darwin-x64 +0 -0
- package/dist/bin/prjct-core.mjs +2 -2
- package/dist/bin/prjct-hooks.mjs +1 -1
- package/dist/daemon/entry.mjs +1 -1
- package/dist/mcp/server.mjs +1 -1
- package/package.json +1 -1
|
@@ -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{b as x}from"./chunk-SJ75V4WG.mjs";import{d as M}from"./chunk-
|
|
8
|
+
import{b as x}from"./chunk-SJ75V4WG.mjs";import{d as M}from"./chunk-A5MUSARI.mjs";import{a as f}from"./chunk-RRWPDRYR.mjs";import{b as C}from"./chunk-AOPJ4Z6O.mjs";import{a as o}from"./chunk-E66B27AL.mjs";var q=new Set(["pattern-detector-auto","pattern-detector-recurring","skill-miss-detector","friction-detector"]);function E(t){if(t.type==="improvement-signal")return!0;let e=t.tags?.source;return e!==void 0&&q.has(e)}o(E,"isSignalEntry");var R=85,S=2;async function K(t,e,n={}){let a=n.threshold??R,d=n.maxIterations??S,i=await import("./retention-D2MVQLOF.mjs").then(({evaluateRetention:s})=>s(e,Date.now()).byId).catch(()=>null),h=o(async(s,c,g,m)=>{if(s>=d||c.score>=a)return{...c,irrelevantRemoved:g,repairEntriesCreated:m};let r=f.allEntriesForIndex(e),p=r.filter(l=>{if(!w(l))return!1;let b=i?.get(l.id);return!(b&&b.verdict==="active"&&b.score>=70)}),u=I(r)?0:1;u>0&&await f.remember(t,{type:"context",content:_(r,c),tags:{context_schema:"living-v2",synthesis:"model-authored",feature:"context-quality-cleanup",key_data:`quality_score=${c.score}; threshold=${a}; irrelevant=${p.length}`,model:"prjct sync context-quality analyzer",token_usage:"0 deterministic sync tokens",source:"sync-context-quality"},provenance:"inferred",projectId:e});let y=[];for(let l of p)f.forget(e,l.id)&&(y.push(l.id),await C({projectId:e,entityType:"memories",entityId:l.id,eventType:"delete",data:{id:l.id,type:l.type,content:l.content,tags:l.tags,reason:"context-quality-cleanup"}}));let $={...k(e,a),iterations:s+1,irrelevantRemoved:g+y.length,repairEntriesCreated:m+u};return p.length===0&&u===0?$:h(s+1,$,g+y.length,m+u)},"repairIteration");return h(0,k(e,a),0,0)}o(K,"repairContextQuality");function k(t,e=R){let n=f.allEntriesForIndex(t),a=n.filter(r=>r.type==="context"),d=a.filter(v),i=a.filter(r=>!v(r)),h=n.filter(w),s=[],c=[];n.length>0&&d.length===0&&(c.push(35),s.push("missing living-v2 context synthesis")),h.length>0&&(c.push(Math.min(40,h.length*8)),s.push(`${h.length} irrelevant generated entries in active context`)),i.length>0&&(c.push(Math.min(20,i.length*5)),s.push(`${i.length} legacy context entries need cleanup`));let g=d[0];if(g){let r=x(g.content),u=[r.contextSynthesis,r.keyData,r.model,r.tokenUsage,r.nextImplication].filter(y=>!y).length;u>0&&(c.push(u*4),s.push("latest living context is missing structured UI/LLM fields"))}let m=Math.max(0,Math.min(100,100-c.reduce((r,p)=>r+p,0)));return{score:m,threshold:e,passed:m>=e,iterations:0,livingContextCount:d.length,legacyContextCount:i.length,irrelevantRemoved:0,repairEntriesCreated:0,issues:s}}o(k,"evaluateContextQuality");function w(t){return E(t)?!0:t.tags?.source==="sync-context-quality"||t.type!=="context"||v(t)?!1:L(t)}o(w,"isIrrelevantGeneratedContext");function v(t){if(t.tags?.context_schema==="living-v2")return!0;let e=x(t.content);return!!(e.contextSynthesis&&e.keyData)}o(v,"isLivingV2Context");function I(t){return t.some(e=>e.type==="context"&&v(e))}o(I,"hasUsableLivingContext");function L(t){let e=t.content.trim();if(e.length<260||/User pushback:|raw quote|transcript|hot file|skill-miss/i.test(e))return!0;let n=x(e);return[n.whatHappened,n.whyItMattered,n.pattern,n.antiPattern,n.outcome,n.nextImplication].filter(Boolean).length<3}o(L,"isLowValueLegacyContext");function _(t,e){let n=t.filter(i=>!w(i)).filter(i=>["decision","gotcha","learning","context","shipped"].includes(i.type)).slice(0,8),a=n.length>0?n.map(i=>`${i.type}:${M(i)}`).join("; "):"No high-quality prior context survived cleanup.";return["Context synthesis: Sync repaired historical low-quality project context by removing generated telemetry and preserving the useful project knowledge as a living-v2 synthesis. Future agents should trust this synthesized layer over old raw detector rows or legacy context snippets.",`Key data: ${[`quality_score=${e.score}`,`threshold=${e.threshold}`,`legacy_context=${e.legacyContextCount}`,`issues=${e.issues.join("|")||"none"}`].join("; ")}`,"What happened: prjct sync detected that active context quality was below the required threshold and generated a replacement synthesis before deleting irrelevant generated entries.","Why it mattered: Existing users had accumulated low-signal context over time; leaving it active makes the second brain noisy for both the UI and LLM retrieval.","Who/author: prjct sync","Model: prjct sync context-quality analyzer","Token usage: 0 deterministic sync tokens","Sentiment: cleanup required because raw generated context had become product debt","Related files: generated from existing project memory during sync","Feature/domain: context-quality-cleanup","Pattern: Keep structured key data for UI representation and synthesized context for humans/LLMs.","Anti-pattern: Surfacing raw detector rows, hot-file counters, or short legacy snippets as durable project knowledge.","Decision/trap: Generated garbage is hard-deleted from active recall/vault/search; user-authored decisions, gotchas, learnings, and facts are preserved.",`Outcome: Repair synthesis created from surviving highlights: ${a}`,"Next implication: If quality remains below threshold, run full sync/analysis and inspect remaining user-authored entries manually instead of deleting them blindly."].join(" \xB7 ")}o(_,"buildRepairContext");export{K as a,w as b};
|
|
@@ -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 r,g as o}from"./chunk-
|
|
8
|
+
import{c as r,g as o}from"./chunk-YKMJI6TF.mjs";import{a as i}from"./chunk-E66B27AL.mjs";var s=8;function g(t,e,n=s){return o(r(t,e,n).files)}i(g,"rankLikelyFiles");function u(t,e){let n=r(t,e,s);return n.files.length===0?null:n.agentBlock||null}i(u,"buildIndexedFileCue");export{g as a,u 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 j,b as f,d as x,e as D}from"./chunk-7OZDWT6C.mjs";import{b as A}from"./chunk-YJMWY4Y6.mjs";import{e as C,f as M,g as w,h as E,m as R}from"./chunk-NJAMZSHM.mjs";import{a as b}from"./chunk-
|
|
8
|
+
import{a as j,b as f,d as x,e as D}from"./chunk-7OZDWT6C.mjs";import{b as A}from"./chunk-YJMWY4Y6.mjs";import{e as C,f as M,g as w,h as E,m as R}from"./chunk-NJAMZSHM.mjs";import{a as b}from"./chunk-RRWPDRYR.mjs";import{a as S,b as J,d as m,g as K}from"./chunk-HDHVBB6Q.mjs";import{a as l}from"./chunk-E66B27AL.mjs";J();import g from"node:fs/promises";import d from"node:path";K();var U=/^(main|index|app|server|cli|handler|router|bootstrap|init|start|run|default)$/i;function I(t){let e=M(t);if(!C(t))return{ready:!1,builtAt:e?.builtAt??null,symbols:0,edges:0,files:0,languages:[],kinds:[],routes:[],hotspots:[],entryCandidates:[],packages:[],note:"No symbol index. Run `prjct sync` or `prjct code reindex`."};let r=w(t),s=new Map,a=new Map,o=new Map,p=[],c=[];for(let i of r){s.set(i.kind,(s.get(i.kind)??0)+1),a.set(i.file,(a.get(i.file)??0)+1);let u=i.file.includes(".")?i.file.slice(i.file.lastIndexOf(".")):"(none)";o.set(u,(o.get(u)??0)+1),i.kind==="route"&&p.push({name:i.name,file:i.file,line:i.startLine}),i.exported&&U.test(i.name)&&(i.kind==="function"||i.kind==="class")&&!/__tests__|\.test\.|\.spec\.|fixtures?\//i.test(i.file)&&c.push({name:i.name,file:i.file,kind:i.kind})}let y=[...a.keys()],h=[],W=R(t),Y=y.length>400?y.slice(0,400):y;for(let i of Y){let u=W.get(i)??0;u>0&&h.push({file:i,fanIn:u,symbolCount:a.get(i)??0})}h.sort((i,u)=>u.fanIn-i.fanIn);let k=new Set,v=A(t);if(v)for(let i of Object.keys(v.forward).slice(0,2e3)){let u=i.includes("/")?i.slice(0,i.indexOf("/")):i;u&&!u.startsWith(".")&&k.add(u)}for(let i of y.slice(0,2e3)){let u=i.includes("/")?i.slice(0,i.indexOf("/")):".";u&&u!=="."&&k.add(u)}if(c.length<8)for(let i of r){if(c.length>=12)break;i.exported&&i.kind==="class"&&!c.some(u=>u.file===i.file)&&c.push({name:i.name,file:i.file,kind:i.kind})}return{ready:!0,builtAt:e?.builtAt??null,symbols:e?.symbolCount??r.length,edges:e?.edgeCount??0,files:e?.fileCount??a.size,languages:[...o.entries()].map(([i,u])=>({ext:i,count:u})).sort((i,u)=>u.count-i.count).slice(0,12),kinds:[...s.entries()].map(([i,u])=>({kind:i,count:u})).sort((i,u)=>u.count-i.count),routes:p.slice(0,30),hotspots:h.slice(0,15),entryCandidates:c.slice(0,15),packages:[...k].sort().slice(0,40),note:"Structural only (symbol + import graphs). Narrative architecture lives in prjct analysis / memory decisions."}}l(I,"buildArchitectureSnapshot");function T(t,e){let n=[];if(!t)return{hasChanges:!0,items:[{field:"Project style",type:"added",after:e.summary}],summary:{added:1,removed:0,changed:0},beforeCommit:null,afterCommit:e.commitHash};let r=t.payload,s=e.payload;r.stack.ecosystem!==s.stack.ecosystem&&n.push({field:"Ecosystem",type:"changed",before:r.stack.ecosystem,after:s.stack.ecosystem}),(r.stack.packageManager??"")!==(s.stack.packageManager??"")&&n.push({field:"Package manager",type:"changed",before:r.stack.packageManager??"(none)",after:s.stack.packageManager??"(none)"}),P("Languages",r.stack.languages,s.stack.languages,n),P("Frameworks",r.stack.frameworks,s.stack.frameworks,n),P("Key libraries",r.stack.keyLibraries,s.stack.keyLibraries,n),r.stack.hasTests!==s.stack.hasTests&&n.push({field:"Has tests",type:"changed",before:String(r.stack.hasTests),after:String(s.stack.hasTests)}),_("Pattern",r.patterns.map(c=>[c.key,c.name]),s.patterns.map(c=>[c.key,c.name]),n),_("Anti-pattern",r.antiPatterns.map(c=>[c.key,c.issue]),s.antiPatterns.map(c=>[c.key,c.issue]),n),_("Convention",r.conventions.map(c=>[c.key,c.rule]),s.conventions.map(c=>[c.key,c.rule]),n),r.structural.symbols!==s.structural.symbols&&(r.structural.symbols>0||s.structural.symbols>0)&&n.push({field:"Symbols",type:"changed",before:String(r.structural.symbols),after:String(s.structural.symbols)}),r.structural.files!==s.structural.files&&n.push({field:"Files",type:"changed",before:String(r.structural.files),after:String(s.structural.files)});let a=n.filter(c=>c.type==="added").length,o=n.filter(c=>c.type==="removed").length,p=n.filter(c=>c.type==="changed").length;return{hasChanges:n.length>0,items:n,summary:{added:a,removed:o,changed:p},beforeCommit:t.commitHash,afterCommit:e.commitHash}}l(T,"generateProjectStyleDiff");function O(t){if(!t.hasChanges)return`## Project evolution
|
|
9
9
|
|
|
10
10
|
No style changes since last sync.`;let e=["## Project evolution (this sync)"];(t.beforeCommit||t.afterCommit)&&e.push(`> \`${L(t.beforeCommit)}\` \u2192 \`${L(t.afterCommit)}\``),e.push(""),e.push(`+${t.summary.added} \xB7 \u2212${t.summary.removed} \xB7 ~${t.summary.changed}`),e.push("");for(let n of t.items.slice(0,20)){let r=n.type==="added"?"+":n.type==="removed"?"\u2212":"~";n.type==="changed"?e.push(`- ${r} **${n.field}**: ${n.before} \u2192 ${n.after}`):n.type==="added"?e.push(`- ${r} **${n.field}**: ${n.after}`):e.push(`- ${r} **${n.field}**: ${n.before}`)}return e.join(`
|
|
11
11
|
`)}l(O,"formatProjectStyleDiffMd");function L(t){return t?t.length>7?t.slice(0,7):t:"(none)"}l(L,"short");function P(t,e,n,r){let s=new Set(e.map(o=>o.toLowerCase())),a=new Set(n.map(o=>o.toLowerCase()));for(let o of n)s.has(o.toLowerCase())||r.push({field:t,type:"added",after:o});for(let o of e)a.has(o.toLowerCase())||r.push({field:t,type:"removed",before:o})}l(P,"diffStringArray");function _(t,e,n,r){let s=new Map(e),a=new Map(n);for(let[o,p]of a)s.has(o)?s.get(o)!==p&&r.push({field:t,type:"changed",before:s.get(o),after:p}):r.push({field:t,type:"added",after:p});for(let[o,p]of s)a.has(o)||r.push({field:t,type:"removed",before:p})}l(_,"diffKeyed");var F=50;function B(t){let e=(()=>{try{return JSON.parse(t.payload_json)}catch{return q()}})();return{id:t.id,capturedAt:t.captured_at,commitHash:t.commit_hash,source:t.source||"sync-mechanical",patternCount:t.pattern_count,antiPatternCount:t.anti_pattern_count,conventionCount:t.convention_count,frameworkCount:t.framework_count,symbolCount:t.symbol_count,fileCount:t.file_count,summary:t.summary,payload:e}}l(B,"rowToSnapshot");function q(){return{payloadVersion:1,stack:{ecosystem:"unknown",languages:[],frameworks:[],keyLibraries:[],hasTests:!1,hasDocker:!1},commands:{},conventions:[],patterns:[],antiPatterns:[],structural:{symbols:0,files:0,packages:[]},metrics:{}}}l(q,"emptyPayload");function H(t){try{let e=m.get(t,"SELECT * FROM project_style_snapshots WHERE is_active = 1 ORDER BY captured_at DESC LIMIT 1");return e?B(e):null}catch{return null}}l(H,"getActiveProjectStyle");function G(t,e=12){try{return m.query(t,"SELECT * FROM project_style_snapshots ORDER BY captured_at DESC LIMIT ?",e).map(B)}catch{return[]}}l(G,"getProjectEvolution");function St(t,e=6){let n=G(t,e);if(n.length===0)return null;let r=["## Project evolution"];if(n.length>=2){let s=n[0],a=n[n.length-1],o=s.patternCount-a.patternCount,p=s.conventionCount-a.conventionCount,c=s.fileCount-a.fileCount;r.push(`Over ${n.length} snapshots: patterns ${$(o)}, conventions ${$(p)}, files ${$(c)}.`)}for(let s of n)r.push(`- ${s.capturedAt.slice(0,10)} \u2014 ${s.summary}`);return r.join(`
|
|
@@ -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-
|
|
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)
|
|
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-
|
|
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
|
|
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,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{d as b}from"./chunk-SYHDEUVU.mjs";import{a as j}from"./chunk-GCKILEXJ.mjs";import{c as p,e as A}from"./chunk-
|
|
8
|
+
import{d as b}from"./chunk-SYHDEUVU.mjs";import{a as j}from"./chunk-GCKILEXJ.mjs";import{c as p,e as A}from"./chunk-D4S3IRD3.mjs";import{b as w}from"./chunk-PKDYFXMI.mjs";import{a as e}from"./chunk-E66B27AL.mjs";import g from"node:fs";import H from"node:fs/promises";import m from"node:path";var I=j.join("/"),R="Generated with [p/](https://www.prjct.app/)",P="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",L="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'Tasks \u2192 `prjct work "\u2026"`. Known cmds (`sync`/`search`/`remember`/\u2026) \u2192 `prjct <cmd>` \u2014 never work-wrap.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${I}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};function S(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- ${n.remember}`,`- ${n.kb}`,`- ${n.ship}`,`- ${n.loop}`,`- ${n.identity}`,"",`Commit footer: \`${R}\``].join(`
|
|
9
9
|
`)}
|
|
10
10
|
`}e(S,"buildCompactSkill");var M=S,_=S;function O(t){return`${["<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","# p/ \u2014 Context layer for AI agents","","Skills auto-activate for: work, intent, ship, sync, guard, remember, search, insights, performance","Other commands: run `prjct <command> --md` and follow CLI output","","Flow: known verbs run as `prjct <cmd> --md` (sync, search, remember, ship, guard, land, prime\u2026).",'`prjct work` is only for task/work cycles \u2014 never wrap a bare verb as work "sync".',"Substantive implementation follows the persisted work-cycle station from `prjct work --md`:","reviewed intent, evidence, tests when required, then code.","Sync analysis: prefer schema v1 JSON via `prjct analysis-save-llm` (markdown = thin notes only).","","Data:","- Persist everything (memories, context, intents) in ENGLISH, whatever language the user speaks",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- Sovereign knowledge base \u2014 ${n.kb}`,`- ${n.remember}`,`- ${n.loop}`,"- On close, save synthesized context; raw quotes, counters, detector rows, and transcript chunks are inputs, not final memory","- prjct remembers and shows the path; the agent decides how to execute with its own native tools","- Treat prjct output as signals, not a prescriptive harness",`- Commit footer: \`${R}\``,"- Path resolution: `.prjct/prjct.config.json` \u2192 `~/.prjct-cli/projects/{projectId}`","- Storage: `prjct` CLI (SQLite internally)","- Worktree hygiene: if working in a git worktree, remove it AFTER its PR merges \u2014 `git worktree remove` from the main worktree; never with uncommitted/unpushed work, never `--force`","",`Crew (opt-in via \`prjct crew install\`): Leader (blue) \xB7 Implementer (purple) \xB7 Reviewer (pink). Subagent dispatch is Claude-Code-only; in ${t}, identify the role you are playing explicitly.`,"","**Auto-managed by prjct-cli** | https://prjct.app","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"].join(`
|
|
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{d as p}from"./chunk-
|
|
8
|
+
import{d as p}from"./chunk-A5MUSARI.mjs";import{e as f}from"./chunk-DGQYQSUK.mjs";import{a as g}from"./chunk-RRWPDRYR.mjs";import{e as m,g as _}from"./chunk-HDHVBB6Q.mjs";import{a as l}from"./chunk-E66B27AL.mjs";_();var S=8,y=140;function h(d,r){if(r.length===0)return 0;let n=[];try{m.transaction(d,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=s.prepare("DELETE FROM memory_entries WHERE id = ?"),t=s.prepare("DELETE FROM events WHERE id = ? AND type LIKE 'memory.remember.%'");for(let e of r){try{i.run(e)}catch{}c.run(e).changes&&n.push(e);let a=e.match(/^mem_(\d+)$/);if(a)try{t.run(Number(a[1]))}catch{}}})}catch{return n.length}return n.length}l(h,"hardDeleteEntries");function w(d,r,n){let s=new Map;for(let e of r)s.set(e.type,(s.get(e.type)??0)+1);let i=[...s.entries()].sort((e,o)=>o[1]-e[1]).map(([e,o])=>`${e}\xD7${o}`).join(", "),c=r.map(e=>p(e).replace(/\s+/g," ").trim()).filter(e=>e.length>20).slice(0,S).map(e=>`- ${e.length>y?`${e.slice(0,y-1)}\u2026`:e}`),t=[`Distill of discarded auto-history (${d}).`,`Context synthesis: ${r.length} low-value rows collapsed \u2014 raw history deleted; only this digest remains for the project model.`,`Key data: source=retention-distill; discarded=${r.length}; types=${i}; at=${n}`,"What happened: purged auto-generated / redundant captures that added no excess vs the reference model.","Why it mattered: prevent vault bloat; agents must not re-read detector noise.",`Outcome: ${r.length} raw entries hard-deleted after distillation.`,"Next implication: prefer high-excess judgment; re-run detectors only when code/model changes."];return c.length>0&&t.push(`Sample cues (not full bodies):
|
|
9
9
|
${c.join(`
|
|
10
10
|
`)}`),t.join(" ")}l(w,"buildDistillContent");async function A(d,r,n,s,i){if(s.length<=i)return{discarded:0,digested:!1};let t=[...s].sort((u,b)=>b.rememberedAt.localeCompare(u.rememberedAt)).slice(i);if(t.length===0)return{discarded:0,digested:!1};let e=new Date().toISOString(),o=`auto-distill:${n}`,a=w(n,t,e),E=await g.remember(d,{type:"learning",content:a,tags:{source:"retention-distill",topic:o,capture:"distill-discard-v1",context_schema:"living-v2",synthesis:"deterministic",discarded_count:String(t.length),auto_source:n},provenance:"inferred",projectId:r}).then(()=>!0).catch(()=>!1),D=t.map(u=>u.id);return{discarded:h(r,D),digested:E,digestTopic:o}}l(A,"distillAndDiscardAutoSource");async function v(d,r,n){let s=g.allEntriesForIndex(r),i=new Map;for(let t of s){let e=t.tags?.source;if(!f(e)||e==="retention-distill"||t.tags?.source==="retention-distill")continue;let o=i.get(e)??[];o.push(t),i.set(e,o)}let c=[];for(let[t,e]of i){if(e.length<=n)continue;let o=await A(d,r,t,e,n);c.push(o)}return{discarded:c.reduce((t,e)=>t+e.discarded,0),digests:c.filter(t=>t.digested).length}}l(v,"distillAndDiscardAllAutoSources");function x(d,r,n=1e3){let s=Date.now()-r*864e5;try{let i=m.query(d,`SELECT id, type, content FROM memory_entries
|
|
11
11
|
WHERE deleted_at IS NOT NULL AND deleted_at < ?
|
|
@@ -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-
|
|
8
|
+
import{a as k,b as a}from"./chunk-6AFM6WRB.mjs";import{a as E}from"./chunk-UQVJQME2.mjs";import{j as l,n as A}from"./chunk-SVZHJZ5T.mjs";import{c as d}from"./chunk-PKDYFXMI.mjs";import{e as c,f as v}from"./chunk-BUDZL4DW.mjs";import{a as n}from"./chunk-E66B27AL.mjs";v();function C(r,e,t){if(t.md){console.log(`> ${e}`);return}k[r](e)}n(C,"notify");var B=n((r,e={})=>C("warn",r,e),"notifyWarn");var D=n((r,e={})=>C("fail",r,e),"notifyFail");function J(r,e={}){return B(r,e),{success:!1,error:r}}n(J,"failWith");function Z(r,e={}){return D(r,e),{success:!1,error:r}}n(Z,"failHard");function ee(r,e){let t=c(r);return e&&D(t,e),{success:!1,error:t}}n(ee,"failFromError");A();import x from"node:path";var f={value:null},$={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"p.",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},j={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};async function L(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await l(x.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await l(x.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}n(L,"isClaudeEnvironment");function V(){return{...$}}n(V,"getClaudeAgent");function U(){return{...j}}n(U,"getTerminalAgent");function G(){return!!(process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1")}n(G,"isSandboxed");async function T(){if(f.value)return f.value;let r=await L()?V():U();return r.environment={...r.environment,sandboxed:G()},f.value=r,r}n(T,"detect");v();A();import p from"node:fs/promises";var y=class{static{n(this,"RuntimeClaude")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let i={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${i[t]||i.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${c(t)}`)}return await p.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(i){console.warn(`MCP writeFile failed, falling back to fs: ${c(i)}`)}await p.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${c(t)}`)}return await p.readdir(e)}async fileExists(e){return l(e)}async createDirectory(e){await p.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
9
9
|
${e.map((t,i)=>`${i+1}. ${t}`).join(`
|
|
10
10
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
11
11
|
|
|
@@ -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-
|
|
8
|
+
import{b as a,c as f}from"./chunk-L4COZ7ZH.mjs";import{f as u}from"./chunk-A5MUSARI.mjs";import{a as m}from"./chunk-RRWPDRYR.mjs";import{b as l}from"./chunk-W5OWBOLH.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execSync as d}from"node:child_process";var h=1200,y=3;function C(t){try{return d("git diff --cached --name-only",{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
|
|
9
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{a as p}from"./chunk-
|
|
8
|
+
import{a as p}from"./chunk-RRWPDRYR.mjs";import{d as g,g as M}from"./chunk-HDHVBB6Q.mjs";import{a as o}from"./chunk-E66B27AL.mjs";M();var h=300,x=3;function v(t){let e=t?.judgment?.conflictMode;if(e==="off"||e==="advisory"||e==="strict")return e;let n=t?.persona?.packs??[];return n.includes("code-strict")?"strict":n.includes("code")?"advisory":"off"}o(v,"effectiveConflictMode");function N(t){let e={action:"none",memoryIds:[],reason:"",recovery:"",message:""};if(t.mode==="off")return e;let n=new Set(t.overriddenIds??[]),r=t.candidates.filter(c=>c.id&&!n.has(c.id));if(r.length===0)return e;let i=r.filter(c=>c.confidence==="high"),l=r.filter(c=>c.confidence==="low"),s=i[0]??l[0];if(!s)return e;let f=r.map(c=>c.id),u=t.fileLabel?` on \`${t.fileLabel}\``:"",a=`Edit may contradict [${s.type}] ${m(s.content,80)} (\`${s.id}\`)${u}`,d='To supersede: `prjct remember decision "\u2026why supersede\u2026" --tags supersedes:'+s.id+'`. To lift deny for this memory: `prjct remember feedback "override conflict '+s.id+': <why>" --tags conflict:override,memory:'+s.id+"`.";return i.length===0?{action:"warn",memoryIds:f,reason:`Low-confidence preventive signal${u}: ${m(s.content,80)}`,recovery:d,message:y(a,d,f,!1)}:t.mode==="strict"?{action:"deny",memoryIds:i.map(c=>c.id),reason:a,recovery:d,message:_(a,d,i.map(c=>c.id))}:{action:"warn",memoryIds:f,reason:a,recovery:d,message:y(a,d,f,!0)}}o(N,"decisionConflictVerdict");function y(t,e,n,r){return[r?"# prjct: CONFLICT \u2014 decision/gotcha may block this path":"# prjct: heads-up \u2014 weak preventive signal","",t,"",`Memory: ${n.map(l=>`\`${l}\``).join(", ")}`,"",e,"",r?"> Not a soft nudge. Revise the edit or supersede the decision with rationale before proceeding.":"> Apply if it still holds; proceed if not."].join(`
|
|
9
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
|
|
@@ -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-
|
|
8
|
+
import{b as Ct}from"./chunk-FGQZ62ZP.mjs";import{a as gt,b as ht,c as yt,d as St,e as wt}from"./chunk-TXJT3G53.mjs";import{a as ut}from"./chunk-A5RNWWTH.mjs";import{a as Be}from"./chunk-HZIORCPO.mjs";import{a as Je}from"./chunk-WDGDFXSB.mjs";import{a as ne,b as qe}from"./chunk-NWY5M34K.mjs";import{a as Ke,b as xt}from"./chunk-6AFM6WRB.mjs";import{a as mt,b as pt}from"./chunk-YKMJI6TF.mjs";import{d as ft}from"./chunk-XEFIIDHM.mjs";import{a as ct,b as lt}from"./chunk-QDQ7DTDV.mjs";import{a as kt,b as vt,c as bt,d as Pt}from"./chunk-ZTZTVBAZ.mjs";import{a as f}from"./chunk-DYHYDHCW.mjs";import{b as Y,c as tt,d as rt}from"./chunk-YJMWY4Y6.mjs";import{c as st,d as nt,e as oe,f as at,g as ot}from"./chunk-NJAMZSHM.mjs";import{a as it}from"./chunk-FEH4IPIC.mjs";import{i as dt}from"./chunk-J6JZ4PQA.mjs";import{a as et}from"./chunk-LGJUQEAU.mjs";import{b as Qe,c as Xe,d as Ze}from"./chunk-4DDCWMI6.mjs";import{a as Ye}from"./chunk-UQVJQME2.mjs";import{a as ae,b as R}from"./chunk-BISPGBNN.mjs";import{a as ze}from"./chunk-HJ4HEI45.mjs";import{c as Ve}from"./chunk-3LG3ACQV.mjs";import{c as We}from"./chunk-AOPJ4Z6O.mjs";import{b as T}from"./chunk-W5OWBOLH.mjs";import{d as P,e as I,g as K}from"./chunk-HDHVBB6Q.mjs";import{d as se}from"./chunk-HBLR7BVG.mjs";import{b,e as re,m as He,o as Le,r as br,s as q,t as Ge}from"./chunk-AKIN5WSQ.mjs";import{b as Ne,f as vr}from"./chunk-HDSS6UB3.mjs";import{d as Te,e as $e,f as Oe,j as L,n as B}from"./chunk-SVZHJZ5T.mjs";import{a as _e,o as kr}from"./chunk-CTWZQ7YI.mjs";import{a as Ue}from"./chunk-OIEZAHLC.mjs";import{d as w}from"./chunk-PKDYFXMI.mjs";import{a as M,d as Me,e as v,f as N}from"./chunk-BUDZL4DW.mjs";import{a as i}from"./chunk-E66B27AL.mjs";function Dt(r,e){let t=[];G("Languages",r.languages,e.languages,t),G("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),G("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(u=>u.name),a=e.patterns.map(u=>u.name);G("Patterns",s,a,t);let o=r.antiPatterns.map(u=>u.issue),n=e.antiPatterns.map(u=>u.issue);G("Anti-patterns",o,n,t);let l=t.filter(u=>u.type==="added").length,c=t.filter(u=>u.type==="removed").length,d=t.filter(u=>u.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:l,removed:c,changed:d},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}i(Dt,"generateAnalysisDiff");function ps(r){if(!r.hasChanges)return`## Analysis Diff
|
|
9
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-PSJCO5UP.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-363CLE32.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-S2GGTVY2.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-IPK4NJN6.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-NH5EWEXF.mjs"),g=await m(this.projectPath,this.projectId);(g.checkpointsMigrated||g.teamMigrated||g.checkpointsHandEditWarned||g.teamHandEditWarned||g.ghostDirsPurged.length>0||g.agentFilesRepaired.length>0||g.clientPrjctJunkPurged.length>0||g.errors.length>0)&&f.info("Legacy crew sweep ran",{checkpointsMigrated:g.checkpointsMigrated,teamMigrated:g.teamMigrated,checkpointsHandEditWarned:g.checkpointsHandEditWarned,teamHandEditWarned:g.teamHandEditWarned,ghostDirsPurged:g.ghostDirsPurged,agentFilesRepaired:g.agentFilesRepaired,ghostFilesIngested:g.ghostFilesIngested,clientPrjctJunkPurged:g.clientPrjctJunkPurged,errors:g.errors.length})}catch(m){f.debug("Legacy crew sweep failed (non-critical)",{error:w(m)})}});let[u,h,y,C]=await k("gather",()=>qt(Promise.all([kt(this.projectPath),vt(this.projectPath),bt(this.projectPath),Pt(this.projectPath)]),"gather")),{shouldRebuildIndexes:_,changedDomains:W,incrementalInfo:Re,changedSourceFiles:V,deletedSourceFiles:z}=await k("incremental",()=>Ht({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));try{let{refreshFileInventory:m}=await import("./project-file-inventory-ZAPKPKY6.mjs");await m(this.projectId,this.projectPath)}catch{}try{await Et(this.projectId)}catch{}_&&await k("index",async()=>{try{let m=Re?.isIncremental&&(V.length>0||z.length>0);await Promise.all([m?Ze(this.projectPath,this.projectId,V,z):Xe(this.projectPath,this.projectId),m?rt(this.projectPath,this.projectId,V,z):tt(this.projectPath,this.projectId),m?nt(this.projectPath,this.projectId,V,z):st(this.projectPath,this.projectId),pt(this.projectPath,this.projectId)]);let g=this.projectId,S=this.projectPath,H=await T.readConfig(S).catch(()=>null),E=Rt(H);o.push(Kt(()=>Ft(g,{uploadToCloud:E}),{onComplete:i(({totalMs:x,error:J})=>{f.debug("sync post-index work settled",{projectId:g,uploadToCloud:E,totalMs:x,...J===void 0?{}:{error:w(J)}})},"onComplete")}))}catch(m){f.debug("File ranking index build failed (non-critical)",{error:w(m)})}});let or=Date.now();f.debug("sync phase start",{phase:"skills"});let ir=await Mt.generateAndInstall().catch(m=>{f.debug("Native skill generation failed (non-critical)",{error:w(m)})});f.debug("sync phase done",{phase:"skills",ms:Date.now()-or}),await k("update-files",()=>Promise.all([Xt({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:u,stats:h}),Zt({projectId:this.projectId,projectPath:this.projectPath,stats:h,stack:C}),Promise.resolve(er(this.projectId,u,h)),Jt(this.projectId,this.projectPath,u,h,C,a.verified)]));let te=await Q.getActive(this.projectId),cr={patterns:te?.patterns?.length||0,antiPatterns:te?.antiPatterns?.length||0,criticalAntiPatterns:te?.antiPatterns?.filter(m=>m.severity==="high").length||0},lr=Date.now()-s,Fe=await k("metrics",()=>zt(this.projectId,h,lr)),dr=Fe.developerSnapshotCaptured===!0,ur=await(async()=>{try{let{recomputeProjectStyle:m,formatProjectStyleForSync:g}=await import("./project-style-evolution-7JS75AUP.mjs"),S=await k("project-style",()=>m({projectId:this.projectId,projectPath:this.projectPath,stats:h,stack:C,commands:y,commitHash:u.recentCommits[0]?.hash??null,source:"sync-mechanical"})),H=g(S),E=S.snapshot.payload.metrics.styleCoverage;return{summary:S.snapshot.summary,evolutionMd:H.evolutionMd,patternCount:S.snapshot.patternCount,antiPatternCount:S.snapshot.antiPatternCount,conventionCount:S.snapshot.conventionCount,styleCoverage:typeof E=="number"?E:Number(E)||0,isFirst:S.isFirst,hasChanges:S.delta.hasChanges}}catch(m){f.debug("Project style recompute failed (non-critical)",{error:w(m)});return}})(),mr=await k("work-cost",()=>Ct(this.projectId));await k("archive",()=>Bt(this.projectId));let pr=await k("context-quality",()=>et(this.projectPath,this.projectId)),fr=await k("retention",async()=>{try{let m=await T.readConfig(this.projectPath).catch(()=>null),g=m?.retention?.mode??"apply";if(g==="off")return;let S=g==="dry-run",{applyRetention:H,triageInbox:E}=await import("./retention-D2MVQLOF.mjs"),x=H(this.projectId,{dryRun:S,maxArchive:m?.retention?.maxArchive,maxDelete:m?.retention?.maxDelete}),{inboxMerged:J,inboxArchived:hr}=S?{inboxMerged:0,inboxArchived:0}:(()=>{let j=E(this.projectId);return{inboxMerged:j.merged,inboxArchived:j.archived}})(),{runVaultPurge:yr,vaultHealth:Sr}=await import("./purge-BDREPWEE.mjs"),O=await yr(this.projectId,{projectPath:this.projectPath,dryRun:S,softDeletedPurgeDays:m?.retention?.softDeletedPurgeDays,archivePruneDays:m?.retention?.archivePruneDays,autoSourceMaxLive:m?.retention?.autoSourceMaxLive}),wr=Sr(this.projectId);return{evaluated:x.evaluated,active:x.active,archive:x.wouldArchive,delete:x.wouldDelete,archived:x.archived,deleted:x.deleted,inboxMerged:J,inboxArchived:hr,dryRun:S,samples:x.samples.map(j=>({id:j.id,type:j.type,verdict:j.verdict,score:j.score,reasons:j.reasons,excess:j.excess})),referenceSize:x.referenceSize,vault:{...wr,softDeletedPurged:O.softDeletedPurged,orphanEventsPurged:O.orphanEventsPurged,archivesPruned:O.archivesPruned,autoSourceTrimmed:O.autoSourceTrimmed,distilledDiscarded:O.distilledDiscarded,digestsWritten:O.digestsWritten}}}catch(m){f.debug("retention phase failed",{error:w(m)});return}});await k("install-global",async()=>{await se.installGlobalConfig(),await se.syncCommands()}),await k("install-agent-surfaces",async()=>{let{detectInstalledAgents:m}=await import("./detection-MEYHME4X.mjs"),g=await m(this.projectPath).catch(()=>[]);await it(this.projectPath,{refreshIfAdopted:!0,agents:g})});let gr=await k("verify",async()=>{try{let m=await T.readConfig(this.projectPath);return await sr.verify(this.projectPath,this.globalPath,m?.verification)}catch(m){f.debug("Verification failed (non-critical)",{error:w(m)});return}});if(process.env.PRJCT_WORLD_MODEL_REFRESH==="1"||process.env.PRJCT_DRIFT_REFRESH==="1")try{let m=await import("node:os"),{markDriftRefreshApplied:g}=await import("./drift-refresh-TD3PYPJN.mjs"),S=process.env.PRJCT_CLI_HOME?ee.resolve(process.env.PRJCT_CLI_HOME):ee.join(m.homedir(),".prjct-cli");g(S)}catch{}return await Promise.all(o.map(m=>m.settle())),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:u,stats:h,commands:y,stack:C,context7:{installed:a.installed,verified:a.verified,message:a.message},analysisSummary:cr,contextQuality:pr,retentionDryRun:fr,syncMetrics:Fe,workCost:mr,verification:gr,incremental:Re,projectStyle:ur,developerSnapshotCaptured:dr,generatedSkills:ir}}catch(n){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:pe(),stats:fe(),commands:ge(),stack:he(),context7:{installed:a.installed,verified:a.verified,message:a.message},error:w(n)}}}async getCliVersion(){try{let e=ee.join(__dirname,"..","..","package.json");return(await Oe(e))?.version||"0.0.0"}catch(e){return f.debug("Failed to read CLI version",{error:w(e)}),"0.0.0"}}},Ka=new je;import Ie from"chalk";var nr={task:"Start new work cycle",done:"Complete current work",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},us={task:"work"};function Ee(r){return us[r]??r}i(Ee,"publicCommand");var ar={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};function eo(r,e={}){if(e.quiet)return;let t=ar[r]||"idle",s=ae.getValidCommands(t);if(s.length===0)return;let a=s.map(o=>({cmd:`p. ${Ee(o)}`,desc:nr[o]||o}));console.log(Ie.dim(`
|
|
38
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,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-
|
|
8
|
+
import{a as A}from"./chunk-GAOQHD5S.mjs";import{a as O}from"./chunk-UQVJQME2.mjs";import{a as w,b as I,h as B}from"./chunk-UUULLTQV.mjs";import{a as D,b as W,e as u,g as k}from"./chunk-HDHVBB6Q.mjs";import{c as S,d as T,e as v,f as N,g as M}from"./chunk-GCKILEXJ.mjs";import{a as h}from"./chunk-E66B27AL.mjs";k();W();B();var H=25,$=4,q=100,C=["supersedes","duplicates","superseded-by"];function L(r,e,t){let n=r.get(e);if(n!==void 0)return n;let i=t();return r.set(e,i),i}h(L,"getOrCreateMapValue");function U(r){try{let e=C.map(()=>"?").join(","),t=u.query(r,`SELECT t.entry_id, t.key, t.value
|
|
9
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-OFVLGJ76.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-
|
|
24
|
+
))`,Date.now(),r,e,t,n,n)}catch{}},async remember(r,e){let t={...e.tags??{}},n=e.provenance??"declared",i=D(e.content);{let c=await import("./trust-boundary-ERMDF2C5.mjs").then(l=>l.evaluateMemoryContent).catch(()=>null);if(c){let l=c(e.content,{force:e.force});if(!l.allow){if(e.requireWrite)throw new Error(l.denyMessage);return}}}let{classifyCapturePrecision:o}=await import("./precision-classifier-IVVAXE26.mjs"),a=o(e.content,e.type,{force:e.force===!0});if(a.action==="refuse"){if(e.requireWrite)throw new Error(`precision refuse (${a.reasonCode}): ${a.reason}`);return}a.action==="demote"&&a.demoteTo&&(t.shape_demoted="true",t.original_type=e.type,t.precision_reason=a.reasonCode),e.force&&(t["precision:force"]="true");let m=a.action==="demote"&&a.demoteTo?a.demoteTo:e.type,d=e.projectId??await(async()=>{try{let{default:c}=await import("./config-manager-KYC7WUOS.mjs");return(await c.readConfig(r))?.projectId}catch{return}})();if(!t.file)try{let{inferMemoryFileTag:c}=await import("./infer-memory-file-PIAZ542H.mjs"),l=d?await(async()=>{try{let{stateStorage:E}=await import("./state-storage-KNGP2CQV.mjs"),p=(await E.getCurrentTask(d))?.likelyFiles;return Array.isArray(p)?p.map(f=>typeof f=="string"?f:f?.path).filter(f=>typeof f=="string"&&f.length>0):null}catch{return null}})():null,R=c({content:e.content,tags:t,projectPath:r,cycleFiles:l});R&&(t.file=R,t.file_source="inferred")}catch{}let y=t.topic??t.key;if(d){try{if(u.get(d,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",i,m)){y&&this.applyTopicSupersession(d,m,i,y);return}}catch{}try{let{captureGate:c}=await import("./capture-gate-BQCNMHUC.mjs"),l=c(d,m,e.content,t);if(!l.accept){if(e.requireWrite)throw new Error(`capture refused: ${l.reason}`);return}}catch(c){if(e.requireWrite&&c instanceof Error&&c.message.startsWith("capture refused"))throw c}}let s=await O.log(r,`${w}${m}`,{content:e.content,tags:t,source:e.source,provenance:n,content_hash:i,...d?{project_id:d}:{}},void 0,d||e.requireWrite?{...d?{projectId:d}:{},required:e.requireWrite}:void 0),g=d??s?.projectId;if(g&&y&&s?.eventId!=null&&this.applyTopicSupersession(g,m,i,y),s?.projectId)try{let{usefulnessService:c}=await import("./usefulness-253CZLNY.mjs");c.recordReferences(s.projectId,e.content,t),c.recordCorrection(s.projectId,t)}catch{}if(g)try{let{publishCRUD:c}=await import("./publish-helper-I37V4L7U.mjs"),l=t.spec_id??t.task_id??t.id??e.source??`mem-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;await c({projectId:g,entityType:"memories",entityId:l,eventType:"upsert",data:{id:l,type:m,content:e.content,tags:t,source:e.source??null,provenance:n,created_at:new Date().toISOString(),rememberedAt:new Date().toISOString()}})}catch{}},searchFts(r,e,t){if(e.length===0||t<=0)return[];let n=e.map(s=>A(s).replace(/[^a-z0-9-]/gi,"")).filter(s=>s.length>=2);if(n.length===0)return[];let i=n.map(s=>`"${s}"*`).join(" OR "),o=(()=>{try{return u.query(r,`SELECT m.id, m.content, m.type, m.provenance, m.created_at
|
|
25
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{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-
|
|
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};
|
|
@@ -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-
|
|
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(`
|
|
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-
|
|
13
|
-
${C}`:null}catch{return null}})():Promise.resolve(null),y=t.digest?(async()=>{try{let{loadSessionContinuity:h,formatContinuitySessionCue:C}=await import("./session-continuity-
|
|
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(`
|
|
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-
|
|
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(`
|
|
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,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-
|
|
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};
|
|
@@ -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-
|
|
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};
|
|
@@ -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-
|
|
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}
|
|
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 y}from"./chunk-
|
|
8
|
+
import{a as y}from"./chunk-RRWPDRYR.mjs";import{d as p,g as w}from"./chunk-HDHVBB6Q.mjs";import{a as i}from"./chunk-E66B27AL.mjs";import{execFileSync as E}from"node:child_process";w();var f="land-auto",j="session-close";async function C(t){let n=S(t);if(!n)return{wrote:!1,content:null,reason:"nothing-to-land"};try{return await y.remember(t.projectPath,{type:"context",content:n,tags:{source:f,topic:j,capture:"land-v2",context_schema:"living-v2",synthesis:"deterministic"},provenance:"extracted",projectId:t.projectId}),{wrote:!0,content:n}}catch(e){return{wrote:!1,content:n,reason:`remember-failed: ${e.message}`}}}i(C,"synthesizeLandHandoff");function S(t){let n=t.cycleDescription?.trim()||null,e=L(t.projectId,t.cycleId),h=x(t.projectPath),a=k(t.projectId);if(!n&&e.length===0&&h.length===0&&a.length===0)return null;let o=[];n?o.push(`Session close: Work cycle "${c(n,120)}" still open or just closed.`):o.push("Session close: no open work cycle \u2014 landed repo + capture signals only."),o.push("Context synthesis: Passive land hand-off from durable signals (cycle, journal, commits, auto-captures). Not a model essay."),o.push(`Key data: source=${f}; topic=${j}; capture=land-v2`);let l=[];if(n&&l.push(`cycle="${c(n,100)}"`),e.length>0&&l.push(`journal: ${e.map(s=>c(s,70)).join(" \xB7 ")}`),l.length>0&&o.push(`What happened: ${l.join("; ")}`),e.length>0&&o.push(`Why it mattered: Journal trail shows progression \u2014 ${e.slice(0,2).map(s=>c(s,80)).join(" \xB7 ")}`),a.length>0){let s=a.filter(r=>r.type==="learning"||r.type==="decision"||r.type==="fact").slice(0,4),u=a.filter(r=>r.type==="gotcha"||r.type==="anti-pattern").slice(0,3);s.length>0&&o.push(`Learned this session: ${s.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`),u.length>0&&o.push(`Decision/trap: ${u.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`);let I=new Set([...s,...u]),g=a.filter(r=>!I.has(r)).slice(0,3);g.length>0&&s.length===0&&u.length===0&&o.push(`Decision/trap: ${g.map(r=>`[${r.type}] ${c(r.content,100)}`).join(" \xB7 ")}`)}h.length>0&&o.push(`Outcome: Recent commits: ${h.join("; ")}`),t.author&&o.push(`Who/author: ${t.author}`),t.model&&o.push(`Model: ${t.model}`);let m=t.tokensIn,d=t.tokensOut;if(m!=null||d!=null){let s=(m??0)+(d??0);o.push(`Token usage: in=${m??0} out=${d??0} total=${s} (compound judgment \u2014 not a fresh-window thrash loop)`)}o.push("Feature/domain: session-close"),o.push("Pattern: land auto-synthesis without agent remember"),o.push("Anti-pattern: relying on the model to remember to remember at session end"),o.push("Competitive: next window must `prjct prime` \u2014 act as this developer with SQLite judgment, not re-research from zero (GSD tax).");let $=n!=null?"Finish or pause the open cycle (`prjct status done` / `prjct pause`); next agent should `prjct work --md` or `prjct prime`.":"Next agent: `prjct prime` then pick from `prjct next --md`.";return o.push(`Next implication: ${$}`),o.join(" \xB7 ")}i(S,"buildLandHandoffContent");function L(t,n){try{return n?p.query(t,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 5",n).map(e=>e.content):p.query(t,"SELECT content FROM task_log ORDER BY id DESC LIMIT 5").map(e=>e.content)}catch{return[]}}i(L,"recentJournal");function x(t){try{return E("git",["log","-5","--oneline","--no-decorate"],{cwd:t,encoding:"utf-8",timeout:3e3,stdio:["ignore","pipe","ignore"]}).split(`
|
|
9
9
|
`).map(e=>e.trim()).filter(Boolean)}catch{return[]}}i(x,"recentCommits");function k(t){try{return p.query(t,`SELECT me.type, me.content
|
|
10
10
|
FROM memory_entries me
|
|
11
11
|
JOIN memory_entry_tags t ON t.entry_id = me.id
|