prjct-cli 2.5.0 → 2.7.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.
@@ -6,11 +6,11 @@ var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
8
  var at=Object.defineProperty;var Xr=Object.getOwnPropertyDescriptor;var $r=Object.getOwnPropertyNames;var Wr=Object.prototype.hasOwnProperty;var c=(n,t)=>at(n,"name",{value:t,configurable:!0}),ge=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var N=(n,t)=>()=>(n&&(t=n(n=0)),t);var fe=(n,t)=>{for(var e in t)at(n,e,{get:t[e],enumerable:!0})},Gr=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of $r(t))!Wr.call(n,s)&&s!==e&&at(n,s,{get:()=>t[s],enumerable:!(r=Xr(t,s))||r.enumerable});return n};var vt=n=>Gr(at({},"__esModule",{value:!0}),n);var he,Te,ye,_t=N(()=>{"use strict";he=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),Te=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ye=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Hr(n){return n instanceof Error&&"code"in n}function R(n){return Hr(n)&&n.code==="ENOENT"}function we(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var U=N(()=>{"use strict";c(Hr,"isNodeError");c(R,"isNotFoundError");c(we,"getErrorMessage")});import ve from"node:fs/promises";async function _e(n,t){let e;try{e=await ve.readFile(n,"utf-8")}catch(i){if(R(i))return null;throw i}let r;try{r=JSON.parse(e)}catch{return await be(n,e),Se(n,"Malformed JSON"),null}let s=t.safeParse(r);return s.success?r:(await be(n,e),Se(n,qr(s.error)),null)}async function be(n,t){let e=`${n}.backup`;try{await ve.writeFile(e,t,"utf-8")}catch{}}function Se(n,t){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${t}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function qr(n){return n.issues.slice(0,3).map(t=>`${t.path.join(".")}: ${t.message}`).join("; ")}var xe=N(()=>{"use strict";U();c(_e,"safeRead");c(be,"createBackup");c(Se,"logCorruption");c(qr,"formatZodError")});import X from"node:fs/promises";import xt from"node:path";async function Pe(n,t={}){let e=[],r=t.maxFiles??1/0,s=t.dotfileAllowlist?new Set(t.dotfileAllowlist):null;async function i(o){if(e.length>=r)return;let a=await X.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let u of a){if(e.length>=r)break;let d=String(u.name);if(he.has(d)||t.skipDotfiles&&d.startsWith(".")&&(!s||!s.has(d)))continue;let m=xt.join(o,d);u.isDirectory()?await i(m):u.isFile()&&e.push(xt.relative(n,m))}}return c(i,"walk"),await i(n),e}async function Re(n,t,e){let r=[];for(let s=0;s<n.length;s+=t){let i=await Promise.all(n.slice(s,s+t).map(e));for(let o of i)o!==null&&r.push(o)}return r}async function ct(n,t=null,e){if(e)return await _e(n,e)??t;try{let r=await X.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(R(r))return t;throw r}}async function L(n,t,e=2){let r=xt.dirname(n);await X.mkdir(r,{recursive:!0});let s=`${JSON.stringify(t,null,e)}
9
- `;await X.writeFile(n,s,"utf-8")}async function _(n){try{return await X.access(n),!0}catch(t){if(R(t))return!1;throw t}}async function Pt(n){try{return(await X.stat(n)).isDirectory()}catch(t){if(R(t))return!1;throw t}}async function O(n){await X.mkdir(n,{recursive:!0})}var M=N(()=>{"use strict";_t();xe();U();c(Pe,"walkDir");c(Re,"batchProcess");c(ct,"readJson");c(L,"writeJson");c(_,"fileExists");c(Pt,"dirExists");c(O,"ensureDir")});var Ne=N(()=>{"use strict"});import{z as Z}from"zod";function Ce(n,t){let e=n.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){let i=e[s]??0,o=r[s]??0;if(i<o)return-1;if(i>o)return 1}return 0}var Rt,At=N(()=>{"use strict";Rt=Z.object({provider:Z.string(),model:Z.string(),cliVersion:Z.string().optional(),recordedAt:Z.string()});c(Ce,"compareSemver")});import{exec as Yr,execFile as zr}from"node:child_process";import{promisify as Ie}from"node:util";var k,Hn,B=N(()=>{"use strict";k=Ie(Yr),Hn=Ie(zr)});function De(n,t){let e=typeof n=="string"?new Date(n).getTime():n;return Date.now()-e>t}var ut,Nt=N(()=>{"use strict";c(De,"isExpired");ut=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(t={}){this.ttl=t.ttl??5e3,this.maxSize=t.maxSize??50}isValid(t){let e=this.cache.get(t);return e?Date.now()-e.timestamp<this.ttl:!1}get(t){let e=this.cache.get(t);return e?this.isValid(t)?e.data:(this.cache.delete(t),null):null}set(t,e){this.cache.set(t,{data:e,timestamp:Date.now()}),this.evictOldEntries()}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}has(t){return this.cache.has(t)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let e=Array.from(this.cache.entries()).sort((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of e)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let t=0;for(let e of this.cache.keys())this.isValid(e)||(this.cache.delete(e),t++);return t}}});import Jr from"node:fs/promises";import Kr from"node:os";import Le from"node:path";async function Me(){try{let n=await Jr.readFile(Oe,"utf-8"),t=JSON.parse(n);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||De(t.timestamp,Qr)?null:t.detection}catch{return null}}async function je(n){let t={timestamp:new Date().toISOString(),detection:n};await L(Oe,t)}var Vr,Oe,Qr,Fe=N(()=>{"use strict";Nt();M();Vr=Le.join(Kr.homedir(),".prjct-cli","cache"),Oe=Le.join(Vr,"providers.json"),Qr=10*60*1e3;c(Me,"readProviderCache");c(je,"writeProviderCache")});var dt={};fe(dt,{ClaudeProvider:()=>lt,CursorProvider:()=>$e,GeminiProvider:()=>It,Providers:()=>tt,detectAllProviders:()=>Dt,detectAntigravity:()=>ss,detectCodex:()=>He,detectProvider:()=>Ct,getActiveProvider:()=>es,getProviderBranding:()=>rs,selectProvider:()=>ns,validateCliVersion:()=>Be});import j from"node:os";import C from"node:path";async function Ge(n){try{let{stdout:t}=await k(`which ${n}`,{timeout:2e3});return t.trim()}catch{return null}}async function ts(n){try{let{stdout:t}=await k(`${n} --version`,{timeout:2e3}),e=t.match(/\d+\.\d+\.\d+/);return e?e[0]:t.trim()}catch{return null}}async function Ct(n){let t=tt[n];if(!t.cliCommand)return{installed:!1};let e=await Ge(t.cliCommand);if(!e)return{installed:!1};let r=await ts(t.cliCommand),s=Be(n,r||void 0);return{installed:!0,version:r||void 0,path:e,versionWarning:s||void 0}}function Be(n,t){let e=tt[n];return!e.minCliVersion||!t?null:Ce(t,e.minCliVersion)<0?`\u26A0\uFE0F ${e.displayName} v${t} is below minimum v${e.minCliVersion}. Some features may not work correctly.`:null}async function Dt(n=!1){if(!n){let o=await Me();if(o)return o}let[t,e,r]=await Promise.all([Ct("claude"),Ct("gemini"),He()]),s={installed:r.installed},i={claude:t,gemini:e,codex:s};return await je(i).catch(()=>{}),i}async function es(n){if(n&&tt[n])return tt[n];let t=await Dt();return t.claude.installed&&!t.gemini.installed?lt:t.gemini.installed&&!t.claude.installed?It:lt}function rs(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function ss(){let n=Xe.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=C.join(n,"skills","prjct","SKILL.md"),[e,r]=await Promise.all([_(n),_(t)]);return{installed:e,skillInstalled:r,configPath:e?n:void 0}}async function He(){let n=We.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=await Ge("codex"),e=C.join(n,"skills","prjct","SKILL.md"),r=await _(e),s=!!t;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}async function ns(){let n=await Dt(),t=n.claude.installed,e=n.gemini.installed;return!t&&!e?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var lt,It,Xe,$e,Zr,We,tt,pt=N(()=>{"use strict";Ne();At();B();M();Fe();lt={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:C.join(j.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:C.join(j.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},It={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:C.join(j.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:C.join(j.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Xe={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:C.join(j.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:C.join(j.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},$e={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Zr={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},We={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:C.join(j.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:C.join(j.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},tt={claude:lt,gemini:It,cursor:$e,antigravity:Xe,windsurf:Zr,codex:We};c(Ge,"whichCommand");c(ts,"getCliVersion");c(Ct,"detectProvider");c(Be,"validateCliVersion");c(Dt,"detectAllProviders");c(es,"getActiveProvider");c(rs,"getProviderBranding");c(ss,"detectAntigravity");c(He,"detectCodex");c(ns,"selectProvider")});var Mt={};fe(Mt,{default:()=>is,worktreeService:()=>Ye});import Lt from"node:fs/promises";import I from"node:path";var qe,Ot,Ye,is,jt=N(()=>{"use strict";B();M();qe=".worktrees",Ot=class{static{c(this,"WorktreeService")}async create(t,e,r={}){let s=await this.getMainWorktree(t),i=I.join(s,qe,e),o=r.branch||`feat/${e}`;await Lt.mkdir(I.join(s,qe),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await k(`git worktree add "${i}" -b "${o}"${a}`,{cwd:s});let{stdout:u}=await k("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:u.trim(),isMain:!1,slug:e}}async remove(t,e=!1){let r=await this.getMainWorktree(t),s;if(e)try{let{stdout:i}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t});s=i.trim()}catch{}if(await k(`git worktree remove "${t}" --force`,{cwd:r}),e&&s&&s!=="main"&&s!=="master")try{await k(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(t){let e=await this.getMainWorktree(t),{stdout:r}=await k("git worktree list --porcelain",{cwd:e});return this.parsePorcelainOutput(r,e)}async detect(t){try{let{stdout:e}=await k("git rev-parse --git-common-dir",{cwd:t}),{stdout:r}=await k("git rev-parse --git-dir",{cwd:t}),s=I.resolve(t,e.trim()),i=I.resolve(t,r.trim());if(s!==i){let{stdout:o}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t}),{stdout:a}=await k("git rev-parse HEAD",{cwd:t}),{stdout:u}=await k("git rev-parse --show-toplevel",{cwd:t}),d=u.trim(),m=I.basename(d);return{path:d,branch:o.trim(),commit:a.trim(),isMain:!1,slug:m}}return null}catch{return null}}async getMainWorktree(t){try{let{stdout:r}=await k("git worktree list --porcelain",{cwd:t}),s=r.split(`
9
+ `;await X.writeFile(n,s,"utf-8")}async function _(n){try{return await X.access(n),!0}catch(t){if(R(t))return!1;throw t}}async function Pt(n){try{return(await X.stat(n)).isDirectory()}catch(t){if(R(t))return!1;throw t}}async function O(n){await X.mkdir(n,{recursive:!0})}var M=N(()=>{"use strict";_t();xe();U();c(Pe,"walkDir");c(Re,"batchProcess");c(ct,"readJson");c(L,"writeJson");c(_,"fileExists");c(Pt,"dirExists");c(O,"ensureDir")});var Ne=N(()=>{"use strict"});import{z as Z}from"zod";function Ce(n,t){let e=n.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){let i=e[s]??0,o=r[s]??0;if(i<o)return-1;if(i>o)return 1}return 0}var Rt,At=N(()=>{"use strict";Rt=Z.object({provider:Z.string(),model:Z.string(),cliVersion:Z.string().optional(),recordedAt:Z.string()});c(Ce,"compareSemver")});import{exec as Yr,execFile as zr}from"node:child_process";import{promisify as Ie}from"node:util";var k,qn,B=N(()=>{"use strict";k=Ie(Yr),qn=Ie(zr)});function De(n,t){let e=typeof n=="string"?new Date(n).getTime():n;return Date.now()-e>t}var ut,Nt=N(()=>{"use strict";c(De,"isExpired");ut=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(t={}){this.ttl=t.ttl??5e3,this.maxSize=t.maxSize??50}isValid(t){let e=this.cache.get(t);return e?Date.now()-e.timestamp<this.ttl:!1}get(t){let e=this.cache.get(t);return e?this.isValid(t)?e.data:(this.cache.delete(t),null):null}set(t,e){this.cache.set(t,{data:e,timestamp:Date.now()}),this.evictOldEntries()}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}has(t){return this.cache.has(t)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let e=Array.from(this.cache.entries()).sort((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of e)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let t=0;for(let e of this.cache.keys())this.isValid(e)||(this.cache.delete(e),t++);return t}}});import Jr from"node:fs/promises";import Kr from"node:os";import Le from"node:path";async function Me(){try{let n=await Jr.readFile(Oe,"utf-8"),t=JSON.parse(n);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||De(t.timestamp,Qr)?null:t.detection}catch{return null}}async function je(n){let t={timestamp:new Date().toISOString(),detection:n};await L(Oe,t)}var Vr,Oe,Qr,Fe=N(()=>{"use strict";Nt();M();Vr=Le.join(Kr.homedir(),".prjct-cli","cache"),Oe=Le.join(Vr,"providers.json"),Qr=10*60*1e3;c(Me,"readProviderCache");c(je,"writeProviderCache")});var dt={};fe(dt,{ClaudeProvider:()=>lt,CursorProvider:()=>$e,GeminiProvider:()=>It,Providers:()=>tt,detectAllProviders:()=>Dt,detectAntigravity:()=>ss,detectCodex:()=>He,detectProvider:()=>Ct,getActiveProvider:()=>es,getProviderBranding:()=>rs,selectProvider:()=>ns,validateCliVersion:()=>Be});import j from"node:os";import C from"node:path";async function Ge(n){try{let{stdout:t}=await k(`which ${n}`,{timeout:2e3});return t.trim()}catch{return null}}async function ts(n){try{let{stdout:t}=await k(`${n} --version`,{timeout:2e3}),e=t.match(/\d+\.\d+\.\d+/);return e?e[0]:t.trim()}catch{return null}}async function Ct(n){let t=tt[n];if(!t.cliCommand)return{installed:!1};let e=await Ge(t.cliCommand);if(!e)return{installed:!1};let r=await ts(t.cliCommand),s=Be(n,r||void 0);return{installed:!0,version:r||void 0,path:e,versionWarning:s||void 0}}function Be(n,t){let e=tt[n];return!e.minCliVersion||!t?null:Ce(t,e.minCliVersion)<0?`\u26A0\uFE0F ${e.displayName} v${t} is below minimum v${e.minCliVersion}. Some features may not work correctly.`:null}async function Dt(n=!1){if(!n){let o=await Me();if(o)return o}let[t,e,r]=await Promise.all([Ct("claude"),Ct("gemini"),He()]),s={installed:r.installed},i={claude:t,gemini:e,codex:s};return await je(i).catch(()=>{}),i}async function es(n){if(n&&tt[n])return tt[n];let t=await Dt();return t.claude.installed&&!t.gemini.installed?lt:t.gemini.installed&&!t.claude.installed?It:lt}function rs(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function ss(){let n=Xe.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=C.join(n,"skills","prjct","SKILL.md"),[e,r]=await Promise.all([_(n),_(t)]);return{installed:e,skillInstalled:r,configPath:e?n:void 0}}async function He(){let n=We.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=await Ge("codex"),e=C.join(n,"skills","prjct","SKILL.md"),r=await _(e),s=!!t;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}async function ns(){let n=await Dt(),t=n.claude.installed,e=n.gemini.installed;return!t&&!e?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var lt,It,Xe,$e,Zr,We,tt,pt=N(()=>{"use strict";Ne();At();B();M();Fe();lt={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:C.join(j.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:C.join(j.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},It={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:C.join(j.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:C.join(j.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Xe={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:C.join(j.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:C.join(j.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},$e={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Zr={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},We={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:C.join(j.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:C.join(j.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},tt={claude:lt,gemini:It,cursor:$e,antigravity:Xe,windsurf:Zr,codex:We};c(Ge,"whichCommand");c(ts,"getCliVersion");c(Ct,"detectProvider");c(Be,"validateCliVersion");c(Dt,"detectAllProviders");c(es,"getActiveProvider");c(rs,"getProviderBranding");c(ss,"detectAntigravity");c(He,"detectCodex");c(ns,"selectProvider")});var Mt={};fe(Mt,{default:()=>is,worktreeService:()=>Ye});import Lt from"node:fs/promises";import I from"node:path";var qe,Ot,Ye,is,jt=N(()=>{"use strict";B();M();qe=".worktrees",Ot=class{static{c(this,"WorktreeService")}async create(t,e,r={}){let s=await this.getMainWorktree(t),i=I.join(s,qe,e),o=r.branch||`feat/${e}`;await Lt.mkdir(I.join(s,qe),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await k(`git worktree add "${i}" -b "${o}"${a}`,{cwd:s});let{stdout:u}=await k("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:u.trim(),isMain:!1,slug:e}}async remove(t,e=!1){let r=await this.getMainWorktree(t),s;if(e)try{let{stdout:i}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t});s=i.trim()}catch{}if(await k(`git worktree remove "${t}" --force`,{cwd:r}),e&&s&&s!=="main"&&s!=="master")try{await k(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(t){let e=await this.getMainWorktree(t),{stdout:r}=await k("git worktree list --porcelain",{cwd:e});return this.parsePorcelainOutput(r,e)}async detect(t){try{let{stdout:e}=await k("git rev-parse --git-common-dir",{cwd:t}),{stdout:r}=await k("git rev-parse --git-dir",{cwd:t}),s=I.resolve(t,e.trim()),i=I.resolve(t,r.trim());if(s!==i){let{stdout:o}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t}),{stdout:a}=await k("git rev-parse HEAD",{cwd:t}),{stdout:u}=await k("git rev-parse --show-toplevel",{cwd:t}),d=u.trim(),m=I.basename(d);return{path:d,branch:o.trim(),commit:a.trim(),isMain:!1,slug:m}}return null}catch{return null}}async getMainWorktree(t){try{let{stdout:r}=await k("git worktree list --porcelain",{cwd:t}),s=r.split(`
10
10
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:e}=await k("git rev-parse --show-toplevel",{cwd:t});return e.trim()}async setup(t,e){let r=I.join(e,".env");await _(r)&&await Lt.copyFile(r,I.join(t,".env"));let s=I.join(e,".prjct"),i=I.join(t,".prjct");await _(s)&&!await _(i)&&await Lt.symlink(s,i,"dir")}async teardown(t){}async clean(t){let e=await this.list(t),r=[],s=await this.getMainWorktree(t);await k("git worktree prune",{cwd:s});for(let i of e)i.isMain||await _(i.path)||r.push(i.slug);return r}parsePorcelainOutput(t,e){let r=[],s=t.trim().split(`
11
11
 
12
12
  `);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
13
- `),a="",u="",d="",m=!1;for(let p of o)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?u=p.replace("HEAD ","").trim():p.startsWith("branch ")?d=p.replace("branch refs/heads/","").trim():p==="bare"?m=!0:p==="detached"&&(d="(detached)");if(a){let p=a===e||m;r.push({path:a,branch:d,commit:u,isMain:p,slug:p?"main":I.basename(a)})}}return r}},Ye=new Ot,is=Ye});import{StdioServerTransport as En}from"@modelcontextprotocol/sdk/server/stdio.js";import{McpServer as Tn}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as P}from"zod";_t();import Ke from"node:fs/promises";import q from"node:path";import Ut from"node:fs";import Je from"node:path";import os from"node:crypto";import D from"node:fs/promises";import H from"node:os";import h from"node:path";import{globSync as as}from"glob";import{formatDistanceToNowStrict as _n}from"date-fns";function Ee(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}c(Ee,"getYearMonthDay");function f(){return new Date().toISOString()}c(f,"getTimestamp");function ke(n){let t=new Date;return t.setDate(t.getDate()-n),t}c(ke,"getDaysAgo");M();var Ft=class{static{c(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let t=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=t?h.resolve(t):h.join(H.homedir(),".prjct-cli"),this.globalProjectsDir=h.join(this.globalBaseDir,"projects"),this.globalConfigDir=h.join(this.globalBaseDir,"config")}setGlobalBaseDir(t){this.globalBaseDir=h.resolve(t),this.globalProjectsDir=h.join(this.globalBaseDir,"projects"),this.globalConfigDir=h.join(this.globalBaseDir,"config")}generateProjectId(t){return os.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(t){return h.join(this.globalProjectsDir,t)}getLocalConfigPath(t){return h.join(t,".prjct","prjct.config.json")}getGlobalProjectConfigPath(t){return h.join(this.getGlobalProjectPath(t),"project.json")}getLegacyPrjctPath(t){return h.join(t,".prjct")}async hasLegacyStructure(t){let e=this.getLegacyPrjctPath(t);return await Pt(e)}async hasConfig(t){let e=this.getLocalConfigPath(t);return await _(e)}async ensureGlobalStructure(){await O(this.globalBaseDir),await O(this.globalProjectsDir),await O(this.globalConfigDir)}async ensureProjectStructure(t){await this.ensureGlobalStructure();let e=this.getGlobalProjectPath(t),r=["core","progress","planning","analysis","memory"];for(let s of r)await O(h.join(e,s));return await O(h.join(e,"planning","tasks")),await O(h.join(e,"sessions")),e}getSessionPath(t,e=new Date){let{year:r,month:s,day:i}=Ee(e);return h.join(this.getGlobalProjectPath(t),"sessions",r,s,i)}getCurrentSessionPath(t){return this.getSessionPath(t,new Date)}async ensureSessionPath(t,e=new Date){let r=this.getSessionPath(t,e);return await O(r),r}async listSessions(t,e=null,r=null){let s=h.join(this.getGlobalProjectPath(t),"sessions"),i=[];try{let o=await D.readdir(s,{withFileTypes:!0});for(let a of o){if(!a.isDirectory()||e&&a.name!==e.toString())continue;let u=h.join(s,a.name),d=await D.readdir(u,{withFileTypes:!0});for(let m of d){if(!m.isDirectory()||r&&m.name!==r.toString().padStart(2,"0"))continue;let p=h.join(u,m.name),g=await D.readdir(p,{withFileTypes:!0});for(let T of g)T.isDirectory()&&i.push({year:a.name,month:m.name,day:T.name,path:h.join(p,T.name),date:new Date(`${a.name}-${m.name}-${T.name}`)})}}return i.sort((a,u)=>u.date.getTime()-a.date.getTime()),i}catch{return[]}}async getSessionsInRange(t,e,r=new Date){return(await this.listSessions(t)).filter(i=>i.date>=e&&i.date<=r)}getFilePath(t,e,r){return h.join(this.getGlobalProjectPath(t),e,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await D.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}async projectExists(t){let e=this.getGlobalProjectPath(t);return await Pt(e)}getDisplayPath(t){let e=H.homedir();return t.startsWith(e)?t.replace(e,"~"):t}getAuthConfigPath(){return h.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(t){return h.join(this.getGlobalProjectPath(t),"sync","pending.json")}getLastSyncPath(t){return h.join(this.getGlobalProjectPath(t),"sync","last-sync.json")}getRunningStatusPath(){return h.join(this.globalBaseDir,".running")}getDocsPath(){return h.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(pt(),vt(dt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let t=await(pt(),vt(dt)).getActiveProvider();return(pt(),vt(dt)).getGlobalSettingsPath(t.name)}getClaudeDir(){return h.join(H.homedir(),".claude")}getClaudeSettingsPath(){return h.join(this.getClaudeDir(),"settings.json")}getStoragePath(t,e){return h.join(this.getGlobalProjectPath(t),"storage",e)}getContextPath(t){return h.join(this.getGlobalProjectPath(t),"context")}async getWikiPath(t,e){if(e&&e.trim().length>0)return this.resolveVaultOverride(t,e);let r=await this.resolveProjectRootPath(t),i=h.basename(h.resolve(r)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return h.join(H.homedir(),"Documents","prjct",i)}async resolveProjectRootPath(t){try{let{worktreeService:e}=await Promise.resolve().then(()=>(jt(),Mt));return await e.detect(t)&&await e.getMainWorktree(t)||t}catch{return t}}getWikiPathWithProjectHash(t,e){let s=h.basename(h.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",i=e.replace(/-/g,"").slice(0,8);return h.join(H.homedir(),"Documents","prjct",`${s}-${i}`)}getLegacyWikiPath(t){return h.join(t,".prjct","wiki")}resolveVaultOverride(t,e){let r=e.trim();return(r.startsWith("~/")||r==="~")&&(r=h.join(H.homedir(),r.slice(1))),h.isAbsolute(r)||(r=h.resolve(t,r)),r}async detectMonorepo(t){let e={isMonorepo:!1,type:null,rootPath:t,packages:[]},r=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of r){let i=h.join(t,s.file);if(await _(i)){e.isMonorepo=!0,e.type=s.type;break}}if(!e.isMonorepo){let s=h.join(t,"package.json");if(await _(s))try{let i=await D.readFile(s,"utf-8");JSON.parse(i).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await this.discoverMonorepoPackages(t,e.type)),e}async discoverMonorepoPackages(t,e){let r=[],s=[];try{if(e==="pnpm"){let o=(await D.readFile(h.join(t,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(s=o[1].split(`
13
+ `),a="",u="",d="",m=!1;for(let p of o)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?u=p.replace("HEAD ","").trim():p.startsWith("branch ")?d=p.replace("branch refs/heads/","").trim():p==="bare"?m=!0:p==="detached"&&(d="(detached)");if(a){let p=a===e||m;r.push({path:a,branch:d,commit:u,isMain:p,slug:p?"main":I.basename(a)})}}return r}},Ye=new Ot,is=Ye});import{StdioServerTransport as kn}from"@modelcontextprotocol/sdk/server/stdio.js";import{McpServer as yn}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as P}from"zod";_t();import Ke from"node:fs/promises";import q from"node:path";import Ut from"node:fs";import Je from"node:path";import os from"node:crypto";import D from"node:fs/promises";import H from"node:os";import h from"node:path";import{globSync as as}from"glob";import{formatDistanceToNowStrict as xn}from"date-fns";function Ee(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}c(Ee,"getYearMonthDay");function f(){return new Date().toISOString()}c(f,"getTimestamp");function ke(n){let t=new Date;return t.setDate(t.getDate()-n),t}c(ke,"getDaysAgo");M();var Ft=class{static{c(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let t=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=t?h.resolve(t):h.join(H.homedir(),".prjct-cli"),this.globalProjectsDir=h.join(this.globalBaseDir,"projects"),this.globalConfigDir=h.join(this.globalBaseDir,"config")}setGlobalBaseDir(t){this.globalBaseDir=h.resolve(t),this.globalProjectsDir=h.join(this.globalBaseDir,"projects"),this.globalConfigDir=h.join(this.globalBaseDir,"config")}generateProjectId(t){return os.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(t){return h.join(this.globalProjectsDir,t)}getLocalConfigPath(t){return h.join(t,".prjct","prjct.config.json")}getGlobalProjectConfigPath(t){return h.join(this.getGlobalProjectPath(t),"project.json")}getLegacyPrjctPath(t){return h.join(t,".prjct")}async hasLegacyStructure(t){let e=this.getLegacyPrjctPath(t);return await Pt(e)}async hasConfig(t){let e=this.getLocalConfigPath(t);return await _(e)}async ensureGlobalStructure(){await O(this.globalBaseDir),await O(this.globalProjectsDir),await O(this.globalConfigDir)}async ensureProjectStructure(t){await this.ensureGlobalStructure();let e=this.getGlobalProjectPath(t),r=["core","progress","planning","analysis","memory"];for(let s of r)await O(h.join(e,s));return await O(h.join(e,"planning","tasks")),await O(h.join(e,"sessions")),e}getSessionPath(t,e=new Date){let{year:r,month:s,day:i}=Ee(e);return h.join(this.getGlobalProjectPath(t),"sessions",r,s,i)}getCurrentSessionPath(t){return this.getSessionPath(t,new Date)}async ensureSessionPath(t,e=new Date){let r=this.getSessionPath(t,e);return await O(r),r}async listSessions(t,e=null,r=null){let s=h.join(this.getGlobalProjectPath(t),"sessions"),i=[];try{let o=await D.readdir(s,{withFileTypes:!0});for(let a of o){if(!a.isDirectory()||e&&a.name!==e.toString())continue;let u=h.join(s,a.name),d=await D.readdir(u,{withFileTypes:!0});for(let m of d){if(!m.isDirectory()||r&&m.name!==r.toString().padStart(2,"0"))continue;let p=h.join(u,m.name),g=await D.readdir(p,{withFileTypes:!0});for(let T of g)T.isDirectory()&&i.push({year:a.name,month:m.name,day:T.name,path:h.join(p,T.name),date:new Date(`${a.name}-${m.name}-${T.name}`)})}}return i.sort((a,u)=>u.date.getTime()-a.date.getTime()),i}catch{return[]}}async getSessionsInRange(t,e,r=new Date){return(await this.listSessions(t)).filter(i=>i.date>=e&&i.date<=r)}getFilePath(t,e,r){return h.join(this.getGlobalProjectPath(t),e,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await D.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}async projectExists(t){let e=this.getGlobalProjectPath(t);return await Pt(e)}getDisplayPath(t){let e=H.homedir();return t.startsWith(e)?t.replace(e,"~"):t}getAuthConfigPath(){return h.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(t){return h.join(this.getGlobalProjectPath(t),"sync","pending.json")}getLastSyncPath(t){return h.join(this.getGlobalProjectPath(t),"sync","last-sync.json")}getRunningStatusPath(){return h.join(this.globalBaseDir,".running")}getDocsPath(){return h.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(pt(),vt(dt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let t=await(pt(),vt(dt)).getActiveProvider();return(pt(),vt(dt)).getGlobalSettingsPath(t.name)}getClaudeDir(){return h.join(H.homedir(),".claude")}getClaudeSettingsPath(){return h.join(this.getClaudeDir(),"settings.json")}getStoragePath(t,e){return h.join(this.getGlobalProjectPath(t),"storage",e)}getContextPath(t){return h.join(this.getGlobalProjectPath(t),"context")}async getWikiPath(t,e){if(e&&e.trim().length>0)return this.resolveVaultOverride(t,e);let r=await this.resolveProjectRootPath(t),i=h.basename(h.resolve(r)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return h.join(H.homedir(),"Documents","prjct",i)}async resolveProjectRootPath(t){try{let{worktreeService:e}=await Promise.resolve().then(()=>(jt(),Mt));return await e.detect(t)&&await e.getMainWorktree(t)||t}catch{return t}}getWikiPathWithProjectHash(t,e){let s=h.basename(h.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",i=e.replace(/-/g,"").slice(0,8);return h.join(H.homedir(),"Documents","prjct",`${s}-${i}`)}getLegacyWikiPath(t){return h.join(t,".prjct","wiki")}resolveVaultOverride(t,e){let r=e.trim();return(r.startsWith("~/")||r==="~")&&(r=h.join(H.homedir(),r.slice(1))),h.isAbsolute(r)||(r=h.resolve(t,r)),r}async detectMonorepo(t){let e={isMonorepo:!1,type:null,rootPath:t,packages:[]},r=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of r){let i=h.join(t,s.file);if(await _(i)){e.isMonorepo=!0,e.type=s.type;break}}if(!e.isMonorepo){let s=h.join(t,"package.json");if(await _(s))try{let i=await D.readFile(s,"utf-8");JSON.parse(i).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await this.discoverMonorepoPackages(t,e.type)),e}async discoverMonorepoPackages(t,e){let r=[],s=[];try{if(e==="pnpm"){let o=(await D.readFile(h.join(t,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(s=o[1].split(`
14
14
  `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let i=h.join(t,"package.json"),o=await D.readFile(i,"utf-8"),a=JSON.parse(o);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),e==="lerna"){let u=h.join(t,"lerna.json");if(await _(u)){let d=await D.readFile(u,"utf-8"),m=JSON.parse(d);m.packages&&(s=m.packages)}}}else if(e==="nx")s=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let i=h.join(t,"package.json"),o=await D.readFile(i,"utf-8"),a=JSON.parse(o);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let i of s){if(i.startsWith("!"))continue;let o=as(i,{cwd:t,absolute:!1});for(let a of o){let u=h.join(t,a),d=h.join(u,"package.json");if(await _(d))try{let m=await D.readFile(d,"utf-8"),p=JSON.parse(m),g=h.join(u,"PRJCT.md");r.push({name:p.name||h.basename(a),path:u,relativePath:a,hasPrjctMd:await _(g)})}catch{}}}}catch{}return r}async findContainingPackage(t,e){if(!e.isMonorepo)return null;let r=h.resolve(t);for(let s of e.packages){let i=h.resolve(s.path);if(r.startsWith(i))return s}return null}async findMonorepoRoot(t){let e=h.resolve(t),r=h.parse(e).root;for(;e!==r;){if((await this.detectMonorepo(e)).isMonorepo)return e;e=h.dirname(e)}return null}},cs=new Ft,w=cs;function us(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}c(us,"detectRuntime");function ze(){return us()==="bun"}c(ze,"isBun");function ls(n){if(ze()){let{Database:s}=ge("bun:sqlite");return new s(n,{create:!0})}let t=ge("better-sqlite3"),e=new t(n),r=e.exec.bind(e);return e.run=s=>r(s),e}c(ls,"openDatabase");var ds=[{version:1,name:"initial-schema",up:c(n=>{n.run(`
15
15
  -- =======================================================================
16
16
  -- Document storage (backward-compatible with JSON file pattern)
@@ -489,7 +489,7 @@ var at=Object.defineProperty;var Xr=Object.getOwnPropertyDescriptor;var $r=Objec
489
489
  applied_at TEXT NOT NULL
490
490
  )
491
491
  `);let e=new Set(t.prepare("SELECT version FROM _migrations").all().map(r=>r.version));for(let r of ds)e.has(r.version)||t.transaction(()=>{r.up(t),t.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.name,new Date().toISOString())})()}getMigrations(t){return this.getDb(t).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(t){return this.getDb(t).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},y=new Xt,E=y;M();function ms(n){let t=[],e,r=new RegExp(ye.source,"g");for(;(e=r.exec(n))!==null;){let s=e[1];(s.startsWith(".")||s.startsWith("@/"))&&t.push(s)}return t}c(ms,"extractImportSources");async function gs(n,t,e){let r;if(n.startsWith("@/"))r=q.join(e,"src",n.slice(2));else{let s=q.dirname(q.join(e,t));r=q.resolve(s,n)}for(let s of Te){let i=r+s;try{if((await Ke.stat(i)).isFile())return q.relative(e,i)}catch{}}return null}c(gs,"resolveImport");async function fs(n){let t=await Pe(n),e={},r={},s=0,i=await Re(t,50,async o=>{try{let a=await Ke.readFile(q.join(n,o),"utf-8"),u=ms(a),d=[];for(let m of u){let p=await gs(m,o,n);p&&p!==o&&d.push(p)}return d.length>0?{filePath:o,imports:d}:null}catch{return null}});for(let{filePath:o,imports:a}of i){e[o]=a,s+=a.length;for(let u of a)r[u]||(r[u]=[]),r[u].push(o)}return{forward:e,reverse:r,fileCount:t.length,edgeCount:s,builtAt:new Date().toISOString()}}c(fs,"buildGraph");function Ve(n,t,e=2){let r=new Set(n),s=new Map,i=[];for(let o of n){let a=t.forward[o]||[],u=t.reverse[o]||[];for(let d of[...a,...u])r.has(d)||i.push({file:d,depth:1})}for(;i.length>0;){let{file:o,depth:a}=i.shift();if(a>e)continue;let u=1/(a+1),d=s.get(o);if(d){u>d.score&&s.set(o,{score:u,depth:a});continue}if(s.set(o,{score:u,depth:a}),a<e){let m=t.forward[o]||[],p=t.reverse[o]||[];for(let g of[...m,...p])!r.has(g)&&!s.has(g)&&i.push({file:g,depth:a+1})}}return Array.from(s.entries()).map(([o,{score:a,depth:u}])=>({path:o,score:a,depth:u})).sort((o,a)=>a.score-o.score)}c(Ve,"scoreFromSeeds");var $t="import-graph",mt=new Map;function hs(n,t){E.setDoc(n,$t,t),mt.delete(n)}c(hs,"saveGraph");function et(n){let t=E.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",$t);if(!t)return mt.delete(n),null;let e=mt.get(n);if(e&&e.updatedAt===t.updated_at)return e.graph;let r=E.getDoc(n,$t);return r&&mt.set(n,{graph:r,updatedAt:t.updated_at}),r}c(et,"loadGraph");async function Qe(n,t){let e=await fs(n);return hs(t,e),e}c(Qe,"indexImports");function Ze(n,t){let e=[...n.added,...n.modified],r=new Set(e),s=new Set,i=et(t);if(i)for(let u of e){let d=i.reverse[u];if(d)for(let m of d)r.has(m)||s.add(m)}let o=Array.from(s),a=[...e,...o];return{directlyChanged:e,affectedByImports:o,deleted:n.deleted,allAffected:a}}c(Ze,"propagateChanges");function tr(n){let t=new Set;for(let e of n){let r=e.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(t.add("frontend"),t.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&t.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&t.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&t.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&t.add("backend")}return t}c(tr,"affectedDomains");B();async function ys(n,t=100){try{let{stdout:e}=await k(`git log --name-only --pretty=format:'---COMMIT---' -${t}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let i of e.split(`
492
- `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&Es(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}c(ys,"parseGitLog");function Es(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}c(Es,"isSourceFile");async function ks(n,t=100){let e=await ys(n,t),r=new Map,s=new Map;for(let o of e){let a=Array.from(o);for(let u of a)r.set(u,(r.get(u)||0)+1);for(let u=0;u<a.length;u++)for(let d=u+1;d<a.length;d++){let m=ws(a[u],a[d]);s.set(m,(s.get(m)||0)+1)}}let i={};for(let[o,a]of s){let[u,d]=o.split("\0"),m=r.get(u)||0,p=r.get(d)||0;if(m<2||p<2)continue;let g=m+p-a,T=g>0?a/g:0;T<.1||(i[u]||(i[u]={}),i[d]||(i[d]={}),i[u][d]=T,i[d][u]=T)}return{matrix:i,commitsAnalyzed:e.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}c(ks,"buildMatrix");function ws(n,t){return n<t?`${n}\0${t}`:`${t}\0${n}`}c(ws,"pairKey");function Gt(n,t){let e=new Set(n),r=new Map;for(let s of n){let i=t.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(e.has(o))continue;let u=r.get(o)||0;a>u&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}c(Gt,"scoreFromSeeds");var Wt="cochange-index",gt=new Map;function bs(n,t){E.setDoc(n,Wt,t),gt.delete(n)}c(bs,"saveMatrix");function Bt(n){let t=E.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Wt);if(!t)return gt.delete(n),null;let e=gt.get(n);if(e&&e.updatedAt===t.updated_at)return e.matrix;let r=E.getDoc(n,Wt);return r&&gt.set(n,{matrix:r,updatedAt:t.updated_at}),r}c(Bt,"loadMatrix");async function sr(n,t,e=100){let r=await ks(n,e);return bs(t,r),r}c(sr,"indexCoChanges");import Jt from"node:fs/promises";import As from"node:path";import*as Tt from"jsonc-parser";var Ht=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(t,e="PRJCT_ERROR"){super(t),this.name="PrjctError",this.code=e,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}};function Ss(n){return n instanceof Ht}c(Ss,"isPrjctError");function qt(n){return Ss(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}c(qt,"getErrorMessage");U();M();U();import Yt from"node:fs";import ft from"node:path";var Y=null,rt=null;function nr(){if(rt)return rt;let n=__dirname;for(let t=0;t<5;t++){let e=ft.join(n,"package.json");if(Yt.existsSync(e))try{if(JSON.parse(Yt.readFileSync(e,"utf-8")).name==="prjct-cli")return rt=n,n}catch{}n=ft.dirname(n)}return rt=ft.join(__dirname,"..","..",".."),rt}c(nr,"getPackageRoot");function vs(){if(Y)return Y;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Y=n,Y;try{let t=ft.join(nr(),"package.json");return Y=JSON.parse(Yt.readFileSync(t,"utf-8")).version,Y}catch(t){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",we(t)),"0.0.0"}}c(vs,"getVersion");var zt=vs(),Vi=nr();B();async function ht(n){try{let{stdout:t}=await k(n,{timeout:5e3});return{success:!0,output:t.trim()}}catch{return{success:!1,output:""}}}c(ht,"execCommand");async function _s(){let n=await ht("gh api user --jq .login");return n.success&&n.output||(n=await ht("git config --global github.user"),n.success&&n.output)?n.output:null}c(_s,"detectGitHubUsername");async function xs(){let n=await ht("git config user.name");return n.success&&n.output?n.output:null}c(xs,"detectGitName");async function Ps(){let n=await ht("git config user.email");return n.success&&n.output?n.output:null}c(Ps,"detectGitEmail");async function ir(){let[n,t,e]=await Promise.all([_s(),xs(),Ps()]);return{github:n,email:e,name:t||n||"Unknown"}}c(ir,"detect");function or(n){let t=[],e=Tt.parse(n,t,{allowTrailingComma:!0,disallowComments:!1});if(t.length>0){let r=t[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Tt.printParseErrorCode(r.error)}`)}return e}c(or,"parseJsonc");var Kt=class{static{c(this,"ConfigManager")}async readConfig(t){try{let e=w.getLocalConfigPath(t),r=await Jt.readFile(e,"utf-8");return or(r)}catch(e){return R(e)||console.warn(`Warning: Could not read config at ${t}: ${qt(e)}`),null}}async writeConfig(t,e){let r=w.getLocalConfigPath(t);await L(r,e)}async readGlobalConfig(t){try{let e=w.getGlobalProjectConfigPath(t),r=await Jt.readFile(e,"utf-8");return or(r)}catch(e){return R(e)||console.warn(`Warning: Could not read global config for ${t}: ${qt(e)}`),null}}async writeGlobalConfig(t,e){let r=w.getGlobalProjectConfigPath(t);await L(r,e)}async ensureGlobalConfig(t){let e=await this.readGlobalConfig(t);if(!e){let r=f();e={projectId:t,authors:[],version:zt,lastSync:r},await this.writeGlobalConfig(t,e)}return e}async createConfig(t,e){let r=w.generateProjectId(t),s=w.getGlobalProjectPath(r),i=w.getDisplayPath(s),o=f(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(t,a);let u={projectId:r,authors:[{name:e.name||"Unknown",email:e.email||"",github:e.github||"",firstContribution:o,lastActivity:o}],version:zt,created:o,lastSync:o};return await this.writeGlobalConfig(r,u),a}async updateLastSync(t){let e=await this.getProjectId(t),r=await this.readGlobalConfig(e);r&&(r.lastSync=f(),await this.writeGlobalConfig(e,r))}validateConfig(t){return!(!t||!t.projectId||!t.dataPath)}async needsMigration(t){if(!await w.hasLegacyStructure(t))return!1;if(!await w.hasConfig(t))return!0;let s=await this.readConfig(t);if(!s||!s.projectId)return!0;let i=w.getGlobalProjectPath(s.projectId);try{return(await Jt.readdir(As.join(i,"core"))).length===0}catch(o){return R(o),!0}}async getProjectId(t){let e=await this.readConfig(t);if(e?.projectId)return e.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(jt(),Mt));if(await r.detect(t)){let i=await r.getMainWorktree(t);if(i!==t){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return w.generateProjectId(t)}async findAuthor(t,e){let r=await this.readGlobalConfig(t);return!r||!r.authors?null:r.authors.find(s=>s.github===e)||null}async addAuthor(t,e){let r=await this.ensureGlobalConfig(t);if(r.authors.some(o=>o.github===e.github))return;let i=f();r.authors.push({name:e.name||"Unknown",email:e.email||"",github:e.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(t,r)}async updateAuthorActivity(t,e){let r=await this.readGlobalConfig(t);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===e);s&&(s.lastActivity=f(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(t,r))}async getCurrentAuthor(t){let e=await ir(),r=await this.getProjectId(t);return await this.addAuthor(r,{name:e.name??void 0,email:e.email??void 0,github:e.github??void 0}),e.github||e.name||"Unknown"}async isConfigured(t){let e=await this.readConfig(t);return this.validateConfig(e)}async getShowMetrics(t){return(await this.readConfig(t))?.showMetrics??!0}async setShowMetrics(t,e){let r=await this.readConfig(t);r&&(r.showMetrics=e,await this.writeConfig(t,r))}async getConfigWithDefaults(t){let e=await this.readConfig(t);if(e)return e;let r=w.generateProjectId(t);return{projectId:r,dataPath:w.getDisplayPath(w.getGlobalProjectPath(r))}}},Ns=new Kt,$=Ns;async function v(n){return $.getProjectId(n)}c(v,"resolveProjectId");function b(n,t){return async e=>{try{return await t(e)}catch(r){return Cs(r,n)}}}c(b,"safeMcpCall");function Cs(n,t){let e=n instanceof Error?n.message:String(n);return{content:[{type:"text",text:`[${t}] Error: ${e}`}],isError:!0}}c(Cs,"mcpError");function ar(n){let t=n;t.tool("prjct_impact_analysis","Given changed files, find affected files via import graph + affected domains",{projectPath:P.string().describe("Project directory path"),changedFiles:P.array(P.string()).describe("List of changed file paths (relative to project root)")},b("prjct_impact_analysis",async e=>{let r=await v(e.projectPath),s={added:[],modified:e.changedFiles,deleted:[],unchanged:[]},i=Ze(s,r),o=tr(i.allAffected),a=["## Impact Analysis"];a.push(`
492
+ `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&Es(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}c(ys,"parseGitLog");function Es(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}c(Es,"isSourceFile");async function ks(n,t=100){let e=await ys(n,t),r=new Map,s=new Map;for(let o of e){let a=Array.from(o);for(let u of a)r.set(u,(r.get(u)||0)+1);for(let u=0;u<a.length;u++)for(let d=u+1;d<a.length;d++){let m=ws(a[u],a[d]);s.set(m,(s.get(m)||0)+1)}}let i={};for(let[o,a]of s){let[u,d]=o.split("\0"),m=r.get(u)||0,p=r.get(d)||0;if(m<2||p<2)continue;let g=m+p-a,T=g>0?a/g:0;T<.1||(i[u]||(i[u]={}),i[d]||(i[d]={}),i[u][d]=T,i[d][u]=T)}return{matrix:i,commitsAnalyzed:e.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}c(ks,"buildMatrix");function ws(n,t){return n<t?`${n}\0${t}`:`${t}\0${n}`}c(ws,"pairKey");function Gt(n,t){let e=new Set(n),r=new Map;for(let s of n){let i=t.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(e.has(o))continue;let u=r.get(o)||0;a>u&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}c(Gt,"scoreFromSeeds");var Wt="cochange-index",gt=new Map;function bs(n,t){E.setDoc(n,Wt,t),gt.delete(n)}c(bs,"saveMatrix");function Bt(n){let t=E.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Wt);if(!t)return gt.delete(n),null;let e=gt.get(n);if(e&&e.updatedAt===t.updated_at)return e.matrix;let r=E.getDoc(n,Wt);return r&&gt.set(n,{matrix:r,updatedAt:t.updated_at}),r}c(Bt,"loadMatrix");async function sr(n,t,e=100){let r=await ks(n,e);return bs(t,r),r}c(sr,"indexCoChanges");import Jt from"node:fs/promises";import As from"node:path";import*as Tt from"jsonc-parser";var Ht=class extends Error{static{c(this,"PrjctError")}code;isOperational;constructor(t,e="PRJCT_ERROR"){super(t),this.name="PrjctError",this.code=e,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}};function Ss(n){return n instanceof Ht}c(Ss,"isPrjctError");function qt(n){return Ss(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}c(qt,"getErrorMessage");U();M();U();import Yt from"node:fs";import ft from"node:path";var Y=null,rt=null;function nr(){if(rt)return rt;let n=__dirname;for(let t=0;t<5;t++){let e=ft.join(n,"package.json");if(Yt.existsSync(e))try{if(JSON.parse(Yt.readFileSync(e,"utf-8")).name==="prjct-cli")return rt=n,n}catch{}n=ft.dirname(n)}return rt=ft.join(__dirname,"..","..",".."),rt}c(nr,"getPackageRoot");function vs(){if(Y)return Y;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Y=n,Y;try{let t=ft.join(nr(),"package.json");return Y=JSON.parse(Yt.readFileSync(t,"utf-8")).version,Y}catch(t){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",we(t)),"0.0.0"}}c(vs,"getVersion");var zt=vs(),Qi=nr();B();async function ht(n){try{let{stdout:t}=await k(n,{timeout:5e3});return{success:!0,output:t.trim()}}catch{return{success:!1,output:""}}}c(ht,"execCommand");async function _s(){let n=await ht("gh api user --jq .login");return n.success&&n.output||(n=await ht("git config --global github.user"),n.success&&n.output)?n.output:null}c(_s,"detectGitHubUsername");async function xs(){let n=await ht("git config user.name");return n.success&&n.output?n.output:null}c(xs,"detectGitName");async function Ps(){let n=await ht("git config user.email");return n.success&&n.output?n.output:null}c(Ps,"detectGitEmail");async function ir(){let[n,t,e]=await Promise.all([_s(),xs(),Ps()]);return{github:n,email:e,name:t||n||"Unknown"}}c(ir,"detect");function or(n){let t=[],e=Tt.parse(n,t,{allowTrailingComma:!0,disallowComments:!1});if(t.length>0){let r=t[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Tt.printParseErrorCode(r.error)}`)}return e}c(or,"parseJsonc");var Kt=class{static{c(this,"ConfigManager")}async readConfig(t){try{let e=w.getLocalConfigPath(t),r=await Jt.readFile(e,"utf-8");return or(r)}catch(e){return R(e)||console.warn(`Warning: Could not read config at ${t}: ${qt(e)}`),null}}async writeConfig(t,e){let r=w.getLocalConfigPath(t);await L(r,e)}async readGlobalConfig(t){try{let e=w.getGlobalProjectConfigPath(t),r=await Jt.readFile(e,"utf-8");return or(r)}catch(e){return R(e)||console.warn(`Warning: Could not read global config for ${t}: ${qt(e)}`),null}}async writeGlobalConfig(t,e){let r=w.getGlobalProjectConfigPath(t);await L(r,e)}async ensureGlobalConfig(t){let e=await this.readGlobalConfig(t);if(!e){let r=f();e={projectId:t,authors:[],version:zt,lastSync:r},await this.writeGlobalConfig(t,e)}return e}async createConfig(t,e){let r=w.generateProjectId(t),s=w.getGlobalProjectPath(r),i=w.getDisplayPath(s),o=f(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(t,a);let u={projectId:r,authors:[{name:e.name||"Unknown",email:e.email||"",github:e.github||"",firstContribution:o,lastActivity:o}],version:zt,created:o,lastSync:o};return await this.writeGlobalConfig(r,u),a}async updateLastSync(t){let e=await this.getProjectId(t),r=await this.readGlobalConfig(e);r&&(r.lastSync=f(),await this.writeGlobalConfig(e,r))}validateConfig(t){return!(!t||!t.projectId||!t.dataPath)}async needsMigration(t){if(!await w.hasLegacyStructure(t))return!1;if(!await w.hasConfig(t))return!0;let s=await this.readConfig(t);if(!s||!s.projectId)return!0;let i=w.getGlobalProjectPath(s.projectId);try{return(await Jt.readdir(As.join(i,"core"))).length===0}catch(o){return R(o),!0}}async getProjectId(t){let e=await this.readConfig(t);if(e?.projectId)return e.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(jt(),Mt));if(await r.detect(t)){let i=await r.getMainWorktree(t);if(i!==t){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return w.generateProjectId(t)}async findAuthor(t,e){let r=await this.readGlobalConfig(t);return!r||!r.authors?null:r.authors.find(s=>s.github===e)||null}async addAuthor(t,e){let r=await this.ensureGlobalConfig(t);if(r.authors.some(o=>o.github===e.github))return;let i=f();r.authors.push({name:e.name||"Unknown",email:e.email||"",github:e.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(t,r)}async updateAuthorActivity(t,e){let r=await this.readGlobalConfig(t);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===e);s&&(s.lastActivity=f(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(t,r))}async getCurrentAuthor(t){let e=await ir(),r=await this.getProjectId(t);return await this.addAuthor(r,{name:e.name??void 0,email:e.email??void 0,github:e.github??void 0}),e.github||e.name||"Unknown"}async isConfigured(t){let e=await this.readConfig(t);return this.validateConfig(e)}async getShowMetrics(t){return(await this.readConfig(t))?.showMetrics??!0}async setShowMetrics(t,e){let r=await this.readConfig(t);r&&(r.showMetrics=e,await this.writeConfig(t,r))}async getConfigWithDefaults(t){let e=await this.readConfig(t);if(e)return e;let r=w.generateProjectId(t);return{projectId:r,dataPath:w.getDisplayPath(w.getGlobalProjectPath(r))}}},Ns=new Kt,$=Ns;async function v(n){return $.getProjectId(n)}c(v,"resolveProjectId");function b(n,t){return async e=>{try{return await t(e)}catch(r){return Cs(r,n)}}}c(b,"safeMcpCall");function Cs(n,t){let e=n instanceof Error?n.message:String(n);return{content:[{type:"text",text:`[${t}] Error: ${e}`}],isError:!0}}c(Cs,"mcpError");function ar(n){let t=n;t.tool("prjct_impact_analysis","Given changed files, find affected files via import graph + affected domains",{projectPath:P.string().describe("Project directory path"),changedFiles:P.array(P.string()).describe("List of changed file paths (relative to project root)")},b("prjct_impact_analysis",async e=>{let r=await v(e.projectPath),s={added:[],modified:e.changedFiles,deleted:[],unchanged:[]},i=Ze(s,r),o=tr(i.allAffected),a=["## Impact Analysis"];a.push(`
493
493
  ### Directly Changed (${i.directlyChanged.length})`);for(let u of i.directlyChanged)a.push(`- ${u}`);if(i.affectedByImports.length>0){a.push(`
494
494
  ### Affected via Imports (${i.affectedByImports.length})`);for(let u of i.affectedByImports)a.push(`- ${u}`)}return a.push(`
495
495
  ### Affected Domains`),a.push(o.size>0?Array.from(o).join(", "):"none detected"),a.push(`
@@ -520,8 +520,8 @@ ${s.join(`
520
520
  \`\`\`${i}`}]}})),t.tool("prjct_history","Recent completed tasks with outcomes",{projectPath:W.string().describe("Project directory path"),limit:W.number().optional().default(10).describe("Max results")},b("prjct_history",async e=>{let r=await v(e.projectPath),s=await K.getTaskHistory(r);if(s.length===0)return{content:[{type:"text",text:"No task history."}]};let o=s.slice(-e.limit).reverse().map(u=>{let d=[`- **${u.title}**`];return u.completedAt&&d.push(`completed: ${u.completedAt}`),u.classification&&d.push(`type: ${u.classification}`),d.join(" | ")});return{content:[{type:"text",text:`## Task History (${s.length} total)
521
521
 
522
522
  ${o.join(`
523
- `)}`}]}}))}c(Sr,"registerFileTools");import{z as S}from"zod";var ne=class{static{c(this,"MemoryService")}async log(t,e,r,s){try{let i=await $.getProjectId(t);if(!i)return;E.appendEvent(i,`memory.${e}`,{...r,author:s})}catch(i){console.error(`Memory log error: ${i instanceof Error?i.message:String(i)}`)}}async getRecent(t,e=100){try{let r=await $.getProjectId(t);return r?E.query(r,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",e).reverse().map(i=>{let o=JSON.parse(i.data),{author:a,...u}=o;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:a}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async search(t,e,r=50){let s=await this.getRecent(t,1e3),i=e.toLowerCase();return s.filter(o=>{let a=o.action.toLowerCase().includes(i),u=JSON.stringify(o.data).toLowerCase().includes(i);return a||u}).slice(-r)}async getByAction(t,e,r=50){try{let s=await $.getProjectId(t);return s?E.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${e}`,r).reverse().map(o=>{let a=JSON.parse(o.data),{author:u,...d}=a;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:d,author:u}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(t){try{let e=await $.getProjectId(t);if(!e)return;E.run(e,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(e){console.error(`Memory clear error: ${e instanceof Error?e.message:String(e)}`)}}async getRecentEvents(t,e=100){try{return E.query(t,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",e).reverse().map(s=>{let i=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...i}})}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async capEntries(t){try{let r=E.get(t,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r<=nt.MEMORY_MAX_ENTRIES)return 0;let s=r-nt.MEMORY_MAX_ENTRIES,i=E.query(t,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);z.archiveMany(t,i.map((a,u)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||u}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let o=i[i.length-1]?.id;return o!==void 0&&E.run(t,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",o),s}catch(e){return console.error(`Memory cap error: ${e instanceof Error?e.message:String(e)}`),0}}},vr=new ne;var _r="memory.",ie="remember.",oe=`${_r}${ie}`,Da=`${_r}task.tagged`;var xr=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person"];var cn=25,un=4,ln=100;function Pr(n,t){try{return JSON.parse(n)}catch{return t}}c(Pr,"safeJson");function dn(n){let t=n.type.slice(oe.length),e=Pr(n.data,{});return{id:`mem_${n.id}`,type:t,content:e.content??"",tags:e.tags??{},rememberedAt:n.timestamp,source:e.source,provenance:e.provenance??"declared"}}c(dn,"rowToEntry");function pn(n){let t=n.data?Pr(n.data,{}):{},e=t.tags??{};return n.type&&(e.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:e,rememberedAt:n.shipped_at,source:t.taskId,provenance:"extracted"}}c(pn,"shippedRowToEntry");function mn(n,t){let e=t.toLowerCase();if(n.content.toLowerCase().includes(e))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(e))return!0;return!1}c(mn,"matchesTopic");function gn(n,t){for(let[e,r]of Object.entries(t))if(n.tags[e]!==r)return!1;return!0}c(gn,"matchesTags");var G={async remember(n,t){await vr.log(n,`${ie}${t.type}`,{content:t.content,tags:t.tags??{},source:t.source,provenance:t.provenance??"declared"})},recall(n,t={}){let e=t.limit??cn,r=Math.max(e*un,ln),s=E.query(n,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${oe}%`,r),i=E.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r),o=[...s.map(dn),...i.map(pn)];if(t.types&&t.types.length>0){let a=new Set(t.types);o=o.filter(u=>a.has(u.type))}return t.tags&&(o=o.filter(a=>gn(a,t.tags??{}))),t.topic&&(o=o.filter(a=>mn(a,t.topic))),o.sort((a,u)=>u.rememberedAt.localeCompare(a.rememberedAt)),o.slice(0,e)},similar(n,t,e=10){let r=t.toLowerCase().split(/[^a-z0-9]+/).filter(o=>o.length>3);return r.length===0?[]:G.recall(n,{limit:200}).map(o=>{let a=`${o.content} ${Object.values(o.tags).join(" ")}`.toLowerCase(),u=r.reduce((d,m)=>a.includes(m)?d+1:d,0);return{entry:o,hits:u}}).filter(o=>o.hits>0).sort((o,a)=>a.hits-o.hits).slice(0,e).map(o=>o.entry)}};function it(n){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let a of n){let u=t.get(a.type)??[];u.push(a),t.set(a.type,u)}let e=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],s={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=c((a,u)=>{if(u.length!==0){r.push(`### ${a.toUpperCase()}`);for(let d of u){let m=Object.entries(d.tags).map(([T,A])=>`${T}=${A}`).join(" "),p=m?` _(${m})_`:"",g=s[d.provenance];r.push(`- \`${g}\` [${d.id}] ${d.content}${p}`)}r.push("")}},"renderGroup"),o=new Set;for(let a of e){let u=t.get(a);!u||u.length===0||(i(a,u),o.add(a))}for(let[a,u]of t)o.has(a)||i(a,u);return r.join(`
524
- `).trim()}c(it,"formatMemoryMd");var fn=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}];function Rr(n){let t=[];for(let{name:e,re:r}of fn)r.test(n)&&t.push(e);return t}c(Rr,"scanForSecrets");var Ar=`Base types: ${xr.join(", ")}. Any lowercase identifier is accepted (e.g. "recipe", "okr").`;function Nr(n){let t=n;t.tool("prjct_mem_save",`Save a memory entry. ${Ar} Secret-like content is refused unless force=true.`,{projectPath:S.string().describe("Project directory path"),type:S.string().describe("Memory type (fact/decision/learning/... or user-defined)"),content:S.string().describe("The memory content. Freeform text."),tags:S.record(S.string(),S.string()).optional().describe('Key:value tags (e.g. {domain: "auth"})'),source:S.string().optional().describe("Task id this memory came from, if any"),force:S.boolean().optional().describe("Bypass the secret-like-content refusal. Default false.")},b("prjct_mem_save",async e=>{await v(e.projectPath);let r=e.type.toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{content:[{type:"text",text:`Invalid type '${e.type}'. Lowercase letters + dashes only. ${Ar}`}]};let s=Rr(e.content);return s.length>0&&!e.force?{content:[{type:"text",text:`Refused \u2014 content looks like a secret (${s.join(", ")}). Re-call with force=true if intentional.`}]}:(await G.remember(e.projectPath,{type:r,content:e.content,tags:e.tags??{},source:e.source}),{content:[{type:"text",text:`Saved ${r}: ${e.content.slice(0,80)}`}]})})),t.tool("prjct_mem_list","Recall memory entries. Optional filters: topic (keyword across content + tag values), types, tags, limit.",{projectPath:S.string().describe("Project directory path"),topic:S.string().optional().describe("Keyword to match over content + tag values"),types:S.array(S.string()).optional().describe("Restrict to these types"),tags:S.record(S.string(),S.string()).optional().describe("Require exact match on these k:v pairs"),limit:S.number().optional().default(25).describe("Max entries (default 25)")},b("prjct_mem_list",async e=>{let r=await v(e.projectPath),s=G.recall(r,{topic:e.topic,types:e.types,tags:e.tags,limit:e.limit});return{content:[{type:"text",text:it(s)}]}})),t.tool("prjct_mem_similar","Find memory entries similar to a free-text description. Keyword-based, best-effort.",{projectPath:S.string().describe("Project directory path"),description:S.string().describe("Free-text description to find similar memories for"),limit:S.number().optional().default(10).describe("Max results (default 10)")},b("prjct_mem_similar",async e=>{let r=await v(e.projectPath),s=G.similar(r,e.description,e.limit);return s.length===0?{content:[{type:"text",text:"No similar memories found."}]}:{content:[{type:"text",text:it(s)}]}})),t.tool("prjct_mem_forget","Remove a memory entry by id. Ids are stable \u2014 pull them from `prjct_mem_list`.",{projectPath:S.string().describe("Project directory path"),id:S.string().describe('Memory id (e.g. "mem_42" or "ship_7")')},b("prjct_mem_forget",async e=>({content:[{type:"text",text:"Forget is not implemented in the projectMemory API yet. Entries persist event-sourced \u2014 filter them out client-side, or drop the underlying event manually."}]})))}c(Nr,"registerMemoryTools");import{z as ue}from"zod";var ae=class{static{c(this,"LLMAnalysisStorage")}save(t,e){let r=y.getDb(t),s=f();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(e.commitHash??null,"active",JSON.stringify(e),e.analyzedAt)})()}getActive(t){let e=y.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return e?JSON.parse(e.analysis):null}getActiveSummary(t){let e=this.getActive(t);return e?{commitHash:e.commitHash,architectureStyle:e.architecture.style,patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,analyzedAt:e.analyzedAt}:null}isCurrent(t,e){return e?y.get(t,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===e:!1}getAllFull(t){return y.query(t,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(t,e=10){return y.query(t,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",e).map(s=>{let i=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:i.patterns.length}})}},hn=new ae,Cr=hn;var Ir={critical:0,high:1,medium:2,low:3},Dr={active:0,previously_active:1,backlog:2};function Lr(n){return[...n].sort((t,e)=>{let r=Dr[t.section]-Dr[e.section];return r!==0?r:Ir[t.priority]-Ir[e.priority]})}c(Lr,"sortBySectionAndPriority");var ce=class extends J{static{c(this,"QueueStorage")}constructor(){super("queue.json",gr)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(t){return`queue.${t}d`}async getTasks(t){return(await this.read(t)).tasks}async getActiveTasks(t){return(await this.read(t)).tasks.filter(r=>r.section==="active"&&!r.completed)}async getBacklog(t){return(await this.read(t)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(t){let e=await this.getActiveTasks(t);return Lr(e)[0]||null}async addTask(t,e){let r={...e,id:F(),createdAt:f(),completed:!1};return await this.update(t,s=>({tasks:[...s.tasks,r],lastUpdated:f()})),await this.publishEvent(t,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(t,e){let r=f(),s=e.map(i=>({...i,id:F(),createdAt:r,completed:!1}));return await this.update(t,i=>({tasks:[...i.tasks,...s],lastUpdated:r})),await this.publishEvent(t,"queue.tasks_added",{count:s.length,tasks:s.map(i=>({id:i.id,description:i.description}))}),s}async removeTask(t,e){await this.update(t,r=>({tasks:r.tasks.filter(s=>s.id!==e),lastUpdated:f()})),await this.publishEvent(t,"queue.task_removed",{taskId:e})}async completeTask(t,e){let r=null;if(await this.update(t,s=>({tasks:s.tasks.map(o=>o.id===e?(r={...o,completed:!0,completedAt:f()},r):o),lastUpdated:f()})),r){let s=r;await this.publishEvent(t,"queue.task_completed",{taskId:e,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(t,e,r){await this.update(t,s=>({tasks:s.tasks.map(i=>i.id===e?{...i,section:r}:i),lastUpdated:f()}))}async setPriority(t,e,r){await this.update(t,s=>({tasks:s.tasks.map(i=>i.id===e?{...i,priority:r}:i),lastUpdated:f()}))}async getTask(t,e){return(await this.read(t)).tasks.find(s=>s.id===e)||null}async updateTask(t,e,r){let s=null;return await this.update(t,i=>({tasks:i.tasks.map(o=>o.id===e?(s={...o,...r},s):o),lastUpdated:f()})),s&&await this.publishEvent(t,"queue.task_updated",{taskId:e}),s}async clearCompleted(t){let r=(await this.read(t)).tasks.filter(s=>s.completed).length;return await this.update(t,s=>({tasks:s.tasks.filter(i=>!i.completed),lastUpdated:f()})),r}async removeStaleCompleted(t){let e=await this.read(t),r=ke(nt.QUEUE_COMPLETED_DAYS),s=e.tasks.filter(o=>o.completed&&o.completedAt&&new Date(o.completedAt)<r);if(s.length===0)return 0;z.archiveMany(t,s.map(o=>({entityType:"queue_task",entityId:o.id,entityData:o,summary:o.description,reason:"age"})));let i=new Set(s.map(o=>o.id));return await this.update(t,o=>({tasks:o.tasks.filter(a=>!i.has(a.id)),lastUpdated:f()})),await this.publishEvent(t,"queue.stale_removed",{count:s.length}),s.length}},Or=new ce;function Mr(n){let t=n;t.tool("prjct_task_status","Current task, duration, subtasks, and queue",{projectPath:ue.string().describe("Project directory path")},b("prjct_task_status",async e=>{let r=await v(e.projectPath),s=await K.getCurrentTask(r),i=await Or.getActiveTasks(r),o=[];if(s?(o.push(`## Active Task
523
+ `)}`}]}}))}c(Sr,"registerFileTools");import{z as S}from"zod";var ne=class{static{c(this,"MemoryService")}async log(t,e,r,s){try{let i=await $.getProjectId(t);if(!i)return;E.appendEvent(i,`memory.${e}`,{...r,author:s})}catch(i){console.error(`Memory log error: ${i instanceof Error?i.message:String(i)}`)}}async getRecent(t,e=100){try{let r=await $.getProjectId(t);return r?E.query(r,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",e).reverse().map(i=>{let o=JSON.parse(i.data),{author:a,...u}=o;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:a}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async search(t,e,r=50){let s=await this.getRecent(t,1e3),i=e.toLowerCase();return s.filter(o=>{let a=o.action.toLowerCase().includes(i),u=JSON.stringify(o.data).toLowerCase().includes(i);return a||u}).slice(-r)}async getByAction(t,e,r=50){try{let s=await $.getProjectId(t);return s?E.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${e}`,r).reverse().map(o=>{let a=JSON.parse(o.data),{author:u,...d}=a;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:d,author:u}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(t){try{let e=await $.getProjectId(t);if(!e)return;E.run(e,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(e){console.error(`Memory clear error: ${e instanceof Error?e.message:String(e)}`)}}async getRecentEvents(t,e=100){try{return E.query(t,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",e).reverse().map(s=>{let i=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...i}})}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async capEntries(t){try{let r=E.get(t,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r<=nt.MEMORY_MAX_ENTRIES)return 0;let s=r-nt.MEMORY_MAX_ENTRIES,i=E.query(t,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);z.archiveMany(t,i.map((a,u)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||u}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let o=i[i.length-1]?.id;return o!==void 0&&E.run(t,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",o),s}catch(e){return console.error(`Memory cap error: ${e instanceof Error?e.message:String(e)}`),0}}},vr=new ne;var _r="memory.",ie="remember.",oe=`${_r}${ie}`,La=`${_r}task.tagged`;var xr=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person"];var cn=25,un=4,ln=100;function Pr(n,t){try{return JSON.parse(n)}catch{return t}}c(Pr,"safeJson");function dn(n){let t=n.type.slice(oe.length),e=Pr(n.data,{});return{id:`mem_${n.id}`,type:t,content:e.content??"",tags:e.tags??{},rememberedAt:n.timestamp,source:e.source,provenance:e.provenance??"declared"}}c(dn,"rowToEntry");function pn(n){let t=n.data?Pr(n.data,{}):{},e=t.tags??{};return n.type&&(e.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:e,rememberedAt:n.shipped_at,source:t.taskId,provenance:"extracted"}}c(pn,"shippedRowToEntry");function mn(n,t){let e=t.toLowerCase();if(n.content.toLowerCase().includes(e))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(e))return!0;return!1}c(mn,"matchesTopic");function gn(n,t){for(let[e,r]of Object.entries(t))if(n.tags[e]!==r)return!1;return!0}c(gn,"matchesTags");function fn(n){let t=new Set,e=[];for(let r of n){let s=r.tags.key;if(!s){e.push(r);continue}let i=`${r.type}::${s}`;t.has(i)||(t.add(i),e.push(r))}return e}c(fn,"dedupeLatestByKey");var G={async remember(n,t){await vr.log(n,`${ie}${t.type}`,{content:t.content,tags:t.tags??{},source:t.source,provenance:t.provenance??"declared"})},recall(n,t={}){let e=t.limit??cn,r=Math.max(e*un,ln),s=E.query(n,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${oe}%`,r),i=E.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r),o=[...s.map(dn),...i.map(pn)];if(t.types&&t.types.length>0){let a=new Set(t.types);o=o.filter(u=>a.has(u.type))}return t.tags&&(o=o.filter(a=>gn(a,t.tags??{}))),t.topic&&(o=o.filter(a=>mn(a,t.topic))),o.sort((a,u)=>u.rememberedAt.localeCompare(a.rememberedAt)),t.dedupeByKey!==!1&&(o=fn(o)),o.slice(0,e)},similar(n,t,e=10){let r=t.toLowerCase().split(/[^a-z0-9]+/).filter(o=>o.length>3);return r.length===0?[]:G.recall(n,{limit:200}).map(o=>{let a=`${o.content} ${Object.values(o.tags).join(" ")}`.toLowerCase(),u=r.reduce((d,m)=>a.includes(m)?d+1:d,0);return{entry:o,hits:u}}).filter(o=>o.hits>0).sort((o,a)=>a.hits-o.hits).slice(0,e).map(o=>o.entry)}};function it(n){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let a of n){let u=t.get(a.type)??[];u.push(a),t.set(a.type,u)}let e=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],r=[],s={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=c((a,u)=>{if(u.length!==0){r.push(`### ${a.toUpperCase()}`);for(let d of u){let m=Object.entries(d.tags).map(([T,A])=>`${T}=${A}`).join(" "),p=m?` _(${m})_`:"",g=s[d.provenance];r.push(`- \`${g}\` [${d.id}] ${d.content}${p}`)}r.push("")}},"renderGroup"),o=new Set;for(let a of e){let u=t.get(a);!u||u.length===0||(i(a,u),o.add(a))}for(let[a,u]of t)o.has(a)||i(a,u);return r.join(`
524
+ `).trim()}c(it,"formatMemoryMd");var hn=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}];function Rr(n){let t=[];for(let{name:e,re:r}of hn)r.test(n)&&t.push(e);return t}c(Rr,"scanForSecrets");var Ar=`Base types: ${xr.join(", ")}. Any lowercase identifier is accepted (e.g. "recipe", "okr").`;function Nr(n){let t=n;t.tool("prjct_mem_save",`Save a memory entry. ${Ar} Secret-like content is refused unless force=true.`,{projectPath:S.string().describe("Project directory path"),type:S.string().describe("Memory type (fact/decision/learning/... or user-defined)"),content:S.string().describe("The memory content. Freeform text."),tags:S.record(S.string(),S.string()).optional().describe('Key:value tags (e.g. {domain: "auth"})'),source:S.string().optional().describe("Task id this memory came from, if any"),force:S.boolean().optional().describe("Bypass the secret-like-content refusal. Default false.")},b("prjct_mem_save",async e=>{await v(e.projectPath);let r=e.type.toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{content:[{type:"text",text:`Invalid type '${e.type}'. Lowercase letters + dashes only. ${Ar}`}]};let s=Rr(e.content);return s.length>0&&!e.force?{content:[{type:"text",text:`Refused \u2014 content looks like a secret (${s.join(", ")}). Re-call with force=true if intentional.`}]}:(await G.remember(e.projectPath,{type:r,content:e.content,tags:e.tags??{},source:e.source}),{content:[{type:"text",text:`Saved ${r}: ${e.content.slice(0,80)}`}]})})),t.tool("prjct_mem_list","Recall memory entries. Optional filters: topic (keyword across content + tag values), types, tags, limit.",{projectPath:S.string().describe("Project directory path"),topic:S.string().optional().describe("Keyword to match over content + tag values"),types:S.array(S.string()).optional().describe("Restrict to these types"),tags:S.record(S.string(),S.string()).optional().describe("Require exact match on these k:v pairs"),limit:S.number().optional().default(25).describe("Max entries (default 25)")},b("prjct_mem_list",async e=>{let r=await v(e.projectPath),s=G.recall(r,{topic:e.topic,types:e.types,tags:e.tags,limit:e.limit});return{content:[{type:"text",text:it(s)}]}})),t.tool("prjct_mem_similar","Find memory entries similar to a free-text description. Keyword-based, best-effort.",{projectPath:S.string().describe("Project directory path"),description:S.string().describe("Free-text description to find similar memories for"),limit:S.number().optional().default(10).describe("Max results (default 10)")},b("prjct_mem_similar",async e=>{let r=await v(e.projectPath),s=G.similar(r,e.description,e.limit);return s.length===0?{content:[{type:"text",text:"No similar memories found."}]}:{content:[{type:"text",text:it(s)}]}})),t.tool("prjct_mem_forget","Remove a memory entry by id. Ids are stable \u2014 pull them from `prjct_mem_list`.",{projectPath:S.string().describe("Project directory path"),id:S.string().describe('Memory id (e.g. "mem_42" or "ship_7")')},b("prjct_mem_forget",async e=>({content:[{type:"text",text:"Forget is not implemented in the projectMemory API yet. Entries persist event-sourced \u2014 filter them out client-side, or drop the underlying event manually."}]})))}c(Nr,"registerMemoryTools");import{z as ue}from"zod";var ae=class{static{c(this,"LLMAnalysisStorage")}save(t,e){let r=y.getDb(t),s=f();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(e.commitHash??null,"active",JSON.stringify(e),e.analyzedAt)})()}getActive(t){let e=y.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return e?JSON.parse(e.analysis):null}getActiveSummary(t){let e=this.getActive(t);return e?{commitHash:e.commitHash,architectureStyle:e.architecture.style,patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,analyzedAt:e.analyzedAt}:null}isCurrent(t,e){return e?y.get(t,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===e:!1}getAllFull(t){return y.query(t,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(t,e=10){return y.query(t,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",e).map(s=>{let i=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:i.patterns.length}})}},Tn=new ae,Cr=Tn;var Ir={critical:0,high:1,medium:2,low:3},Dr={active:0,previously_active:1,backlog:2};function Lr(n){return[...n].sort((t,e)=>{let r=Dr[t.section]-Dr[e.section];return r!==0?r:Ir[t.priority]-Ir[e.priority]})}c(Lr,"sortBySectionAndPriority");var ce=class extends J{static{c(this,"QueueStorage")}constructor(){super("queue.json",gr)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(t){return`queue.${t}d`}async getTasks(t){return(await this.read(t)).tasks}async getActiveTasks(t){return(await this.read(t)).tasks.filter(r=>r.section==="active"&&!r.completed)}async getBacklog(t){return(await this.read(t)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(t){let e=await this.getActiveTasks(t);return Lr(e)[0]||null}async addTask(t,e){let r={...e,id:F(),createdAt:f(),completed:!1};return await this.update(t,s=>({tasks:[...s.tasks,r],lastUpdated:f()})),await this.publishEvent(t,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(t,e){let r=f(),s=e.map(i=>({...i,id:F(),createdAt:r,completed:!1}));return await this.update(t,i=>({tasks:[...i.tasks,...s],lastUpdated:r})),await this.publishEvent(t,"queue.tasks_added",{count:s.length,tasks:s.map(i=>({id:i.id,description:i.description}))}),s}async removeTask(t,e){await this.update(t,r=>({tasks:r.tasks.filter(s=>s.id!==e),lastUpdated:f()})),await this.publishEvent(t,"queue.task_removed",{taskId:e})}async completeTask(t,e){let r=null;if(await this.update(t,s=>({tasks:s.tasks.map(o=>o.id===e?(r={...o,completed:!0,completedAt:f()},r):o),lastUpdated:f()})),r){let s=r;await this.publishEvent(t,"queue.task_completed",{taskId:e,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(t,e,r){await this.update(t,s=>({tasks:s.tasks.map(i=>i.id===e?{...i,section:r}:i),lastUpdated:f()}))}async setPriority(t,e,r){await this.update(t,s=>({tasks:s.tasks.map(i=>i.id===e?{...i,priority:r}:i),lastUpdated:f()}))}async getTask(t,e){return(await this.read(t)).tasks.find(s=>s.id===e)||null}async updateTask(t,e,r){let s=null;return await this.update(t,i=>({tasks:i.tasks.map(o=>o.id===e?(s={...o,...r},s):o),lastUpdated:f()})),s&&await this.publishEvent(t,"queue.task_updated",{taskId:e}),s}async clearCompleted(t){let r=(await this.read(t)).tasks.filter(s=>s.completed).length;return await this.update(t,s=>({tasks:s.tasks.filter(i=>!i.completed),lastUpdated:f()})),r}async removeStaleCompleted(t){let e=await this.read(t),r=ke(nt.QUEUE_COMPLETED_DAYS),s=e.tasks.filter(o=>o.completed&&o.completedAt&&new Date(o.completedAt)<r);if(s.length===0)return 0;z.archiveMany(t,s.map(o=>({entityType:"queue_task",entityId:o.id,entityData:o,summary:o.description,reason:"age"})));let i=new Set(s.map(o=>o.id));return await this.update(t,o=>({tasks:o.tasks.filter(a=>!i.has(a.id)),lastUpdated:f()})),await this.publishEvent(t,"queue.stale_removed",{count:s.length}),s.length}},Or=new ce;function Mr(n){let t=n;t.tool("prjct_task_status","Current task, duration, subtasks, and queue",{projectPath:ue.string().describe("Project directory path")},b("prjct_task_status",async e=>{let r=await v(e.projectPath),s=await K.getCurrentTask(r),i=await Or.getActiveTasks(r),o=[];if(s?(o.push(`## Active Task
525
525
  **${s.description}**`),s.branch&&o.push(`Branch: ${s.branch}`),o.push(`Started: ${s.startedAt}`)):o.push("No active task."),i.length>0){o.push(`
526
526
  ## Queue (${i.length} tasks)`);for(let a of i.slice(0,10))o.push(`- ${a.description} [${a.priority||"medium"}]`)}return{content:[{type:"text",text:o.join(`
527
527
  `)}]}})),t.tool("prjct_analysis","LLM analysis: stack, patterns, anti-patterns, conventions",{projectPath:ue.string().describe("Project directory path")},b("prjct_analysis",async e=>{let r=await v(e.projectPath),s=Cr.getActive(r);if(!s)return{content:[{type:"text",text:"No analysis available. Run `prjct sync`."}]};let i=["## Project Analysis"];if(s.stack&&(i.push(`
@@ -541,7 +541,7 @@ Active task: **${s.description}**`),o.push(`Started: ${s.startedAt}`)):o.push(`
541
541
  No active task.`);let a=i.filter(u=>u.enabled);if(a.length>0){o.push(`
542
542
  ### Active Rules (${a.length})`);for(let u of a)o.push(`- [${u.type}] ${u.command}:${u.position} \u2192 ${u.action}`)}else o.push(`
543
543
  No active workflow rules.`);return{content:[{type:"text",text:o.join(`
544
- `)}]}}))}c(jr,"registerWorkflowTools");var yn=`# prjct \u2014 persona-aware context broker
544
+ `)}]}}))}c(jr,"registerWorkflowTools");var En=`# prjct \u2014 persona-aware context broker
545
545
 
546
546
  Use when you want prior project memory, state, or a registered workflow. You decide whether any of it is relevant to the current turn.
547
547
 
@@ -556,4 +556,4 @@ Use when you want prior project memory, state, or a registered workflow. You dec
556
556
  - Memory is best-effort \u2014 never assume recall returned everything; it's a query, not a lookup.
557
557
  - Topic keys are free-form strings; don't invent new vocabularies when existing ones fit.
558
558
  - Not every project defines every memory type \u2014 if one is empty, that's fine.
559
- - Saving a secret-looking string is refused by default. Re-save with a scrubbed version.`;function Fr(){let n=new Tn({name:"prjct",version:"1.0.0"},{instructions:yn});return Nr(n),Mr(n),Sr(n),jr(n),ar(n),n}c(Fr,"createServer");async function kn(){let n=Fr(),t=new En;await n.connect(t)}c(kn,"main");kn().catch(n=>{console.error("prjct MCP server failed:",n),process.exit(1)});
559
+ - Saving a secret-looking string is refused by default. Re-save with a scrubbed version.`;function Fr(){let n=new yn({name:"prjct",version:"1.0.0"},{instructions:En});return Nr(n),Mr(n),Sr(n),jr(n),ar(n),n}c(Fr,"createServer");async function wn(){let n=Fr(),t=new kn;await n.connect(t)}c(wn,"main");wn().catch(n=>{console.error("prjct MCP server failed:",n),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.5.0",
3
+ "version": "2.7.0",
4
4
  "description": "Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {