prjct-cli 2.2.4 → 2.2.5

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.
@@ -5,7 +5,8 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var ct=Object.defineProperty;var Br=Object.getOwnPropertyDescriptor;var Hr=Object.getOwnPropertyNames;var qr=Object.prototype.hasOwnProperty;var c=(n,t)=>ct(n,"name",{value:t,configurable:!0}),me=(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 C=(n,t)=>()=>(n&&(t=n(n=0)),t);var ge=(n,t)=>{for(var e in t)ct(n,e,{get:t[e],enumerable:!0})},zr=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Hr(t))!qr.call(n,s)&&s!==e&&ct(n,s,{get:()=>t[s],enumerable:!(r=Br(t,s))||r.enumerable});return n};var vt=n=>zr(ct({},"__esModule",{value:!0}),n);var fe,he,ye,_t=C(()=>{"use strict";fe=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"]),he=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ye=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Jr(n){return n instanceof Error&&"code"in n}function N(n){return Jr(n)&&n.code==="ENOENT"}function ke(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var W=C(()=>{"use strict";c(Jr,"isNodeError");c(N,"isNotFoundError");c(ke,"getErrorMessage")});import Se from"node:fs/promises";async function xe(n,t){let e;try{e=await Se.readFile(n,"utf-8")}catch(o){if(N(o))return null;throw o}let r;try{r=JSON.parse(e)}catch{return await we(n,e),be(n,"Malformed JSON"),null}let s=t.safeParse(r);return s.success?r:(await we(n,e),be(n,Vr(s.error)),null)}async function we(n,t){let e=`${n}.backup`;try{await Se.writeFile(e,t,"utf-8")}catch{}}function be(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 Vr(n){return n.issues.slice(0,3).map(t=>`${t.path.join(".")}: ${t.message}`).join("; ")}var ve=C(()=>{"use strict";W();c(xe,"safeRead");c(we,"createBackup");c(be,"logCorruption");c(Vr,"formatZodError")});import G from"node:fs/promises";import Pt from"node:path";async function _e(n,t={}){let e=[],r=t.maxFiles??1/0,s=t.dotfileAllowlist?new Set(t.dotfileAllowlist):null;async function o(i){if(e.length>=r)return;let a=await G.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of a){if(e.length>=r)break;let p=String(u.name);if(fe.has(p)||t.skipDotfiles&&p.startsWith(".")&&(!s||!s.has(p)))continue;let m=Pt.join(i,p);u.isDirectory()?await o(m):u.isFile()&&e.push(Pt.relative(n,m))}}return c(o,"walk"),await o(n),e}async function Pe(n,t,e){let r=[];for(let s=0;s<n.length;s+=t){let o=await Promise.all(n.slice(s,s+t).map(e));for(let i of o)i!==null&&r.push(i)}return r}async function ut(n,t=null,e){if(e)return await xe(n,e)??t;try{let r=await G.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(N(r))return t;throw r}}async function M(n,t,e=2){let r=Pt.dirname(n);await G.mkdir(r,{recursive:!0});let s=JSON.stringify(t,null,e);await G.writeFile(n,s,"utf-8")}async function x(n){try{return await G.access(n),!0}catch(t){if(N(t))return!1;throw t}}async function Rt(n){try{return(await G.stat(n)).isDirectory()}catch(t){if(N(t))return!1;throw t}}async function F(n){await G.mkdir(n,{recursive:!0})}var U=C(()=>{"use strict";_t();ve();W();c(_e,"walkDir");c(Pe,"batchProcess");c(ut,"readJson");c(M,"writeJson");c(x,"fileExists");c(Rt,"dirExists");c(F,"ensureDir")});var Ae=C(()=>{"use strict"});import{z as D}from"zod";function Ne(n,t){let e=n.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){let o=e[s]??0,i=r[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var oo,io,ao,lt,co,At=C(()=>{"use strict";oo=D.enum(["opus","sonnet","haiku"]),io=D.enum(["2.5-pro","2.5-flash","2.0-flash"]),ao=D.string().min(1),lt=D.object({provider:D.string(),model:D.string(),cliVersion:D.string().optional(),recordedAt:D.string()}),co=D.object({preferredModel:D.string().optional(),lastAnalysisModel:lt.optional()});c(Ne,"compareSemver")});import{exec as Kr,execFile as Qr}from"node:child_process";import{promisify as Ce}from"node:util";var k,go,z=C(()=>{"use strict";k=Ce(Kr),go=Ce(Qr)});function Ie(n,t){let e=typeof n=="string"?new Date(n).getTime():n;return Date.now()-e>t}var pt,Nt=C(()=>{"use strict";c(Ie,"isExpired");pt=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 Zr from"node:fs/promises";import ts from"node:os";import De from"node:path";async function Oe(){try{let n=await Zr.readFile(Le,"utf-8"),t=JSON.parse(n);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||Ie(t.timestamp,rs)?null:t.detection}catch{return null}}async function je(n){let t={timestamp:new Date().toISOString(),detection:n};await M(Le,t)}var es,Le,rs,Me=C(()=>{"use strict";Nt();U();es=De.join(ts.homedir(),".prjct-cli","cache"),Le=De.join(es,"providers.json"),rs=10*60*1e3;c(Oe,"readProviderCache");c(je,"writeProviderCache")});var mt={};ge(mt,{AntigravityProvider:()=>Dt,ClaudeProvider:()=>dt,CodexProvider:()=>Lt,CursorProvider:()=>Ue,GeminiProvider:()=>It,Providers:()=>I,WindsurfProvider:()=>Xe,detectAllProviders:()=>Ot,detectAntigravity:()=>ps,detectCodex:()=>He,detectCursorProject:()=>Ge,detectProvider:()=>Ct,detectWindsurfProject:()=>Be,getActiveProvider:()=>is,getCapabilities:()=>ns,getCommandsDir:()=>fs,getGlobalContextPath:()=>ds,getGlobalSettingsPath:()=>ms,getProjectCommandsPath:()=>hs,getProviderBranding:()=>cs,getSkillsPath:()=>gs,hasProviderConfig:()=>as,needsCursorRouterRegeneration:()=>us,needsWindsurfRouterRegeneration:()=>ls,selectProvider:()=>ys,validateCliVersion:()=>We});import X from"node:os";import _ from"node:path";function ns(n,t){return{...ss[n],...t}}async function $e(n){try{let{stdout:t}=await k(`which ${n}`,{timeout:2e3});return t.trim()}catch{return null}}async function os(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=I[n];if(!t.cliCommand)return{installed:!1};let e=await $e(t.cliCommand);if(!e)return{installed:!1};let r=await os(t.cliCommand),s=We(n,r||void 0);return{installed:!0,version:r||void 0,path:e,versionWarning:s||void 0}}function We(n,t){let e=I[n];return!e.minCliVersion||!t?null:Ne(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 Ot(n=!1){if(!n){let i=await Oe();if(i)return i}let[t,e,r]=await Promise.all([Ct("claude"),Ct("gemini"),He()]),s={installed:r.installed},o={claude:t,gemini:e,codex:s};return await je(o).catch(()=>{}),o}async function is(n){if(n&&I[n])return I[n];let t=await Ot();return t.claude.installed&&!t.gemini.installed?dt:t.gemini.installed&&!t.claude.installed?It:dt}async function as(n){let t=I[n];return t.configDir?x(t.configDir):!1}function cs(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 Ge(n){let t=_.join(n,".cursor"),e=_.join(t,"rules"),r=_.join(e,"prjct.mdc"),[s,o]=await Promise.all([x(t),x(r)]);return{detected:s,routerInstalled:o,projectRoot:s?n:void 0}}async function us(n){let t=await Ge(n);return t.detected&&!t.routerInstalled}async function Be(n){let t=_.join(n,".windsurf"),e=_.join(t,"rules"),r=_.join(e,"prjct.md"),[s,o]=await Promise.all([x(t),x(r)]);return{detected:s,routerInstalled:o,projectRoot:s?n:void 0}}async function ls(n){let t=await Be(n);return t.detected&&!t.routerInstalled}async function ps(){let n=Dt.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=_.join(n,"skills","prjct","SKILL.md"),[e,r]=await Promise.all([x(n),x(t)]);return{installed:e,skillInstalled:r,configPath:e?n:void 0}}async function He(){let n=Lt.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=await $e("codex"),e=_.join(n,"skills","prjct","SKILL.md"),r=await x(e),s=!!t;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}function ds(n){let t=I[n];return t.configDir?_.join(t.configDir,t.contextFile):null}function ms(n){let t=I[n];return!t.configDir||!t.settingsFile?null:_.join(t.configDir,t.settingsFile)}function gs(n){return I[n].skillsDir}function fs(n){return I[n].commandsDir}function hs(n,t){let e=I[n];return _.join(t,e.commandsDir)}async function ys(){let n=await Ot(),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 ss,dt,It,Dt,Ue,Xe,Lt,I,gt=C(()=>{"use strict";Ae();At();z();U();Me();ss={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};c(ns,"getCapabilities");dt={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:_.join(X.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:_.join(X.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:_.join(X.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:_.join(X.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"},Dt={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:_.join(X.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:_.join(X.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"},Ue={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"},Xe={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"},Lt={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:_.join(X.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:_.join(X.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"},I={claude:dt,gemini:It,cursor:Ue,antigravity:Dt,windsurf:Xe,codex:Lt};c($e,"whichCommand");c(os,"getCliVersion");c(Ct,"detectProvider");c(We,"validateCliVersion");c(Ot,"detectAllProviders");c(is,"getActiveProvider");c(as,"hasProviderConfig");c(cs,"getProviderBranding");c(Ge,"detectCursorProject");c(us,"needsCursorRouterRegeneration");c(Be,"detectWindsurfProject");c(ls,"needsWindsurfRouterRegeneration");c(ps,"detectAntigravity");c(He,"detectCodex");c(ds,"getGlobalContextPath");c(ms,"getGlobalSettingsPath");c(gs,"getSkillsPath");c(fs,"getCommandsDir");c(hs,"getProjectCommandsPath");c(ys,"selectProvider")});var cr={};ge(cr,{default:()=>Ws,worktreeService:()=>ar});import Ht from"node:fs/promises";import O from"node:path";var ir,qt,ar,Ws,ur=C(()=>{"use strict";z();U();ir=".worktrees",qt=class{static{c(this,"WorktreeService")}async create(t,e,r={}){let s=await this.getMainWorktree(t),o=O.join(s,ir,e),i=r.branch||`feat/${e}`;await Ht.mkdir(O.join(s,ir),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await k(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:u}=await k("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:u.trim(),isMain:!1,slug:e}}async remove(t,e=!1){let r=await this.getMainWorktree(t),s;if(e)try{let{stdout:o}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t});s=o.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=O.resolve(t,e.trim()),o=O.resolve(t,r.trim());if(s!==o){let{stdout:i}=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}),p=u.trim(),m=O.basename(p);return{path:p,branch:i.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(`
8
+ var ct=Object.defineProperty;var Br=Object.getOwnPropertyDescriptor;var Hr=Object.getOwnPropertyNames;var qr=Object.prototype.hasOwnProperty;var c=(n,t)=>ct(n,"name",{value:t,configurable:!0}),me=(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 C=(n,t)=>()=>(n&&(t=n(n=0)),t);var ge=(n,t)=>{for(var e in t)ct(n,e,{get:t[e],enumerable:!0})},zr=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Hr(t))!qr.call(n,s)&&s!==e&&ct(n,s,{get:()=>t[s],enumerable:!(r=Br(t,s))||r.enumerable});return n};var vt=n=>zr(ct({},"__esModule",{value:!0}),n);var fe,he,ye,_t=C(()=>{"use strict";fe=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"]),he=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ye=/(?:import|from)\s+['"]([^'"]+)['"]/g});function Jr(n){return n instanceof Error&&"code"in n}function N(n){return Jr(n)&&n.code==="ENOENT"}function ke(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var W=C(()=>{"use strict";c(Jr,"isNodeError");c(N,"isNotFoundError");c(ke,"getErrorMessage")});import Se from"node:fs/promises";async function xe(n,t){let e;try{e=await Se.readFile(n,"utf-8")}catch(o){if(N(o))return null;throw o}let r;try{r=JSON.parse(e)}catch{return await we(n,e),be(n,"Malformed JSON"),null}let s=t.safeParse(r);return s.success?r:(await we(n,e),be(n,Vr(s.error)),null)}async function we(n,t){let e=`${n}.backup`;try{await Se.writeFile(e,t,"utf-8")}catch{}}function be(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 Vr(n){return n.issues.slice(0,3).map(t=>`${t.path.join(".")}: ${t.message}`).join("; ")}var ve=C(()=>{"use strict";W();c(xe,"safeRead");c(we,"createBackup");c(be,"logCorruption");c(Vr,"formatZodError")});import G from"node:fs/promises";import Pt from"node:path";async function _e(n,t={}){let e=[],r=t.maxFiles??1/0,s=t.dotfileAllowlist?new Set(t.dotfileAllowlist):null;async function o(i){if(e.length>=r)return;let a=await G.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of a){if(e.length>=r)break;let p=String(u.name);if(fe.has(p)||t.skipDotfiles&&p.startsWith(".")&&(!s||!s.has(p)))continue;let m=Pt.join(i,p);u.isDirectory()?await o(m):u.isFile()&&e.push(Pt.relative(n,m))}}return c(o,"walk"),await o(n),e}async function Pe(n,t,e){let r=[];for(let s=0;s<n.length;s+=t){let o=await Promise.all(n.slice(s,s+t).map(e));for(let i of o)i!==null&&r.push(i)}return r}async function ut(n,t=null,e){if(e)return await xe(n,e)??t;try{let r=await G.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(N(r))return t;throw r}}async function M(n,t,e=2){let r=Pt.dirname(n);await G.mkdir(r,{recursive:!0});let s=`${JSON.stringify(t,null,e)}
9
+ `;await G.writeFile(n,s,"utf-8")}async function x(n){try{return await G.access(n),!0}catch(t){if(N(t))return!1;throw t}}async function Rt(n){try{return(await G.stat(n)).isDirectory()}catch(t){if(N(t))return!1;throw t}}async function F(n){await G.mkdir(n,{recursive:!0})}var U=C(()=>{"use strict";_t();ve();W();c(_e,"walkDir");c(Pe,"batchProcess");c(ut,"readJson");c(M,"writeJson");c(x,"fileExists");c(Rt,"dirExists");c(F,"ensureDir")});var Ae=C(()=>{"use strict"});import{z as D}from"zod";function Ne(n,t){let e=n.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){let o=e[s]??0,i=r[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var oo,io,ao,lt,co,At=C(()=>{"use strict";oo=D.enum(["opus","sonnet","haiku"]),io=D.enum(["2.5-pro","2.5-flash","2.0-flash"]),ao=D.string().min(1),lt=D.object({provider:D.string(),model:D.string(),cliVersion:D.string().optional(),recordedAt:D.string()}),co=D.object({preferredModel:D.string().optional(),lastAnalysisModel:lt.optional()});c(Ne,"compareSemver")});import{exec as Kr,execFile as Qr}from"node:child_process";import{promisify as Ce}from"node:util";var k,go,z=C(()=>{"use strict";k=Ce(Kr),go=Ce(Qr)});function Ie(n,t){let e=typeof n=="string"?new Date(n).getTime():n;return Date.now()-e>t}var pt,Nt=C(()=>{"use strict";c(Ie,"isExpired");pt=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 Zr from"node:fs/promises";import ts from"node:os";import De from"node:path";async function Oe(){try{let n=await Zr.readFile(Le,"utf-8"),t=JSON.parse(n);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||Ie(t.timestamp,rs)?null:t.detection}catch{return null}}async function je(n){let t={timestamp:new Date().toISOString(),detection:n};await M(Le,t)}var es,Le,rs,Me=C(()=>{"use strict";Nt();U();es=De.join(ts.homedir(),".prjct-cli","cache"),Le=De.join(es,"providers.json"),rs=10*60*1e3;c(Oe,"readProviderCache");c(je,"writeProviderCache")});var mt={};ge(mt,{AntigravityProvider:()=>Dt,ClaudeProvider:()=>dt,CodexProvider:()=>Lt,CursorProvider:()=>Ue,GeminiProvider:()=>It,Providers:()=>I,WindsurfProvider:()=>Xe,detectAllProviders:()=>Ot,detectAntigravity:()=>ps,detectCodex:()=>He,detectCursorProject:()=>Ge,detectProvider:()=>Ct,detectWindsurfProject:()=>Be,getActiveProvider:()=>is,getCapabilities:()=>ns,getCommandsDir:()=>fs,getGlobalContextPath:()=>ds,getGlobalSettingsPath:()=>ms,getProjectCommandsPath:()=>hs,getProviderBranding:()=>cs,getSkillsPath:()=>gs,hasProviderConfig:()=>as,needsCursorRouterRegeneration:()=>us,needsWindsurfRouterRegeneration:()=>ls,selectProvider:()=>ys,validateCliVersion:()=>We});import X from"node:os";import _ from"node:path";function ns(n,t){return{...ss[n],...t}}async function $e(n){try{let{stdout:t}=await k(`which ${n}`,{timeout:2e3});return t.trim()}catch{return null}}async function os(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=I[n];if(!t.cliCommand)return{installed:!1};let e=await $e(t.cliCommand);if(!e)return{installed:!1};let r=await os(t.cliCommand),s=We(n,r||void 0);return{installed:!0,version:r||void 0,path:e,versionWarning:s||void 0}}function We(n,t){let e=I[n];return!e.minCliVersion||!t?null:Ne(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 Ot(n=!1){if(!n){let i=await Oe();if(i)return i}let[t,e,r]=await Promise.all([Ct("claude"),Ct("gemini"),He()]),s={installed:r.installed},o={claude:t,gemini:e,codex:s};return await je(o).catch(()=>{}),o}async function is(n){if(n&&I[n])return I[n];let t=await Ot();return t.claude.installed&&!t.gemini.installed?dt:t.gemini.installed&&!t.claude.installed?It:dt}async function as(n){let t=I[n];return t.configDir?x(t.configDir):!1}function cs(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 Ge(n){let t=_.join(n,".cursor"),e=_.join(t,"rules"),r=_.join(e,"prjct.mdc"),[s,o]=await Promise.all([x(t),x(r)]);return{detected:s,routerInstalled:o,projectRoot:s?n:void 0}}async function us(n){let t=await Ge(n);return t.detected&&!t.routerInstalled}async function Be(n){let t=_.join(n,".windsurf"),e=_.join(t,"rules"),r=_.join(e,"prjct.md"),[s,o]=await Promise.all([x(t),x(r)]);return{detected:s,routerInstalled:o,projectRoot:s?n:void 0}}async function ls(n){let t=await Be(n);return t.detected&&!t.routerInstalled}async function ps(){let n=Dt.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=_.join(n,"skills","prjct","SKILL.md"),[e,r]=await Promise.all([x(n),x(t)]);return{installed:e,skillInstalled:r,configPath:e?n:void 0}}async function He(){let n=Lt.configDir;if(!n)return{installed:!1,skillInstalled:!1};let t=await $e("codex"),e=_.join(n,"skills","prjct","SKILL.md"),r=await x(e),s=!!t;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}function ds(n){let t=I[n];return t.configDir?_.join(t.configDir,t.contextFile):null}function ms(n){let t=I[n];return!t.configDir||!t.settingsFile?null:_.join(t.configDir,t.settingsFile)}function gs(n){return I[n].skillsDir}function fs(n){return I[n].commandsDir}function hs(n,t){let e=I[n];return _.join(t,e.commandsDir)}async function ys(){let n=await Ot(),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 ss,dt,It,Dt,Ue,Xe,Lt,I,gt=C(()=>{"use strict";Ae();At();z();U();Me();ss={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};c(ns,"getCapabilities");dt={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:_.join(X.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:_.join(X.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:_.join(X.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:_.join(X.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"},Dt={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:_.join(X.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:_.join(X.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"},Ue={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"},Xe={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"},Lt={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:_.join(X.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:_.join(X.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"},I={claude:dt,gemini:It,cursor:Ue,antigravity:Dt,windsurf:Xe,codex:Lt};c($e,"whichCommand");c(os,"getCliVersion");c(Ct,"detectProvider");c(We,"validateCliVersion");c(Ot,"detectAllProviders");c(is,"getActiveProvider");c(as,"hasProviderConfig");c(cs,"getProviderBranding");c(Ge,"detectCursorProject");c(us,"needsCursorRouterRegeneration");c(Be,"detectWindsurfProject");c(ls,"needsWindsurfRouterRegeneration");c(ps,"detectAntigravity");c(He,"detectCodex");c(ds,"getGlobalContextPath");c(ms,"getGlobalSettingsPath");c(gs,"getSkillsPath");c(fs,"getCommandsDir");c(hs,"getProjectCommandsPath");c(ys,"selectProvider")});var cr={};ge(cr,{default:()=>Ws,worktreeService:()=>ar});import Ht from"node:fs/promises";import O from"node:path";var ir,qt,ar,Ws,ur=C(()=>{"use strict";z();U();ir=".worktrees",qt=class{static{c(this,"WorktreeService")}async create(t,e,r={}){let s=await this.getMainWorktree(t),o=O.join(s,ir,e),i=r.branch||`feat/${e}`;await Ht.mkdir(O.join(s,ir),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await k(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:u}=await k("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:u.trim(),isMain:!1,slug:e}}async remove(t,e=!1){let r=await this.getMainWorktree(t),s;if(e)try{let{stdout:o}=await k("git rev-parse --abbrev-ref HEAD",{cwd:t});s=o.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=O.resolve(t,e.trim()),o=O.resolve(t,r.trim());if(s!==o){let{stdout:i}=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}),p=u.trim(),m=O.basename(p);return{path:p,branch:i.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
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=O.join(e,".env");await x(r)&&await Ht.copyFile(r,O.join(t,".env"));let s=O.join(e,".prjct"),o=O.join(t,".prjct");await x(s)&&!await x(o)&&await Ht.symlink(s,o,"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 o of e)o.isMain||await x(o.path)||r.push(o.slug);return r}parsePorcelainOutput(t,e){let r=[],s=t.trim().split(`
10
11
 
11
12
  `);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
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": {