prjct-cli 1.29.0 → 1.30.1

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.
@@ -4,15 +4,15 @@ import { dirname as __pathDirname } from 'path';
4
4
  var require = __createRequire(import.meta.url);
5
5
  var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
- var Py=Object.create;var hr=Object.defineProperty;var Ty=Object.getOwnPropertyDescriptor;var Ey=Object.getOwnPropertyNames;var Iy=Object.getPrototypeOf,Ay=Object.prototype.hasOwnProperty;var l=(r,e)=>hr(r,"name",{value:e,configurable:!0}),yr=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')}),ld=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var jy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),fe=(r,e)=>{for(var t in e)hr(r,t,{get:e[t],enumerable:!0})},ud=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ey(e))!Ay.call(r,s)&&s!==t&&hr(r,s,{get:()=>e[s],enumerable:!(n=Ty(e,s))||n.enumerable});return r};var Dy=(r,e,t)=>(t=r!=null?Py(Iy(r)):{},ud(e||!r||!r.__esModule?hr(t,"default",{value:r,enumerable:!0}):t,r)),xt=r=>ud(hr({},"__esModule",{value:!0}),r);var dd={};fe(dd,{DAEMON_PATHS:()=>Ue,IDLE_TIMEOUT_MS:()=>Ia,decodeMessage:()=>Ry,encodeMessage:()=>ms});function ms(r){return Buffer.from(`${JSON.stringify(r)}
8
- `)}function Ry(r){return JSON.parse(r.trim())}var Ue,Ia,ho=y(()=>{"use strict";Ue={runDir:l(()=>`${process.env.HOME||yr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ue.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ue.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ue.runDir()}/daemon.log`,"log")},Ia=1800*1e3;l(ms,"encodeMessage");l(Ry,"decodeMessage")});var gs={};fe(gs,{executeViaDaemon:()=>Oy,getDaemonStatus:()=>My,isDaemonRunning:()=>pd,sendRequest:()=>wr,spawnDaemon:()=>md,stopDaemon:()=>Fy});import yo from"node:crypto";import Pt from"node:fs";import{connect as $y}from"node:net";async function pd(){let r=Ue.socket();if(!Pt.existsSync(r))return!1;try{return(await wr({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Pt.unlinkSync(r)}catch{}return!1}}async function My(){let r=Ue.socket(),e=Ue.pid();if(!Pt.existsSync(r))return{running:!1};try{let t=await wr({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Pt.existsSync(e)?{running:!1,pid:parseInt(Pt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function wr(r){return new Promise((e,t)=>{let n=Ue.socket(),s=$y(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(ms(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Oy(r,e,t,n,s,o=!0){let i=Ue.socket();if(!Pt.existsSync(i))return o&&md().catch(()=>{}),null;try{return await wr({id:yo.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function Fy(){try{return(await wr({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function md(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Pt.existsSync(t))o=t,i="bun";else if(Pt.existsSync(n))o=n,i="node";else if(Pt.existsSync(s))o=s,i="node";else return!1;let a=Ue.runDir();Pt.mkdirSync(a,{recursive:!0});let c=Ue.log(),u=Pt.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Pt.closeSync(u),await new Promise(m=>setTimeout(m,500)),pd()}var fs=y(()=>{"use strict";ho();l(pd,"isDaemonRunning");l(My,"getDaemonStatus");l(wr,"sendRequest");l(Oy,"executeViaDaemon");l(Fy,"stopDaemon");l(md,"spawnDaemon")});import{z as Xt}from"zod";function gd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var tI,nI,sI,kr,rI,Sr=y(()=>{"use strict";tI=Xt.enum(["opus","sonnet","haiku"]),nI=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),sI=Xt.string().min(1),kr=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),rI=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:kr.optional()});l(gd,"compareSemver")});function fd(r){return r instanceof Error&&"code"in r}function v(r){return fd(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function wo(r){if(r instanceof Error)return r.stack}var _=y(()=>{"use strict";l(fd,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(wo,"getErrorStack")});import wd from"node:fs/promises";async function kd(r,e){let t;try{t=await wd.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await hd(r,t),yd(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await hd(r,t),yd(r,_y(s.error)),null)}async function hd(r,e){let t=`${r}.backup`;try{await wd.writeFile(t,e,"utf-8")}catch{}}function yd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function _y(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Sd=y(()=>{"use strict";_();l(kd,"safeRead");l(hd,"createBackup");l(yd,"logCorruption");l(_y,"formatZodError")});var ce={};fe(ce,{appendLine:()=>Aa,appendToFile:()=>Ly,atomicWrite:()=>Ny,copyFile:()=>By,deleteDir:()=>Gy,deleteFile:()=>Uy,dirExists:()=>ko,ensureDir:()=>Nt,fileExists:()=>P,getFileExtension:()=>Ky,getFileModifiedTime:()=>Wy,getFileNameWithoutExtension:()=>Yy,getFileSize:()=>zy,listFiles:()=>ws,moveFile:()=>Vy,prependToFile:()=>Hy,readFile:()=>ys,readJson:()=>Ln,readLines:()=>Jy,writeFile:()=>bd,writeJson:()=>br,writeLines:()=>qy});import we from"node:fs/promises";import hs from"node:path";async function Ln(r,e=null,t){if(t)return await kd(r,t)??e;try{let n=await we.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function br(r,e,t=2){let n=JSON.stringify(e,null,t);await we.writeFile(r,n,"utf-8")}async function ys(r,e=""){try{return await we.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function bd(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0}),await we.writeFile(r,e,"utf-8")}async function Ny(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await we.writeFile(n,e,"utf-8"),await we.rename(n,r)}async function Ly(r,e){await we.appendFile(r,e,"utf-8")}async function Aa(r,e){let t=hs.dirname(r);await we.mkdir(t,{recursive:!0}),await we.appendFile(r,`${e}
10
- `,"utf-8")}async function Hy(r,e){try{let t=await we.readFile(r,"utf-8");await we.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await we.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await we.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function ko(r){try{return(await we.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Nt(r){await we.mkdir(r,{recursive:!0})}async function Uy(r){try{return await we.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function Gy(r){try{return await we.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function ws(r,e={}){try{let n=await we.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function zy(r){return(await we.stat(r)).size}async function Wy(r){return(await we.stat(r)).mtime}async function By(r,e){await we.copyFile(r,e)}async function Vy(r,e){await we.rename(r,e)}async function Jy(r){return(await ys(r,"")).split(`
11
- `)}async function qy(r,e){let t=e.join(`
12
- `);await bd(r,t)}function Ky(r){return hs.extname(r)}function Yy(r){return hs.basename(r,hs.extname(r))}var xe=y(()=>{"use strict";Sd();_();l(Ln,"readJson");l(br,"writeJson");l(ys,"readFile");l(bd,"writeFile");l(Ny,"atomicWrite");l(Ly,"appendToFile");l(Aa,"appendLine");l(Hy,"prependToFile");l(P,"fileExists");l(ko,"dirExists");l(Nt,"ensureDir");l(Uy,"deleteFile");l(Gy,"deleteDir");l(ws,"listFiles");l(zy,"getFileSize");l(Wy,"getFileModifiedTime");l(By,"copyFile");l(Vy,"moveFile");l(Jy,"readLines");l(qy,"writeLines");l(Ky,"getFileExtension");l(Yy,"getFileNameWithoutExtension")});var xd={};fe(xd,{invalidateProviderCache:()=>Zy,readProviderCache:()=>Da,writeProviderCache:()=>Ra});import So from"node:fs/promises";import Xy from"node:os";import Cd from"node:path";async function Da(){try{let r=await So.readFile(ja,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Qy?null:e.detection}catch{return null}}async function Ra(r){let e={timestamp:new Date().toISOString(),detection:r};await So.mkdir(vd,{recursive:!0}),await So.writeFile(ja,JSON.stringify(e,null,2))}async function Zy(){try{await So.unlink(ja)}catch{}}var vd,ja,Qy,$a=y(()=>{"use strict";vd=Cd.join(Xy.homedir(),".prjct-cli","cache"),ja=Cd.join(vd,"providers.json"),Qy=600*1e3;l(Da,"readProviderCache");l(Ra,"writeProviderCache");l(Zy,"invalidateProviderCache")});var ut={};fe(ut,{AntigravityProvider:()=>Oa,ClaudeProvider:()=>bo,CursorProvider:()=>Ed,GeminiProvider:()=>Ma,Providers:()=>Me,WindsurfProvider:()=>Id,detectAllProviders:()=>cn,detectAntigravity:()=>Ss,detectCursorProject:()=>jd,detectProvider:()=>Co,detectWindsurfProject:()=>Dd,getActiveProvider:()=>rw,getCommandsDir:()=>dw,getGlobalContextPath:()=>cw,getGlobalSettingsPath:()=>lw,getProjectCommandsPath:()=>pw,getProviderBranding:()=>vo,getSkillsPath:()=>uw,hasProviderConfig:()=>ow,needsCursorRouterRegeneration:()=>iw,needsWindsurfRouterRegeneration:()=>aw,selectProvider:()=>Fa,validateCliVersion:()=>Ad});import{exec as ew}from"node:child_process";import ks from"node:os";import nt from"node:path";import{promisify as tw}from"node:util";async function nw(r){try{let{stdout:e}=await Pd(`which ${r}`,{timeout:Td});return e.trim()}catch{return null}}async function sw(r){try{let{stdout:e}=await Pd(`${r} --version`,{timeout:Td}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Me[r];if(!e.cliCommand)return{installed:!1};let t=await nw(e.cliCommand);if(!t)return{installed:!1};let n=await sw(e.cliCommand),s=Ad(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Ad(r,e){let t=Me[r];return!t.minCliVersion||!e?null:gd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function cn(r=!1){if(!r){let s=await Da();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Ra(n).catch(()=>{}),n}async function rw(r){if(r&&Me[r])return Me[r];let e=await cn();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?Ma:bo}async function ow(r){let e=Me[r];return e.configDir?P(e.configDir):!1}function vo(r){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"}[r]||"\u26A1 prjct"}}async function jd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function iw(r){let e=await jd(r);return e.detected&&!e.routerInstalled}async function Dd(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function aw(r){let e=await Dd(r);return e.detected&&!e.routerInstalled}async function Ss(){let r=Oa.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function cw(r){let e=Me[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function lw(r){let e=Me[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function uw(r){return Me[r].skillsDir}function dw(r){return Me[r].commandsDir}function pw(r,e){let t=Me[r];return nt.join(e,t.commandsDir)}async function Fa(){let r=await cn(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var Pd,Td,bo,Ma,Oa,Ed,Id,Me,Be=y(()=>{"use strict";Sr();xe();$a();Pd=tw(ew),Td=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ks.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ks.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"},Ma={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ks.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ks.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"},Oa={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ks.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ks.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},Ed={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},Id={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},Me={claude:bo,gemini:Ma,cursor:Ed,antigravity:Oa,windsurf:Id};l(nw,"whichCommand");l(sw,"getCliVersion");l(Co,"detectProvider");l(Ad,"validateCliVersion");l(cn,"detectAllProviders");l(rw,"getActiveProvider");l(ow,"hasProviderConfig");l(vo,"getProviderBranding");l(jd,"detectCursorProject");l(iw,"needsCursorRouterRegeneration");l(Dd,"detectWindsurfProject");l(aw,"needsWindsurfRouterRegeneration");l(Ss,"detectAntigravity");l(cw,"getGlobalContextPath");l(lw,"getGlobalSettingsPath");l(uw,"getSkillsPath");l(dw,"getCommandsDir");l(pw,"getProjectCommandsPath");l(Fa,"selectProvider")});import{z as ke}from"zod";function mw(r){return r instanceof bs}function se(r){return mw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Cs,DI,RI,$I,MI,OI,FI,bs,xo,Po,Cr,ln=y(()=>{"use strict";Cs={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},DI=Cs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),RI=Cs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),$I=Cs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),MI=Cs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),OI=Cs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),FI=Cs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),bs=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},xo=class r extends bs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Po=class r extends bs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Cr=class r extends bs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(mw,"isPrjctError");l(se,"getErrorMessage")});var W={};fe(W,{calculateDuration:()=>Cw,formatDate:()=>To,formatDuration:()=>vr,formatMonth:()=>fw,getDateKey:()=>hw,getDateRange:()=>kw,getDaysAgo:()=>kn,getDaysFromNow:()=>ww,getEndOfDay:()=>xw,getStartOfDay:()=>vw,getTimestamp:()=>C,getTodayKey:()=>Rd,getYearMonthDay:()=>_a,isToday:()=>Sw,isWithinLastDays:()=>bw,parseDate:()=>yw,toRelative:()=>Pw});import{formatDistanceToNowStrict as gw}from"date-fns";function To(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function fw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Rd(){return To(new Date)}function hw(r){return To(r)}function _a(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function yw(r){return new Date(r)}function C(){return new Date().toISOString()}function kn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function ww(r){let e=new Date;return e.setDate(e.getDate()+r),e}function kw(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Sw(r){return To(r)===Rd()}function bw(r,e){let t=kn(e);return r>=t}function vr(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Cw(r,e=new Date){let t=e.getTime()-r.getTime();return vr(t)}function vw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function xw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Pw(r){let e=typeof r=="string"?new Date(r):r;return gw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(fw,"formatMonth");l(Rd,"getTodayKey");l(hw,"getDateKey");l(_a,"getYearMonthDay");l(yw,"parseDate");l(C,"getTimestamp");l(kn,"getDaysAgo");l(ww,"getDaysFromNow");l(kw,"getDateRange");l(Sw,"isToday");l(bw,"isWithinLastDays");l(vr,"formatDuration");l(Cw,"calculateDuration");l(vw,"getStartOfDay");l(xw,"getEndOfDay");l(Pw,"toRelative")});var Ao={};fe(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>ve,compareVersions:()=>$d,getPackageInfo:()=>Tw,getPackageRoot:()=>Ha,getVersion:()=>Pr,isCompatible:()=>Ew,needsMigration:()=>Iw});import Na from"node:fs";import Io from"node:path";function Ha(){if(xr)return xr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(Na.existsSync(t))try{if(JSON.parse(Na.readFileSync(t,"utf-8")).name==="prjct-cli")return xr=r,r}catch{}r=Io.dirname(r)}return xr=Io.join(__dirname,"..","..",".."),xr}function Pr(){if(Eo)return Eo;try{let r=Io.join(Ha(),"package.json"),e=JSON.parse(Na.readFileSync(r,"utf-8"));return Eo=e.version,La=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Tw(){return La||Pr(),La}function $d(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Ew(r){let e=Pr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Iw(r,e=null){let t=e||Pr();return $d(r,t)<0}var Eo,La,xr,ve,pe,dt=y(()=>{"use strict";_();Eo=null,La=null,xr=null;l(Ha,"getPackageRoot");l(Pr,"getVersion");l(Tw,"getPackageInfo");l($d,"compareVersions");l(Ew,"isCompatible");l(Iw,"needsMigration");ve=Pr(),pe=Ha()});import{exec as Aw}from"node:child_process";import{promisify as jw}from"node:util";async function jo(r){try{let{stdout:e}=await Dw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Rw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function $w(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Mw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function vs(){let[r,e,t]=await Promise.all([Rw(),$w(),Mw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Dw,Do=y(()=>{"use strict";Dw=jw(Aw);l(jo,"execCommand");l(Rw,"detectGitHubUsername");l($w,"detectGitName");l(Mw,"detectGitEmail");l(vs,"detect")});import Ow from"node:crypto";import Qt from"node:fs/promises";import Ga from"node:os";import U from"node:path";import{globSync as Fw}from"glob";var za,_w,I,Se=y(()=>{"use strict";le();xe();za=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(Ga.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return Ow.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await ko(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Nt(this.globalBaseDir),await Nt(this.globalProjectsDir),await Nt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Nt(U.join(t,s));return await Nt(U.join(t,"planning","tasks")),await Nt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=_a(t);return U.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Nt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await ko(t)}getDisplayPath(e){let t=Ga.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ga.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{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 n){let o=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Qt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await Qt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
13
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await P(c)){let u=await Qt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=U.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Fw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Qt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},_w=new za,I=_w});var Od={};fe(Od,{default:()=>R});import Hn from"node:fs/promises";import Nw from"node:path";import*as Ro from"jsonc-parser";function Md(r){let e=[],t=Ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ro.printParseErrorCode(n.error)}`)}return t}var Wa,Lw,R,Ve=y(()=>{"use strict";ln();_();le();dt();Do();Se();l(Md,"parseJsonc");Wa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),n=await Hn.readFile(t,"utf-8");return Md(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${se(t)}`),null}}async writeConfig(e,t){let n=I.getLocalConfigPath(e),s=I.getLegacyPrjctPath(e);await Hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
14
- `,"utf-8")}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),n=await Hn.readFile(t,"utf-8");return Md(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${se(t)}`),null}}async writeGlobalConfig(e,t){let n=I.getGlobalProjectConfigPath(e),s=I.getGlobalProjectPath(e);await Hn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
15
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:ve,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=I.generateProjectId(e),s=I.getGlobalProjectPath(n),o=I.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ve,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=I.getGlobalProjectPath(s.projectId);try{return(await Hn.readdir(Nw.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:I.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await vs(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=I.generateProjectId(e);return{projectId:n,dataPath:I.getDisplayPath(I.getGlobalProjectPath(n))}}},Lw=new Wa,R=Lw});var _d={};fe(_d,{default:()=>Va});import xs from"node:fs/promises";import Hw from"node:os";import Fd from"node:path";var Ba,Uw,Va,Ja=y(()=>{"use strict";_();Ba=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Hw.homedir(),this.configDir=Fd.join(this.homeDir,".prjct-cli","config"),this.configFile=Fd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await xs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await xs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await xs.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await xs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await xs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await xs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Uw=new Ba,Va=Uw});function Gw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Tr(){return Gw()==="bun"}var qa=y(()=>{"use strict";l(Gw,"detectRuntime");l(Tr,"isBun")});import Ka from"node:fs";import Nd from"node:path";function zw(r){if(Tr()){let{Database:s}=yr("bun:sqlite");return new s(r,{create:!0})}let e=yr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Ww,$o,$,V,he=y(()=>{"use strict";Se();qa();l(zw,"openDatabase");Ww=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
7
+ var My=Object.create;var hr=Object.defineProperty;var Oy=Object.getOwnPropertyDescriptor;var Fy=Object.getOwnPropertyNames;var _y=Object.getPrototypeOf,Ny=Object.prototype.hasOwnProperty;var l=(s,e)=>hr(s,"name",{value:e,configurable:!0}),yr=(s=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(s,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):s)(function(s){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+s+'" is not supported')}),gd=s=>e=>{var t=s[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(s,e)=>()=>(s&&(e=s(s=0)),e);var Ly=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),he=(s,e)=>{for(var t in e)hr(s,t,{get:e[t],enumerable:!0})},fd=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Fy(e))!Ny.call(s,r)&&r!==t&&hr(s,r,{get:()=>e[r],enumerable:!(n=Oy(e,r))||n.enumerable});return s};var Uy=(s,e,t)=>(t=s!=null?My(_y(s)):{},fd(e||!s||!s.__esModule?hr(t,"default",{value:s,enumerable:!0}):t,s)),xt=s=>fd(hr({},"__esModule",{value:!0}),s);var hd={};he(hd,{DAEMON_PATHS:()=>He,IDLE_TIMEOUT_MS:()=>Ma,decodeMessage:()=>Hy,encodeMessage:()=>gs});function gs(s){return Buffer.from(`${JSON.stringify(s)}
8
+ `)}function Hy(s){return JSON.parse(s.trim())}var He,Ma,So=y(()=>{"use strict";He={runDir:l(()=>`${process.env.HOME||yr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${He.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${He.runDir()}/daemon.pid`,"pid"),log:l(()=>`${He.runDir()}/daemon.log`,"log")},Ma=1800*1e3;l(gs,"encodeMessage");l(Hy,"decodeMessage")});var fs={};he(fs,{executeViaDaemon:()=>Wy,getDaemonStatus:()=>zy,isDaemonRunning:()=>yd,sendRequest:()=>wr,spawnDaemon:()=>wd,stopDaemon:()=>By});import bo from"node:crypto";import Tt from"node:fs";import{connect as Gy}from"node:net";async function yd(){let s=He.socket();if(!Tt.existsSync(s))return!1;try{return(await wr({id:bo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Tt.unlinkSync(s)}catch{}return!1}}async function zy(){let s=He.socket(),e=He.pid();if(!Tt.existsSync(s))return{running:!1};try{let t=await wr({id:bo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Tt.existsSync(e)?{running:!1,pid:parseInt(Tt.readFileSync(e,"utf-8").trim(),10),socketPath:s}:{running:!1}}function wr(s){return new Promise((e,t)=>{let n=He.socket(),r=Gy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(gs(s))}),r.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function Wy(s,e,t,n,r,o=!0){let i=He.socket();if(!Tt.existsSync(i))return o&&wd().catch(()=>{}),null;try{return await wr({id:bo.randomUUID(),command:s,args:e,options:t,cwd:n,perfStartNs:r})}catch{return null}}async function By(){try{return(await wr({id:bo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function wd(){let{spawn:s}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Tt.existsSync(t))o=t,i="bun";else if(Tt.existsSync(n))o=n,i="node";else if(Tt.existsSync(r))o=r,i="node";else return!1;let a=He.runDir();Tt.mkdirSync(a,{recursive:!0});let c=He.log(),u=Tt.openSync(c,"a");return s(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Tt.closeSync(u),await new Promise(m=>setTimeout(m,500)),yd()}var hs=y(()=>{"use strict";So();l(yd,"isDaemonRunning");l(zy,"getDaemonStatus");l(wr,"sendRequest");l(Wy,"executeViaDaemon");l(By,"stopDaemon");l(wd,"spawnDaemon")});import{z as Xt}from"zod";function kd(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var dI,pI,mI,kr,gI,Sr=y(()=>{"use strict";dI=Xt.enum(["opus","sonnet","haiku"]),pI=Xt.enum(["2.5-pro","2.5-flash","2.0-flash"]),mI=Xt.string().min(1),kr=Xt.object({provider:Xt.string(),model:Xt.string(),cliVersion:Xt.string().optional(),recordedAt:Xt.string()}),gI=Xt.object({preferredModel:Xt.string().optional(),lastAnalysisModel:kr.optional()});l(kd,"compareSemver")});function Sd(s){return s instanceof Error&&"code"in s}function P(s){return Sd(s)&&s.code==="ENOENT"}function w(s){return s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}function Co(s){if(s instanceof Error)return s.stack}var N=y(()=>{"use strict";l(Sd,"isNodeError");l(P,"isNotFoundError");l(w,"getErrorMessage");l(Co,"getErrorStack")});import Pd from"node:fs/promises";async function vd(s,e){let t;try{t=await Pd.readFile(s,"utf-8")}catch(o){if(P(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await bd(s,t),Cd(s,"Malformed JSON"),null}let r=e.safeParse(n);return r.success?n:(await bd(s,t),Cd(s,Vy(r.error)),null)}async function bd(s,e){let t=`${s}.backup`;try{await Pd.writeFile(t,e,"utf-8")}catch{}}function Cd(s,e){console.error(`[prjct] Warning: Corrupted storage file: ${s}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Vy(s){return s.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var xd=y(()=>{"use strict";N();l(vd,"safeRead");l(bd,"createBackup");l(Cd,"logCorruption");l(Vy,"formatZodError")});var ce={};he(ce,{appendLine:()=>Oa,appendToFile:()=>qy,atomicWrite:()=>Jy,copyFile:()=>ew,deleteDir:()=>Xy,deleteFile:()=>Yy,dirExists:()=>Po,ensureDir:()=>Nt,fileExists:()=>x,getFileExtension:()=>rw,getFileModifiedTime:()=>Zy,getFileNameWithoutExtension:()=>ow,getFileSize:()=>Qy,listFiles:()=>ks,moveFile:()=>tw,prependToFile:()=>Ky,readFile:()=>ws,readJson:()=>Un,readLines:()=>nw,writeFile:()=>Td,writeJson:()=>br,writeLines:()=>sw});import we from"node:fs/promises";import ys from"node:path";async function Un(s,e=null,t){if(t)return await vd(s,t)??e;try{let n=await we.readFile(s,"utf-8");return JSON.parse(n)}catch(n){if(P(n))return e;throw n}}async function br(s,e,t=2){let n=JSON.stringify(e,null,t);await we.writeFile(s,n,"utf-8")}async function ws(s,e=""){try{return await we.readFile(s,"utf-8")}catch(t){if(P(t))return e;throw t}}async function Td(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0}),await we.writeFile(s,e,"utf-8")}async function Jy(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0});let n=`${s}.${Date.now()}.tmp`;await we.writeFile(n,e,"utf-8"),await we.rename(n,s)}async function qy(s,e){await we.appendFile(s,e,"utf-8")}async function Oa(s,e){let t=ys.dirname(s);await we.mkdir(t,{recursive:!0}),await we.appendFile(s,`${e}
10
+ `,"utf-8")}async function Ky(s,e){try{let t=await we.readFile(s,"utf-8");await we.writeFile(s,e+t,"utf-8")}catch(t){if(P(t))await we.writeFile(s,e,"utf-8");else throw t}}async function x(s){try{return await we.access(s),!0}catch(e){if(P(e))return!1;throw e}}async function Po(s){try{return(await we.stat(s)).isDirectory()}catch(e){if(P(e))return!1;throw e}}async function Nt(s){await we.mkdir(s,{recursive:!0})}async function Yy(s){try{return await we.unlink(s),!0}catch(e){if(P(e))return!1;throw e}}async function Xy(s){try{return await we.rm(s,{recursive:!0,force:!0}),!0}catch(e){if(P(e))return!1;throw e}}async function ks(s,e={}){try{let n=await we.readdir(s,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(r=>r.isFile())),e.dirsOnly&&(n=n.filter(r=>r.isDirectory())),e.extension&&(n=n.filter(r=>r.name.endsWith(e.extension))),n.map(r=>r.name)}catch(t){if(P(t))return[];throw t}}async function Qy(s){return(await we.stat(s)).size}async function Zy(s){return(await we.stat(s)).mtime}async function ew(s,e){await we.copyFile(s,e)}async function tw(s,e){await we.rename(s,e)}async function nw(s){return(await ws(s,"")).split(`
11
+ `)}async function sw(s,e){let t=e.join(`
12
+ `);await Td(s,t)}function rw(s){return ys.extname(s)}function ow(s){return ys.basename(s,ys.extname(s))}var ve=y(()=>{"use strict";xd();N();l(Un,"readJson");l(br,"writeJson");l(ws,"readFile");l(Td,"writeFile");l(Jy,"atomicWrite");l(qy,"appendToFile");l(Oa,"appendLine");l(Ky,"prependToFile");l(x,"fileExists");l(Po,"dirExists");l(Nt,"ensureDir");l(Yy,"deleteFile");l(Xy,"deleteDir");l(ks,"listFiles");l(Qy,"getFileSize");l(Zy,"getFileModifiedTime");l(ew,"copyFile");l(tw,"moveFile");l(nw,"readLines");l(sw,"writeLines");l(rw,"getFileExtension");l(ow,"getFileNameWithoutExtension")});var Ad={};he(Ad,{invalidateProviderCache:()=>cw,readProviderCache:()=>_a,writeProviderCache:()=>Na});import vo from"node:fs/promises";import iw from"node:os";import Ed from"node:path";async function _a(){try{let s=await vo.readFile(Fa,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>aw?null:e.detection}catch{return null}}async function Na(s){let e={timestamp:new Date().toISOString(),detection:s};await vo.mkdir(Id,{recursive:!0}),await vo.writeFile(Fa,JSON.stringify(e,null,2))}async function cw(){try{await vo.unlink(Fa)}catch{}}var Id,Fa,aw,La=y(()=>{"use strict";Id=Ed.join(iw.homedir(),".prjct-cli","cache"),Fa=Ed.join(Id,"providers.json"),aw=600*1e3;l(_a,"readProviderCache");l(Na,"writeProviderCache");l(cw,"invalidateProviderCache")});var ut={};he(ut,{AntigravityProvider:()=>Ha,ClaudeProvider:()=>xo,CodexProvider:()=>Ga,CursorProvider:()=>Rd,GeminiProvider:()=>Ua,Providers:()=>Me,WindsurfProvider:()=>$d,detectAllProviders:()=>cn,detectAntigravity:()=>Ss,detectCodex:()=>za,detectCursorProject:()=>Fd,detectProvider:()=>To,detectWindsurfProject:()=>_d,getActiveProvider:()=>pw,getCommandsDir:()=>kw,getGlobalContextPath:()=>hw,getGlobalSettingsPath:()=>yw,getProjectCommandsPath:()=>Sw,getProviderBranding:()=>Eo,getSkillsPath:()=>ww,hasProviderConfig:()=>mw,needsCursorRouterRegeneration:()=>gw,needsWindsurfRouterRegeneration:()=>fw,selectProvider:()=>Wa,validateCliVersion:()=>Od});import{exec as lw}from"node:child_process";import kn from"node:os";import Ge from"node:path";import{promisify as uw}from"node:util";async function Md(s){try{let{stdout:e}=await jd(`which ${s}`,{timeout:Dd});return e.trim()}catch{return null}}async function dw(s){try{let{stdout:e}=await jd(`${s} --version`,{timeout:Dd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function To(s){let e=Me[s];if(!e.cliCommand)return{installed:!1};let t=await Md(e.cliCommand);if(!t)return{installed:!1};let n=await dw(e.cliCommand),r=Od(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function Od(s,e){let t=Me[s];return!t.minCliVersion||!e?null:kd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function cn(s=!1){if(!s){let r=await _a();if(r)return r}let[e,t]=await Promise.all([To("claude"),To("gemini")]),n={claude:e,gemini:t};return await Na(n).catch(()=>{}),n}async function pw(s){if(s&&Me[s])return Me[s];let e=await cn();return e.claude.installed&&!e.gemini.installed?xo:e.gemini.installed&&!e.claude.installed?Ua:xo}async function mw(s){let e=Me[s];return e.configDir?x(e.configDir):!1}function Eo(s){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"}[s]||"\u26A1 prjct"}}async function Fd(s){let e=Ge.join(s,".cursor"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function gw(s){let e=await Fd(s);return e.detected&&!e.routerInstalled}async function _d(s){let e=Ge.join(s,".windsurf"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([x(e),x(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function fw(s){let e=await _d(s);return e.detected&&!e.routerInstalled}async function Ss(){let s=Ha.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=Ge.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([x(s),x(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function za(){let s=Ga.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Md("codex"),t=Ge.join(s,"skills","prjct","SKILL.md"),[n,r]=await Promise.all([x(s),x(t)]),o=!!e||n;return{installed:o,skillInstalled:r,configPath:o?s:void 0}}function hw(s){let e=Me[s];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function yw(s){let e=Me[s];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function ww(s){return Me[s].skillsDir}function kw(s){return Me[s].commandsDir}function Sw(s,e){let t=Me[s];return Ge.join(e,t.commandsDir)}async function Wa(){let s=await cn(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var jd,Dd,xo,Ua,Ha,Rd,$d,Ga,Me,Je=y(()=>{"use strict";Sr();ve();La();jd=uw(lw),Dd=2e3,xo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(kn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(kn.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"},Ua={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(kn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(kn.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"},Ha={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(kn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(kn.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},Rd={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},$d={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},Ga={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(kn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(kn.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},Me={claude:xo,gemini:Ua,cursor:Rd,antigravity:Ha,windsurf:$d,codex:Ga};l(Md,"whichCommand");l(dw,"getCliVersion");l(To,"detectProvider");l(Od,"validateCliVersion");l(cn,"detectAllProviders");l(pw,"getActiveProvider");l(mw,"hasProviderConfig");l(Eo,"getProviderBranding");l(Fd,"detectCursorProject");l(gw,"needsCursorRouterRegeneration");l(_d,"detectWindsurfProject");l(fw,"needsWindsurfRouterRegeneration");l(Ss,"detectAntigravity");l(za,"detectCodex");l(hw,"getGlobalContextPath");l(yw,"getGlobalSettingsPath");l(ww,"getSkillsPath");l(kw,"getCommandsDir");l(Sw,"getProjectCommandsPath");l(Wa,"selectProvider")});import{z as ke}from"zod";function bw(s){return s instanceof bs}function re(s){return bw(s)||s instanceof Error?s.message:typeof s=="string"?s:"Unknown error"}var Cs,HI,GI,zI,WI,BI,VI,bs,Io,Ao,Cr,ln=y(()=>{"use strict";Cs={create(s,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${s}: ${JSON.stringify(o)}`),this.name=s,this.errorName=s,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===s}static create(r){return new t(r)}}return t}},HI=Cs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),GI=Cs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),zI=Cs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),WI=Cs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),BI=Cs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),VI=Cs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),bs=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Io=class s extends bs{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new s("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new s(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new s(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ao=class s extends bs{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new s(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new s(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Cr=class s extends bs{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new s(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new s(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(bw,"isPrjctError");l(re,"getErrorMessage")});var B={};he(B,{calculateDuration:()=>jw,formatDate:()=>jo,formatDuration:()=>Pr,formatMonth:()=>Pw,getDateKey:()=>vw,getDateRange:()=>Ew,getDaysAgo:()=>Sn,getDaysFromNow:()=>Tw,getEndOfDay:()=>Rw,getStartOfDay:()=>Dw,getTimestamp:()=>C,getTodayKey:()=>Nd,getYearMonthDay:()=>Ba,isToday:()=>Iw,isWithinLastDays:()=>Aw,parseDate:()=>xw,toRelative:()=>$w});import{formatDistanceToNowStrict as Cw}from"date-fns";function jo(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0"),n=s.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Pw(s){let e=s.getFullYear(),t=(s.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Nd(){return jo(new Date)}function vw(s){return jo(s)}function Ba(s){return{year:s.getFullYear().toString(),month:(s.getMonth()+1).toString().padStart(2,"0"),day:s.getDate().toString().padStart(2,"0")}}function xw(s){return new Date(s)}function C(){return new Date().toISOString()}function Sn(s){let e=new Date;return e.setDate(e.getDate()-s),e}function Tw(s){let e=new Date;return e.setDate(e.getDate()+s),e}function Ew(s,e){let t=[],n=new Date(s);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Iw(s){return jo(s)===Nd()}function Aw(s,e){let t=Sn(e);return s>=t}function Pr(s){let e=Math.floor(s/1e3),t=Math.floor(e/60),n=Math.floor(t/60),r=Math.floor(n/24);return r>0?`${r}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function jw(s,e=new Date){let t=e.getTime()-s.getTime();return Pr(t)}function Dw(s){let e=new Date(s);return e.setHours(0,0,0,0),e}function Rw(s){let e=new Date(s);return e.setHours(23,59,59,999),e}function $w(s){let e=typeof s=="string"?new Date(s):s;return Cw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(jo,"formatDate");l(Pw,"formatMonth");l(Nd,"getTodayKey");l(vw,"getDateKey");l(Ba,"getYearMonthDay");l(xw,"parseDate");l(C,"getTimestamp");l(Sn,"getDaysAgo");l(Tw,"getDaysFromNow");l(Ew,"getDateRange");l(Iw,"isToday");l(Aw,"isWithinLastDays");l(Pr,"formatDuration");l(jw,"calculateDuration");l(Dw,"getStartOfDay");l(Rw,"getEndOfDay");l($w,"toRelative")});var $o={};he($o,{PACKAGE_ROOT:()=>de,VERSION:()=>Pe,compareVersions:()=>Ld,getPackageInfo:()=>Mw,getPackageRoot:()=>qa,getVersion:()=>xr,isCompatible:()=>Ow,needsMigration:()=>Fw});import Va from"node:fs";import Ro from"node:path";function qa(){if(vr)return vr;let s=__dirname;for(let e=0;e<5;e++){let t=Ro.join(s,"package.json");if(Va.existsSync(t))try{if(JSON.parse(Va.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=s,s}catch{}s=Ro.dirname(s)}return vr=Ro.join(__dirname,"..","..",".."),vr}function xr(){if(Do)return Do;try{let s=Ro.join(qa(),"package.json"),e=JSON.parse(Va.readFileSync(s,"utf-8"));return Do=e.version,Ja=e,Do}catch(s){return console.error("Failed to read version from package.json:",w(s)),"0.0.0"}}function Mw(){return Ja||xr(),Ja}function Ld(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<Math.max(t.length,n.length);r++){let o=t[r]||0,i=n[r]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Ow(s){let e=xr(),[t,n]=e.split(".").map(Number),[r,o]=s.split(".").map(Number);return t===r&&n===o}function Fw(s,e=null){let t=e||xr();return Ld(s,t)<0}var Do,Ja,vr,Pe,de,dt=y(()=>{"use strict";N();Do=null,Ja=null,vr=null;l(qa,"getPackageRoot");l(xr,"getVersion");l(Mw,"getPackageInfo");l(Ld,"compareVersions");l(Ow,"isCompatible");l(Fw,"needsMigration");Pe=xr(),de=qa()});import{exec as _w}from"node:child_process";import{promisify as Nw}from"node:util";async function Mo(s){try{let{stdout:e}=await Lw(s,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Uw(){let s=await Mo("gh api user --jq .login");return s.success&&s.output||(s=await Mo("git config --global github.user"),s.success&&s.output)?s.output:null}async function Hw(){let s=await Mo("git config user.name");return s.success&&s.output?s.output:null}async function Gw(){let s=await Mo("git config user.email");return s.success&&s.output?s.output:null}async function Ps(){let[s,e,t]=await Promise.all([Uw(),Hw(),Gw()]);return{github:s,email:t,name:e||s||"Unknown"}}var Lw,Oo=y(()=>{"use strict";Lw=Nw(_w);l(Mo,"execCommand");l(Uw,"detectGitHubUsername");l(Hw,"detectGitName");l(Gw,"detectGitEmail");l(Ps,"detect")});import zw from"node:crypto";import Qt from"node:fs/promises";import Ya from"node:os";import G from"node:path";import{globSync as Ww}from"glob";var Xa,Bw,I,Se=y(()=>{"use strict";le();ve();Xa=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?G.resolve(e):G.join(Ya.homedir(),".prjct-cli"),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=G.resolve(e),this.globalProjectsDir=G.join(this.globalBaseDir,"projects"),this.globalConfigDir=G.join(this.globalBaseDir,"config")}generateProjectId(e){return zw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return G.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return G.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return G.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return G.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Po(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await Nt(this.globalBaseDir),await Nt(this.globalProjectsDir),await Nt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let r of n)await Nt(G.join(t,r));return await Nt(G.join(t,"planning","tasks")),await Nt(G.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=Ba(t);return G.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Nt(n),n}async listSessions(e,t=null,n=null){let r=G.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=G.join(r,a.name),u=await Qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=G.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:G.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return G.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Po(t)}getDisplayPath(e){let t=Ya.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return G.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return G.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return G.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return G.join(this.globalBaseDir,".running")}getDocsPath(){return G.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),xt(ut)).getActiveProvider();return(Je(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return G.join(Ya.homedir(),".claude")}getClaudeSettingsPath(){return G.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?G.join(this.getGlobalProjectPath(e),"agents"):G.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return G.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return G.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{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 r of n){let o=G.join(e,r.file);if(await x(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=G.join(e,"package.json");if(await x(r))try{let o=await Qt.readFile(r,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],r=[];try{if(t==="pnpm"){let i=(await Qt.readFile(G.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
13
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=G.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=G.join(e,"lerna.json");if(await x(c)){let u=await Qt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=G.join(e,"package.json"),i=await Qt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Ww(o,{cwd:e,absolute:!1});for(let a of i){let c=G.join(e,a),u=G.join(c,"package.json");if(await x(u))try{let d=await Qt.readFile(u,"utf-8"),m=JSON.parse(d),p=G.join(c,"PRJCT.md");n.push({name:m.name||G.basename(a),path:c,relativePath:a,hasPrjctMd:await x(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=G.resolve(e);for(let r of t.packages){let o=G.resolve(r.path);if(n.startsWith(o))return r}return null}async findMonorepoRoot(e){let t=G.resolve(e),n=G.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=G.dirname(t)}return null}},Bw=new Xa,I=Bw});var Hd={};he(Hd,{default:()=>R});import Hn from"node:fs/promises";import Vw from"node:path";import*as Fo from"jsonc-parser";function Ud(s){let e=[],t=Fo.parse(s,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Fo.printParseErrorCode(n.error)}`)}return t}var Qa,Jw,R,qe=y(()=>{"use strict";ln();N();le();dt();Oo();Se();l(Ud,"parseJsonc");Qa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),n=await Hn.readFile(t,"utf-8");return Ud(n)}catch(t){return P(t)||console.warn(`Warning: Could not read config at ${e}: ${re(t)}`),null}}async writeConfig(e,t){let n=I.getLocalConfigPath(e),r=I.getLegacyPrjctPath(e);await Hn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
14
+ `,"utf-8")}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),n=await Hn.readFile(t,"utf-8");return Ud(n)}catch(t){return P(t)||console.warn(`Warning: Could not read global config for ${e}: ${re(t)}`),null}}async writeGlobalConfig(e,t){let n=I.getGlobalProjectConfigPath(e),r=I.getGlobalProjectPath(e);await Hn.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await Hn.writeFile(n,`${o}
15
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:Pe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=I.generateProjectId(e),r=I.getGlobalProjectPath(n),o=I.getDisplayPath(r),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Pe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=I.getGlobalProjectPath(r.projectId);try{return(await Hn.readdir(Vw.join(o,"core"))).length===0}catch(i){return P(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:I.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let r=n.authors.find(o=>o.github===t);r&&(r.lastActivity=C(),n.lastSync=r.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await Ps(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=I.generateProjectId(e);return{projectId:n,dataPath:I.getDisplayPath(I.getGlobalProjectPath(n))}}},Jw=new Qa,R=Jw});var zd={};he(zd,{default:()=>ec});import vs from"node:fs/promises";import qw from"node:os";import Gd from"node:path";var Za,Kw,ec,tc=y(()=>{"use strict";N();Za=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=qw.homedir(),this.configDir=Gd.join(this.homeDir,".prjct-cli","config"),this.configFile=Gd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await vs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await vs.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",w(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await vs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await vs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Kw=new Za,ec=Kw});function Yw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Tr(){return Yw()==="bun"}var nc=y(()=>{"use strict";l(Yw,"detectRuntime");l(Tr,"isBun")});import sc from"node:fs";import Wd from"node:path";function Xw(s){if(Tr()){let{Database:r}=yr("bun:sqlite");return new r(s,{create:!0})}let e=yr("better-sqlite3"),t=new e(s),n=t.exec.bind(t);return t.run=r=>n(r),t}var Qw,_o,M,q,ye=y(()=>{"use strict";Se();nc();l(Xw,"openDatabase");Qw=[{version:1,name:"initial-schema",up:l(s=>{s.run(`
16
16
  -- =======================================================================
17
17
  -- Document storage (backward-compatible with JSON file pattern)
18
18
  -- =======================================================================
@@ -226,7 +226,7 @@ var Py=Object.create;var hr=Object.defineProperty;var Ty=Object.getOwnPropertyDe
226
226
  started_at TEXT,
227
227
  ended_at TEXT
228
228
  );
229
- `)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
229
+ `)},"up")},{version:2,name:"archives-table",up:l(s=>{s.run(`
230
230
  -- =======================================================================
231
231
  -- Archives: Stale data moved out of active storage (PRJ-267)
232
232
  -- =======================================================================
@@ -243,13 +243,13 @@ var Py=Object.create;var hr=Object.defineProperty;var Ty=Object.getOwnPropertyDe
243
243
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
244
244
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
245
245
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
246
- `)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Nd.join(I.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Nd.dirname(n);Ka.existsSync(s)||Ka.mkdirSync(s,{recursive:!0});let o=zw(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return Ka.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,n){let s=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,n,s){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
246
+ `)},"up")}],_o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Wd.join(I.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),r=Wd.dirname(n);sc.existsSync(r)||sc.mkdirSync(r,{recursive:!0});let o=Xw(n);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return sc.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,n){let r=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,n,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):r.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
247
247
  CREATE TABLE IF NOT EXISTS _migrations (
248
248
  version INTEGER PRIMARY KEY,
249
249
  name TEXT NOT NULL,
250
250
  applied_at TEXT NOT NULL
251
251
  )
252
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Ww)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new $o,V=$});var Ld=y(()=>{"use strict"});import Er from"node:fs/promises";import Sn from"node:path";import{z as ue}from"zod";async function Kw(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=Sn.join(e,"package.json"),s=await Er.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Yw(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await ek(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=qw[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Xw(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=Sn.join(e,a);try{await Er.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Qw(r,e){let t=Date.now();try{let n=await tk(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Zw(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],s=[];for(let o of r.antiPatterns){let i=Sn.join(e,o.file);try{await Er.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Hd(r,e){let t=Date.now(),n=await Promise.all([Kw(r,e),Yw(r,e),Xw(r,e),Qw(r,e),Zw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function ek(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Er.readdir(s,{withFileTypes:!0});for(let i of o){let a=Sn.join(s,i.name),c=Sn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=Sn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function tk(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Er.readdir(s,{withFileTypes:!0});for(let i of o){let a=Sn.join(s,i.name),c=Sn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var Bw,Vw,Jw,Ya,IA,qw,Xa=y(()=>{"use strict";_();Sr();Bw=ue.enum(["draft","verified","sealed"]),Vw=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Jw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ya=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(Vw),antiPatterns:ue.array(Jw),analyzedAt:ue.string(),modelMetadata:kr.optional(),status:Bw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),IA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},qw={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(Kw,"verifyFrameworks");l(Yw,"verifyLanguages");l(Xw,"verifyPatternLocations");l(Qw,"verifyFileCount");l(Zw,"verifyAntiPatternFiles");l(Hd,"semanticVerify");l(ek,"getProjectExtensions");l(tk,"countProjectFiles")});import{z as Oe}from"zod";var Mo,bn,nk,RA,Qa,Ud,Ir=y(()=>{"use strict";Mo=Oe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),bn=Oe.object({primaryDomain:Mo,secondaryDomains:Oe.array(Mo),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),nk=Oe.object({classification:bn,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),RA=Oe.object({entries:Oe.record(Oe.string(),nk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:bn,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),Qa={entries:{},confirmedPatterns:[]},Ud={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var sk,rk,Gd,ok,ik,ak,ck,lk,zd,OA,Za=y(()=>{"use strict";sk=z.enum(["low","medium","high"]),rk=z.enum(["pending","converted","completed","archived","dormant"]),Gd=z.enum(["high","medium","low"]),ok=z.object({impact:Gd,effort:Gd}),ik=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),ak=z.object({name:z.string(),description:z.string()}),ck=z.object({name:z.string(),description:z.string().optional()}),lk=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:sk,status:rk,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:ok.optional(),implementationNotes:z.string().optional(),stack:ik.optional(),modules:z.array(ak).optional(),roles:z.array(ck).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),zd=z.object({ideas:z.array(lk),lastUpdated:z.string()}),OA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Bd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Wd,uk,dk,pk,mk,LA,HA,ec=y(()=>{"use strict";Wd=Y.enum(["linear","jira","github","monday","asana","none"]),uk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),dk=Y.enum(["none","urgent","high","medium","low"]),pk=Y.enum(["feature","bug","improvement","task","chore","epic"]),mk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:uk,priority:dk,type:pk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),LA=Y.object({provider:Wd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),mk)}),HA=Y.object({provider:Wd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Bd,"createEmptyIssues")});var Yd={};fe(Yd,{AgentAssignmentSchema:()=>Vd,OUTPUT_SCHEMAS:()=>qd,SubtaskBreakdownSchema:()=>Jd,TaskClassificationSchema:()=>bn,renderSchemaForPrompt:()=>tc});import{z as Je}from"zod";function tc(r){let e=qd[r];return e?`## OUTPUT FORMAT
252
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Qw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},M=new _o,q=M});var Bd=y(()=>{"use strict"});import Er from"node:fs/promises";import bn from"node:path";import{z as ue}from"zod";async function sk(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=bn.join(e,"package.json"),r=await Er.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rk(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await ck(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=nk[a];if(!c)continue;c.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ok(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,c=bn.join(e,a);try{await Er.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function ik(s,e){let t=Date.now();try{let n=await lk(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ak(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=bn.join(e,o.file);try{await Er.access(i),r.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Vd(s,e){let t=Date.now(),n=await Promise.all([sk(s,e),rk(s,e),ok(s,e),ik(s,e),ak(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function ck(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=bn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(s),Array.from(e)}async function lk(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await Er.readdir(r,{withFileTypes:!0});for(let i of o){let a=bn.join(r,i.name),c=bn.relative(s,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(s),e}var Zw,ek,tk,rc,NA,nk,oc=y(()=>{"use strict";N();Sr();Zw=ue.enum(["draft","verified","sealed"]),ek=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),tk=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),rc=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(ek),antiPatterns:ue.array(tk),analyzedAt:ue.string(),modelMetadata:kr.optional(),status:Zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),NA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},nk={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(sk,"verifyFrameworks");l(rk,"verifyLanguages");l(ok,"verifyPatternLocations");l(ik,"verifyFileCount");l(ak,"verifyAntiPatternFiles");l(Vd,"semanticVerify");l(ck,"getProjectExtensions");l(lk,"countProjectFiles")});import{z as Oe}from"zod";var No,Cn,uk,GA,ic,Jd,Ir=y(()=>{"use strict";No=Oe.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Cn=Oe.object({primaryDomain:No,secondaryDomains:Oe.array(No),confidence:Oe.number().min(0).max(1),filePatterns:Oe.array(Oe.string()),relevantAgents:Oe.array(Oe.string())}),uk=Oe.object({classification:Cn,classifiedAt:Oe.string(),source:Oe.enum(["cache","history","llm","heuristic"]),descriptionHash:Oe.string(),projectId:Oe.string()}),GA=Oe.object({entries:Oe.record(Oe.string(),uk),confirmedPatterns:Oe.array(Oe.object({descriptionHash:Oe.string(),classification:Cn,confirmedAt:Oe.string(),taskDescription:Oe.string()}))}),ic={entries:{},confirmedPatterns:[]},Jd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as W}from"zod";var dk,pk,qd,mk,gk,fk,hk,yk,Kd,BA,ac=y(()=>{"use strict";dk=W.enum(["low","medium","high"]),pk=W.enum(["pending","converted","completed","archived","dormant"]),qd=W.enum(["high","medium","low"]),mk=W.object({impact:qd,effort:qd}),gk=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),fk=W.object({name:W.string(),description:W.string()}),hk=W.object({name:W.string(),description:W.string().optional()}),yk=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:dk,status:pk,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:mk.optional(),implementationNotes:W.string().optional(),stack:gk.optional(),modules:W.array(fk).optional(),roles:W.array(hk).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Kd=W.object({ideas:W.array(yk),lastUpdated:W.string()}),BA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Xd(s){return{provider:s,lastSync:"",staleAfter:18e5,issues:{}}}var Yd,wk,kk,Sk,bk,KA,YA,cc=y(()=>{"use strict";Yd=Y.enum(["linear","jira","github","monday","asana","none"]),wk=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),kk=Y.enum(["none","urgent","high","medium","low"]),Sk=Y.enum(["feature","bug","improvement","task","chore","epic"]),bk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:wk,priority:kk,type:Sk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),KA=Y.object({provider:Yd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),bk)}),YA=Y.object({provider:Yd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Xd,"createEmptyIssues")});var np={};he(np,{AgentAssignmentSchema:()=>Qd,OUTPUT_SCHEMAS:()=>ep,SubtaskBreakdownSchema:()=>Zd,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>lc});import{z as Ke}from"zod";function lc(s){let e=ep[s];return e?`## OUTPUT FORMAT
253
253
 
254
254
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
255
255
 
@@ -258,28 +258,28 @@ ${e.example}
258
258
  \`\`\`
259
259
 
260
260
  Fields:
261
- ${gk(e.schema)}`:null}function gk(r){if(r instanceof Je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Kd(n)}`).join(`
262
- `)}return"(see example above)"}function Kd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Kd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var Vd,Jd,qd,Oo=y(()=>{"use strict";Ir();Ir();Vd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Jd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),qd={classification:{schema:bn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Vd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Jd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(tc,"renderSchemaForPrompt");l(gk,"describeSchema");l(Kd,"describeField")});import{z as E}from"zod";var Xd,fk,hk,Qd,yk,wk,kk,Sk,bk,Ck,vk,Zd,xk,Pk,qA,ep,tp,np,sp,Tk,Fo,nc=y(()=>{"use strict";Xd=E.number().min(1).max(5),fk=E.enum(["exceeded","met","partial","failed"]),hk=E.enum(["definitely","probably","maybe","no"]),Qd=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),yk=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:Qd.optional(),explanation:E.string().optional()})}),wk=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),kk=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Sk=E.object({metrics:E.array(wk),acceptanceCriteria:E.array(kk),overallSuccess:fk,successScore:E.number().min(0).max(100)}),bk=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),Ck=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(bk)}),vk=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:hk,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),Zd=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Xd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),xk=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:yk,success:Sk.optional(),learnings:Ck,roi:vk,rating:Xd,taskOutcomes:E.array(Zd).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),Pk=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:Qd,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),qA=E.object({outcomes:E.array(xk),taskOutcomes:E.array(Zd).optional(),aggregates:Pk.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),ep={outcomes:[],taskOutcomes:[],lastUpdated:""},tp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),np=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),sp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Tk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>Tk(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ge}from"zod";function Rk(){let r={};for(let e of Ak)r[e]="allow";for(let e of jk)r[e]="ask";for(let e of Dk)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,QA,Ek,sc,Ik,ZA,Ak,jk,Dk,ej,rp=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),QA=Ge.enum(["read","write","delete","create"]),Ek=Ge.record(Ge.string(),_o),sc=Ge.record(Ge.string(),_o),Ik=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),ZA=Ge.object({bash:Ek.optional(),files:Ge.object({read:sc.optional(),write:sc.optional(),delete:sc.optional()}).optional(),web:Ik.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),Ak=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],jk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Dk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Rk,"buildDefaultPermissions");ej=Rk()});import{z as at}from"zod";var rj,oj,op=y(()=>{"use strict";rj=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),oj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var $k,Mk,Ok,Fk,_k,Nk,Lk,Hk,Uk,Gk,zk,Wk,Bk,Vk,Jk,qk,Kk,Yk,lj,uj,ip=y(()=>{"use strict";$k=A.enum(["planned","active","completed","shipped"]),Mk=A.enum(["low","medium","high"]),Ok=A.enum(["feature","breaking_change","refactor","infrastructure"]),Fk=A.enum(["completed","active","planned"]),_k=A.enum(["planned","active","completed"]),Nk=A.enum(["git","git-branch","manual","prd"]),Lk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),Hk=A.object({id:A.string(),name:A.string(),status:Fk,completedAt:A.string().optional()}),Uk=A.object({goal:A.string(),phases:A.array(Hk),successMetrics:A.array(A.string()).optional()}),Gk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),zk=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),Wk=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Bk=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),Vk=A.object({estimated:Wk.nullable(),actual:Bk.nullable()}),Jk=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),qk=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:Jk.optional(),status:_k,startDate:A.string().optional(),endDate:A.string().optional()}),Kk=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:$k,impact:Mk,effort:A.string().optional(),progress:A.number(),type:Ok.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(Lk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Gk.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:Nk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:Vk.optional(),valueScore:A.number().optional(),commits:A.array(zk).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),Yk=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),lj=A.object({strategy:Uk.nullable().optional(),features:A.array(Kk),backlog:A.array(A.union([A.string(),Yk])),lastUpdated:A.string(),quarters:A.array(qk).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),uj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import Xk from"node:crypto";import{homedir as Qk}from"node:os";import{join as Zk}from"node:path";function me(){return Xk.randomUUID()}var eS,ap=y(()=>{"use strict";l(me,"generateUUID");eS=Zk(Qk(),".prjct-cli","projects")});import{z as Q}from"zod";var tS,cp,nS,sS,rS,oS,iS,aS,cS,lp,rc=y(()=>{"use strict";tS=Q.enum(["feature","fix","improvement","refactor"]),cp=Q.enum(["pass","warning","fail","skipped"]),nS=Q.enum(["added","changed","fixed","removed"]),sS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),rS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),oS=Q.object({description:Q.string(),type:nS.optional()}),iS=Q.object({lintStatus:cp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:cp.nullable().optional(),testDetails:Q.string().optional()}),aS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),cS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:tS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(oS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:aS.optional(),codeMetrics:rS.optional(),qualityMetrics:iS.optional(),quantitativeImpact:Q.string().optional(),duration:sS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),lp=Q.object({shipped:Q.array(cS),lastUpdated:Q.string()})});import{z as T}from"zod";var lS,dp,uS,dS,pS,oc,pp,mS,gS,mp,up,fS,hS,gp,fp,hp,yS,wS,vj,No=y(()=>{"use strict";Sr();lS=T.enum(["low","medium","high","critical"]),dp=T.enum(["feature","bug","improvement","chore"]),uS=T.enum(["active","backlog","previously_active"]),dS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),pS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),oc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),pp=T.object({output:T.string().min(1,"Subtask output is required"),summary:oc}),mS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:dS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:oc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),gS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),mp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(mS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:gS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:kr.optional()}),up=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),fS=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),hS=T.object({taskId:T.string(),title:T.string(),classification:dp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(oc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:fS.optional()}),gp=T.object({currentTask:mp.nullable(),previousTask:up.nullable().optional(),pausedTasks:T.array(up).optional(),taskHistory:T.array(hS).optional(),lastUpdated:T.string()}),fp=T.object({id:T.string(),description:T.string(),priority:lS,type:dp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:uS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),hp=T.object({tasks:T.array(fp),lastUpdated:T.string()}),yS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),wS=T.object({type:pS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),vj=T.object({projectId:T.string(),currentTask:mp.nullable(),queue:T.array(fp),stats:yS,recentActivity:T.array(wS),lastSync:T.string()})});import{z as ie}from"zod";var kS,SS,yp,Ej,Ij,Aj,Cn,wp,Ps=y(()=>{"use strict";kS=ie.enum(["improving","stable","declining"]),SS=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),yp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),Ej=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),Ij=ie.object({sprints:ie.array(SS),averageVelocity:ie.number(),velocityTrend:kS,estimationAccuracy:ie.number(),overEstimated:ie.array(yp),underEstimated:ie.array(yp),lastUpdated:ie.string()}),Aj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),Cn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},wp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Ld();Xa();Ir();Za();ec();Oo();Sr();nc();rp();op();ip();ap();rc();No();Ps()});var Zt,ic,kt,vn=y(()=>{"use strict";Lt();le();he();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ic=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=me(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(me(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new ic});var kp=y(()=>{"use strict"});var Lo,Sp=y(()=>{"use strict";Lo={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Ts,Ho=y(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var bp=y(()=>{"use strict"});var Cp=y(()=>{"use strict";bp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,vp,Es=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},vp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ac=y(()=>{"use strict"});var cc=y(()=>{"use strict";kp();Sp();Ho();_();Cp();Es();ac()});function Is(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return xS[r]}var re,lc,uc,Go,xS,Tt,xp,Ar,un=y(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},lc=["feature","spec","design","refactor","migrate"],uc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],xS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Is,"getTimeout");Tt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},xp={HISTORY_MAX:100},Ar={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function TS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(PS.has(r)||r.includes("prjct"))return{level:As.debug,name:"debug"};let e=As[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Pp>=r?(...n)=>console[t](e,...n):IS}var As,PS,Pp,ES,IS,AS,H,Un=y(()=>{"use strict";As={error:0,warn:1,info:2,debug:3},PS=new Set(["1","true","*"]);l(TS,"getLogLevel");({level:Pp,name:ES}=TS()),IS=l(()=>{},"noop");l(zo,"createLogMethod");AS={error:zo(As.error,"[prjct:error]","error"),warn:zo(As.warn,"[prjct:warn]","warn"),info:zo(As.info,"[prjct:info]","log"),debug:zo(As.debug,"[prjct:debug]","log"),isEnabled:l(()=>Pp>=0,"isEnabled"),level:l(()=>ES,"level")},H=AS});var Wo,jS,Tp=y(()=>{"use strict";ln();he();cc();un();Un();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=xp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Lo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Lo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",se(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},jS=new Wo});var Bo,Vo,Ep=y(()=>{"use strict";Se();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Ln(t,[])??[];n.push(e),await br(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Ln(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await br(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await br(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Ln(t,null)}},Vo=new Bo});var dc=y(()=>{"use strict";Tp();Ep()});var Ht,Jo=y(()=>{"use strict";Ht=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,en=y(()=>{"use strict";dc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ht({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Vo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var pc,Ye,jr=y(()=>{"use strict";Lt();Za();le();vn();en();pc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",zd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:me(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=kn(Zt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ye=new pc});var mc,Pe,Dr=y(()=>{"use strict";Lt();No();le();vn();en();mc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",hp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:me(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:me(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=kn(Zt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Pe=new mc});var gc,pt,Rr=y(()=>{"use strict";Lt();rc();le();vn();en();gc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",lp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:me(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=kn(Zt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;kt.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new gc});var $r,fc,Gn,hc=y(()=>{"use strict";$r={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},fc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=$r[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return $r[e]}getPrompt(e){return $r[e].prompt}getValidCommands(e){return $r[e].transitions}formatNextSteps(e){return $r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Gn=new fc});var yc,L,Mr=y(()=>{"use strict";Lt();No();le();hc();vn();en();yc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",gp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Gn.getCurrentState(e),s=Gn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:me()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=pp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
261
+ ${Ck(e.schema)}`:null}function Ck(s){if(s instanceof Ke.ZodObject){let e=s.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${tp(n)}`).join(`
262
+ `)}return"(see example above)"}function tp(s){return s instanceof Ke.ZodString?"string":s instanceof Ke.ZodNumber?"number":s instanceof Ke.ZodEnum?`one of: ${s.options.join(", ")}`:s instanceof Ke.ZodArray?`array of ${tp(s.element)}`:s instanceof Ke.ZodObject?"object":"any"}var Qd,Zd,ep,Lo=y(()=>{"use strict";Ir();Ir();Qd=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),Zd=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:No,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),ep={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Zd,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};l(lc,"renderSchemaForPrompt");l(Ck,"describeSchema");l(tp,"describeField")});import{z as E}from"zod";var sp,Pk,vk,rp,xk,Tk,Ek,Ik,Ak,jk,Dk,op,Rk,$k,rj,ip,ap,cp,lp,Mk,Uo,uc=y(()=>{"use strict";sp=E.number().min(1).max(5),Pk=E.enum(["exceeded","met","partial","failed"]),vk=E.enum(["definitely","probably","maybe","no"]),rp=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),xk=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:rp.optional(),explanation:E.string().optional()})}),Tk=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),Ek=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),Ik=E.object({metrics:E.array(Tk),acceptanceCriteria:E.array(Ek),overallSuccess:Pk,successScore:E.number().min(0).max(100)}),Ak=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),jk=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(Ak)}),Dk=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:vk,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),op=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:sp,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),Rk=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:xk,success:Ik.optional(),learnings:jk,roi:Dk,rating:sp,taskOutcomes:E.array(op).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),$k=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:rp,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),rj=E.object({outcomes:E.array(Rk),taskOutcomes:E.array(op).optional(),aggregates:$k.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),ip={outcomes:[],taskOutcomes:[],lastUpdated:""},ap=l((s,e)=>{let t=e-s,n=s>0?(e-s)/s*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),cp=l((s,e)=>e<=0?s*10:Math.round(s*10/e*100)/100,"calculateROIScore"),lp=l(s=>s>=100?"exceeded":s>=80?"met":s>=50?"partial":"failed","determineSuccessLevel"),Mk=l(s=>Math.max(0,100-Math.abs(s)),"calculateEstimationAccuracy"),Uo=l(s=>{if(s.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=s.map(d=>Mk(d.effort.variance.percentage)),t=s.filter(d=>d.success).map(d=>d.success.successScore),n=s.map(d=>d.roi.roiScore),r={exceeded:s.filter(d=>d.success?.overallSuccess==="exceeded").length,met:s.filter(d=>d.success?.overallSuccess==="met").length,partial:s.filter(d=>d.success?.overallSuccess==="partial").length,failed:s.filter(d=>d.success?.overallSuccess==="failed").length},o=s.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=s.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:s.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as ze}from"zod";function Uk(){let s={};for(let e of _k)s[e]="allow";for(let e of Nk)s[e]="ask";for(let e of Lk)s[e]="deny";return{bash:s,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Ho,cj,Ok,dc,Fk,lj,_k,Nk,Lk,uj,up=y(()=>{"use strict";Ho=ze.enum(["allow","deny","ask"]),cj=ze.enum(["read","write","delete","create"]),Ok=ze.record(ze.string(),Ho),dc=ze.record(ze.string(),Ho),Fk=ze.object({enabled:ze.boolean().default(!0),allowedDomains:ze.array(ze.string()).optional(),blockedDomains:ze.array(ze.string()).optional()}),lj=ze.object({bash:Ok.optional(),files:ze.object({read:dc.optional(),write:dc.optional(),delete:dc.optional()}).optional(),web:Fk.optional(),skills:ze.record(ze.string(),Ho).optional(),doomLoop:ze.object({enabled:ze.boolean().default(!0),maxRetries:ze.number().default(3)}).optional(),externalDirectories:Ho.default("ask")}),_k=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Nk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Lk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Uk,"buildDefaultPermissions");uj=Uk()});import{z as at}from"zod";var gj,fj,dp=y(()=>{"use strict";gj=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),fj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Hk,Gk,zk,Wk,Bk,Vk,Jk,qk,Kk,Yk,Xk,Qk,Zk,eS,tS,nS,sS,rS,kj,Sj,pp=y(()=>{"use strict";Hk=A.enum(["planned","active","completed","shipped"]),Gk=A.enum(["low","medium","high"]),zk=A.enum(["feature","breaking_change","refactor","infrastructure"]),Wk=A.enum(["completed","active","planned"]),Bk=A.enum(["planned","active","completed"]),Vk=A.enum(["git","git-branch","manual","prd"]),Jk=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),qk=A.object({id:A.string(),name:A.string(),status:Wk,completedAt:A.string().optional()}),Kk=A.object({goal:A.string(),phases:A.array(qk),successMetrics:A.array(A.string()).optional()}),Yk=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),Xk=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),Qk=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Zk=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),eS=A.object({estimated:Qk.nullable(),actual:Zk.nullable()}),tS=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),nS=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:tS.optional(),status:Bk,startDate:A.string().optional(),endDate:A.string().optional()}),sS=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Hk,impact:Gk,effort:A.string().optional(),progress:A.number(),type:zk.optional(),roi:A.number().optional(),why:A.array(A.string()).optional(),technicalNotes:A.array(A.string()).optional(),compatibility:A.string().optional(),phase:A.string().optional(),tasks:A.array(Jk),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Yk.optional(),taskCount:A.number().optional(),agent:A.string().optional(),sprintName:A.string().optional(),completedDate:A.string().optional(),prdId:A.string().nullable().optional(),legacy:A.boolean().optional(),inferredFrom:Vk.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:eS.optional(),valueScore:A.number().optional(),commits:A.array(Xk).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),rS=A.object({id:A.string(),title:A.string(),prdId:A.string().nullable().optional(),valueScore:A.number().optional(),effortEstimate:A.number().optional(),reason:A.string().optional()}),kj=A.object({strategy:Kk.nullable().optional(),features:A.array(sS),backlog:A.array(A.union([A.string(),rS])),lastUpdated:A.string(),quarters:A.array(nS).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),Sj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import oS from"node:crypto";import{homedir as iS}from"node:os";import{join as aS}from"node:path";function ge(){return oS.randomUUID()}var cS,mp=y(()=>{"use strict";l(ge,"generateUUID");cS=aS(iS(),".prjct-cli","projects")});import{z as Q}from"zod";var lS,gp,uS,dS,pS,mS,gS,fS,hS,fp,pc=y(()=>{"use strict";lS=Q.enum(["feature","fix","improvement","refactor"]),gp=Q.enum(["pass","warning","fail","skipped"]),uS=Q.enum(["added","changed","fixed","removed"]),dS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),pS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),mS=Q.object({description:Q.string(),type:uS.optional()}),gS=Q.object({lintStatus:gp.nullable().optional(),lintDetails:Q.string().optional(),testStatus:gp.nullable().optional(),testDetails:Q.string().optional()}),fS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),hS=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:lS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(mS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:fS.optional(),codeMetrics:pS.optional(),qualityMetrics:gS.optional(),quantitativeImpact:Q.string().optional(),duration:dS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),fp=Q.object({shipped:Q.array(hS),lastUpdated:Q.string()})});import{z as T}from"zod";var yS,yp,wS,kS,SS,mc,wp,bS,CS,kp,hp,PS,vS,Sp,bp,Cp,xS,TS,$j,Go=y(()=>{"use strict";Sr();yS=T.enum(["low","medium","high","critical"]),yp=T.enum(["feature","bug","improvement","chore"]),wS=T.enum(["active","backlog","previously_active"]),kS=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),SS=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),mc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),wp=T.object({output:T.string().min(1,"Subtask output is required"),summary:mc}),bS=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:kS,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:mc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),CS=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),kp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(bS).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:CS.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:kr.optional()}),hp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),PS=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),vS=T.object({taskId:T.string(),title:T.string(),classification:yp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(mc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:PS.optional()}),Sp=T.object({currentTask:kp.nullable(),previousTask:hp.nullable().optional(),pausedTasks:T.array(hp).optional(),taskHistory:T.array(vS).optional(),lastUpdated:T.string()}),bp=T.object({id:T.string(),description:T.string(),priority:yS,type:yp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:wS,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Cp=T.object({tasks:T.array(bp),lastUpdated:T.string()}),xS=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),TS=T.object({type:SS,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),$j=T.object({projectId:T.string(),currentTask:kp.nullable(),queue:T.array(bp),stats:xS,recentActivity:T.array(TS),lastSync:T.string()})});import{z as ie}from"zod";var ES,IS,Pp,_j,Nj,Lj,Pn,vp,xs=y(()=>{"use strict";ES=ie.enum(["improving","stable","declining"]),IS=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Pp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),_j=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),Nj=ie.object({sprints:ie.array(IS),averageVelocity:ie.number(),velocityTrend:ES,estimationAccuracy:ie.number(),overEstimated:ie.array(Pp),underEstimated:ie.array(Pp),lastUpdated:ie.string()}),Lj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),Pn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},vp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Lt=y(()=>{"use strict";Bd();oc();Ir();ac();cc();Lo();Sr();uc();up();dp();pp();mp();pc();Go();xs()});var Zt,gc,kt,vn=y(()=>{"use strict";Lt();le();ye();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},gc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ge(),r=C();return M.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return M.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ge(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?M.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):M.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=M.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=M.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(M.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);M.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return M.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},kt=new gc});var xp=y(()=>{"use strict"});var zo,Tp=y(()=>{"use strict";zo={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Ts,Wo=y(()=>{"use strict";Ts={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'p. linear setup' to configure Linear"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});var Ep=y(()=>{"use strict"});var Ip=y(()=>{"use strict";Ep()});function Bo(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var O,Ap,Es=y(()=>{"use strict";O={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Ap=["frontend","backend","devops","docs","testing","database","general"];l(Bo,"calculateConfidence")});var fc=y(()=>{"use strict"});var hc=y(()=>{"use strict";xp();Tp();Wo();N();Ip();Es();fc()});function Is(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return RS[s]}var oe,yc,wc,Vo,RS,Et,jp,Ar,un=y(()=>{"use strict";oe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},yc=["feature","spec","design","refactor","migrate"],wc=["ship","cleanup","git","migrate"],Vo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],RS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Is,"getTimeout");Et={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},jp={HISTORY_MAX:100},Ar={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function MS(){let s=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!s)return{level:-1,name:"disabled"};if($S.has(s)||s.includes("prjct"))return{level:As.debug,name:"debug"};let e=As[s]??-1,t=e>=0?s:"disabled";return{level:e,name:t}}function Jo(s,e,t){return Dp>=s?(...n)=>console[t](e,...n):FS}var As,$S,Dp,OS,FS,_S,U,Gn=y(()=>{"use strict";As={error:0,warn:1,info:2,debug:3},$S=new Set(["1","true","*"]);l(MS,"getLogLevel");({level:Dp,name:OS}=MS()),FS=l(()=>{},"noop");l(Jo,"createLogMethod");_S={error:Jo(As.error,"[prjct:error]","error"),warn:Jo(As.warn,"[prjct:warn]","warn"),info:Jo(As.info,"[prjct:info]","log"),debug:Jo(As.debug,"[prjct:debug]","log"),isEnabled:l(()=>Dp>=0,"isEnabled"),level:l(()=>OS,"level")},U=_S});var qo,NS,Rp=y(()=>{"use strict";ln();ye();hc();un();Gn();qo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=jp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),r={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).forEach(u=>{u.status==="rejected"&&U.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(zo.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let r=this.listeners.get(zo.ALL);r&&t.push(...r);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{M.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",re(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(r=>r.type===t||r.type.startsWith(t))),n.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},NS=new qo});var Ko,Yo,$p=y(()=>{"use strict";Se();le();ve();Ko=class{static{l(this,"SyncEventBus")}async publish(e){let t=I.getSyncPendingPath(e.projectId),n=await Un(t,[])??[];n.push(e),await br(t,n)}async getPending(e){let t=I.getSyncPendingPath(e);return await Un(t,[])??[]}async clearPending(e){let t=I.getSyncPendingPath(e);await br(t,[])}async updateLastSync(e){let t=I.getLastSyncPath(e),n={timestamp:C(),success:!0};await br(t,n)}async getLastSync(e){let t=I.getLastSyncPath(e);return await Un(t,null)}},Yo=new Ko});var kc=y(()=>{"use strict";Rp();$p()});var Ut,Xo=y(()=>{"use strict";Ut=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var We,en=y(()=>{"use strict";kc();Xo();le();ye();We=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ut({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=M.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){M.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Yo.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return M.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Sc,Qe,jr=y(()=>{"use strict";Lt();ac();le();vn();en();Sc=class extends We{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Kd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:ge(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Sn(Zt.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Qe=new Sc});var bc,xe,Dr=y(()=>{"use strict";Lt();Go();le();vn();en();bc=class extends We{static{l(this,"QueueStorage")}constructor(){super("queue.json",Cp)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:ge(),createdAt:C(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),r=t.map(o=>({...o,id:ge(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(r=>r.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let r=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Sn(Zt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((r,o)=>{let i=n[r.section]-n[o.section];if(i!==0)return i;let a=t[r.priority]-t[o.priority];return a!==0?a:new Date(r.createdAt).getTime()-new Date(o.createdAt).getTime()})}},xe=new bc});var Cc,pt,Rr=y(()=>{"use strict";Lt();pc();le();vn();en();Cc=class extends We{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",fp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:ge(),shippedAt:C()};return await this.update(e,r=>({shipped:[n,...r.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,r;switch(t){case"week":r=new Date(n.getTime()-10080*60*1e3);break;case"month":r=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":r=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Sn(Zt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(r.length===0)return 0;kt.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},pt=new Cc});var $r,Pc,zn,vc=y(()=>{"use strict";$r={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Pc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=$r[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return $r[e]}getPrompt(e){return $r[e].prompt}getValidCommands(e){return $r[e].transitions}formatNextSteps(e){return $r[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},zn=new Pc});var xc,L,Mr=y(()=>{"use strict";Lt();Go();le();vc();vn();en();xc=class extends We{static{l(this,"StateStorage")}constructor(){super("state.json",Sp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=zn.getCurrentState(e),r=zn.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:C()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(u=>u.id===t),o===-1))return null;let i=r[o],a=r.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:ge()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(r=>r.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];kt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=wp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
263
263
  ${f.join(`
264
- `)}`)}let{output:s,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new yc});import RS from"node:fs/promises";import $S from"node:path";import{Hono as MS}from"hono";function OS(r){return I.getGlobalProjectPath(r)}function Ip(r,e){let t=new MS,n=OS(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=$S.join(n,"context",`${o}.md`),c=await RS.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Ap=y(()=>{"use strict";Se();he();jr();Dr();Rr();Mr();_();Un();l(OS,"getProjectDataPath");l(Ip,"createRoutes")});import js from"node:fs/promises";import FS from"node:path";import{Hono as _S}from"hono";function qo(r){return $.getDoc(r,"project")}async function wc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function jp(){let r=new _S;return r.get("/projects",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await wc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await wc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:s},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ye.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Pe.read(c),m=await Ye.read(c),p=await pt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await js.mkdir(Ds,{recursive:!0});let s=(await js.readdir(Ds,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await wc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var NS,Ds,Dp=y(()=>{"use strict";Se();he();jr();Dr();Rr();Mr();NS=I.getGlobalBasePath(),Ds=FS.join(NS,"projects");l(qo,"getProjectConfig");l(wc,"calculateDuration");l(jp,"createExtendedRoutes")});import{streamSSE as LS}from"hono/streaming";function $p(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Rp&&t(i)},HS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return LS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},US),p=setTimeout(()=>{t(a)},Rp);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){s();for(let o of[...r.keys()])t(o)}}}var Rp,HS,US,Mp=y(()=>{"use strict";ac();Rp=3600*1e3,HS=300*1e3,US=3e4;l($p,"createSSEManager")});var Op={};fe(Op,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>BS});import{Hono as GS}from"hono";import{cors as zS}from"hono/cors";import{logger as WS}from"hono/logger";function Ko(r){let e=new GS,t=$p();r.enableCors!==!1&&e.use("*",zS({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",WS()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Ip(r.projectId,r.projectPath);e.route("/api",n);let s=jp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Tr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Tr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function BS(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,kc=y(()=>{"use strict";qa();Ap();Dp();Mp();l(Ko,"createServer");Yo=3478;l(BS,"startServer")});import zn from"chalk";var Fp,VS,JS,Ut,_p=y(()=>{"use strict";Be();Fp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],VS=80,JS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Fp,speed:VS},cli:{header:l(()=>`${zn.cyan.bold("\u26A1")} ${zn.cyan("prjct")}`,"header"),footer:l(()=>zn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${zn.cyan("\u26A1")} ${zn.cyan("prjct")} ${zn.cyan(Fp[r%10])} ${zn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},Ut=JS});function Wn(r,e){return{...Ts[r],...e}}function Or(r,e,t){return{message:r,hint:e,...t}}var Fr=y(()=>{"use strict";Ho();Ho();l(Wn,"getError");l(Or,"createError")});var Lp={};fe(Lp,{ERRORS:()=>Ts,ICONS:()=>xn,OUTPUT_TIERS:()=>Np,createError:()=>Or,default:()=>h,formatForHuman:()=>QS,getError:()=>Wn,getOutputTier:()=>KS,getTierConfig:()=>Qo,isQuietMode:()=>XS,limitLines:()=>Xo,setOutputTier:()=>qS,setQuietMode:()=>YS});import te from"chalk";function qS(r){$s=r}function KS(){return $s}function Qo(){return Np[$s]}function YS(r){ct=r}function XS(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
265
- `);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
264
+ `)}`)}let{output:r,summary:o}=n.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:C(),output:r,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let r=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[r];if(!o)return null;let i=[...n.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new xc});import US from"node:fs/promises";import HS from"node:path";import{Hono as GS}from"hono";function zS(s){return I.getGlobalProjectPath(s)}function Mp(s,e){let t=new GS,n=zS(s);return t.get("/state",async r=>{let o=await L.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await xe.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await Qe.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=M.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await pt.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([L.read(s),xe.read(s),Qe.read(s),pt.read(s)]),u=M.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await L.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=HS.join(n,"context",`${o}.md`),c=await US.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||U.error(`Context read error: ${w(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}var Op=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();N();Gn();l(zS,"getProjectDataPath");l(Mp,"createRoutes")});import js from"node:fs/promises";import WS from"node:path";import{Hono as BS}from"hono";function Qo(s){return M.getDoc(s,"project")}async function Tc(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}function Fp(){let s=new BS;return s.get("/projects",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Qo(o),a=await L.read(o),c=await xe.read(o),u=await Qe.read(o),d=await pt.read(o),m=a?.currentTask,p=await Tc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Qo(t)),L.read(t),xe.read(t),Qe.read(t),pt.read(t)]),c=M.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await Tc(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),xe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await Qe.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await js.mkdir(Ds,{recursive:!0});let n=(await js.readdir(Ds,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await xe.read(c),m=await Qe.read(c),p=await pt.read(c);u?.currentTask&&a++,r+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await js.mkdir(Ds,{recursive:!0});let r=(await js.readdir(Ds,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await L.read(d),p=Qo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Tc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}var VS,Ds,_p=y(()=>{"use strict";Se();ye();jr();Dr();Rr();Mr();VS=I.getGlobalBasePath(),Ds=WS.join(VS,"projects");l(Qo,"getProjectConfig");l(Tc,"calculateDuration");l(Fp,"createExtendedRoutes")});import{streamSSE as JS}from"hono/streaming";function Lp(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>Np&&t(i)},qS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return JS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},KS),p=setTimeout(()=>{t(a)},Np);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}var Np,qS,KS,Up=y(()=>{"use strict";fc();Np=3600*1e3,qS=300*1e3,KS=3e4;l(Lp,"createSSEManager")});var Hp={};he(Hp,{DEFAULT_PORT:()=>ei,createServer:()=>Zo,startServer:()=>ZS});import{Hono as YS}from"hono";import{cors as XS}from"hono/cors";import{logger as QS}from"hono/logger";function Zo(s){let e=new YS,t=Lp();s.enableCors!==!1&&e.use("*",XS({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",QS()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",projectId:s.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Mp(s.projectId,s.projectPath);e.route("/api",n);let r=Fp();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(Tr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${s.projectId}`),console.log(` Runtime: ${Tr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function ZS(s,e,t=ei){let n=Zo({port:t,projectId:s,projectPath:e});return await n.start(),n}var ei,Ec=y(()=>{"use strict";nc();Op();_p();Up();l(Zo,"createServer");ei=3478;l(ZS,"startServer")});import Wn from"chalk";var Gp,eb,tb,Ht,zp=y(()=>{"use strict";Je();Gp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],eb=80,tb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Gp,speed:eb},cli:{header:l(()=>`${Wn.cyan.bold("\u26A1")} ${Wn.cyan("prjct")}`,"header"),footer:l(()=>Wn.dim("\u26A1 prjct"),"footer"),spin:l((s,e)=>`${Wn.cyan("\u26A1")} ${Wn.cyan("prjct")} ${Wn.cyan(Gp[s%10])} ${Wn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((s="claude")=>Eo(s).commitFooter,"getCommitFooter"),getSignature:l((s="claude")=>Eo(s).signature,"getSignature")},Ht=tb});function Bn(s,e){return{...Ts[s],...e}}function Or(s,e,t){return{message:s,hint:e,...t}}var Fr=y(()=>{"use strict";Wo();Wo();l(Bn,"getError");l(Or,"createError")});var Bp={};he(Bp,{ERRORS:()=>Ts,ICONS:()=>xn,OUTPUT_TIERS:()=>Wp,createError:()=>Or,default:()=>h,formatForHuman:()=>ib,getError:()=>Bn,getOutputTier:()=>sb,getTierConfig:()=>ni,isQuietMode:()=>ob,limitLines:()=>ti,setOutputTier:()=>nb,setQuietMode:()=>rb});import se from"chalk";function nb(s){$s=s}function sb(){return $s}function ni(){return Wp[$s]}function rb(s){ct=s}function ob(){return ct}function ti(s,e){let t=e??ni().maxLines;if(t===1/0||t===0)return s;let n=s.split(`
265
+ `);if(n.length<=t)return s;let r=n.slice(0,t),o=n.length-t;return`${r.join(`
266
266
  `)}
267
- ${te.dim(`...${o} more lines`)}`}function QS(r){let e=Qo();if($s==="silent")return"";if($s==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&$s==="compact"&&o.push(te.dim(String(t.url))),Xo(o.join(`
268
- `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(te.dim(`...${o.length-e.maxLines} more`)),i.join(`
269
- `)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?Xo(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
270
- `),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var PR,Sc,Np,$s,xn,Rs,bc,ct,Et,ZS,eb,h,Gt=y(()=>{"use strict";_p();un();Fr();Fr();PR=Ut.spinner.frames,Sc=Ut.spinner.speed,Np={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},$s="compact";l(qS,"setOutputTier");l(KS,"getOutputTier");l(Qo,"getTierConfig");xn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},Rs=null,bc=0,ct=!1;l(YS,"setQuietMode");l(XS,"isQuietMode");Et=l((r,e)=>{let t=e??(Qo().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Xo,"limitLines");l(QS,"formatForHuman");ZS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),eb={start(){return ct||console.log(Ut.cli.header()),this},end(){return ct||console.log(Ut.cli.footer()),this},spin(r){return ct?this:(this.stop(),process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,Et(r,Tt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
271
- `),this))},done(r,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${xn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${xn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Wn(r):r;return console.error(),console.error(`${xn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ct||console.log(`${xn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),ct||console.log(`${xn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${xn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ct)return this;let t=e.bullet||xn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ct||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(te.dim(s)),console.log(te.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),ct)return this;let t=e.split(`
272
- `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ct?this:(console.log(`
273
- ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return Rs&&(clearInterval(Rs),Rs=null,ZS()),this},step(r,e,t){if(ct)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
274
- `),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ut.cli.spin(bc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${Ut.cli.spin(0,`[${i}] ${n}%${a}`)}
275
- `),this)}},h=eb});var Gp={};fe(Gp,{default:()=>nb,sessionTracker:()=>Pn});var tb,Hp,Up,Cc,Pn,nb,Zo=y(()=>{"use strict";he();le();tb=1800*1e3,Hp=50,Up=200,Cc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:tb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Hp&&(s.current.commands=s.current.commands.slice(-Hp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>Up&&(s.current.files=s.current.files.slice(-Up)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:vr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:vr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Pn=new Cc,nb=Pn});var Wp={};fe(Wp,{default:()=>Bn,performanceTracker:()=>zp});var vc,zp,Bn,ei=y(()=>{"use strict";he();vc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=s.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=s.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},zp=new vc,Bn=zp});function Pc(r){if(vp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var xc,ti,Vn,_r,Nr,Lr=y(()=>{"use strict";he();Es();le();xc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Pc,"resolveCanonicalDomains");Vn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},_r=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},Nr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Hr,Tc=y(()=>{"use strict";he();Es();le();Lr();Hr=class r extends Vn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Uo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Uo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Uo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Jn,Ec=y(()=>{"use strict";Lt();Es();le();Lr();Jn=class extends Vn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:me(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=xc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Pc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
276
- Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Ic,sb,Te,Ms=y(()=>{"use strict";Lr();Tc();Ec();Lr();Tc();Ec();Ic=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Jn,this._patternStore=new Hr,this._historyStore=new Nr,this._sessionStore=new _r}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},sb=new Ic,Te=sb});import{exec as rb}from"node:child_process";import St from"node:fs/promises";import zt from"node:path";import{promisify as ob}from"node:util";var qn,Ac,ib,qe,Bp=y(()=>{"use strict";_();qn=ob(rb),Ac=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=zt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=zt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=zt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=zt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=zt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=zt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=zt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=zt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=zt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await qn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
277
- `).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await St.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await qn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await qn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await qn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await qn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await qn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await St.access(zt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=zt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await qn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
278
- `).filter(Boolean)}catch{return[]}}},ib=new Ac,qe=ib});import Dc from"node:fs";import ab from"node:fs/promises";import ni from"node:path";function Rc(){if(Vp)return jc;Vp=!0;let r=ni.join(pe,"dist","templates.json");try{let e=Dc.readFileSync(r,"utf-8");return jc=JSON.parse(e),jc}catch{return null}}function lb(r){let e=Kn.indexOf(r);e>-1&&Kn.splice(e,1),Kn.push(r)}function ub(){for(;Os.size>=cb&&Kn.length>0;){let r=Kn.shift();r&&Os.delete(r)}}function si(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
279
- `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Jp(r){if(Os.has(r))return lb(r),Os.get(r);let e,t=Rc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ni.join(pe,"templates","commands",`${r}.md`);try{e=await ab.readFile(s,"utf-8")}catch{throw Po.notFound(r)}}let n=si(e);return ub(),Os.set(r,n),Kn.push(r),n}async function db(r){return(await Jp(r)).frontmatter["allowed-tools"]||[]}function pb(){Os.clear(),Kn.length=0}function ye(r){let e=Rc();if(e?.[r])return e[r];let t=ni.join(pe,"templates",r);try{return Dc.readFileSync(t,"utf-8")}catch{return null}}function Tn(r){let e=Rc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ni.join(pe,"templates",r);try{return Dc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var cb,Os,Kn,jc,Vp,mb,$c,En=y(()=>{"use strict";ln();dt();cb=50,Os=new Map,Kn=[],jc=null,Vp=!1;l(Rc,"loadBundle");l(lb,"updateLruOrder");l(ub,"evictLru");l(si,"parseFrontmatter");l(Jp,"load");l(db,"getAllowedTools");l(pb,"clearCache");l(ye,"getTemplateContent");l(Tn,"listTemplates");mb={load:Jp,parseFrontmatter:si,getAllowedTools:db,clearCache:pb,getTemplateContent:ye,listTemplates:Tn},$c=mb});import X from"node:fs/promises";import Oc from"node:os";import ee from"node:path";async function gb(){try{let r=ye("global/modules/module-config.json");if(r)return JSON.parse(r);let e=ee.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function fb(r){let e=await gb();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=ee.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=ee.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ee.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
280
- `)}async function hb(){try{let r=ee.join(Oc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Tn("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ee.basename(s);await X.writeFile(ee.join(r,i),o,"utf-8")}}return{success:!0}}let t=ee.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=ee.join(t,s),i=ee.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function yb(){let r=(Be(),xt(ut)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await X.mkdir(e.configDir,{recursive:!0});let s=ee.join(e.configDir,e.contextFile),o=ee.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await fb()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ee.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=ee.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
281
-
282
- ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function qp(){let r=Oc.homedir();return{claude:{commands:ee.join(r,".claude","commands","p"),config:ee.join(r,".claude"),router:ee.join(r,".claude","commands","p.md")},gemini:{commands:ee.join(r,".gemini","commands"),config:ee.join(r,".gemini"),router:ee.join(r,".gemini","commands","p.toml")}}}var Mc,wb,Ee,In=y(()=>{"use strict";En();_();dt();l(gb,"loadModuleConfig");l(fb,"composeGlobalTemplate");l(hb,"installDocs");l(yb,"installGlobalConfig");Mc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Oc.homedir(),this.templatesDir=ee.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=ee.join(t.configDir,"commands"):this.claudeCommandsPath=ee.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Tn("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Be(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=ee.join(this.claudeCommandsPath,a),u=ye(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=ee.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=ee.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ye(`commands/${e}.md`))return!0;try{let n=ee.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Be(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=ee.join(t.configDir,"commands",n);await X.mkdir(ee.dirname(s),{recursive:!0});let o=ye(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=ee.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Be(),xt(ut)).getActiveProvider(),n=ee.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ee.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ee.join(this.claudeCommandsPath,o),a=n.includes(o),c=ye(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=ee.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return yb()}async installDocs(){return hb()}};l(qp,"getProviderPaths");wb=new Mc,Ee=wb});import{z as Fe}from"zod";function Qp(r,e="default"){let t=Kp[e]||Kp.default;return r/1e3*t}function ri(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var kb,Sb,Yp,Xp,Kp,oi=y(()=>{"use strict";kb=Fe.object({date:Fe.string(),tokensSaved:Fe.number(),syncs:Fe.number(),avgCompressionRate:Fe.number(),totalDuration:Fe.number()}),Sb=Fe.object({agentName:Fe.string(),usageCount:Fe.number(),tokensSaved:Fe.number()}),Yp=Fe.object({totalTokensSaved:Fe.number(),avgCompressionRate:Fe.number(),syncCount:Fe.number(),watchTriggers:Fe.number(),avgSyncDuration:Fe.number(),totalSyncDuration:Fe.number(),agentUsage:Fe.array(Sb),dailyStats:Fe.array(kb),firstSync:Fe.string(),lastUpdated:Fe.string()}),Xp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Kp={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(Qp,"estimateCostSaved");l(ri,"formatCost")});function bb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function Cb(r){let e=[],t=bb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Fc,o+i.length);if(c===-1)continue;let u=c+Fc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function _c(r,e){let t=Cb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
267
+ ${se.dim(`...${o} more lines`)}`}function ib(s){let e=ni();if($s==="silent")return"";if($s==="verbose")return JSON.stringify(s,null,2);if(typeof s!="object"||s===null)return It(String(s),e.maxCharsPerLine);let t=s;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${It(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&$s==="compact"&&o.push(se.dim(String(t.url))),ti(o.join(`
268
+ `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${It(String(a.title),Et.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(se.dim(`...${o.length-e.maxLines} more`)),i.join(`
269
+ `)}let r=["id","name","title","status","message","success","error"].filter(o=>o in t);return r.length>0?ti(r.map(o=>`${o}: ${It(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
270
+ `),e.maxLines):ti(JSON.stringify(s,null,2),e.maxLines)}var OR,Ic,Wp,$s,xn,Rs,Ac,ct,It,ab,cb,h,Gt=y(()=>{"use strict";zp();un();Fr();Fr();OR=Ht.spinner.frames,Ic=Ht.spinner.speed,Wp={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},$s="compact";l(nb,"setOutputTier");l(sb,"getOutputTier");l(ni,"getTierConfig");xn={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Rs=null,Ac=0,ct=!1;l(rb,"setQuietMode");l(ob,"isQuietMode");It=l((s,e)=>{let t=e??(ni().maxCharsPerLine||Et.FALLBACK_TRUNCATE);return s&&s.length>t?`${s.slice(0,t-1)}\u2026`:s||""},"truncate");l(ti,"limitLines");l(ib,"formatForHuman");ab=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Et.CLEAR_WIDTH)}\r`):!0,"clear"),cb={start(){return ct||console.log(Ht.cli.header()),this},end(){return ct||console.log(Ht.cli.footer()),this},spin(s){return ct?this:(this.stop(),process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,It(s,Et.SPINNER_MSG))}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,It(s,Et.SPINNER_MSG))}
271
+ `),this))},done(s,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=se.dim(` [${n.join(" | ")}]`))}console.log(`${xn.success} ${It(s,Et.DONE_MSG)}${t}`)}return this},fail(s){return this.stop(),console.error(`${xn.fail} ${It(s,Et.FAIL_MSG)}`),this},failWithHint(s){this.stop();let e=typeof s=="string"?Bn(s):s;return console.error(),console.error(`${xn.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(s){return this.stop(),ct||console.log(`${xn.warn} ${It(s,Et.WARN_MSG)}`),this},info(s){return this.stop(),ct||console.log(`${xn.info} ${s}`),this},debug(s){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${xn.debug} ${se.dim(s)}`),this},success(s,e){return this.done(s,e)},list(s,e={}){if(this.stop(),ct)return this;let t=e.bullet||xn.bullet,n=" ".repeat(e.indent||0);for(let r of s)console.log(`${n}${t} ${r}`);return this},table(s,e={}){if(this.stop(),ct||s.length===0)return this;let t=Object.keys(s[0]),n={};for(let r of t){n[r]=r.length;for(let o of s){let i=String(o[r]??"");i.length>n[r]&&(n[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(n[o])).join(" ");console.log(se.dim(r)),console.log(se.dim("\u2500".repeat(r.length)))}for(let r of s){let o=t.map(i=>String(r[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(s,e){if(this.stop(),ct)return this;let t=e.split(`
272
+ `),n=Math.max(s.length,...t.map(o=>o.length)),r="\u2500".repeat(n+2);console.log(se.dim(`\u250C${r}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(s.padEnd(n))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(n)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${r}\u2518`)),this},section(s){return this.stop(),ct?this:(console.log(`
273
+ ${se.bold(s)}`),console.log(se.dim("\u2500".repeat(s.length))),this)},stop(){return Rs&&(clearInterval(Rs),Rs=null,ab()),this},step(s,e,t){if(ct)return this;this.stop();let n=se.dim(`[${s}/${e}]`);return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,`${n} ${It(t,Et.STEP_MSG)}`)}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,`${n} ${It(t,Et.STEP_MSG)}`)}
274
+ `),this)},progress(s,e,t){if(ct)return this;this.stop();let n=Math.round(s/e*100),r=Math.round(n/10),o=10-r,i=se.cyan("\u2588".repeat(r))+se.dim("\u2591".repeat(o)),a=t?` ${It(t,Et.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Rs=setInterval(()=>{process.stdout.write(`\r${Ht.cli.spin(Ac++,`[${i}] ${n}%${a}`)}`)},Ic),this):(process.stdout.write(`${Ht.cli.spin(0,`[${i}] ${n}%${a}`)}
275
+ `),this)}},h=cb});var qp={};he(qp,{default:()=>ub,sessionTracker:()=>Tn});var lb,Vp,Jp,jc,Tn,ub,si=y(()=>{"use strict";ye();le();lb=1800*1e3,Vp=50,Jp=200,jc=class{static{l(this,"SessionTracker")}async read(e){try{return M.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){M.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:lb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:n}),r.current.commands.length>Vp&&(r.current.commands=r.current.commands.slice(-Vp)),await this.write(e,r)}async trackFile(e,t,n){let r=await this.read(e);if(!r.current)return;let o=C();r.current.lastActivity=o,r.current.files.push({path:t,operation:n,timestamp:o}),r.current.files.length>Jp&&(r.current.files=r.current.files.slice(-Jp)),await this.write(e,r)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,r=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=r-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Pr(r-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Pr(u),commandCount:n.commands.length,commands:d,filesRead:m,filesWritten:p}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Tn=new jc,ub=Tn});var Yp={};he(Yp,{default:()=>Vn,performanceTracker:()=>Kp});var Dc,Kp,Vn,ri=y(()=>{"use strict";ye();Dc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,r){q.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:r})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),r=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of r)q.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){q.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){q.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let r=this.getMetrics(e,n),o={period:`${t}d`},i=r.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,b)=>k+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,b)=>k+b,0)/f.length):0}}let u=r.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=r.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=r.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,b)=>k+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Kp=new Dc,Vn=Kp});function $c(s){if(Ap.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(oi))if(n!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Rc,oi,Jn,_r,Nr,Lr=y(()=>{"use strict";ye();Es();le();Rc={frontend:[O.CODE_STYLE,O.FILE_STRUCTURE,O.ARCHITECTURE,O.TECH_STACK],backend:[O.CODE_STYLE,O.ARCHITECTURE,O.DEPENDENCIES,O.TECH_STACK],devops:[O.SHIP_WORKFLOW,O.TEST_BEHAVIOR,O.DEPENDENCIES,O.ARCHITECTURE],docs:[O.CODE_STYLE,O.NAMING_CONVENTION,O.FILE_STRUCTURE],testing:[O.TEST_BEHAVIOR,O.CODE_STYLE,O.DEPENDENCIES],database:[O.ARCHITECTURE,O.NAMING_CONVENTION,O.TECH_STACK,O.DEPENDENCIES],general:Object.values(O)},oi={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l($c,"resolveCanonicalDomains");Jn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=q.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();q.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),r=t(n);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},_r=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},Nr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};q.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return q.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var Ur,Mc=y(()=>{"use strict";ye();Es();le();Lr();Ur=class s extends Jn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>s.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-s.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,r="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>s.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-s.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Bo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let r=await this.load(e),o=C();if(!r.workflows[t])r.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=Bo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,n,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Bo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),r=s.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>r&&o.push(a)}if(o.length===0)return 0;let i=q.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return q.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var qn,Oc=y(()=>{"use strict";Lt();Es();le();Lr();qn=class extends Jn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(O),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(O);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(O));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=C(),u={id:ge(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),r=n.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=n.memories[r];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,n=!1){let r=await this.load(e),o=this._coerceTags(t);if(n)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),r=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),r=n.memories.length;if(r===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),v=(p.tags||[]).filter($=>D.includes($));g.tagMatch=Math.min(20,v.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),v=0;for(let $ of D)p.content.toLowerCase().includes($)&&(v+=2),p.title.toLowerCase().includes($)&&(v+=3);g.keywords=Math.min(15,v)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let r=new Set;for(let a of n){let c=Rc[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=oi[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return $c(e)}_getCommandTags(e){return{ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE],task:[O.BRANCH_NAMING,O.CODE_STYLE],sync:[O.TECH_STACK,O.ARCHITECTURE,O.DEPENDENCIES],test:[O.TEST_BEHAVIOR],bug:[O.CODE_STYLE,O.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(r=>r.length>2&&!n.has(r))}_extractContextTags(e){let t=[],n={ship:[O.COMMIT_STYLE,O.SHIP_WORKFLOW,O.TEST_BEHAVIOR],feature:[O.ARCHITECTURE,O.CODE_STYLE],done:[O.SHIP_WORKFLOW],analyze:[O.TECH_STACK,O.ARCHITECTURE],spec:[O.ARCHITECTURE,O.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(r=>r.length>2&&!n.includes(r))}async autoRemember(e,t,n,r=""){let i={commit_footer:[O.COMMIT_STYLE],branch_naming:[O.BRANCH_NAMING],test_before_ship:[O.TEST_BEHAVIOR,O.SHIP_WORKFLOW],preferred_agent:[O.AGENT_PREFERENCE],code_style:[O.CODE_STYLE],verbosity:[O.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${r?`
276
+ Context: ${r}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[r,o]of Object.entries(t.index))n[r]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(r=>r.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Fc,db,Te,Ms=y(()=>{"use strict";Lr();Mc();Oc();Lr();Mc();Oc();Fc=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new qn,this._patternStore=new Ur,this._historyStore=new Nr,this._sessionStore=new _r}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,r){return this._semanticMemories.autoRemember(e,t,n,r)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,r){return this._patternStore.recordDecision(e,t,n,r)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,r){return this._patternStore.setPreference(e,t,n,r)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let r=await this.getDecision(e,t);return r?r.value:null}async learnDecision(e,t,n,r=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,r),await this.appendHistory(e,{type:"decision",key:t,value:n,context:r})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},db=new Fc,Te=db});import{exec as pb}from"node:child_process";import St from"node:fs/promises";import zt from"node:path";import{promisify as mb}from"node:util";var Kn,_c,gb,Ye,Xp=y(()=>{"use strict";N();Kn=mb(pb),_c=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=zt.join(this.projectPath,"package.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=zt.join(this.projectPath,"Cargo.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readRequirements(){try{let e=zt.join(this.projectPath,"requirements.txt");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGoMod(){try{let e=zt.join(this.projectPath,"go.mod");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readGemfile(){try{let e=zt.join(this.projectPath,"Gemfile");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readMixExs(){try{let e=zt.join(this.projectPath,"mix.exs");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readPomXml(){try{let e=zt.join(this.projectPath,"pom.xml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async readComposerJson(){try{let e=zt.join(this.projectPath,"composer.json"),t=await St.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=zt.join(this.projectPath,"pyproject.toml");return await St.readFile(e,"utf-8")}catch(e){if(P(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Kn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
277
+ `).filter(Boolean).forEach(n=>{let r=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await St.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(r=>r.test(n)))}catch(e){if(P(e))return[];throw e}}async listDirectories(){try{return(await St.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(P(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Kn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Kn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Kn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Kn('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Kn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await St.access(zt.join(this.projectPath,e)),!0}catch(t){if(P(t))return!1;throw t}}async readFile(e){try{let t=zt.join(this.projectPath,e);return await St.readFile(t,"utf-8")}catch(t){if(P(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Kn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
278
+ `).filter(Boolean)}catch{return[]}}},gb=new _c,Ye=gb});import Lc from"node:fs";import fb from"node:fs/promises";import ii from"node:path";function Uc(){if(Qp)return Nc;Qp=!0;let s=ii.join(de,"dist","templates.json");try{let e=Lc.readFileSync(s,"utf-8");return Nc=JSON.parse(e),Nc}catch{return null}}function yb(s){let e=Yn.indexOf(s);e>-1&&Yn.splice(e,1),Yn.push(s)}function wb(){for(;Os.size>=hb&&Yn.length>0;){let s=Yn.shift();s&&Os.delete(s)}}function ai(s){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=s.match(e);if(!t)return{frontmatter:{},content:s.trim()};let[,n,r]=t,o={};return n.split(`
279
+ `).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Zp(s){if(Os.has(s))return yb(s),Os.get(s);let e,t=Uc();if(t){let r=`commands/${s}.md`;e=t[r]}if(!e){let r=ii.join(de,"templates","commands",`${s}.md`);try{e=await fb.readFile(r,"utf-8")}catch{throw Ao.notFound(s)}}let n=ai(e);return wb(),Os.set(s,n),Yn.push(s),n}async function kb(s){return(await Zp(s)).frontmatter["allowed-tools"]||[]}function Sb(){Os.clear(),Yn.length=0}function fe(s){let e=Uc();if(e?.[s])return e[s];let t=ii.join(de,"templates",s);try{return Lc.readFileSync(t,"utf-8")}catch{return null}}function En(s){let e=Uc();if(e)return Object.keys(e).filter(n=>n.startsWith(s));let t=ii.join(de,"templates",s);try{return Lc.readdirSync(t).map(r=>`${s}${r}`)}catch{return[]}}var hb,Os,Yn,Nc,Qp,bb,Hc,In=y(()=>{"use strict";ln();dt();hb=50,Os=new Map,Yn=[],Nc=null,Qp=!1;l(Uc,"loadBundle");l(yb,"updateLruOrder");l(wb,"evictLru");l(ai,"parseFrontmatter");l(Zp,"load");l(kb,"getAllowedTools");l(Sb,"clearCache");l(fe,"getTemplateContent");l(En,"listTemplates");bb={load:Zp,parseFrontmatter:ai,getAllowedTools:kb,clearCache:Sb,getTemplateContent:fe,listTemplates:En},Hc=bb});import X from"node:fs/promises";import zc from"node:os";import ne from"node:path";async function Cb(){try{let s=fe("global/modules/module-config.json");if(s)return JSON.parse(s);let e=ne.join(de,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Pb(s){let e=await Cb();if(!e){let i=fe("global/CLAUDE.md");if(i)return i;let a=ne.join(de,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=s||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=fe("global/CLAUDE.md");if(a)return a;let c=ne.join(de,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let r=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of r){let a=fe(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=ne.join(de,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
280
+ `)}async function vb(){try{let s=ne.join(zc.homedir(),".prjct-cli","docs");await X.mkdir(s,{recursive:!0});let e=En("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=fe(r);if(o){let i=ne.basename(r);await X.writeFile(ne.join(s,i),o,"utf-8")}}return{success:!0}}let t=ne.join(de,"templates/global/docs"),n=await X.readdir(t);for(let r of n)if(r.endsWith(".md")){let o=ne.join(t,r),i=ne.join(s,r),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(s){return{success:!1,error:w(s)}}}async function xb(){let s=(Je(),xt(ut)),e=await s.getActiveProvider(),t=e.name;if(!(await s.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await X.mkdir(e.configDir,{recursive:!0});let r=ne.join(e.configDir,e.contextFile),o=ne.join(de,"templates","global",e.contextFile),i="";try{let u=fe(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Pb()}catch{let d=fe("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(de,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=fe("global/CLAUDE.md");if(d)i=d;else{let m=ne.join(de,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(r,"utf-8"),c=!0}catch(u){if(P(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(r,k,"utf-8"),{success:!0,action:"updated",path:r}}else{let p=`${a}
281
+
282
+ ${i}`;return await X.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await X.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:w(r),action:"failed"}}}function em(){let s=zc.homedir();return{claude:{commands:ne.join(s,".claude","commands","p"),config:ne.join(s,".claude"),router:ne.join(s,".claude","commands","p.md")},gemini:{commands:ne.join(s,".gemini","commands"),config:ne.join(s,".gemini"),router:ne.join(s,".gemini","commands","p.toml")}}}var Gc,Tb,Ee,An=y(()=>{"use strict";In();N();dt();l(Cb,"loadModuleConfig");l(Pb,"composeGlobalTemplate");l(vb,"installDocs");l(xb,"installGlobalConfig");Gc=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=zc.homedir(),this.templatesDir=ne.join(de,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=ne.join(t.configDir,"commands"):this.claudeCommandsPath=ne.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(P(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=En("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(r=>r.endsWith(".md")&&!e.has(r))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Je(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let r=await this.getCommandFiles(),o=[],i=[];for(let a of r)try{let c=ne.join(this.claudeCommandsPath,a),u=fe(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=ne.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(r){return{success:!1,error:w(r)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let r of e)try{let o=ne.join(this.claudeCommandsPath,r);await X.unlink(o),t.push(r.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:r,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(P(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(fe(`commands/${e}.md`))return!0;try{let n=ne.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(P(n))return!1;throw n}}async installRouter(){let t=await(Je(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let r=ne.join(t.configDir,"commands",n);await X.mkdir(ne.dirname(r),{recursive:!0});let o=fe(`commands/${n}`);if(o)return await X.writeFile(r,o,"utf-8"),!0;let i=ne.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(r,a,"utf-8"),!0}catch(r){if(P(r))return!1;throw r}}async removeLegacyCommands(){let t=await(Je(),xt(ut)).getActiveProvider(),n=ne.join(t.configDir,"commands"),r=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(ne.join(n,a)),r++}catch{}}catch{}return r}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(P(o))n=[];else throw o}let r={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=ne.join(this.claudeCommandsPath,o),a=n.includes(o),c=fe(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=ne.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?r.updated++:r.added++}catch(i){r.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),r}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return xb()}async installDocs(){return vb()}};l(em,"getProviderPaths");Tb=new Gc,Ee=Tb});import{z as Fe}from"zod";function rm(s,e="default"){let t=tm[e]||tm.default;return s/1e3*t}function ci(s){return s<.01?`$${(s*100).toFixed(2)}\xA2`:`$${s.toFixed(2)}`}var Eb,Ib,nm,sm,tm,li=y(()=>{"use strict";Eb=Fe.object({date:Fe.string(),tokensSaved:Fe.number(),syncs:Fe.number(),avgCompressionRate:Fe.number(),totalDuration:Fe.number()}),Ib=Fe.object({agentName:Fe.string(),usageCount:Fe.number(),tokensSaved:Fe.number()}),nm=Fe.object({totalTokensSaved:Fe.number(),avgCompressionRate:Fe.number(),syncCount:Fe.number(),watchTriggers:Fe.number(),avgSyncDuration:Fe.number(),totalSyncDuration:Fe.number(),agentUsage:Fe.array(Ib),dailyStats:Fe.array(Eb),firstSync:Fe.string(),lastUpdated:Fe.string()}),sm={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},tm={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(rm,"estimateCostSaved");l(ci,"formatCost")});function Ab(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function jb(s){let e=[],t=Ab(),n,r=0;for(;(n=t.exec(s))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${r++}`,c=s.indexOf(Wc,o+i.length);if(c===-1)continue;let u=c+Wc.length,d=s.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Bc(s,e){let t=jb(e);if(t.length===0)return s;let n=s.trimEnd();n+=`
283
283
 
284
284
  ---
285
285
 
@@ -287,105 +287,105 @@ ${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s
287
287
 
288
288
  `,n+=`_The sections below are preserved during sync. Edit freely._
289
289
 
290
- `;for(let s of t)n+=s.content,n+=`
290
+ `;for(let r of t)n+=r.content,n+=`
291
291
 
292
292
  `;return`${n.trimEnd()}
293
- `}function Nc(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
294
- `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Fc)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Fc,Lc=y(()=>{"use strict";Fc="<!-- /prjct:preserve -->";l(bb,"createPreserveStartRegex");l(Cb,"extractPreservedSections");l(_c,"mergePreservedSections");l(Nc,"validatePreserveBlocks")});function Ur(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&vb.has(e.code))return!0;if(e.code&&em.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function ai(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&em.has(e.code))}function Zp(r,e,t){let n=An.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(An.delete(r),!1):!0:!1}function Hc(r,e){let t=An.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),An.set(r,t)}function xb(r){An.delete(r)}var vb,em,An,ii,tm,Gr,ci=y(()=>{"use strict";vb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),em=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Ur,"isTransientError");l(ai,"isPermanentError");An=new Map;l(Zp,"isCircuitOpen");l(Hc,"recordFailure");l(xb,"recordSuccess");ii=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(Zp(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return xb(t),o}catch(o){if(n=o,s++,ai(o))throw Hc(t,this.options.circuitBreakerThreshold),o;if(!(Ur(o)&&s<this.options.maxAttempts))throw Hc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Hc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Ur(e)}isCircuitOpen(e){return Zp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return An.get(e)}resetCircuit(e){An.delete(e)}resetAllCircuits(){An.clear()}},tm=new ii({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Gr=new ii({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var nm=y(()=>{"use strict";Lc();ci()});import li from"node:fs/promises";import Uc from"node:path";var Gc,sm,rm=y(()=>{"use strict";Ve();Se();_();Gc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=I.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await li.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await li.readFile(Uc.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Uc.join(this.agentsPath,`${e}.md`),n=await li.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Uc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
295
- `;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},sm=Gc});import om from"node:path";async function Eb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(om.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(om.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Ib(){return{...Pb}}function Ab(){return{...Tb}}async function im(){return ui||(ui=await Eb()?Ib():Ab(),ui)}var ui,Pb,Tb,am=y(()=>{"use strict";xe();ui=null,Pb={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Tb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Eb,"isClaudeEnvironment");l(Ib,"getClaudeAgent");l(Ab,"getTerminalAgent");l(im,"detect")});var Db,zc=y(()=>{Db=ld({})});var Rb,di,Fs,cm=y(()=>{"use strict";rm();ln();am();ci();zc();Rb=["claude"],di=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new sm}async initialize(){return this.agent?this.agent:await tm.execute(async()=>{if(this.agentInfo=await im(),!this.agentInfo?.isSupported)throw Cr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Rb.includes(e))throw Cr.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Db(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
293
+ `}function Vc(s){let e=[],t=s.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=s.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let r=0,o=0,i=s.split(`
294
+ `);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(Wc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Wc,Jc=y(()=>{"use strict";Wc="<!-- /prjct:preserve -->";l(Ab,"createPreserveStartRegex");l(jb,"extractPreservedSections");l(Bc,"mergePreservedSections");l(Vc,"validatePreserveBlocks")});function Hr(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&Db.has(e.code))return!0;if(e.code&&im.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function di(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&im.has(e.code))}function om(s,e,t){let n=jn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(jn.delete(s),!1):!0:!1}function qc(s,e){let t=jn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),jn.set(s,t)}function Rb(s){jn.delete(s)}var Db,im,jn,ui,am,Gr,pi=y(()=>{"use strict";Db=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),im=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Hr,"isTransientError");l(di,"isPermanentError");jn=new Map;l(om,"isCircuitOpen");l(qc,"recordFailure");l(Rb,"recordSuccess");ui=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(om(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return Rb(t),o}catch(o){if(n=o,r++,di(o))throw qc(t,this.options.circuitBreakerThreshold),o;if(!(Hr(o)&&r<this.options.maxAttempts))throw qc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw qc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Hr(e)}isCircuitOpen(e){return om(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jn.get(e)}resetCircuit(e){jn.delete(e)}resetAllCircuits(){jn.clear()}},am=new ui({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Gr=new ui({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var cm=y(()=>{"use strict";Jc();pi()});import mi from"node:fs/promises";import Kc from"node:path";var Yc,lm,um=y(()=>{"use strict";qe();Se();N();Yc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=I.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await mi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let r=n.replace(".md",""),o=await mi.readFile(Kc.join(this.agentsPath,n),"utf-8");t.push({name:r,content:o})}return t}catch(e){return P(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Kc.join(this.agentsPath,`${e}.md`),n=await mi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return P(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let r=Kc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
295
+ `;await mi.appendFile(r,o)}catch(r){P(r)||console.error(`Agent usage log error: ${w(r)}`)}}},lm=Yc});import dm from"node:path";async function Ob(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let s=process.cwd();if(await x(dm.join(s,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await x(dm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Fb(){return{...$b}}function _b(){return{...Mb}}async function pm(){return gi||(gi=await Ob()?Fb():_b(),gi)}var gi,$b,Mb,mm=y(()=>{"use strict";ve();gi=null,$b={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Mb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Ob,"isClaudeEnvironment");l(Fb,"getClaudeAgent");l(_b,"getTerminalAgent");l(pm,"detect")});var Lb,Xc=y(()=>{Lb=gd({})});var Ub,fi,Fs,gm=y(()=>{"use strict";um();ln();mm();pi();Xc();Ub=["claude"],fi=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new lm}async initialize(){return this.agent?this.agent:await am.execute(async()=>{if(this.agentInfo=await pm(),!this.agentInfo?.isSupported)throw Cr.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Ub.includes(e))throw Cr.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Lb(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let r=await this.agentRouter.getAgentNames();return r.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:r},_agenticNote:`
296
296
  AGENTIC EXECUTION:
297
297
  - Read: templates/agentic/orchestrator.md
298
298
  - Analyze task: "${e}"
299
- - Available specialists: ${s.join(", ")}
299
+ - Available specialists: ${r.join(", ")}
300
300
  - Claude decides which agent(s) to use
301
301
  - Always prefer specialists over generalist
302
302
  - Fragment complex tasks into subtasks
303
- `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Fs=new di});var pi,mi,lm=y(()=>{"use strict";pi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},mi=new pi});import $b from"node:crypto";import gi from"node:fs/promises";import um from"node:path";function dm(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,Wc,Xe,zr=y(()=>{"use strict";Se();_();le();he();Wt="1.0.0";l(dm,"getDefaultChecksums");Wc=class{static{l(this,"IndexStorage")}getIndexPath(e){return um.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return dm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return $b.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Wt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.unlink(um.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Xe=new Wc});var pm,Mb,fi,Ob,mm=y(()=>{"use strict";zr();pm=8e4,Mb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},fi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||pm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,k=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||k.length>=s)break;k.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Mb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Xe.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||pm,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},Ob=new fi});import gm from"node:path";var Bc,hi,Fb,fm=y(()=>{"use strict";zr();le();Bc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],hi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Bc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=gm.dirname(i.path);n.get(u).add(`**/${gm.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Bc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Bc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Wt,projectId:e,domains:t,discoveredAt:s};await Xe.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Wt,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Xe.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Xe.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Wt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Fb=new hi});import Vc from"node:path";var Jc,_b,Nb,yi,hm,qc=y(()=>{"use strict";Jc=30,_b=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Nb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],yi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=Jc){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=Vc.basename(e.path);for(let n of _b)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Vc.basename(e.path);for(let s of Nb)if(s.test(t))return 15;let n=Vc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},hm=new yi});import{execSync as Kc}from"node:child_process";var wi,Yc,ki,_s,Si=y(()=>{"use strict";Fr();wi={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Yc=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=wi[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new ki(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
304
- `);throw new ki({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
305
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Kc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return Kc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Kc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},ki=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},_s=new Yc});import{exec as Lb}from"node:child_process";import{promisify as Hb}from"node:util";var RM,ym=y(()=>{"use strict";un();Si();RM=Hb(Lb)});var bi,mt,Xc=y(()=>{"use strict";Ve();vn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let s=n-Zt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);kt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new bi});var wm=y(()=>{"use strict";Se();xe()});import{exec as Gb}from"node:child_process";import{promisify as zb}from"node:util";var qM,km=y(()=>{"use strict";zr();le();qc();qM=zb(Gb)});import{createHash as Wb}from"node:crypto";var Qc,It,Ci=y(()=>{"use strict";Xa();le();en();Qc=class extends ze{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ya.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ya.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Hd(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Wb("sha256").update(JSON.stringify(t)).digest("hex")}},It=new Qc});var Zc,dn,Wr=y(()=>{"use strict";oi();le();en();Zc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Yp)}getDefault(){return{...Xp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Qp(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},dn=new Zc});import lt from"node:fs/promises";import de from"node:path";async function Br(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=I.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await Bb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of nl){let u=de.join(s,a),d=await Yn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Sm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of tl){let u=de.join(o,a),d=await Yn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),bm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Zb(r,o,t),await eC(r,o,t),await tC(r,i,t),await nC(r,i,t),t.errors.length===0&&await sC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function Bb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await el(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await el(e,de.join(n,"index")),await el(t,de.join(n,"memory")),n}async function el(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Sm(r,e,t){switch(e){case"state":Vb(r,t);break;case"queue":Jb(r,t);break;case"ideas":qb(r,t);break;case"shipped":Kb(r,t);break;case"metrics":Yb(r,t);break;case"analysis":Xb(r,t);break}}function Vb(r,e){let t=$.getDb(r),n=t.prepare(`
303
+ `}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Fs=new fi});var hi,yi,fm=y(()=>{"use strict";hi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},yi=new hi});import Hb from"node:crypto";import wi from"node:fs/promises";import hm from"node:path";function ym(){return{version:Wt,lastUpdated:"",checksums:{}}}var Wt,Qc,Ze,zr=y(()=>{"use strict";Se();N();le();ye();Wt="1.0.0";l(ym,"getDefaultChecksums");Qc=class{static{l(this,"IndexStorage")}getIndexPath(e){return hm.join(I.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await wi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeIndex(e,t){this.setIndexMeta(e,"project-index",t)}async hasValidIndex(e){let t=await this.readIndex(e);return t!==null&&t.lastFullScan!==""}async readChecksums(e){try{let t=this.getIndexMeta(e,"checksums");if(t!==null)return t}catch{}return ym()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await wi.readFile(e);return Hb.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let n={version:Wt,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{M.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await wi.readdir(t);await Promise.all(n.map(r=>wi.unlink(hm.join(t,r))))}catch(n){if(!P(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Wt?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),r=new Map;if(!n)return r;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=M.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,n){let r=M.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Ze=new Qc});var wm,Gb,ki,zb,km=y(()=>{"use strict";zr();wm=8e4,Gb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},ki=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let r=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||wm,[c,u,d]=await Promise.all([Ze.readIndex(t),Ze.readDomains(t),Ze.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let v of m){let $=d.domainIndex[v]||[];for(let F of $)p.add(F)}if(i&&d.domainIndex.general){let v=d.domainIndex.general.slice(0,10);for(let $ of v)p.add($)}let g=c.relevantFiles.filter(v=>p.has(v.path)&&v.score>=o);g.sort((v,$)=>$.score-v.score);let f=0,k=[];for(let v of g){let $=Math.ceil(v.size/this.CHARS_PER_TOKEN);if(f+$>a||k.length>=r)break;k.push(v),f+=$}let b=Math.ceil(c.relevantFiles.reduce((v,$)=>v+$.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),r=new Set;for(let[o,i]of Object.entries(Gb))for(let a of i)if(n.includes(a)){r.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){r.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){r.add(o.name);break}}return r.size===0&&(r.add("services"),r.add("api")),Array.from(r)}async filterByDomains(e,t,n){let r=await Ze.readCategories(e);if(!r)return n||[];let o=new Set;for(let a of t){let c=r.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Ze.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ze.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,r=t.minScore||30,o=t.tokenBudget||wm,i=e.filter(d=>d.score>=r).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let r of e){let o=n[r];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},zb=new ki});import Sm from"node:path";var Zc,Si,Wb,bm=y(()=>{"use strict";zr();le();Zc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],Si=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let r=n.useLLM!==!1,o=r?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=r?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:r?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!r}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Zc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Sm.dirname(i.path);n.get(u).add(`**/${Sm.basename(d)}/**`)}}let r=this.extractDirectoryDomains(e);for(let[i,a]of r)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Zc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let r=n.path.split("/");for(let o of r.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],r=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Zc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:r,method:"heuristic"})}return n}async saveToCache(e,t,n){let r=C(),o={version:Wt,projectId:e,domains:t,discoveredAt:r};await Ze.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Wt,lastUpdate:r,fileCategories:n,domainIndex:i};await Ze.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ze.readDomains(e),Ze.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let r=await Ze.readDomains(e);if(!r)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,r.domains):this.categorizeFilesHeuristic(t,r.domains),i=await Ze.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Wt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Ze.writeCategories(e,m)}return o}},Wb=new Si});import el from"node:path";var tl,Bb,Vb,bi,Cm,nl=y(()=>{"use strict";tl=30,Bb=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Vb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],bi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},r=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,r)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,r)=>r.score-n.score)}getRelevantFiles(e,t=tl){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,r=t.allFiles.size;if(r===0)return 0;let o=n/r;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=el.basename(e.path);for(let n of Bb)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=el.basename(e.path);for(let r of Vb)if(r.test(t))return 15;let n=el.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let r=n/t.maxRecentCommits;return r>=.5?10:r>=.25?7:r>=.1?5:n>0?2:0}},Cm=new bi});import{execSync as sl}from"node:child_process";var Ci,rl,Pi,_s,vi=y(()=>{"use strict";Fr();Ci={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},rl=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let n=Ci[e];if(!n)return this.checkUnknownTool(e);let r=this.executeCheck(n);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ci[e],r=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Pi(r)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(r=>{let o=Ci[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
304
+ `);throw new Pi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
305
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ci),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=sl(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Or(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return sl(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return sl(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Pi=class extends Error{static{l(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},_s=new rl});import{exec as Jb}from"node:child_process";import{promisify as qb}from"node:util";var GM,Pm=y(()=>{"use strict";un();vi();GM=qb(Jb)});var xi,mt,ol=y(()=>{"use strict";qe();vn();ye();xi=class{static{l(this,"MemoryService")}async log(e,t,n,r){try{let o=await R.getProjectId(e);if(!o)return;q.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?q.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let r=await R.getProjectId(e);return r?q.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;q.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return q.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let r=n-Zt.MEMORY_MAX_ENTRIES,o=q.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);kt.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&q.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new xi});var vm=y(()=>{"use strict";Se();ve()});import{exec as Yb}from"node:child_process";import{promisify as Xb}from"node:util";var rO,xm=y(()=>{"use strict";zr();le();nl();rO=Xb(Yb)});import{createHash as Qb}from"node:crypto";var il,bt,Ti=y(()=>{"use strict";oc();le();en();il=class extends We{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};rc.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return rc.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await Vd(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Qb("sha256").update(JSON.stringify(t)).digest("hex")}},bt=new il});var al,dn,Wr=y(()=>{"use strict";li();le();en();al=class extends We{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",nm)}getDefault(){return{...sm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+r)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let v=b.findIndex($=>$.agentName===D);v>=0?b[v]={...b[v],usageCount:b[v].usageCount+1,tokensSaved:b[v].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:k,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:rm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},dn=new al});import lt from"node:fs/promises";import pe from"node:path";async function Br(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(M.exists(s)&&M.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=I.getGlobalProjectPath(s),r=pe.join(n,"storage"),o=pe.join(n,"index"),i=pe.join(n,"memory");t.backupDir=await Zb(r,o,i),M.getDb(s);for(let{filename:a,key:c}of ul){let u=pe.join(r,a),d=await Xn(u);if(d===null){t.skippedFiles.push(a);continue}try{M.setDoc(s,c,d),Tm(s,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of ll){let u=pe.join(o,a),d=await Xn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{M.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),Em(s,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await aC(s,o,t),await cC(s,o,t),await lC(s,i,t),await uC(s,i,t),t.errors.length===0&&await dC(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function Zb(s,e,t){let n=pe.join(s,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(pe.join(n,"index"),{recursive:!0}),await lt.mkdir(pe.join(n,"memory"),{recursive:!0}),await cl(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await cl(e,pe.join(n,"index")),await cl(t,pe.join(n,"memory")),n}async function cl(s,e,t){try{let n=await lt.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=pe.join(s,r.name),i=pe.join(e,r.name);await lt.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function Tm(s,e,t){switch(e){case"state":eC(s,t);break;case"queue":tC(s,t);break;case"ideas":nC(s,t);break;case"shipped":sC(s,t);break;case"metrics":rC(s,t);break;case"analysis":oC(s,t);break}}function eC(s,e){let t=M.getDb(s),n=t.prepare(`
306
306
  INSERT OR REPLACE INTO tasks
307
307
  (id, description, type, status, parent_description, branch, linear_id,
308
308
  linear_uuid, session_id, feature_id, started_at, completed_at,
309
309
  shipped_at, paused_at, pause_reason, pr_url, expected_value, data)
310
310
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
311
- `),s=t.prepare(`
311
+ `),r=t.prepare(`
312
312
  INSERT OR REPLACE INTO subtasks
313
313
  (id, task_id, description, status, domain, agent, sort_order,
314
314
  depends_on, started_at, completed_at, output, summary)
315
315
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
316
- `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Jb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
316
+ `),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];r.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function tC(s,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
317
317
  INSERT OR REPLACE INTO queue_tasks
318
318
  (id, description, type, priority, section, created_at, completed, completed_at,
319
319
  feature_id, feature_name)
320
320
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
321
- `);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function qb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
321
+ `);for(let o of t)r.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function nC(s,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
322
322
  INSERT OR REPLACE INTO ideas
323
323
  (id, text, status, priority, tags, added_at, converted_to, details, data)
324
324
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
325
- `);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function Kb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
325
+ `);for(let o of t)r.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function sC(s,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
326
326
  INSERT OR REPLACE INTO shipped_features
327
327
  (id, name, shipped_at, version, description, type, duration, data)
328
328
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
329
- `);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function Yb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
329
+ `);for(let o of t)r.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function rC(s,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
330
330
  INSERT OR REPLACE INTO metrics_daily
331
331
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
332
332
  VALUES (?, ?, ?, ?, ?)
333
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Xb(r,e){let n=$.getDb(r).prepare(`
333
+ `);for(let o of t)r.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function oC(s,e){let n=M.getDb(s).prepare(`
334
334
  INSERT OR REPLACE INTO analysis
335
335
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
336
336
  VALUES (?, ?, ?, ?, ?, ?, ?)
337
- `),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function bm(r,e,t){e==="categories-cache"&&Qb(r,t)}function Qb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
337
+ `),r=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function Em(s,e,t){e==="categories-cache"&&iC(s,t)}function iC(s,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=M.getDb(s).prepare(`
338
338
  INSERT OR REPLACE INTO index_files
339
339
  (path, categories, domain, score, size, mtime, language)
340
340
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
341
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Zb(r,e,t){let n=de.join(e,"checksums.json"),s=await Yn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function eC(r,e,t){let n=de.join(e,"file-scores.json"),s=await Yn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
341
+ `);for(let o of t)r.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function aC(s,e,t){let n=pe.join(e,"checksums.json"),r=await Xn(n);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=M.getDb(s),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function cC(s,e,t){let n=pe.join(e,"file-scores.json"),r=await Xn(n);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=M.getDb(s),a=i.prepare(`
342
342
  INSERT OR REPLACE INTO index_files
343
343
  (path, score, size, mtime, language, categories, domain)
344
344
  VALUES (?, ?, ?, ?, NULL,
345
345
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
346
346
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
347
- `);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function tC(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
348
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function nC(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
349
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function sC(r,e,t,n){let s=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of nl)await s(de.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await s(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Yn(r){try{let e=await lt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=I.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of nl){let m=de.join(t,u),p=await Yn(m);if(p!==null){$.setDoc(r,d,p),Sm(r,d,p);try{await lt.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Yn(s);if(o!==null){$.setDoc(r,"project",o);try{await lt.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
350
- `).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,k,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...tl.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Yn(d);if(m===null)continue;let p=tl.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),bm(r,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var nl,tl,xi=y(()=>{"use strict";Se();_();he();nl=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],tl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Br,"migrateJsonToSqlite");l(Bb,"createBackup");l(el,"copyFiles");l(Sm,"populateNormalized");l(Vb,"populateTasksFromState");l(Jb,"populateQueueTasks");l(qb,"populateIdeas");l(Kb,"populateShippedFeatures");l(Yb,"populateMetricsDaily");l(Xb,"populateAnalysis");l(bm,"populateIndexTables");l(Qb,"populateCategoriesIndex");l(Zb,"migrateChecksums");l(eC,"migrateFileScores");l(tC,"migrateEventsJsonl");l(nC,"migrateLearningsJsonl");l(sC,"cleanupJsonFiles");l(Yn,"readJsonSafe");l(vi,"sweepLegacyJson")});var Cm=y(()=>{"use strict";dc();_()});var sl,rl,ol=y(()=>{"use strict";Ps();en();sl=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:wp,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},rl=new sl});var Bt=y(()=>{"use strict";Ci();vn();he();jr();zr();Wr();xi();Dr();Rr();Mr();Cm();en();ol()});function st(r,e,t=2){return`${r}
351
- ${e}`}function At(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
352
- `)}function il(r){let e=[];r.branch&&e.push(`Branch: ${r.branch}`),r.linearId&&e.push(`Linear: ${r.linearId}`),r.type&&e.push(`Type: ${r.type}`),r.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
353
- ${e.join(" | ")}`:"";return`Task: ${r.description}${t}`}function vm(r,e){return`Subtasks
354
- ${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
355
- `)}`}function xm(r){return r.length===0?"":`Relevant files
356
- ${r.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",s=t.description?` \u2014 ${t.description}`:"";return`- ${t.path}${n}${s}`}).join(`
357
- `)}`}function Pm(r){return`Rules
358
- ${At(r)}`}function Qe(r){return`Next
359
- ${r.map(t=>`- ${t.label}: ${t.command}`).join(`
360
- `)}`}function jt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- ${t}: ${n}`);return e.join(`
361
- `)}function tn(r,e){return e?`${r}
362
- ${e}`:r}function Tm(r){return`> \u26A0\uFE0F ${r}`}function Ie(...r){return r.filter(Boolean).join(`
363
-
364
- `)}function pn(r,e,t,n){console.log(JSON.stringify({status:r,reason:e,...n,options:t}))}var Ns=y(()=>{"use strict";l(st,"mdSection");l(At,"mdList");l(il,"mdTaskHeader");l(vm,"mdSubtasks");l(xm,"mdRelevantFiles");l(Pm,"mdRules");l(Qe,"mdNextSteps");l(jt,"mdStats");l(tn,"mdDone");l(Tm,"mdWarn");l(Ie,"mdJoin");l(pn,"mdActionRequired")});import Vr from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Im[r]||"idle",n=Gn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Em[o]||o}));console.log(Vr.dim(`
365
- Next:`));for(let o of s){let i=Vr.cyan(o.cmd.padEnd(12));console.log(Vr.dim(` ${i} \u2192 ${o.desc}`))}}function Pi(r){let e=Im[r]||"idle";return Gn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Em[n]||n}))}function Jr(r){let e=Gn.getStateInfo(r);console.log(Vr.dim(`\u{1F4CD} State: ${Vr.white(r.toUpperCase())} - ${e.description}`))}var Em,Im,Ls=y(()=>{"use strict";hc();Em={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Im={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(bt,"showNextSteps");l(Pi,"getNextSteps");l(Jr,"showStateInfo")});import Dt from"chalk";import Xn from"prompts";var al,Am,Hs,jm=y(()=>{"use strict";Gt();al=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Am=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"}],Hs=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e,Xn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Xn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:al.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:al.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Xn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Am.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(Dt.dim(`
347
+ `);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function lC(s,e,t){let n=pe.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
348
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=M.getDb(s),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function uC(s,e,t){let n=pe.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
349
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=M.getDb(s),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,p=m&&m.length>0?m[0]:null;a.run(d,p,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){P(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function dC(s,e,t,n){let r=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){P(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of ul)await r(pe.join(s,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(pe.join(e,i),`cleanup:index/${i}`);await r(pe.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(pe.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Xn(s){try{let e=await lt.readFile(s,"utf-8");return JSON.parse(e)}catch(e){if(P(e)||e instanceof SyntaxError)return null;throw e}}async function Ei(s){let e=I.getGlobalProjectPath(s),t=pe.join(e,"storage"),n=0;M.getDb(s);for(let{filename:u,key:d}of ul){let m=pe.join(t,u),p=await Xn(m);if(p!==null){M.setDoc(s,d,p),Tm(s,d,p);try{await lt.unlink(m)}catch{}n++}}let r=pe.join(e,"project.json"),o=await Xn(r);if(o!==null){M.setDoc(s,"project",o);try{await lt.unlink(r)}catch{}n++}let i=pe.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=pe.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
350
+ `).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=M.getDb(s);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,k,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let k of p)try{let b=JSON.parse(k),D=`learning:${b.taskId??b.timestamp??Date.now()}`,v=b.tags;f.run(D,v?.[0]??null,k,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=pe.join(e,"index"),c=[...ll.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=pe.join(a,u),m=await Xn(d);if(m===null)continue;let p=ll.find(g=>g.filename===u);p&&(M.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),Em(s,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var ul,ll,Ii=y(()=>{"use strict";Se();N();ye();ul=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],ll=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Br,"migrateJsonToSqlite");l(Zb,"createBackup");l(cl,"copyFiles");l(Tm,"populateNormalized");l(eC,"populateTasksFromState");l(tC,"populateQueueTasks");l(nC,"populateIdeas");l(sC,"populateShippedFeatures");l(rC,"populateMetricsDaily");l(oC,"populateAnalysis");l(Em,"populateIndexTables");l(iC,"populateCategoriesIndex");l(aC,"migrateChecksums");l(cC,"migrateFileScores");l(lC,"migrateEventsJsonl");l(uC,"migrateLearningsJsonl");l(dC,"cleanupJsonFiles");l(Xn,"readJsonSafe");l(Ei,"sweepLegacyJson")});var Im=y(()=>{"use strict";kc();N()});var dl,pl,ml=y(()=>{"use strict";xs();en();dl=class extends We{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:vp,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},pl=new dl});var Bt=y(()=>{"use strict";Ti();vn();ye();jr();zr();Wr();Ii();Dr();Rr();Mr();Im();en();ml()});function rt(s,e,t=2){return`${s}
351
+ ${e}`}function At(s,e=!1){return s.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
352
+ `)}function gl(s){let e=[];s.branch&&e.push(`Branch: ${s.branch}`),s.linearId&&e.push(`Linear: ${s.linearId}`),s.type&&e.push(`Type: ${s.type}`),s.duration&&e.push(`Duration: ${s.duration}`);let t=e.length>0?`
353
+ ${e.join(" | ")}`:"";return`Task: ${s.description}${t}`}function Am(s,e){return`Subtasks
354
+ ${s.map((n,r)=>{let o=n.status==="completed",i=r===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
355
+ `)}`}function jm(s){return s.length===0?"":`Relevant files
356
+ ${s.map(t=>{let n=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- ${t.path}${n}${r}`}).join(`
357
+ `)}`}function Dm(s){return`Rules
358
+ ${At(s)}`}function et(s){return`Next
359
+ ${s.map(t=>`- ${t.label}: ${t.command}`).join(`
360
+ `)}`}function jt(s){let e=[];for(let[t,n]of Object.entries(s))n!=null&&e.push(`- ${t}: ${n}`);return e.join(`
361
+ `)}function tn(s,e){return e?`${s}
362
+ ${e}`:s}function Rm(s){return`> \u26A0\uFE0F ${s}`}function Ie(...s){return s.filter(Boolean).join(`
363
+
364
+ `)}function pn(s,e,t,n){console.log(JSON.stringify({status:s,reason:e,...n,options:t}))}var Ns=y(()=>{"use strict";l(rt,"mdSection");l(At,"mdList");l(gl,"mdTaskHeader");l(Am,"mdSubtasks");l(jm,"mdRelevantFiles");l(Dm,"mdRules");l(et,"mdNextSteps");l(jt,"mdStats");l(tn,"mdDone");l(Rm,"mdWarn");l(Ie,"mdJoin");l(pn,"mdActionRequired")});import Vr from"chalk";function Ct(s,e={}){if(e.quiet)return;let t=Mm[s]||"idle",n=zn.getValidCommands(t);if(n.length===0)return;let r=n.map(o=>({cmd:`p. ${o}`,desc:$m[o]||o}));console.log(Vr.dim(`
365
+ Next:`));for(let o of r){let i=Vr.cyan(o.cmd.padEnd(12));console.log(Vr.dim(` ${i} \u2192 ${o.desc}`))}}function Ai(s){let e=Mm[s]||"idle";return zn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:$m[n]||n}))}function Jr(s){let e=zn.getStateInfo(s);console.log(Vr.dim(`\u{1F4CD} State: ${Vr.white(s.toUpperCase())} - ${e.description}`))}var $m,Mm,Ls=y(()=>{"use strict";vc();$m={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},Mm={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};l(Ct,"showNextSteps");l(Ai,"getNextSteps");l(Jr,"showStateInfo")});import Dt from"chalk";import Qn from"prompts";var fl,Om,Us,Fm=y(()=>{"use strict";Gt();fl=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Om=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"}],Us=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e,Qn.override({})}async run(){this.printWelcome();let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Qn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:fl.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:fl.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Qn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Om.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(Dt.dim(`
366
366
  Detected: ${e}
367
- `));let t=await Xn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Xn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Xn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(Dt.bold(" Configuration Summary")),console.log(Dt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${Dt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${Dt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${Dt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${Dt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${Dt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Xn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(Dt.bold.cyan(" Welcome to prjct-cli!")),console.log(Dt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(Dt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(Dt.yellow(`
367
+ `));let t=await Qn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Qn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Qn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(Dt.bold(" Configuration Summary")),console.log(Dt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${Dt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${Dt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${Dt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${Dt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${Dt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Qn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),r=[];try{await e.access(t.join(n.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),r.push("gemini")}catch{}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",r.includes("bun.lockb")?n.packageManager="Bun":r.includes("pnpm-lock.yaml")?n.packageManager="pnpm":r.includes("yarn.lock")?n.packageManager="Yarn":r.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?n.language="Python":r.includes("go.mod")?n.language="Go":r.includes("Cargo.toml")?n.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(Dt.bold.cyan(" Welcome to prjct-cli!")),console.log(Dt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(Dt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(Dt.yellow(`
368
368
  Setup cancelled. Run again anytime.
369
- `))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Am.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import cl from"node:path";var rC,oC,Ti,iC,gt,Qn=y(()=>{"use strict";Se();Lt();xe();rC="outcomes",oC="outcomes.jsonl",Ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=I.getGlobalProjectPath(e);return cl.join(t,rC)}getOutcomesPath(e){return cl.join(this.getOutcomesDir(e),oC)}async record(e,t){let n={...t,id:me()},s=this.getOutcomesPath(e);return await Nt(cl.dirname(s)),await Aa(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await ys(t);return n.trim()?n.trim().split(`
370
- `).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},iC=new Ti,gt=iC});var Ei,aC,ll,Dm=y(()=>{"use strict";Qn();Ei=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},aC=new Ei,ll=aC});var qr,Ii,ul,dl=y(()=>{"use strict";Es();le();qr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=qr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
371
- `)}},ul=new Ii});var Ai,Rm,pl=y(()=>{"use strict";nc();en();le();Ai=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...ep,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Fo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Fo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Fo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=tp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=np(5,s);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:sp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Rm=new Ai});var ml=y(()=>{"use strict";jm();Dm();dl();Qn();pl()});import nn from"chalk";function cC(r){return $m[r.toLowerCase()]||$m.default}var $m,gl,ji,Mm=y(()=>{"use strict";$m={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(cC,"getIcon");gl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
369
+ `))}getProjectTypeLabel(e){return fl.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Om.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import hl from"node:path";var pC,mC,ji,gC,gt,Zn=y(()=>{"use strict";Se();Lt();ve();pC="outcomes",mC="outcomes.jsonl",ji=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=I.getGlobalProjectPath(e);return hl.join(t,pC)}getOutcomesPath(e){return hl.join(this.getOutcomesDir(e),mC)}async record(e,t){let n={...t,id:ge()},r=this.getOutcomesPath(e);return await Nt(hl.dirname(r)),await Oa(r,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await x(t))return[];let n=await ws(t);return n.trim()?n.trim().split(`
370
+ `).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let n=t.filter(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},gC=new ji,gt=gC});var Di,fC,yl,_m=y(()=>{"use strict";Zn();Di=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,r=await gt.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(n*10)/10,estimateAccuracy:r,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let r=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,b)=>k+b.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let b=this.parseVariance(k.variance),D=this.parseDuration(k.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(b=>b.completedAsPlanned))for(let b of k.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((k,b)=>b[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&n.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let r=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return n*(o==="h"?r*60:r)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},fC=new Di,yl=fC});var qr,Ri,wl,kl=y(()=>{"use strict";Es();le();qr=3,Ri=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}async learnFromOutcomes(e,t,n){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=qr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${qr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(r.taskId),t.set(u,d)}}let n=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let r of n.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let r of n.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).map(([n,{count:r,tasks:o}])=>({pattern:n,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let r of n.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([n,{count:r}])=>r>=2).map(([n,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,r=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of r)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=qr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((n,r)=>r.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let r=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:r}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:r,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[O.FILE_STRUCTURE,O.ARCHITECTURE],tech_stack:[O.TECH_STACK],architecture:[O.ARCHITECTURE,O.CODE_STYLE],estimation:[O.SHIP_WORKFLOW],workflow:[O.SHIP_WORKFLOW,O.CODE_STYLE],gotcha:[O.TEST_BEHAVIOR,O.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
371
+ `)}},wl=new Ri});var $i,Nm,Sl=y(()=>{"use strict";uc();en();le();$i=class extends We{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...ip,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Uo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),r=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Uo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Uo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,r=t/60,o=ap(n,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=cp(5,r);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:n,confidence:"low",source:"manual"},actual:{hours:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:lp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},Nm=new $i});var bl=y(()=>{"use strict";Fm();_m();kl();Zn();Sl()});import nn from"chalk";function hC(s){return Lm[s.toLowerCase()]||Lm.default}var Lm,Cl,Mi,Um=y(()=>{"use strict";Lm={database:"\u{1F4BE}",backend:"\u{1F527}",frontend:"\u{1F4E6}",testing:"\u{1F9EA}",devops:"\u{1F680}",uxui:"\u{1F3A8}",security:"\u{1F512}",docs:"\u{1F4DD}",api:"\u{1F310}",default:"\u26A1"};l(hC,"getIcon");Cl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(nn.cyan(`
372
372
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
373
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=cC(t);console.log(nn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(nn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?nn.green("\u2713"):nn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${nn.dim(`(${n})`)}
374
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${nn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(nn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ji=new gl});import Ze from"chalk";function lC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Om.length;return Om[t]}function uC(r,e,t="\u25B6"){let n=Ze.dim(String(r+1).padStart(2)),o=lC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function dC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(uC(t,r[t]));return e.push(""),e.join(`
375
- `)}function Fm(r){console.log(dC(r))}var Om,_m=y(()=>{"use strict";Om=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(lC,"getDomainColor");l(uC,"formatSubtaskLine");l(dC,"renderSubtaskProgress");l(Fm,"printSubtaskProgress")});function pC(r){return Nm.includes(r)}async function mC(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function gC(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
376
- `)}var Nm,fC,Di,Lm=y(()=>{"use strict";Nm=["ship","feature","spec","cleanup","migrate"];l(pC,"requiresReasoning");l(mC,"reason");l(gC,"formatPlan");fC={requiresReasoning:pC,reason:mC,formatPlan:gC,REASONING_REQUIRED_COMMANDS:Nm},Di=fC});import Kr from"node:fs/promises";var fl,hC,ft,hl=y(()=>{"use strict";Ve();Se();_();Jo();fl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ht({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=I.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:I.getFilePath(n,"core","now.md"),next:I.getFilePath(n,"core","next.md"),context:I.getFilePath(n,"core","context.md"),shipped:I.getFilePath(n,"progress","shipped.md"),metrics:I.getFilePath(n,"progress","metrics.md"),ideas:I.getFilePath(n,"planning","ideas.md"),roadmap:I.getFilePath(n,"planning","roadmap.md"),specs:I.getFilePath(n,"planning","specs"),memory:I.getFilePath(n,"memory","context.jsonl"),patterns:I.getFilePath(n,"memory","patterns.json"),analysis:I.getFilePath(n,"analysis","repo-summary.md"),codePatterns:I.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Kr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Kr.readFile(d,"utf-8"),Kr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await Kr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Kr.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},hC=new fl,ft=hC});import{exec as yC}from"node:child_process";import Ae from"node:fs/promises";import Hm from"node:os";import jn from"node:path";import{promisify as wC}from"node:util";function Um(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function yl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function SC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
377
- `;return r.warnings.forEach(t=>{e+=` - ${t}
378
- `}),r.recommendations.length>0&&(e+=`
373
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=hC(t);console.log(nn.cyan(`\u250C\u2500 ${r} ${e} (${t})`)),n&&console.log(nn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(nn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),r=e?nn.green("\u2713"):nn.red("\u2717");console.log(`\u2514\u2500 ${r} ${e?"Complete":"Failed"} ${nn.dim(`(${n})`)}
374
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${nn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(nn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Mi=new Cl});import tt from"chalk";function yC(s){let e=0;for(let n of s)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Hm.length;return Hm[t]}function wC(s,e,t="\u25B6"){let n=tt.dim(String(s+1).padStart(2)),o=yC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=tt.green("\u2713 Complete");break;case"in_progress":a=tt.yellow(`${t} Working...`);break;case"pending":a=tt.gray("\u25CB Pending");break;case"failed":a=tt.red("\u2717 Failed");break;case"blocked":a=tt.gray("\u2298 Blocked");break;default:a=tt.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function kC(s){if(s.length===0)return"";let e=[];e.push(""),e.push(` ${tt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${tt.dim("\u2500".repeat(58))}`);for(let t=0;t<s.length;t++)e.push(wC(t,s[t]));return e.push(""),e.join(`
375
+ `)}function Gm(s){console.log(kC(s))}var Hm,zm=y(()=>{"use strict";Hm=[tt.cyan,tt.magenta,tt.yellow,tt.blue,tt.green,tt.redBright,tt.magentaBright,tt.cyanBright];l(yC,"getDomainColor");l(wC,"formatSubtaskLine");l(kC,"renderSubtaskProgress");l(Gm,"printSubtaskProgress")});function SC(s){return Wm.includes(s)}async function bC(s,e,t){let n=[],r=[],o=[];switch(s){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),r.push("Read current task from now.md"),r.push("Calculate duration"),r.push("Append to shipped.md"),r.push("Clear now.md"),r.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),r.push("Parse feature description"),r.push("Generate tasks breakdown"),r.push("Add to roadmap.md"),r.push("Add tasks to next.md"),r.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),r.push("Generate spec template"),r.push("Analyze requirements"),r.push("Create spec file"),r.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),r.push("Scan for unused code"),r.push("Identify dead imports"),r.push("List files to clean"),r.push("Show preview"),r.push("Wait for approval"),r.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),r.push("Analyze current state"),r.push("Generate migration plan"),r.push("Show affected files"),r.push("Request approval"),r.push("Execute migration"),r.push("Verify results");break;default:r.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:s,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:r,confidence:c}}function CC(s){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${s.commandName}`),e.push(""),s.reasoning&&(e.push("Steps:"),s.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),s.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),s.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),s.plan.length>0&&(e.push("Plan:"),s.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(s.confidence*100)}%`),e.join(`
376
+ `)}var Wm,PC,Oi,Bm=y(()=>{"use strict";Wm=["ship","feature","spec","cleanup","migrate"];l(SC,"requiresReasoning");l(bC,"reason");l(CC,"formatPlan");PC={requiresReasoning:SC,reason:bC,formatPlan:CC,REASONING_REQUIRED_COMMANDS:Wm},Oi=PC});import Kr from"node:fs/promises";var Pl,vC,ft,vl=y(()=>{"use strict";qe();Se();N();Xo();Pl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ut({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),r=I.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:r,paths:{now:I.getFilePath(n,"core","now.md"),next:I.getFilePath(n,"core","next.md"),context:I.getFilePath(n,"core","context.md"),shipped:I.getFilePath(n,"progress","shipped.md"),metrics:I.getFilePath(n,"progress","metrics.md"),ideas:I.getFilePath(n,"planning","ideas.md"),roadmap:I.getFilePath(n,"planning","roadmap.md"),specs:I.getFilePath(n,"planning","specs"),memory:I.getFilePath(n,"memory","context.jsonl"),patterns:I.getFilePath(n,"memory","patterns.json"),analysis:I.getFilePath(n,"analysis","repo-summary.md"),codePatterns:I.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},r=Object.entries(e.paths),o=t?r.filter(([a])=>t.includes(a)):r;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Kr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(P(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([Kr.readFile(d,"utf-8"),Kr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(P(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},r=n[t]||n.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,n=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):n.push(r)}if(n.length>0){let r=n.map(async i=>{try{let a=await Kr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(P(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(r);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await Kr.access(e),!0}catch(t){if(P(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},vC=new Pl,ft=vC});import{exec as xC}from"node:child_process";import Ae from"node:fs/promises";import Vm from"node:os";import Dn from"node:path";import{promisify as TC}from"node:util";function Jm(s){let e=Math.floor(s/36e5),t=Math.floor(s%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function xl(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function IC(s){if(s.verified||s.warnings.length===0)return null;let e=` Ground Truth Warnings:
377
+ `;return s.warnings.forEach(t=>{e+=` - ${t}
378
+ `}),s.recommendations.length>0&&(e+=`
379
379
  Recommendations:
380
- `,r.recommendations.forEach(t=>{e+=` -> ${t}
381
- `})),e}async function Gm(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Um(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ae.access(jn.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function zm(r){let e=[],t=[],n={};try{let{stdout:i}=await kC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
382
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=jn.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${yl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Bm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Vm(r){let e=[],t=[],n={},s=jn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=jn.join(Hm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jm(r){let e=[],t=[],n={},s=jn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=jn.join(Hm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function qm(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(jn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(jn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function Km(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Xm(r,e,t){let n=Ym[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function bC(r,e,t){let n=await Xm(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function CC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var kC,Ym,vC,Ri,Qm=y(()=>{"use strict";_();kC=wC(yC);l(Um,"formatDuration");l(yl,"escapeRegex");l(SC,"formatWarnings");l(Gm,"verifyDone");l(zm,"verifyShip");l(Wm,"verifyFeature");l(Bm,"verifyNow");l(Vm,"verifyInit");l(Jm,"verifySync");l(qm,"verifyAnalyze");l(Km,"verifySpec");Ym={done:Gm,ship:zm,feature:Wm,now:Bm,init:Vm,sync:Jm,analyze:qm,spec:Km};l(Xm,"verify");l(bC,"prepareCommand");l(CC,"requiresVerification");vC={verify:Xm,prepareCommand:bC,requiresVerification:CC,verifiers:Ym,formatWarnings:SC,formatDuration:Um,escapeRegex:yl,verifyDone:Gm,verifyShip:zm,verifyFeature:Wm,verifyNow:Bm,verifyInit:Vm,verifySync:Jm,verifyAnalyze:qm,verifySpec:Km},Ri=vC});function PC(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function TC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of xC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:PC(t)};return{detected:!1}}function EC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function IC(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function AC(r,e,t){let n={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return n[e.type]||n.unknown}function jC(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var xC,wl,DC,Us,Zm=y(()=>{"use strict";xC=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(PC,"getHallucinationSuggestion");l(TC,"detectHallucination");l(EC,"isSimilarError");l(IC,"analyzeErrorPattern");l(AC,"generateEscalationMessage");l(jC,"generateSuggestion");wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>EC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=IC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:AC(e,o,this.maxAttempts),suggestion:jC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return TC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},DC=new wl,Us=DC});function kl(r,e){let t=Yr(e),n=RC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function $C(r,e){let t=Yr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function MC(r,e,t){let n=Yr(t),s=kl(r,t),o=kl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=Cn){let t=Yr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=OC(r,e),s=FC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=LC(o),a=_C(o),c=NC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=HC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function tg(r,e,t=Cn){let n=Yr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function OC(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=MC(i,s,e);if(!t.has(a)){let c=kl(i,e),u=$C(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function FC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+UC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function _C(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function NC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function LC(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function HC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function bl(r){if(!r.variance)return 0;let e=Sl(r.estimatedDuration),t=Sl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Sl(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function ng(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
383
- `)}function UC(r){if(!r.estimatedDuration)return 0;let e=Sl(r.estimatedDuration);if(e<=0)return 0;let t=eg[0],n=Number.POSITIVE_INFINITY;for(let s of eg){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Yr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var RC,eg,Cl=y(()=>{"use strict";Ps();RC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(kl,"getSprintStart");l($C,"getSprintEnd");l(MC,"getSprintNumber");l($i,"calculateVelocity");l(tg,"projectCompletion");l(OC,"bucketBySprint");l(FC,"buildSprintVelocities");l(_C,"detectTrend");l(NC,"calculateOverallAccuracy");l(LC,"calculateAverageVelocity");l(HC,"detectEstimationPatterns");l(bl,"parseVariancePercent");l(Sl,"parseDurationMinutes");l(ng,"formatVelocityContext");eg=[{points:1,typical:10},{points:2,typical:20},{points:3,typical:45},{points:5,typical:90},{points:8,typical:180},{points:13,typical:360},{points:21,typical:720}];l(UC,"derivePoints");l(Yr,"resolveConfig")});import{exec as GC}from"node:child_process";import zC from"node:fs/promises";import Mi from"node:path";import{promisify as WC}from"node:util";async function Zn(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=KC(r),c=await YC(e),u=await XC(e),d=[];for(let p of c){if(!i&&ZC(p))continue;let g=QC(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function KC(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function YC(r){let e=[];async function t(n,s=""){try{let o=await zC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mi.join(n,i.name),c=Mi.join(s,i.name);if(i.isDirectory()){if(qC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mi.extname(i.name).toLowerCase();JC.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function XC(r){let e=new Map;try{let{stdout:t}=await BC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
380
+ `,s.recommendations.forEach(t=>{e+=` -> ${t}
381
+ `})),e}async function qm(s){let e=[],t=[],n={},r=s.paths.now;try{let a=await Ae.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Jm(n.durationMs))}}catch(a){if(P(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=s.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(P(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=s.paths.metrics;try{await Ae.access(Dn.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(P(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Km(s){let e=[],t=[],n={};try{let{stdout:i}=await EC("git status --porcelain",{cwd:s.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
382
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let r=Dn.join(s.projectPath,"package.json");try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=s.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=s.params.feature||s.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${xl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(r,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await Ae.readFile(r,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=s.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(xl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=s.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Xm(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await Ae.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&s.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=s.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Qm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(r,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Dn.join(Vm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Zm(s){let e=[],t=[],n={},r=Dn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(r,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=Dn.join(Vm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function eg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await Ae.access(Dn.join(s.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(Dn.join(s.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function tg(s){let e=[],t=[],n={},r=s.paths.specs;try{await Ae.access(r),n.specsExists=!0;let i=await Ae.readdir(r);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=s.params.feature||s.params.name||s.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sg(s,e,t){let n=ng[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${w(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function AC(s,e,t){let n=await sg(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function jC(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var EC,ng,DC,Fi,rg=y(()=>{"use strict";N();EC=TC(xC);l(Jm,"formatDuration");l(xl,"escapeRegex");l(IC,"formatWarnings");l(qm,"verifyDone");l(Km,"verifyShip");l(Ym,"verifyFeature");l(Xm,"verifyNow");l(Qm,"verifyInit");l(Zm,"verifySync");l(eg,"verifyAnalyze");l(tg,"verifySpec");ng={done:qm,ship:Km,feature:Ym,now:Xm,init:Qm,sync:Zm,analyze:eg,spec:tg};l(sg,"verify");l(AC,"prepareCommand");l(jC,"requiresVerification");DC={verify:sg,prepareCommand:AC,requiresVerification:jC,verifiers:ng,formatWarnings:IC,formatDuration:Jm,escapeRegex:xl,verifyDone:qm,verifyShip:Km,verifyFeature:Ym,verifyNow:Xm,verifyInit:Qm,verifySync:Zm,verifyAnalyze:eg,verifySpec:tg},Fi=DC});function $C(s){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[s]||"Verify actual state before proceeding."}function MC(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of RC)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:$C(t)};return{detected:!1}}function OC(s,e){if(!s||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(s)===t(e)}function FC(s){if(!s||s.length===0)return{type:"unknown",description:"No error information"};let e=s[s.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function _C(s,e,t){let n={permission:`I've tried ${s} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${s}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${s} from completing.`,validation:`Validation keeps failing for ${s}.`,config:`There seems to be a configuration issue affecting ${s}.`,unknown:`I've tried ${s} ${t} times without success.`};return n[e.type]||n.unknown}function NC(s){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[s.type]||e.unknown}var RC,Tl,LC,Hs,og=y(()=>{"use strict";RC=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l($C,"getHallucinationSuggestion");l(MC,"detectHallucination");l(OC,"isSimilarError");l(FC,"analyzeErrorPattern");l(_C,"generateEscalationMessage");l(NC,"generateSuggestion");Tl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>OC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return null;let o=FC(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:_C(e,o,this.maxAttempts),suggestion:NC(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(n,r))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return MC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},LC=new Tl,Hs=LC});function El(s,e){let t=Yr(e),n=UC[t.startDay],r=new Date(s);r.setHours(0,0,0,0);let i=(r.getDay()-n+7)%7;return r.setDate(r.getDate()-i),r}function HC(s,e){let t=Yr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function GC(s,e,t){let n=Yr(t),r=El(s,t),o=El(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function _i(s,e=Pn){let t=Yr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=zC(s,e),r=WC(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=JC(o),a=BC(o),c=VC(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=qC(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function ag(s,e,t=Pn){let n=Yr(t);if(e<=0)return{totalPoints:s,sprints:0,estimatedDate:""};let r=Math.ceil(s/e),o=r*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:s,sprints:r,estimatedDate:i.toISOString()}}function zC(s,e){let t=new Map,n=s.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of s){let i=new Date(o.completedAt),a=GC(i,r,e);if(!t.has(a)){let c=El(i,e),u=HC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function WC(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+KC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Al(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:r,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,r)=>n.sprintNumber-r.sprintNumber)}function BC(s){if(s.length<3)return"stable";let e=s.map(d=>d.pointsCompleted),t=e.length,n=0,r=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*r)/(t*i-n*n),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function VC(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Al(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function JC(s){if(s.length===0)return 0;let e=s.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/s.length*10)/10}function qC(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Al(r),i=r.tags&&r.tags.length>0?r.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[r,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),n.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:n}}function Al(s){if(!s.variance)return 0;let e=Il(s.estimatedDuration),t=Il(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Il(s){let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),s.match(/(\d+)s/)&&e===0&&(e=1),e}function cg(s){if(s.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${s.averageVelocity} pts/sprint (trend: ${s.velocityTrend})`),e.push(`Estimation accuracy: ${s.estimationAccuracy}%`);for(let t of s.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of s.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
383
+ `)}function KC(s){if(!s.estimatedDuration)return 0;let e=Il(s.estimatedDuration);if(e<=0)return 0;let t=ig[0],n=Number.POSITIVE_INFINITY;for(let r of ig){let o=Math.abs(r.typical-e);o<n&&(n=o,t=r)}return t.points}function Yr(s){return{sprintLengthDays:s.sprintLengthDays??7,startDay:s.startDay??"monday",windowSize:s.windowSize??6,accuracyTolerance:s.accuracyTolerance??20}}var UC,ig,jl=y(()=>{"use strict";xs();UC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(El,"getSprintStart");l(HC,"getSprintEnd");l(GC,"getSprintNumber");l(_i,"calculateVelocity");l(ag,"projectCompletion");l(zC,"bucketBySprint");l(WC,"buildSprintVelocities");l(BC,"detectTrend");l(VC,"calculateOverallAccuracy");l(JC,"calculateAverageVelocity");l(qC,"detectEstimationPatterns");l(Al,"parseVariancePercent");l(Il,"parseDurationMinutes");l(cg,"formatVelocityContext");ig=[{points:1,typical:10},{points:2,typical:20},{points:3,typical:45},{points:5,typical:90},{points:8,typical:180},{points:13,typical:360},{points:21,typical:720}];l(KC,"derivePoints");l(Yr,"resolveConfig")});import{exec as YC}from"node:child_process";import XC from"node:fs/promises";import Ni from"node:path";import{promisify as QC}from"node:util";async function es(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=sP(s),c=await rP(e),u=await oP(e),d=[];for(let p of c){if(!i&&aP(p))continue;let g=iP(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,r);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function sP(s){let e=s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(n=>!t.has(n)&&n.length>2)}async function rP(s){let e=[];async function t(n,r=""){try{let o=await XC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Ni.join(n,i.name),c=Ni.join(r,i.name);if(i.isDirectory()){if(nP.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Ni.extname(i.name).toLowerCase();tP.has(u)&&e.push(c)}}}catch(o){P(o)}}return l(t,"walk"),await t(s),e}async function oP(s){let e=new Map;try{let{stdout:t}=await ZC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
384
384
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
385
385
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
386
386
  END { for (f in files) print files[f], lastmod[f], f }
387
- '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
388
- `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function QC(r,e,t){let n=[],s=0,o=0,i=0,a=0,c=r.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(s+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){s+=.15;break}}s=Math.min(1,s);for(let[g,f]of Object.entries(VC))for(let k of f)if(c.includes(k)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Mi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function ZC(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var BC,VC,JC,qC,Oi=y(()=>{"use strict";_();BC=WC(GC),VC={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},JC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),qC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Zn,"findRelevantFiles");l(KC,"extractKeywords");l(YC,"getAllCodeFiles");l(XC,"getGitRecency");l(QC,"scoreFile");l(ZC,"isTestFile")});import{exec as ev}from"node:child_process";import{promisify as tv}from"node:util";async function Qr(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await rv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await sv(r,t);return o=o.filter(c=>!ov(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function sv(r,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
387
+ '`,{cwd:s,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),r=t.trim().split(`
388
+ `).filter(Boolean);for(let o of r){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function iP(s,e,t){let n=[],r=0,o=0,i=0,a=0,c=s.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(r+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){r+=.15;break}}r=Math.min(1,r);for(let[g,f]of Object.entries(eP))for(let k of f)if(c.includes(k)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(s);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Ni.basename(s).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=r*.6+o*.2+i*.15+a*.05;return{path:s,score:Math.min(1,p),reasons:[...new Set(n)]}}function aP(s){let e=s.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var ZC,eP,tP,nP,Li=y(()=>{"use strict";N();ZC=QC(YC),eP={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},tP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),nP=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(es,"findRelevantFiles");l(sP,"extractKeywords");l(rP,"getAllCodeFiles");l(oP,"getGitRecency");l(iP,"scoreFile");l(aP,"isTestFile")});import{exec as cP}from"node:child_process";import{promisify as lP}from"node:util";async function Qr(s=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,r=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(r){let c=await pP(s);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await dP(s,t);return o=o.filter(c=>!mP(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function dP(s,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
389
389
  /^[0-9]+$/ { timestamp=$1; next }
390
390
  NF {
391
391
  count[$0]++
@@ -394,8 +394,8 @@ Recommendations:
394
394
  END {
395
395
  for (f in count) print count[f], lastmod[f], f
396
396
  }
397
- ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
398
- `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function rv(r){let{stdout:e}=await Xr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
397
+ ' | sort -rn`,{cwd:s,maxBuffer:10485760}),n=[],r=t.trim().split(`
398
+ `).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),b=u/i,D=k*.6+b*.4,v;f<1?v="just now":f<24?v=`${f}h ago`:g<7?v=`${g}d ago`:g<30?v=`${Math.floor(g/7)}w ago`:v=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:v,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function pP(s){let{stdout:e}=await Xr("git branch --show-current",{cwd:s}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:s})}catch{n="master"}let{stdout:r}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:s}),o=r.trim().split(`
399
399
  `).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
400
400
  /^[0-9]+$/ { timestamp=$1; next }
401
401
  NF {
@@ -405,64 +405,64 @@ Recommendations:
405
405
  END {
406
406
  for (f in count) print count[f], lastmod[f], f
407
407
  }
408
- '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
409
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),O=Math.max(0,1-D/14),F=g/d,J=O*.5+F*.5,ne;x<1?ne="just now":x<24?ne=`${x}h ago`:ne=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(J*100)/100,lastChanged:ne,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function ov(r){let e=r.split("/").pop()||"";for(let t of nv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,nv,vl=y(()=>{"use strict";Xr=tv(ev),nv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(sv,"getHotFilesFromCommits");l(rv,"getBranchOnlyFiles");l(ov,"shouldIgnore")});function Fi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function sg(r,e){let t=iv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Pl(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zr(r,e){let t=Fi(r),n=Fi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=sg(s,av),a=xl.map(c=>({model:c,...sg(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Pl(i.total),byModel:a}}}function es(r){let e=Fi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:xl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function _i(r){if(r.length===0)return es("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=xl.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:n},compression:s,cost:{saved:i,formatted:Pl(i),byModel:o}}}function cv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function lv(r){return`${Math.round(r*100)}%`}var iv,av,xl,eo=y(()=>{"use strict";iv={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},av="claude-sonnet-4.5";l(Fi,"countTokens");xl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(sg,"calculateModelCost");l(Pl,"formatCostSaved");l(Zr,"measureCompression");l(es,"noCompression");l(_i,"combineMetrics");l(cv,"formatTokenCount");l(lv,"formatCompressionRate")});import ig from"node:fs/promises";import Dn from"node:path";async function Rn(r,e=process.cwd()){let t=Dn.isAbsolute(r)?r:Dn.join(e,r),n;try{n=await ig.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:es("")};throw u}let s=Dn.extname(r).toLowerCase(),o=ag[s]||"unknown",i=mv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:es(n)};let a=gv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
410
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function Tl(r,e=process.cwd(),t={}){let n=Dn.isAbsolute(r)?r:Dn.join(e,r),s=[];async function o(i){let a=await ig.readdir(i,{withFileTypes:!0});for(let c of a){let u=Dn.join(i,c.name),d=Dn.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=Dn.extname(c.name).toLowerCase();if(ag[m]){let p=await Rn(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function gv(r,e){let t=[],n=r.split(`
411
- `),s=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
412
- `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:fv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function fv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ag,rg,uv,dv,pv,og,mv,Ni=y(()=>{"use strict";_();eo();ag={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go",".rs":"rust",".java":"java",".cs":"csharp",".php":"php",".rb":"ruby"},rg=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],uv=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],dv=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],pv=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],og=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],mv={typescript:rg,javascript:rg,python:uv,go:dv,rust:pv,java:og,csharp:og,php:[],ruby:[],unknown:[]};l(Rn,"extractSignatures");l(Tl,"extractDirectorySignatures");l(gv,"extractFromContent");l(fv,"cleanSignature")});import{createHash as hv}from"node:crypto";import ug from"node:fs/promises";import dg from"node:path";function cg(r){return hv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function lg(r){try{let e=dg.join(r,"storage","classification-cache.json"),t=await ug.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?Qa:(console.warn("[classifier] Failed to load cache:",w(e)),Qa)}}async function El(r,e){try{let t=dg.join(r,"storage","classification-cache.json");await ug.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function wv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>yv?null:n.classification}function kv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function Sv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=pg(e),s=tc("classification")||"",o=`Classify this software engineering task into a domain.
408
+ '`,{cwd:s,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
409
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],b=u-f,D=Math.floor(b/86400),v=Math.floor(b/3600),$=Math.max(0,1-D/14),F=g/d,H=$*.5+F*.5,ee;v<1?ee="just now":v<24?ee=`${v}h ago`:ee=`${D}d ago`,a.push({path:k,changes:g,heatScore:Math.round(H*100)/100,lastChanged:ee,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function mP(s){let e=s.split("/").pop()||"";for(let t of uP)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,uP,Dl=y(()=>{"use strict";Xr=lP(cP),uP=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(dP,"getHotFilesFromCommits");l(pP,"getBranchOnlyFiles");l(mP,"shouldIgnore")});function Ui(s){return!s||s.length===0?0:Math.ceil(s.length/4)}function lg(s,e){let t=gP[e],n=s/1e3*t.input,r=s/1e3*t.output*.3;return{inputSaved:n,outputPotential:r,total:n+r}}function $l(s){return s<.001?"<$0.01":s<.01?`$${s.toFixed(3)}`:`$${s.toFixed(2)}`}function Zr(s,e){let t=Ui(s),n=Ui(e),r=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=lg(r,fP),a=Rl.map(c=>({model:c,...lg(r,c)}));return{tokens:{original:t,filtered:n,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:$l(i.total),byModel:a}}}function ts(s){let e=Ui(s);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Rl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Hi(s){if(s.length===0)return ts("");let e=s.reduce((a,c)=>a+c.tokens.original,0),t=s.reduce((a,c)=>a+c.tokens.filtered,0),n=s.reduce((a,c)=>a+c.tokens.saved,0),r=e>0?(e-t)/e:0,o=Rl.map(a=>{let c=s.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=s.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:n},compression:r,cost:{saved:i,formatted:$l(i),byModel:o}}}function hP(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function yP(s){return`${Math.round(s*100)}%`}var gP,fP,Rl,eo=y(()=>{"use strict";gP={"claude-opus-4.5":{input:.005,output:.025},"claude-sonnet-4.5":{input:.003,output:.015},"claude-haiku-4.5":{input:.001,output:.005},"claude-opus-4":{input:.015,output:.075},"claude-opus-4-6":{input:.015,output:.075},"gpt-4o":{input:.0025,output:.01},"gpt-4-turbo":{input:.01,output:.03},"gpt-4o-mini":{input:15e-5,output:6e-4},"gemini-1.5-pro":{input:.00125,output:.005},"gemini-1.5-flash":{input:75e-6,output:3e-4}},fP="claude-sonnet-4.5";l(Ui,"countTokens");Rl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(lg,"calculateModelCost");l($l,"formatCostSaved");l(Zr,"measureCompression");l(ts,"noCompression");l(Hi,"combineMetrics");l(hP,"formatTokenCount");l(yP,"formatCompressionRate")});import pg from"node:fs/promises";import Rn from"node:path";async function $n(s,e=process.cwd()){let t=Rn.isAbsolute(s)?s:Rn.join(e,s),n;try{n=await pg.readFile(t,"utf-8")}catch(u){if(P(u))return{file:s,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:ts("")};throw u}let r=Rn.extname(s).toLowerCase(),o=mg[r]||"unknown",i=bP[o];if(!i||i.length===0)return{file:s,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:ts(n)};let a=CP(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
410
+ `);return{file:s,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function Ml(s,e=process.cwd(),t={}){let n=Rn.isAbsolute(s)?s:Rn.join(e,s),r=[];async function o(i){let a=await pg.readdir(i,{withFileTypes:!0});for(let c of a){let u=Rn.join(i,c.name),d=Rn.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=Rn.extname(c.name).toLowerCase();if(mg[m]){let p=await $n(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function CP(s,e){let t=[],n=s.split(`
411
+ `),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(s))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(r.has(c))continue;r.add(c);let u=i.index,d=s.substring(0,u).split(`
412
+ `).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:PP(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function PP(s){return s.replace(/\{$/,"").replace(/\s+/g," ").trim()}var mg,ug,wP,kP,SP,dg,bP,Gi=y(()=>{"use strict";N();eo();mg={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go",".rs":"rust",".java":"java",".cs":"csharp",".php":"php",".rb":"ruby"},ug=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],wP=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],kP=[{type:"function",pattern:/^func\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"method",pattern:/^func\s+\([^)]+\)\s+(\w+)\s*\(([^)]*)\)\s*(?:\(([^)]*)\)|([^\s{]+))?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^type\s+(\w+)\s+(?:struct|interface)\s*\{/gm,nameIndex:1}],SP=[{type:"function",pattern:/^pub\s+(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?fn\s+(\w+)(?:<[^>]+>)?\s*\(([^)]*)\)\s*(?:->\s*([^{]+))?\s*\{/gm,nameIndex:1},{type:"class",pattern:/^pub\s+struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^struct\s+(\w+)(?:<[^>]+>)?\s*(?:\{|;)/gm,nameIndex:1},{type:"interface",pattern:/^pub\s+trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^trait\s+(\w+)(?:<[^>]+>)?\s*(?:\{|:)/gm,nameIndex:1},{type:"enum",pattern:/^pub\s+enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)(?:<[^>]+>)?\s*\{/gm,nameIndex:1}],dg=[{type:"class",pattern:/^(?:public\s+)?(?:abstract\s+)?(?:final\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+\w+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^(?:public\s+)?interface\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"method",pattern:/^\s+(?:public|private|protected)?\s*(?:static\s+)?(?:final\s+)?(?:synchronized\s+)?(?:<[^>]+>\s+)?(\w+(?:<[^>]+>)?)\s+(\w+)\s*\([^)]*\)\s*(?:throws\s+[^{]+)?\s*\{/gm,nameIndex:2}],bP={typescript:ug,javascript:ug,python:wP,go:kP,rust:SP,java:dg,csharp:dg,php:[],ruby:[],unknown:[]};l($n,"extractSignatures");l(Ml,"extractDirectorySignatures");l(CP,"extractFromContent");l(PP,"cleanSignature")});import{createHash as vP}from"node:crypto";import hg from"node:fs/promises";import yg from"node:path";function gg(s){return vP("sha256").update(s.toLowerCase().trim()).digest("hex").slice(0,16)}async function fg(s){try{let e=yg.join(s,"storage","classification-cache.json"),t=await hg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e)?ic:(console.warn("[classifier] Failed to load cache:",w(e)),ic)}}async function Ol(s,e){try{let t=yg.join(s,"storage","classification-cache.json");await hg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function TP(s,e,t){let n=s.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>xP?null:n.classification}function EP(s,e){return s.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function IP(s,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=wg(e),r=lc("classification")||"",o=`Classify this software engineering task into a domain.
413
413
 
414
- Task: "${r}"
414
+ Task: "${s}"
415
415
 
416
416
  Available domains in this project: ${n.join(", ")}
417
417
  Available agents: ${e.agents.join(", ")||"none"}
418
418
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
419
419
 
420
- ${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=bn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function Cv(r,e){let t=pg(e),n=new Map;for(let[p,g]of Object.entries(bv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)r.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Ud;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=vv(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function pg(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function vv(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var yv,bv,Il,xv,mg,gg=y(()=>{"use strict";Ir();Oo();_();yv=3600*1e3;l(cg,"hashDescription");l(lg,"loadCache");l(El,"saveCache");l(wv,"lookupCache");l(kv,"lookupPatterns");l(Sv,"classifyWithLLM");bv={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(Cv,"classifyWithHeuristic");l(pg,"buildAvailableDomains");l(vv,"getFilePatterns");Il=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=cg(e),i=await lg(n),a=wv(i,o,t);if(a)return{classification:a,source:"cache"};let c=kv(i,o);if(c)return{classification:c,source:"history"};let u=await Sv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await El(n,i),{classification:u,source:"llm"};let d=Cv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await El(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=cg(e),o=await lg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await El(n,o))}},xv=new Il,mg=xv});import{exec as Pv}from"node:child_process";import to from"node:fs/promises";import Tv from"node:os";import ts from"node:path";import{promisify as Ev}from"node:util";var fg,hg,Al,Iv,Li,jl=y(()=>{"use strict";Cl();Ve();Se();Ps();Bt();Oi();vl();Ni();_();Qn();gg();En();fg=Ev(Pv),hg=["database","backend","frontend","testing","devops"],Al=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=I.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),[m,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),k=null;return f&&e==="task"&&(k=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:k,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Zn(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Rn(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
421
- `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([fg("git branch --show-current",{cwd:e}),fg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
422
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await It.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=$i(t,Cn);return n.sprints.length===0?null:ng(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ts.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await mg.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=ts.join(e,"agents");return(await to.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),s=ts.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=ts.join(s,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=si(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ts.join(Tv.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=ts.join(t,`${i}.md`),c=ts.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=hg.indexOf(a),d=hg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Iv=new Al,Li=Iv});function Av(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Dl,jv,_e,yg=y(()=>{"use strict";Lt();le();un();un();l(Av,"generateApprovalPrompt");Dl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return lc.includes(e)}isDestructive(e){return uc.includes(e)}isToolAllowedInPlanning(e){return Go.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Go.includes(n)):t}startPlanning(e,t,n){let s={id:me(),projectId:e,command:t,params:n,status:re.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[re.GATHERING,re.ANALYZING,re.PROPOSING,re.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===re.APPROVED?n.approvedAt=C():t===re.EXECUTING?n.executionStartedAt=C():(t===re.COMPLETED||t===re.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=re.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=re.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==re.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=re.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=re.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==re.APPROVED?null:(t.status=re.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==re.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==re.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=re.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=re.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Av(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[re.GATHERING]:"\u{1F50D}",[re.ANALYZING]:"\u{1F9E0}",[re.PROPOSING]:"\u{1F4DD}",[re.PENDING_APPROVAL]:"\u23F3",[re.APPROVED]:"\u2705",[re.EXECUTING]:"\u26A1",[re.COMPLETED]:"\u{1F389}",[re.REJECTED]:"\u274C",[re.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===re.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
423
- `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},jv=new Dl,_e=jv});function Dv(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Hi[t]?Hi[t]:Hi[e]?Hi[e]:e}function Ui(r){let e=new Set,t=[];for(let n of r){let s=Dv(n);e.has(s)||(e.add(s),t.push(n))}return t}var Hi,Rl=y(()=>{"use strict";Hi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(Dv,"normalizeFrameworkName");l(Ui,"deduplicateTechStack")});import{z as Ne}from"zod";function wg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
424
- `);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=Ui(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>Rv[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
425
- Context: ${r.fileCount} files in project.`),e.join(`
426
- `)}var Y_,Rv,kg=y(()=>{"use strict";Rl();Y_=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),Rv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(wg,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var $v,Sg,bg=y(()=>{"use strict";$v=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Sg=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),$v).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function $l(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Cg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=$l(o,Mv),a=$l(o,Ov),c=$l(o,Fv);return s.some(d=>_v.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Mv,Ov,Fv,_v,vg=y(()=>{"use strict";Mv=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Ov=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Fv=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],_v=["Write","Edit","Bash"];l($l,"countMatches");l(Cg,"classifyCommand")});import Ml from"node:fs/promises";import Nv from"node:path";async function Pg(){if(no)return no;let r=await Ml.readFile(Ol,"utf-8"),e=JSON.parse(r);return no=Sg.parse(e),no}function Lv(r){return Tg.get(r)}function Hv(r,e){Tg.set(r,e)}function Gv(r,e){let t=r,n=xg.get(t);return n&&Wv(n.entry,e)?(n.count++,n.count>=Uv):(xg.set(t,{entry:e,count:1}),!1)}async function zv(r,e){let t=await Ml.readFile(Ol,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Ml.writeFile(Ol,`${JSON.stringify(n,null,2)}
427
- `,"utf-8"),no=null}function Wv(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function Eg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Lv(e);if(n)return{entry:n,source:"cache"};if(t){let s=Cg(e,t);return Hv(e,s),Gv(e,s)&&zv(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Ol,no,Tg,xg,Uv,Ig=y(()=>{"use strict";bg();dt();vg();Ol=Nv.join(pe,"core/config/command-context.config.json"),no=null;l(Pg,"loadCommandContextConfig");Tg=new Map;l(Lv,"getCachedClassification");l(Hv,"cacheClassification");xg=new Map,Uv=3;l(Gv,"trackClassification");l(zv,"persistClassification");l(Wv,"isSameEntry");l(Eg,"resolveCommandContextFull")});import Bv from"node:os";import{z as sn}from"zod";function Vv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Jv(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ag(r){let e=r.platform??Bv.platform(),t=r.runtime??Vv(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
428
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Jv(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
420
+ ${r}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Cn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function jP(s,e){let t=wg(e),n=new Map;for(let[p,g]of Object.entries(AP)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)s.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Jd;let r=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=DP(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function wg(s){let e=[];return s.domains.hasFrontend&&e.push("frontend"),s.domains.hasBackend&&e.push("backend"),s.domains.hasDatabase&&e.push("database"),s.domains.hasTesting&&e.push("testing"),s.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function DP(s){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[s]||e.general}var xP,AP,Fl,RP,kg,Sg=y(()=>{"use strict";Ir();Lo();N();xP=3600*1e3;l(gg,"hashDescription");l(fg,"loadCache");l(Ol,"saveCache");l(TP,"lookupCache");l(EP,"lookupPatterns");l(IP,"classifyWithLLM");AP={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(jP,"classifyWithHeuristic");l(wg,"buildAvailableDomains");l(DP,"getFilePatterns");Fl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,r){let o=gg(e),i=await fg(n),a=TP(i,o,t);if(a)return{classification:a,source:"cache"};let c=EP(i,o);if(c)return{classification:c,source:"history"};let u=await IP(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Ol(n,i),{classification:u,source:"llm"};let d=jP(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Ol(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let r=gg(e),o=await fg(n);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ol(n,o))}},RP=new Fl,kg=RP});import{exec as $P}from"node:child_process";import to from"node:fs/promises";import MP from"node:os";import ns from"node:path";import{promisify as OP}from"node:util";var bg,Cg,_l,FP,zi,Nl=y(()=>{"use strict";jl();qe();Se();xs();Bt();Li();Dl();Gi();N();Zn();Sg();In();bg=OP($P),Cg=["database","backend","frontend","testing","devops"],_l=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let r=await R.getProjectId(n),o=I.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((H,ee)=>{if(H.status==="fulfilled")return H.value;g.push(p[ee]),console.warn(`Context tool "${p[ee]}" failed: ${w(H.reason)}`)}),[k,b,D]=f,v={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},$=this.shouldFragment(a,t),F=null;return $&&e==="task"&&(F=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:$,subtasks:F,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:b??null,velocityContext:D??null,contextDegradation:v}}async gatherRealContext(e,t){try{let[n,r,o]=await Promise.all([this.getGitState(t),es(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await $n(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
421
+ `);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:r.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([bg("git branch --show-current",{cwd:e}),bg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=n.stdout.trim().split(`
422
+ `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await bt.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=_i(t,Pn);return n.sprints.length===0?null:cg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ns.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let r=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await kg.classify(e,t,r,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=ns.join(e,"agents");return(await to.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),r=ns.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=ns.join(r,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ai(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(r=>r.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ns.join(MP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let r=Array.from(n.keys()).map(async i=>{let a=ns.join(t,`${i}.md`),c=ns.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(r)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],r=t.toLowerCase();for(let i of n)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,r){let o=[...t].sort((a,c)=>{let u=Cg.indexOf(a),d=Cg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},FP=new _l,zi=FP});function _P(s,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[s]||{title:"Confirmation Required",message:`Execute ${s}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Ll,NP,_e,Pg=y(()=>{"use strict";Lt();le();un();un();l(_P,"generateApprovalPrompt");Ll=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return yc.includes(e)}isDestructive(e){return wc.includes(e)}isToolAllowedInPlanning(e){return Vo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Vo.includes(n)):t}startPlanning(e,t,n){let r={id:ge(),projectId:e,command:t,params:n,status:oe.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[oe.GATHERING,oe.ANALYZING,oe.PROPOSING,oe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===oe.APPROVED?n.approvedAt=C():t===oe.EXECUTING?n.executionStartedAt=C():(t===oe.COMPLETED||t===oe.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=oe.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=oe.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==oe.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=oe.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=oe.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==oe.APPROVED?null:(t.status=oe.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==oe.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==oe.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=oe.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let r={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),r}generateApprovalPrompt(e,t){return _P(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[oe.GATHERING]:"\u{1F50D}",[oe.ANALYZING]:"\u{1F9E0}",[oe.PROPOSING]:"\u{1F4DD}",[oe.PENDING_APPROVAL]:"\u23F3",[oe.APPROVED]:"\u2705",[oe.EXECUTING]:"\u26A1",[oe.COMPLETED]:"\u{1F389}",[oe.REJECTED]:"\u274C",[oe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===oe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
423
+ `)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},NP=new Ll,_e=NP});function LP(s){let e=s.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Wi[t]?Wi[t]:Wi[e]?Wi[e]:e}function Bi(s){let e=new Set,t=[];for(let n of s){let r=LP(n);e.has(r)||(e.add(r),t.push(n))}return t}var Wi,Ul=y(()=>{"use strict";Wi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(LP,"normalizeFrameworkName");l(Bi,"deduplicateTechStack")});import{z as Ne}from"zod";function vg(s){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
424
+ `);let t=[];s.language&&t.push(s.language),s.framework&&t.push(s.framework);let n=s.techStack??[];t.push(...n);let r=s.analysisLanguages??[],o=s.analysisFrameworks??[];t.push(...r,...o);let i=Bi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),s.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${s.analysisPackageManager}`),s.domains){let c=Object.entries(s.domains).filter(([,u])=>!u).map(([u])=>UP[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=s.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${s.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),s.fileCount&&e.push(`
425
+ Context: ${s.fileCount} files in project.`),e.join(`
426
+ `)}var iN,UP,xg=y(()=>{"use strict";Ul();iN=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),UP={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(vg,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var HP,Tg,Eg=y(()=>{"use strict";HP=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Tg=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),HP).refine(s=>"*"in s,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Hl(s,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(s)).length}function Ig(s,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${s} ${t} ${n}`,i=Hl(o,GP),a=Hl(o,zP),c=Hl(o,WP);return r.some(d=>BP.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var GP,zP,WP,BP,Ag=y(()=>{"use strict";GP=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],zP=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],WP=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],BP=["Write","Edit","Bash"];l(Hl,"countMatches");l(Ig,"classifyCommand")});import Gl from"node:fs/promises";import VP from"node:path";async function Dg(){if(no)return no;let s=await Gl.readFile(zl,"utf-8"),e=JSON.parse(s);return no=Tg.parse(e),no}function JP(s){return Rg.get(s)}function qP(s,e){Rg.set(s,e)}function YP(s,e){let t=s,n=jg.get(t);return n&&QP(n.entry,e)?(n.count++,n.count>=KP):(jg.set(t,{entry:e,count:1}),!1)}async function XP(s,e){let t=await Gl.readFile(zl,"utf-8"),n=JSON.parse(t);n.commands[s]=e,await Gl.writeFile(zl,`${JSON.stringify(n,null,2)}
427
+ `,"utf-8"),no=null}function QP(s,e){return s.agents===e.agents&&s.patterns===e.patterns&&s.checklist===e.checklist&&s.modules.length===e.modules.length&&s.modules.every((t,n)=>t===e.modules[n])}function $g(s,e,t){if(e in s.commands&&e!=="*")return{entry:s.commands[e],source:"config"};let n=JP(e);if(n)return{entry:n,source:"cache"};if(t){let r=Ig(e,t);return qP(e,r),YP(e,r)&&XP(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:s.commands["*"],source:"wildcard"}}var zl,no,Rg,jg,KP,Mg=y(()=>{"use strict";Eg();dt();Ag();zl=VP.join(de,"core/config/command-context.config.json"),no=null;l(Dg,"loadCommandContextConfig");Rg=new Map;l(JP,"getCachedClassification");l(qP,"cacheClassification");jg=new Map,KP=3;l(YP,"trackClassification");l(XP,"persistClassification");l(QP,"isSameEntry");l($g,"resolveCommandContextFull")});import ZP from"node:os";import{z as sn}from"zod";function ev(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function tv(s){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[s]??s}function Og(s){let e=s.platform??ZP.platform(),t=s.runtime??ev(),n=s.date??new Date().toISOString().split("T")[0];return`<env>
428
+ ${[["project",s.projectName],["path",s.projectPath],["git",s.isGitRepo?"true":"false"],["branch",s.gitBranch],["platform",tv(e)],["runtime",t],["date",n],["model",s.model],["provider",s.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
429
429
  `)}
430
- </env>`}var pN,jg=y(()=>{"use strict";pN=sn.object({projectName:sn.string(),projectPath:sn.string(),isGitRepo:sn.boolean().default(!0),gitBranch:sn.string().optional(),platform:sn.string().optional(),runtime:sn.string().optional(),date:sn.string().optional(),model:sn.string().optional(),provider:sn.string().optional()});l(Vv,"detectRuntime");l(Jv,"normalizePlatform");l(Ag,"buildEnvironmentBlock")});function Rg(r){let e=r.getAllocationFor("injection");return{...zi,totalPrompt:e}}function ns(r,e){let t=e*$g;return r.length<=t?r:`${r.substring(0,t)}
431
- ... (truncated to ~${e} tokens)`}function Dg(r){return Math.ceil(r.length/$g)}function Mg(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=qv[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var zi,$g,qv,Gi,Og=y(()=>{"use strict";zi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Rg,"budgetsFromCoordinator");$g=4;l(ns,"truncateToTokenBudget");l(Dg,"estimateTokens");qv={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(Mg,"filterSkillsByDomains");Gi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...zi,...e}}addSection(e,t){let n=ns(e,t),s=Dg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ns(n,o);return this.used+=Dg(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Fg from"node:fs/promises";import ss from"node:path";var Fl,Kv,_g,Ng=y(()=>{"use strict";Bt();_();xe();dt();ml();kg();Ig();jg();Og();Rl();En();Fl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Fg.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Rg(this._coordinator):zi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let n=ss.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=Tn("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ye(s);if(o){let i=ss.basename(s,".md");t[i]=o}}}else{let s=ss.join(pe,"templates","checklists");if(await P(s)){let o=(await Fg.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=ss.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,s]=await Promise.all([L.read(e),Pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await ll.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
432
- `);return ns(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=ss.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Pg();p=Eg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
433
- `),s.role&&d.push(`Role: ${s.role}
434
- `),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
430
+ </env>`}var CN,Fg=y(()=>{"use strict";CN=sn.object({projectName:sn.string(),projectPath:sn.string(),isGitRepo:sn.boolean().default(!0),gitBranch:sn.string().optional(),platform:sn.string().optional(),runtime:sn.string().optional(),date:sn.string().optional(),model:sn.string().optional(),provider:sn.string().optional()});l(ev,"detectRuntime");l(tv,"normalizePlatform");l(Og,"buildEnvironmentBlock")});function Ng(s){let e=s.getAllocationFor("injection");return{...Ji,totalPrompt:e}}function ss(s,e){let t=e*Lg;return s.length<=t?s:`${s.substring(0,t)}
431
+ ... (truncated to ~${e} tokens)`}function _g(s){return Math.ceil(s.length/Lg)}function Ug(s,e){if(e.length===0||s.length===0)return s;let t=new Set;for(let n of e){let r=nv[n.toLowerCase()];if(r)for(let o of r)t.add(o);t.add(n.toLowerCase())}return s.filter(n=>{let r=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(r.includes(o))return!0;return!1})}var Ji,Lg,nv,Vi,Hg=y(()=>{"use strict";Ji={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Ng,"budgetsFromCoordinator");Lg=4;l(ss,"truncateToTokenBudget");l(_g,"estimateTokens");nv={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(Ug,"filterSkillsByDomains");Vi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ji,...e}}addSection(e,t){let n=ss(e,t),r=_g(n);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ss(n,o);return this.used+=_g(i),i}return this.used+=r,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Gg from"node:fs/promises";import rs from"node:path";var Wl,sv,zg,Wg=y(()=>{"use strict";Bt();N();ve();dt();bl();xg();Mg();Fg();Hg();Ul();In();Wl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await x(e)){let r=await Gg.readFile(e,"utf-8");return this._templateCache.set(e,{content:r,loadedAt:n}),r}}catch(r){P(r)||console.error(`Template loading warning: ${w(r)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Ng(this._coordinator):Ji}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=fe(`global/modules/${e}`);if(t)return t;let n=rs.join(de,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=En("checklists/");if(n.length>0){for(let r of n)if(r.endsWith(".md")){let o=fe(r);if(o){let i=rs.basename(r,".md");t[i]=o}}}else{let r=rs.join(de,"templates","checklists");if(await x(r)){let o=(await Gg.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=rs.join(r,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){P(n)||console.error(`Checklist loading warning: ${w(n)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[n,r]=await Promise.all([L.read(e),xe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:r.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(P(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await yl.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!P(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let r=n.join(`
432
+ `);return ss(r,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),r=Date.now()-t,o=Math.floor(r/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=rs.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,r=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,n,r,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,r=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Dg();p=$g(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;r&&g&&(d.push(`# AGENT: ${r.name}
433
+ `),r.role&&d.push(`Role: ${r.role}
434
+ `),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
435
435
  `),d.push(`
436
436
  Apply specialized expertise. Read agent file for details if needed.
437
437
 
438
438
  `)),d.push(`TASK: ${e.frontmatter.description}
439
439
  `),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
440
440
  `);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
441
- `);let k=t.projectPath;if(k){let S=u?.project?.id?ss.basename(k):ss.basename(k),j=Ag({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
441
+ `);let k=t.projectPath;if(k){let S=u?.project?.id?rs.basename(k):rs.basename(k),j=Og({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
442
442
  ${j}
443
443
  `)}if(u){let S=u.sealedAnalysis;if(d.push(`
444
444
  ## PROJECT ANALYSIS (Sealed)
445
445
  `),d.push(`**Ecosystem**: ${u.project.ecosystem}
446
446
  `),d.push(`**Primary Domain**: ${u.primaryDomain}
447
447
  `),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
448
- `),S){if(S.languages.length>0&&d.push(`**Languages**: ${S.languages.join(", ")}
449
- `),S.frameworks.length>0&&d.push(`**Frameworks**: ${S.frameworks.join(", ")}
448
+ `),S){if(S.languages?.length>0&&d.push(`**Languages**: ${S.languages.join(", ")}
449
+ `),S.frameworks?.length>0&&d.push(`**Frameworks**: ${S.frameworks.join(", ")}
450
450
  `),S.packageManager&&d.push(`**Package Manager**: ${S.packageManager}
451
451
  `),S.sourceDir&&d.push(`**Source Dir**: ${S.sourceDir}
452
452
  `),S.testDir&&d.push(`**Test Dir**: ${S.testDir}
453
453
  `),d.push(`**Files Analyzed**: ${S.fileCount}
454
454
  `),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
455
- `),S.patterns.length>0){d.push(`
455
+ `),S.patterns?.length>0){d.push(`
456
456
  ### Code Patterns (Follow These)
457
457
  `);for(let j of S.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
458
- `)}if(S.antiPatterns.length>0){d.push(`
458
+ `)}if(S.antiPatterns?.length>0){d.push(`
459
459
  ### Anti-Patterns (Avoid These)
460
460
  `);for(let j of S.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
461
461
  `)}}d.push(`
462
462
  `)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let S=this.extractPatternSummary(D);S&&(d.push(`## CODE PATTERNS
463
463
  `),d.push(S),d.push(`
464
464
  Full patterns: Read analysis/patterns.md
465
- `))}let x=n?.analysis||"";if(b&&x&&x.trim()){let S=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
465
+ `))}let v=n?.analysis||"";if(b&&v&&v.trim()){let S=v.match(/Stack[:\s]+([^\n]+)/i)||v.match(/Technology[:\s]+([^\n]+)/i),j=S?S[1].trim():"detected";d.push(`
466
466
  ## STACK
467
467
  Stack: ${j}
468
468
  `),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
@@ -473,18 +473,18 @@ Stack: ${j}
473
473
  `),j.effort&&d.push(`Effort: ${j.effort}
474
474
  `),j.model&&d.push(`Model: ${j.model}
475
475
  `),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
476
- `);let Z=ns(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
477
- ${Z}
476
+ `);let te=ss(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
477
+ ${te}
478
478
  \`\`\`
479
479
 
480
- `)}}let S=Mg(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
480
+ `)}}let S=Ug(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
481
481
 
482
482
  `);for(let j of S){d.push(`#### Skill: ${j.name}
483
- `);let Z=ns(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
484
- ${Z}
483
+ `);let te=ss(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
484
+ ${te}
485
485
  \`\`\`
486
486
 
487
- `)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let j=await this.loadModule(S);j&&(d.push(`
487
+ `)}}}let $=this.getModulesForCommand(m,p);if($.length>0)for(let S of $){let j=await this.loadModule(S);j&&(d.push(`
488
488
  `),d.push(j))}if(c?.isPlanning&&(d.push(`
489
489
  ## PLAN MODE
490
490
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -492,9 +492,16 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
492
492
  `)),c?.requiresApproval&&d.push(`
493
493
  ## APPROVAL REQUIRED
494
494
  Show changes, list affected files, ask for confirmation.
495
- `),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Z={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:Ui(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
496
- ${wg(Z)}
497
- `)}else d.push(this.buildCriticalRules());if(u?.realContext){let S=u.realContext;if(d.push(`
495
+ `),k){let S=u?.sealedAnalysis,j=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],te={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:Bi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Ve=>Ve.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
496
+ ${vg(te)}
497
+ `)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
498
+ ### CONTEXT DEGRADATION NOTICE
499
+
500
+ `),d.push(`**Level**: ${S.level}
501
+ `),d.push(`**Unavailable**: ${S.failedTools.join(", ")}
502
+ `),d.push(`Some context tools failed. Explore the codebase manually for missing context.
503
+
504
+ `)}if(u?.realContext){let S=u.realContext;if(d.push(`
498
505
  ### CODEBASE CONTEXT
499
506
 
500
507
  `),d.push(`**Git State**: Branch \`${S.gitBranch}\` | ${S.gitStatus}
@@ -510,7 +517,7 @@ ${wg(Z)}
510
517
  ${j.content}
511
518
  \`\`\`
512
519
  `);d.push(`
513
- `)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let j=S.recentFiles.slice(0,5).map(Z=>`${Z.path} (${Z.lastChanged})`).join(", ");d.push(`${j}
520
+ `)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let j=S.recentFiles.slice(0,5).map(te=>`${te.path} (${te.lastChanged})`).join(", ");d.push(`${j}
514
521
 
515
522
  `)}}let F=t.files||[];if(F.length>0){let S=F.slice(0,5).join(", ");d.push(`
516
523
  ## FILES: ${F.length} available. Top: ${S}
@@ -520,9 +527,9 @@ ${j.content}
520
527
  ## PROJECT: ${k}
521
528
  Read files before modifying.
522
529
 
523
- `);let J=this.filterRelevantState(n);if(J&&(d.push(`
530
+ `);let H=this.filterRelevantState(n);if(H&&(d.push(`
524
531
  ## PRJCT STATE (Project Management Data)
525
- `),d.push(J),d.push(`
532
+ `),d.push(H),d.push(`
526
533
  `)),u?.velocityContext&&(d.push(`
527
534
  ### VELOCITY (Historical Estimation Data)
528
535
 
@@ -549,7 +556,7 @@ Read files before modifying.
549
556
 
550
557
  `),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
551
558
  `),d.push(`|---|--------|-------------|--------|
552
- `);for(let j of u.subtasks){let Z=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${Z} |
559
+ `);for(let j of u.subtasks){let te=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${te} |
553
560
  `)}let S=u.subtasks.find(j=>j.status==="in_progress");if(S&&(d.push(`
554
561
  **FOCUS ON SUBTASK #${S.order}**: ${S.description}
555
562
  `),d.push(`Agent: ${S.agent} | Domain: ${S.domain}
@@ -560,15 +567,15 @@ Read files before modifying.
560
567
  `),d.push(`**From:** ${j.fromSubtask}
561
568
 
562
569
  `),d.push(`**What was done:**
563
- `);for(let Z of j.whatWasDone)d.push(`- ${Z}
570
+ `);for(let te of j.whatWasDone)d.push(`- ${te}
564
571
  `);if(j.filesChanged.length>0){d.push(`
565
572
  **Files changed:**
566
- `);for(let Z of j.filesChanged)d.push(`- \`${Z.path}\` (${Z.action})
573
+ `);for(let te of j.filesChanged)d.push(`- \`${te.path}\` (${te.action})
567
574
  `)}d.push(`
568
575
  **Context for this subtask:**
569
576
  ${j.outputForNextAgent}
570
577
  `)}d.push(`
571
- `)}let ne=this.getSchemaTypeForCommand(m);if(ne){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Oo(),Yd)),j=S(ne);j&&d.push(`
578
+ `)}let ee=this.getSchemaTypeForCommand(m);if(ee){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(Lo(),np)),j=S(ee);j&&d.push(`
572
579
  ${j}
573
580
  `)}if(p.checklist){let S=await this.loadChecklistRouting(),j=await this.loadChecklists();S&&Object.keys(j).length>0&&(d.push(`
574
581
  ## QUALITY CHECKLISTS
@@ -576,7 +583,7 @@ ${j}
576
583
  `),d.push(`Available: ${Object.keys(j).join(", ")}
577
584
  `),d.push(`Path: templates/checklists/{name}.md
578
585
  `),d.push(`Use Read tool to load checklists you determine are relevant.
579
- `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Gi({totalPrompt:t.stateData}),s=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=s.includes(i)?500:250,u=n.addSection(`### ${i}
586
+ `))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Vi({totalPrompt:t.stateData}),r=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=r.includes(i)?500:250,u=n.addSection(`### ${i}
580
587
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
581
588
 
582
589
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -590,10 +597,10 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
590
597
 
591
598
  `),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
592
599
  `).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
593
- `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
600
+ `);a&&t.push(a)}let r=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(r){let a=r[0].substring(0,300);t.push(`
594
601
  Avoid:
595
602
  ${a}`)}let o=t.join(`
596
- `);return ns(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
603
+ `);return ss(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
597
604
  ## RULES (CRITICAL)
598
605
  1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
599
606
  2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
@@ -610,7 +617,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
610
617
  - Prefer structured output (JSON) over free text when applicable.
611
618
 
612
619
  EXECUTE: Follow flow. Use tools. Decide.
613
- `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},Kv=new Fl,_g=Kv});import Lg from"node:fs/promises";import Rt from"node:path";var Yv,Xv,_l,Nl,Wi,Ll=y(()=>{"use strict";Ve();Se();_();Yv=["task","done","ship","resume","bug","enrich"],Xv=["init","sync","pause","next","dash","history","undo","redo"],_l=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Rt.dirname(yr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=I.getGlobalProjectPath(s),a=await(Be(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Rt.join(u,"templates")}catch{c=Rt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await I.getAgentSettingsPath(),paths:{orchestrator:Rt.join(c,"agentic","orchestrator.md"),agentRouting:Rt.join(c,"agentic","agent-routing.md"),taskFragmentation:Rt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Rt.join(c,"commands",`${e}.md`),repoAnalysis:Rt.join(o,"analysis","repo-analysis.json"),agentsDir:Rt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Rt.join(o,"storage","state.json")}}}requiresOrchestration(e){return Yv.includes(e)?!0:!Xv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Lg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Lg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
620
+ `}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},sv=new Wl,zg=sv});import Bg from"node:fs/promises";import Rt from"node:path";var rv,ov,Bl,Vl,qi,Jl=y(()=>{"use strict";qe();Se();N();rv=["task","done","ship","resume","bug","enrich"],ov=["init","sync","pause","next","dash","history","undo","redo"],Bl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Rt.dirname(yr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let r=await this.getProjectId(n),o=I.getGlobalProjectPath(r),a=await(Je(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Rt.join(u,"templates")}catch{c=Rt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:r,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await I.getAgentSettingsPath(),paths:{orchestrator:Rt.join(c,"agentic","orchestrator.md"),agentRouting:Rt.join(c,"agentic","agent-routing.md"),taskFragmentation:Rt.join(c,"agentic","task-fragmentation.md"),commandTemplate:Rt.join(c,"commands",`${e}.md`),repoAnalysis:Rt.join(o,"analysis","repo-analysis.json"),agentsDir:Rt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:Rt.join(o,"storage","state.json")}}}requiresOrchestration(e){return rv.includes(e)?!0:!ov.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Bg.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return P(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=Rt.join(I.getGlobalProjectPath(t),"agents");return(await Bg.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
614
621
  ## Agentic Execution Mode
615
622
 
616
623
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -693,13 +700,13 @@ When fragmenting tasks:
693
700
  2. Track progress: currentSubtaskIndex, subtaskProgress
694
701
  3. Each completed subtask generates a summary
695
702
  4. Pass summary to next agent for context handoff
696
- `,context:e,requiresOrchestration:t}}},Nl=new _l,Wi=Nl});import{exec as Qv}from"node:child_process";import Hg from"node:fs/promises";import{promisify as Zv}from"node:util";var ex,rs,Ke,Hl=y(()=>{"use strict";ci();ex=Zv(Qv),rs={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};rs.register("Read",async r=>{try{return await Gr.execute(async()=>await Hg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ai(e)||Ur(e),null}});rs.register("Write",async(r,e)=>{try{return await Gr.execute(async()=>await Hg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ai(t)||Ur(t),!1}});rs.register("Bash",async r=>{try{return await Gr.execute(async()=>await ex(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});rs.register("GetTimestamp",async()=>new Date().toISOString());rs.register("GetDate",async()=>new Date().toISOString().split("T")[0]);rs.register("GetDateTime",async()=>new Date().toISOString());Ke=rs});import Ul from"node:fs/promises";import tx from"node:os";import Ug from"node:path";async function nx(r){try{let e=Ug.dirname(Bi);await P(e)||await Ul.mkdir(e,{recursive:!0}),await Ul.writeFile(Bi,`/p:${r}`)}catch{}}async function sx(){try{await P(Bi)&&await Ul.unlink(Bi)}catch{}}var Bi,Gl,rx,Vi,zl=y(()=>{"use strict";_();Mm();xe();_m();Lm();hl();Qm();Zm();Ms();jl();yg();Ng();Ll();En();Hl();Bi=Ug.join(tx.homedir(),".prjct-cli",".running");l(nx,"signalStart");l(sx,"signalEnd");Gl=class{static{l(this,"CommandExecutor")}async signalStart(e){await nx(e)}async signalEnd(){await sx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Us.shouldEscalate(e,s)){let o=Us.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await $c.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Ri.requiresVerification(e)){let S=await ft.loadStateForCommand(i,e);m=await Ri.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Ri.formatWarnings(m))}let p=null;if(Di.requiresReasoning(e)){let S=await ft.loadStateForCommand(i,e);p=await Di.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Di.formatPlan(p)))}let g=t.task||t.description||"",f=await Wi.buildContext(e,g,n),k=Wi.buildAgenticPrompt(f),b=null;if(Wi.requiresOrchestration(e)&&g)try{b=await Li.execute(e,g,n),b.detectedDomains.length>0&&ji.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");ji.startAgent(S.name,j,`Loading ${j} specialist...`),ji.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let S=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Fm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(S)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},x=await ft.loadState(i),O=null,F=null;i.projectId&&(O={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let J={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ne=await _g.build(o,D,x,null,O,null,F,J,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Us.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:ne,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:F,orchestratorContext:b,memory:{create:l(S=>Te.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,Z)=>Te.autoRemember(i.projectId,S,j,Z),"autoRemember"),search:l(S=>Te.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Te.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>_e.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>_e.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>_e.proposePlan(i.projectId,S),"propose"),approve:l(S=>_e.approvePlan(i.projectId,S),"approve"),reject:l(S=>_e.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>_e.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>_e.failStep(i.projectId,S),"failStep"),abort:l(S=>_e.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Us.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Us.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await $c.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},rx=new Gl,Vi=rx});import Ji from"node:fs/promises";import ox from"node:https";import ix from"node:os";import Wl from"node:path";import Jt from"chalk";var Bl,Gg,zg=y(()=>{"use strict";_();xe();Bl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Wl.join(ix.homedir(),".prjct-cli","config"),this.cacheFile=Wl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Wl.join(__dirname,"..","..","package.json");return JSON.parse(await Ji.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=ox.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await Ji.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await Ji.mkdir(this.cacheDir,{recursive:!0}),await Ji.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
703
+ `,context:e,requiresOrchestration:t}}},Vl=new Bl,qi=Vl});import{exec as iv}from"node:child_process";import Vg from"node:fs/promises";import{promisify as av}from"node:util";var cv,os,Xe,ql=y(()=>{"use strict";pi();cv=av(iv),os={tools:new Map,register(s,e){this.tools.set(s,e)},get(s){return this.tools.get(s)},isAllowed(s,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?s.startsWith(t.slice(0,-1)):s===t)},list(){return Array.from(this.tools.keys())}};os.register("Read",async s=>{try{return await Gr.execute(async()=>await Vg.readFile(s,"utf-8"),`read-${s}`)}catch(e){return di(e)||Hr(e),null}});os.register("Write",async(s,e)=>{try{return await Gr.execute(async()=>await Vg.writeFile(s,e,"utf-8"),`write-${s}`),!0}catch(t){return di(t)||Hr(t),!1}});os.register("Bash",async s=>{try{return await Gr.execute(async()=>await cv(s),`bash-${s}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});os.register("GetTimestamp",async()=>new Date().toISOString());os.register("GetDate",async()=>new Date().toISOString().split("T")[0]);os.register("GetDateTime",async()=>new Date().toISOString());Xe=os});import Kl from"node:fs/promises";import lv from"node:os";import Jg from"node:path";async function uv(s){try{let e=Jg.dirname(Ki);await x(e)||await Kl.mkdir(e,{recursive:!0}),await Kl.writeFile(Ki,`/p:${s}`)}catch{}}async function dv(){try{await x(Ki)&&await Kl.unlink(Ki)}catch{}}var Ki,Yl,pv,Yi,Xl=y(()=>{"use strict";N();Um();ve();zm();Bm();vl();rg();og();Ms();Nl();Pg();Wg();Jl();In();ql();Ki=Jg.join(lv.homedir(),".prjct-cli",".running");l(uv,"signalStart");l(dv,"signalEnd");Yl=class{static{l(this,"CommandExecutor")}async signalStart(e){await uv(e)}async signalEnd(){await dv()}async execute(e,t,n){await this.signalStart(e);let r=t.task||t.description||"";if(Hs.shouldEscalate(e,r)){let o=Hs.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Hc.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Fi.requiresVerification(e)){let S=await ft.loadStateForCommand(i,e);m=await Fi.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Fi.formatWarnings(m))}let p=null;if(Oi.requiresReasoning(e)){let S=await ft.loadStateForCommand(i,e);p=await Oi.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Oi.formatPlan(p)))}let g=t.task||t.description||"",f=await qi.buildContext(e,g,n),k=qi.buildAgenticPrompt(f),b=null;if(qi.requiresOrchestration(e)&&g)try{b=await zi.execute(e,g,n),b.detectedDomains.length>0&&Mi.orchestrate(b.detectedDomains);for(let S of b.agents){let j=S.domain||S.name.replace(".md","");Mi.startAgent(S.name,j,`Loading ${j} specialist...`),Mi.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let S=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Gm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(S)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},v=await ft.loadState(i),$=null,F=null;i.projectId&&($={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let H={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ee=await zg.build(o,D,v,null,$,null,F,H,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Hs.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:D,state:v,prompt:ee,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:$,relevantMemories:F,orchestratorContext:b,memory:{create:l(S=>Te.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,te)=>Te.autoRemember(i.projectId,S,j,te),"autoRemember"),search:l(S=>Te.searchMemories(i.projectId,S),"search"),findByTags:l(S=>Te.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>_e.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>_e.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>_e.proposePlan(i.projectId,S),"propose"),approve:l(S=>_e.approvePlan(i.projectId,S),"approve"),reject:l(S=>_e.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>_e.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>_e.failStep(i.projectId,S),"failStep"),abort:l(S=>_e.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Hs.recordAttempt(e,r,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Hs.getEscalationInfo(e,r);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Xe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let r=Xe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,n){try{let o=(await Hc.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(r){return{success:!1,error:w(r)}}}},pv=new Yl,Yi=pv});import Xi from"node:fs/promises";import mv from"node:https";import gv from"node:os";import Ql from"node:path";import Jt from"chalk";var Zl,qg,Kg=y(()=>{"use strict";N();ve();Zl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Ql.join(gv.homedir(),".prjct-cli","config"),this.cacheFile=Ql.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Ql.join(__dirname,"..","..","package.json");return JSON.parse(await Xi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=mv.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await x(this.cacheFile))return JSON.parse(await Xi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await x(this.cacheDir)||await Xi.mkdir(this.cacheDir,{recursive:!0}),await Xi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
697
704
  `+Jt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
698
705
  `+Jt.yellow("\u2502")+" "+Jt.bold("Update available!")+" "+Jt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Jt.yellow("\u2502")+`
699
706
  `+Jt.yellow("\u2502")+" "+Jt.yellow("\u2502")+`
700
707
  `+Jt.yellow("\u2502")+" Run: "+Jt.cyan("npm update -g prjct-cli")+" "+Jt.yellow("\u2502")+`
701
708
  `+Jt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
702
- `}},Gg=Bl});var be,rt=y(()=>{"use strict";zl();hl();Hl();Ve();Se();zg();Mn();le();xe();Gt();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Gg,this.updateNotificationShown=!1,this.commandExecutor=Vi}get agent(){return Fs.getAgent()}get agentInfo(){return Fs.getInfo()}get currentAuthor(){return $n.getCurrentAuthor()}async initializeAgent(){return Fs.initialize()}async ensureProjectInit(e){return $n.ensureInit(e)}async ensureAuthor(){return $n.ensureAuthor()}async getGlobalProjectPath(e){return $n.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return $n.isEmptyDirectory(e)}async _detectExistingCode(e){return $n.hasExistingCode(e)}_breakdownFeatureTasks(e){return mi.breakdownFeature(e)}_detectBugSeverity(e){return mi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Fs.assignForTask(e,t,n)}}});var Wg={};fe(Wg,{PlanningCommands:()=>is});import os from"node:path";async function ax(){if(!Vl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ki(),Bg));Vl=new r}return Vl}var Vl,is,qi=y(()=>{"use strict";Do();In();Lt();Bt();_();Ns();Ls();ml();rt();Vl=null;l(ax,"getAnalysisCommands");is=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Hs(t).runNonInteractive());else if(a=await new Hs(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await vs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await I.ensureProjectStructure(m);let p=I.getGlobalProjectPath(m),g={"core/now.md":`# NOW
709
+ `}},qg=Zl});var be,ot=y(()=>{"use strict";Xl();vl();ql();qe();Se();Kg();On();le();ve();Gt();be=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new qg,this.updateNotificationShown=!1,this.commandExecutor=Yi}get agent(){return Fs.getAgent()}get agentInfo(){return Fs.getInfo()}get currentAuthor(){return Mn.getCurrentAuthor()}async initializeAgent(){return Fs.initialize()}async ensureProjectInit(e){return Mn.ensureInit(e)}async ensureAuthor(){return Mn.ensureAuthor()}async getGlobalProjectPath(e){return Mn.getGlobalPath(e)}async logToMemory(e,t,n){let r=await this.ensureAuthor();return mt.log(e,t,n,r.name)}async _detectEmptyDirectory(e){return Mn.isEmptyDirectory(e)}async _detectExistingCode(e){return Mn.hasExistingCode(e)}_breakdownFeatureTasks(e){return yi.breakdownFeature(e)}_detectBugSeverity(e){return yi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Fs.assignForTask(e,t,n)}}});var Yg={};he(Yg,{PlanningCommands:()=>as});import is from"node:path";async function fv(){if(!eu){let{AnalysisCommands:s}=await Promise.resolve().then(()=>(Zi(),Xg));eu=new s}return eu}var eu,as,Qi=y(()=>{"use strict";Oo();An();Lt();Bt();N();Ns();Ls();bl();ot();eu=null;l(fv,"getAnalysisCommands");as=class extends be{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Us(t).runNonInteractive());else if(a=await new Us(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Ps(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await I.ensureProjectStructure(m);let p=I.getGlobalProjectPath(m),g={"core/now.md":`# NOW
703
710
 
704
711
  No current task. Use \`/p:now\` to set focus.
705
712
  `,"core/next.md":`# NEXT
@@ -719,7 +726,7 @@ No current task. Use \`/p:now\` to set focus.
719
726
  `,"planning/roadmap.md":`# ROADMAP
720
727
 
721
728
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
722
- `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,x]of Object.entries(g))await Ke.get("Write")(os.join(p,D),x);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await ax();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!k){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=os.join(p,"planning","architect-session.md"),x=`# Architect Session
729
+ `,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[D,v]of Object.entries(g))await Xe.get("Write")(is.join(p,D),v);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let D=await fv();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!k){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=is.join(p,"planning","architect-session.md"),v=`# Architect Session
723
730
 
724
731
  ## Idea
725
732
  ${b}
@@ -728,8 +735,8 @@ ${b}
728
735
  Initialized - awaiting stack recommendation
729
736
 
730
737
  Generated: ${new Date().toLocaleString()}
731
- `;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=me(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Pe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:W.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Bug Reported",e),jt({Severity:a,Priority:m,Agent:u}),Qe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
732
- `);let s=await this.getGlobalProjectPath(t),o=os.join(s,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
738
+ `;return await Xe.get("Write")(D,v),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(n=>{switch(n){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ge(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await xe.addTasks(r,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:B.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await xe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Bug Reported",e),jt({Severity:a,Priority:m,Agent:u}),et([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),Ct("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(r){return n.md||h.fail(w(r)),{success:!1,error:w(r)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
739
+ `);let r=await this.getGlobalProjectPath(t),o=is.join(r,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
733
740
 
734
741
  Create a plan first:
735
742
  1. Run /p:init in an empty directory
@@ -750,7 +757,7 @@ The architect plan is ready. Claude will now:
750
757
  4. Create starter files with boilerplate
751
758
  `),console.log(`
752
759
  \u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
753
- `),await this.logToMemory(t,"architect_executed",{timestamp:W.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=I.getGlobalProjectPath(o),u=os.join(c,"planning","architect-session.md"),d=`# Architect Session
760
+ `),await this.logToMemory(t,"architect_executed",{timestamp:B.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=I.getGlobalProjectPath(o),u=is.join(c,"planning","architect-session.md"),d=`# Architect Session
754
761
 
755
762
  ## Idea
756
763
  ${e}
@@ -765,14 +772,14 @@ Initialized - awaiting architecture design
765
772
  4. Generate roadmap
766
773
 
767
774
  Generated: ${new Date().toLocaleString()}
768
- `;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),jt({Mode:"architecture"}),Qe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
775
+ `;return await Xe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Idea Captured",e),jt({Mode:"architecture"}),et([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
769
776
  \u{1F4A1} Use /p:architect execute to continue planning
770
- `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:W.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),jt({Mode:"capture"}),Qe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=I.getGlobalProjectPath(s),m=os.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
777
+ `)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Qe.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(rt("Idea Captured",e),jt({Mode:"capture"}),et([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),Ct("idea")),{success:!0,mode:"capture",idea:e}}catch(r){return n.md||h.fail(w(r)),{success:!1,error:w(r)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=I.getGlobalProjectPath(r),m=is.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
771
778
  \u{1F4A1} Create one with /p:spec "feature name"
772
779
  `),{success:!0,specs:[]}):(console.log(`
773
780
  \u{1F4CB} SPECIFICATIONS
774
781
  `),console.log("\u2550".repeat(50)),f.forEach((k,b)=>{let D=k.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
775
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=I.getGlobalProjectPath(s),i=os.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=os.join(i,`${a}.md`),u=`# Specification: ${e}
782
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=I.getGlobalProjectPath(r),i=is.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=is.join(i,`${a}.md`),u=`# Specification: ${e}
776
783
 
777
784
  ## Overview
778
785
  [Brief description of the feature]
@@ -802,49 +809,63 @@ Generated: ${new Date().toLocaleString()}
802
809
  ---
803
810
  Created: ${new Date().toLocaleString()}
804
811
  Status: Draft
805
- `;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:W.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
806
- \u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
807
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Yi,$n,Vg=y(()=>{"use strict";ln();Do();Ve();Se();_();xe();Gt();Yi=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(qi(),Wg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw xo.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await vs();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await ws(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ws(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},$n=new Yi});import{exec as cx}from"node:child_process";import{promisify as lx}from"node:util";var Jl,ux,Xi,so,Jg=y(()=>{"use strict";he();_();Zo();Jl=lx(cx),ux={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Xi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ux,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await Jl("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([Jl(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Jl(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
808
- `).filter(Boolean):[],s){let c=new Date(s),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
809
- `)}async getSessionInfo(e){return Pn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
810
- `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
811
- `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},so=l((r,e)=>new Xi(r,e),"createStalenessChecker")});import qg from"node:fs/promises";import Qi from"node:path";function ro(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function gx(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!px.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function Kg(r,e){let t=[],n=await qg.readdir(r,{withFileTypes:!0});for(let s of n){if(mx.has(s.name))continue;let o=Qi.join(r,s.name);if(s.isDirectory())t.push(...await Kg(o,e));else if(s.isFile()){let i=Qi.extname(s.name).toLowerCase();dx.has(i)&&t.push(Qi.relative(e,o))}}return t}async function fx(r){let e=await Kg(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await qg.readFile(Qi.join(r,d),"utf-8"),p=gx(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function yx(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};V.setDoc(r,hx,t)}async function Yg(r,e){let t=await fx(r);return yx(e,t),t}var dx,px,mx,hx,Xg=y(()=>{"use strict";he();dx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),px=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]),mx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(gx,"tokenizeFile");l(Kg,"listFiles");l(fx,"buildIndex");hx="bm25-index";l(yx,"saveIndex");l(Yg,"indexProject")});import ql from"node:fs/promises";import mn from"node:path";function Cx(r){let e=[],t,n=new RegExp(bx.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function vx(r,e,t){let n;if(r.startsWith("@/"))n=mn.join(t,"src",r.slice(2));else{let s=mn.dirname(mn.join(t,e));n=mn.resolve(s,r)}for(let s of Sx){let o=n+s;try{if((await ql.stat(o)).isFile())return mn.relative(t,o)}catch{}}return null}async function Qg(r,e){let t=[],n=await ql.readdir(r,{withFileTypes:!0});for(let s of n){if(kx.has(s.name))continue;let o=mn.join(r,s.name);if(s.isDirectory())t.push(...await Qg(o,e));else if(s.isFile()){let i=mn.extname(s.name).toLowerCase();wx.has(i)&&t.push(mn.relative(e,o))}}return t}async function xx(r){let e=await Qg(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await ql.readFile(mn.join(r,u),"utf-8"),m=Cx(d),p=[];for(let g of m){let f=await vx(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Px(r,e){V.setDoc(r,Zg,e)}function ef(r){return V.getDoc(r,Zg)}async function tf(r,e){let t=await xx(r);return Px(e,t),t}var wx,kx,Sx,bx,Zg,Kl=y(()=>{"use strict";he();wx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),kx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Sx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],bx=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Cx,"extractImportSources");l(vx,"resolveImport");l(Qg,"listFiles");l(xx,"buildGraph");Zg="import-graph";l(Px,"saveGraph");l(ef,"loadGraph");l(tf,"indexImports")});function nf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=ef(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function sf(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var rf=y(()=>{"use strict";Kl();l(nf,"propagateChanges");l(sf,"affectedDomains")});import Yl from"node:fs/promises";import Zi from"node:path";async function of(r,e){let t=[],n=await Yl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Ex.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Zi.join(r,o);if(s.isDirectory())t.push(...await of(i,e));else if(s.isFile()){let a=Zi.extname(o).toLowerCase();Tx.has(a)&&t.push(Zi.relative(e,i))}}return t}function Ix(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function Ax(r){let e=await of(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=Zi.join(r,a),[u,d]=await Promise.all([Yl.readFile(c,"utf-8"),Yl.stat(c)]);return{path:a,hash:Ix(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function jx(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function Xl(r,e){let t=V.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),V.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Dx(r){let e=new Map;try{let t=V.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Ql(r,e){let[t,n]=await Promise.all([Ax(r),Promise.resolve(Dx(e))]);return{diff:jx(t,n),currentHashes:t}}function af(r){return V.hasDoc(r,"file-hashes-meta")}var Tx,Ex,cf=y(()=>{"use strict";he();Tx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Ex=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(of,"listProjectFiles");l(Ix,"hashContent");l(Ax,"computeHashes");l(jx,"diffHashes");l(Xl,"saveHashes");l(Dx,"loadHashes");l(Ql,"detectChanges");l(af,"hasHashRegistry")});import{exec as Rx}from"node:child_process";import{promisify as $x}from"node:util";async function Fx(r,e=100){try{let{stdout:t}=await Mx(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
812
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=uf&&n.push(s),s=new Set):i&&s&&_x(i)&&s.add(i)}return s&&s.size>0&&s.size<=uf&&n.push(s),n}catch{return[]}}function _x(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function Nx(r,e=100){let t=await Fx(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Lx(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<lf||m<lf)continue;let p=d+m-a,g=p>0?a/p:0;g<Ox||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function Lx(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Ux(r,e){V.setDoc(r,Hx,e)}async function df(r,e,t=100){let n=await Nx(r,t);return Ux(e,n),n}var Mx,Ox,lf,uf,Hx,pf=y(()=>{"use strict";he();Mx=$x(Rx),Ox=.1,lf=2,uf=30;l(Fx,"parseGitLog");l(_x,"isSourceFile");l(Nx,"buildMatrix");l(Lx,"pairKey");Hx="cochange-index";l(Ux,"saveMatrix");l(df,"indexCoChanges")});function $t(r){return`<!-- source: ${r.file}, ${r.type} -->`}function as(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var Zl=y(()=>{"use strict";l($t,"cite");l(as,"defaultSources")});function Gx(r,e){let t=r.sources||as();return`# ${r.name} - Project Rules
813
- <!-- projectId: ${r.projectId} -->
812
+ `;return await Xe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
813
+ \u{1F4DD} Edit: ~/.prjct-cli/projects/${r}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
814
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var ea,Mn,Qg=y(()=>{"use strict";ln();Oo();qe();Se();N();ve();Gt();ea=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Qi(),Yg)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw Io.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Ps();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await ks(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return P(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await ks(e)).some(r=>t.includes(r))}catch(t){return P(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},Mn=new ea});import{exec as hv}from"node:child_process";import{promisify as yv}from"node:util";var tu,wv,ta,so,Zg=y(()=>{"use strict";ye();N();si();tu=yv(hv),wv={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ta=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...wv,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=M.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let r=n.lastSync;try{let{stdout:c}=await tu("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=c.trim()}catch{return t.reason="Not a git repository",t}if(!t.lastSyncCommit)return t.isStale=!0,t.reason="No sync commit recorded. Run `prjct sync` to track.",t;if(t.lastSyncCommit===t.currentCommit)return t.reason="Context is up to date",t;let o=this.projectPath,[i,a]=await Promise.all([tu(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),tu(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null)]);if(!i)return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t;if(t.commitsSinceSync=parseInt(i.stdout.trim(),10)||0,t.changedFiles=a?a.stdout.trim().split(`
815
+ `).filter(Boolean):[],r){let c=new Date(r),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let r of e.significantChanges.slice(0,5))t.push(` \u2022 ${r}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
816
+ `)}async getSessionInfo(e){return Tn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
817
+ `);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let r=new Set,o=[];for(let i of e.commands)r.has(i)||(r.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let r=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
818
+ `)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},so=l((s,e)=>new ta(s,e),"createStalenessChecker")});import ef from"node:fs/promises";import na from"node:path";function ro(s){return s.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Cv(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of r){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...ro(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...ro(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(s))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(s))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!Sv.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function tf(s,e){let t=[],n=await ef.readdir(s,{withFileTypes:!0});for(let r of n){if(bv.has(r.name))continue;let o=na.join(s,r.name);if(r.isDirectory())t.push(...await tf(o,e));else if(r.isFile()){let i=na.extname(r.name).toLowerCase();kv.has(i)&&t.push(na.relative(e,o))}}return t}async function Pv(s){let e=await tf(s,s),t={},n={},r=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await ef.readFile(na.join(s,d),"utf-8"),p=Cv(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},r+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function xv(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};q.setDoc(s,vv,t)}async function nf(s,e){let t=await Pv(s);return xv(e,t),t}var kv,Sv,bv,vv,sf=y(()=>{"use strict";ye();kv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),Sv=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]),bv=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(Cv,"tokenizeFile");l(tf,"listFiles");l(Pv,"buildIndex");vv="bm25-index";l(xv,"saveIndex");l(nf,"indexProject")});import nu from"node:fs/promises";import mn from"node:path";function jv(s){let e=[],t,n=new RegExp(Av.source,"g");for(;(t=n.exec(s))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function Dv(s,e,t){let n;if(s.startsWith("@/"))n=mn.join(t,"src",s.slice(2));else{let r=mn.dirname(mn.join(t,e));n=mn.resolve(r,s)}for(let r of Iv){let o=n+r;try{if((await nu.stat(o)).isFile())return mn.relative(t,o)}catch{}}return null}async function rf(s,e){let t=[],n=await nu.readdir(s,{withFileTypes:!0});for(let r of n){if(Ev.has(r.name))continue;let o=mn.join(s,r.name);if(r.isDirectory())t.push(...await rf(o,e));else if(r.isFile()){let i=mn.extname(r.name).toLowerCase();Tv.has(i)&&t.push(mn.relative(e,o))}}return t}async function Rv(s){let e=await rf(s,s),t={},n={},r=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await nu.readFile(mn.join(s,u),"utf-8"),m=jv(d),p=[];for(let g of m){let f=await Dv(g,u,s);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,r+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function $v(s,e){q.setDoc(s,of,e)}function af(s){return q.getDoc(s,of)}async function cf(s,e){let t=await Rv(s);return $v(e,t),t}var Tv,Ev,Iv,Av,of,su=y(()=>{"use strict";ye();Tv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Ev=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Iv=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Av=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(jv,"extractImportSources");l(Dv,"resolveImport");l(rf,"listFiles");l(Rv,"buildGraph");of="import-graph";l($v,"saveGraph");l(af,"loadGraph");l(cf,"indexImports")});function lf(s,e){let t=[...s.added,...s.modified],n=new Set(t),r=new Set,o=af(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:s.deleted,allAffected:a}}function uf(s){let e=new Set;for(let t of s){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var df=y(()=>{"use strict";su();l(lf,"propagateChanges");l(uf,"affectedDomains")});import ru from"node:fs/promises";import sa from"node:path";async function pf(s,e){let t=[],n=await ru.readdir(s,{withFileTypes:!0}).catch(()=>[]);for(let r of n){let o=String(r.name);if(Ov.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=sa.join(s,o);if(r.isDirectory())t.push(...await pf(i,e));else if(r.isFile()){let a=sa.extname(o).toLowerCase();Mv.has(a)&&t.push(sa.relative(e,i))}}return t}function Fv(s){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(s).toString(36)}`;let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function _v(s){let e=await pf(s,s),t=new Map,n=100;for(let r=0;r<e.length;r+=n){let o=e.slice(r,r+n),i=await Promise.all(o.map(async a=>{try{let c=sa.join(s,a),[u,d]=await Promise.all([ru.readFile(c,"utf-8"),ru.stat(c)]);return{path:a,hash:Fv(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Nv(s,e){let t=[],n=[],r=[];for(let[i,a]of s){let c=e.get(i);c?c.hash!==a.hash?n.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())s.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:r}}function ou(s,e){let t=q.getDb(s);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)n.run(r.path,r.hash,r.size,r.mtime)})(),q.setDoc(s,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Lv(s){let e=new Map;try{let t=q.query(s,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function iu(s,e){let[t,n]=await Promise.all([_v(s),Promise.resolve(Lv(e))]);return{diff:Nv(t,n),currentHashes:t}}function mf(s){return q.hasDoc(s,"file-hashes-meta")}var Mv,Ov,gf=y(()=>{"use strict";ye();Mv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Ov=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(pf,"listProjectFiles");l(Fv,"hashContent");l(_v,"computeHashes");l(Nv,"diffHashes");l(ou,"saveHashes");l(Lv,"loadHashes");l(iu,"detectChanges");l(mf,"hasHashRegistry")});import{exec as Uv}from"node:child_process";import{promisify as Hv}from"node:util";async function Wv(s,e=100){try{let{stdout:t}=await Gv(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:s,maxBuffer:10485760}),n=[],r=null;for(let o of t.split(`
819
+ `)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=hf&&n.push(r),r=new Set):i&&r&&Bv(i)&&r.add(i)}return r&&r.size>0&&r.size<=hf&&n.push(r),n}catch{return[]}}function Bv(s){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(s)&&!s.includes("node_modules/")}async function Vv(s,e=100){let t=await Wv(s,e),n=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Jv(a[c],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<ff||m<ff)continue;let p=d+m-a,g=p>0?a/p:0;g<zv||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function Jv(s,e){return s<e?`${s}\0${e}`:`${e}\0${s}`}function Kv(s,e){q.setDoc(s,qv,e)}async function yf(s,e,t=100){let n=await Vv(s,t);return Kv(e,n),n}var Gv,zv,ff,hf,qv,wf=y(()=>{"use strict";ye();Gv=Hv(Uv),zv=.1,ff=2,hf=30;l(Wv,"parseGitLog");l(Bv,"isSourceFile");l(Vv,"buildMatrix");l(Jv,"pairKey");qv="cochange-index";l(Kv,"saveMatrix");l(yf,"indexCoChanges")});function $t(s){return`<!-- source: ${s.file}, ${s.type} -->`}function cs(){let s={file:"unknown",type:"detected"};return{name:{...s},version:{...s},ecosystem:{...s},languages:{...s},frameworks:{...s},commands:{...s},projectType:{...s},git:{file:"git",type:"detected"}}}var au=y(()=>{"use strict";l($t,"cite");l(cs,"defaultSources")});function oo(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.name}**: ${n.description}${n.location?` (${n.location})`:""}`).join(`
820
+ `)}function io(s,e){return(e?s.slice(0,e):s).map(n=>`- **${n.issue}** in \`${n.file}\` \u2014 ${n.suggestion}`).join(`
821
+ `)}function kf(s){let e=[];return s.packageManager&&e.push(`- Package Manager: \`${s.packageManager}\``),s.sourceDir&&e.push(`- Source: \`${s.sourceDir}/\``),s.testDir&&e.push(`- Tests: \`${s.testDir}/\``),e.length>0?`
822
+ ### Project Structure
823
+
824
+ ${e.join(`
825
+ `)}
826
+ `:""}function Yv(s){let e=[];return s.patterns?.length>0&&e.push(`
827
+ ### Code Patterns (Follow These)
828
+
829
+ ${oo(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
830
+ ### Anti-Patterns (Avoid These)
831
+
832
+ ${io(s.antiPatterns)}`),e.push(kf(s)),e.join(`
833
+ `)}function Xv(s,e){let t=s.sources||cs();return`# ${s.name} - Project Rules
834
+ <!-- projectId: ${s.projectId} -->
814
835
  <!-- Generated: ${new Date().toISOString()} -->
815
- <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
836
+ <!-- Ecosystem: ${s.ecosystem} | Type: ${s.projectType} -->
816
837
 
817
- ## THIS PROJECT (${r.ecosystem})
838
+ ## THIS PROJECT (${s.ecosystem})
818
839
 
819
840
  ${$t(t.ecosystem)}
820
- **Type:** ${r.projectType}
821
- **Path:** ${r.repoPath}
841
+ **Type:** ${s.projectType}
842
+ **Path:** ${s.repoPath}
822
843
 
823
844
  ### Commands (USE THESE, NOT OTHERS)
824
845
 
825
846
  ${$t(t.commands)}
826
847
  | Action | Command |
827
848
  |--------|---------|
828
- | Install dependencies | \`${r.commands.install}\` |
829
- | Run dev server | \`${r.commands.dev}\` |
830
- | Run tests | \`${r.commands.test}\` |
831
- | Build | \`${r.commands.build}\` |
832
- | Lint | \`${r.commands.lint}\` |
833
- | Format | \`${r.commands.format}\` |
849
+ | Install dependencies | \`${s.commands.install}\` |
850
+ | Run dev server | \`${s.commands.dev}\` |
851
+ | Run tests | \`${s.commands.test}\` |
852
+ | Build | \`${s.commands.build}\` |
853
+ | Lint | \`${s.commands.lint}\` |
854
+ | Format | \`${s.commands.format}\` |
834
855
 
835
856
  ### Code Conventions
836
857
 
837
858
  ${$t(t.languages)}
838
- - **Languages**: ${r.languages.join(", ")||"Not detected"}
859
+ - **Languages**: ${s.languages.join(", ")||"Not detected"}
839
860
  ${$t(t.frameworks)}
840
- - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
841
-
861
+ - **Frameworks**: ${s.frameworks.join(", ")||"Not detected"}
862
+ ${s.analysis?Yv(s.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
842
863
  ---
843
864
 
844
865
  ## PRJCT RULES
845
866
 
846
867
  ### Path Resolution
847
- **ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\`
868
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${s.projectId}/\`
848
869
  - NEVER write to \`.prjct/\`
849
870
  - NEVER write to \`./\` for prjct data
850
871
 
@@ -867,45 +888,46 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
867
888
  ${$t(t.name)}
868
889
  | Field | Value |
869
890
  |-------|-------|
870
- | Name | ${r.name} |
871
- | Version | ${r.version} |
872
- | Ecosystem | ${r.ecosystem} |
873
- | Branch | ${r.branch} |
874
- | Files | ~${r.fileCount} |
875
- | Commits | ${r.commits} |
891
+ | Name | ${s.name} |
892
+ | Version | ${s.version} |
893
+ | Ecosystem | ${s.ecosystem} |
894
+ | Branch | ${s.branch} |
895
+ | Files | ~${s.fileCount} |
896
+ | Commits | ${s.commits} |
876
897
 
877
898
  ---
878
899
 
879
900
  ## AGENTS
880
901
 
881
- Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
882
-
883
- **Workflow**: ${r.agents.workflow.join(", ")}
884
- **Domain**: ${r.agents.domain.join(", ")||"none"}
885
- `}function zx(r,e){let t=r.sources||as(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push($t(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
886
- `)}function Wx(r,e){let t=r.sources||as(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
887
- `)}function Bx(r,e){let t=r.sources||as(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push($t(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
888
- `)}function Vx(r,e){let n={systemMessage:[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
889
- `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function mf(r){return{claude:Gx,cursor:zx,copilot:Wx,windsurf:Bx,continue:Vx}[r]||null}var eu=y(()=>{"use strict";Zl();l(Gx,"formatForClaude");l(zx,"formatForCursor");l(Wx,"formatForCopilot");l(Bx,"formatForWindsurf");l(Vx,"formatForContinue");l(mf,"getFormatter")});import{exec as Jx}from"node:child_process";import qx from"node:os";import oo from"node:path";import{promisify as Kx}from"node:util";function gf(r){return ea[r]||null}async function tu(r){try{return await Yx(`which ${r}`),!0}catch{return!1}}async function ta(r=process.cwd()){let e=[];return await tu("claude")&&e.push("claude"),(await tu("cursor")||await P(oo.join(r,".cursor")))&&e.push("cursor"),await P(oo.join(r,".github"))&&e.push("copilot"),(await tu("windsurf")||await P(oo.join(r,".windsurf")))&&e.push("windsurf"),(await P(oo.join(r,".continue"))||await P(oo.join(qx.homedir(),".continue")))&&e.push("continue"),e}async function ff(r,e=process.cwd()){if(r==="auto"){let t=await ta(e);return t.length>0?t:["claude"]}return r==="all"?Xx:r.filter(t=>ea[t])}var Yx,ea,io,Xx,nu=y(()=>{"use strict";xe();Yx=Kx(Jx),ea={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"}},io=["claude"],Xx=Object.keys(ea);l(gf,"getAIToolConfig");l(tu,"commandExists");l(ta,"detectInstalledTools");l(ff,"resolveToolIds")});import su from"node:fs/promises";import ru from"node:path";async function hf(r,e,t,n=io){let s=[];for(let o of n){let i=gf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Qx(r,i,e,t);s.push(a)}return s}async function Qx(r,e,t,n){let s=mf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=ru.join(n,e.outputFile):i=ru.join(t,"context",e.outputFile),await su.mkdir(ru.dirname(i),{recursive:!0});try{let a=await su.readFile(i,"utf-8"),c=Nc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=_c(o,a)}catch{}return await su.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var yf=y(()=>{"use strict";_();Lc();eu();nu();l(hf,"generateAIToolContexts");l(Qx,"generateForTool")});var wf=y(()=>{"use strict";eu();yf();nu()});import ou from"node:fs/promises";import iu from"node:path";var au,cu,kf,Sf=y(()=>{"use strict";_();au=".prjct-state.md",cu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=iu.join(e,au),s=this.toMarkdown(t);await ou.writeFile(n,s,"utf-8")}async remove(e){let t=iu.join(e,au);try{await ou.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=iu.join(e,au);try{return await ou.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
890
- `)}},kf=new cu});import lu from"node:fs/promises";import Zx from"node:os";import bf from"node:path";function uu(){return bf.join(Zx.homedir(),".prjct-cli","skills",eP)}function tP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ao(){try{let r=await lu.readFile(uu(),"utf-8");return JSON.parse(r)}catch{return tP()}}async function du(r){let e=uu();await lu.mkdir(bf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await lu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function nP(r){let e=await ao();e.skills[r.name]=r,await du(e)}async function sP(r){let e=await ao();return r in e.skills?(delete e.skills[r],await du(e),!0):!1}async function rP(r){return(await ao()).skills[r]||null}async function oP(){return(await ao()).skills}function iP(){return uu()}var eP,co,Cf=y(()=>{"use strict";eP=".skill-lock.json";l(uu,"getLockFilePath");l(tP,"createEmptyLockFile");l(ao,"read");l(du,"write");l(nP,"addEntry");l(sP,"removeEntry");l(rP,"getEntry");l(oP,"getAll");l(iP,"getPath");co={read:ao,write:du,addEntry:nP,removeEntry:sP,getEntry:rP,getAll:oP,getPath:iP}});import{exec as aP}from"node:child_process";import gn from"node:fs/promises";import mu from"node:os";import ot from"node:path";import{promisify as cP}from"node:util";import{glob as vf}from"glob";function Pf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ot.join(mu.homedir(),r.slice(1)):ot.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Tf(r){let e=[];try{let s=ot.join(r,"SKILL.md");await gn.access(s);let o=ot.basename(r);e.push({name:o,filePath:s})}catch{}let t=await vf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await vf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function lP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
891
- ${s.join(`
892
- `)}`;return r.replace(o,`---
902
+ Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
903
+
904
+ **Workflow**: ${s.agents.workflow.join(", ")}
905
+ **Domain**: ${s.agents.domain.join(", ")||"none"}
906
+ `}function Qv(s,e){let t=s.sources||cs(),n=[];if(n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`),n.push(""),n.push($t(t.languages)),n.push("## Tech Stack"),s.languages.length>0&&n.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- Frameworks: ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${s.commands.install}\``),n.push(`- Dev: \`${s.commands.dev}\``),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),s.analysis){s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)),n.push(""));let r=kf(s.analysis);r&&(n.push(r.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
907
+ `)}function Zv(s,e){let t=s.sources||cs(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${s.name}, a ${s.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${s.projectType}`),n.push(`- Stack: ${s.frameworks.join(", ")||s.ecosystem}`),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns,5)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(io(s.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.join(`
908
+ `)}function ex(s,e){let t=s.sources||cs(),n=[];return n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${s.name}`),n.push(""),n.push(`${s.projectType} project using ${s.ecosystem}.`),n.push(""),n.push($t(t.languages)),n.push("## Stack"),n.push(`- ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(s.commands.install),n.push("# Dev"),n.push(s.commands.dev),n.push("# Test"),n.push(s.commands.test),n.push("# Build"),n.push(s.commands.build),n.push("```"),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
909
+ `)}function tx(s,e){let t=[`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`,"",`Stack: ${s.languages.join(", ")}${s.frameworks.length>0?` with ${s.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${s.commands.install}`,`- Dev: ${s.commands.dev}`,`- Test: ${s.commands.test}`,`- Build: ${s.commands.build}`];if(s.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of s.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(s.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of s.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}s.analysis||t.push("","Run `p. sync` to populate project intelligence.");let r={systemMessage:t.join(`
910
+ `),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${s.commands.test}`}]};return JSON.stringify(r,null,2)}function nx(s,e){let t=[];return t.push(`# ${s.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),s.languages.length>0&&t.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&t.push(`- Frameworks: ${s.frameworks.join(", ")}`),s.analysis?.packageManager&&t.push(`- Package Manager: ${s.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${s.commands.install}\` |`),t.push(`| Dev | \`${s.commands.dev}\` |`),t.push(`| Test | \`${s.commands.test}\` |`),t.push(`| Build | \`${s.commands.build}\` |`),t.push(""),(s.analysis?.sourceDir||s.analysis?.testDir)&&(t.push("## Project Structure"),s.analysis.sourceDir&&t.push(`- Source: \`${s.analysis.sourceDir}/\``),s.analysis.testDir&&t.push(`- Tests: \`${s.analysis.testDir}/\``),t.push("")),s.analysis?(s.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(oo(s.analysis.patterns)),t.push("")),s.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(io(s.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
911
+ `)}function Sf(s){return{claude:Xv,cursor:Qv,copilot:Zv,windsurf:ex,continue:tx,codex:nx}[s]||null}var cu=y(()=>{"use strict";au();l(oo,"formatPatterns");l(io,"formatAntiPatterns");l(kf,"formatStructure");l(Yv,"formatAnalysisForClaude");l(Xv,"formatForClaude");l(Qv,"formatForCursor");l(Zv,"formatForCopilot");l(ex,"formatForWindsurf");l(tx,"formatForContinue");l(nx,"formatForCodex");l(Sf,"getFormatter")});import{exec as sx}from"node:child_process";import rx from"node:os";import Gs from"node:path";import{promisify as ox}from"node:util";function bf(s){return oa[s]||null}async function ra(s){try{return await ix(`which ${s}`),!0}catch{return!1}}async function ia(s=process.cwd()){let e=[];return await ra("claude")&&e.push("claude"),(await ra("cursor")||await x(Gs.join(s,".cursor")))&&e.push("cursor"),await x(Gs.join(s,".github"))&&e.push("copilot"),(await ra("windsurf")||await x(Gs.join(s,".windsurf")))&&e.push("windsurf"),(await x(Gs.join(s,".continue"))||await x(Gs.join(rx.homedir(),".continue")))&&e.push("continue"),(await ra("codex")||await x(Gs.join(s,".agents")))&&e.push("codex"),e}async function Cf(s,e=process.cwd()){if(s==="auto"){let t=await ia(e);return t.length>0?t:["claude"]}return s==="all"?ax:s.filter(t=>oa[t])}var ix,oa,ao,ax,lu=y(()=>{"use strict";ve();ix=ox(sx),oa={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},ao=["claude"],ax=Object.keys(oa);l(bf,"getAIToolConfig");l(ra,"commandExists");l(ia,"detectInstalledTools");l(Cf,"resolveToolIds")});import uu from"node:fs/promises";import du from"node:path";async function Pf(s,e,t,n=ao){let r=[];for(let o of n){let i=bf(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await cx(s,i,e,t);r.push(a)}return r}async function cx(s,e,t,n){let r=Sf(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(s,e),i;e.outputPath==="repo"?i=du.join(n,e.outputFile):i=du.join(t,"context",e.outputFile),await uu.mkdir(du.dirname(i),{recursive:!0});try{let a=await uu.readFile(i,"utf-8"),c=Vc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Bc(o,a)}catch{}return await uu.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var vf=y(()=>{"use strict";N();Jc();cu();lu();l(Pf,"generateAIToolContexts");l(cx,"generateForTool")});var xf=y(()=>{"use strict";cu();vf();lu()});import co from"node:fs/promises";import lo from"node:path";var pu,Tf,mu,Ef,If=y(()=>{"use strict";N();pu=".prjct/.prjct-state.md",Tf=".prjct-state.md",mu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=lo.join(e,pu);await co.mkdir(lo.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await co.writeFile(n,r,"utf-8");try{let o=lo.join(e,Tf);await co.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[pu,Tf])try{await co.unlink(lo.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=lo.join(e,pu);try{return await co.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
912
+ `)}},Ef=new mu});import gu from"node:fs/promises";import lx from"node:os";import Af from"node:path";function fu(){return Af.join(lx.homedir(),".prjct-cli","skills",ux)}function dx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function uo(){try{let s=await gu.readFile(fu(),"utf-8");return JSON.parse(s)}catch{return dx()}}async function hu(s){let e=fu();await gu.mkdir(Af.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await gu.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function px(s){let e=await uo();e.skills[s.name]=s,await hu(e)}async function mx(s){let e=await uo();return s in e.skills?(delete e.skills[s],await hu(e),!0):!1}async function gx(s){return(await uo()).skills[s]||null}async function fx(){return(await uo()).skills}function hx(){return fu()}var ux,po,jf=y(()=>{"use strict";ux=".skill-lock.json";l(fu,"getLockFilePath");l(dx,"createEmptyLockFile");l(uo,"read");l(hu,"write");l(px,"addEntry");l(mx,"removeEntry");l(gx,"getEntry");l(fx,"getAll");l(hx,"getPath");po={read:uo,write:hu,addEntry:px,removeEntry:mx,getEntry:gx,getAll:fx,getPath:hx}});import{exec as yx}from"node:child_process";import gn from"node:fs/promises";import wu from"node:os";import it from"node:path";import{promisify as wx}from"node:util";import{glob as Df}from"glob";function $f(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?it.join(wu.homedir(),s.slice(1)):it.resolve(s);return{type:"local",localPath:n,url:n}}let e=s.indexOf("@");if(e>0){let n=s.slice(0,e),r=s.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=s.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${s}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Mf(s){let e=[];try{let r=it.join(s,"SKILL.md");await gn.access(r);let o=it.basename(s);e.push({name:o,filePath:r})}catch{}let t=await Df("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await Df("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function kx(s,e,t){let n=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=s.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
913
+ ${r.join(`
914
+ `)}`;return s.replace(o,`---
893
915
  ${c}
894
916
  ---`)}return`---
895
- ${s.join(`
917
+ ${r.join(`
896
918
  `)}
897
919
  ---
898
920
 
899
- ${r}`}function gu(){return ot.join(mu.homedir(),".claude","skills")}async function pu(r,e,t,n){let s=gu(),o=ot.join(s,e),i=ot.join(o,"SKILL.md"),a=await gn.readFile(r,"utf-8"),c=lP(a,t,n);return await gn.mkdir(o,{recursive:!0}),await gn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function uP(r){let e={installed:[],skipped:[],errors:[]};if(!_s.isAvailable("git")){let n=_s.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=ot.join(mu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await xf(`git clone --depth 1 ${n} ${t}`,{timeout:Is("GIT_CLONE")});let s;try{let{stdout:a}=await xf("git rev-parse HEAD",{cwd:t,timeout:Is("TOOL_CHECK")});s=a.trim()}catch{}let o=await Tf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${r.owner}/${r.repo}`),e;let i=r.skillName?o.filter(a=>a.name===r.skillName):o;if(r.skillName&&i.length===0)return e.errors.push(`Skill "${r.skillName}" not found in ${r.owner}/${r.repo}`),e;for(let a of i)try{let c=await pu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await co.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await gn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function dP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await gn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await gn.stat(t)).isFile()){let s=ot.basename(ot.dirname(t));try{let o=await pu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await co.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Tf(t);if(s.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of s)try{let i=await pu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await co.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function pP(r){let e=gu(),t=ot.join(e,r);try{await gn.rm(t,{recursive:!0,force:!0})}catch{}let n=ot.join(e,`${r}.md`);try{await gn.rm(n,{force:!0})}catch{}return co.removeEntry(r)}async function mP(r){let e=Pf(r);switch(e.type){case"github":return uP(e);case"local":return dP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var xf,Ef,If=y(()=>{"use strict";_();un();Si();Cf();xf=cP(aP);l(Pf,"parseSource");l(Tf,"discoverSkills");l(lP,"injectSourceMetadata");l(gu,"getInstallDir");l(pu,"installSkillFile");l(uP,"installFromGitHub");l(dP,"installFromLocal");l(pP,"remove");l(mP,"install");Ef={install:mP,remove:pP,parseSource:Pf,getInstallDir:gu}});import Mt from"node:fs/promises";import gP from"node:os";import Ct from"node:path";async function Af(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Mt.readdir(o);for(let u of c)u.endsWith(".md")&&await Mt.unlink(Ct.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:se(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>fP(c,o)));for(let c of i)s.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>hP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function jf(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Mt.readdir(e),s=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=s.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function Df(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ye(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Mt.readFile(a,"utf-8")}catch{n=n.replace(s[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(s[0],i.trim())}return n}async function fP(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Mt.readFile(n,"utf-8"),t=await Df(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:se(n)}),t=wP(r)}await Mt.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function hP(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Mt.readFile(i,"utf-8"),o=await Df(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:se(i)}),o=kP(r,t,n)}o=yP(o,r,s),await Mt.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function yP(r,e,t){if(!t)return r;let{patternsDiscovered:n,knownGotchas:s,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||s.length>0||i.length>0))return r;let c=[`
921
+ ${s}`}function ku(){return it.join(wu.homedir(),".claude","skills")}async function yu(s,e,t,n){let r=ku(),o=it.join(r,e),i=it.join(o,"SKILL.md"),a=await gn.readFile(s,"utf-8"),c=kx(a,t,n);return await gn.mkdir(o,{recursive:!0}),await gn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function Sx(s){let e={installed:[],skipped:[],errors:[]};if(!_s.isAvailable("git")){let n=_s.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=it.join(wu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${s.owner}/${s.repo}.git`;await Rf(`git clone --depth 1 ${n} ${t}`,{timeout:Is("GIT_CLONE")});let r;try{let{stdout:a}=await Rf("git rev-parse HEAD",{cwd:t,timeout:Is("TOOL_CHECK")});r=a.trim()}catch{}let o=await Mf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${s.owner}/${s.repo}`),e;let i=s.skillName?o.filter(a=>a.name===s.skillName):o;if(s.skillName&&i.length===0)return e.errors.push(`Skill "${s.skillName}" not found in ${s.owner}/${s.repo}`),e;for(let a of i)try{let c=await yu(a.filePath,a.name,s,r),u={name:a.name,source:{type:"github",url:`${s.owner}/${s.repo}`,sha:r},installedAt:new Date().toISOString(),filePath:c.filePath};await po.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await gn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function bx(s){let e={installed:[],skipped:[],errors:[]},t=s.localPath;try{await gn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await gn.stat(t)).isFile()){let r=it.basename(it.dirname(t));try{let o=await yu(t,r,s),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await po.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let r=await Mf(t);if(r.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of r)try{let i=await yu(o.filePath,o.name,s),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await po.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function Cx(s){let e=ku(),t=it.join(e,s);try{await gn.rm(t,{recursive:!0,force:!0})}catch{}let n=it.join(e,`${s}.md`);try{await gn.rm(n,{force:!0})}catch{}return po.removeEntry(s)}async function Px(s){let e=$f(s);switch(e.type){case"github":return Sx(e);case"local":return bx(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var Rf,Of,Ff=y(()=>{"use strict";N();un();vi();jf();Rf=wx(yx);l($f,"parseSource");l(Mf,"discoverSkills");l(kx,"injectSourceMetadata");l(ku,"getInstallDir");l(yu,"installSkillFile");l(Sx,"installFromGitHub");l(bx,"installFromLocal");l(Cx,"remove");l(Px,"install");Of={install:Px,remove:Cx,parseSource:$f,getInstallDir:ku}});import Mt from"node:fs/promises";import vx from"node:os";import Pt from"node:path";async function _f(s,e,t,n){let r=[],o=Pt.join(s,"agents");try{let c=await Mt.readdir(o);for(let u of c)u.endsWith(".md")&&await Mt.unlink(Pt.join(o,u))}catch(c){U.debug("Failed to purge old agents",{path:o,error:re(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>xx(c,o)));for(let c of i)r.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>Tx(c.name,o,t,e,n)));for(let c of a)r.push({name:c.name,type:"domain",skill:c.skill});return r}async function Nf(s){let e=Pt.join(s,"agents"),t=[];try{let n=await Mt.readdir(e),r=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=r.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function Lf(s){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...s.matchAll(e)];if(t.length===0)return s;let n=s;for(let r of t){let o=r[1],i=fe(`subagents/${o}.md`);if(!i){let a=Pt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Mt.readFile(a,"utf-8")}catch{n=n.replace(r[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(r[0],i.trim())}return n}async function xx(s,e){let t="";try{let n=Pt.join(__dirname,"..","..","templates","subagents","workflow",`${s}.md`);t=await Mt.readFile(n,"utf-8"),t=await Lf(t)}catch(n){U.debug("Workflow agent template not found, generating minimal",{name:s,error:re(n)}),t=Ix(s)}await Mt.writeFile(Pt.join(e,`${s}.md`),t,"utf-8")}async function Tx(s,e,t,n,r){let o="";try{let i=Pt.join(__dirname,"..","..","templates","subagents","domain",`${s}.md`);o=await Mt.readFile(i,"utf-8"),o=await Lf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){U.debug("Domain agent template not found, generating minimal",{name:s,error:re(i)}),o=Ax(s,t,n)}o=Ex(o,s,r),await Mt.writeFile(Pt.join(e,`${s}.md`),o,"utf-8")}function Ex(s,e,t){if(!t)return s;let{patternsDiscovered:n,knownGotchas:r,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||r.length>0||i.length>0))return s;let c=[`
900
922
  ## Recent Learnings (from completed tasks)
901
- `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
902
- `)}function wP(r){return`---
903
- name: ${r}
904
- description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[r]||"Workflow agent"}
923
+ `];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(r.length>0){c.push("### Known Gotchas");for(let u of r)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return s+c.join(`
924
+ `)}function Ix(s){return`---
925
+ name: ${s}
926
+ description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[s]||"Workflow agent"}
905
927
  tools: Read, Write, Glob
906
928
  ---
907
929
 
908
- # ${r.toUpperCase()}
930
+ # ${s.toUpperCase()}
909
931
 
910
932
  Workflow agent for prjct operations.
911
933
 
@@ -915,16 +937,16 @@ When invoked:
915
937
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
916
938
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
917
939
  3. Execute requested operation
918
- `}function kP(r,e,t){return`---
919
- name: ${r}
920
- description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
940
+ `}function Ax(s,e,t){return`---
941
+ name: ${s}
942
+ description: ${s.charAt(0).toUpperCase()+s.slice(1)} specialist for ${e.name}
921
943
  tools: Read, Write, Glob, Grep
922
944
  skills: []
923
945
  ---
924
946
 
925
- # ${r.toUpperCase()} AGENT
947
+ # ${s.toUpperCase()} AGENT
926
948
 
927
- Domain specialist for ${r} tasks.
949
+ Domain specialist for ${s} tasks.
928
950
 
929
951
  ## Project Context
930
952
 
@@ -934,86 +956,86 @@ Domain specialist for ${r} tasks.
934
956
 
935
957
  ## Your Role
936
958
 
937
- You are the ${r} expert for this project. Apply best practices for the detected stack.
938
- `}function Rf(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Mt.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:se(o)})}),n}async function $f(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Mt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(gP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Mt.access(m),g=!0}catch{try{await Mt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Ef.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:se(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:se(t)})}return e}var Mf=y(()=>{"use strict";En();ln();le();Un();If();l(Af,"generateAgents");l(jf,"loadExistingAgents");l(Df,"resolveTemplateIncludes");l(fP,"generateWorkflowAgent");l(hP,"generateDomainAgent");l(yP,"injectFeedbackSection");l(wP,"generateMinimalWorkflowAgent");l(kP,"generateMinimalDomainAgent");l(Rf,"configureSkills");l($f,"autoInstallSkills")});import Of from"node:fs/promises";import Ff from"node:path";var na,_f=y(()=>{"use strict";na=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Ff.join(this.projectPath,"package.json"),t=await Of.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Of.access(Ff.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as SP}from"node:child_process";import Nf from"node:fs/promises";import fu from"node:path";import{promisify as bP}from"node:util";async function Lf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await cs("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await cs("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await cs("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await cs("git status --porcelain",{cwd:r}),i=o.trim().split(`
939
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await cs('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
940
- `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await cs('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:se(t)})}return e}async function rn(r,e){try{return await Nf.access(fu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:se(t)}),!1}}async function Hf(r){let e={fileCount:0,version:"0.0.0",name:fu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await cs('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:se(t)}),e.fileCount=0}try{let t=fu.join(r,"package.json"),n=JSON.parse(await Nf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:se(t)})}return await rn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(r,"requirements.txt")||await rn(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Uf(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rn(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rn(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rn(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rn(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Gf(r,e){let t=as(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function zf(r){return new na(r).detect()}var cs,Wf=y(()=>{"use strict";ln();Zl();Un();_f();cs=bP(SP);l(Lf,"analyzeGit");l(rn,"fileExists");l(Hf,"gatherStats");l(Uf,"detectCommands");l(Gf,"buildSources");l(zf,"detectStack")});import{exec as CP}from"node:child_process";import hu from"node:fs/promises";import sa from"node:path";import{promisify as vP}from"node:util";var xP,yu,wu,Bf,Vf=y(()=>{"use strict";Bt();_();xP=vP(CP),yu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=sa.join(r,s);try{await hu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=sa.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=sa.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await hu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await hu.readFile(sa.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},wu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[yu.contextFilesExist(t),yu.jsonFilesValid(t),yu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await xP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Bf=new wu});import ra from"node:fs/promises";import oa from"node:path";var ia,ls,ku=y(()=>{"use strict";Ms();Xg();rf();cf();pf();Kl();ln();In();Ve();Se();Ci();vn();he();jr();Wr();xi();Dr();Rr();Mr();wf();le();Un();dl();pl();Sf();Xc();Mf();Wf();Vf();ia=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await ta(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ta(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await ff("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:se(N)})}let[i,a,c,u]=await Promise.all([Lf(this.projectPath),Hf(this.projectPath),Uf(this.projectPath),zf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&af(this.projectId))try{let{diff:N,currentHashes:it}=await Ql(this.projectPath,this.projectId),_n=N.added.length+N.modified.length+N.deleted.length;if(_n===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let fr=nf(N,this.projectId);f=sf(fr.allAffected);let vy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=fr.allAffected.some(Nn=>{let xy=Nn.substring(Nn.lastIndexOf("."));return vy.has(xy)}),g=fr.directlyChanged.some(Nn=>Nn==="package.json"||Nn==="tsconfig.json"||Nn.includes("Dockerfile")||Nn.includes("docker-compose")),m={isIncremental:!0,filesChanged:_n,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Xl(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:se(N)})}else try{let{currentHashes:N}=await Ql(this.projectPath,this.projectId);Xl(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:se(N)})}if(p)try{await Promise.all([Yg(this.projectPath,this.projectId),tf(this.projectPath,this.projectId),df(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:se(N)})}let k;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(k=N)}catch{}let b=g?await Af(this.globalPath,u,a,k):await jf(this.globalPath),D=Rf(b,this.projectId,this.globalPath),x=g?await $f(b):[],O=Gf(a,c),F=[],J={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},ne=await hf(J,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let S=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,S);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Z;try{let N=await R.readConfig(this.projectPath);Z=await Bf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:se(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:ne.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:Z,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:se(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>ra.mkdir(oa.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await kf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:se(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=oa.join(this.globalPath,m),g=await ra.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:se(p)})}for(let m of n)try{let p=oa.join(this.globalPath,"agents",`${m.name}.md`),g=await ra.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:se(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:se(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await It.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:se(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:se(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Jn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Rm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:se(e)})}}async getCliVersion(){try{let e=oa.join(__dirname,"..","..","package.json");return JSON.parse(await ra.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:se(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},ls=new ia});var Mn=y(()=>{"use strict";nm();cm();lm();mm();fm();qc();ym();Xc();wm();km();Vg();Jg();ku()});import fn from"chalk";function Jf(r){return Math.ceil(r.length/PP)}function qf(r){let e=r.split(`
941
- `),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
942
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Su(r){return r.includes("<!-- prjct:preserve")}function Kf(r,e){let t=qf(r),n=qf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Jf(r),tokensAfter:Jf(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)Su(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
943
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Su(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
944
- `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
945
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!Su(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
946
- `).length}),s.hasChanges=!0)}return s}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?fn.green:p=>p,o=t?fn.red:p=>p,i=t?fn.yellow:p=>p,a=t?fn.dim:p=>p,c=t?fn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
947
- `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(s(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
948
- `)}function Xf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?fn.green:c=>c,o=t?fn.red:c=>c,i=t?fn.cyan:c=>c,a=t?fn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
949
- `))n.push(s(`+ ${u}`));n.push("")}for(let c of r.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
959
+ You are the ${s} expert for this project. Apply best practices for the detected stack.
960
+ `}function Uf(s,e,t){let n=[];for(let o of s)o.skill&&n.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Mt.writeFile(Pt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:re(o)})}),n}async function Hf(s){let e=[];try{let t=Pt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Mt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of s){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Pt.join(vx.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Pt.join(a,d,"SKILL.md"),p=Pt.join(a,`${d}.md`),g=!1;try{await Mt.access(m),g=!0}catch{try{await Mt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Of.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),U.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),U.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),U.debug(`Skill install error for ${d}`,{error:re(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:re(t)})}return e}var Gf=y(()=>{"use strict";In();ln();le();Gn();Ff();l(_f,"generateAgents");l(Nf,"loadExistingAgents");l(Lf,"resolveTemplateIncludes");l(xx,"generateWorkflowAgent");l(Tx,"generateDomainAgent");l(Ex,"injectFeedbackSection");l(Ix,"generateMinimalWorkflowAgent");l(Ax,"generateMinimalDomainAgent");l(Uf,"configureSkills");l(Hf,"autoInstallSkills")});import zf from"node:fs/promises";import Wf from"node:path";var aa,Bf=y(()=>{"use strict";aa=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Wf.join(this.projectPath,"package.json"),t=await zf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await zf.access(Wf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as jx}from"node:child_process";import Vf from"node:fs/promises";import Su from"node:path";import{promisify as Dx}from"node:util";async function Jf(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ls("git branch --show-current",{cwd:s});e.branch=t.trim()||"main";let{stdout:n}=await ls("git rev-list --count HEAD",{cwd:s});e.commits=parseInt(n.trim(),10)||0;let{stdout:r}=await ls("git shortlog -sn --all | wc -l",{cwd:s});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await ls("git status --porcelain",{cwd:s}),i=o.trim().split(`
961
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await ls('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:s});e.recentCommits=a.split(`
962
+ `).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ls('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function rn(s,e){try{return await Vf.access(Su.join(s,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:re(t)}),!1}}async function qf(s){let e={fileCount:0,version:"0.0.0",name:Su.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ls('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:s,error:re(t)}),e.fileCount=0}try{let t=Su.join(s,"package.json"),n=JSON.parse(await Vf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:s,error:re(t)})}return await rn(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(s,"requirements.txt")||await rn(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Kf(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rn(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rn(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rn(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rn(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Yf(s,e){let t=cs(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Xf(s){return new aa(s).detect()}var ls,Qf=y(()=>{"use strict";ln();au();Gn();Bf();ls=Dx(jx);l(Jf,"analyzeGit");l(rn,"fileExists");l(qf,"gatherStats");l(Kf,"detectCommands");l(Yf,"buildSources");l(Xf,"detectStack")});import{exec as Rx}from"node:child_process";import bu from"node:fs/promises";import ca from"node:path";import{promisify as $x}from"node:util";var Mx,Cu,Pu,Zf,eh=y(()=>{"use strict";Bt();N();Mx=$x(Rx),Cu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=ca.join(s,r);try{await bu.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=ca.basename(s);try{await L.read(n)}catch(r){P(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=ca.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await bu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bu.readFile(ca.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cu.contextFilesExist(t),Cu.jsonFilesValid(t),Cu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Mx(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Zf=new Pu});import la from"node:fs/promises";import ua from"node:path";var da,us,vu=y(()=>{"use strict";Ms();sf();df();gf();wf();su();ln();An();qe();Se();Ti();vn();ye();jr();Wr();Ii();Dr();Rr();Mr();xf();le();Gn();kl();Sl();If();ol();Gf();Qf();eh();da=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let o=(await ia(e)).filter(i=>!ao.includes(i));r=[...ao,...o]}else t.aiTools[0]==="auto"?(r=await ia(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Cf("all",e):r=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let _=await Ei(this.projectId);_>0&&U.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){U.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([Jf(this.projectPath),qf(this.projectPath),Kf(this.projectPath),Xf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&mf(this.projectId))try{let{diff:_,currentHashes:ms}=await iu(this.projectPath,this.projectId),ko=_.added.length+_.modified.length+_.deleted.length;if(ko===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let $a=lf(_,this.projectId);f=uf($a.allAffected);let Ry=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=$a.allAffected.some(Ln=>{let $y=Ln.substring(Ln.lastIndexOf("."));return Ry.has($y)}),g=$a.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:ko,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ou(this.projectId,ms)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await iu(this.projectPath,this.projectId);ou(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([nf(this.projectPath,this.projectId),cf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId)])}catch(_){U.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await _f(this.globalPath,u,a,k):await Nf(this.globalPath),D=Uf(b,this.projectId,this.globalPath),v=g?await Hf(b):[],$=Yf(a,c),F=[],H;try{let _=await bt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(H={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:$,analysis:H},S=await Pf(ee,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Ve;try{let _=await R.readConfig(this.projectPath);Ve=await Zf.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){U.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:v,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ve,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>la.mkdir(ua.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=M.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};M.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await L.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=C(),r.lastUpdated=C(),r.context={...r.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,r);try{await Ef.generate(this.projectPath,r)}catch(o){U.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){M.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=ua.join(this.globalPath,m),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ua.join(this.globalPath,"agents",`${m.name}.md`),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:re(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let r=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await bt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:r??void 0})}catch(r){U.debug("Failed to save draft analysis (non-critical)",{error:re(r)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,n=await wl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Nm.getFeatureOutcomes(this.projectId);r.length>0&&await wl.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ua.join(__dirname,"..","..","package.json");return JSON.parse(await la.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:re(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},us=new da});var On=y(()=>{"use strict";cm();gm();fm();km();bm();nl();Pm();ol();vm();xm();Qg();Zg();vu()});import fn from"chalk";function th(s){return Math.ceil(s.length/Ox)}function nh(s){let e=s.split(`
963
+ `),t=[],n=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=r-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:r,endLine:r}):n&&(n.content+=`
964
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xu(s){return s.includes("<!-- prjct:preserve")}function sh(s,e){let t=nh(s),n=nh(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:th(s),tokensAfter:th(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)xu(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
965
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(xu(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
966
+ `).length}),r.hasChanges=!0)):(r.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
967
+ `).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!xu(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
968
+ `).length}),r.hasChanges=!0)}return r}function rh(s,e={}){let{colorize:t=!0}=e,n=[],r=t?fn.green:p=>p,o=t?fn.red:p=>p,i=t?fn.yellow:p=>p,a=t?fn.dim:p=>p,c=t?fn.bold:p=>p;if(!s.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
969
+ `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),s.added.length>0)for(let p of s.added)n.push(r(`+ \u2502 + ${p.name} (new)`));if(s.modified.length>0)for(let p of s.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(s.removed.length>0)for(let p of s.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(s.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of s.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];s.added.length>0&&u.push(r(`+${s.added.length} added`)),s.modified.length>0&&u.push(i(`~${s.modified.length} modified`)),s.removed.length>0&&u.push(o(`-${s.removed.length} removed`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=s.tokenDelta>=0?"+":"",m=s.tokenDelta>=0?r:o;return n.push(`Tokens: ${s.tokensBefore.toLocaleString()} \u2192 ${s.tokensAfter.toLocaleString()} (${m(d+s.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
970
+ `)}function oh(s,e={}){let{colorize:t=!0}=e,n=[],r=t?fn.green:c=>c,o=t?fn.red:c=>c,i=t?fn.cyan:c=>c,a=t?fn.dim:c=>c;for(let c of s.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
971
+ `))n.push(r(`+ ${u}`));n.push("")}for(let c of s.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
950
972
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
951
973
  `).length>5&&n.push(a(` ... ${c.before.split(`
952
974
  `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
953
- `).slice(0,5))n.push(s(`+ ${u}`));c.after.split(`
975
+ `).slice(0,5))n.push(r(`+ ${u}`));c.after.split(`
954
976
  `).length>5&&n.push(a(` ... ${c.after.split(`
955
- `).length-5} more lines`))}n.push("")}for(let c of r.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
977
+ `).length-5} more lines`))}n.push("")}for(let c of s.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
956
978
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
957
979
  `).length>5&&n.push(a(` ... ${c.before.split(`
958
980
  `).length-5} more lines`))}n.push("")}return n.join(`
959
- `)}var PP,Qf=y(()=>{"use strict";PP=4;l(Jf,"estimateTokens");l(qf,"parseMarkdownSections");l(Su,"isPreservedSection");l(Kf,"generateSyncDiff");l(Yf,"formatDiffPreview");l(Xf,"formatFullDiff")});import TP from"node:path";async function bu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
960
- `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Zf(r){try{let e=await mt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];s=W.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function lo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Cu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function eh(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function th(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${lo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ri(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${Cu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${lo(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
961
- `)}function nh(r,e){let t=[];t.push(`# Repository Analysis
981
+ `)}var Ox,ih=y(()=>{"use strict";Ox=4;l(th,"estimateTokens");l(nh,"parseMarkdownSections");l(xu,"isPreservedSection");l(sh,"generateSyncDiff");l(rh,"formatDiffPreview");l(oh,"formatFullDiff")});import Fx from"node:path";async function Tu(s,e){let t=Date.now()-e,n=s.contextFiles.length+(s.aiTools?.filter(p=>p.success).length||0),r=s.agents.length,o=s.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${s.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=s.syncMetrics?.compressionRate?Math.round(s.syncMetrics.compressionRate*100):0,a=s.stats.frameworks.length>0?` (${s.stats.frameworks[0]})`:"",c=[`${s.stats.fileCount} files \u2192 ${n} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${s.stats.ecosystem}${a} | Branch: ${s.git.branch}`];h.box("Sync Summary",c.join(`
982
+ `));let u=[];s.contextFiles.length>0&&u.push(`${s.contextFiles.length} context files`);let d=s.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),r>0){let p=o>0?`${r} agents (${o} domain)`:`${r} agents`;u.push(p)}if(s.skills.length>0){let p=s.skills.length===1?"skill":"skills";u.push(`${s.skills.length} ${p}`)}let m=s.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),s.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),s.verification){let p=s.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ct("sync"),{success:!0,data:s,metrics:{elapsed:t,contextFilesCount:n,agentCount:r,fileCount:s.stats.fileCount}}}async function ah(s){try{let e=await mt.getRecentEvents(s,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(n.length>=2){let u=n.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];r=B.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:r,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function mo(s){return s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString()}function Eu(s){return s<1e3?`${Math.round(s)}ms`:`${(s/1e3).toFixed(1)}s`}function ch(s){if(s.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=s.map(r=>r.tokensSaved),n=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/n*(e.length-1)),e.length-1);return e[o]}).join("")}function lh(s,e,t,n,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),r){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${mo(s.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(s.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ci(s.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${s.syncCount} |`),i.push(`| Avg time | ${Eu(s.avgSyncDuration)} |`),i.push(""),s.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=s.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of s.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${mo(s.last30DaysTokens)}`),s.trend!==0){let a=s.trend>0?"+":"";i.push(`- Trend: ${a}${s.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
983
+ `)}function uh(s,e){let t=[];t.push(`# Repository Analysis
962
984
  `),t.push(`Generated: ${new Date().toLocaleString()}
963
- `);let n=TP.basename(e);if(t.push(`## Project: ${n}
985
+ `);let n=Fx.basename(e);if(t.push(`## Project: ${n}
964
986
  `),t.push(`## Stack Detected
965
- `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
966
- `),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}r.hasNextConfig&&t.push("- **Framework**: Next.js detected"),r.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),r.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}r.cargoToml&&(t.push(`### Rust
987
+ `),s.packageJson){let i=s.packageJson;if(t.push(`### JavaScript/TypeScript
988
+ `),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}s.hasNextConfig&&t.push("- **Framework**: Next.js detected"),s.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),s.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}s.cargoToml&&(t.push(`### Rust
967
989
  `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
968
- `)),r.goMod&&(t.push(`### Go
990
+ `)),s.goMod&&(t.push(`### Go
969
991
  `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
970
- `)),r.requirements&&(t.push(`### Python
992
+ `)),s.requirements&&(t.push(`### Python
971
993
  `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
972
- `));let s=r.directories;t.push(`## Structure
973
- `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${s?.slice(0,15).join(", ")||"none"}${(s?.length||0)>15?` (+${(s?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
974
- `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
975
- `),r.gitLog.split(`
994
+ `));let r=s.directories;t.push(`## Structure
995
+ `),t.push(`- **Total Files**: ${s.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),s.hasDockerfile&&t.push("- **Docker**: Detected"),s.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),s.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=s.gitStats;return t.push(`## Git Statistics
996
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),s.gitLog&&(t.push(`## Recent Activity
997
+ `),s.gitLog.split(`
976
998
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
977
999
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
978
1000
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
979
- `)}var sh=y(()=>{"use strict";In();oi();Mn();Ls();Gt();rt();l(bu,"showSyncResult");l(Zf,"getSessionActivity");l(lo,"formatTokens");l(Cu,"formatDuration");l(eh,"generateSparkline");l(th,"generateStatsMarkdown");l(nh,"generateAnalysisSummary")});var Bg={};fe(Bg,{AnalysisCommands:()=>us});import vu from"node:fs/promises";import rh from"node:path";import oh from"prompts";var us,Ki=y(()=>{"use strict";Ms();Bp();In();oi();Mn();Qf();Ci();he();Wr();_();Ns();Ls();Gt();sh();rt();us=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
980
- `),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=nh(s,t),i=await R.getProjectId(t),a=n.paths.analysis||I.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:W.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Be(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${I.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
1001
+ `)}var dh=y(()=>{"use strict";An();li();On();Ls();Gt();ot();l(Tu,"showSyncResult");l(ah,"getSessionActivity");l(mo,"formatTokens");l(Eu,"formatDuration");l(ch,"generateSparkline");l(lh,"generateStatsMarkdown");l(uh,"generateAnalysisSummary")});var Xg={};he(Xg,{AnalysisCommands:()=>ds});import Iu from"node:fs/promises";import ph from"node:path";import mh from"prompts";var ds,Zi=y(()=>{"use strict";Ms();Xp();An();li();On();ih();Ti();ye();Wr();N();Ns();Ls();Gt();dh();ot();ds=class extends be{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1002
+ `),Ye.init(t);let n=await ft.build(t,e),r={packageJson:await Ye.readPackageJson(),cargoToml:await Ye.readCargoToml(),goMod:await Ye.readGoMod(),requirements:await Ye.readRequirements(),directories:await Ye.listDirectories(),fileCount:await Ye.countFiles(),gitStats:await Ye.getGitStats(),gitLog:await Ye.getGitLog(20),hasDockerfile:await Ye.fileExists("Dockerfile"),hasDockerCompose:await Ye.fileExists("docker-compose.yml"),hasReadme:await Ye.fileExists("README.md"),hasTsconfig:await Ye.fileExists("tsconfig.json"),hasViteConfig:await Ye.fileExists("vite.config.ts")||await Ye.fileExists("vite.config.js"),hasNextConfig:await Ye.fileExists("next.config.js")||await Ye.fileExists("next.config.mjs")},o=uh(r,t),i=await R.getProjectId(t),a=n.paths.analysis||I.getFilePath(i,"analysis","repo-summary.md");await Xe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(Je(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${I.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
981
1003
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
982
- `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=I.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await I.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await ls.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(tn(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=rh.join(o,"context","CLAUDE.md"),c=null;try{c=await vu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await ls.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await vu.readFile(a,"utf-8")}catch{p=""}let g=Kf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(tn("No changes detected","Context is up to date.")),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await vu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?st("Changes",At(b),3):"No section changes.",jt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Yf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await oh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return k.action==="cancel"||!k.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):k.action==="diff"&&(console.log(`
983
- ${Xf(g)}`),!(await oh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),bu(m,i))}t.md||h.spin("Syncing project...");let d=await ls.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Pi("sync"),k=Ie(tn("Sync Complete",jt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tm("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return bu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await dn.getSummary(s),i=await dn.getDailyStats(s,30),a=await Zf(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await dn.read(s),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Cu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=eh(i);if(console.log(` ${p} ${lo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=th(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await It.getStatus(s);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=rh.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,jt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",At(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await It.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await It.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await It.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var aa,G,Gs=y(()=>{"use strict";Ve();Se();_();le();aa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,s)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},G=new aa});import EP from"node:path";var zs,xu=y(()=>{"use strict";Mn();Bt();_();Ns();rt();Gs();zs=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=EP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=W.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
1004
+ `),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:r}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=I.getGlobalProjectPath(r),i=Date.now();if(t.package){let m=await I.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await us.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(tn(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=ph.join(o,"context","CLAUDE.md"),c=null;try{c=await Iu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await us.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await Iu.readFile(a,"utf-8")}catch{p=""}let g=sh(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(tn("No changes detected","Context is up to date.")),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await Iu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let v of g.added)b.push(`Added: ${v.name} (${v.lineCount} lines)`);for(let v of g.modified)b.push(`Modified: ${v.name} (${v.lineCount} lines)`);for(let v of g.removed)b.push(`Removed: ${v.name} (${v.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?rt("Changes",At(b),3):"No section changes.",jt({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:b,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(rh(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await mh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return k.action==="cancel"||!k.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):k.action==="diff"&&(console.log(`
1005
+ ${oh(g)}`),!(await mh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Tu(m,i))}t.md||h.spin("Syncing project...");let d=await us.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Ai("sync"),k=Ie(tn("Sync Complete",jt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Rm("Uncommitted changes detected"):null,et(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Tu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await dn.getSummary(r),i=await dn.getDailyStats(r,30),a=await ah(r),c=await Te.getPatternsSummary(r);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=M.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await dn.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${mo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ci(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Eu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=ch(i);if(console.log(` ${p} ${mo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=lh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await bt.getStatus(r);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=ph.basename(e),d=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",p=[];c.hasSealed&&p.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&p.push(`Draft: ${c.draftCommit} (pending seal)`);let g=Ie(`## Status: ${u}`,jt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?rt("Analysis",At(p),3):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await bt.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await bt.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let r=w(n);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=M.getDoc(r,"project")?.repoPath||e}catch{}let i=await bt.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let r=w(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});var pa,z,zs=y(()=>{"use strict";qe();Se();N();le();pa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,n,r){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let n of this.categories.keys())t[n]=e.filter(r=>r.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),r=n.filter((a,c)=>n.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,n=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},z=new pa});import _x from"node:path";var Ws,Au=y(()=>{"use strict";On();Bt();N();Ns();ot();zs();Ws=class extends be{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=_x.basename(t),a=await L.getCurrentTask(o),c=await xe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Qe.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=M.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(v=>({...JSON.parse(v.data),timestamp:v.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
984
1006
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
985
1007
  `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
986
1008
  Activity: ${k}
987
- `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
1009
+ `),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Xe.get("Read")(m.paths.roadmap);if(console.log(`
988
1010
  \u{1F5FA}\uFE0F ROADMAP - ${i}
989
1011
  `),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
990
1012
  `);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let b=f.split(`
991
1013
  `)[0].trim();console.log(` ${k+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
992
- `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${W.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let b=k.priority?` [${k.priority}]`:"";return`${k.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let b=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,st("Current Focus",m,3),st(`Queue (${c.length})`,At(p,!0),3),st("Recent Ships",At(g),3),st("Ideas",`${d.length} pending`,3),Qe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
1014
+ `),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let b=k.priority?` [${k.priority}]`:"";return`${k.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let b=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,rt("Current Focus",m,3),rt(`Queue (${c.length})`,At(p,!0),3),rt("Recent Ships",At(g),3),rt("Ideas",`${d.length} pending`,3),et([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
993
1015
  \u{1F4CA} DASHBOARD - ${i}
994
1016
  `),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
995
1017
  ${g}`),console.log(`
996
- \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=W.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
1018
+ \u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=B.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
997
1019
  \u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
998
1020
  \u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
999
1021
  \u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
1000
1022
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1001
- `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:W.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1023
+ `)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1002
1024
  PRJCT COMMANDS
1003
- `),console.log("=".repeat(50));let i=G.getAllCategories(),a=G.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1025
+ `),console.log("=".repeat(50));let i=z.getAllCategories(),a=z.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let m=i.get(u);console.log(`
1004
1026
  ${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
1005
1027
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1006
- `),{success:!0,topic:"overview"}}let n=G.getByName(e);if(n){if(console.log(`
1028
+ `),{success:!0,topic:"overview"}}let n=z.getByName(e);if(n){if(console.log(`
1007
1029
  \u{1F4DA} HELP: /p:${n.name}
1008
1030
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1009
1031
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
1010
1032
  Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
1011
1033
  ${"\u2550".repeat(50)}
1012
- `),{success:!0,topic:e,command:n}}let s={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(s))if(o.includes(i))return console.log(`
1034
+ `),{success:!0,topic:e,command:n}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
1013
1035
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1014
1036
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1015
1037
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1016
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import IP from"node:fs/promises";import AP from"node:path";var ds,WG,Pu=y(()=>{"use strict";jl();Ve();Se();Bt();_();ds=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=I.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Li.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=AP.join(e,"analysis","repo-analysis.json"),n=await IP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},WG=new ds});async function ca(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function la(r){let e=await R.getProjectId(r);if(!e)return;let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function Tu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await ca(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=V.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;V.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Ye.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await la(e),await mt.log(e,"cleanup_performed",{items:s.length,timestamp:W.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Eu=y(()=>{"use strict";Mn();Bt();he();_();rt();l(ca,"cleanupMemory");l(la,"cleanupMemoryInternal");l(Tu,"cleanup")});import ih from"node:path";async function Iu(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=ih.join(I.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1038
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],r=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(r);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import Nx from"node:fs/promises";import Lx from"node:path";var ps,ez,ju=y(()=>{"use strict";Nl();qe();Se();Bt();N();ps=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),r=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=I.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await zi.execute(r,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=Lx.join(e,"analysis","repo-analysis.json"),n=await Nx.readFile(t,"utf-8"),r=JSON.parse(n);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return P(t),null}}},ez=new ps});async function ma(s){let e=await R.getProjectId(s),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let r=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r>500){let o=r-500;q.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}async function ga(s){let e=await R.getProjectId(s);if(!e)return;let n=q.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let r=n-500;q.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",r)}}async function Du(s={},e=process.cwd()){try{if(s.memory===!0||s.type==="memory"){h.spin("cleaning memory...");let a=await ma(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let r=[],i=q.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;q.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),r.push(`Memory: ${a} old entries removed`)}else r.push("Memory: No cleanup needed");try{let a=await Qe.cleanup(n);a.removed>0?r.push(`Ideas: ${a.removed} old archived ideas removed`):r.push("Ideas: No cleanup needed")}catch(a){r.push(`Ideas: Error - ${w(a)}`)}try{let c=(await xe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?r.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):r.push("Queue: No completed tasks")}catch(a){r.push(`Queue: Error - ${w(a)}`)}return await ga(e),await mt.log(e,"cleanup_performed",{items:r.length,timestamp:B.getTimestamp()}),h.done(`${r.length} items cleaned`),{success:!0,cleaned:r}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Ru=y(()=>{"use strict";On();Bt();ye();N();ot();l(ma,"cleanupMemory");l(ga,"cleanupMemoryInternal");l(Du,"cleanup")});import gh from"node:path";async function $u(s=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=s||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=gh.join(I.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1017
1039
 
1018
1040
  *Use templates/design/architecture.md for full design*
1019
1041
  `;break;case"api":c=`# API Design: ${o}
@@ -1028,45 +1050,45 @@ ${"\u2550".repeat(50)}
1028
1050
  `;break;case"flow":c=`# Flow Design: ${o}
1029
1051
 
1030
1052
  *Use templates/design/flow.md for full design*
1031
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=ih.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:W.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var Au=y(()=>{"use strict";Mn();_();rt();l(Iu,"design")});import Ws from"node:path";async function ju(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=I.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ce.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1053
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=gh.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:B.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var Mu=y(()=>{"use strict";On();N();ot();l($u,"design")});import Bs from"node:path";async function Ou(s=process.cwd()){try{let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=I.getFilePath(e,"progress","sessions/current.json"),n=null;try{let r=await ce.readFile(t);n=JSON.parse(r)}catch(r){if(P(r)||r instanceof SyntaxError)n=null;else throw r}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
1032
1054
  Found abandoned session:
1033
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=W.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1055
+ `),console.log(` Task: ${n.task}`),n.startedAt){let r=B.calculateDuration(new Date(n.startedAt));console.log(` Started: ${r} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1034
1056
  Options:`),console.log(" 1. Use /p:work to resume working"),console.log(" 2. Use /p:done to mark as complete"),console.log(` 3. Delete session file to discard
1035
- `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Du(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=Ws.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp:W.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Ru(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots"),n=Ws.join(t,"history.json"),s;try{let i=await ce.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
1036
- `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:W.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function $u(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Ws.join(I.getGlobalProjectPath(e),"snapshots"),n=Ws.join(t,"history.json"),s;try{let o=await ce.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
1057
+ `),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Fu(s=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:s,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:s,encoding:"utf-8"});let a=Bs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!P(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(s,"undo_performed",{snapshotId:i,timestamp:B.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(r){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(r)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function _u(s=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots"),n=Bs.join(t,"history.json"),r;try{let i=await ce.readFile(n);r=JSON.parse(i)}catch(i){if(P(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(r.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:s,encoding:"utf-8"}).trim();return i?i.split(`
1058
+ `).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:s,encoding:"utf-8"}),r.snapshots.pop(),r.current=Math.max(0,r.current-1),await ce.writeFile(n,JSON.stringify(r,null,2)),await mt.log(s,"redo_performed",{timestamp:B.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Nu(s=process.cwd()){try{let e=await R.getProjectId(s);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Bs.join(I.getGlobalProjectPath(e),"snapshots"),n=Bs.join(t,"history.json"),r;try{let o=await ce.readFile(n);r=JSON.parse(o)}catch(o){if(P(o)||o instanceof SyntaxError)return console.log(`
1037
1059
  SNAPSHOT HISTORY
1038
1060
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1039
1061
  `),{success:!0,snapshots:[]};throw o}return console.log(`
1040
1062
  SNAPSHOT HISTORY
1041
- `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1042
- `)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1063
+ `),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1064
+ `)):(r.snapshots.forEach((o,i)=>{let a=i===r.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${r.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
1043
1065
  `)),console.log(`${"=".repeat(50)}
1044
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Mu=y(()=>{"use strict";Mn();_();rt();l(ju,"recover");l(Du,"undo");l(Ru,"redo");l($u,"history")});var Bs,Ou=y(()=>{"use strict";rt();Eu();Au();Mu();Eu();Au();Mu();Bs=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=ca;_cleanupMemoryInternal=la;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Tu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Iu(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ju(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Du(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ru(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$u(e):t}}});import je from"chalk";function ua(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}var On,Vs,Fu=y(()=>{"use strict";ei();_();rt();On={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(ua,"statusIcon");Vs=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Bn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1066
+ `),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Lu=y(()=>{"use strict";On();N();ot();l(Ou,"recover");l(Fu,"undo");l(_u,"redo");l(Nu,"history")});var Vs,Uu=y(()=>{"use strict";ot();Ru();Mu();Lu();Ru();Mu();Lu();Vs=class extends be{static{l(this,"MaintenanceCommands")}_cleanupMemory=ma;_cleanupMemoryInternal=ga;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Du(e,t):n}async design(e=null,t={},n=process.cwd()){let r=await this.ensureProjectInit(n);return r.success?$u(e,t,n):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ou(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Fu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?_u(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nu(e):t}}});import je from"chalk";function fa(s,e,t){return t==="below"?s<=e?je.green("\u2713"):je.yellow("\u26A0"):s>=e?je.green("\u2713"):je.yellow("\u26A0")}var Fn,Js,Hu=y(()=>{"use strict";ri();N();ot();Fn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(fa,"statusIcon");Js=class extends be{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Vn.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1045
1067
  ${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
1046
1068
  `),{success:!0,message:"No data"};if(console.log(`
1047
- ${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ua(i.startup.avg,On.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${On.startup.max}ms`)}`)}if(i.memory){let c=ua(i.memory.peakHeapMB,On.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${On.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ua(i.contextCorrectness.rate,On.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${On.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ua(i.subtaskHandoff.rate,On.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${On.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1048
- ${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import _u from"node:fs/promises";import jP from"node:path";import ae from"chalk";var Js,Nu=y(()=>{"use strict";In();Se();_();xe();dt();rt();Js=class extends be{static{l(this,"SetupCommands")}async start(){let t=await(Be(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1069
+ ${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=fa(i.startup.avg,Fn.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${Fn.startup.max}ms`)}`)}if(i.memory){let c=fa(i.memory.peakHeapMB,Fn.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${Fn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=fa(i.contextCorrectness.rate,Fn.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${Fn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=fa(i.subtaskHandoff.rate,Fn.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${Fn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1070
+ ${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import Gu from"node:fs/promises";import Ux from"node:path";import ae from"chalk";var qs,zu=y(()=>{"use strict";An();Se();N();ve();dt();ot();qs=class extends be{static{l(this,"SetupCommands")}async start(){let t=await(Je(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1049
1071
  `),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1050
1072
 
1051
1073
  Please install it first:
1052
- - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ee.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1053
- \u2705 Installed ${s.installed?.length??0} commands to:
1054
- ${I.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1055
- \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1074
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let r=await Ee.installCommands();if(!r.success)return{success:!1,message:`\u274C Installation failed: ${r.error}`};if(console.log(`
1075
+ \u2705 Installed ${r.installed?.length??0} commands to:
1076
+ ${I.getDisplayPath(r.path||"")}`),(r.errors?.length??0)>0){console.log(`
1077
+ \u26A0\uFE0F ${r.errors?.length??0} errors:`);for(let o of r.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1056
1078
  \u{1F389} Setup complete!`),console.log(`
1057
1079
  Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1058
1080
  `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ee.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ee.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1059
1081
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1060
1082
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1061
- \u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?I.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Be(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
1083
+ \u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),r=n.path?I.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${r}`):n.action==="updated"?console.log(`\u2705 Updated ${r}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Je(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
1062
1084
  \u26A1 Installing status line...`);let a=await this.installStatusLine();a.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${a.error}`)}return console.log(`
1063
1085
  \u{1F389} Setup complete!
1064
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=I.getClaudeDir(),t=I.getClaudeSettingsPath(),n=jP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1086
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=I.getClaudeDir(),t=I.getClaudeSettingsPath(),n=Ux.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
1065
1087
  # prjct Status Line for Claude Code
1066
1088
  # Shows version update notifications and current task
1067
1089
 
1068
1090
  # Current CLI version (embedded at install time)
1069
- CLI_VERSION="${ve}"
1091
+ CLI_VERSION="${Pe}"
1070
1092
 
1071
1093
  # Read JSON context from stdin (provided by Claude Code)
1072
1094
  read -r json
@@ -1117,18 +1139,18 @@ fi
1117
1139
 
1118
1140
  # Default: show prjct branding
1119
1141
  echo "\u26A1 prjct"
1120
- `;await _u.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await _u.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await _u.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${ve} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function DP(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await P(ht.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ht.join(r,"yarn.lock"))?"yarn":await P(ht.join(r,"bun.lockb"))||await P(ht.join(r,"bun.lock"))?"bun":(await P(ht.join(r,"package-lock.json")),"npm")}function ah(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function RP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Lu(r){let e=ht.join(r,"package.json"),t=await Ln(e,null);if(t){let o=await DP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:ah(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:ah(o,"typecheck")}),i.test&&(a.test={tool:o,command:RP(o)}),a}if(await P(ht.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await ys(ht.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(ht.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(ht.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await ws(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(ht.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(ht.join(r,"gradlew"))&&(await P(ht.join(r,"build.gradle"))||await P(ht.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var ch=y(()=>{"use strict";xe();l(DP,"detectPackageManager");l(ah,"pmRun");l(RP,"pmTest");l(Lu,"detectProjectCommands")});import{exec as $P}from"node:child_process";import{promisify as MP}from"node:util";import qt from"chalk";function uo(r,e){return`workflow:${r}_${e}`}async function lh(r,e){let t=uo(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(r,t,e.action,"workflow");break;case"session":da.set(t,e);break;case"once":qs.set(t,e);break}}async function FP(r,e){let t={};for(let n of["before","after","skip"]){let s=uo(n,e),o=qs.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=da.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function hn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await FP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=uo(e,t);qs.has(i)&&qs.delete(i),console.log(`
1121
- ${qt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await OP(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${qt.green("\u2713")} ${qt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(qt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(qt.dim(c.split(`
1122
- `)[0])),{success:!1,failed:o,output:c}}}async function Hu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=uo(o,s),a=qs.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=da.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function uh(r,e,t){let n=uo(e,t);return qs.delete(n),da.delete(n),await Te.recordDecision(r,n,"","workflow:remove"),!0}function dh(r){if(r.length===0)return`${qt.dim(Ar.NO_PREFERENCES)}
1142
+ `;await Gu.writeFile(n,r,{mode:493});let o={};if(await x(t))try{o=JSON.parse(await Gu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Gu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${Pe} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import ht from"node:path";async function Hx(s,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await x(ht.join(s,"pnpm-lock.yaml"))?"pnpm":await x(ht.join(s,"yarn.lock"))?"yarn":await x(ht.join(s,"bun.lockb"))||await x(ht.join(s,"bun.lock"))?"bun":(await x(ht.join(s,"package-lock.json")),"npm")}function fh(s,e){return s==="yarn"?`yarn ${e}`:s==="pnpm"?`pnpm run ${e}`:s==="bun"?`bun run ${e}`:`npm run ${e}`}function Gx(s){return s==="yarn"?"yarn test":s==="pnpm"?"pnpm test":s==="bun"?"bun test":"npm test"}async function Wu(s){let e=ht.join(s,"package.json"),t=await Un(e,null);if(t){let o=await Hx(s,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:fh(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:fh(o,"typecheck")}),i.test&&(a.test={tool:o,command:Gx(o)}),a}if(await x(ht.join(s,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await ws(ht.join(s,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await x(ht.join(s,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await x(ht.join(s,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await ks(s)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await x(ht.join(s,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await x(ht.join(s,"gradlew"))&&(await x(ht.join(s,"build.gradle"))||await x(ht.join(s,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var hh=y(()=>{"use strict";ve();l(Hx,"detectPackageManager");l(fh,"pmRun");l(Gx,"pmTest");l(Wu,"detectProjectCommands")});import{exec as zx}from"node:child_process";import{promisify as Wx}from"node:util";import qt from"chalk";function go(s,e){return`workflow:${s}_${e}`}async function yh(s,e){let t=go(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(s,t,e.action,"workflow");break;case"session":ha.set(t,e);break;case"once":Ks.set(t,e);break}}async function Vx(s,e){let t={};for(let n of["before","after","skip"]){let r=go(n,e),o=Ks.get(r);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ha.get(r);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(s,r);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function hn(s,e,t,n={}){if(n.skipHooks)return{success:!0};let r=await Vx(s,t);if(r.skip)return{success:!0,skipped:[t]};let o=r[e];if(!o)return{success:!0};let i=go(e,t);Ks.has(i)&&Ks.delete(i),console.log(`
1143
+ ${qt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await Bx(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${qt.green("\u2713")} ${qt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(qt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(qt.dim(c.split(`
1144
+ `)[0])),{success:!1,failed:o,output:c}}}async function Bu(s){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let r of t)for(let o of n){let i=go(o,r),a=Ks.get(i);if(a){e.push({key:`${o} ${r}`,action:a.action,scope:"once"});continue}let c=ha.get(i);if(c){e.push({key:`${o} ${r}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(s,i);u&&e.push({key:`${o} ${r}`,action:u,scope:"permanent"})}return e}async function wh(s,e,t){let n=go(e,t);return Ks.delete(n),ha.delete(n),await Te.recordDecision(s,n,"","workflow:remove"),!0}function kh(s){if(s.length===0)return`${qt.dim(Ar.NO_PREFERENCES)}
1123
1145
 
1124
- Set one: "${Ar.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of r){let n=t.scope==="permanent"?qt.green("permanent"):t.scope==="session"?qt.yellow("session"):qt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(qt.dim(`Modify: "${Ar.MODIFY_EXAMPLE}"`)),e.push(qt.dim(`Remove: "${Ar.REMOVE_EXAMPLE}"`)),e.join(`
1125
- `)}var OP,da,qs,Uu=y(()=>{"use strict";Ms();_();un();OP=MP($P),da=new Map,qs=new Map;l(uo,"prefKey");l(lh,"setWorkflowPreference");l(FP,"getWorkflowPreferences");l(hn,"runWorkflowHooks");l(Hu,"listWorkflowPreferences");l(uh,"removeWorkflowPreference");l(dh,"formatWorkflowPreferences")});import ph from"node:path";var Ks,Gu=y(()=>{"use strict";Ms();Bt();_();Ns();Ls();ch();Uu();rt();Ks=class extends be{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Ke.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1146
+ Set one: "${Ar.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"];for(let t of s){let n=t.scope==="permanent"?qt.green("permanent"):t.scope==="session"?qt.yellow("session"):qt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(qt.dim(`Modify: "${Ar.MODIFY_EXAMPLE}"`)),e.push(qt.dim(`Remove: "${Ar.REMOVE_EXAMPLE}"`)),e.join(`
1147
+ `)}var Bx,ha,Ks,Vu=y(()=>{"use strict";Ms();N();un();Bx=Wx(zx),ha=new Map,Ks=new Map;l(go,"prefKey");l(yh,"setWorkflowPreference");l(Vx,"getWorkflowPreferences");l(hn,"runWorkflowHooks");l(Bu,"listWorkflowPreferences");l(wh,"removeWorkflowPreference");l(kh,"formatWorkflowPreferences")});import Sh from"node:path";var Ys,Ju=y(()=>{"use strict";Ms();Bt();N();Ns();Ls();hh();Vu();ot();Ys=class extends be{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Xe.get("Bash"),r=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(r),i=`${o.stdout}
1126
1148
  ${o.stderr}`.trim(),a=i.split(`
1127
1149
  `),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
1128
1150
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1129
- `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await hn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:W.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await hn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Pi("ship"),k=Ie(tn(`Shipped: ${i}`,`Version: ${d}`),st("Results",At([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Qe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Lu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Lu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=ph.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=ph.join(n,"CHANGELOG.md"),o=await ce.readFile(s,`# Changelog
1151
+ `).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await hn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await hn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Ai("ship"),k=Ie(tn(`Shipped: ${i}`,`Version: ${d}`),rt("Results",At([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),et(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(k)}else h.done(`v${d} shipped`),Ct("ship");return{success:!0,feature:i,version:d}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async _runLint(e){try{let t=await Wu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Wu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return P(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Sh.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),r=n?.version||"0.0.0",[o,i,a]=r.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(P(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let r=Sh.join(n,"CHANGELOG.md"),o=await ce.readFile(r,`# Changelog
1130
1152
 
1131
- `),i=`## [${t}] - ${W.formatDate(new Date)}
1153
+ `),i=`## [${t}] - ${B.formatDate(new Date)}
1132
1154
 
1133
1155
  ### Added
1134
1156
  - ${e}
@@ -1137,82 +1159,82 @@ ${o.stderr}`.trim(),a=i.split(`
1137
1159
 
1138
1160
  `,`# Changelog
1139
1161
 
1140
- ${i}`);await ce.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Ke.get("Bash")("git add .");let n=`feat: ${e}
1162
+ ${i}`);await ce.writeFile(r,a)}catch(r){P(r)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Xe.get("Bash")("git add .");let n=`feat: ${e}
1141
1163
 
1142
- Generated with [p/](https://www.prjct.app/)`;return await Ke.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ke.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import _P from"node:fs/promises";import NP from"node:path";import Ys from"chalk";var Xs,zu=y(()=>{"use strict";Ve();Se();xi();_();Gt();rt();Xs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Ys.dim(`[dry-run] Would update ${o.length} project(s)
1143
- `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ys.dim("would update")} ${m}`);continue}try{let p=await Br(d),g=await vi(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ys.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ys.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Ys.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ys.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=NP.join(I.getGlobalBasePath(),"projects");try{return(await _P.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Qs,Wu=y(()=>{"use strict";Cl();Ps();ol();_();Qn();rt();Qs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(s);if(i.length===0)return console.log(`
1164
+ Generated with [p/](https://www.prjct.app/)`;return await Xe.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return P(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Xe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return P(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import Jx from"node:fs/promises";import qx from"node:path";import Xs from"chalk";var Qs,qu=y(()=>{"use strict";qe();Se();Ii();N();Gt();ot();Qs=class extends be{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,r=e.all===!0;try{let o=r?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Xs.dim(`[dry-run] Would update ${o.length} project(s)
1165
+ `));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Xs.dim("would update")} ${m}`);continue}try{let p=await Br(d),g=await Ei(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Xs.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Xs.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let k of p.errors)console.log(` ${Xs.yellow("\u26A0")} ${k.file}: ${k.error}`);c+=p.errors.length}}catch(p){console.log(` ${Xs.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=qx.join(I.getGlobalBasePath(),"projects");try{return(await Jx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Zs,Ku=y(()=>{"use strict";jl();xs();ml();N();Zn();ot();Zs=class extends be{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(r);if(i.length===0)return console.log(`
1144
1166
  ${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
1145
- `),{success:!0,message:"No data"};let a=$i(i,o);await rl.saveMetrics(s,a),console.log(`
1167
+ `),{success:!0,message:"No data"};let a=_i(i,o);await pl.saveMetrics(r,a),console.log(`
1146
1168
  ${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1147
- ${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=tg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1148
- ${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Cn,...n.velocity}}catch{}return Cn}}});var LP,HP,gh,pa,mh,fh,hh=y(()=>{"use strict";Qn();LP=[1,2,3,5,8,13,21],HP={1:{min:5,max:15,typical:10},2:{min:15,max:30,typical:20},3:{min:30,max:60,typical:45},5:{min:60,max:120,typical:90},8:{min:120,max:240,typical:180},13:{min:240,max:480,typical:360},21:{min:480,max:960,typical:720}},gh=l(r=>LP.includes(r),"isValidPoint"),pa=l(r=>HP[r],"pointsToMinutes"),mh=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),fh=l(r=>{let e=pa(r);return`${mh(e.min)}\u2013${mh(e.max)}`},"pointsToTimeRange")});function Bu(){et.clear(),Kt.clear(),Zs.clear(),er.clear()}function Vu(){return{issues:et.stats(),assignedIssues:Kt.stats(),teams:Zs.stats(),projects:er.stats()}}var ma,et,Kt,Zs,er,Ju=y(()=>{"use strict";Jo();ma=300*1e3,et=new Ht({ttl:ma,maxSize:100}),Kt=new Ht({ttl:ma,maxSize:10}),Zs=new Ht({ttl:ma,maxSize:5}),er=new Ht({ttl:ma,maxSize:5});l(Bu,"clearLinearCache");l(Vu,"getLinearCacheStats")});import{exec as UP}from"node:child_process";import{promisify as GP}from"node:util";async function ga(r){if(process.platform!=="darwin")return yh(r);try{let{stdout:e}=await zP(`security find-generic-password -s "${WP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return yh(r)}}function yh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var zP,WP,qu=y(()=>{"use strict";_();zP=GP(UP),WP="prjct-cli";l(ga,"getCredential");l(yh,"getEnvFallback")});var BP,VP,wh,fa,yt,Ku=y(()=>{"use strict";_();qu();BP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},VP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},wh={none:0,urgent:1,high:2,medium:3,low:4},fa=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ga("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?wh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=wh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:BP[t?.type||"backlog"]||"backlog",priority:VP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new fa});var ha,Ot,Yu=y(()=>{"use strict";Ju();Ku();ha=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Kt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Kt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Zs.get("teams");if(e)return e;let t=await yt.getTeams();return Zs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=er.get("projects");if(e)return e;let t=await yt.getProjects();return er.set("projects",t),t}clearCache(){Bu()}getCacheStats(){return Vu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new ha});var kh,ya,JP,Sh=y(()=>{"use strict";ec();he();_();Yu();kh=1800*1e3,ya=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:kh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Ot.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ot.markInProgress(t):n==="done"&&await Ot.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||kh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Bd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},JP=new ya});var bh=y(()=>{"use strict";Ju();Ku();Yu();Sh()});import qP from"node:fs/promises";import KP from"node:os";import YP from"node:path";function XP(r){return YP.join(KP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function wa(r){let e=XP(r);if(!await P(e))return{};try{return JSON.parse(await qP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Xu(r){let e=await wa(r);return e.linear?.apiKey?e.linear.apiKey:ga("linear-api-key")}var Ch=y(()=>{"use strict";_();xe();qu();l(XP,"getCredentialsPath");l(wa,"getProjectCredentials");l(Xu,"getLinearApiKey")});import QP from"node:fs/promises";import ZP from"node:path";function vh(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function eT(){try{let{execSync:r}=await import("node:child_process");return r("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function tT(r){try{let e=ZP.join(r,"analysis","repo-analysis.json"),t=await QP.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e),null}}function nT(r,e){if(!r&&!e)return null;let t=e?.ecosystem||null,n=r?.languages?.join(", ")||null,s=r?.frameworks?.join(", ")||null,o=r?.packageManager||null,i=r?.sourceDir||e?.structure?.srcDir||null,a=r?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),s&&(c.Frameworks=s),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=jt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: ${k}`);m=`Commands
1169
+ ${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=ag(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1170
+ ${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...Pn,...n.velocity}}catch{}return Pn}}});var Kx,Yx,Ch,ya,bh,Ph,vh=y(()=>{"use strict";Zn();Kx=[1,2,3,5,8,13,21],Yx={1:{min:5,max:15,typical:10},2:{min:15,max:30,typical:20},3:{min:30,max:60,typical:45},5:{min:60,max:120,typical:90},8:{min:120,max:240,typical:180},13:{min:240,max:480,typical:360},21:{min:480,max:960,typical:720}},Ch=l(s=>Kx.includes(s),"isValidPoint"),ya=l(s=>Yx[s],"pointsToMinutes"),bh=l(s=>{if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),Ph=l(s=>{let e=ya(s);return`${bh(e.min)}\u2013${bh(e.max)}`},"pointsToTimeRange")});function Yu(){nt.clear(),Kt.clear(),er.clear(),tr.clear()}function Xu(){return{issues:nt.stats(),assignedIssues:Kt.stats(),teams:er.stats(),projects:tr.stats()}}var wa,nt,Kt,er,tr,Qu=y(()=>{"use strict";Xo();wa=300*1e3,nt=new Ut({ttl:wa,maxSize:100}),Kt=new Ut({ttl:wa,maxSize:10}),er=new Ut({ttl:wa,maxSize:5}),tr=new Ut({ttl:wa,maxSize:5});l(Yu,"clearLinearCache");l(Xu,"getLinearCacheStats")});import{exec as Xx}from"node:child_process";import{promisify as Qx}from"node:util";async function ka(s){if(process.platform!=="darwin")return xh(s);try{let{stdout:e}=await Zx(`security find-generic-password -s "${eT}" -a "${s}" -w 2>/dev/null`);return e.trim()||null}catch{return xh(s)}}function xh(s){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[s];return process.env[t]||null}var Zx,eT,Zu=y(()=>{"use strict";N();Zx=Qx(Xx),eT="prjct-cli";l(ka,"getCredential");l(xh,"getEnvFallback")});var tT,nT,Th,Sa,yt,ed=y(()=>{"use strict";N();Zu();tT={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},nT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Th={none:0,urgent:1,high:2,medium:3,low:4},Sa=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ka("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(r){throw this.sdk=null,new Error(`Linear connection failed: ${w(r)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let r=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(r.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,r,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===r);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let r=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Th[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!r)throw new Error("Failed to create issue");return this.mapIssue(r)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let r={};t.title!==void 0&&(r.title=t.title),t.description!==void 0&&(r.description=t.description),t.priority!==void 0&&(r.priority=Th[t.priority]),t.assigneeId!==void 0&&(r.assigneeId=t.assigneeId),t.stateId!==void 0&&(r.stateId=t.stateId),t.projectId!==void 0&&(r.projectId=t.projectId),t.labels!==void 0&&n.team&&(r.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,r);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let r=await(await this.sdk.issue(t.id)).team;if(!r)throw new Error("Issue has no team");let i=(await r.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,r=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:tT[t?.type||"backlog"]||"backlog",priority:nT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:r?{id:r.id,name:r.name,key:r.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),r=t.map(o=>o.toLowerCase());return r.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":r.includes("feature")||n.includes("add")||n.includes("implement")?"feature":r.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":r.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new Sa});var ba,Ot,td=y(()=>{"use strict";Qu();ed();ba=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let r=await yt.fetchAssignedIssues(e);Kt.set(t,r);for(let o of r)nt.set(`issue:${o.id}`,o),nt.set(`issue:${o.externalId}`,o);return r}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,r=Kt.get(n);if(r)return r;let o=await yt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)nt.set(`issue:${i.id}`,i),nt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=nt.get(t);if(n)return n;let r=await yt.fetchIssue(e);return r&&(nt.set(`issue:${r.id}`,r),nt.set(`issue:${r.externalId}`,r)),r}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return nt.set(`issue:${t.id}`,t),nt.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return nt.set(`issue:${n.id}`,n),nt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),nt.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),nt.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=er.get("teams");if(e)return e;let t=await yt.getTeams();return er.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=tr.get("projects");if(e)return e;let t=await yt.getProjects();return tr.set("projects",t),t}clearCache(){Yu()}getCacheStats(){return Xu()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new ba});var Eh,Ca,sT,Ih=y(()=>{"use strict";cc();ye();N();td();Eh=1800*1e3,Ca=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let r=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of r)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Eh,issues:o};return M.setDoc(e,"issues",i),{provider:"linear",fetched:r.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(r){return n.push({issueId:"all",error:w(r)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let r=n.issues[t],o=new Date(r.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return r}try{let r=await Ot.fetchIssue(t);if(!r)return null;let o=new Date().toISOString(),i=this.toCachedIssue(r,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ot.markInProgress(t):n==="done"&&await Ot.markDone(t);let r=this.loadIssues(e);if(r?.issues[t]){let o=n==="done"?"done":"in_progress";r.issues[t].status=o,r.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,r)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),r=Date.now(),o=t.staleAfter||Eh;return r-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return M.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){M.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let r=this.loadIssues(e);r||(r=Xd("linear")),r.issues[t]=n,this.saveIssues(e,r)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},sT=new Ca});var Ah=y(()=>{"use strict";Qu();ed();td();Ih()});import rT from"node:fs/promises";import oT from"node:os";import iT from"node:path";function aT(s){return iT.join(oT.homedir(),".prjct-cli","projects",s,"config","credentials.json")}async function Pa(s){let e=aT(s);if(!await x(e))return{};try{return JSON.parse(await rT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function nd(s){let e=await Pa(s);return e.linear?.apiKey?e.linear.apiKey:ka("linear-api-key")}var jh=y(()=>{"use strict";N();ve();Zu();l(aT,"getCredentialsPath");l(Pa,"getProjectCredentials");l(nd,"getLinearApiKey")});import cT from"node:fs/promises";import lT from"node:path";function Dh(s){if(s<60)return`${s}m`;let e=Math.floor(s/60),t=s%60;return t>0?`${e}h ${t}m`:`${e}h`}async function uT(){try{let{execSync:s}=await import("node:child_process");return s("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}async function dT(s){try{let e=lT.join(s,"analysis","repo-analysis.json"),t=await cT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return P(e),null}}function pT(s,e){if(!s&&!e)return null;let t=e?.ecosystem||null,n=s?.languages?.join(", ")||null,r=s?.frameworks?.join(", ")||null,o=s?.packageManager||null,i=s?.sourceDir||e?.structure?.srcDir||null,a=s?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),n&&(c.Languages=n),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=jt(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: ${k}`);m=`Commands
1149
1171
  ${At(g)}`}return[u?`Project
1150
1172
  ${u}`:null,m].filter(Boolean).join(`
1151
1173
 
1152
- `)||null}function sT(r){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=r?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(s=>s.toLowerCase()===n.toLowerCase())&&e.push(n);return Pm(e)}function rT(r){if(!r)return null;let e=[],t=r.patterns;if(Array.isArray(t)&&t.length>0){let s=t.map(o=>{let i=o.location?` \u2014 ${o.location}`:"";return`- ${o.name}: ${o.description}${i}`});e.push(`Patterns (follow these)
1153
- ${s.join(`
1154
- `)}`)}let n=r.antiPatterns;if(Array.isArray(n)&&n.length>0){let s=n.map(o=>`- ${o.issue} \u2014 ${o.file} \u2192 ${o.suggestion}`);e.push(`Anti-patterns (avoid these)
1155
- ${s.join(`
1174
+ `)||null}function mT(s){let e=["All commits must include footer: Generated with [p/](https://www.prjct.app/)","Never commit directly to main/master"],t=s?.rules;if(Array.isArray(t))for(let n of t)typeof n=="string"&&!e.some(r=>r.toLowerCase()===n.toLowerCase())&&e.push(n);return Dm(e)}function gT(s){if(!s)return null;let e=[],t=s.patterns;if(Array.isArray(t)&&t.length>0){let r=t.map(o=>{let i=o.location?` \u2014 ${o.location}`:"";return`- ${o.name}: ${o.description}${i}`});e.push(`Patterns (follow these)
1175
+ ${r.join(`
1176
+ `)}`)}let n=s.antiPatterns;if(Array.isArray(n)&&n.length>0){let r=n.map(o=>`- ${o.issue} \u2014 ${o.file} \u2192 ${o.suggestion}`);e.push(`Anti-patterns (avoid these)
1177
+ ${r.join(`
1156
1178
  `)}`)}return e.length>0?e.join(`
1157
1179
 
1158
- `):null}function oT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var tr,Qu=y(()=>{"use strict";zl();Ll();hh();Se();bh();Lt();Bt();Oi();_();Ns();Ls();Ch();Uu();Qn();rt();tr=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await hn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await wa(o),k=await Xu(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let b=await Ot.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ot.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return pn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,x,O]=await Promise.all([eT(),It.getActive(o).catch(()=>null),tT(k),Zn(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=il({description:c,branch:b,linearId:a}),J=nT(D,x),ne=xm(O.files.map(N=>({path:N.path,description:N.reasons.join(", ")}))),S=sT(x),j=rT(D),Z=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Ie(F,J,ne,S,j,Z)),await this.logToMemory(t,"task_started",{task:e,timestamp:W.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Vi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:me(),description:c,sessionId:me(),linearId:a});let m=await Nl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Jr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:W.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:gh,pointsToMinutes:pa,pointsToTimeRange:fh,storeEstimate:l(async f=>{let k=pa(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?W.calculateDuration(new Date(i.startedAt)):void 0,c=il({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?vm(u,d):"",p=Qe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){let o=w(s);return n.md?o.includes("Cannot run")||o.includes("working state")?pn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return t.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await hn(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=W.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:W.getTimestamp(),estimatedDuration:d?vh(d):"0m",actualDuration:c||"0m",variance:d?oT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${vh(d)}) \u2192 ${b}${k}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await wa(s),k=await Xu(s);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(tn("Completed",`${a}${f}`),jt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Jr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:W.getTimestamp()}),await hn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?pn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(st("Queue",`${o.length} task${o.length!==1?"s":""}`),At(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=W.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(tn("Task Paused",`**Paused:** ${i.description}`),jt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Jr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:W.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?pn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(tn("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Jr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:W.getTimestamp()}),{success:!0,task:a.description}):(n.md?pn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Hu(s);return console.log(dh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await lh(s,{...o,createdAt:W.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await uh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Hu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(vh,"formatMinutesToDuration");l(eT,"getGitBranch");l(tT,"loadRepoAnalysis");l(nT,"buildProjectContext");l(sT,"buildRules");l(rT,"buildPatterns");l(oT,"formatVariance")});var yn,HB,xh=y(()=>{"use strict";Ki();xu();Pu();Ou();Fu();qi();Nu();Gu();zu();Wu();Qu();yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new tr,this.planning=new is,this.shipping=new Ks,this.analytics=new zs,this.performanceCmds=new Vs,this.maintenance=new Bs,this.analysis=new us,this.setupCmds=new Js,this.updateCmds=new Xs,this.velocityCmds=new Qs,this.contextCmds=new ds,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},HB=new yn});var po,nr,Zu=y(()=>{"use strict";po={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},nr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Ih={};fe(Ih,{UninstallCommands:()=>go,uninstall:()=>Eh});import{execSync as ka}from"node:child_process";import wt from"node:fs/promises";import iT from"node:os";import wn from"node:path";import aT from"node:readline";import Ce from"chalk";async function ed(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=wn.join(r,n.name);if(n.isDirectory())e+=await ed(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function Ph(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function cT(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function lT(){let r={homebrew:!1,npm:!1};try{ka("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{ka("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function uT(){let r=[],e=qp(),t=I.getGlobalBasePath(),n=await P(t),s=n?await cT(wn.join(t,"projects")):0,o=n?await ed(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=wn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let J=await wt.readFile(i,"utf-8");c=J.includes(Sa)&&J.includes(mo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await ed(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=wn.join(e.claude.config,"prjct-statusline.sh"),k=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=wn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let J=await wt.readFile(x,"utf-8");F=J.includes(Sa)&&J.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function dT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1180
+ `):null}function fT(s){let e=s>=0?"+":"-",t=Math.abs(s);if(t>=60){let n=Math.floor(t/60),r=t%60;return r>0?`${e}${n}h ${r}m`:`${e}${n}h`}return`${e}${t}m`}var nr,sd=y(()=>{"use strict";Xl();Jl();vh();Se();Ah();Lt();Bt();Li();N();Ns();Ls();jh();Vu();Zn();ot();nr=class extends be{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await hn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Pa(o),k=await nd(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let b=await Ot.fetchIssue(e);b&&(a=e,c=`${e}: ${b.title}`,await Ot.markInProgress(e))}}catch{}if(n.md){let f=await L.getCurrentTask(o);if(f)return pn("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:f.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:f};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let k=I.getGlobalProjectPath(o),[b,D,v,$]=await Promise.all([uT(),bt.getActive(o).catch(()=>null),dT(k),es(c,t,{maxFiles:8,minScore:.15}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),F=gl({description:c,branch:b,linearId:a}),H=pT(D,v),ee=jm($.files.map(Ve=>({path:Ve.path,description:Ve.reasons.join(", ")}))),S=mT(v),j=gT(D),te=et([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);return console.log(Ie(F,H,ee,S,j,te)),await this.logToMemory(t,"task_started",{task:e,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Yi.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};await L.startTask(o,{id:ge(),description:c,sessionId:ge(),linearId:a});let m=await Vl.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=d.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Jr("working"),Ct("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:d.orchestratorContext,timestamp:B.getTimestamp()}),await hn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Ch,pointsToMinutes:ya,pointsToTimeRange:Ph,storeEstimate:l(async f=>{let k=ya(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=gl({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?Am(u,d):"",p=et([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=w(r);return n.md?o.includes("Cannot run")||o.includes("working state")?pn("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(r);if(!o)return t.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await hn(r,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Dh(d):"0m",actualDuration:c||"0m",variance:d?fT(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Dh(d)}) \u2192 ${b}${k}%`}await L.completeTask(r,t.feedback);let g=o.linearId;if(g)try{let f=await Pa(r),k=await nd(r);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(tn("Completed",`${a}${f}`),jt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),et([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Jr("completed"),Ct("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await hn(r,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await R.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await xe.getActiveTasks(r);if(o.length===0)return t.md?pn("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(rt("Queue",`${o.length} task${o.length!==1?"s":""}`),At(i,!0),et([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Ct("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?pn("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(tn("Task Paused",`**Paused:** ${i.description}`),jt({Reason:e||void 0,"Duration worked":a||void 0}),et([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Jr("paused"),Ct("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async resume(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?pn("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(tn("Task Resumed",`**Resumed:** ${a.description}`),et([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Jr("working"),Ct("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?pn("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(r){return h.fail(w(r)),{success:!1,error:w(r)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let r=await R.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Bu(r);return console.log(kh(o)),{success:!0,preferences:o}}return{success:!0,projectId:r,input:e,setWorkflowPreference:l(async o=>{await yh(r,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await wh(r,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Bu(r),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Dh,"formatMinutesToDuration");l(uT,"getGitBranch");l(dT,"loadRepoAnalysis");l(pT,"buildProjectContext");l(mT,"buildRules");l(gT,"buildPatterns");l(fT,"formatVariance")});var yn,YB,Rh=y(()=>{"use strict";Zi();Au();ju();Uu();Hu();Qi();zu();Ju();qu();Ku();sd();yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new nr,this.planning=new as,this.shipping=new Ys,this.analytics=new Ws,this.performanceCmds=new Js,this.maintenance=new Vs,this.analysis=new ds,this.setupCmds=new qs,this.updateCmds=new Qs,this.velocityCmds=new Zs,this.contextCmds=new ps,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},YB=new yn});var fo,sr,rd=y(()=>{"use strict";fo={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},sr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var Fh={};he(Fh,{UninstallCommands:()=>yo,uninstall:()=>Oh});import{execSync as va}from"node:child_process";import wt from"node:fs/promises";import hT from"node:os";import wn from"node:path";import yT from"node:readline";import Ce from"chalk";async function od(s){let e=0;try{let t=await wt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name);if(n.isDirectory())e+=await od(r);else try{let o=await wt.stat(r);e+=o.size}catch{}}}catch{}return e}function $h(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}async function wT(s){try{return(await wt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function kT(){let s={homebrew:!1,npm:!1};try{va("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{va("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}async function ST(){let s=[],e=em(),t=I.getGlobalBasePath(),n=await x(t),r=n?await wT(wn.join(t,"projects")):0,o=n?await od(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=wn.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let H=await wt.readFile(i,"utf-8");c=H.includes(xa)&&H.includes(ho)}catch{}s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await x(u),m=d?await od(u):0;s.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await x(p);s.push({path:p,type:"file",description:"Claude router",exists:g});let f=wn.join(e.claude.config,"prjct-statusline.sh"),k=await x(f);s.push({path:f,type:"file",description:"Status line script",exists:k});let b=e.gemini.router,D=await x(b);s.push({path:b,type:"file",description:"Gemini router",exists:D});let v=wn.join(e.gemini.config,"GEMINI.md"),$=await x(v),F=!1;if($)try{let H=await wt.readFile(v,"utf-8");F=H.includes(xa)&&H.includes(ho)}catch{}return $&&F&&s.push({path:v,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}async function bT(s){try{let e=await wt.readFile(s,"utf-8");if(!e.includes(xa)||!e.includes(ho))return!1;let t=e.indexOf(xa),n=e.indexOf(ho)+ho.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
1159
1181
 
1160
- `).trim(),!s||s.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${s}
1161
- `,"utf-8"),!0}catch{return!1}}async function pT(){let r=iT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=wn.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=I.getGlobalBasePath();return await P(n)&&await Th(n,wn.join(t,".prjct-cli")),t}catch{return null}}async function Th(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=wn.join(r,n.name),o=wn.join(e,n.name);n.isDirectory()?await Th(s,o):await wt.copyFile(s,o)}}async function mT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await dT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ka(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||ka("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function gT(r){let e=aT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Eh(r={},e=process.cwd()){let t=await uT(),n=lT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
1162
- No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=I.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${Ph(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${Ph(o)}`)),console.log("")),r.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(Ce.blue("Creating backup..."));let c=await pT();c?(console.log(Ce.green(`Backup created: ${I.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await gT("> ")))return console.log(Ce.yellow(`
1163
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await mT(t,n,r);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1164
- ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Sa,mo,go,td=y(()=>{"use strict";In();Se();_();xe();rt();Sa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",mo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(ed,"getDirectorySize");l(Ph,"formatSize");l(cT,"countDirectoryItems");l(lT,"detectInstallation");l(uT,"gatherUninstallItems");l(dT,"removePrjctSection");l(pT,"createBackup");l(Th,"copyDirectory");l(mT,"performUninstall");l(gT,"promptConfirmation");l(Eh,"uninstall");go=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Eh(e,t)}}});function bT(){for(let[r,e]of Object.entries(po))G.registerCategory(r,e)}function Dh(){if(G.has("work"))return;bT();let r=l(e=>nr.find(t=>t.name===e),"getMeta");G.registerMethod("task",sr,"now",r("task")),G.registerMethod("done",sr,"done",r("done")),G.registerMethod("next",sr,"next",r("next")),G.registerMethod("pause",sr,"pause",r("pause")),G.registerMethod("resume",sr,"resume",r("resume")),G.registerMethod("workflow",sr,"workflow",r("workflow")),G.registerMethod("init",ba,"init",r("init")),G.registerMethod("bug",ba,"bug",r("bug")),G.registerMethod("idea",ba,"idea",r("idea")),G.registerMethod("spec",ba,"spec",r("spec")),G.registerMethod("ship",fT,"ship",r("ship")),G.registerMethod("dash",Ah,"dash",r("dash")),G.registerMethod("help",Ah,"help",r("help")),G.registerMethod("perf",hT,"perf",r("perf")),G.registerMethod("velocity",wT,"velocity",r("velocity")),G.registerMethod("cleanup",rr,"cleanup",r("cleanup")),G.registerMethod("design",rr,"design",r("design")),G.registerMethod("recover",rr,"recover",r("recover")),G.registerMethod("undo",rr,"undo",r("undo")),G.registerMethod("redo",rr,"redo",r("redo")),G.registerMethod("history",rr,"history",r("history")),G.registerMethod("analyze",or,"analyze",r("analyze")),G.registerMethod("sync",or,"sync",r("sync")),G.registerMethod("stats",or,"stats",r("stats")),G.registerMethod("status",or,"status",r("status")),G.registerMethod("seal",or,"seal",r("seal")),G.registerMethod("verify",or,"verify",r("verify")),G.registerMethod("start",jh,"start",r("start")),G.registerMethod("setup",jh,"setup",r("setup")),G.registerMethod("uninstall",kT,"uninstall",r("uninstall")),G.registerMethod("update",ST,"update",r("update")),G.registerMethod("context",yT,"context",r("context"))}var sr,ba,fT,Ah,hT,rr,or,jh,yT,wT,kT,ST,Ca=y(()=>{"use strict";Ki();xu();Zu();Pu();Ou();Fu();qi();Gs();Nu();Gu();td();zu();Wu();Qu();sr=new tr,ba=new is,fT=new Ks,Ah=new zs,hT=new Vs,rr=new Bs,or=new us,jh=new Js,yT=new ds,wT=new Qs,kT=new go,ST=new Xs;l(bT,"registerCategories");l(Dh,"registerAllCommands");Dh()});var nd=y(()=>{"use strict";cc();xh();Ca();Gs()});var $h={};fe($h,{shutdown:()=>ar,startDaemon:()=>vT});import Ft from"node:fs";import{createServer as CT}from"node:net";async function vT(r){let e=Ue.socket(),t=Ue.pid(),n=Ue.runDir();if(Ft.mkdirSync(n,{recursive:!0}),Ft.existsSync(t)){let s=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);IT(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),Ft.unlinkSync(t)}if(Ft.existsSync(e)&&Ft.unlinkSync(e),We={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ia,idleTimer:null},Le=new yn,ir=CT(s=>xT(s)),ir.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Rh()}),ir.on("error",s=>{console.error("Daemon socket error:",s.message),ar(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Yo;fo=Ko({port:i,projectId:o,projectPath:s,enableLogging:!1}),await fo.start()}}catch{}if(process.on("SIGTERM",()=>ar(0)),process.on("SIGINT",()=>ar(0)),process.on("SIGHUP",()=>{Le=new yn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function xT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1165
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await PT(o);r.write(ms(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ms(i))}}}),r.on("error",()=>{})}async function PT(r){if(!We||!Le)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Rh(),We.commandsServed++,We.lastActivity=Date.now(),r.command==="daemon")return ET(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await TT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1182
+ `).trim(),!r||r.trim().length===0?await wt.unlink(s):await wt.writeFile(s,`${r}
1183
+ `,"utf-8"),!0}catch{return!1}}async function CT(){let s=hT.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=wn.join(s,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=I.getGlobalBasePath();return await x(n)&&await Mh(n,wn.join(t,".prjct-cli")),t}catch{return null}}async function Mh(s,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(s,{withFileTypes:!0});for(let n of t){let r=wn.join(s,n.name),o=wn.join(e,n.name);n.isDirectory()?await Mh(r,o):await wt.copyFile(r,o)}}async function PT(s,e,t){let n=[],r=[];for(let o of s)if(o.exists)try{o.type==="section"?await bT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){r.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||va(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||va("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){r.push(`npm: ${w(o)}`)}}return{deleted:n,errors:r}}async function vT(s){let e=yT.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(s,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Oh(s={},e=process.cwd()){let t=await ST(),n=kT(),r=t.filter(c=>c.exists);if(r.length===0&&!n.homebrew&&!n.npm)return console.log(Ce.yellow(`
1184
+ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Ce.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ce.white("The following will be permanently deleted:")),console.log("");for(let c of r){let u=I.getDisplayPath(c.path),d="";c.type==="section"?d=Ce.dim("(section only)"):c.size&&(d=Ce.dim(`(${$h(c.size)})`)),console.log(` ${Ce.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ce.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${Ce.cyan("Homebrew".padEnd(35))} ${Ce.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${Ce.cyan("npm global".padEnd(35))} ${Ce.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ce.dim(` Total size: ${$h(o)}`)),console.log("")),s.dryRun)return console.log(Ce.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(s.backup){console.log(Ce.blue("Creating backup..."));let c=await CT();c?(console.log(Ce.green(`Backup created: ${I.getDisplayPath(c)}`)),console.log("")):console.log(Ce.yellow("Failed to create backup, continuing..."))}if(!s.force&&(console.log(Ce.yellow('Type "uninstall" to confirm:')),!await vT("> ")))return console.log(Ce.yellow(`
1185
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ce.blue("Removing prjct..."));let{deleted:i,errors:a}=await PT(t,n,s);if(console.log(""),i.length>0&&console.log(Ce.green(`Removed ${i.length} items`)),a.length>0){console.log(Ce.yellow(`
1186
+ ${a.length} errors:`));for(let c of a)console.log(Ce.red(` - ${c}`))}return console.log(""),console.log(Ce.green("prjct has been uninstalled.")),console.log(Ce.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var xa,ho,yo,id=y(()=>{"use strict";An();Se();N();ve();ot();xa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",ho="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(od,"getDirectorySize");l($h,"formatSize");l(wT,"countDirectoryItems");l(kT,"detectInstallation");l(ST,"gatherUninstallItems");l(bT,"removePrjctSection");l(CT,"createBackup");l(Mh,"copyDirectory");l(PT,"performUninstall");l(vT,"promptConfirmation");l(Oh,"uninstall");yo=class extends be{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Oh(e,t)}}});function DT(){for(let[s,e]of Object.entries(fo))z.registerCategory(s,e)}function Lh(){if(z.has("work"))return;DT();let s=l(e=>sr.find(t=>t.name===e),"getMeta");z.registerMethod("task",rr,"now",s("task")),z.registerMethod("done",rr,"done",s("done")),z.registerMethod("next",rr,"next",s("next")),z.registerMethod("pause",rr,"pause",s("pause")),z.registerMethod("resume",rr,"resume",s("resume")),z.registerMethod("workflow",rr,"workflow",s("workflow")),z.registerMethod("init",Ta,"init",s("init")),z.registerMethod("bug",Ta,"bug",s("bug")),z.registerMethod("idea",Ta,"idea",s("idea")),z.registerMethod("spec",Ta,"spec",s("spec")),z.registerMethod("ship",xT,"ship",s("ship")),z.registerMethod("dash",_h,"dash",s("dash")),z.registerMethod("help",_h,"help",s("help")),z.registerMethod("perf",TT,"perf",s("perf")),z.registerMethod("velocity",IT,"velocity",s("velocity")),z.registerMethod("cleanup",or,"cleanup",s("cleanup")),z.registerMethod("design",or,"design",s("design")),z.registerMethod("recover",or,"recover",s("recover")),z.registerMethod("undo",or,"undo",s("undo")),z.registerMethod("redo",or,"redo",s("redo")),z.registerMethod("history",or,"history",s("history")),z.registerMethod("analyze",ir,"analyze",s("analyze")),z.registerMethod("sync",ir,"sync",s("sync")),z.registerMethod("stats",ir,"stats",s("stats")),z.registerMethod("status",ir,"status",s("status")),z.registerMethod("seal",ir,"seal",s("seal")),z.registerMethod("verify",ir,"verify",s("verify")),z.registerMethod("start",Nh,"start",s("start")),z.registerMethod("setup",Nh,"setup",s("setup")),z.registerMethod("uninstall",AT,"uninstall",s("uninstall")),z.registerMethod("update",jT,"update",s("update")),z.registerMethod("context",ET,"context",s("context"))}var rr,Ta,xT,_h,TT,or,ir,Nh,ET,IT,AT,jT,Ea=y(()=>{"use strict";Zi();Au();rd();ju();Uu();Hu();Qi();zs();zu();Ju();id();qu();Ku();sd();rr=new nr,Ta=new as,xT=new Ys,_h=new Ws,TT=new Js,or=new Vs,ir=new ds,Nh=new qs,ET=new ps,IT=new Zs,AT=new yo,jT=new Qs;l(DT,"registerCategories");l(Lh,"registerAllCommands");Lh()});var ad=y(()=>{"use strict";hc();Rh();Ea();zs()});var Hh={};he(Hh,{shutdown:()=>cr,startDaemon:()=>$T});import Ft from"node:fs";import{createServer as RT}from"node:net";async function $T(s){let e=He.socket(),t=He.pid(),n=He.runDir();if(Ft.mkdirSync(n,{recursive:!0}),Ft.existsSync(t)){let r=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);NT(r)&&(console.error(`Daemon already running (PID ${r})`),process.exit(1)),Ft.unlinkSync(t)}if(Ft.existsSync(e)&&Ft.unlinkSync(e),Be={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ma,idleTimer:null},Le=new yn,ar=RT(r=>MT(r)),ar.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Uh()}),ar.on("error",r=>{console.error("Daemon socket error:",r.message),cr(1)}),!s.noHttp)try{let r=process.cwd(),o=await R.getProjectId(r);if(o){let i=s.port||ei;wo=Zo({port:i,projectId:o,projectPath:r,enableLogging:!1}),await wo.start()}}catch{}if(process.on("SIGTERM",()=>cr(0)),process.on("SIGINT",()=>cr(0)),process.on("SIGHUP",()=>{Le=new yn,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}function MT(s){let e="";s.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1187
+ `))!==-1;){let r=e.slice(0,n);if(e=e.slice(n+1),!!r.trim())try{let o=JSON.parse(r),i=await OT(o);s.write(gs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};s.write(gs(i))}}}),s.on("error",()=>{})}async function OT(s){if(!Be||!Le)return{id:s.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Uh(),Be.commandsServed++,Be.lastActivity=Date.now(),s.command==="daemon")return _T(s);if(s.command==="__ping")return{id:s.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await FT(s);return{id:s.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1166
1188
  `)||o.message||void 0,stderr:t.join(`
1167
- `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function TT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Le.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(r.cwd,{json:t.json===!0});case"verify":return Le.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,r.cwd,{md:n});case"done":return Le.done(r.cwd,{md:n});case"next":return Le.next(r.cwd,{md:n});case"pause":return Le.pause(e||"",r.cwd,{md:n});case"resume":return Le.resume(e,r.cwd,{md:n});case"bug":return Le.bug(e||"",r.cwd,{md:n});case"idea":return Le.idea(e||"",r.cwd,{md:n});case"ship":return Le.ship(e,r.cwd,{md:n});case"dash":return Le.dash(e||"default",r.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return G.execute(r.command,e,r.cwd)}}function ET(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ue.socket(),uptime:We?Date.now()-We.startedAt:0,commandsServed:We?.commandsServed??0,lastActivity:We?new Date(We.lastActivity).toISOString():null,registeredCommands:G.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ar(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Rh(){We&&(We.idleTimer&&clearTimeout(We.idleTimer),We.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${We.idleTimeoutMs/1e3/60} minutes, shutting down`),ar(0)},We.idleTimeoutMs),We.idleTimer.unref&&We.idleTimer.unref())}function ar(r){console.log("Daemon shutting down..."),We?.idleTimer&&clearTimeout(We.idleTimer),fo&&(fo.stop(),fo=null),ir&&(ir.close(),ir=null);let e=Ue.socket(),t=Ue.pid();try{Ft.existsSync(e)&&Ft.unlinkSync(e)}catch{}try{Ft.existsSync(t)&&Ft.unlinkSync(t)}catch{}process.exit(r)}function IT(r){try{return process.kill(r,0),!0}catch{return!1}}var ir,fo,Le,We,Mh=y(()=>{"use strict";nd();Gs();Ca();Ve();kc();ho();ir=null,fo=null,Le=null,We=null;l(vT,"startDaemon");l(xT,"handleConnection");l(PT,"handleRequest");l(TT,"executeCommand");l(ET,"handleDaemonCommand");l(Rh,"resetIdleTimer");l(ar,"shutdown");l(IT,"isProcessRunning")});var _h={};fe(_h,{runStart:()=>NT});import _t from"node:fs/promises";import Oh from"node:os";import Yt from"node:path";import B from"chalk";function DT(){console.clear(),console.log(AT),console.log(jT)}function Fh(r,e){console.log(`
1168
- ${B.bold(" Select AI providers to configure:")}
1169
- `),console.log(` ${B.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1170
- `),r.forEach((t,n)=>{let s=n===e?B.cyan("\u276F"):" ",o=t.selected?B.green("[\u2713]"):B.dim("[ ]"),i=t.installed?B.green("(installed)"):B.yellow("(will install)"),a=n===e?B.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function RT(){let r=await cn(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Fh(e,n)},"render");Fh(e,n),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1189
+ `)||o.error||void 0,result:o}}finally{console.log=n,console.error=r}}catch(e){return{id:s.id,success:!1,exitCode:1,stderr:e.message}}}async function FT(s){let e=s.args.join(" ")||null,t=s.options,n=t.md===!0;switch(s.command){case"sync":return Le.sync(s.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(s.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(s.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(s.cwd,{json:t.json===!0});case"verify":return Le.verify(s.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,s.cwd,{md:n});case"done":return Le.done(s.cwd,{md:n});case"next":return Le.next(s.cwd,{md:n});case"pause":return Le.pause(e||"",s.cwd,{md:n});case"resume":return Le.resume(e,s.cwd,{md:n});case"bug":return Le.bug(e||"",s.cwd,{md:n});case"idea":return Le.idea(e||"",s.cwd,{md:n});case"ship":return Le.ship(e,s.cwd,{md:n});case"dash":return Le.dash(e||"default",s.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return z.execute(s.command,e,s.cwd)}}function _T(s){let e=s.args[0];if(e==="status")return{id:s.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:He.socket(),uptime:Be?Date.now()-Be.startedAt:0,commandsServed:Be?.commandsServed??0,lastActivity:Be?new Date(Be.lastActivity).toISOString():null,registeredCommands:z.list().length}};if(e==="stop"){let t={id:s.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>cr(0),100),t}return{id:s.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Uh(){Be&&(Be.idleTimer&&clearTimeout(Be.idleTimer),Be.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Be.idleTimeoutMs/1e3/60} minutes, shutting down`),cr(0)},Be.idleTimeoutMs),Be.idleTimer.unref&&Be.idleTimer.unref())}function cr(s){console.log("Daemon shutting down..."),Be?.idleTimer&&clearTimeout(Be.idleTimer),wo&&(wo.stop(),wo=null),ar&&(ar.close(),ar=null);let e=He.socket(),t=He.pid();try{Ft.existsSync(e)&&Ft.unlinkSync(e)}catch{}try{Ft.existsSync(t)&&Ft.unlinkSync(t)}catch{}process.exit(s)}function NT(s){try{return process.kill(s,0),!0}catch{return!1}}var ar,wo,Le,Be,Gh=y(()=>{"use strict";ad();zs();Ea();qe();Ec();So();ar=null,wo=null,Le=null,Be=null;l($T,"startDaemon");l(MT,"handleConnection");l(OT,"handleRequest");l(FT,"executeCommand");l(_T,"handleDaemonCommand");l(Uh,"resetIdleTimer");l(cr,"shutdown");l(NT,"isProcessRunning")});var Bh={};he(Bh,{runStart:()=>qT});import _t from"node:fs/promises";import zh from"node:os";import Yt from"node:path";import V from"chalk";function HT(){console.clear(),console.log(LT),console.log(UT)}function Wh(s,e){console.log(`
1190
+ ${V.bold(" Select AI providers to configure:")}
1191
+ `),console.log(` ${V.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
1192
+ `),s.forEach((t,n)=>{let r=n===e?V.cyan("\u276F"):" ",o=t.selected?V.green("[\u2713]"):V.dim("[ ]"),i=t.installed?V.green("(installed)"):V.yellow("(will install)"),a=n===e?V.bold(t.displayName):t.displayName;console.log(` ${r} ${o} ${a} ${i}`)}),console.log("")}async function GT(){let s=await cn(),e=[{name:"claude",displayName:"Claude Code",installed:s.claude.installed,selected:s.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:s.gemini.installed,selected:s.gemini.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,r=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Wh(e,n)},"render");Wh(e,n),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
1171
1193
  Cancelled.
1172
1194
  `),process.exit(0)),a==="\r"||a===`
1173
- `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1174
- ${B.bold(" Detected providers:")}
1175
- `),e.forEach(t=>{t.installed&&console.log(` ${B.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function $T(r){let e=Me[r];if(!e.configDir)return!1;try{let t=Yt.join(e.configDir,"commands");await _t.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),Ao)),s=n(),o=r==="claude"?"p.md":"p.toml",i=Yt.join(s,"templates","commands",o),a=Yt.join(t,o);return await P(i)?(await _t.copyFile(i,a),!0):!1}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function MT(r){let e=Me[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Yt.join(e.configDir,"commands"):Yt.join(e.configDir,"commands","p");await _t.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=Tn("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=ye(`commands/${i}`);a&&await _t.writeFile(Yt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} subcommands: ${w(t)}`),!1}}async function OT(r){let e=Me[r];if(!e.configDir)return!1;try{await _t.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),Ao)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Yt.join(n,"templates","global",s),i=Yt.join(e.configDir,s);if(await P(o)){let a=await _t.readFile(o,"utf-8");if(await P(i)){let c=await _t.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await _t.writeFile(i,m+g+p)}else await _t.writeFile(i,`${c}
1176
-
1177
- ${a}`)}else await _t.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${B.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function FT(r){let e=Yt.join(Oh.homedir(),".prjct-cli","config");await _t.mkdir(e,{recursive:!0});let t=Yt.join(e,"installed-editors.json"),n={version:ve,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Yt.join(Oh.homedir(),`.${r[0]}`,"commands")};await _t.writeFile(t,JSON.stringify(n,null,2))}function _T(r){console.log(`
1178
- ${B.green.bold(" \u2713 Setup complete!")}
1179
- `),console.log(` ${B.dim("Configured providers:")}`),r.forEach(e=>{let t=Me[e];console.log(` ${B.green("\u2713")} ${t.displayName}`)}),console.log(`
1180
- ${B.bold("Next steps:")}
1181
-
1182
- ${B.cyan("1.")} Navigate to your project directory
1183
- ${B.cyan("2.")} Run ${B.bold("p. init")} to initialize prjct for that project
1184
- ${B.cyan("3.")} Start tracking with ${B.bold('p. task "your task"')}
1185
-
1186
- ${B.dim("Tips:")}
1187
- ${B.dim("\u2022")} Use ${B.bold("p. sync")} to analyze your codebase
1188
- ${B.dim("\u2022")} Use ${B.bold("p. done")} to complete tasks
1189
- ${B.dim("\u2022")} Use ${B.bold("p. ship")} to create PRs
1190
-
1191
- ${B.dim("Learn more: https://prjct.app/docs")}
1192
- `)}async function NT(){DT();let r=await RT();console.log(`
1193
- ${B.cyan("Setting up...")}
1194
- `);for(let e of r){let t=Me[e];process.stdout.write(` ${B.dim("\u2022")} ${t.displayName}... `);let n=await $T(e),s=await MT(e),o=await OT(e);console.log(n&&s&&o?B.green("\u2713"):n||o?B.yellow("partial"):B.yellow("skipped"))}await FT(r),_T(r)}var cr,lr,ur,dr,pr,AT,jT,Nh=y(()=>{"use strict";En();Be();_();xe();dt();cr=B.rgb(0,255,255),lr=B.rgb(80,180,255),ur=B.rgb(140,120,255),dr=B.rgb(200,80,220),pr=B.rgb(255,80,180),AT=`
1195
-
1196
- ${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${ur(" \u2588\u2588\u2557")}${dr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${pr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1197
- ${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur(" \u2588\u2588\u2551")}${dr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${pr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1198
- ${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur(" \u2588\u2588\u2551")}${dr("\u2588\u2588\u2551 ")}${pr(" \u2588\u2588\u2551 ")}
1199
- ${cr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur("\u2588\u2588 \u2588\u2588\u2551")}${dr("\u2588\u2588\u2551 ")}${pr(" \u2588\u2588\u2551 ")}
1200
- ${cr(" \u2588\u2588\u2551 ")}${lr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${ur("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${dr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${pr(" \u2588\u2588\u2551 ")}
1201
- ${cr(" \u255A\u2550\u255D ")}${lr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${ur(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${dr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${pr(" \u255A\u2550\u255D ")}
1202
-
1203
- `,jT=` ${B.white("Context Layer for AI Agents")} ${B.dim(`v${ve}`)}
1204
-
1205
- ${B.dim(`Project context layer for AI coding agents.
1195
+ `){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),r()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),r()),a===" "&&(e[n].selected=!e[n].selected,r())},"handleKey");process.stdin.on("data",i)}):(console.log(`
1196
+ ${V.bold(" Detected providers:")}
1197
+ `),e.forEach(t=>{t.installed&&console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function zT(s){let e=Me[s];if(!e.configDir)return!1;try{let t=Yt.join(e.configDir,"commands");await _t.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),$o)),r=n(),o=s==="claude"?"p.md":"p.toml",i=Yt.join(r,"templates","commands",o),a=Yt.join(t,o);return await x(i)?(await _t.copyFile(i,a),!0):!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} router: ${w(t)}`),!1}}async function WT(s){let e=Me[s];if(!e.configDir)return!1;try{let t=s==="gemini"?Yt.join(e.configDir,"commands"):Yt.join(e.configDir,"commands","p");await _t.mkdir(t,{recursive:!0});let n=new Set(["p.md","p.toml"]),o=En("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!n.has(i));for(let i of o){let a=fe(`commands/${i}`);a&&await _t.writeFile(Yt.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} subcommands: ${w(t)}`),!1}}async function BT(s){let e=Me[s];if(!e.configDir)return!1;try{await _t.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),$o)),n=t(),r=s==="claude"?"CLAUDE.md":"GEMINI.md",o=Yt.join(n,"templates","global",r),i=Yt.join(e.configDir,r);if(await x(o)){let a=await _t.readFile(o,"utf-8");if(await x(i)){let c=await _t.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await _t.writeFile(i,m+g+p)}else await _t.writeFile(i,`${c}
1198
+
1199
+ ${a}`)}else await _t.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${V.yellow("\u26A0")} Failed to install ${s} config: ${w(t)}`),!1}}async function VT(s){let e=Yt.join(zh.homedir(),".prjct-cli","config");await _t.mkdir(e,{recursive:!0});let t=Yt.join(e,"installed-editors.json"),n={version:Pe,providers:s,editor:s[0],provider:s[0],lastInstall:new Date().toISOString(),path:Yt.join(zh.homedir(),`.${s[0]}`,"commands")};await _t.writeFile(t,JSON.stringify(n,null,2))}function JT(s){console.log(`
1200
+ ${V.green.bold(" \u2713 Setup complete!")}
1201
+ `),console.log(` ${V.dim("Configured providers:")}`),s.forEach(e=>{let t=Me[e];console.log(` ${V.green("\u2713")} ${t.displayName}`)}),console.log(`
1202
+ ${V.bold("Next steps:")}
1203
+
1204
+ ${V.cyan("1.")} Navigate to your project directory
1205
+ ${V.cyan("2.")} Run ${V.bold("p. init")} to initialize prjct for that project
1206
+ ${V.cyan("3.")} Start tracking with ${V.bold('p. task "your task"')}
1207
+
1208
+ ${V.dim("Tips:")}
1209
+ ${V.dim("\u2022")} Use ${V.bold("p. sync")} to analyze your codebase
1210
+ ${V.dim("\u2022")} Use ${V.bold("p. done")} to complete tasks
1211
+ ${V.dim("\u2022")} Use ${V.bold("p. ship")} to create PRs
1212
+
1213
+ ${V.dim("Learn more: https://prjct.app/docs")}
1214
+ `)}async function qT(){HT();let s=await GT();console.log(`
1215
+ ${V.cyan("Setting up...")}
1216
+ `);for(let e of s){let t=Me[e];process.stdout.write(` ${V.dim("\u2022")} ${t.displayName}... `);let n=await zT(e),r=await WT(e),o=await BT(e);console.log(n&&r&&o?V.green("\u2713"):n||o?V.yellow("partial"):V.yellow("skipped"))}await VT(s),JT(s)}var lr,ur,dr,pr,mr,LT,UT,Vh=y(()=>{"use strict";In();Je();N();ve();dt();lr=V.rgb(0,255,255),ur=V.rgb(80,180,255),dr=V.rgb(140,120,255),pr=V.rgb(200,80,220),mr=V.rgb(255,80,180),LT=`
1217
+
1218
+ ${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${dr(" \u2588\u2588\u2557")}${pr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${mr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1219
+ ${lr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${ur(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${dr(" \u2588\u2588\u2551")}${pr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${mr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1220
+ ${lr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${dr(" \u2588\u2588\u2551")}${pr("\u2588\u2588\u2551 ")}${mr(" \u2588\u2588\u2551 ")}
1221
+ ${lr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${ur(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${dr("\u2588\u2588 \u2588\u2588\u2551")}${pr("\u2588\u2588\u2551 ")}${mr(" \u2588\u2588\u2551 ")}
1222
+ ${lr(" \u2588\u2588\u2551 ")}${ur(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${dr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${pr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${mr(" \u2588\u2588\u2551 ")}
1223
+ ${lr(" \u255A\u2550\u255D ")}${ur(" \u255A\u2550\u255D \u255A\u2550\u255D")}${dr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${pr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${mr(" \u255A\u2550\u255D ")}
1224
+
1225
+ `,UT=` ${V.white("Context Layer for AI Agents")} ${V.dim(`v${Pe}`)}
1226
+
1227
+ ${V.dim(`Project context layer for AI coding agents.
1206
1228
  Works with Claude Code, Gemini CLI, and more.`)}
1207
- ${B.cyan("https://prjct.app")}
1208
- `;l(DT,"showBanner");l(Fh,"showProviderSelection");l(RT,"selectProviders");l($T,"installRouter");l(MT,"installSubcommands");l(OT,"installGlobalConfig");l(FT,"saveSetupConfig");l(_T,"showCompletion");l(NT,"runStart")});import{exec as LT}from"node:child_process";import Uh from"node:fs/promises";import on from"node:path";import{promisify as HT}from"node:util";async function mr(r,e=process.cwd(),t={}){let n=on.isAbsolute(r)?r:on.join(e,r),s;try{s=await Uh.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=on.extname(r).toLowerCase(),i=BT[o]||"unknown",a=WT[i]||[],c=await VT(s,a,n,e),u=[];t.reverse&&(u=await qT(r,e));let d;t.depth&&t.depth>0&&(d=await Gh(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function VT(r,e,t,n){let s=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await JT(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function JT(r,e,t){let n=on.dirname(e);if(r.startsWith("@/")){let o=on.join(t,"src",r.slice(2));return Hh(o,t)}let s=on.resolve(n,r);return Hh(s,t)}async function Hh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await Uh.stat(s)).isFile())return on.relative(e,s)}catch{}}return null}async function qT(r,e){let t=[],n=on.basename(r,on.extname(r)),s=on.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await UT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
1209
- `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function Gh(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await mr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Gh(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var UT,Lh,GT,zT,WT,BT,sd=y(()=>{"use strict";_();UT=HT(LT),Lh=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],GT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],zT=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],WT={typescript:Lh,javascript:Lh,python:GT,go:zT},BT={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(mr,"analyzeImports");l(VT,"extractImports");l(JT,"resolveImport");l(Hh,"tryResolve");l(qT,"findImportedBy");l(Gh,"buildDependencyTree")});import zh from"node:fs/promises";import an from"node:path";async function va(r,e=process.cwd()){let t=an.isAbsolute(r)?r:an.join(e,r),n;try{n=await zh.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:es("")};throw p}let s=an.extname(r).toLowerCase(),o=Wh[s]||"unknown",i=await Rn(r,e),a=await mr(r,e),c=YT(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?XT(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=QT(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function rd(r,e=process.cwd(),t={}){let n=an.isAbsolute(r)?r:an.join(e,r),s=[];async function o(i){let a=await zh.readdir(i,{withFileTypes:!0});for(let c of a){let u=an.join(i,c.name),d=an.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=an.extname(c.name).toLowerCase();if(Wh[m]){let p=await va(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function YT(r,e){let t=KT[e]||[],n=r.split(`
1229
+ ${V.cyan("https://prjct.app")}
1230
+ `;l(HT,"showBanner");l(Wh,"showProviderSelection");l(GT,"selectProviders");l(zT,"installRouter");l(WT,"installSubcommands");l(BT,"installGlobalConfig");l(VT,"saveSetupConfig");l(JT,"showCompletion");l(qT,"runStart")});import{exec as KT}from"node:child_process";import Kh from"node:fs/promises";import on from"node:path";import{promisify as YT}from"node:util";async function gr(s,e=process.cwd(),t={}){let n=on.isAbsolute(s)?s:on.join(e,s),r;try{r=await Kh.readFile(n,"utf-8")}catch(g){if(P(g))return{file:s,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=on.extname(s).toLowerCase(),i=tE[o]||"unknown",a=eE[i]||[],c=await nE(r,a,n,e),u=[];t.reverse&&(u=await rE(s,e));let d;t.depth&&t.depth>0&&(d=await Yh(s,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:s,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function nE(s,e,t,n){let r=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(s))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await sE(c,t,n)),r.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return r}async function sE(s,e,t){let n=on.dirname(e);if(s.startsWith("@/")){let o=on.join(t,"src",s.slice(2));return qh(o,t)}let r=on.resolve(n,s);return qh(r,t)}async function qh(s,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let r=s+n;try{if((await Kh.stat(r)).isFile())return on.relative(e,r)}catch{}}return null}async function rE(s,e){let t=[],n=on.basename(s,on.extname(s)),r=on.dirname(s);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await XT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
1231
+ `).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==s);for(let u of c)t.push({file:u})}catch{}return t}async function Yh(s,e,t,n=0,r=new Set){let o={file:s,imports:[],depth:n};if(n>=t||r.has(s))return o;r.add(s);let i=await gr(s,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Yh(a.resolved,e,t,n+1,r);o.imports.push(c)}return o}var XT,Jh,QT,ZT,eE,tE,cd=y(()=>{"use strict";N();XT=YT(KT),Jh=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],QT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],ZT=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],eE={typescript:Jh,javascript:Jh,python:QT,go:ZT},tE={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(gr,"analyzeImports");l(nE,"extractImports");l(sE,"resolveImport");l(qh,"tryResolve");l(rE,"findImportedBy");l(Yh,"buildDependencyTree")});import Xh from"node:fs/promises";import an from"node:path";async function Ia(s,e=process.cwd()){let t=an.isAbsolute(s)?s:an.join(e,s),n;try{n=await Xh.readFile(t,"utf-8")}catch(p){if(P(p))return{file:s,purpose:"File not found",publicAPI:[],dependencies:[],metrics:ts("")};throw p}let r=an.extname(s).toLowerCase(),o=Qh[r]||"unknown",i=await $n(s,e),a=await gr(s,e),c=iE(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?aE(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=cE(c,u,d);return{file:s,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function ld(s,e=process.cwd(),t={}){let n=an.isAbsolute(s)?s:an.join(e,s),r=[];async function o(i){let a=await Xh.readdir(i,{withFileTypes:!0});for(let c of a){let u=an.join(i,c.name),d=an.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let m=an.extname(c.name).toLowerCase();if(Qh[m]){let p=await Ia(d,e);r.push(p)}}}}return l(o,"processDir"),await o(n),r}function iE(s,e){let t=oE[e]||[],n=s.split(`
1210
1232
  `);for(let o=0;o<Math.min(30,n.length);o++){let i=n[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<n.length&&a.start.test(n[u].trim());)c.push(n[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<n.length&&(c+=`${n[u]}
1211
1233
  `,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
1212
- `).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let s=r.split(`
1213
- `)[0]||"";return`Module: ${an.basename(s,an.extname(s))}`}function XT(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1214
- `)[0].trim()}function QT(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
1215
- `)}var KT,Wh,Bh=y(()=>{"use strict";_();sd();Ni();eo();KT={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},Wh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(va,"summarizeFile");l(rd,"summarizeDirectory");l(YT,"extractFilePurpose");l(XT,"extractDescriptionFromDocstring");l(QT,"buildSummaryText")});var Vh=y(()=>{"use strict"});var Jh={};fe(Jh,{analyzeImports:()=>mr,combineMetrics:()=>_i,countTokens:()=>Fi,extractDirectorySignatures:()=>Tl,extractSignatures:()=>Rn,findRelevantFiles:()=>Zn,formatCompressionRate:()=>lv,formatCostSaved:()=>Pl,formatTokenCount:()=>cv,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>es,runContextTool:()=>ZT,summarizeDirectory:()=>rd,summarizeFile:()=>va});async function ZT(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await eE(o,t);break;case"signatures":i=await tE(o,t);break;case"imports":i=await nE(o,t);break;case"recent":i=await sE(o,t);break;case"summary":i=await rE(o,t);break;case"help":return{tool:"error",result:{error:cE(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=oE(i),u=iE(i);return await aE(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function eE(r,e){let t={},n=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await Zn(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function tE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Tl(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=_i(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await Rn(t,e)}}async function nE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await mr(t,e,n)}}async function sE(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await Qr(e,t)}}async function rE(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await rd(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:_i(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await va(t,e)}}function oE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function iE(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function aE(r,e){try{await dn.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function cE(){return`
1234
+ `).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let r=s.split(`
1235
+ `)[0]||"";return`Module: ${an.basename(r,an.extname(r))}`}function aE(s){return s.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
1236
+ `)[0].trim()}function cE(s,e,t){let n=[];if(n.push(`Purpose: ${s}`),n.push(""),e.length>0){n.push("Public API:");for(let r of e){let o=r.description?` - ${r.description}`:"";n.push(` ${r.type} ${r.name}: ${r.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
1237
+ `)}var oE,Qh,Zh=y(()=>{"use strict";N();cd();Gi();eo();oE={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},Qh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ia,"summarizeFile");l(ld,"summarizeDirectory");l(iE,"extractFilePurpose");l(aE,"extractDescriptionFromDocstring");l(cE,"buildSummaryText")});var ey=y(()=>{"use strict"});var ty={};he(ty,{analyzeImports:()=>gr,combineMetrics:()=>Hi,countTokens:()=>Ui,extractDirectorySignatures:()=>Ml,extractSignatures:()=>$n,findRelevantFiles:()=>es,formatCompressionRate:()=>yP,formatCostSaved:()=>$l,formatTokenCount:()=>hP,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>ts,runContextTool:()=>lE,summarizeDirectory:()=>ld,summarizeFile:()=>Ia});async function lE(s,e,t){let n=Date.now(),[r,...o]=s;try{let i;switch(r){case"files":i=await uE(o,t);break;case"signatures":i=await dE(o,t);break;case"imports":i=await pE(o,t);break;case"recent":i=await mE(o,t);break;case"summary":i=await gE(o,t);break;case"help":return{tool:"error",result:{error:wE(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${r}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=fE(i),u=hE(i);return await yE(e,{tool:r,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function uE(s,e){let t={},n=[];for(let i=0;i<s.length;i++)s[i]==="--max"&&s[i+1]?t.maxFiles=parseInt(s[++i],10):s[i]==="--min-score"&&s[i+1]?t.minScore=parseFloat(s[++i]):s[i]==="--include-tests"?t.includeTests=!0:n.push(s[i]);let r=n.join(" ");return r?{tool:"files",result:await es(r,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function dE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),r=await import("node:path"),o=r.isAbsolute(t)?t:r.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await Ml(t,e,{recursive:s.includes("--recursive")||s.includes("-r")}),u=Hi(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await $n(t,e)}}async function pE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let n={};for(let o=1;o<s.length;o++)s[o]==="--reverse"||s[o]==="-r"?n.reverse=!0:(s[o]==="--depth"||s[o]==="-d")&&s[o+1]&&(n.depth=parseInt(s[++o],10));return{tool:"imports",result:await gr(t,e,n)}}async function mE(s,e){let t={};for(let r=0;r<s.length;r++)s[r]==="--branch"||s[r]==="-b"?t.branch=!0:s[r]==="--max"&&s[r+1]?t.maxFiles=parseInt(s[++r],10):/^\d+$/.test(s[r])&&(t.commits=parseInt(s[r],10));return{tool:"recent",result:await Qr(e,t)}}async function gE(s,e){let t=s[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),r=await import("node:path"),o=r.isAbsolute(t)?t:r.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await ld(t,e,{recursive:s.includes("--recursive")||s.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:Hi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ia(t,e)}}function fE(s){if(s.tool==="error")return 0;switch(s.tool){case"signatures":case"summary":return s.result.metrics.tokens.saved;case"files":return s.result.metrics.filesScanned*50-s.result.metrics.filesReturned*50;case"imports":return s.result.metrics.totalImports*20;case"recent":return s.result.metrics.totalFilesChanged*30;default:return 0}}function hE(s){if(s.tool==="error")return 0;switch(s.tool){case"signatures":case"summary":return s.result.metrics.compression;case"files":{let e=s.result.metrics.filesScanned,t=s.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function yE(s,e){try{await dn.recordSync(s,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function wE(){return`
1216
1238
  Context Tools - Smart context filtering for AI agents
1217
1239
 
1218
1240
  USAGE:
@@ -1273,7 +1295,7 @@ TOOLS:
1273
1295
  OUTPUT:
1274
1296
  All tools output JSON for easy parsing by AI agents.
1275
1297
  Each output includes metrics showing token savings.
1276
- `.trim()}var qh=y(()=>{"use strict";Wr();_();le();Oi();sd();vl();Ni();Bh();eo();eo();Vh();l(ZT,"runContextTool");l(eE,"runFilesTool");l(tE,"runSignaturesTool");l(nE,"runImportsTool");l(sE,"runRecentTool");l(rE,"runSummaryTool");l(oE,"getTokensSaved");l(iE,"getCompressionRate");l(aE,"recordToolUsage");l(cE,"getHelpText")});var Qh={};fe(Qh,{hooksService:()=>fE});import He from"node:fs/promises";import Re from"node:path";import vt from"chalk";function Yh(){return`#!/bin/sh
1298
+ `.trim()}var ny=y(()=>{"use strict";Wr();N();le();Li();cd();Dl();Gi();Zh();eo();eo();ey();l(lE,"runContextTool");l(uE,"runFilesTool");l(dE,"runSignaturesTool");l(pE,"runImportsTool");l(mE,"runRecentTool");l(gE,"runSummaryTool");l(fE,"getTokensSaved");l(hE,"getCompressionRate");l(yE,"recordToolUsage");l(wE,"getHelpText")});var iy={};he(iy,{hooksService:()=>xE});import Ue from"node:fs/promises";import Re from"node:path";import vt from"chalk";function ry(){return`#!/bin/sh
1277
1299
  # prjct auto-sync hook (post-commit)
1278
1300
  # Syncs project context after each commit
1279
1301
  # Installed by: prjct hooks install
@@ -1294,7 +1316,7 @@ if command -v prjct >/dev/null 2>&1; then
1294
1316
  fi
1295
1317
 
1296
1318
  exit 0
1297
- `}function Xh(){return`#!/bin/sh
1319
+ `}function oy(){return`#!/bin/sh
1298
1320
  # prjct auto-sync hook (post-checkout)
1299
1321
  # Syncs project context after branch switch
1300
1322
  # Installed by: prjct hooks install
@@ -1326,45 +1348,45 @@ if command -v prjct >/dev/null 2>&1; then
1326
1348
  fi
1327
1349
 
1328
1350
  exit 0
1329
- `}async function od(r){let e=[];return(await P(Re.join(r,"lefthook.yml"))||await P(Re.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P(Re.join(r,".husky"))||await P(Re.join(r,".husky","_")))&&e.push("husky"),await P(Re.join(r,".git"))&&e.push("direct"),e}function Kh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function lE(r,e){let t=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(r,t),s=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
1351
+ `}async function ud(s){let e=[];return(await x(Re.join(s,"lefthook.yml"))||await x(Re.join(s,"lefthook.yaml")))&&e.push("lefthook"),(await x(Re.join(s,".husky"))||await x(Re.join(s,".husky","_")))&&e.push("husky"),await x(Re.join(s,".git"))&&e.push("direct"),e}function sy(s){return s.includes("lefthook")?"lefthook":s.includes("husky")?"husky":"direct"}async function kE(s,e){let t=await x(Re.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(s,t),r=await Ue.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(r.includes(a))continue;let c=`
1330
1352
  ${i}:
1331
1353
  commands:
1332
1354
  ${a}:
1333
1355
  run: prjct sync --quiet --yes
1334
1356
  fail_text: "prjct sync failed (non-blocking)"
1335
- `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(s)?s=s.replace(u,`${i}:
1357
+ `,u=new RegExp(`^${i}:\\s*$`,"m");u.test(r)?r=r.replace(u,`${i}:
1336
1358
  commands:
1337
1359
  ${a}:
1338
1360
  run: prjct sync --quiet --yes
1339
- fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
1340
- ${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function uE(r,e){let t=Re.join(r,".husky");for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?Yh():Xh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
1361
+ fail_text: "prjct sync failed (non-blocking)"`):r=`${r.trimEnd()}
1362
+ ${c}`}return await Ue.writeFile(n,r,"utf-8"),!0}async function SE(s,e){let t=Re.join(s,".husky");for(let n of e){let r=Re.join(t,n),o=n==="post-commit"?ry():oy();if(await x(r)){if((await Ue.readFile(r,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(r,`
1341
1363
  # prjct auto-sync
1342
1364
  prjct sync --quiet --yes &
1343
- `)}else await He.writeFile(s,o,{mode:493})}return!0}async function dE(r,e){let t=Re.join(r,".git","hooks");await P(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?Yh():Xh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
1365
+ `)}else await Ue.writeFile(r,o,{mode:493})}return!0}async function bE(s,e){let t=Re.join(s,".git","hooks");await x(t)||await Ue.mkdir(t,{recursive:!0});for(let n of e){let r=Re.join(t,n),o=n==="post-commit"?ry():oy();if(await x(r)){if((await Ue.readFile(r,"utf-8")).includes("prjct sync"))continue;await Ue.appendFile(r,`
1344
1366
  # prjct auto-sync
1345
1367
  ${o.split(`
1346
1368
  `).slice(1).join(`
1347
- `)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function pE(r){let e=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(r,e);if(!await P(t))return!1;let n=await He.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await He.writeFile(t,`${n.trimEnd()}
1348
- `,"utf-8"),!0}async function mE(r){let e=Re.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
1369
+ `)}`)}else await Ue.writeFile(r,o,{mode:493})}return!0}async function CE(s){let e=await x(Re.join(s,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(s,e);if(!await x(t))return!1;let n=await Ue.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await Ue.writeFile(t,`${n.trimEnd()}
1370
+ `,"utf-8"),!0}async function PE(s){let e=Re.join(s,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await x(n))continue;let r=await Ue.readFile(n,"utf-8");if(!r.includes("prjct sync"))continue;let o=r.split(`
1349
1371
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1350
- `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function gE(r){let e=Re.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=s.split(`
1372
+ `);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await Ue.unlink(n):await Ue.writeFile(n,o,{mode:493})}return!0}async function vE(s){let e=Re.join(s,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await x(n))continue;let r=await Ue.readFile(n,"utf-8");if(r.includes("prjct sync"))if(r.includes("Installed by: prjct hooks install"))await Ue.unlink(n);else{let o=r.split(`
1351
1373
  `).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
1352
- `);await He.writeFile(n,o,{mode:493})}}return!0}var id,fE,Zh=y(()=>{"use strict";Ve();he();_();xe();Gt();l(Yh,"getPostCommitScript");l(Xh,"getPostCheckoutScript");l(od,"detectHookManagers");l(Kh,"selectStrategy");l(lE,"installLefthook");l(uE,"installHusky");l(dE,"installDirect");l(pE,"uninstallLefthook");l(mE,"uninstallHusky");l(gE,"uninstallDirect");id=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await od(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Kh(s);try{let i=!1;switch(o){case"lefthook":i=await lE(e,n);break;case"husky":i=await uE(e,n);break;case"direct":i=await dE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await pE(e);break;case"husky":s=await mE(e);break;case"direct":s=await gE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await od(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){h.start(),h.section("Git Hooks Installation");let t=await od(e),n=Kh(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await P(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await P(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=Re.join(e,".git","hooks",t);return await P(s)?(await He.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=$.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let s=$.getDoc(n,"project")||{};s.hooks=t,$.setDoc(n,"project",s)}catch{}}},fE=new id});var ny={};fe(ny,{DoctorService:()=>xa,doctorService:()=>hE});import{execSync as ad}from"node:child_process";import ey from"node:fs/promises";import ty from"node:path";import Fn from"chalk";var xa,hE,sy=y(()=>{"use strict";Ve();Se();Bt();Gt();dt();xa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=I.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,s,o){try{let a=ad(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e}async checkPrjctConfig(){let e=ty.join(this.projectPath,".prjct","prjct.config.json");try{return await ey.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=ty.join(this.globalPath,"context","CLAUDE.md");try{let t=await ey.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{ad("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=ad("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1353
- `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${ve}`)}printSection(e,t){h.section(e);let n=t.map(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Fn.dim(" (optional)"):"";return`${o} ${i} ${Fn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Fn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Fn.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return Fn.green("\u2713");case"warn":return Fn.yellow("\u26A0");case"error":return t?Fn.dim("\u25CB"):Fn.red("\u2717")}}},hE=new xa});var ry={};fe(ry,{WatchService:()=>Pa,watchService:()=>bE});import yE from"node:path";import tt from"chalk";import wE from"chokidar";var kE,SE,Pa,bE,oy=y(()=>{"use strict";Ve();_();le();ku();kE=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],SE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Pa=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=wE.watch(kE,{cwd:this.projectPath,ignored:SE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(tt.dim(`
1354
- \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(tt.dim(` ${n} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(tt.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
1355
- ${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await ls.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${tt.dim(`[${t}]`)} ${tt.green("\u2713")} Synced${o}`)}}else console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(tt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(tt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(tt.dim(` Project: ${yE.basename(this.projectPath)}`)),console.log(tt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(tt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(tt.dim(" Press Ctrl+C to stop")),console.log("")}},bE=new Pa});var py={};fe(py,{formatAgentCommandHelp:()=>ly,formatCommandHelp:()=>uy,formatCommandList:()=>dy,formatMainHelp:()=>ay,formatTerminalCommandHelp:()=>cy,getHelp:()=>vE});import q from"chalk";function ay(){let r=[];r.push(""),r.push(`${q.cyan.bold("prjct")} v${ve} - Context layer for AI coding agents`),r.push(q.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(q.bold("QUICK START")),r.push(q.dim("\u2500".repeat(60))),r.push(` ${q.green("1.")} prjct start ${q.dim("# Configure AI providers")}`),r.push(` ${q.green("2.")} cd my-project && prjct init`),r.push(` ${q.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${q.green("4.")} p. sync ${q.dim("# Analyze project")}`),r.push(""),r.push(q.bold("TERMINAL COMMANDS")),r.push(q.dim("\u2500".repeat(60)));for(let t of iy){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${q.bold("AI AGENT COMMANDS")} ${q.dim("(inside Claude/Gemini/Cursor)")}`),r.push(q.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${q.dim("\u2500".repeat(56))}`);let e=nr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${q.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(q.bold("FLAGS")),r.push(q.dim("\u2500".repeat(60)));for(let t of CE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(q.bold("MORE INFO")),r.push(q.dim("\u2500".repeat(60))),r.push(` Documentation: ${q.cyan("https://prjct.app")}`),r.push(` GitHub: ${q.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
1356
- `)}function cy(r){let e=iy.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${q.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(q.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(q.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(q.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1357
- `)}function ly(r){let e=nr.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${q.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(q.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(q.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(q.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(q.bold("REQUIREMENTS")),t.push(` ${q.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=po[e.group];return n&&(t.push(q.dim(`Category: ${n.title}`)),e.isOptional&&t.push(q.dim("This is an optional command.")),t.push("")),t.join(`
1358
- `)}function uy(r){let e=cy(r);if(e)return e;let t=ly(r);return t||`
1359
- ${q.yellow(`Command '${r}' not found.`)}
1374
+ `);await Ue.writeFile(n,o,{mode:493})}}return!0}var dd,xE,ay=y(()=>{"use strict";qe();ye();N();ve();Gt();l(ry,"getPostCommitScript");l(oy,"getPostCheckoutScript");l(ud,"detectHookManagers");l(sy,"selectStrategy");l(kE,"installLefthook");l(SE,"installHusky");l(bE,"installDirect");l(CE,"uninstallLefthook");l(PE,"uninstallHusky");l(vE,"uninstallDirect");dd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],r=await ud(e);if(r.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||sy(r);try{let i=!1;switch(o){case"lefthook":i=await kE(e,n);break;case"husky":i=await SE(e,n);break;case"direct":i=await bE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",r=!1;switch(n){case"lefthook":r=await CE(e);break;case"husky":r=await PE(e);break;case"direct":r=await vE(e);break}return r&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:r}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await ud(e),n=await this.getHookConfig(e),r=["post-commit","post-checkout"],o=await Promise.all(r.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){h.start(),h.section("Git Hooks Installation");let t=await ud(e),n=sy(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let r=await this.install(e,{strategy:n});if(r.success){h.done(`Hooks installed via ${r.strategy}`),console.log("");for(let o of r.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(r.error||"Failed to install hooks");return console.log(""),h.end(),r.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let r=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${r} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await x(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await x(i)?(await Ue.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await x(o)?(await Ue.readFile(o,"utf-8")).includes("prjct sync"):!1}let r=Re.join(e,".git","hooks",t);return await x(r)?(await Ue.readFile(r,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await x(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=M.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let r=M.getDoc(n,"project")||{};r.hooks=t,M.setDoc(n,"project",r)}catch{}}},xE=new dd});var uy={};he(uy,{DoctorService:()=>Aa,doctorService:()=>TE});import{execSync as pd}from"node:child_process";import cy from"node:fs/promises";import ly from"node:path";import _n from"chalk";var Aa,TE,dy=y(()=>{"use strict";qe();Se();Bt();Gt();dt();Aa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=I.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),r=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:r,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,n,r,o){try{let a=pd(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:r}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:r}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e}async checkPrjctConfig(){let e=ly.join(this.projectPath,".prjct","prjct.config.json");try{return await cy.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=ly.join(this.globalPath,"context","CLAUDE.md");try{let t=await cy.stat(e),n=Date.now()-t.mtimeMs,r=Math.floor(n/(1e3*60*60)),o=Math.floor(r/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:r>0?i=`${r} hour${r>1?"s":""} ago`:i="recently",r>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{pd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=pd("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
1375
+ `).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${Pe}`)}printSection(e,t){h.section(e);let n=t.map(r=>{let o=this.getStatusIcon(r.status,r.optional),i=r.name.padEnd(14),a=r.version||r.message||"",c=r.optional&&r.status==="error"?_n.dim(" (optional)"):"";return`${o} ${i} ${_n.dim(a)}${c}`});for(let r of n)console.log(` ${r}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:_n.yellow("\u2022")})}printSummary(e){console.log(""),console.log(_n.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return _n.green("\u2713");case"warn":return _n.yellow("\u26A0");case"error":return t?_n.dim("\u25CB"):_n.red("\u2717")}}},TE=new Aa});var py={};he(py,{WatchService:()=>ja,watchService:()=>DE});import EE from"node:path";import st from"chalk";import IE from"chokidar";var AE,jE,ja,DE,my=y(()=>{"use strict";qe();N();le();vu();AE=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],jE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],ja=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=IE.watch(AE,{cwd:this.projectPath,ignored:jE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(st.dim(`
1376
+ \u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(st.dim(` ${n} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(st.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
1377
+ ${st.dim(`[${t}]`)} ${st.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await us.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let r=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=r.length>0?` [${r.join(", ")}]`:"";console.log(`${st.dim(`[${t}]`)} ${st.green("\u2713")} Synced${o}`)}}else console.error(`${st.dim(`[${t}]`)} ${st.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${st.dim(`[${t}]`)} ${st.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(st.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(st.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(st.dim(` Project: ${EE.basename(this.projectPath)}`)),console.log(st.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(st.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(st.dim(" Press Ctrl+C to stop")),console.log("")}},DE=new ja});var Sy={};he(Sy,{formatAgentCommandHelp:()=>yy,formatCommandHelp:()=>wy,formatCommandList:()=>ky,formatMainHelp:()=>fy,formatTerminalCommandHelp:()=>hy,getHelp:()=>$E});import K from"chalk";function fy(){let s=[];s.push(""),s.push(`${K.cyan.bold("prjct")} v${Pe} - Context layer for AI coding agents`),s.push(K.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),s.push(""),s.push(K.bold("QUICK START")),s.push(K.dim("\u2500".repeat(60))),s.push(` ${K.green("1.")} prjct start ${K.dim("# Configure AI providers")}`),s.push(` ${K.green("2.")} cd my-project && prjct init`),s.push(` ${K.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),s.push(` ${K.green("4.")} p. sync ${K.dim("# Analyze project")}`),s.push(""),s.push(K.bold("TERMINAL COMMANDS")),s.push(K.dim("\u2500".repeat(60)));for(let t of gy){let n=`prjct ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(""),s.push(`${K.bold("AI AGENT COMMANDS")} ${K.dim("(inside Claude/Gemini/Cursor)")}`),s.push(K.dim("\u2500".repeat(60))),s.push(` ${"Command".padEnd(22)} Description`),s.push(` ${K.dim("\u2500".repeat(56))}`);let e=sr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);s.push(` ${n} ${t.description}`)}s.push(` ${K.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),s.push(""),s.push(K.bold("FLAGS")),s.push(K.dim("\u2500".repeat(60)));for(let t of RE)s.push(` ${t.flag.padEnd(22)} ${t.description}`);return s.push(""),s.push(K.bold("MORE INFO")),s.push(K.dim("\u2500".repeat(60))),s.push(` Documentation: ${K.cyan("https://prjct.app")}`),s.push(` GitHub: ${K.cyan("https://github.com/jlopezlira/prjct-cli")}`),s.push(" Per-command: prjct help <command>"),s.push(""),s.join(`
1378
+ `)}function hy(s){let e=gy.find(n=>n.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(K.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(K.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
1379
+ `)}function yy(s){let e=sr.find(r=>r.name===s);if(!e)return null;let t=[];if(t.push(""),t.push(`${K.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(K.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(K.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(K.bold("FEATURES"));for(let r of e.features)t.push(` \u2022 ${r}`);t.push("")}e.blockingRules&&(t.push(K.bold("REQUIREMENTS")),t.push(` ${K.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=fo[e.group];return n&&(t.push(K.dim(`Category: ${n.title}`)),e.isOptional&&t.push(K.dim("This is an optional command.")),t.push("")),t.join(`
1380
+ `)}function wy(s){let e=hy(s);if(e)return e;let t=yy(s);return t||`
1381
+ ${K.yellow(`Command '${s}' not found.`)}
1360
1382
 
1361
1383
  Run 'prjct help' to see all available commands.
1362
- `}function dy(){let r=[];r.push(""),r.push(q.cyan.bold("All Commands")),r.push("");let e=Object.entries(po).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=nr.filter(o=>o.group===t);if(s.length!==0){r.push(`${q.bold(n.title)} ${q.dim(`(${s.length} commands)`)}`),r.push(q.dim(n.description)),r.push("");for(let o of s){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(q.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1363
- `)}function vE(r){return r?r==="commands"||r==="all"?dy():uy(r):ay()}var iy,CE,my=y(()=>{"use strict";Zu();dt();iy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],CE=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(ay,"formatMainHelp");l(cy,"formatTerminalCommandHelp");l(ly,"formatAgentCommandHelp");l(uy,"formatCommandHelp");l(dy,"formatCommandList");l(vE,"getHelp")});var wy={};fe(wy,{installAntigravitySkill:()=>yy,needsAntigravityInstallation:()=>IE,run:()=>hy});import{execSync as xE}from"node:child_process";import K from"node:fs/promises";import ps from"node:os";import oe from"node:path";import ge from"chalk";async function PE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_s.isAvailable("npm"))return console.log(`${ge.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ge.dim(`Install ${r.displayName} using one of:`)}`),console.log(ge.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ge.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(ge.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ge.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),xE(`npm install -g ${e}`,{stdio:"inherit",timeout:Is("NPM_INSTALL")}),console.log(""),console.log(`${ge.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(ge.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(ge.dim("The npm install took too long. Try:")),console.log(ge.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ge.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ge.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(ge.dim("Alternative installation methods:")),console.log(ge.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ge.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ge.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ge.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function hy(){let r=await cn(),e=await Fa(),t=Me[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let i of s){let a=Me[i],c=r[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!c.installed)if(i===e.provider)if(await PE(a))u.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Ee.detectClaude()){let m=await Ee.syncCommands();m.success&&(u.commandsAdded=m.added,u.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let p=await Ee.installGlobalConfig();p.success&&(u.configAction=p.action,n.configAction||(n.configAction=p.action)),await Ee.installDocs(),await jE(),await DE()}}else if(i==="gemini"){await TE()&&(u.commandsAdded=1,n.commandsAdded+=1);let m=await EE();m.success&&(u.configAction=m.action)}n.providers.push(u)}(await Ss()).installed&&(await yy()).success&&console.log(` ${ge.green("\u2713")} Antigravity skill installed`),await Va.saveConfig(ve,await Ee.getInstallPath(),e.provider),await AE();for(let i of n.providers)RE(i,Me[i.provider]);return n}async function TE(){try{let r=oe.join(ps.homedir(),".gemini","commands"),e=oe.join(r,"p.toml");await K.mkdir(r,{recursive:!0});let t=ye("commands/p.toml");if(t)return await K.writeFile(e,t,"utf-8"),!0;let n=oe.join(pe,"templates","commands","p.toml");return await P(n)?(await K.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function EE(){try{let r=oe.join(ps.homedir(),".gemini"),e=oe.join(r,"GEMINI.md");await K.mkdir(r,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=oe.join(pe,"templates","global","GEMINI.md");t=await K.readFile(p,"utf-8")}let n="",s=!1;try{n=await K.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await K.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
1384
+ `}function ky(){let s=[];s.push(""),s.push(K.cyan.bold("All Commands")),s.push("");let e=Object.entries(fo).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=sr.filter(o=>o.group===t);if(r.length!==0){s.push(`${K.bold(n.title)} ${K.dim(`(${r.length} commands)`)}`),s.push(K.dim(n.description)),s.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;s.push(` ${i} ${a}`)}s.push("")}}return s.push(K.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
1385
+ `)}function $E(s){return s?s==="commands"||s==="all"?ky():wy(s):fy()}var gy,RE,by=y(()=>{"use strict";rd();dt();gy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],RE=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(fy,"formatMainHelp");l(hy,"formatTerminalCommandHelp");l(yy,"formatAgentCommandHelp");l(wy,"formatCommandHelp");l(ky,"formatCommandList");l($E,"getHelp")});var Ey={};he(Ey,{installAntigravitySkill:()=>xy,installCodexSkill:()=>Ty,needsAntigravityInstallation:()=>NE,run:()=>vy});import{execSync as ME}from"node:child_process";import J from"node:fs/promises";import Nn from"node:os";import Z from"node:path";import me from"chalk";async function OE(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!_s.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${s.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${s.displayName} not found. Installing...`)),console.log(""),ME(`npm install -g ${e}`,{stdio:"inherit",timeout:Is("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${s.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${s.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function vy(){let s=await cn(),e=await Wa(),t=Me[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=Me[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await OE(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ee.detectClaude()){let p=await Ee.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ee.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ee.installDocs(),await UE(),await HE()}}else if(a==="gemini"){await FE()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await _E();p.success&&(d.configAction=p.action)}n.providers.push(d)}(await Ss()).installed&&(await xy()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await za()).installed&&(await Ty()).success&&console.log(` ${me.green("\u2713")} Codex skill installed`),await ec.saveConfig(Pe,await Ee.getInstallPath(),e.provider),await LE();for(let a of n.providers)GE(a,Me[a.provider]);return n}async function FE(){try{let s=Z.join(Nn.homedir(),".gemini","commands"),e=Z.join(s,"p.toml");await J.mkdir(s,{recursive:!0});let t=fe("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=Z.join(de,"templates","commands","p.toml");return await x(n)?(await J.copyFile(n,e),!0):!1}catch(s){return U.warn(`Gemini router warning: ${w(s)}`),!1}}async function _E(){try{let s=Z.join(Nn.homedir(),".gemini"),e=Z.join(s,"GEMINI.md");await J.mkdir(s,{recursive:!0});let t=fe("global/GEMINI.md");if(!t){let p=Z.join(de,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",r=!1;try{n=await J.readFile(e,"utf-8"),r=!0}catch(p){if(P(p))r=!1;else throw p}if(!r)return await J.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
1364
1386
 
1365
- ${t}`;return await K.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await K.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function yy(){try{let r=oe.join(ps.homedir(),".gemini","antigravity","skills"),e=oe.join(r,"prjct"),t=oe.join(e,"SKILL.md");await K.mkdir(e,{recursive:!0});let n=await P(t),s=ye("antigravity/SKILL.md");if(!s){let o=oe.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await K.readFile(o,"utf-8")}return await K.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function IE(){let r=await Ss();return r.installed&&!r.skillInstalled}async function AE(){try{let r=oe.join(ps.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await K.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=$.getDoc(n,"project");if(!s)continue;s.cliVersion!==ve&&(s.cliVersion=ve,$.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${ge.green("\u2713")} Updated ${t} project(s) to v${ve}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function gy(r,e){let t={};if(await P(r))try{t=JSON.parse(await K.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await K.writeFile(r,JSON.stringify(t,null,2))}async function jE(){try{let r=oe.join(ps.homedir(),".claude"),e=oe.join(r,"settings.json"),t=oe.join(r,"prjct-statusline.sh"),n=oe.join(ps.homedir(),".prjct-cli","statusline"),s=oe.join(n,"statusline.sh"),o=oe.join(n,"themes"),i=oe.join(n,"lib"),a=oe.join(n,"components"),c=oe.join(n,"config.json"),u=oe.join(pe,"assets","statusline"),d=oe.join(u,"statusline.sh"),m=oe.join(u,"themes"),p=oe.join(u,"lib"),g=oe.join(u,"components"),f=oe.join(u,"default-config.json");if(await P(r)||await K.mkdir(r,{recursive:!0}),await P(n)||await K.mkdir(n,{recursive:!0}),await P(o)||await K.mkdir(o,{recursive:!0}),await P(i)||await K.mkdir(i,{recursive:!0}),await P(a)||await K.mkdir(a,{recursive:!0}),await P(s)){let k=await K.readFile(s,"utf8");if(k.includes("CLI_VERSION=")){let b=k.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==ve){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`);await K.writeFile(s,D,{mode:493})}await Ta(p,i),await Ta(g,a),await fy(t,s),await gy(e,t);return}}if(await P(d)){let k=await K.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`),await K.writeFile(s,k,{mode:493}),await Ta(p,i),await Ta(g,a),await P(m)){let b=await K.readdir(m);for(let D of b){let x=oe.join(m,D),O=oe.join(o,D);await K.copyFile(x,O)}}!await P(c)&&await P(f)&&await K.copyFile(f,c)}else{let k=`#!/bin/bash
1387
+ ${t}`;return await J.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await J.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(s){return U.warn(`Gemini config warning: ${w(s)}`),{success:!1,action:null}}}async function xy(){try{let s=Z.join(Nn.homedir(),".gemini","antigravity","skills"),e=Z.join(s,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await x(t),r=fe("antigravity/SKILL.md");if(!r){let o=Z.join(de,"templates","antigravity","SKILL.md");if(!await x(o))return U.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await J.readFile(o,"utf-8")}return await J.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return U.warn(`Antigravity skill warning: ${w(s)}`),{success:!1,action:null}}}async function NE(){let s=await Ss();return s.installed&&!s.skillInstalled}async function Ty(){try{let s=Z.join(Nn.homedir(),".codex","skills"),e=Z.join(s,"prjct"),t=Z.join(e,"SKILL.md");await J.mkdir(e,{recursive:!0});let n=await x(t),r=fe("codex/SKILL.md");if(!r){let o=Z.join(de,"templates","codex","SKILL.md");if(!await x(o))return U.warn("Codex SKILL.md template not found"),{success:!1,action:null};r=await J.readFile(o,"utf-8")}return await J.writeFile(t,r,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(s){return U.warn(`Codex skill warning: ${w(s)}`),{success:!1,action:null}}}async function LE(){try{let s=Z.join(Nn.homedir(),".prjct-cli","projects");if(!await x(s))return;let e=(await J.readdir(s,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let r=M.getDoc(n,"project");if(!r)continue;r.cliVersion!==Pe&&(r.cliVersion=Pe,M.setDoc(n,"project",r),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${Pe}`)}catch(s){P(s)||U.warn(`Migration warning: ${w(s)}`)}}async function Cy(s,e){let t={};if(await x(s))try{t=JSON.parse(await J.readFile(s,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await J.writeFile(s,JSON.stringify(t,null,2))}async function UE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"settings.json"),t=Z.join(s,"prjct-statusline.sh"),n=Z.join(Nn.homedir(),".prjct-cli","statusline"),r=Z.join(n,"statusline.sh"),o=Z.join(n,"themes"),i=Z.join(n,"lib"),a=Z.join(n,"components"),c=Z.join(n,"config.json"),u=Z.join(de,"assets","statusline"),d=Z.join(u,"statusline.sh"),m=Z.join(u,"themes"),p=Z.join(u,"lib"),g=Z.join(u,"components"),f=Z.join(u,"default-config.json");if(await x(s)||await J.mkdir(s,{recursive:!0}),await x(n)||await J.mkdir(n,{recursive:!0}),await x(o)||await J.mkdir(o,{recursive:!0}),await x(i)||await J.mkdir(i,{recursive:!0}),await x(a)||await J.mkdir(a,{recursive:!0}),await x(r)){let k=await J.readFile(r,"utf8");if(k.includes("CLI_VERSION=")){let b=k.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==Pe){let D=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`);await J.writeFile(r,D,{mode:493})}await Da(p,i),await Da(g,a),await Py(t,r),await Cy(e,t);return}}if(await x(d)){let k=await J.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${Pe}"`),await J.writeFile(r,k,{mode:493}),await Da(p,i),await Da(g,a),await x(m)){let b=await J.readdir(m);for(let D of b){let v=Z.join(m,D),$=Z.join(o,D);await J.copyFile(v,$)}}!await x(c)&&await x(f)&&await J.copyFile(f,c)}else{let k=`#!/bin/bash
1366
1388
  # prjct Status Line for Claude Code
1367
- CLI_VERSION="${ve}"
1389
+ CLI_VERSION="${Pe}"
1368
1390
  input=$(cat)
1369
1391
  CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
1370
1392
  CONFIG="$CWD/.prjct/prjct.config.json"
@@ -1393,14 +1415,14 @@ if [ -f "$CONFIG" ]; then
1393
1415
  fi
1394
1416
  fi
1395
1417
  echo "prjct"
1396
- `;await K.writeFile(s,k,{mode:493})}await fy(t,s),await gy(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function DE(){try{let r=oe.join(ps.homedir(),".claude"),e=oe.join(r,"mcp.json");await P(r)||await K.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await K.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await K.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await K.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function Ta(r,e){if(!await P(r))return;let t=await K.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=oe.join(r,n),o=oe.join(e,n);await K.copyFile(s,o),await K.chmod(o,493)}}async function fy(r,e){try{if(await P(r)){if((await K.lstat(r)).isSymbolicLink()&&await K.readlink(r)===e)return;await K.unlink(r)}await K.symlink(e,r)}catch{try{await P(e)&&(await K.copyFile(e,r),await K.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function RE(r,e){if(console.log(""),r.cliInstalled?console.log(` ${ge.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ge.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${ge.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${ge.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${ge.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${ge.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${ge.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var $E,ky=y(()=>{"use strict";En();Si();he();_();un();xe();Un();dt();Be();In();Ja();l(PE,"installAICLI");l(hy,"run");l(TE,"installGeminiRouter");l(EE,"installGeminiGlobalConfig");l(yy,"installAntigravitySkill");l(IE,"needsAntigravityInstallation");l(AE,"migrateProjectsCliVersion");l(gy,"ensureStatusLineSettings");l(jE,"installStatusLine");l(DE,"installContext7MCP");l(Ta,"installStatusLineModules");l(fy,"ensureStatusLineSymlink");l(RE,"showResults");$E=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");$E&&hy().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var Sy=jy((lq,ME)=>{ME.exports={name:"prjct-cli",version:"1.29.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var GE={};import by from"node:os";import Ea from"node:path";import $e from"chalk";async function OE(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Dy(Sy()));await HE(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(UE(),process.exit(0)),h.start();try{let t=G.getByName(r);if(!t){let d=_E(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Wn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=LE(t,e),o=FE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await Pn.expireIfStale(i),await Pn.touch(i))}catch{}let c=new yn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await Pn.trackCommand(i,r,d)}catch{}try{await Bn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Bn.recordTiming(i,"startup_time",p)}await Bn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(wo(t)),h.end(),process.exit(1)}}function FE(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Wn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function _E(r){let e=G.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=NE(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function NE(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function LE(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function HE(r){let e=await cn(),t=Ea.join(by.homedir(),".claude","commands","p.md"),n=Ea.join(by.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Ea.join(process.cwd(),".cursor","commands","sync.md")),P(Ea.join(process.cwd(),".cursor"))]),c=await Ss();if(console.log(`
1397
- ${$e.cyan("p/")} prjct v${r}
1418
+ `;await J.writeFile(r,k,{mode:493})}await Py(t,r),await Cy(e,t)}catch(s){P(s)||U.warn(`Status line warning: ${w(s)}`)}}async function HE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"mcp.json");await x(s)||await J.mkdir(s,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await x(e)){let n=await J.readFile(e,"utf-8"),r=JSON.parse(n);if(r.mcpServers?.context7)return;r.mcpServers=r.mcpServers||{},r.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(r,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(s){U.warn(`Context7 MCP setup warning: ${w(s)}`)}}async function Da(s,e){if(!await x(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=Z.join(s,n),o=Z.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function Py(s,e){try{if(await x(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await x(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function GE(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var zE,Iy=y(()=>{"use strict";In();vi();ye();N();un();ve();Gn();dt();Je();An();tc();l(OE,"installAICLI");l(vy,"run");l(FE,"installGeminiRouter");l(_E,"installGeminiGlobalConfig");l(xy,"installAntigravitySkill");l(NE,"needsAntigravityInstallation");l(Ty,"installCodexSkill");l(LE,"migrateProjectsCliVersion");l(Cy,"ensureStatusLineSettings");l(UE,"installStatusLine");l(HE,"installContext7MCP");l(Da,"installStatusLineModules");l(Py,"ensureStatusLineSymlink");l(GE,"showResults");zE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");zE&&vy().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});var Ay=Ly((kq,WE)=>{WE.exports={name:"prjct-cli",version:"1.30.1",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var QE={};import jy from"node:os";import Ra from"node:path";import $e from"chalk";async function BE(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let t=await Promise.resolve().then(()=>Uy(Ay()));await YE(t.version),process.exit(0)}["-h","--help",void 0].includes(s)&&(XE(),process.exit(0)),h.start();try{let t=z.getByName(s);if(!t){let d=JE(s),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Bn("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${s}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:r}=KE(t,e),o=VE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await Tn.expireIfStale(i),await Tn.touch(i))}catch{}let c=new yn,u;if(s==="design"){let d=n.join(" ");u=await c.design(d,r)}else if(s==="analyze")u=await c.analyze(r);else if(s==="cleanup")u=await c.cleanup(r);else if(s==="setup")u=await c.setup(r);else if(s==="update")u=await c.update(r);else{let d=n.join(" ")||null,m=r.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:r.json===!0,export:r.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:r.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:r.agents?String(r.agents).split(","):void 0,preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:m,package:r.package?String(r.package):void 0,full:r.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:r.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:r.json===!0,semantic:r.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[s];if(g)u=await g(d);else throw new Error(`Command '${s}' has no handler`)}if(i){let d=Date.now()-a;try{await Tn.trackCommand(i,s,d)}catch{}try{await Vn.recordTiming(i,"command_duration",d,{command:s});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Vn.recordTiming(i,"startup_time",p)}await Vn.recordMemory(i,{command:s})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Co(t)),h.end(),process.exit(1)}}function VE(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return Bn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function JE(s){let e=z.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=qE(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function qE(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][n]}function KE(s,e){let t=[],n={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function YE(s){let e=await cn(),t=Ra.join(jy.homedir(),".claude","commands","p.md"),n=Ra.join(jy.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([x(t),x(n),x(Ra.join(process.cwd(),".cursor","commands","sync.md")),x(Ra.join(process.cwd(),".cursor"))]),c=await Ss();if(console.log(`
1419
+ ${$e.cyan("p/")} prjct v${s}
1398
1420
  ${$e.dim("Context layer for AI coding agents")}
1399
1421
 
1400
- ${$e.dim("Providers:")}`),e.claude.installed){let u=s?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
1422
+ ${$e.dim("Providers:")}`),e.claude.installed){let u=r?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
1401
1423
  ${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1402
1424
  ${$e.cyan("https://prjct.app")}
1403
- `)}function UE(){console.log(`
1425
+ `)}function XE(){console.log(`
1404
1426
  prjct - Context layer for AI coding agents
1405
1427
  Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
1406
1428
 
@@ -1459,15 +1481,15 @@ MORE INFO
1459
1481
  ---------
1460
1482
  Documentation: https://prjct.app
1461
1483
  GitHub: https://github.com/jlopezlira/prjct-cli
1462
- `)}var Cy=y(()=>{"use strict";nd();Gs();Ca();Be();Ve();ei();Zo();_();Fr();xe();Gt();l(OE,"main");l(FE,"validateCommandParams");l(_E,"findClosestCommand");l(NE,"editDistance");l(LE,"parseCommandArgs");l(HE,"displayVersion");l(UE,"displayHelp");OE().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(wo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var gr=process.argv.slice(2),cd=gr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),zE=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(cd&&!zE.has(cd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(ho(),dd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(fs(),gs)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<gr.length;a++){let c=gr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<gr.length&&!gr[a+1].startsWith("--")?i[u]=gr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:cd,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function WE(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Be(),ut)),s=(await Promise.resolve().then(()=>(Ve(),Od))).default,o=(await Promise.resolve().then(()=>(Ja(),_d))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(kc(),Op)),{fileExists:c}=await Promise.resolve().then(()=>(xe(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>($a(),xd)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),Ao));async function m(){let x=r.homedir(),O=await n();if(O.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(O.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!O.claude.installed&&!O.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(Gt(),Lp));x(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(x){let O=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:J}=await Promise.resolve().then(()=>(Zo(),Gp));return await J.expireIfStale(F),await J.touch(F),()=>{let ne=Date.now()-O;J.trackCommand(F,x,ne).catch(()=>{}),Promise.resolve().then(()=>(ei(),Wp)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ne,{command:x}).catch(()=>{}),S.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:O,spawnDaemon:F}=await Promise.resolve().then(()=>(fs(),gs));if(await O())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ne}=await Promise.resolve().then(()=>(Mh(),$h)),S=parseInt(p.find(Z=>Z.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await ne({port:S,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(x==="stop"){let{isDaemonRunning:O,stopDaemon:F}=await Promise.resolve().then(()=>(fs(),gs));if(await O()){let J=await F();console.log(J?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=J?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:O}=await Promise.resolve().then(()=>(fs(),gs)),F=await O();if(F.running){let J=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${J}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(Nh(),_h));await x()}else if(p[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(p[0]==="web"||p[0]==="serve")try{let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(O,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:J}=await Promise.resolve().then(()=>(qh(),Jh)),ne=await J(p.slice(1),O,x);console.log(JSON.stringify(ne,null,2)),process.exitCode=ne.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:O}=await Promise.resolve().then(()=>(Zh(),Qh)),F=p[1]||"status",J=await O.run(process.cwd(),F);process.exitCode=J,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:O}=await Promise.resolve().then(()=>(sy(),ny)),F=await O.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(td(),Ih)),O=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),J=p.includes("--dry-run")||p.includes("-n"),ne=p.includes("--keep-package"),S=await x({force:O,backup:F,dryRun:J,keepPackage:ne});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(oy(),ry)),J=p.includes("--verbose")||p.includes("-v"),ne=p.find(it=>it.startsWith("--debounce=")),S=ne?parseInt(ne.split("=")[1],10):void 0,j=p.find(it=>it.startsWith("--interval=")),Z=j?parseInt(j.split("=")[1],10)*1e3:void 0,N=await F.start(x,{verbose:J,quiet:f,debounceMs:S,minIntervalMs:Z});N.success||(console.error(N.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),O=await import("node:fs"),F=process.cwd(),J=await s.getProjectId(F);if(!J)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let ne=e.join(__dirname,"..","core","cli","linear.ts"),S=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),Z,N;if(O.existsSync(ne)?(Z=ne,N="bun"):O.existsSync(j)?(Z=j,N="node"):O.existsSync(S)?(Z=S,N="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,Z="",N=""),Z){let it=["--project",J,...p.slice(1)];x(N,[Z,...it],{stdio:"inherit",cwd:F}).on("close",fr=>{process.exitCode=fr||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(my(),py)),O=p[1];console.log(x(O)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),O=r.homedir(),F=process.cwd(),[J,ne,S,j,Z,N]=await Promise.all([c(e.join(O,".claude","commands","p.md")),c(e.join(O,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
1484
+ `)}var Dy=y(()=>{"use strict";ad();zs();Ea();Je();qe();ri();si();N();Fr();ve();Gt();l(BE,"main");l(VE,"validateCommandParams");l(JE,"findClosestCommand");l(qE,"editDistance");l(KE,"parseCommandArgs");l(YE,"displayVersion");l(XE,"displayHelp");BE().catch(s=>{console.error("Fatal error:",w(s)),process.env.DEBUG&&console.error(Co(s)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var fr=process.argv.slice(2),md=fr.find(s=>!s.startsWith("--")&&!s.startsWith("-")),ZE=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(md&&!ZE.has(md)&&process.env.PRJCT_NO_DAEMON!=="1"){let s=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(So(),hd)),t=e.socket();if(s.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(hs(),fs)),r=await import("node:crypto"),o=[],i={};for(let a=0;a<fr.length;a++){let c=fr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<fr.length&&!fr[a+1].startsWith("--")?i[u]=fr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:r.randomUUID(),command:md,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function eI(){let s=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Je(),ut)),r=(await Promise.resolve().then(()=>(qe(),Hd))).default,o=(await Promise.resolve().then(()=>(tc(),zd))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Ec(),Hp)),{fileExists:c}=await Promise.resolve().then(()=>(ve(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(La(),Ad)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),$o));async function m(){let v=s.homedir(),$=await n();if($.claude.installed){let F=e.join(v,".claude","commands","p.md");if(!await c(F))return!1}if($.gemini.installed){let F=e.join(v,".gemini","commands","p.toml");if(!await c(F))return!1}return!$.claude.installed&&!$.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(v=>v==="--quiet"||v==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:v}=await Promise.resolve().then(()=>(Gt(),Bp));v(!0)}let k=p.indexOf("--refresh"),b=k!==-1;b&&(p.splice(k,1),await u());async function D(v){let $=Date.now();try{let F=await r.getProjectId(process.cwd());if(F){let{sessionTracker:H}=await Promise.resolve().then(()=>(si(),qp));return await H.expireIfStale(F),await H.touch(F),()=>{let ee=Date.now()-$;H.trackCommand(F,v,ee).catch(()=>{}),Promise.resolve().then(()=>(ri(),Yp)).then(({performanceTracker:S})=>{S.recordTiming(F,"command_duration",ee,{command:v}).catch(()=>{}),S.recordMemory(F,{command:v}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let v=p[1]||"status";if(v==="start"){let{isDaemonRunning:$,spawnDaemon:F}=await Promise.resolve().then(()=>(hs(),fs));if(await $())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:ee}=await Promise.resolve().then(()=>(Gh(),Hh)),S=parseInt(p.find(te=>te.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await ee({port:S,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(v==="stop"){let{isDaemonRunning:$,stopDaemon:F}=await Promise.resolve().then(()=>(hs(),fs));if(await $()){let H=await F();console.log(H?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=H?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(v==="status"){let{getDaemonStatus:$}=await Promise.resolve().then(()=>(hs(),fs)),F=await $();if(F.running){let H=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${H}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${v}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:v}=await Promise.resolve().then(()=>(Vh(),Bh));await v()}else if(p[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(p[0]==="web"||p[0]==="serve")try{let v=process.cwd(),$=await r.getProjectId(v);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a($,v,F)}}catch(v){console.error("Server error:",v.message),process.exitCode=1}else if(p[0]==="context"){let v=process.cwd(),$=await r.getProjectId(v);if(!$)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:H}=await Promise.resolve().then(()=>(ny(),ty)),ee=await H(p.slice(1),$,v);console.log(JSON.stringify(ee,null,2)),process.exitCode=ee.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let v=await D("hooks"),{hooksService:$}=await Promise.resolve().then(()=>(ay(),iy)),F=p[1]||"status",H=await $.run(process.cwd(),F);process.exitCode=H,v()}else if(p[0]==="doctor"){let v=await D("doctor"),{doctorService:$}=await Promise.resolve().then(()=>(dy(),uy)),F=await $.run(process.cwd());process.exitCode=F,v()}else if(p[0]==="uninstall"){let{uninstall:v}=await Promise.resolve().then(()=>(id(),Fh)),$=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),H=p.includes("--dry-run")||p.includes("-n"),ee=p.includes("--keep-package"),S=await v({force:$,backup:F,dryRun:H,keepPackage:ee});process.exitCode=S.success?0:1}else if(p[0]==="watch"){let v=process.cwd();if(!await r.getProjectId(v))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(my(),py)),H=p.includes("--verbose")||p.includes("-v"),ee=p.find(_=>_.startsWith("--debounce=")),S=ee?parseInt(ee.split("=")[1],10):void 0,j=p.find(_=>_.startsWith("--interval=")),te=j?parseInt(j.split("=")[1],10)*1e3:void 0,Ve=await F.start(v,{verbose:H,quiet:f,debounceMs:S,minIntervalMs:te});Ve.success||(console.error(Ve.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:v}=await import("node:child_process"),$=await import("node:fs"),F=process.cwd(),H=await r.getProjectId(F);if(!H)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let ee=e.join(__dirname,"..","core","cli","linear.ts"),S=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),te,Ve;if($.existsSync(ee)?(te=ee,Ve="bun"):$.existsSync(j)?(te=j,Ve="node"):$.existsSync(S)?(te=S,Ve="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,te="",Ve=""),te){let _=["--project",H,...p.slice(1)];v(Ve,[te,..._],{stdio:"inherit",cwd:F}).on("close",ko=>{process.exitCode=ko||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:v}=await Promise.resolve().then(()=>(by(),Sy)),$=p[1];console.log(v($)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let v=await n(b),$=s.homedir(),F=process.cwd(),[H,ee,S,j,te,Ve]=await Promise.all([c(e.join($,".claude","commands","p.md")),c(e.join($,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
1463
1485
  ${t.cyan("p/")} prjct v${d}
1464
1486
  ${t.dim("Context layer for AI coding agents")}
1465
1487
 
1466
- ${t.dim("Providers:")}`),x.claude.installed){let it=J?t.green("\u2713 ready"):t.yellow("\u25CF installed"),_n=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${it}${t.dim(_n)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let it=ne?t.green("\u2713 ready"):t.yellow("\u25CF installed"),_n=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${it}${t.dim(_n)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(S){let it=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${it}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(Z){let it=N?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${it}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1488
+ ${t.dim("Providers:")}`),v.claude.installed){let _=H?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ms=v.claude.version?` (v${v.claude.version})`:"";console.log(` Claude Code ${_}${t.dim(ms)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(v.gemini.installed){let _=ee?t.green("\u2713 ready"):t.yellow("\u25CF installed"),ms=v.gemini.version?` (v${v.gemini.version})`:"";console.log(` Gemini CLI ${_}${t.dim(ms)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(S){let _=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${_}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(te){let _=Ve?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${_}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
1467
1489
  ${t.dim("Run 'prjct start' to configure (CLI providers)")}
1468
1490
  ${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1469
1491
  ${t.cyan("https://prjct.app")}
1470
- `)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),O=await m();if(!await c(x)||!O)console.log(`
1492
+ `)}else{let v=e.join(s.homedir(),".prjct-cli","config","installed-editors.json"),$=await m();if(!await c(v)||!$)console.log(`
1471
1493
  ${t.cyan.bold(" Welcome to prjct!")}
1472
1494
 
1473
1495
  Run ${t.bold("prjct start")} to configure your AI providers.
@@ -1476,4 +1498,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
1476
1498
  Claude Code, Gemini CLI, or both.`)}
1477
1499
  `),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
1478
1500
  ${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
1479
- `);let{default:J}=await Promise.resolve().then(()=>(ky(),wy));await J.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(fs(),gs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Cy(),GE))}}}l(WE,"main");WE().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
1501
+ `);let{default:H}=await Promise.resolve().then(()=>(Iy(),Ey));await H.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(hs(),fs)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(Dy(),QE))}}}l(eI,"main");eI().catch(s=>{console.error("Fatal error:",s.message),process.exit(1)});