prjct-cli 1.24.1 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,12 +3,12 @@ import { fileURLToPath as __fileURLToPath } from 'url';
3
3
  import { dirname as __pathDirname } from 'path';
4
4
  const __filename = __fileURLToPath(import.meta.url);
5
5
  const __dirname = __pathDirname(__filename);
6
- var jr=Object.defineProperty;var vf=Object.getOwnPropertyDescriptor;var xf=Object.getOwnPropertyNames;var Tf=Object.prototype.hasOwnProperty;var l=(r,e)=>jr(r,"name",{value:e,configurable:!0}),Ri=(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')}),Kl=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var fn=(r,e)=>{for(var t in e)jr(r,t,{get:e[t],enumerable:!0})},Ef=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of xf(e))!Tf.call(r,s)&&s!==t&&jr(r,s,{get:()=>e[s],enumerable:!(n=vf(e,s))||n.enumerable});return r};var ot=r=>Ef(jr({},"__esModule",{value:!0}),r);var Xl=w(()=>{"use strict"});var Dr,Yl=w(()=>{"use strict";Dr={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 Fs,Rr=w(()=>{"use strict";Fs={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"}}});function Ql(r){return r instanceof Error&&"code"in r}function S(r){return Ql(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var M=w(()=>{"use strict";l(Ql,"isNodeError");l(S,"isNotFoundError");l(y,"getErrorMessage")});var Zl=w(()=>{"use strict"});var eu=w(()=>{"use strict";Zl()});function $r(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,tu,Wn=w(()=>{"use strict";j={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"},tu=["frontend","backend","devops","docs","testing","database","general"];l($r,"calculateConfidence")});var $i=w(()=>{"use strict"});var Mi=w(()=>{"use strict";Xl();Yl();Rr();M();eu();Wn();$i()});var N={};fn(N,{calculateDuration:()=>Lf,formatDate:()=>Mr,formatDuration:()=>Os,formatMonth:()=>Rf,getDateKey:()=>$f,getDateRange:()=>Of,getDaysAgo:()=>en,getDaysFromNow:()=>Ff,getEndOfDay:()=>Hf,getStartOfDay:()=>Uf,getTimestamp:()=>k,getTodayKey:()=>Fr,getYearMonthDay:()=>Fi,isToday:()=>_f,isWithinLastDays:()=>Nf,parseDate:()=>Mf,toRelative:()=>Xe});import{formatDistanceToNowStrict as Df}from"date-fns";function Mr(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 Rf(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Fr(){return Mr(new Date)}function $f(r){return Mr(r)}function Fi(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Mf(r){return new Date(r)}function k(){return new Date().toISOString()}function en(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Ff(r){let e=new Date;return e.setDate(e.getDate()+r),e}function Of(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 _f(r){return Mr(r)===Fr()}function Nf(r,e){let t=en(e);return r>=t}function Os(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 Lf(r,e=new Date){let t=e.getTime()-r.getTime();return Os(t)}function Uf(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Hf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Xe(r){let e=typeof r=="string"?new Date(r):r;return Df(e,{addSuffix:!0})}var Y=w(()=>{"use strict";l(Mr,"formatDate");l(Rf,"formatMonth");l(Fr,"getTodayKey");l($f,"getDateKey");l(Fi,"getYearMonthDay");l(Mf,"parseDate");l(k,"getTimestamp");l(en,"getDaysAgo");l(Ff,"getDaysFromNow");l(Of,"getDateRange");l(_f,"isToday");l(Nf,"isWithinLastDays");l(Os,"formatDuration");l(Lf,"calculateDuration");l(Uf,"getStartOfDay");l(Hf,"getEndOfDay");l(Xe,"toRelative")});import ru from"node:fs/promises";async function ou(r,e){let t;try{t=await ru.readFile(r,"utf-8")}catch(o){if(S(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await nu(r,t),su(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await nu(r,t),su(r,Gf(s.error)),null)}async function nu(r,e){let t=`${r}.backup`;try{await ru.writeFile(t,e,"utf-8")}catch{}}function su(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 Gf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var iu=w(()=>{"use strict";M();l(ou,"safeRead");l(nu,"createBackup");l(su,"logCorruption");l(Gf,"formatZodError")});var te={};fn(te,{appendLine:()=>Oi,appendToFile:()=>Jf,atomicWrite:()=>zf,copyFile:()=>Xf,deleteDir:()=>Vf,deleteFile:()=>Bf,dirExists:()=>Or,ensureDir:()=>Ye,fileExists:()=>D,getFileExtension:()=>eh,getFileModifiedTime:()=>Kf,getFileNameWithoutExtension:()=>th,getFileSize:()=>qf,listFiles:()=>qn,moveFile:()=>Yf,prependToFile:()=>Wf,readFile:()=>Vn,readJson:()=>hn,readLines:()=>Qf,writeFile:()=>au,writeJson:()=>_s,writeLines:()=>Zf});import se from"node:fs/promises";import Bn from"node:path";async function hn(r,e=null,t){if(t)return await ou(r,t)??e;try{let n=await se.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(S(n))return e;throw n}}async function _s(r,e,t=2){let n=JSON.stringify(e,null,t);await se.writeFile(r,n,"utf-8")}async function Vn(r,e=""){try{return await se.readFile(r,"utf-8")}catch(t){if(S(t))return e;throw t}}async function au(r,e){let t=Bn.dirname(r);await se.mkdir(t,{recursive:!0}),await se.writeFile(r,e,"utf-8")}async function zf(r,e){let t=Bn.dirname(r);await se.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await se.writeFile(n,e,"utf-8"),await se.rename(n,r)}async function Jf(r,e){await se.appendFile(r,e,"utf-8")}async function Oi(r,e){let t=Bn.dirname(r);await se.mkdir(t,{recursive:!0}),await se.appendFile(r,`${e}
7
- `,"utf-8")}async function Wf(r,e){try{let t=await se.readFile(r,"utf-8");await se.writeFile(r,e+t,"utf-8")}catch(t){if(S(t))await se.writeFile(r,e,"utf-8");else throw t}}async function D(r){try{return await se.access(r),!0}catch(e){if(S(e))return!1;throw e}}async function Or(r){try{return(await se.stat(r)).isDirectory()}catch(e){if(S(e))return!1;throw e}}async function Ye(r){await se.mkdir(r,{recursive:!0})}async function Bf(r){try{return await se.unlink(r),!0}catch(e){if(S(e))return!1;throw e}}async function Vf(r){try{return await se.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(S(e))return!1;throw e}}async function qn(r,e={}){try{let n=await se.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(S(t))return[];throw t}}async function qf(r){return(await se.stat(r)).size}async function Kf(r){return(await se.stat(r)).mtime}async function Xf(r,e){await se.copyFile(r,e)}async function Yf(r,e){await se.rename(r,e)}async function Qf(r){return(await Vn(r,"")).split(`
8
- `)}async function Zf(r,e){let t=e.join(`
9
- `);await au(r,t)}function eh(r){return Bn.extname(r)}function th(r){return Bn.basename(r,Bn.extname(r))}var Ce=w(()=>{"use strict";iu();M();l(hn,"readJson");l(_s,"writeJson");l(Vn,"readFile");l(au,"writeFile");l(zf,"atomicWrite");l(Jf,"appendToFile");l(Oi,"appendLine");l(Wf,"prependToFile");l(D,"fileExists");l(Or,"dirExists");l(Ye,"ensureDir");l(Bf,"deleteFile");l(Vf,"deleteDir");l(qn,"listFiles");l(qf,"getFileSize");l(Kf,"getFileModifiedTime");l(Xf,"copyFile");l(Yf,"moveFile");l(Qf,"readLines");l(Zf,"writeLines");l(eh,"getFileExtension");l(th,"getFileNameWithoutExtension")});import{z as It}from"zod";function cu(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 Cx,vx,xx,Ns,Tx,Ls=w(()=>{"use strict";Cx=It.enum(["opus","sonnet","haiku"]),vx=It.enum(["2.5-pro","2.5-flash","2.0-flash"]),xx=It.string().min(1),Ns=It.object({provider:It.string(),model:It.string(),cliVersion:It.string().optional(),recordedAt:It.string()}),Tx=It.object({preferredModel:It.string().optional(),lastAnalysisModel:Ns.optional()});l(cu,"compareSemver")});import _i from"node:fs/promises";import nh from"node:os";import lu from"node:path";async function du(){try{let r=await _i.readFile(pu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>sh?null:e.detection}catch{return null}}async function mu(r){let e={timestamp:new Date().toISOString(),detection:r};await _i.mkdir(uu,{recursive:!0}),await _i.writeFile(pu,JSON.stringify(e,null,2))}var uu,pu,sh,gu=w(()=>{"use strict";uu=lu.join(nh.homedir(),".prjct-cli","cache"),pu=lu.join(uu,"providers.json"),sh=600*1e3;l(du,"readProviderCache");l(mu,"writeProviderCache")});var Qe={};fn(Qe,{AntigravityProvider:()=>Ui,ClaudeProvider:()=>_r,CursorProvider:()=>yu,GeminiProvider:()=>Li,Providers:()=>gt,WindsurfProvider:()=>wu,detectAllProviders:()=>Hi,detectAntigravity:()=>dh,detectCursorProject:()=>ku,detectProvider:()=>Ni,detectWindsurfProject:()=>bu,getActiveProvider:()=>ch,getCommandsDir:()=>hh,getGlobalContextPath:()=>mh,getGlobalSettingsPath:()=>gh,getProjectCommandsPath:()=>yh,getProviderBranding:()=>Nr,getSkillsPath:()=>fh,hasProviderConfig:()=>lh,needsCursorRouterRegeneration:()=>uh,needsWindsurfRouterRegeneration:()=>ph,selectProvider:()=>wh,validateCliVersion:()=>Su});import{exec as rh}from"node:child_process";import Kn from"node:os";import Fe from"node:path";import{promisify as oh}from"node:util";async function ih(r){try{let{stdout:e}=await fu(`which ${r}`,{timeout:hu});return e.trim()}catch{return null}}async function ah(r){try{let{stdout:e}=await fu(`${r} --version`,{timeout:hu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ni(r){let e=gt[r];if(!e.cliCommand)return{installed:!1};let t=await ih(e.cliCommand);if(!t)return{installed:!1};let n=await ah(e.cliCommand),s=Su(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Su(r,e){let t=gt[r];return!t.minCliVersion||!e?null:cu(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 Hi(r=!1){if(!r){let s=await du();if(s)return s}let[e,t]=await Promise.all([Ni("claude"),Ni("gemini")]),n={claude:e,gemini:t};return await mu(n).catch(()=>{}),n}async function ch(r){if(r&&gt[r])return gt[r];let e=await Hi();return e.claude.installed&&!e.gemini.installed?_r:e.gemini.installed&&!e.claude.installed?Li:_r}async function lh(r){let e=gt[r];return e.configDir?D(e.configDir):!1}function Nr(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 ku(r){let e=Fe.join(r,".cursor"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.mdc"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function uh(r){let e=await ku(r);return e.detected&&!e.routerInstalled}async function bu(r){let e=Fe.join(r,".windsurf"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.md"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ph(r){let e=await bu(r);return e.detected&&!e.routerInstalled}async function dh(){let r=Ui.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Fe.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([D(r),D(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function mh(r){let e=gt[r];return e.configDir?Fe.join(e.configDir,e.contextFile):null}function gh(r){let e=gt[r];return!e.configDir||!e.settingsFile?null:Fe.join(e.configDir,e.settingsFile)}function fh(r){return gt[r].skillsDir}function hh(r){return gt[r].commandsDir}function yh(r,e){let t=gt[r];return Fe.join(e,t.commandsDir)}async function wh(){let r=await Hi(),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 fu,hu,_r,Li,Ui,yu,wu,gt,He=w(()=>{"use strict";Ls();Ce();gu();fu=oh(rh),hu=2e3,_r={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Fe.join(Kn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Fe.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"},Li={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Fe.join(Kn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Fe.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"},Ui={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Fe.join(Kn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Fe.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},yu={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},wu={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},gt={claude:_r,gemini:Li,cursor:yu,antigravity:Ui,windsurf:wu};l(ih,"whichCommand");l(ah,"getCliVersion");l(Ni,"detectProvider");l(Su,"validateCliVersion");l(Hi,"detectAllProviders");l(ch,"getActiveProvider");l(lh,"hasProviderConfig");l(Nr,"getProviderBranding");l(ku,"detectCursorProject");l(uh,"needsCursorRouterRegeneration");l(bu,"detectWindsurfProject");l(ph,"needsWindsurfRouterRegeneration");l(dh,"detectAntigravity");l(mh,"getGlobalContextPath");l(gh,"getGlobalSettingsPath");l(fh,"getSkillsPath");l(hh,"getCommandsDir");l(yh,"getProjectCommandsPath");l(wh,"selectProvider")});import Sh from"node:crypto";import jt from"node:fs/promises";import Gi from"node:os";import F from"node:path";import{globSync as kh}from"glob";var zi,bh,P,K=w(()=>{"use strict";Y();Ce();zi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?F.resolve(e):F.join(Gi.homedir(),".prjct-cli"),this.globalProjectsDir=F.join(this.globalBaseDir,"projects"),this.globalConfigDir=F.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=F.resolve(e),this.globalProjectsDir=F.join(this.globalBaseDir,"projects"),this.globalConfigDir=F.join(this.globalBaseDir,"config")}generateProjectId(e){return Sh.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return F.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return F.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return F.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return F.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Or(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await D(t)}async ensureGlobalStructure(){await Ye(this.globalBaseDir),await Ye(this.globalProjectsDir),await Ye(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 Ye(F.join(t,s));return await Ye(F.join(t,"planning","tasks")),await Ye(F.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Fi(t);return F.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 Ye(n),n}async listSessions(e,t=null,n=null){let s=F.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await jt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=F.join(s,a.name),u=await jt.readdir(c,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||n&&p.name!==n.toString().padStart(2,"0"))continue;let m=F.join(c,p.name),d=await jt.readdir(m,{withFileTypes:!0});for(let g of d)g.isDirectory()&&o.push({year:a.name,month:p.name,day:g.name,path:F.join(m,g.name),date:new Date(`${a.name}-${p.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 F.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await jt.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 Or(t)}getDisplayPath(e){let t=Gi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return F.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return F.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return F.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return F.join(this.globalBaseDir,".running")}getDocsPath(){return F.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(He(),ot(Qe)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(He(),ot(Qe)).getActiveProvider();return(He(),ot(Qe)).getGlobalSettingsPath(e.name)}getClaudeDir(){return F.join(Gi.homedir(),".claude")}getClaudeSettingsPath(){return F.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?F.join(this.getGlobalProjectPath(e),"agents"):F.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return F.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return F.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=F.join(e,s.file);if(await D(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=F.join(e,"package.json");if(await D(s))try{let o=await jt.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 jt.readFile(F.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
10
- `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=F.join(e,"package.json"),i=await jt.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=F.join(e,"lerna.json");if(await D(c)){let u=await jt.readFile(c,"utf-8"),p=JSON.parse(u);p.packages&&(s=p.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=F.join(e,"package.json"),i=await jt.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=kh(o,{cwd:e,absolute:!1});for(let a of i){let c=F.join(e,a),u=F.join(c,"package.json");if(await D(u))try{let p=await jt.readFile(u,"utf-8"),m=JSON.parse(p),d=F.join(c,"PRJCT.md");n.push({name:m.name||F.basename(a),path:c,relativePath:a,hasPrjctMd:await D(d)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=F.resolve(e);for(let s of t.packages){let o=F.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=F.resolve(e),n=F.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=F.dirname(t)}return null}},bh=new zi,P=bh});import Us from"node:fs/promises";import tn from"node:path";import{z as ee}from"zod";async function Th(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=tn.join(e,"package.json"),s=await Us.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let p=u.toLowerCase();Object.keys(i).some(d=>d.toLowerCase().includes(p))?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 S(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 Eh(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 Dh(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=xh[a];if(!c)continue;c.some(p=>s.has(p))?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 Ah(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=tn.join(e,a);try{await Us.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 Ih(r,e){let t=Date.now();try{let n=await Rh(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 jh(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=tn.join(e,o.file);try{await Us.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 Pu(r,e){let t=Date.now(),n=await Promise.all([Th(r,e),Eh(r,e),Ah(r,e),Ih(r,e),jh(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 Dh(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Us.readdir(s,{withFileTypes:!0});for(let i of o){let a=tn.join(s,i.name),c=tn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=tn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Rh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Us.readdir(s,{withFileTypes:!0});for(let i of o){let a=tn.join(s,i.name),c=tn.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 Ph,Ch,vh,Ji,eT,xh,Wi=w(()=>{"use strict";M();Ls();Ph=ee.enum(["draft","verified","sealed"]),Ch=ee.object({name:ee.string(),description:ee.string(),location:ee.string().optional()}),vh=ee.object({issue:ee.string(),file:ee.string(),suggestion:ee.string()}),Ji=ee.object({projectId:ee.string(),languages:ee.array(ee.string()),frameworks:ee.array(ee.string()),packageManager:ee.string().optional(),sourceDir:ee.string().optional(),testDir:ee.string().optional(),configFiles:ee.array(ee.string()),fileCount:ee.number(),patterns:ee.array(Ch),antiPatterns:ee.array(vh),analyzedAt:ee.string(),modelMetadata:Ns.optional(),status:Ph.default("draft"),commitHash:ee.string().optional(),signature:ee.string().optional(),sealedAt:ee.string().optional(),verifiedAt:ee.string().optional()}),eT={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},xh={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(Th,"verifyFrameworks");l(Eh,"verifyLanguages");l(Ah,"verifyPatternLocations");l(Ih,"verifyFileCount");l(jh,"verifyAntiPatternFiles");l(Pu,"semanticVerify");l(Dh,"getProjectExtensions");l(Rh,"countProjectFiles")});import{z as re}from"zod";function $h(r){return r instanceof Xn}function V(r){return $h(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Yn,rT,oT,iT,aT,cT,lT,Xn,Lr,Ur,Hs,Ht=w(()=>{"use strict";Yn={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}},rT=Yn.create("FileError",re.object({path:re.string(),operation:re.enum(["read","write","delete","create","copy"]),reason:re.string().optional()})),oT=Yn.create("ValidationError",re.object({field:re.string(),expected:re.string(),received:re.string().optional(),message:re.string().optional()})),iT=Yn.create("PermissionError",re.object({action:re.string(),resource:re.string(),reason:re.string().optional()})),aT=Yn.create("TaskError",re.object({taskId:re.string().optional(),operation:re.enum(["create","update","complete","pause","resume","delete"]),reason:re.string()})),cT=Yn.create("SessionError",re.object({sessionId:re.string().optional(),reason:re.string()})),lT=Yn.create("SyncError",re.object({projectId:re.string().optional(),operation:re.enum(["push","pull","auth","connect"]),reason:re.string()})),Xn=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)}},Lr=class r extends Xn{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")}},Ur=class r extends Xn{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")}},Hs=class r extends Xn{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($h,"isPrjctError");l(V,"getErrorMessage")});function Gr(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 Mh[r]}var q,Bi,Vi,Hr,Mh,ft,Gs,Cu,zs,Gt=w(()=>{"use strict";q={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Bi=["feature","spec","design","refactor","migrate"],Vi=["ship","cleanup","git","migrate"],Hr=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Mh={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Gr,"getTimeout");ft={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},Gs={JSONL_MAX_LINES:1e3,ROTATION_SIZE_MB:10,LARGE_FILE_WARN_MB:50},Cu={HISTORY_MAX:100},zs={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 Oh(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Fh.has(r)||r.includes("prjct"))return{level:Qn.debug,name:"debug"};let e=Qn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zr(r,e,t){return vu>=r?(...n)=>console[t](e,...n):Nh}var Qn,Fh,vu,_h,Nh,Lh,L,Zn=w(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Fh=new Set(["1","true","*"]);l(Oh,"getLogLevel");({level:vu,name:_h}=Oh()),Nh=l(()=>{},"noop");l(zr,"createLogMethod");Lh={error:zr(Qn.error,"[prjct:error]","error"),warn:zr(Qn.warn,"[prjct:warn]","warn"),info:zr(Qn.info,"[prjct:info]","log"),debug:zr(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>vu>=0,"isEnabled"),level:l(()=>_h,"level")},L=Lh});import xu from"node:fs/promises";import Tu from"node:path";var Jr,Uh,Eu=w(()=>{"use strict";Ht();K();Mi();Gt();Zn();Jr=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Cu.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"&&L.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(Dr.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(Dr.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 L.error("Event callback error:",n),n}}async logEvent(e){try{let t=P.getGlobalProjectPath(this.projectId),n=Tu.join(t,"memory","events.jsonl");await xu.mkdir(Tu.dirname(n),{recursive:!0});let s=`${JSON.stringify(e)}
11
- `;await xu.appendFile(n,s)}catch(t){L.debug("Failed to log event:",V(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())}},Uh=new Jr});function Br(r,e){let t=r[0];return e==="delete"?`${t}.deleted`:`${t}.updated`}var Wr,es,Au=w(()=>{"use strict";K();Y();Ce();l(Br,"inferEventType");Wr=class{static{l(this,"SyncEventBus")}async publish(e){let t=P.getSyncPendingPath(e.projectId),n=await hn(t,[])??[];n.push(e),await _s(t,n)}async getPending(e){let t=P.getSyncPendingPath(e);return await hn(t,[])??[]}async clearPending(e){let t=P.getSyncPendingPath(e);await _s(t,[])}async updateLastSync(e){let t=P.getLastSyncPath(e),n={timestamp:k(),success:!0};await _s(t,n)}async getLastSync(e){let t=P.getLastSyncPath(e);return await hn(t,null)}},es=new Wr});var qi=w(()=>{"use strict";Eu();Au()});var ht,Vr=w(()=>{"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}}});import{Database as Hh}from"bun:sqlite";import Ki from"node:fs";import Iu from"node:path";var Gh,qr,J,it,Dt=w(()=>{"use strict";K();Gh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
6
+ var Ar=Object.defineProperty;var bf=Object.getOwnPropertyDescriptor;var Pf=Object.getOwnPropertyNames;var Cf=Object.prototype.hasOwnProperty;var l=(r,e)=>Ar(r,"name",{value:e,configurable:!0}),$i=(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')}),ql=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var w=(r,e)=>()=>(r&&(e=r(r=0)),e);var fn=(r,e)=>{for(var t in e)Ar(r,t,{get:e[t],enumerable:!0})},vf=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Pf(e))!Cf.call(r,s)&&s!==t&&Ar(r,s,{get:()=>e[s],enumerable:!(n=bf(e,s))||n.enumerable});return r};var ot=r=>vf(Ar({},"__esModule",{value:!0}),r);var Kl=w(()=>{"use strict"});var Ir,Xl=w(()=>{"use strict";Ir={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 $s,jr=w(()=>{"use strict";$s={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"}}});function Yl(r){return r instanceof Error&&"code"in r}function S(r){return Yl(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var M=w(()=>{"use strict";l(Yl,"isNodeError");l(S,"isNotFoundError");l(y,"getErrorMessage")});var Ql=w(()=>{"use strict"});var Zl=w(()=>{"use strict";Ql()});function Dr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var j,eu,zn=w(()=>{"use strict";j={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"},eu=["frontend","backend","devops","docs","testing","database","general"];l(Dr,"calculateConfidence")});var Mi=w(()=>{"use strict"});var Fi=w(()=>{"use strict";Kl();Xl();jr();M();Zl();zn();Mi()});var U={};fn(U,{calculateDuration:()=>Of,formatDate:()=>Rr,formatDuration:()=>Ms,formatMonth:()=>If,getDateKey:()=>jf,getDateRange:()=>$f,getDaysAgo:()=>en,getDaysFromNow:()=>Rf,getEndOfDay:()=>Nf,getStartOfDay:()=>_f,getTimestamp:()=>b,getTodayKey:()=>$r,getYearMonthDay:()=>Oi,isToday:()=>Mf,isWithinLastDays:()=>Ff,parseDate:()=>Df,toRelative:()=>Xe});import{formatDistanceToNowStrict as Af}from"date-fns";function Rr(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 If(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function $r(){return Rr(new Date)}function jf(r){return Rr(r)}function Oi(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function Df(r){return new Date(r)}function b(){return new Date().toISOString()}function en(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Rf(r){let e=new Date;return e.setDate(e.getDate()+r),e}function $f(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 Mf(r){return Rr(r)===$r()}function Ff(r,e){let t=en(e);return r>=t}function Ms(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 Of(r,e=new Date){let t=e.getTime()-r.getTime();return Ms(t)}function _f(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Nf(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function Xe(r){let e=typeof r=="string"?new Date(r):r;return Af(e,{addSuffix:!0})}var Q=w(()=>{"use strict";l(Rr,"formatDate");l(If,"formatMonth");l($r,"getTodayKey");l(jf,"getDateKey");l(Oi,"getYearMonthDay");l(Df,"parseDate");l(b,"getTimestamp");l(en,"getDaysAgo");l(Rf,"getDaysFromNow");l($f,"getDateRange");l(Mf,"isToday");l(Ff,"isWithinLastDays");l(Ms,"formatDuration");l(Of,"calculateDuration");l(_f,"getStartOfDay");l(Nf,"getEndOfDay");l(Xe,"toRelative")});import su from"node:fs/promises";async function ru(r,e){let t;try{t=await su.readFile(r,"utf-8")}catch(o){if(S(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await tu(r,t),nu(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await tu(r,t),nu(r,Lf(s.error)),null)}async function tu(r,e){let t=`${r}.backup`;try{await su.writeFile(t,e,"utf-8")}catch{}}function nu(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 Lf(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var ou=w(()=>{"use strict";M();l(ru,"safeRead");l(tu,"createBackup");l(nu,"logCorruption");l(Lf,"formatZodError")});var ne={};fn(ne,{appendLine:()=>_i,appendToFile:()=>Hf,atomicWrite:()=>Uf,copyFile:()=>Vf,deleteDir:()=>Jf,deleteFile:()=>zf,dirExists:()=>Mr,ensureDir:()=>Ye,fileExists:()=>D,getFileExtension:()=>Yf,getFileModifiedTime:()=>Bf,getFileNameWithoutExtension:()=>Qf,getFileSize:()=>Wf,listFiles:()=>Bn,moveFile:()=>qf,prependToFile:()=>Gf,readFile:()=>Wn,readJson:()=>hn,readLines:()=>Kf,writeFile:()=>iu,writeJson:()=>Fs,writeLines:()=>Xf});import re from"node:fs/promises";import Jn from"node:path";async function hn(r,e=null,t){if(t)return await ru(r,t)??e;try{let n=await re.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(S(n))return e;throw n}}async function Fs(r,e,t=2){let n=JSON.stringify(e,null,t);await re.writeFile(r,n,"utf-8")}async function Wn(r,e=""){try{return await re.readFile(r,"utf-8")}catch(t){if(S(t))return e;throw t}}async function iu(r,e){let t=Jn.dirname(r);await re.mkdir(t,{recursive:!0}),await re.writeFile(r,e,"utf-8")}async function Uf(r,e){let t=Jn.dirname(r);await re.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await re.writeFile(n,e,"utf-8"),await re.rename(n,r)}async function Hf(r,e){await re.appendFile(r,e,"utf-8")}async function _i(r,e){let t=Jn.dirname(r);await re.mkdir(t,{recursive:!0}),await re.appendFile(r,`${e}
7
+ `,"utf-8")}async function Gf(r,e){try{let t=await re.readFile(r,"utf-8");await re.writeFile(r,e+t,"utf-8")}catch(t){if(S(t))await re.writeFile(r,e,"utf-8");else throw t}}async function D(r){try{return await re.access(r),!0}catch(e){if(S(e))return!1;throw e}}async function Mr(r){try{return(await re.stat(r)).isDirectory()}catch(e){if(S(e))return!1;throw e}}async function Ye(r){await re.mkdir(r,{recursive:!0})}async function zf(r){try{return await re.unlink(r),!0}catch(e){if(S(e))return!1;throw e}}async function Jf(r){try{return await re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(S(e))return!1;throw e}}async function Bn(r,e={}){try{let n=await re.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(S(t))return[];throw t}}async function Wf(r){return(await re.stat(r)).size}async function Bf(r){return(await re.stat(r)).mtime}async function Vf(r,e){await re.copyFile(r,e)}async function qf(r,e){await re.rename(r,e)}async function Kf(r){return(await Wn(r,"")).split(`
8
+ `)}async function Xf(r,e){let t=e.join(`
9
+ `);await iu(r,t)}function Yf(r){return Jn.extname(r)}function Qf(r){return Jn.basename(r,Jn.extname(r))}var Ee=w(()=>{"use strict";ou();M();l(hn,"readJson");l(Fs,"writeJson");l(Wn,"readFile");l(iu,"writeFile");l(Uf,"atomicWrite");l(Hf,"appendToFile");l(_i,"appendLine");l(Gf,"prependToFile");l(D,"fileExists");l(Mr,"dirExists");l(Ye,"ensureDir");l(zf,"deleteFile");l(Jf,"deleteDir");l(Bn,"listFiles");l(Wf,"getFileSize");l(Bf,"getFileModifiedTime");l(Vf,"copyFile");l(qf,"moveFile");l(Kf,"readLines");l(Xf,"writeLines");l(Yf,"getFileExtension");l(Qf,"getFileNameWithoutExtension")});import{z as Dt}from"zod";function au(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 yx,wx,Sx,Os,kx,_s=w(()=>{"use strict";yx=Dt.enum(["opus","sonnet","haiku"]),wx=Dt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Sx=Dt.string().min(1),Os=Dt.object({provider:Dt.string(),model:Dt.string(),cliVersion:Dt.string().optional(),recordedAt:Dt.string()}),kx=Dt.object({preferredModel:Dt.string().optional(),lastAnalysisModel:Os.optional()});l(au,"compareSemver")});import Ni from"node:fs/promises";import Zf from"node:os";import cu from"node:path";async function pu(){try{let r=await Ni.readFile(uu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>eh?null:e.detection}catch{return null}}async function du(r){let e={timestamp:new Date().toISOString(),detection:r};await Ni.mkdir(lu,{recursive:!0}),await Ni.writeFile(uu,JSON.stringify(e,null,2))}var lu,uu,eh,mu=w(()=>{"use strict";lu=cu.join(Zf.homedir(),".prjct-cli","cache"),uu=cu.join(lu,"providers.json"),eh=600*1e3;l(pu,"readProviderCache");l(du,"writeProviderCache")});var Qe={};fn(Qe,{AntigravityProvider:()=>Hi,ClaudeProvider:()=>Fr,CursorProvider:()=>hu,GeminiProvider:()=>Ui,Providers:()=>ft,WindsurfProvider:()=>yu,detectAllProviders:()=>Gi,detectAntigravity:()=>lh,detectCursorProject:()=>Su,detectProvider:()=>Li,detectWindsurfProject:()=>ku,getActiveProvider:()=>oh,getCommandsDir:()=>mh,getGlobalContextPath:()=>uh,getGlobalSettingsPath:()=>ph,getProjectCommandsPath:()=>gh,getProviderBranding:()=>Or,getSkillsPath:()=>dh,hasProviderConfig:()=>ih,needsCursorRouterRegeneration:()=>ah,needsWindsurfRouterRegeneration:()=>ch,selectProvider:()=>fh,validateCliVersion:()=>wu});import{exec as th}from"node:child_process";import Vn from"node:os";import Fe from"node:path";import{promisify as nh}from"node:util";async function sh(r){try{let{stdout:e}=await gu(`which ${r}`,{timeout:fu});return e.trim()}catch{return null}}async function rh(r){try{let{stdout:e}=await gu(`${r} --version`,{timeout:fu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Li(r){let e=ft[r];if(!e.cliCommand)return{installed:!1};let t=await sh(e.cliCommand);if(!t)return{installed:!1};let n=await rh(e.cliCommand),s=wu(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function wu(r,e){let t=ft[r];return!t.minCliVersion||!e?null:au(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 Gi(r=!1){if(!r){let s=await pu();if(s)return s}let[e,t]=await Promise.all([Li("claude"),Li("gemini")]),n={claude:e,gemini:t};return await du(n).catch(()=>{}),n}async function oh(r){if(r&&ft[r])return ft[r];let e=await Gi();return e.claude.installed&&!e.gemini.installed?Fr:e.gemini.installed&&!e.claude.installed?Ui:Fr}async function ih(r){let e=ft[r];return e.configDir?D(e.configDir):!1}function Or(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 Su(r){let e=Fe.join(r,".cursor"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.mdc"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ah(r){let e=await Su(r);return e.detected&&!e.routerInstalled}async function ku(r){let e=Fe.join(r,".windsurf"),t=Fe.join(e,"rules"),n=Fe.join(t,"prjct.md"),[s,o]=await Promise.all([D(e),D(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ch(r){let e=await ku(r);return e.detected&&!e.routerInstalled}async function lh(){let r=Hi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Fe.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([D(r),D(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function uh(r){let e=ft[r];return e.configDir?Fe.join(e.configDir,e.contextFile):null}function ph(r){let e=ft[r];return!e.configDir||!e.settingsFile?null:Fe.join(e.configDir,e.settingsFile)}function dh(r){return ft[r].skillsDir}function mh(r){return ft[r].commandsDir}function gh(r,e){let t=ft[r];return Fe.join(e,t.commandsDir)}async function fh(){let r=await Gi(),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 gu,fu,Fr,Ui,Hi,hu,yu,ft,ze=w(()=>{"use strict";_s();Ee();mu();gu=nh(th),fu=2e3,Fr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Fe.join(Vn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Fe.join(Vn.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"},Ui={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Fe.join(Vn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Fe.join(Vn.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"},Hi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Fe.join(Vn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Fe.join(Vn.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},hu={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},yu={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},ft={claude:Fr,gemini:Ui,cursor:hu,antigravity:Hi,windsurf:yu};l(sh,"whichCommand");l(rh,"getCliVersion");l(Li,"detectProvider");l(wu,"validateCliVersion");l(Gi,"detectAllProviders");l(oh,"getActiveProvider");l(ih,"hasProviderConfig");l(Or,"getProviderBranding");l(Su,"detectCursorProject");l(ah,"needsCursorRouterRegeneration");l(ku,"detectWindsurfProject");l(ch,"needsWindsurfRouterRegeneration");l(lh,"detectAntigravity");l(uh,"getGlobalContextPath");l(ph,"getGlobalSettingsPath");l(dh,"getSkillsPath");l(mh,"getCommandsDir");l(gh,"getProjectCommandsPath");l(fh,"selectProvider")});import hh from"node:crypto";import Rt from"node:fs/promises";import zi from"node:os";import O from"node:path";import{globSync as yh}from"glob";var Ji,wh,P,K=w(()=>{"use strict";Q();Ee();Ji=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?O.resolve(e):O.join(zi.homedir(),".prjct-cli"),this.globalProjectsDir=O.join(this.globalBaseDir,"projects"),this.globalConfigDir=O.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=O.resolve(e),this.globalProjectsDir=O.join(this.globalBaseDir,"projects"),this.globalConfigDir=O.join(this.globalBaseDir,"config")}generateProjectId(e){return hh.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return O.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return O.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return O.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return O.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Mr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await D(t)}async ensureGlobalStructure(){await Ye(this.globalBaseDir),await Ye(this.globalProjectsDir),await Ye(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 Ye(O.join(t,s));return await Ye(O.join(t,"planning","tasks")),await Ye(O.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Oi(t);return O.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 Ye(n),n}async listSessions(e,t=null,n=null){let s=O.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Rt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=O.join(s,a.name),u=await Rt.readdir(c,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||n&&p.name!==n.toString().padStart(2,"0"))continue;let m=O.join(c,p.name),d=await Rt.readdir(m,{withFileTypes:!0});for(let g of d)g.isDirectory()&&o.push({year:a.name,month:p.name,day:g.name,path:O.join(m,g.name),date:new Date(`${a.name}-${p.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 O.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Rt.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 Mr(t)}getDisplayPath(e){let t=zi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return O.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return O.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return O.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return O.join(this.globalBaseDir,".running")}getDocsPath(){return O.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(ze(),ot(Qe)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(ze(),ot(Qe)).getActiveProvider();return(ze(),ot(Qe)).getGlobalSettingsPath(e.name)}getClaudeDir(){return O.join(zi.homedir(),".claude")}getClaudeSettingsPath(){return O.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?O.join(this.getGlobalProjectPath(e),"agents"):O.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return O.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return O.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=O.join(e,s.file);if(await D(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=O.join(e,"package.json");if(await D(s))try{let o=await Rt.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 Rt.readFile(O.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
10
+ `).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=O.join(e,"package.json"),i=await Rt.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=O.join(e,"lerna.json");if(await D(c)){let u=await Rt.readFile(c,"utf-8"),p=JSON.parse(u);p.packages&&(s=p.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=O.join(e,"package.json"),i=await Rt.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=yh(o,{cwd:e,absolute:!1});for(let a of i){let c=O.join(e,a),u=O.join(c,"package.json");if(await D(u))try{let p=await Rt.readFile(u,"utf-8"),m=JSON.parse(p),d=O.join(c,"PRJCT.md");n.push({name:m.name||O.basename(a),path:c,relativePath:a,hasPrjctMd:await D(d)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=O.resolve(e);for(let s of t.packages){let o=O.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=O.resolve(e),n=O.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=O.dirname(t)}return null}},wh=new Ji,P=wh});import Ns from"node:fs/promises";import tn from"node:path";import{z as te}from"zod";async function Ch(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=tn.join(e,"package.json"),s=await Ns.readFile(n,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let p=u.toLowerCase();Object.keys(i).some(d=>d.toLowerCase().includes(p))?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 S(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 vh(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 Ah(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Ph[a];if(!c)continue;c.some(p=>s.has(p))?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 xh(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=tn.join(e,a);try{await Ns.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 Th(r,e){let t=Date.now();try{let n=await Ih(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 Eh(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=tn.join(e,o.file);try{await Ns.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 bu(r,e){let t=Date.now(),n=await Promise.all([Ch(r,e),vh(r,e),xh(r,e),Th(r,e),Eh(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 Ah(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ns.readdir(s,{withFileTypes:!0});for(let i of o){let a=tn.join(s,i.name),c=tn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=tn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Ih(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Ns.readdir(s,{withFileTypes:!0});for(let i of o){let a=tn.join(s,i.name),c=tn.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 Sh,kh,bh,Wi,qx,Ph,Bi=w(()=>{"use strict";M();_s();Sh=te.enum(["draft","verified","sealed"]),kh=te.object({name:te.string(),description:te.string(),location:te.string().optional()}),bh=te.object({issue:te.string(),file:te.string(),suggestion:te.string()}),Wi=te.object({projectId:te.string(),languages:te.array(te.string()),frameworks:te.array(te.string()),packageManager:te.string().optional(),sourceDir:te.string().optional(),testDir:te.string().optional(),configFiles:te.array(te.string()),fileCount:te.number(),patterns:te.array(kh),antiPatterns:te.array(bh),analyzedAt:te.string(),modelMetadata:Os.optional(),status:Sh.default("draft"),commitHash:te.string().optional(),signature:te.string().optional(),sealedAt:te.string().optional(),verifiedAt:te.string().optional()}),qx={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Ph={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(Ch,"verifyFrameworks");l(vh,"verifyLanguages");l(xh,"verifyPatternLocations");l(Th,"verifyFileCount");l(Eh,"verifyAntiPatternFiles");l(bu,"semanticVerify");l(Ah,"getProjectExtensions");l(Ih,"countProjectFiles")});import{z as oe}from"zod";function jh(r){return r instanceof qn}function V(r){return jh(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Kn,Qx,Zx,eT,tT,nT,sT,qn,_r,Nr,Ls,zt=w(()=>{"use strict";Kn={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}},Qx=Kn.create("FileError",oe.object({path:oe.string(),operation:oe.enum(["read","write","delete","create","copy"]),reason:oe.string().optional()})),Zx=Kn.create("ValidationError",oe.object({field:oe.string(),expected:oe.string(),received:oe.string().optional(),message:oe.string().optional()})),eT=Kn.create("PermissionError",oe.object({action:oe.string(),resource:oe.string(),reason:oe.string().optional()})),tT=Kn.create("TaskError",oe.object({taskId:oe.string().optional(),operation:oe.enum(["create","update","complete","pause","resume","delete"]),reason:oe.string()})),nT=Kn.create("SessionError",oe.object({sessionId:oe.string().optional(),reason:oe.string()})),sT=Kn.create("SyncError",oe.object({projectId:oe.string().optional(),operation:oe.enum(["push","pull","auth","connect"]),reason:oe.string()})),qn=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)}},_r=class r extends qn{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")}},Nr=class r extends qn{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")}},Ls=class r extends qn{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(jh,"isPrjctError");l(V,"getErrorMessage")});function Ur(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 Dh[r]}var q,Vi,qi,Lr,Dh,ht,Us,Pu,Hs,Jt=w(()=>{"use strict";q={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Vi=["feature","spec","design","refactor","migrate"],qi=["ship","cleanup","git","migrate"],Lr=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Dh={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ur,"getTimeout");ht={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},Us={JSONL_MAX_LINES:1e3,ROTATION_SIZE_MB:10,LARGE_FILE_WARN_MB:50},Pu={HISTORY_MAX:100},Hs={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 $h(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Rh.has(r)||r.includes("prjct"))return{level:Xn.debug,name:"debug"};let e=Xn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function Hr(r,e,t){return Cu>=r?(...n)=>console[t](e,...n):Fh}var Xn,Rh,Cu,Mh,Fh,Oh,H,Yn=w(()=>{"use strict";Xn={error:0,warn:1,info:2,debug:3},Rh=new Set(["1","true","*"]);l($h,"getLogLevel");({level:Cu,name:Mh}=$h()),Fh=l(()=>{},"noop");l(Hr,"createLogMethod");Oh={error:Hr(Xn.error,"[prjct:error]","error"),warn:Hr(Xn.warn,"[prjct:warn]","warn"),info:Hr(Xn.info,"[prjct:info]","log"),debug:Hr(Xn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Cu>=0,"isEnabled"),level:l(()=>Mh,"level")},H=Oh});import vu from"node:fs/promises";import xu from"node:path";var Gr,_h,Tu=w(()=>{"use strict";zt();K();Fi();Jt();Yn();Gr=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Pu.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(Ir.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(Ir.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{let t=P.getGlobalProjectPath(this.projectId),n=xu.join(t,"memory","events.jsonl");await vu.mkdir(xu.dirname(n),{recursive:!0});let s=`${JSON.stringify(e)}
11
+ `;await vu.appendFile(n,s)}catch(t){H.debug("Failed to log event:",V(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())}},_h=new Gr});function Jr(r,e){let t=r[0];return e==="delete"?`${t}.deleted`:`${t}.updated`}var zr,Qn,Eu=w(()=>{"use strict";K();Q();Ee();l(Jr,"inferEventType");zr=class{static{l(this,"SyncEventBus")}async publish(e){let t=P.getSyncPendingPath(e.projectId),n=await hn(t,[])??[];n.push(e),await Fs(t,n)}async getPending(e){let t=P.getSyncPendingPath(e);return await hn(t,[])??[]}async clearPending(e){let t=P.getSyncPendingPath(e);await Fs(t,[])}async updateLastSync(e){let t=P.getLastSyncPath(e),n={timestamp:b(),success:!0};await Fs(t,n)}async getLastSync(e){let t=P.getLastSyncPath(e);return await hn(t,null)}},Qn=new zr});var Ki=w(()=>{"use strict";Tu();Eu()});var yt,Wr=w(()=>{"use strict";yt=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}}});import{Database as Nh}from"bun:sqlite";import Xi from"node:fs";import Au from"node:path";var Lh,Br,F,it,at=w(()=>{"use strict";K();Lh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
12
12
  -- =======================================================================
13
13
  -- Document storage (backward-compatible with JSON file pattern)
14
14
  -- =======================================================================
@@ -239,14 +239,14 @@ var jr=Object.defineProperty;var vf=Object.getOwnPropertyDescriptor;var xf=Objec
239
239
  CREATE INDEX idx_archives_entity_type ON archives(entity_type);
240
240
  CREATE INDEX idx_archives_archived_at ON archives(archived_at);
241
241
  CREATE INDEX idx_archives_entity_id ON archives(entity_id);
242
- `)},"up")}],qr=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Iu.join(P.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Iu.dirname(n);Ki.existsSync(s)||Ki.mkdirSync(s,{recursive:!0});let o=new Hh(n,{create:!0});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 Ki.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(`
242
+ `)},"up")}],Br=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Au.join(P.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Au.dirname(n);Xi.existsSync(s)||Xi.mkdirSync(s,{recursive:!0});let o=new Nh(n,{create:!0});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 Xi.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(`
243
243
  CREATE TABLE IF NOT EXISTS _migrations (
244
244
  version INTEGER PRIMARY KEY,
245
245
  name TEXT NOT NULL,
246
246
  applied_at TEXT NOT NULL
247
247
  )
248
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Gh)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}},J=new qr,it=J});import ju from"node:fs/promises";import zh from"node:path";var ve,Rt=w(()=>{"use strict";qi();K();Vr();Y();Dt();ve=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","")}getContextPath(e,t){let n=this.getLayer();return P.getFilePath(e,n,t)}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=J.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){let n=this.getContextPath(e,this.getMdFilename());await ju.mkdir(zh.dirname(n),{recursive:!0}),J.setDoc(e,this.getStoreKey(),t);let s=this.toMarkdown(t);await ju.writeFile(n,s,"utf-8"),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:k(),projectId:e};await es.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:k()};await this.publishEvent(e,o,i)}async exists(e){try{return J.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as Jh}from"node:crypto";var Xi,$t,Kr=w(()=>{"use strict";Wi();Y();Rt();Xi=class extends ve{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getMdFilename(){return"analysis.md"}getLayer(){return"analysis"}getEventType(e){return`analysis.${e}d`}toMarkdown(e){let t=["# Analysis Status",""];return e.sealed&&(t.push("## Sealed Analysis"),t.push("- **Status**: sealed"),t.push(`- **Commit**: \`${e.sealed.commitHash||"unknown"}\``),t.push(`- **Sealed at**: ${e.sealed.sealedAt||"unknown"}`),t.push(`- **Languages**: ${e.sealed.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.sealed.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.sealed.fileCount}`),e.sealed.patterns.length>0&&t.push(`- **Patterns**: ${e.sealed.patterns.map(n=>n.name).join(", ")}`),t.push("")),e.draft&&e.draft.status==="draft"&&(t.push("## Draft Analysis"),t.push("- **Status**: draft (not yet sealed)"),t.push(`- **Commit**: \`${e.draft.commitHash||"unknown"}\``),t.push(`- **Analyzed at**: ${e.draft.analyzedAt}`),t.push(`- **Languages**: ${e.draft.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.draft.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.draft.fileCount}`),t.push("")),!e.sealed&&!e.draft&&(t.push("_No analysis available. Run `p. sync` to generate._"),t.push("")),t.join(`
249
- `)}async saveDraft(e,t){let n={...t,status:"draft"};Ji.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:k()})),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=k(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ji.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 Pu(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 Jh("sha256").update(JSON.stringify(t)).digest("hex")}},$t=new Xi});var Du=w(()=>{"use strict"});import{z as me}from"zod";var Xr,nn,Wh,rE,Yi,Ru,Js=w(()=>{"use strict";Xr=me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),nn=me.object({primaryDomain:Xr,secondaryDomains:me.array(Xr),confidence:me.number().min(0).max(1),filePatterns:me.array(me.string()),relevantAgents:me.array(me.string())}),Wh=me.object({classification:nn,classifiedAt:me.string(),source:me.enum(["cache","history","llm","heuristic"]),descriptionHash:me.string(),projectId:me.string()}),rE=me.object({entries:me.record(me.string(),Wh),confirmedPatterns:me.array(me.object({descriptionHash:me.string(),classification:nn,confirmedAt:me.string(),taskDescription:me.string()}))}),Yi={entries:{},confirmedPatterns:[]},Ru={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as O}from"zod";var Bh,Vh,$u,qh,Kh,Xh,Yh,Qh,Mu,aE,Qi=w(()=>{"use strict";Bh=O.enum(["low","medium","high"]),Vh=O.enum(["pending","converted","completed","archived","dormant"]),$u=O.enum(["high","medium","low"]),qh=O.object({impact:$u,effort:$u}),Kh=O.object({frontend:O.string().optional(),backend:O.string().optional(),payments:O.string().optional(),ai:O.string().optional(),deploy:O.string().optional(),other:O.array(O.string()).optional()}),Xh=O.object({name:O.string(),description:O.string()}),Yh=O.object({name:O.string(),description:O.string().optional()}),Qh=O.object({id:O.string(),text:O.string(),details:O.string().optional(),priority:Bh,status:Vh,tags:O.array(O.string()),addedAt:O.string(),completedAt:O.string().optional(),convertedTo:O.string().optional(),source:O.string().optional(),sourceFiles:O.array(O.string()).optional(),painPoints:O.array(O.string()).optional(),solutions:O.array(O.string()).optional(),filesAffected:O.array(O.string()).optional(),impactEffort:qh.optional(),implementationNotes:O.string().optional(),stack:Kh.optional(),modules:O.array(Xh).optional(),roles:O.array(Yh).optional(),risks:O.array(O.string()).optional(),risksCount:O.number().optional()}),Mu=O.object({ideas:O.array(Qh),lastUpdated:O.string()}),aE={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as U}from"zod";function _u(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Fu,Zh,ey,ty,ny,sy,pE,Ou,Zi=w(()=>{"use strict";Fu=U.enum(["linear","jira","github","monday","asana","none"]),Zh=U.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),ey=U.enum(["none","urgent","high","medium","low"]),ty=U.enum(["feature","bug","improvement","task","chore","epic"]),ny=U.object({id:U.string(),identifier:U.string(),title:U.string(),description:U.string().optional(),status:Zh,priority:ey,type:ty.optional(),assignee:U.object({id:U.string(),name:U.string(),email:U.string().optional()}).optional(),labels:U.array(U.string()).default([]),team:U.object({id:U.string(),name:U.string(),key:U.string().optional()}).optional(),project:U.object({id:U.string(),name:U.string()}).optional(),url:U.string(),createdAt:U.string(),updatedAt:U.string(),fetchedAt:U.string()}),sy=U.object({provider:Fu,lastSync:U.string(),staleAfter:U.number().default(18e5),issues:U.record(U.string(),ny)}),pE=U.object({provider:Fu,fetched:U.number(),updated:U.number(),errors:U.array(U.object({issueId:U.string(),error:U.string()})),timestamp:U.string()}),Ou=l(r=>sy.parse(r),"parseIssues");l(_u,"createEmptyIssues")});var Gu={};fn(Gu,{AgentAssignmentSchema:()=>Nu,OUTPUT_SCHEMAS:()=>Uu,SubtaskBreakdownSchema:()=>Lu,TaskClassificationSchema:()=>nn,renderSchemaForPrompt:()=>ea});import{z as Ae}from"zod";function ea(r){let e=Uu[r];return e?`## OUTPUT FORMAT
248
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Lh)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}},F=new Br,it=F});import Iu from"node:fs/promises";import Uh from"node:path";var Ce,$t=w(()=>{"use strict";Ki();K();Wr();Q();at();Ce=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new yt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}getContextPath(e,t){let n=this.getLayer();return P.getFilePath(e,n,t)}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=F.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){let n=this.getContextPath(e,this.getMdFilename());await Iu.mkdir(Uh.dirname(n),{recursive:!0}),F.setDoc(e,this.getStoreKey(),t);let s=this.toMarkdown(t);await Iu.writeFile(n,s,"utf-8"),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:b(),projectId:e};await Qn.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return F.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as Hh}from"node:crypto";var Yi,Mt,Vr=w(()=>{"use strict";Bi();Q();$t();Yi=class extends Ce{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getMdFilename(){return"analysis.md"}getLayer(){return"analysis"}getEventType(e){return`analysis.${e}d`}toMarkdown(e){let t=["# Analysis Status",""];return e.sealed&&(t.push("## Sealed Analysis"),t.push("- **Status**: sealed"),t.push(`- **Commit**: \`${e.sealed.commitHash||"unknown"}\``),t.push(`- **Sealed at**: ${e.sealed.sealedAt||"unknown"}`),t.push(`- **Languages**: ${e.sealed.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.sealed.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.sealed.fileCount}`),e.sealed.patterns.length>0&&t.push(`- **Patterns**: ${e.sealed.patterns.map(n=>n.name).join(", ")}`),t.push("")),e.draft&&e.draft.status==="draft"&&(t.push("## Draft Analysis"),t.push("- **Status**: draft (not yet sealed)"),t.push(`- **Commit**: \`${e.draft.commitHash||"unknown"}\``),t.push(`- **Analyzed at**: ${e.draft.analyzedAt}`),t.push(`- **Languages**: ${e.draft.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.draft.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.draft.fileCount}`),t.push("")),!e.sealed&&!e.draft&&(t.push("_No analysis available. Run `p. sync` to generate._"),t.push("")),t.join(`
249
+ `)}async saveDraft(e,t){let n={...t,status:"draft"};Wi.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:b()})),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=b(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Wi.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 bu(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 Hh("sha256").update(JSON.stringify(t)).digest("hex")}},Mt=new Yi});var ju=w(()=>{"use strict"});import{z as ge}from"zod";var qr,nn,Gh,QT,Qi,Du,Gs=w(()=>{"use strict";qr=ge.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),nn=ge.object({primaryDomain:qr,secondaryDomains:ge.array(qr),confidence:ge.number().min(0).max(1),filePatterns:ge.array(ge.string()),relevantAgents:ge.array(ge.string())}),Gh=ge.object({classification:nn,classifiedAt:ge.string(),source:ge.enum(["cache","history","llm","heuristic"]),descriptionHash:ge.string(),projectId:ge.string()}),QT=ge.object({entries:ge.record(ge.string(),Gh),confirmedPatterns:ge.array(ge.object({descriptionHash:ge.string(),classification:nn,confirmedAt:ge.string(),taskDescription:ge.string()}))}),Qi={entries:{},confirmedPatterns:[]},Du={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z as _}from"zod";var zh,Jh,Ru,Wh,Bh,Vh,qh,Kh,$u,tE,Zi=w(()=>{"use strict";zh=_.enum(["low","medium","high"]),Jh=_.enum(["pending","converted","completed","archived","dormant"]),Ru=_.enum(["high","medium","low"]),Wh=_.object({impact:Ru,effort:Ru}),Bh=_.object({frontend:_.string().optional(),backend:_.string().optional(),payments:_.string().optional(),ai:_.string().optional(),deploy:_.string().optional(),other:_.array(_.string()).optional()}),Vh=_.object({name:_.string(),description:_.string()}),qh=_.object({name:_.string(),description:_.string().optional()}),Kh=_.object({id:_.string(),text:_.string(),details:_.string().optional(),priority:zh,status:Jh,tags:_.array(_.string()),addedAt:_.string(),completedAt:_.string().optional(),convertedTo:_.string().optional(),source:_.string().optional(),sourceFiles:_.array(_.string()).optional(),painPoints:_.array(_.string()).optional(),solutions:_.array(_.string()).optional(),filesAffected:_.array(_.string()).optional(),impactEffort:Wh.optional(),implementationNotes:_.string().optional(),stack:Bh.optional(),modules:_.array(Vh).optional(),roles:_.array(qh).optional(),risks:_.array(_.string()).optional(),risksCount:_.number().optional()}),$u=_.object({ideas:_.array(Kh),lastUpdated:_.string()}),tE={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as G}from"zod";function Fu(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Mu,Xh,Yh,Qh,Zh,oE,iE,ea=w(()=>{"use strict";Mu=G.enum(["linear","jira","github","monday","asana","none"]),Xh=G.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),Yh=G.enum(["none","urgent","high","medium","low"]),Qh=G.enum(["feature","bug","improvement","task","chore","epic"]),Zh=G.object({id:G.string(),identifier:G.string(),title:G.string(),description:G.string().optional(),status:Xh,priority:Yh,type:Qh.optional(),assignee:G.object({id:G.string(),name:G.string(),email:G.string().optional()}).optional(),labels:G.array(G.string()).default([]),team:G.object({id:G.string(),name:G.string(),key:G.string().optional()}).optional(),project:G.object({id:G.string(),name:G.string()}).optional(),url:G.string(),createdAt:G.string(),updatedAt:G.string(),fetchedAt:G.string()}),oE=G.object({provider:Mu,lastSync:G.string(),staleAfter:G.number().default(18e5),issues:G.record(G.string(),Zh)}),iE=G.object({provider:Mu,fetched:G.number(),updated:G.number(),errors:G.array(G.object({issueId:G.string(),error:G.string()})),timestamp:G.string()});l(Fu,"createEmptyIssues")});var Uu={};fn(Uu,{AgentAssignmentSchema:()=>Ou,OUTPUT_SCHEMAS:()=>Nu,SubtaskBreakdownSchema:()=>_u,TaskClassificationSchema:()=>nn,renderSchemaForPrompt:()=>ta});import{z as Ae}from"zod";function ta(r){let e=Nu[r];return e?`## OUTPUT FORMAT
250
250
 
251
251
  Return ONLY valid JSON matching this schema (no markdown, no explanation):
252
252
 
@@ -255,11 +255,11 @@ ${e.example}
255
255
  \`\`\`
256
256
 
257
257
  Fields:
258
- ${ry(e.schema)}`:null}function ry(r){if(r instanceof Ae.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Hu(n)}`).join(`
259
- `)}return"(see example above)"}function Hu(r){return r instanceof Ae.ZodString?"string":r instanceof Ae.ZodNumber?"number":r instanceof Ae.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ae.ZodArray?`array of ${Hu(r.element)}`:r instanceof Ae.ZodObject?"object":"any"}var Nu,Lu,Uu,Yr=w(()=>{"use strict";Js();Js();Nu=Ae.object({agentName:Ae.string(),reasoning:Ae.string(),confidence:Ae.number().min(0).max(1)}),Lu=Ae.object({subtasks:Ae.array(Ae.object({description:Ae.string(),domain:Xr,agent:Ae.string(),dependsOn:Ae.array(Ae.number())})),effort:Ae.enum(["low","medium","high"])}),Uu={classification:{schema:nn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Nu,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Lu,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(ea,"renderSchemaForPrompt");l(ry,"describeSchema");l(Hu,"describeField")});import{z as T}from"zod";var zu,oy,iy,Ju,ay,cy,ly,uy,py,dy,my,Wu,gy,fy,SE,Bu,Vu,qu,Ku,hy,Qr,ta=w(()=>{"use strict";zu=T.number().min(1).max(5),oy=T.enum(["exceeded","met","partial","failed"]),iy=T.enum(["definitely","probably","maybe","no"]),Ju=T.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),ay=T.object({estimated:T.object({hours:T.number(),confidence:T.enum(["low","medium","high"]).optional(),source:T.enum(["prd","manual","historical"]).optional()}),actual:T.object({hours:T.number(),commits:T.number().optional(),linesAdded:T.number().optional(),linesRemoved:T.number().optional(),sessions:T.number().optional()}),variance:T.object({hours:T.number(),percentage:T.number(),reason:Ju.optional(),explanation:T.string().optional()})}),cy=T.object({name:T.string(),baseline:T.number().nullable(),target:T.number(),actual:T.number(),unit:T.string(),achieved:T.boolean(),percentOfTarget:T.number()}),ly=T.object({criteria:T.string(),met:T.boolean(),notes:T.string().optional()}),uy=T.object({metrics:T.array(cy),acceptanceCriteria:T.array(ly),overallSuccess:oy,successScore:T.number().min(0).max(100)}),py=T.object({category:T.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:T.string(),actionable:T.boolean(),action:T.string().optional()}),dy=T.object({whatWorked:T.array(T.string()),whatDidnt:T.array(T.string()),surprises:T.array(T.string()),recommendations:T.array(py)}),my=T.object({valueDelivered:T.number().min(1).max(10),userImpact:T.enum(["none","low","medium","high","critical"]),businessImpact:T.enum(["none","low","medium","high","critical"]),roiScore:T.number(),worthIt:iy,worthItReason:T.string().optional(),alternativeConsidered:T.string().optional(),betterAlternativeExists:T.boolean().optional()}),Wu=T.object({id:T.string(),taskId:T.string(),description:T.string(),estimatedMinutes:T.number().optional(),actualMinutes:T.number(),completedAsPlanned:T.boolean(),qualityScore:zu,blockers:T.array(T.string()),agentUsed:T.string().optional(),skillsUsed:T.array(T.string()).optional(),startedAt:T.string(),completedAt:T.string()}),gy=T.object({id:T.string(),featureId:T.string(),featureName:T.string(),prdId:T.string().nullable(),version:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional(),effort:ay,success:uy.optional(),learnings:dy,roi:my,rating:zu,taskOutcomes:T.array(Wu).optional(),startedAt:T.string(),shippedAt:T.string(),reviewedAt:T.string().optional(),reviewedBy:T.string().optional(),legacy:T.boolean().optional()}),fy=T.object({totalFeatures:T.number(),averageEstimationAccuracy:T.number(),averageSuccessRate:T.number(),averageROI:T.number(),bySuccessLevel:T.object({exceeded:T.number(),met:T.number(),partial:T.number(),failed:T.number()}),variancePatterns:T.array(T.object({reason:Ju,count:T.number(),averageVariance:T.number()})),topLearnings:T.array(T.object({insight:T.string(),frequency:T.number()}))}),SE=T.object({outcomes:T.array(gy),taskOutcomes:T.array(Wu).optional(),aggregates:fy.optional(),lastUpdated:T.string(),lastAggregated:T.string().optional()}),Bu={outcomes:[],taskOutcomes:[],lastUpdated:""},Vu=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"),qu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Ku=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),hy=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Qr=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(p=>hy(p.effort.variance.percentage)),t=r.filter(p=>p.success).map(p=>p.success.successScore),n=r.map(p=>p.roi.roiScore),s={exceeded:r.filter(p=>p.success?.overallSuccess==="exceeded").length,met:r.filter(p=>p.success?.overallSuccess==="met").length,partial:r.filter(p=>p.success?.overallSuccess==="partial").length,failed:r.filter(p=>p.success?.overallSuccess==="failed").length},o=r.filter(p=>p.effort.variance.reason).reduce((p,m)=>{let d=m.effort.variance.reason;return p[d]||(p[d]={count:0,totalVariance:0}),p[d].count++,p[d].totalVariance+=m.effort.variance.percentage,p},{}),i=Object.entries(o).map(([p,m])=>({reason:p,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(p=>[...p.learnings.whatWorked,...p.learnings.whatDidnt]).reduce((p,m)=>(p[m]=(p[m]||0)+1,p),{}),u=Object.entries(c).sort((p,m)=>m[1]-p[1]).slice(0,10).map(([p,m])=>({insight:p,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((p,m)=>p+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((p,m)=>p+m,0)/t.length):0,averageROI:Math.round(n.reduce((p,m)=>p+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as xe}from"zod";function Py(){let r={};for(let e of Sy)r[e]="allow";for(let e of ky)r[e]="ask";for(let e of by)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Zr,CE,yy,na,wy,vE,Sy,ky,by,xE,Xu=w(()=>{"use strict";Zr=xe.enum(["allow","deny","ask"]),CE=xe.enum(["read","write","delete","create"]),yy=xe.record(xe.string(),Zr),na=xe.record(xe.string(),Zr),wy=xe.object({enabled:xe.boolean().default(!0),allowedDomains:xe.array(xe.string()).optional(),blockedDomains:xe.array(xe.string()).optional()}),vE=xe.object({bash:yy.optional(),files:xe.object({read:na.optional(),write:na.optional(),delete:na.optional()}).optional(),web:wy.optional(),skills:xe.record(xe.string(),Zr).optional(),doomLoop:xe.object({enabled:xe.boolean().default(!0),maxRetries:xe.number().default(3)}).optional(),externalDirectories:Zr.default("ask")}),Sy=["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*"],ky=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],by=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Py,"buildDefaultPermissions");xE=Py()});import{z as Ne}from"zod";var IE,jE,Yu=w(()=>{"use strict";IE=Ne.object({projectId:Ne.string(),name:Ne.string(),repoPath:Ne.string(),description:Ne.string().optional(),version:Ne.string().optional(),cliVersion:Ne.string().optional(),techStack:Ne.array(Ne.string()),fileCount:Ne.number(),commitCount:Ne.number(),createdAt:Ne.string(),lastSync:Ne.string(),lastSyncCommit:Ne.string().optional(),lastSyncBranch:Ne.string().optional()}),jE={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Cy,vy,xy,Ty,Ey,Ay,Iy,jy,Dy,Ry,$y,My,Fy,Oy,_y,Ny,Ly,Uy,ME,FE,Qu=w(()=>{"use strict";Cy=A.enum(["planned","active","completed","shipped"]),vy=A.enum(["low","medium","high"]),xy=A.enum(["feature","breaking_change","refactor","infrastructure"]),Ty=A.enum(["completed","active","planned"]),Ey=A.enum(["planned","active","completed"]),Ay=A.enum(["git","git-branch","manual","prd"]),Iy=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),jy=A.object({id:A.string(),name:A.string(),status:Ty,completedAt:A.string().optional()}),Dy=A.object({goal:A.string(),phases:A.array(jy),successMetrics:A.array(A.string()).optional()}),Ry=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),$y=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),My=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Fy=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),Oy=A.object({estimated:My.nullable(),actual:Fy.nullable()}),_y=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),Ny=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:_y.optional(),status:Ey,startDate:A.string().optional(),endDate:A.string().optional()}),Ly=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Cy,impact:vy,effort:A.string().optional(),progress:A.number(),type:xy.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(Iy),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Ry.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:Ay.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:Oy.optional(),valueScore:A.number().optional(),commits:A.array($y).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),Uy=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()}),ME=A.object({strategy:Dy.nullable().optional(),features:A.array(Ly),backlog:A.array(A.union([A.string(),Uy])),lastUpdated:A.string(),quarters:A.array(Ny).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),FE={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 Hy from"node:crypto";import{homedir as Gy}from"node:os";import{join as Zu}from"node:path";function oe(){return Hy.randomUUID()}function Ws(r){return Zu(ep,r)}var ep,sa=w(()=>{"use strict";l(oe,"generateUUID");ep=Zu(Gy(),".prjct-cli","projects");l(Ws,"getProjectPath")});import{z as W}from"zod";var zy,tp,Jy,Wy,By,Vy,qy,Ky,Xy,np,ra=w(()=>{"use strict";zy=W.enum(["feature","fix","improvement","refactor"]),tp=W.enum(["pass","warning","fail","skipped"]),Jy=W.enum(["added","changed","fixed","removed"]),Wy=W.object({hours:W.number(),minutes:W.number(),totalMinutes:W.number()}),By=W.object({filesChanged:W.number().nullable().optional(),linesAdded:W.number().nullable().optional(),linesRemoved:W.number().nullable().optional(),commits:W.number().nullable().optional()}),Vy=W.object({description:W.string(),type:Jy.optional()}),qy=W.object({lintStatus:tp.nullable().optional(),lintDetails:W.string().optional(),testStatus:tp.nullable().optional(),testDetails:W.string().optional()}),Ky=W.object({hash:W.string().optional(),message:W.string().optional(),branch:W.string().optional()}),Xy=W.object({id:W.string(),name:W.string(),version:W.string().nullable().optional(),type:zy,agent:W.string().optional(),description:W.string().optional(),changes:W.array(Vy).optional(),codeSnippets:W.array(W.string()).optional(),commit:Ky.optional(),codeMetrics:By.optional(),qualityMetrics:qy.optional(),quantitativeImpact:W.string().optional(),duration:Wy.optional(),tasksCompleted:W.number().nullable().optional(),shippedAt:W.string(),featureId:W.string().optional()}),np=W.object({shipped:W.array(Xy),lastUpdated:W.string()})});import{z as x}from"zod";var Yy,rp,Qy,Zy,ew,oa,op,tw,nw,ip,sp,sw,rw,ap,cp,lp,ow,iw,qE,eo=w(()=>{"use strict";Ls();Yy=x.enum(["low","medium","high","critical"]),rp=x.enum(["feature","bug","improvement","chore"]),Qy=x.enum(["active","backlog","previously_active"]),Zy=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ew=x.enum(["task_completed","feature_shipped","idea_captured","session_started"]),oa=x.object({title:x.string(),description:x.string(),filesChanged:x.array(x.object({path:x.string(),action:x.enum(["created","modified","deleted"])})),whatWasDone:x.array(x.string()).min(1),outputForNextAgent:x.string().min(1),notes:x.string().optional()}),op=x.object({output:x.string().min(1,"Subtask output is required"),summary:oa}),tw=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:Zy,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:oa.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),nw=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),ip=x.object({id:x.string(),description:x.string(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(tw).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:nw.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Ns.optional()}),sp=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional()}),sw=x.object({stackConfirmed:x.array(x.string()).optional(),patternsDiscovered:x.array(x.string()).optional(),agentAccuracy:x.array(x.object({agent:x.string(),rating:x.enum(["helpful","neutral","inaccurate"]),note:x.string().optional()})).optional(),issuesEncountered:x.array(x.string()).optional()}),rw=x.object({taskId:x.string(),title:x.string(),classification:rp,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(oa),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:sw.optional()}),ap=x.object({currentTask:ip.nullable(),previousTask:sp.nullable().optional(),pausedTasks:x.array(sp).optional(),taskHistory:x.array(rw).optional(),lastUpdated:x.string()}),cp=x.object({id:x.string(),description:x.string(),priority:Yy,type:rp,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:Qy,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),lp=x.object({tasks:x.array(cp),lastUpdated:x.string()}),ow=x.object({tasksToday:x.number(),tasksThisWeek:x.number(),streak:x.number(),velocity:x.string(),avgDuration:x.string()}),iw=x.object({type:ew,description:x.string(),timestamp:x.string(),duration:x.string().optional()}),qE=x.object({projectId:x.string(),currentTask:ip.nullable(),queue:x.array(cp),stats:ow,recentActivity:x.array(iw),lastSync:x.string()})});import{z as Q}from"zod";var aw,cw,up,QE,ZE,eA,sn,pp,ts=w(()=>{"use strict";aw=Q.enum(["improving","stable","declining"]),cw=Q.object({sprintNumber:Q.number(),startDate:Q.string(),endDate:Q.string(),pointsCompleted:Q.number(),tasksCompleted:Q.number(),avgVariance:Q.number(),estimationAccuracy:Q.number()}),up=Q.object({category:Q.string(),avgVariance:Q.number(),taskCount:Q.number()}),QE=Q.object({totalPoints:Q.number(),sprints:Q.number(),estimatedDate:Q.string()}),ZE=Q.object({sprints:Q.array(cw),averageVelocity:Q.number(),velocityTrend:aw,estimationAccuracy:Q.number(),overEstimated:Q.array(up),underEstimated:Q.array(up),lastUpdated:Q.string()}),eA=Q.object({sprintLengthDays:Q.number().min(1).max(90).default(7),startDay:Q.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:Q.number().min(1).max(52).default(6),accuracyTolerance:Q.number().min(0).max(100).default(20)}),sn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},pp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var yt=w(()=>{"use strict";Du();Wi();Js();Qi();Zi();Yr();Ls();ta();Xu();Yu();Qu();sa();ra();eo();ts()});var wt,ia,Ze,rn=w(()=>{"use strict";yt();Y();Dt();wt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ia=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=oe(),s=k();return J.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=k();return J.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(oe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?J.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):J.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=J.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=J.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(J.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);J.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return J.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ze=new ia});var aa,zt,ca=w(()=>{"use strict";yt();Qi();Y();rn();Rt();aa=class extends ve{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Mu)}getDefault(){return{ideas:[],lastUpdated:""}}getMdFilename(){return"ideas.md"}getLayer(){return"planning"}getEventType(e){return`ideas.${e}d`}toMarkdown(e){let t=["# IDEAS \u{1F4A1}",""],n=e.ideas.filter(a=>a.status==="pending"),s=e.ideas.filter(a=>a.status==="converted"),o=e.ideas.filter(a=>a.status==="archived"),i=e.ideas.filter(a=>a.status==="dormant");return t.push("## Brain Dump"),n.length>0?n.forEach(a=>{let c=Xe(a.addedAt),u=a.tags.length>0?` ${a.tags.map(m=>`#${m}`).join(" ")}`:"",p=a.priority!=="medium"?` [${a.priority.toUpperCase()}]`:"";t.push(`- ${a.text}${p} _(${c})_${u}`)}):t.push("_No pending ideas_"),t.push(""),s.length>0&&(t.push("## Converted"),s.forEach(a=>{let c=Xe(a.addedAt),u=a.convertedTo?` \u2192 ${a.convertedTo}`:"";t.push(`- \u2713 ${a.text}${u} _(${c})_`)}),t.push("")),o.length>0&&(t.push("## Archived"),o.forEach(a=>{let c=Xe(a.addedAt);t.push(`- ${a.text} _(${c})_`)}),t.push("")),i.length>0&&(t.push(`_${i.length} dormant idea(s) excluded from context_`),t.push("")),t.join(`
260
- `)}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:oe(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:k()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:k()})),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:k()})),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:k()})),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:k()}))}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:k()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:k()}))}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:k()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=en(wt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;Ze.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:k()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},zt=new aa});import lw from"node:crypto";import to from"node:fs/promises";import dp from"node:path";function mp(){return{version:St,lastUpdated:"",checksums:{}}}var St,la,Re,Bs=w(()=>{"use strict";K();M();Y();Dt();St="1.0.0";l(mp,"getDefaultChecksums");la=class{static{l(this,"IndexStorage")}getIndexPath(e){return dp.join(P.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await to.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==St?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 mp()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await to.readFile(e);return lw.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:St,lastUpdated:k(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{J.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await to.readdir(t);await Promise.all(n.map(s=>to.unlink(dp.join(t,s))))}catch(n){if(!S(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!==St?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!==St?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=J.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=J.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)}},Re=new la});import{z as ge}from"zod";function ua(r,e="default"){let t=gp[e]||gp.default;return r/1e3*t}function ns(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var uw,pw,fp,hp,gp,no=w(()=>{"use strict";uw=ge.object({date:ge.string(),tokensSaved:ge.number(),syncs:ge.number(),avgCompressionRate:ge.number(),totalDuration:ge.number()}),pw=ge.object({agentName:ge.string(),usageCount:ge.number(),tokensSaved:ge.number()}),fp=ge.object({totalTokensSaved:ge.number(),avgCompressionRate:ge.number(),syncCount:ge.number(),watchTriggers:ge.number(),avgSyncDuration:ge.number(),totalSyncDuration:ge.number(),agentUsage:ge.array(pw),dailyStats:ge.array(uw),firstSync:ge.string(),lastUpdated:ge.string()}),hp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},gp={"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(ua,"estimateCostSaved");l(ns,"formatCost")});var pa,yn,so=w(()=>{"use strict";no();Y();Rt();pa=class extends ve{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",fp)}getDefault(){return{...hp}}getMdFilename(){return"metrics.md"}getLayer(){return"context"}getEventType(e){return`metrics.${e}d`}toMarkdown(e){let t=["# Value Dashboard \u{1F4CA}",""];if(e.syncCount===0)return t.push("_No metrics yet. Run `prjct sync` to start tracking._"),t.push(""),t.join(`
261
- `);if(t.push("## \u{1F4B0} Token Savings"),t.push(""),t.push(`- **Total saved**: ${this.formatTokens(e.totalTokensSaved)} tokens`),t.push(`- **Compression**: ${(e.avgCompressionRate*100).toFixed(0)}% average reduction`),t.push(`- **Estimated cost saved**: ${ns(ua(e.totalTokensSaved))}`),t.push(""),t.push("## \u26A1 Performance"),t.push(""),t.push(`- **Syncs completed**: ${e.syncCount.toLocaleString()}`),t.push(`- **Avg sync time**: ${this.formatDuration(e.avgSyncDuration)}`),e.watchTriggers>0&&t.push(`- **Watch triggers**: ${e.watchTriggers.toLocaleString()} auto-syncs`),t.push(""),e.agentUsage.length>0){t.push("## \u{1F916} Agent Usage"),t.push("");let n=[...e.agentUsage].sort((o,i)=>i.usageCount-o.usageCount),s=n.reduce((o,i)=>o+i.usageCount,0);n.slice(0,5).forEach(o=>{let i=s>0?(o.usageCount/s*100).toFixed(0):0;t.push(`- **${o.agentName}**: ${i}% (${o.usageCount} uses)`)}),t.push("")}if(e.dailyStats.length>0){t.push("## \u{1F4C8} 30-Day Trend"),t.push("");let n=this.getLast30Days(e.dailyStats),s=n.reduce((o,i)=>o+i.tokensSaved,0);t.push(`- **Tokens saved**: ${this.formatTokens(s)}`),t.push(`- **Syncs**: ${n.reduce((o,i)=>o+i.syncs,0)}`),t.push(""),t.push("```"),t.push(this.generateSparkline(n)),t.push("```"),t.push("")}return t.push("---"),t.push(""),e.firstSync&&t.push(`_Tracking since ${new Date(e.firstSync).toLocaleDateString()}_`),t.push(""),t.join(`
262
- `)}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,p=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],d=m.findIndex(v=>v.date===o);if(d>=0){let v=m[d];m[d]={...v,tokensSaved:v.tokensSaved+n,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+s)/(v.syncs+1),totalDuration:v.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],b=m.filter(v=>v.date>=f),E=[...i.agentUsage];if(t.agents)for(let v of t.agents){let $=E.findIndex(G=>G.agentName===v);$>=0?E[$]={...E[$],usageCount:E[$].usageCount+1,tokensSaved:E[$].tokensSaved+Math.floor(n/t.agents.length)}:E.push({agentName:v,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:p,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:E,dailyStats:b,firstSync:i.firstSync||k(),lastUpdated:k()}})}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:ua(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)}formatTokens(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toLocaleString()}formatDuration(e){return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}generateSparkline(e){if(e.length===0)return"";let t="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",n=e.map(o=>o.tokensSaved),s=Math.max(...n,1);return n.map(o=>{let i=Math.min(Math.floor(o/s*(t.length-1)),t.length-1);return t[i]}).join("")}},yn=new pa});import Jt from"node:fs/promises";import we from"node:path";async function ma(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(J.exists(r)&&J.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=P.getGlobalProjectPath(r),s=we.join(n,"storage"),o=we.join(n,"index"),i=we.join(n,"memory");t.backupDir=await mw(s,o,i),J.getDb(r);for(let{filename:a,key:c}of yp){let u=we.join(s,a),p=await ro(u);if(p===null){t.skippedFiles.push(a);continue}try{J.setDoc(r,c,p),gw(r,c,p),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of dw){let u=we.join(o,a),p=await ro(u);if(p===null){t.skippedFiles.push(`index/${a}`);continue}try{J.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(p),new Date().toISOString()),bw(r,c,p),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Cw(r,o,t),await vw(r,o,t),await xw(r,i,t),await Tw(r,i,t),t.errors.length===0&&await Ew(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 mw(r,e,t){let n=we.join(r,"backup");return await Jt.mkdir(n,{recursive:!0}),await Jt.mkdir(we.join(n,"index"),{recursive:!0}),await Jt.mkdir(we.join(n,"memory"),{recursive:!0}),await da(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await da(e,we.join(n,"index")),await da(t,we.join(n,"memory")),n}async function da(r,e,t){try{let n=await Jt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=we.join(r,s.name),i=we.join(e,s.name);await Jt.copyFile(o,i)}}catch(n){if(!S(n))throw n}}function gw(r,e,t){switch(e){case"state":fw(r,t);break;case"queue":hw(r,t);break;case"ideas":yw(r,t);break;case"shipped":ww(r,t);break;case"metrics":Sw(r,t);break;case"analysis":kw(r,t);break}}function fw(r,e){let t=J.getDb(r),n=t.prepare(`
258
+ ${ey(e.schema)}`:null}function ey(r){if(r instanceof Ae.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Lu(n)}`).join(`
259
+ `)}return"(see example above)"}function Lu(r){return r instanceof Ae.ZodString?"string":r instanceof Ae.ZodNumber?"number":r instanceof Ae.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ae.ZodArray?`array of ${Lu(r.element)}`:r instanceof Ae.ZodObject?"object":"any"}var Ou,_u,Nu,Kr=w(()=>{"use strict";Gs();Gs();Ou=Ae.object({agentName:Ae.string(),reasoning:Ae.string(),confidence:Ae.number().min(0).max(1)}),_u=Ae.object({subtasks:Ae.array(Ae.object({description:Ae.string(),domain:qr,agent:Ae.string(),dependsOn:Ae.array(Ae.number())})),effort:Ae.enum(["low","medium","high"])}),Nu={classification:{schema:nn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Ou,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:_u,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(ta,"renderSchemaForPrompt");l(ey,"describeSchema");l(Lu,"describeField")});import{z as E}from"zod";var Hu,ty,ny,Gu,sy,ry,oy,iy,ay,cy,ly,zu,uy,py,gE,Ju,Wu,Bu,Vu,dy,Xr,na=w(()=>{"use strict";Hu=E.number().min(1).max(5),ty=E.enum(["exceeded","met","partial","failed"]),ny=E.enum(["definitely","probably","maybe","no"]),Gu=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),sy=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:Gu.optional(),explanation:E.string().optional()})}),ry=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),oy=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),iy=E.object({metrics:E.array(ry),acceptanceCriteria:E.array(oy),overallSuccess:ty,successScore:E.number().min(0).max(100)}),ay=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),cy=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(ay)}),ly=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:ny,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),zu=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Hu,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),uy=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:sy,success:iy.optional(),learnings:cy,roi:ly,rating:Hu,taskOutcomes:E.array(zu).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),py=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:Gu,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),gE=E.object({outcomes:E.array(uy),taskOutcomes:E.array(zu).optional(),aggregates:py.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),Ju={outcomes:[],taskOutcomes:[],lastUpdated:""},Wu=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"),Bu=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Vu=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),dy=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Xr=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(p=>dy(p.effort.variance.percentage)),t=r.filter(p=>p.success).map(p=>p.success.successScore),n=r.map(p=>p.roi.roiScore),s={exceeded:r.filter(p=>p.success?.overallSuccess==="exceeded").length,met:r.filter(p=>p.success?.overallSuccess==="met").length,partial:r.filter(p=>p.success?.overallSuccess==="partial").length,failed:r.filter(p=>p.success?.overallSuccess==="failed").length},o=r.filter(p=>p.effort.variance.reason).reduce((p,m)=>{let d=m.effort.variance.reason;return p[d]||(p[d]={count:0,totalVariance:0}),p[d].count++,p[d].totalVariance+=m.effort.variance.percentage,p},{}),i=Object.entries(o).map(([p,m])=>({reason:p,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(p=>[...p.learnings.whatWorked,...p.learnings.whatDidnt]).reduce((p,m)=>(p[m]=(p[m]||0)+1,p),{}),u=Object.entries(c).sort((p,m)=>m[1]-p[1]).slice(0,10).map(([p,m])=>({insight:p,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((p,m)=>p+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((p,m)=>p+m,0)/t.length):0,averageROI:Math.round(n.reduce((p,m)=>p+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as ve}from"zod";function wy(){let r={};for(let e of fy)r[e]="allow";for(let e of hy)r[e]="ask";for(let e of yy)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var Yr,wE,my,sa,gy,SE,fy,hy,yy,kE,qu=w(()=>{"use strict";Yr=ve.enum(["allow","deny","ask"]),wE=ve.enum(["read","write","delete","create"]),my=ve.record(ve.string(),Yr),sa=ve.record(ve.string(),Yr),gy=ve.object({enabled:ve.boolean().default(!0),allowedDomains:ve.array(ve.string()).optional(),blockedDomains:ve.array(ve.string()).optional()}),SE=ve.object({bash:my.optional(),files:ve.object({read:sa.optional(),write:sa.optional(),delete:sa.optional()}).optional(),web:gy.optional(),skills:ve.record(ve.string(),Yr).optional(),doomLoop:ve.object({enabled:ve.boolean().default(!0),maxRetries:ve.number().default(3)}).optional(),externalDirectories:Yr.default("ask")}),fy=["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*"],hy=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],yy=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(wy,"buildDefaultPermissions");kE=wy()});import{z as Le}from"zod";var vE,xE,Ku=w(()=>{"use strict";vE=Le.object({projectId:Le.string(),name:Le.string(),repoPath:Le.string(),description:Le.string().optional(),version:Le.string().optional(),cliVersion:Le.string().optional(),techStack:Le.array(Le.string()),fileCount:Le.number(),commitCount:Le.number(),createdAt:Le.string(),lastSync:Le.string(),lastSyncCommit:Le.string().optional(),lastSyncBranch:Le.string().optional()}),xE={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as A}from"zod";var Sy,ky,by,Py,Cy,vy,xy,Ty,Ey,Ay,Iy,jy,Dy,Ry,$y,My,Fy,Oy,IE,jE,Xu=w(()=>{"use strict";Sy=A.enum(["planned","active","completed","shipped"]),ky=A.enum(["low","medium","high"]),by=A.enum(["feature","breaking_change","refactor","infrastructure"]),Py=A.enum(["completed","active","planned"]),Cy=A.enum(["planned","active","completed"]),vy=A.enum(["git","git-branch","manual","prd"]),xy=A.object({id:A.string(),description:A.string(),completed:A.boolean(),completedAt:A.string().optional()}),Ty=A.object({id:A.string(),name:A.string(),status:Py,completedAt:A.string().optional()}),Ey=A.object({goal:A.string(),phases:A.array(Ty),successMetrics:A.array(A.string()).optional()}),Ay=A.object({hours:A.number(),minutes:A.number(),totalMinutes:A.number(),display:A.string().optional()}),Iy=A.object({hash:A.string(),message:A.string(),date:A.string(),author:A.string().optional()}),jy=A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),breakdown:A.array(A.object({area:A.string(),hours:A.number()})).optional()}),Dy=A.object({hours:A.number().optional(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional()}),Ry=A.object({estimated:jy.nullable(),actual:Dy.nullable()}),$y=A.object({totalHours:A.number(),allocatedHours:A.number(),bufferPercent:A.number().optional()}),My=A.object({id:A.string(),name:A.string(),theme:A.string().optional(),goals:A.array(A.string()).optional(),features:A.array(A.string()),capacity:$y.optional(),status:Cy,startDate:A.string().optional(),endDate:A.string().optional()}),Fy=A.object({id:A.string(),name:A.string(),description:A.string().optional(),date:A.string(),status:Sy,impact:ky,effort:A.string().optional(),progress:A.number(),type:by.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(xy),createdAt:A.string(),shippedAt:A.string().optional(),version:A.string().optional(),duration:Ay.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:vy.optional(),quarter:A.string().nullable().optional(),dependencies:A.array(A.string()).optional(),blockedBy:A.array(A.string()).optional(),effortTracking:Ry.optional(),valueScore:A.number().optional(),commits:A.array(Iy).optional(),branch:A.string().optional(),commitsAhead:A.number().optional()}),Oy=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()}),IE=A.object({strategy:Ey.nullable().optional(),features:A.array(Fy),backlog:A.array(A.union([A.string(),Oy])),lastUpdated:A.string(),quarters:A.array(My).optional(),generatedFrom:A.enum(["git-history","manual","prd"]).optional(),generatedAt:A.string().optional()}),jE={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 _y from"node:crypto";import{homedir as Ny}from"node:os";import{join as Ly}from"node:path";function ie(){return _y.randomUUID()}var Uy,Yu=w(()=>{"use strict";l(ie,"generateUUID");Uy=Ly(Ny(),".prjct-cli","projects")});import{z as W}from"zod";var Hy,Qu,Gy,zy,Jy,Wy,By,Vy,qy,Zu,ra=w(()=>{"use strict";Hy=W.enum(["feature","fix","improvement","refactor"]),Qu=W.enum(["pass","warning","fail","skipped"]),Gy=W.enum(["added","changed","fixed","removed"]),zy=W.object({hours:W.number(),minutes:W.number(),totalMinutes:W.number()}),Jy=W.object({filesChanged:W.number().nullable().optional(),linesAdded:W.number().nullable().optional(),linesRemoved:W.number().nullable().optional(),commits:W.number().nullable().optional()}),Wy=W.object({description:W.string(),type:Gy.optional()}),By=W.object({lintStatus:Qu.nullable().optional(),lintDetails:W.string().optional(),testStatus:Qu.nullable().optional(),testDetails:W.string().optional()}),Vy=W.object({hash:W.string().optional(),message:W.string().optional(),branch:W.string().optional()}),qy=W.object({id:W.string(),name:W.string(),version:W.string().nullable().optional(),type:Hy,agent:W.string().optional(),description:W.string().optional(),changes:W.array(Wy).optional(),codeSnippets:W.array(W.string()).optional(),commit:Vy.optional(),codeMetrics:Jy.optional(),qualityMetrics:By.optional(),quantitativeImpact:W.string().optional(),duration:zy.optional(),tasksCompleted:W.number().nullable().optional(),shippedAt:W.string(),featureId:W.string().optional()}),Zu=W.object({shipped:W.array(qy),lastUpdated:W.string()})});import{z as T}from"zod";var Ky,tp,Xy,Yy,Qy,oa,np,Zy,ew,sp,ep,tw,nw,rp,op,ip,sw,rw,zE,Qr=w(()=>{"use strict";_s();Ky=T.enum(["low","medium","high","critical"]),tp=T.enum(["feature","bug","improvement","chore"]),Xy=T.enum(["active","backlog","previously_active"]),Yy=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Qy=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),oa=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()}),np=T.object({output:T.string().min(1,"Subtask output is required"),summary:oa}),Zy=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:Yy,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:oa.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),ew=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),sp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Zy).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:ew.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:Os.optional()}),ep=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),tw=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()}),nw=T.object({taskId:T.string(),title:T.string(),classification:tp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(oa),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:tw.optional()}),rp=T.object({currentTask:sp.nullable(),previousTask:ep.nullable().optional(),pausedTasks:T.array(ep).optional(),taskHistory:T.array(nw).optional(),lastUpdated:T.string()}),op=T.object({id:T.string(),description:T.string(),priority:Ky,type:tp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:Xy,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),ip=T.object({tasks:T.array(op),lastUpdated:T.string()}),sw=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),rw=T.object({type:Qy,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),zE=T.object({projectId:T.string(),currentTask:sp.nullable(),queue:T.array(op),stats:sw,recentActivity:T.array(rw),lastSync:T.string()})});import{z as Z}from"zod";var ow,iw,ap,VE,qE,KE,sn,cp,Zn=w(()=>{"use strict";ow=Z.enum(["improving","stable","declining"]),iw=Z.object({sprintNumber:Z.number(),startDate:Z.string(),endDate:Z.string(),pointsCompleted:Z.number(),tasksCompleted:Z.number(),avgVariance:Z.number(),estimationAccuracy:Z.number()}),ap=Z.object({category:Z.string(),avgVariance:Z.number(),taskCount:Z.number()}),VE=Z.object({totalPoints:Z.number(),sprints:Z.number(),estimatedDate:Z.string()}),qE=Z.object({sprints:Z.array(iw),averageVelocity:Z.number(),velocityTrend:ow,estimationAccuracy:Z.number(),overEstimated:Z.array(ap),underEstimated:Z.array(ap),lastUpdated:Z.string()}),KE=Z.object({sprintLengthDays:Z.number().min(1).max(90).default(7),startDay:Z.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:Z.number().min(1).max(52).default(6),accuracyTolerance:Z.number().min(0).max(100).default(20)}),sn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},cp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var wt=w(()=>{"use strict";ju();Bi();Gs();Zi();ea();Kr();_s();na();qu();Ku();Xu();Yu();ra();Qr();Zn()});var St,ia,Ze,rn=w(()=>{"use strict";wt();Q();at();St={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ia=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=ie(),s=b();return F.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=b();return F.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(ie(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?F.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):F.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=F.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=F.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(F.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);F.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return F.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ze=new ia});var aa,kt,Zr=w(()=>{"use strict";wt();Zi();Q();rn();$t();aa=class extends Ce{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",$u)}getDefault(){return{ideas:[],lastUpdated:""}}getMdFilename(){return"ideas.md"}getLayer(){return"planning"}getEventType(e){return`ideas.${e}d`}toMarkdown(e){let t=["# IDEAS \u{1F4A1}",""],n=e.ideas.filter(a=>a.status==="pending"),s=e.ideas.filter(a=>a.status==="converted"),o=e.ideas.filter(a=>a.status==="archived"),i=e.ideas.filter(a=>a.status==="dormant");return t.push("## Brain Dump"),n.length>0?n.forEach(a=>{let c=Xe(a.addedAt),u=a.tags.length>0?` ${a.tags.map(m=>`#${m}`).join(" ")}`:"",p=a.priority!=="medium"?` [${a.priority.toUpperCase()}]`:"";t.push(`- ${a.text}${p} _(${c})_${u}`)}):t.push("_No pending ideas_"),t.push(""),s.length>0&&(t.push("## Converted"),s.forEach(a=>{let c=Xe(a.addedAt),u=a.convertedTo?` \u2192 ${a.convertedTo}`:"";t.push(`- \u2713 ${a.text}${u} _(${c})_`)}),t.push("")),o.length>0&&(t.push("## Archived"),o.forEach(a=>{let c=Xe(a.addedAt);t.push(`- ${a.text} _(${c})_`)}),t.push("")),i.length>0&&(t.push(`_${i.length} dormant idea(s) excluded from context_`),t.push("")),t.join(`
260
+ `)}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:ie(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:b()})),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:b()})),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:b()})),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:b()}))}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:b()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:b()}))}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:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=en(St.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;Ze.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:b()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},kt=new aa});import aw from"node:crypto";import eo from"node:fs/promises";import lp from"node:path";function up(){return{version:bt,lastUpdated:"",checksums:{}}}var bt,ca,Re,zs=w(()=>{"use strict";K();M();Q();at();bt="1.0.0";l(up,"getDefaultChecksums");ca=class{static{l(this,"IndexStorage")}getIndexPath(e){return lp.join(P.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await eo.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==bt?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 up()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await eo.readFile(e);return aw.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:bt,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{F.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await eo.readdir(t);await Promise.all(n.map(s=>eo.unlink(lp.join(t,s))))}catch(n){if(!S(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!==bt?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!==bt?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=F.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=F.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)}},Re=new ca});import{z as fe}from"zod";function la(r,e="default"){let t=pp[e]||pp.default;return r/1e3*t}function es(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var cw,lw,dp,mp,pp,to=w(()=>{"use strict";cw=fe.object({date:fe.string(),tokensSaved:fe.number(),syncs:fe.number(),avgCompressionRate:fe.number(),totalDuration:fe.number()}),lw=fe.object({agentName:fe.string(),usageCount:fe.number(),tokensSaved:fe.number()}),dp=fe.object({totalTokensSaved:fe.number(),avgCompressionRate:fe.number(),syncCount:fe.number(),watchTriggers:fe.number(),avgSyncDuration:fe.number(),totalSyncDuration:fe.number(),agentUsage:fe.array(lw),dailyStats:fe.array(cw),firstSync:fe.string(),lastUpdated:fe.string()}),mp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},pp={"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(la,"estimateCostSaved");l(es,"formatCost")});var ua,yn,no=w(()=>{"use strict";to();Q();$t();ua=class extends Ce{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",dp)}getDefault(){return{...mp}}getMdFilename(){return"metrics.md"}getLayer(){return"context"}getEventType(e){return`metrics.${e}d`}toMarkdown(e){let t=["# Value Dashboard \u{1F4CA}",""];if(e.syncCount===0)return t.push("_No metrics yet. Run `prjct sync` to start tracking._"),t.push(""),t.join(`
261
+ `);if(t.push("## \u{1F4B0} Token Savings"),t.push(""),t.push(`- **Total saved**: ${this.formatTokens(e.totalTokensSaved)} tokens`),t.push(`- **Compression**: ${(e.avgCompressionRate*100).toFixed(0)}% average reduction`),t.push(`- **Estimated cost saved**: ${es(la(e.totalTokensSaved))}`),t.push(""),t.push("## \u26A1 Performance"),t.push(""),t.push(`- **Syncs completed**: ${e.syncCount.toLocaleString()}`),t.push(`- **Avg sync time**: ${this.formatDuration(e.avgSyncDuration)}`),e.watchTriggers>0&&t.push(`- **Watch triggers**: ${e.watchTriggers.toLocaleString()} auto-syncs`),t.push(""),e.agentUsage.length>0){t.push("## \u{1F916} Agent Usage"),t.push("");let n=[...e.agentUsage].sort((o,i)=>i.usageCount-o.usageCount),s=n.reduce((o,i)=>o+i.usageCount,0);n.slice(0,5).forEach(o=>{let i=s>0?(o.usageCount/s*100).toFixed(0):0;t.push(`- **${o.agentName}**: ${i}% (${o.usageCount} uses)`)}),t.push("")}if(e.dailyStats.length>0){t.push("## \u{1F4C8} 30-Day Trend"),t.push("");let n=this.getLast30Days(e.dailyStats),s=n.reduce((o,i)=>o+i.tokensSaved,0);t.push(`- **Tokens saved**: ${this.formatTokens(s)}`),t.push(`- **Syncs**: ${n.reduce((o,i)=>o+i.syncs,0)}`),t.push(""),t.push("```"),t.push(this.generateSparkline(n)),t.push("```"),t.push("")}return t.push("---"),t.push(""),e.firstSync&&t.push(`_Tracking since ${new Date(e.firstSync).toLocaleDateString()}_`),t.push(""),t.join(`
262
+ `)}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,p=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],d=m.findIndex(x=>x.date===o);if(d>=0){let x=m[d];m[d]={...x,tokensSaved:x.tokensSaved+n,syncs:x.syncs+1,avgCompressionRate:(x.avgCompressionRate*x.syncs+s)/(x.syncs+1),totalDuration:x.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(x=>x.date>=f),v=[...i.agentUsage];if(t.agents)for(let x of t.agents){let $=v.findIndex(J=>J.agentName===x);$>=0?v[$]={...v[$],usageCount:v[$].usageCount+1,tokensSaved:v[$].tokensSaved+Math.floor(n/t.agents.length)}:v.push({agentName:x,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:p,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:v,dailyStats:k,firstSync:i.firstSync||b(),lastUpdated:b()}})}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:la(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)}formatTokens(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:e.toLocaleString()}formatDuration(e){return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}generateSparkline(e){if(e.length===0)return"";let t="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",n=e.map(o=>o.tokensSaved),s=Math.max(...n,1);return n.map(o=>{let i=Math.min(Math.floor(o/s*(t.length-1)),t.length-1);return t[i]}).join("")}},yn=new ua});import Ue from"node:fs/promises";import se from"node:path";async function ga(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(F.exists(r)&&F.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=P.getGlobalProjectPath(r),s=se.join(n,"storage"),o=se.join(n,"index"),i=se.join(n,"memory");t.backupDir=await uw(s,o,i),F.getDb(r);for(let{filename:a,key:c}of ma){let u=se.join(s,a),p=await wn(u);if(p===null){t.skippedFiles.push(a);continue}try{F.setDoc(r,c,p),gp(r,c,p),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of da){let u=se.join(o,a),p=await wn(u);if(p===null){t.skippedFiles.push(`index/${a}`);continue}try{F.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(p),new Date().toISOString()),fp(r,c,p),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await ww(r,o,t),await Sw(r,o,t),await kw(r,i,t),await bw(r,i,t),t.errors.length===0&&await Pw(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 uw(r,e,t){let n=se.join(r,"backup");return await Ue.mkdir(n,{recursive:!0}),await Ue.mkdir(se.join(n,"index"),{recursive:!0}),await Ue.mkdir(se.join(n,"memory"),{recursive:!0}),await pa(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await pa(e,se.join(n,"index")),await pa(t,se.join(n,"memory")),n}async function pa(r,e,t){try{let n=await Ue.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=se.join(r,s.name),i=se.join(e,s.name);await Ue.copyFile(o,i)}}catch(n){if(!S(n))throw n}}function gp(r,e,t){switch(e){case"state":pw(r,t);break;case"queue":dw(r,t);break;case"ideas":mw(r,t);break;case"shipped":gw(r,t);break;case"metrics":fw(r,t);break;case"analysis":hw(r,t);break}}function pw(r,e){let t=F.getDb(r),n=t.prepare(`
263
263
  INSERT OR REPLACE INTO tasks
264
264
  (id, description, type, status, parent_description, branch, linear_id,
265
265
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -270,67 +270,68 @@ ${ry(e.schema)}`:null}function ry(r){if(r instanceof Ae.ZodObject){let e=r.shape
270
270
  (id, task_id, description, status, domain, agent, sort_order,
271
271
  depends_on, started_at, completed_at, output, summary)
272
272
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
273
- `),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 p=0;p<u.length;p++){let m=u[p];s.run(m.id??`subtask-${p}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,p,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 hw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=J.getDb(r).prepare(`
273
+ `),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 p=0;p<u.length;p++){let m=u[p];s.run(m.id??`subtask-${p}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,p,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 dw(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=F.getDb(r).prepare(`
274
274
  INSERT OR REPLACE INTO queue_tasks
275
275
  (id, description, type, priority, section, created_at, completed, completed_at,
276
276
  feature_id, feature_name)
277
277
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
278
- `);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 yw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=J.getDb(r).prepare(`
278
+ `);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 mw(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=F.getDb(r).prepare(`
279
279
  INSERT OR REPLACE INTO ideas
280
280
  (id, text, status, priority, tags, added_at, converted_to, details, data)
281
281
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
282
- `);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 ww(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=J.getDb(r).prepare(`
282
+ `);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 gw(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=F.getDb(r).prepare(`
283
283
  INSERT OR REPLACE INTO shipped_features
284
284
  (id, name, shipped_at, version, description, type, duration, data)
285
285
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
286
- `);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 Sw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=J.getDb(r).prepare(`
286
+ `);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 fw(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=F.getDb(r).prepare(`
287
287
  INSERT OR REPLACE INTO metrics_daily
288
288
  (date, tokens_saved, syncs, avg_compression_rate, total_duration)
289
289
  VALUES (?, ?, ?, ?, ?)
290
- `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function kw(r,e){let n=J.getDb(r).prepare(`
290
+ `);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function hw(r,e){let n=F.getDb(r).prepare(`
291
291
  INSERT OR REPLACE INTO analysis
292
292
  (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
293
293
  VALUES (?, ?, ?, ?, ?, ?, ?)
294
- `),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 bw(r,e,t){e==="categories-cache"&&Pw(r,t)}function Pw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=J.getDb(r).prepare(`
294
+ `),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 fp(r,e,t){e==="categories-cache"&&yw(r,t)}function yw(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=F.getDb(r).prepare(`
295
295
  INSERT OR REPLACE INTO index_files
296
296
  (path, categories, domain, score, size, mtime, language)
297
297
  VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
298
- `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Cw(r,e,t){let n=we.join(e,"checksums.json"),s=await ro(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=J.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 vw(r,e,t){let n=we.join(e,"file-scores.json"),s=await ro(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=J.getDb(r),a=i.prepare(`
298
+ `);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function ww(r,e,t){let n=se.join(e,"checksums.json"),s=await wn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=F.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 Sw(r,e,t){let n=se.join(e,"file-scores.json"),s=await wn(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=F.getDb(r),a=i.prepare(`
299
299
  INSERT OR REPLACE INTO index_files
300
300
  (path, score, size, mtime, language, categories, domain)
301
301
  VALUES (?, ?, ?, ?, NULL,
302
302
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
303
303
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
304
- `);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 xw(r,e,t){let n=we.join(e,"events.jsonl");try{let o=(await Jt.readFile(n,"utf-8")).split(`
305
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=J.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),p=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,d=u.timestamp??u.ts??new Date().toISOString();a.run(p,m,c,d)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){S(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Tw(r,e,t){let n=we.join(e,"learnings.jsonl");try{let o=(await Jt.readFile(n,"utf-8")).split(`
306
- `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=J.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),p=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,d=m&&m.length>0?m[0]:null;a.run(p,d,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){S(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Ew(r,e,t,n){let s=l(async(i,a)=>{try{await Jt.unlink(i)}catch(c){S(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of yp)await s(we.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(we.join(e,i),`cleanup:index/${i}`);await s(we.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(we.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function ro(r){try{let e=await Jt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}var yp,dw,ga=w(()=>{"use strict";K();M();Dt();yp=[{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"}],dw=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(ma,"migrateJsonToSqlite");l(mw,"createBackup");l(da,"copyFiles");l(gw,"populateNormalized");l(fw,"populateTasksFromState");l(hw,"populateQueueTasks");l(yw,"populateIdeas");l(ww,"populateShippedFeatures");l(Sw,"populateMetricsDaily");l(kw,"populateAnalysis");l(bw,"populateIndexTables");l(Pw,"populateCategoriesIndex");l(Cw,"migrateChecksums");l(vw,"migrateFileScores");l(xw,"migrateEventsJsonl");l(Tw,"migrateLearningsJsonl");l(Ew,"cleanupJsonFiles");l(ro,"readJsonSafe")});var fa,Ge,ha=w(()=>{"use strict";yt();eo();Y();rn();Rt();fa=class extends ve{static{l(this,"QueueStorage")}constructor(){super("queue.json",lp)}getDefault(){return{tasks:[],lastUpdated:""}}getMdFilename(){return"next.md"}getLayer(){return"core"}getEventType(e){return`queue.${e}d`}toMarkdown(e){let t=["# Priority Queue",""],n=e.tasks.filter(i=>i.section==="active"&&!i.completed),s=e.tasks.filter(i=>i.section==="backlog"&&!i.completed),o=e.tasks.filter(i=>i.section==="previously_active"&&!i.completed);return t.push("## Active Tasks"),n.length>0?n.forEach((i,a)=>{let c=i.completed?"[x]":"[ ]",u=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",p=i.agent?` @${i.agent}`:"",m=i.originFeature?` (from: ${i.originFeature})`:"",d=i.type==="bug"?" \u{1F41B}":"";t.push(`${a+1}. ${c}${d}${u} ${i.description}${p}${m}`)}):t.push("_No active tasks_"),t.push(""),o.length>0&&(t.push("## Previously Active"),o.forEach(i=>{t.push(`- [ ] ${i.description}`)}),t.push("")),t.push("## Backlog"),s.length>0?s.forEach(i=>{let a=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",c=i.type==="bug"?" \u{1F41B}":"";t.push(`- [ ]${c}${a} ${i.description}`)}):t.push("_No backlog items_"),t.push(""),t.join(`
307
- `)}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:oe(),createdAt:k(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:k()})),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=k(),s=t.map(o=>({...o,id:oe(),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:k()})),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:k()},n):i),lastUpdated:k()})),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:k()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:k()}))}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:k()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=en(wt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;Ze.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:k()})),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()})}},Ge=new fa});var ya,wn,wa=w(()=>{"use strict";yt();ra();Y();rn();Rt();ya=class extends ve{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",np)}getDefault(){return{shipped:[],lastUpdated:""}}getMdFilename(){return"shipped.md"}getLayer(){return"progress"}getEventType(e){return`shipped.${e}d`}toMarkdown(e){let t=["# SHIPPED \u{1F680}",""];if(e.shipped.length===0)return t.push("_No features shipped yet. Use /p:ship to celebrate!_"),t.push(""),t.join(`
304
+ `);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 kw(r,e,t){let n=se.join(e,"events.jsonl");try{let o=(await Ue.readFile(n,"utf-8")).split(`
305
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=F.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),p=u.type??u.action??"unknown",m=u.taskId??u.task_id??null,d=u.timestamp??u.ts??new Date().toISOString();a.run(p,m,c,d)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){S(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function bw(r,e,t){let n=se.join(e,"learnings.jsonl");try{let o=(await Ue.readFile(n,"utf-8")).split(`
306
+ `).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=F.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),p=`learning:${u.taskId??u.timestamp??Date.now()}`,m=u.tags,d=m&&m.length>0?m[0]:null;a.run(p,d,c,1,u.timestamp??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){S(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Pw(r,e,t,n){let s=l(async(i,a)=>{try{await Ue.unlink(i)}catch(c){S(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of ma)await s(se.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(se.join(e,i),`cleanup:index/${i}`);await s(se.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(se.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function wn(r){try{let e=await Ue.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}async function hp(r){let e=P.getGlobalProjectPath(r),t=se.join(e,"storage"),n=0;F.getDb(r);for(let{filename:u,key:p}of ma){let m=se.join(t,u),d=await wn(m);if(d!==null){F.setDoc(r,p,d),gp(r,p,d);try{await Ue.unlink(m)}catch{}n++}}let s=se.join(e,"project.json"),o=await wn(s);if(o!==null){F.setDoc(r,"project",o);try{await Ue.unlink(s)}catch{}n++}let i=se.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let p=se.join(i,u);try{let d=(await Ue.readFile(p,"utf-8")).split(`
307
+ `).filter(f=>f.trim());if(d.length===0){await Ue.unlink(p),n++;continue}let g=F.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 d)try{let v=JSON.parse(k);f.run(v.type??v.action??"unknown",v.taskId??v.task_id??null,k,v.timestamp??v.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 d)try{let v=JSON.parse(k),x=`learning:${v.taskId??v.timestamp??Date.now()}`,$=v.tags;f.run(x,$?.[0]??null,k,1,v.timestamp??new Date().toISOString())}catch{}})()}await Ue.unlink(p),n++}catch{}}let a=se.join(e,"index"),c=[...da.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let p=se.join(a,u),m=await wn(p);if(m===null)continue;let d=da.find(g=>g.filename===u);d&&(F.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",d.key,JSON.stringify(m),new Date().toISOString()),fp(r,d.key,m));try{await Ue.unlink(p)}catch{}n++}return n}var ma,da,fa=w(()=>{"use strict";K();M();at();ma=[{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"}],da=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(ga,"migrateJsonToSqlite");l(uw,"createBackup");l(pa,"copyFiles");l(gp,"populateNormalized");l(pw,"populateTasksFromState");l(dw,"populateQueueTasks");l(mw,"populateIdeas");l(gw,"populateShippedFeatures");l(fw,"populateMetricsDaily");l(hw,"populateAnalysis");l(fp,"populateIndexTables");l(yw,"populateCategoriesIndex");l(ww,"migrateChecksums");l(Sw,"migrateFileScores");l(kw,"migrateEventsJsonl");l(bw,"migrateLearningsJsonl");l(Pw,"cleanupJsonFiles");l(wn,"readJsonSafe");l(hp,"sweepLegacyJson")});var ha,Oe,so=w(()=>{"use strict";wt();Qr();Q();rn();$t();ha=class extends Ce{static{l(this,"QueueStorage")}constructor(){super("queue.json",ip)}getDefault(){return{tasks:[],lastUpdated:""}}getMdFilename(){return"next.md"}getLayer(){return"core"}getEventType(e){return`queue.${e}d`}toMarkdown(e){let t=["# Priority Queue",""],n=e.tasks.filter(i=>i.section==="active"&&!i.completed),s=e.tasks.filter(i=>i.section==="backlog"&&!i.completed),o=e.tasks.filter(i=>i.section==="previously_active"&&!i.completed);return t.push("## Active Tasks"),n.length>0?n.forEach((i,a)=>{let c=i.completed?"[x]":"[ ]",u=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",p=i.agent?` @${i.agent}`:"",m=i.originFeature?` (from: ${i.originFeature})`:"",d=i.type==="bug"?" \u{1F41B}":"";t.push(`${a+1}. ${c}${d}${u} ${i.description}${p}${m}`)}):t.push("_No active tasks_"),t.push(""),o.length>0&&(t.push("## Previously Active"),o.forEach(i=>{t.push(`- [ ] ${i.description}`)}),t.push("")),t.push("## Backlog"),s.length>0?s.forEach(i=>{let a=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",c=i.type==="bug"?" \u{1F41B}":"";t.push(`- [ ]${c}${a} ${i.description}`)}):t.push("_No backlog items_"),t.push(""),t.join(`
308
+ `)}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:ie(),createdAt:b(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:b()})),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=b(),s=t.map(o=>({...o,id:ie(),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:b()})),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:b()},n):i),lastUpdated:b()})),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:b()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:b()}))}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:b()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=en(St.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;Ze.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:b()})),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()})}},Oe=new ha});var ya,Wt,ro=w(()=>{"use strict";wt();ra();Q();rn();$t();ya=class extends Ce{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Zu)}getDefault(){return{shipped:[],lastUpdated:""}}getMdFilename(){return"shipped.md"}getLayer(){return"progress"}getEventType(e){return`shipped.${e}d`}toMarkdown(e){let t=["# SHIPPED \u{1F680}",""];if(e.shipped.length===0)return t.push("_No features shipped yet. Use /p:ship to celebrate!_"),t.push(""),t.join(`
308
309
  `);let n=new Map;return e.shipped.forEach(o=>{let a=new Date(o.shippedAt).toLocaleDateString("en-US",{year:"numeric",month:"long"});n.has(a)||n.set(a,[]),n.get(a).push(o)}),Array.from(n.keys()).sort((o,i)=>{let a=new Date(n.get(o)[0].shippedAt);return new Date(n.get(i)[0].shippedAt).getTime()-a.getTime()}).forEach(o=>{t.push(`## ${o}`),t.push(""),n.get(o).sort((a,c)=>new Date(c.shippedAt).getTime()-new Date(a.shippedAt).getTime()).forEach(a=>{let c=Xe(a.shippedAt),u=a.version?` v${a.version}`:"",p=a.duration?` (${a.duration})`:"";t.push(`- **${a.name}**${u}${p} - ${c}`),a.description&&t.push(` _${a.description}_`)}),t.push("")}),t.push("---"),t.push(""),t.push(`**Total shipped:** ${e.shipped.length}`),t.push(""),t.join(`
309
- `)}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:oe(),shippedAt:k()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:k()})),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=en(wt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;Ze.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:k()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},wn=new ya});function wp(){return new Sa}var Sa,Sp=w(()=>{"use strict";Sa=class{static{l(this,"MarkdownBuilder")}lines=[];h1(e){return this.lines.push(`# ${e}`,""),this}h2(e){return this.lines.push(`## ${e}`,""),this}h3(e){return this.lines.push(`### ${e}`),this}h4(e){return this.lines.push(`#### ${e}`),this}p(e){return this.lines.push(e,""),this}bold(e){return this.lines.push(`**${e}**`),this}italic(e){return this.lines.push(`*${e}*`),this}code(e){return this.lines.push(`\`${e}\``),this}codeBlock(e,t=""){return this.lines.push(`\`\`\`${t}`,e,"```",""),this}li(e,t){let n=" ".repeat(t?.indent??0);return t?.checked!==void 0?this.lines.push(`${n}- [${t.checked?"x":" "}] ${e}`):this.lines.push(`${n}- ${e}`),this}oli(e,t){return this.lines.push(`${t}. ${e}`),this}list(e,t){for(let n of e)this.li(n,t);return this}orderedList(e){for(let t=0;t<e.length;t++)this.oli(e[t],t+1);return this}hr(){return this.lines.push("","---",""),this}blank(){return this.lines.push(""),this}raw(e){return this.lines.push(e),this}rawLines(e){return this.lines.push(...e),this}quote(e){return this.lines.push(`> ${e}`),this}link(e,t){return this.lines.push(`[${e}](${t})`),this}kv(e,t){return this.lines.push(`**${e}:** ${t}`),this}table(e,t){return this.lines.push(`| ${e.join(" | ")} |`),this.lines.push(`| ${e.map(()=>"---").join(" | ")} |`),t.forEach(n=>{this.lines.push(`| ${n.join(" | ")} |`)}),this.blank(),this}when(e,t){return e&&t(this),this}maybe(e,t){return e!=null&&t(this,e),this}each(e,t){for(let n=0;n<e.length;n++)t(this,e[n],n);return this}section(e,t,n){switch(t){case 1:this.h1(e);break;case 2:this.h2(e);break;case 3:this.h3(e);break;case 4:this.h4(e);break}return n(this),this}build(){return this.lines.join(`
310
- `)}get length(){return this.lines.length}};l(wp,"md")});var Vs,ka,ss,ba=w(()=>{"use strict";Vs={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"}},ka=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=Vs[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 Vs[e]}getPrompt(e){return Vs[e].prompt}getValidCommands(e){return Vs[e].transitions}formatNextSteps(e){return Vs[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}`}})}},ss=new ka});var Pa,ne,Ca=w(()=>{"use strict";yt();eo();Y();Sp();ba();rn();Rt();Pa=class extends ve{static{l(this,"StateStorage")}constructor(){super("state.json",ap)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getMdFilename(){return"now.md"}getLayer(){return"core"}getEventType(e){return`state.${e}d`}toMarkdown(e){return wp().h1("NOW").when(!!e.currentTask,t=>{let n=e.currentTask;if(t.bold(n.description).blank().raw(`Started: ${Xe(n.startedAt)}`).raw(`Session: ${n.sessionId}`).maybe(n.featureId,(s,o)=>s.raw(`Feature: ${o}`)),n.subtasks&&n.subtasks.length>0){t.blank().h2("Subtasks Progress").raw(`**Progress**: ${n.subtaskProgress?.completed||0}/${n.subtaskProgress?.total||0} (${n.subtaskProgress?.percentage||0}%)`).blank().raw("| # | Domain | Description | Status | Agent |").raw("|---|--------|-------------|--------|-------|"),n.subtasks.forEach((i,a)=>{let c=i.status==="completed"?"\u2705":i.status==="in_progress"?"\u25B6\uFE0F":i.status==="failed"?"\u274C":i.status==="skipped"?"\u23ED\uFE0F":i.status==="blocked"?"\u{1F6AB}":"\u23F3",u=a===n.currentSubtaskIndex?" **\u2190 Active**":"";t.raw(`| ${a+1} | ${i.domain} | ${i.description} | ${c} ${i.status}${u} | ${i.agent} |`)});let s=n.subtasks[n.currentSubtaskIndex||0];s&&s.status==="in_progress"&&(t.blank().h3("Current Subtask").raw(`**#${(n.currentSubtaskIndex||0)+1}**: ${s.description}`).raw(`**Agent**: ${s.agent}`).raw(`**Domain**: ${s.domain}`),s.dependsOn.length>0&&t.raw(`**Depends on**: ${s.dependsOn.join(", ")}`));let o=n.subtasks.filter(i=>i.status==="completed"&&i.summary);if(o.length>0){let i=o[o.length-1];i.summary&&t.blank().h3("Previous Subtask Output").raw(`**${i.summary.title}**`).raw(i.summary.description).maybe(i.summary.outputForNextAgent,(a,c)=>a.blank().raw(`**Available for next agent**: ${c}`))}}}).when(!e.currentTask,t=>{t.italic("No active task. Use /p:work to start.")}).when((e.pausedTasks?.length||0)>0||!!e.previousTask,t=>{let n=e.pausedTasks?.length?e.pausedTasks:e.previousTask?[e.previousTask]:[];n.length!==0&&(t.hr().h2(`Paused (${n.length})`),n.forEach((s,o)=>{t.raw(`${o+1}. **${s.description}**`).raw(` Paused: ${Xe(s.pausedAt)}`),s.pauseReason&&t.raw(` Reason: ${s.pauseReason}`)}),t.blank().italic("Use /p:resume to continue"))}).when((e.taskHistory?.length||0)>0,t=>{let n=this.getTaskHistoryFromState(e);if(n.length===0)return;let s=e.currentTask?.type,o=s?n.filter(i=>i.classification===s).slice(0,3):n.slice(0,5);o.length!==0&&(t.hr().h2(s?`Recent ${s} tasks (${o.length})`:`Recent tasks (${o.length})`),o.forEach((i,a)=>{t.raw(`${a+1}. **${i.title}** (${i.classification})`).raw(` Completed: ${Xe(i.completedAt)} | ${i.subtaskCount} subtask${i.subtaskCount>1?"s":""}`).raw(` Outcome: ${i.outcome}`),i.linearId&&t.raw(` Linear: ${i.linearId}`),i.feedback?.patternsDiscovered?.length&&t.raw(` Patterns: ${i.feedback.patternsDiscovered.join(", ")}`),i.feedback?.issuesEncountered?.length&&t.raw(` Gotchas: ${i.feedback.issuesEncountered.join(", ")}`)}),t.blank().italic("Task history helps identify patterns and improve decisions"))}).blank().build()}validateTransition(e,t){let n=ss.getCurrentState(e),s=ss.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:k()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:k()})),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:k()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=k(),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:k(),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:k()})),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,p)=>p!==o),c={id:i.id,description:i.description,startedAt:k(),sessionId:oe()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:k()})),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[];Ze.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:k()}));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:k()}))}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(d=>d.feedback),s=[],o=[],i=[],a=[];for(let d of n){let g=d.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)],p=new Map;for(let d of a)p.set(d,(p.get(d)||0)+1);let m=[...p.entries()].filter(([d,g])=>g>=2).map(([d])=>d);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?k():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:k()})),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=op.safeParse(t);if(!n.success){let f=n.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
310
+ `)}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:ie(),shippedAt:b()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:b()})),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=en(St.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;Ze.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:b()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},Wt=new ya});function yp(){return new wa}var wa,wp=w(()=>{"use strict";wa=class{static{l(this,"MarkdownBuilder")}lines=[];h1(e){return this.lines.push(`# ${e}`,""),this}h2(e){return this.lines.push(`## ${e}`,""),this}h3(e){return this.lines.push(`### ${e}`),this}h4(e){return this.lines.push(`#### ${e}`),this}p(e){return this.lines.push(e,""),this}bold(e){return this.lines.push(`**${e}**`),this}italic(e){return this.lines.push(`*${e}*`),this}code(e){return this.lines.push(`\`${e}\``),this}codeBlock(e,t=""){return this.lines.push(`\`\`\`${t}`,e,"```",""),this}li(e,t){let n=" ".repeat(t?.indent??0);return t?.checked!==void 0?this.lines.push(`${n}- [${t.checked?"x":" "}] ${e}`):this.lines.push(`${n}- ${e}`),this}oli(e,t){return this.lines.push(`${t}. ${e}`),this}list(e,t){for(let n of e)this.li(n,t);return this}orderedList(e){for(let t=0;t<e.length;t++)this.oli(e[t],t+1);return this}hr(){return this.lines.push("","---",""),this}blank(){return this.lines.push(""),this}raw(e){return this.lines.push(e),this}rawLines(e){return this.lines.push(...e),this}quote(e){return this.lines.push(`> ${e}`),this}link(e,t){return this.lines.push(`[${e}](${t})`),this}kv(e,t){return this.lines.push(`**${e}:** ${t}`),this}table(e,t){return this.lines.push(`| ${e.join(" | ")} |`),this.lines.push(`| ${e.map(()=>"---").join(" | ")} |`),t.forEach(n=>{this.lines.push(`| ${n.join(" | ")} |`)}),this.blank(),this}when(e,t){return e&&t(this),this}maybe(e,t){return e!=null&&t(this,e),this}each(e,t){for(let n=0;n<e.length;n++)t(this,e[n],n);return this}section(e,t,n){switch(t){case 1:this.h1(e);break;case 2:this.h2(e);break;case 3:this.h3(e);break;case 4:this.h4(e);break}return n(this),this}build(){return this.lines.join(`
311
+ `)}get length(){return this.lines.length}};l(yp,"md")});var Js,Sa,ts,ka=w(()=>{"use strict";Js={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"}},Sa=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=Js[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 Js[e]}getPrompt(e){return Js[e].prompt}getValidCommands(e){return Js[e].transitions}formatNextSteps(e){return Js[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}`}})}},ts=new Sa});var ba,X,oo=w(()=>{"use strict";wt();Qr();Q();wp();ka();rn();$t();ba=class extends Ce{static{l(this,"StateStorage")}constructor(){super("state.json",rp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getMdFilename(){return"now.md"}getLayer(){return"core"}getEventType(e){return`state.${e}d`}toMarkdown(e){return yp().h1("NOW").when(!!e.currentTask,t=>{let n=e.currentTask;if(t.bold(n.description).blank().raw(`Started: ${Xe(n.startedAt)}`).raw(`Session: ${n.sessionId}`).maybe(n.featureId,(s,o)=>s.raw(`Feature: ${o}`)),n.subtasks&&n.subtasks.length>0){t.blank().h2("Subtasks Progress").raw(`**Progress**: ${n.subtaskProgress?.completed||0}/${n.subtaskProgress?.total||0} (${n.subtaskProgress?.percentage||0}%)`).blank().raw("| # | Domain | Description | Status | Agent |").raw("|---|--------|-------------|--------|-------|"),n.subtasks.forEach((i,a)=>{let c=i.status==="completed"?"\u2705":i.status==="in_progress"?"\u25B6\uFE0F":i.status==="failed"?"\u274C":i.status==="skipped"?"\u23ED\uFE0F":i.status==="blocked"?"\u{1F6AB}":"\u23F3",u=a===n.currentSubtaskIndex?" **\u2190 Active**":"";t.raw(`| ${a+1} | ${i.domain} | ${i.description} | ${c} ${i.status}${u} | ${i.agent} |`)});let s=n.subtasks[n.currentSubtaskIndex||0];s&&s.status==="in_progress"&&(t.blank().h3("Current Subtask").raw(`**#${(n.currentSubtaskIndex||0)+1}**: ${s.description}`).raw(`**Agent**: ${s.agent}`).raw(`**Domain**: ${s.domain}`),s.dependsOn.length>0&&t.raw(`**Depends on**: ${s.dependsOn.join(", ")}`));let o=n.subtasks.filter(i=>i.status==="completed"&&i.summary);if(o.length>0){let i=o[o.length-1];i.summary&&t.blank().h3("Previous Subtask Output").raw(`**${i.summary.title}**`).raw(i.summary.description).maybe(i.summary.outputForNextAgent,(a,c)=>a.blank().raw(`**Available for next agent**: ${c}`))}}}).when(!e.currentTask,t=>{t.italic("No active task. Use /p:work to start.")}).when((e.pausedTasks?.length||0)>0||!!e.previousTask,t=>{let n=e.pausedTasks?.length?e.pausedTasks:e.previousTask?[e.previousTask]:[];n.length!==0&&(t.hr().h2(`Paused (${n.length})`),n.forEach((s,o)=>{t.raw(`${o+1}. **${s.description}**`).raw(` Paused: ${Xe(s.pausedAt)}`),s.pauseReason&&t.raw(` Reason: ${s.pauseReason}`)}),t.blank().italic("Use /p:resume to continue"))}).when((e.taskHistory?.length||0)>0,t=>{let n=this.getTaskHistoryFromState(e);if(n.length===0)return;let s=e.currentTask?.type,o=s?n.filter(i=>i.classification===s).slice(0,3):n.slice(0,5);o.length!==0&&(t.hr().h2(s?`Recent ${s} tasks (${o.length})`:`Recent tasks (${o.length})`),o.forEach((i,a)=>{t.raw(`${a+1}. **${i.title}** (${i.classification})`).raw(` Completed: ${Xe(i.completedAt)} | ${i.subtaskCount} subtask${i.subtaskCount>1?"s":""}`).raw(` Outcome: ${i.outcome}`),i.linearId&&t.raw(` Linear: ${i.linearId}`),i.feedback?.patternsDiscovered?.length&&t.raw(` Patterns: ${i.feedback.patternsDiscovered.join(", ")}`),i.feedback?.issuesEncountered?.length&&t.raw(` Gotchas: ${i.feedback.issuesEncountered.join(", ")}`)}),t.blank().italic("Task history helps identify patterns and improve decisions"))}).blank().build()}validateTransition(e,t){let n=ts.getCurrentState(e),s=ts.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:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),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:b()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=b(),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:b(),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:b()})),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,p)=>p!==o),c={id:i.id,description:i.description,startedAt:b(),sessionId:ie()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:b()})),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[];Ze.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:b()}));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:b()}))}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(d=>d.feedback),s=[],o=[],i=[],a=[];for(let d of n){let g=d.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)],p=new Map;for(let d of a)p.set(d,(p.get(d)||0)+1);let m=[...p.entries()].filter(([d,g])=>g>=2).map(([d])=>d);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?b():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:b()})),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=np.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:
311
312
  ${f.join(`
312
- `)}`)}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:k(),output:s,summary:o};let p=u.filter(f=>f.status==="completed").length,m=u.length,d=Math.round(p/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:k()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:p,total:m,percentage:d}},lastUpdated:k()})),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:p,total:m,percentage:d}}),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:k(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:k()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:k()})),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:k(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:k()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:k()})),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:k()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:k()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},ne=new Pa});import Wt from"node:fs/promises";import Aw from"node:os";import Sn from"node:path";function xa(r){return new va(r)}var va,kp=w(()=>{"use strict";qi();M();va=class{static{l(this,"FileStorage")}projectId;basePath;constructor(e){this.projectId=e,this.basePath=Sn.join(Aw.homedir(),".prjct-cli/projects",e,"data")}pathToFile(e){if(e.length===1)return Sn.join(this.basePath,`${e[0]}.json`);let t=`${e[0]}s`,s=`${e.slice(1).join("/")}.json`;return Sn.join(this.basePath,t,s)}async write(e,t){let n=this.pathToFile(e);await Wt.mkdir(Sn.dirname(n),{recursive:!0}),await Wt.writeFile(n,JSON.stringify(t,null,2),"utf-8"),es.publish({type:Br(e,"write"),path:e,data:t,timestamp:new Date().toISOString(),projectId:this.projectId}),e.length===2&&await this.updateIndex(e[0],e[1],"add")}async read(e){let t=this.pathToFile(e);try{let n=await Wt.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(S(n)||n instanceof SyntaxError)return null;throw n}}async list(e){let t=Sn.join(this.basePath,`${e[0]}s`);try{return(await Wt.readdir(t)).filter(s=>s.endsWith(".json")&&s!=="index.json").map(s=>[...e,s.replace(".json","")])}catch(n){if(S(n))return[];throw n}}async delete(e){let t=this.pathToFile(e);try{await Wt.unlink(t),es.publish({type:Br(e,"delete"),path:e,data:null,timestamp:new Date().toISOString(),projectId:this.projectId}),e.length===2&&await this.updateIndex(e[0],e[1],"remove")}catch(n){if(!S(n))throw n}}async exists(e){let t=this.pathToFile(e);try{return await Wt.access(t),!0}catch(n){if(S(n))return!1;throw n}}async updateIndex(e,t,n){let s=Sn.join(this.basePath,`${e}s`,"index.json"),o={ids:[],updatedAt:""};try{let i=await Wt.readFile(s,"utf-8");o=JSON.parse(i)}catch(i){if(!S(i)&&!(i instanceof SyntaxError))throw i}n==="add"&&!o.ids.includes(t)?o.ids.push(t):n==="remove"&&(o.ids=o.ids.filter(i=>i!==t)),o.updatedAt=new Date().toISOString(),await Wt.mkdir(Sn.dirname(s),{recursive:!0}),await Wt.writeFile(s,JSON.stringify(o,null,2),"utf-8")}};l(xa,"getStorage")});function Iw(r){switch(r){case"improving":return"\u2191";case"declining":return"\u2193";default:return"\u2192"}}var Ta,Ea,Aa=w(()=>{"use strict";ts();Rt();Ta=class extends ve{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:pp,lastUpdated:""}}getMdFilename(){return"velocity.md"}getLayer(){return"progress"}getEventType(e){return`velocity.${e}d`}toMarkdown(e){let{metrics:t}=e,n=["# Velocity",""];if(t.sprints.length===0)return n.push("_No velocity data yet. Complete tasks with estimates to build velocity history._"),n.push(""),n.join(`
313
- `);n.push(`**Average**: ${t.averageVelocity} pts/sprint`),n.push(`**Trend**: ${Iw(t.velocityTrend)} ${t.velocityTrend}`),n.push(`**Estimation Accuracy**: ${t.estimationAccuracy}%`),n.push(""),n.push("## Sprint History"),n.push(""),n.push("| Sprint | Points | Tasks | Accuracy | Variance |"),n.push("|--------|--------|-------|----------|----------|");let s=t.sprints.slice(-6);for(let o of s)n.push(`| ${o.sprintNumber} | ${o.pointsCompleted} | ${o.tasksCompleted} | ${o.estimationAccuracy}% | ${o.avgVariance>0?"+":""}${o.avgVariance}% |`);if(n.push(""),t.underEstimated.length>0||t.overEstimated.length>0){n.push("## Estimation Patterns"),n.push("");for(let o of t.underEstimated)n.push(`- \u26A0 **${o.category}**: underestimated by avg ${o.avgVariance}% (${o.taskCount} tasks)`);for(let o of t.overEstimated)n.push(`- \u2713 **${o.category}**: overestimated by avg ${o.avgVariance}% (${o.taskCount} tasks)`);n.push("")}return n.join(`
314
- `)}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}};l(Iw,"formatTrendIcon");Ea=new Ta});var Mt=w(()=>{"use strict";Kr();rn();Dt();ca();Bs();so();ga();ha();wa();Ca();kp();Rt();Aa()});import{exec as Dw}from"node:child_process";import os from"node:fs/promises";import rs from"node:path";import{promisify as Rw}from"node:util";async function bp(r,e){let t=P.getGlobalProjectPath(r),n=P.getContextPath(r),s=xa(r);await os.mkdir(n,{recursive:!0});let o=await s.read(["project"])||{},i=await s.list(["task"]),a=await s.list(["feature"]),c=await s.list(["idea"]),u=await s.list(["agent"]),p=[];for(let E of i){let v=await s.read(E);v&&p.push({...v,id:E[1]})}let m=[];for(let E of a){let v=await s.read(E);v&&m.push({...v,id:E[1]})}let d=[];for(let E of c){let v=await s.read(E);v&&d.push({...v,id:E[1]})}let g=[];for(let E of u){let v=await s.read(E);v&&g.push({...v,name:E[1]})}let f=await $w(e),b=await Mw(e);await Fw(n,r,o,p,m,d,g,f,b,e),await Ow(n,p),await _w(n,p),await Nw(n,o,f,b)}async function $w(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,recentCommits:[]};try{let{stdout:t}=await qs("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await qs("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await qs("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await qs("git status --porcelain",{cwd:r});e.hasChanges=o.trim().length>0;let{stdout:i}=await qs('git log --oneline -10 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=i.split(`
315
- `).filter(Boolean).map(a=>{let[c,u,p]=a.split("|");return{hash:c,message:u,date:p}})}catch{}return e}async function Mw(r){let e={dependencies:{},devDependencies:{},scripts:{}};try{let t=rs.join(r,"package.json"),n=JSON.parse(await os.readFile(t,"utf-8"));e.dependencies=n.dependencies||{},e.devDependencies=n.devDependencies||{},e.scripts=n.scripts||{}}catch{}return e}async function Fw(r,e,t,n,s,o,i,a,c,u){let p=t.name||rs.basename(u),m=n.find(v=>v.status==="in_progress"),d=n.filter(v=>v.status==="pending"),g=s.filter(v=>v.status==="in_progress"||v.status==="active"),f=Object.keys(c.dependencies),b=Object.keys(c.devDependencies),E=`# ${p} - Project Context
313
+ `)}`)}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:b(),output:s,summary:o};let p=u.filter(f=>f.status==="completed").length,m=u.length,d=Math.round(p/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:p,total:m,percentage:d}},lastUpdated:b()})),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:p,total:m,percentage:d}}),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:b(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:b()})),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:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,p=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:p}},lastUpdated:b()})),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:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},X=new ba});import Bt from"node:fs/promises";import Cw from"node:os";import Sn from"node:path";function Ca(r){return new Pa(r)}var Pa,Sp=w(()=>{"use strict";Ki();M();Pa=class{static{l(this,"FileStorage")}projectId;basePath;constructor(e){this.projectId=e,this.basePath=Sn.join(Cw.homedir(),".prjct-cli/projects",e,"data")}pathToFile(e){if(e.length===1)return Sn.join(this.basePath,`${e[0]}.json`);let t=`${e[0]}s`,s=`${e.slice(1).join("/")}.json`;return Sn.join(this.basePath,t,s)}async write(e,t){let n=this.pathToFile(e);await Bt.mkdir(Sn.dirname(n),{recursive:!0}),await Bt.writeFile(n,JSON.stringify(t,null,2),"utf-8"),Qn.publish({type:Jr(e,"write"),path:e,data:t,timestamp:new Date().toISOString(),projectId:this.projectId}),e.length===2&&await this.updateIndex(e[0],e[1],"add")}async read(e){let t=this.pathToFile(e);try{let n=await Bt.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(S(n)||n instanceof SyntaxError)return null;throw n}}async list(e){let t=Sn.join(this.basePath,`${e[0]}s`);try{return(await Bt.readdir(t)).filter(s=>s.endsWith(".json")&&s!=="index.json").map(s=>[...e,s.replace(".json","")])}catch(n){if(S(n))return[];throw n}}async delete(e){let t=this.pathToFile(e);try{await Bt.unlink(t),Qn.publish({type:Jr(e,"delete"),path:e,data:null,timestamp:new Date().toISOString(),projectId:this.projectId}),e.length===2&&await this.updateIndex(e[0],e[1],"remove")}catch(n){if(!S(n))throw n}}async exists(e){let t=this.pathToFile(e);try{return await Bt.access(t),!0}catch(n){if(S(n))return!1;throw n}}async updateIndex(e,t,n){let s=Sn.join(this.basePath,`${e}s`,"index.json"),o={ids:[],updatedAt:""};try{let i=await Bt.readFile(s,"utf-8");o=JSON.parse(i)}catch(i){if(!S(i)&&!(i instanceof SyntaxError))throw i}n==="add"&&!o.ids.includes(t)?o.ids.push(t):n==="remove"&&(o.ids=o.ids.filter(i=>i!==t)),o.updatedAt=new Date().toISOString(),await Bt.mkdir(Sn.dirname(s),{recursive:!0}),await Bt.writeFile(s,JSON.stringify(o,null,2),"utf-8")}};l(Ca,"getStorage")});function vw(r){switch(r){case"improving":return"\u2191";case"declining":return"\u2193";default:return"\u2192"}}var va,xa,Ta=w(()=>{"use strict";Zn();$t();va=class extends Ce{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:cp,lastUpdated:""}}getMdFilename(){return"velocity.md"}getLayer(){return"progress"}getEventType(e){return`velocity.${e}d`}toMarkdown(e){let{metrics:t}=e,n=["# Velocity",""];if(t.sprints.length===0)return n.push("_No velocity data yet. Complete tasks with estimates to build velocity history._"),n.push(""),n.join(`
314
+ `);n.push(`**Average**: ${t.averageVelocity} pts/sprint`),n.push(`**Trend**: ${vw(t.velocityTrend)} ${t.velocityTrend}`),n.push(`**Estimation Accuracy**: ${t.estimationAccuracy}%`),n.push(""),n.push("## Sprint History"),n.push(""),n.push("| Sprint | Points | Tasks | Accuracy | Variance |"),n.push("|--------|--------|-------|----------|----------|");let s=t.sprints.slice(-6);for(let o of s)n.push(`| ${o.sprintNumber} | ${o.pointsCompleted} | ${o.tasksCompleted} | ${o.estimationAccuracy}% | ${o.avgVariance>0?"+":""}${o.avgVariance}% |`);if(n.push(""),t.underEstimated.length>0||t.overEstimated.length>0){n.push("## Estimation Patterns"),n.push("");for(let o of t.underEstimated)n.push(`- \u26A0 **${o.category}**: underestimated by avg ${o.avgVariance}% (${o.taskCount} tasks)`);for(let o of t.overEstimated)n.push(`- \u2713 **${o.category}**: overestimated by avg ${o.avgVariance}% (${o.taskCount} tasks)`);n.push("")}return n.join(`
315
+ `)}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}};l(vw,"formatTrendIcon");xa=new va});var Ft=w(()=>{"use strict";Vr();rn();at();Zr();zs();no();fa();so();ro();oo();Sp();$t();Ta()});import{exec as Tw}from"node:child_process";import ss from"node:fs/promises";import ns from"node:path";import{promisify as Ew}from"node:util";async function kp(r,e){let t=P.getGlobalProjectPath(r),n=P.getContextPath(r),s=Ca(r);await ss.mkdir(n,{recursive:!0});let o=await s.read(["project"])||{},i=await s.list(["task"]),a=await s.list(["feature"]),c=await s.list(["idea"]),u=await s.list(["agent"]),p=[];for(let v of i){let x=await s.read(v);x&&p.push({...x,id:v[1]})}let m=[];for(let v of a){let x=await s.read(v);x&&m.push({...x,id:v[1]})}let d=[];for(let v of c){let x=await s.read(v);x&&d.push({...x,id:v[1]})}let g=[];for(let v of u){let x=await s.read(v);x&&g.push({...x,name:v[1]})}let f=await Aw(e),k=await Iw(e);await jw(n,r,o,p,m,d,g,f,k,e),await Dw(n,p),await Rw(n,p),await $w(n,o,f,k)}async function Aw(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,recentCommits:[]};try{let{stdout:t}=await Ws("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Ws("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Ws("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Ws("git status --porcelain",{cwd:r});e.hasChanges=o.trim().length>0;let{stdout:i}=await Ws('git log --oneline -10 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=i.split(`
316
+ `).filter(Boolean).map(a=>{let[c,u,p]=a.split("|");return{hash:c,message:u,date:p}})}catch{}return e}async function Iw(r){let e={dependencies:{},devDependencies:{},scripts:{}};try{let t=ns.join(r,"package.json"),n=JSON.parse(await ss.readFile(t,"utf-8"));e.dependencies=n.dependencies||{},e.devDependencies=n.devDependencies||{},e.scripts=n.scripts||{}}catch{}return e}async function jw(r,e,t,n,s,o,i,a,c,u){let p=t.name||ns.basename(u),m=n.find(x=>x.status==="in_progress"),d=n.filter(x=>x.status==="pending"),g=s.filter(x=>x.status==="in_progress"||x.status==="active"),f=Object.keys(c.dependencies),k=Object.keys(c.devDependencies),v=`# ${p} - Project Context
316
317
  <!-- projectId: ${e} -->
317
318
  <!-- Generated: ${new Date().toISOString()} -->
318
319
 
319
320
  ## PROJECT DATA
320
321
 
321
- ### Dependencies (${f.length+b.length})
322
+ ### Dependencies (${f.length+k.length})
322
323
 
323
324
  **Production** (${f.length}):
324
- ${f.length>0?f.map(v=>`- ${v}: ${c.dependencies[v]}`).join(`
325
+ ${f.length>0?f.map(x=>`- ${x}: ${c.dependencies[x]}`).join(`
325
326
  `):"_None_"}
326
327
 
327
- **Dev** (${b.length}):
328
- ${b.length>0?b.map(v=>`- ${v}: ${c.devDependencies[v]}`).join(`
328
+ **Dev** (${k.length}):
329
+ ${k.length>0?k.map(x=>`- ${x}: ${c.devDependencies[x]}`).join(`
329
330
  `):"_None_"}
330
331
 
331
332
  ### Scripts
332
333
 
333
- ${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([v,$])=>`- \`${v}\`: ${$}`).join(`
334
+ ${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([x,$])=>`- \`${x}\`: ${$}`).join(`
334
335
  `):"_None_"}
335
336
 
336
337
  ### Git
@@ -341,7 +342,7 @@ ${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([v,$])=>`- \`${
341
342
  - Uncommitted: ${a.hasChanges?"Yes":"No"}
342
343
 
343
344
  **Recent:**
344
- ${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(v=>`- \`${v.hash}\` ${v.message}`).join(`
345
+ ${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(x=>`- \`${x.hash}\` ${x.message}`).join(`
345
346
  `):"_None_"}
346
347
 
347
348
  ---
@@ -351,22 +352,22 @@ ${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(v=>`- \`${v.hash}\` ${
351
352
  **Now:** ${m?m.description:"_No active task_"}
352
353
 
353
354
  **Queue (${d.length}):**
354
- ${d.length>0?d.slice(0,10).map((v,$)=>`${$+1}. ${v.description}`).join(`
355
+ ${d.length>0?d.slice(0,10).map((x,$)=>`${$+1}. ${x.description}`).join(`
355
356
  `):"_Empty_"}
356
357
 
357
358
  **Active Features (${g.length}):**
358
- ${g.length>0?g.map(v=>`- ${v.name}`).join(`
359
+ ${g.length>0?g.map(x=>`- ${x.name}`).join(`
359
360
  `):"_None_"}
360
361
 
361
362
  **Ideas (${o.length}):**
362
- ${o.length>0?o.slice(0,5).map(v=>`- ${v.title}`).join(`
363
+ ${o.length>0?o.slice(0,5).map(x=>`- ${x.title}`).join(`
363
364
  `):"_None_"}
364
365
 
365
366
  ---
366
367
 
367
368
  ## AGENTS
368
369
 
369
- ${i.length>0?i.map(v=>`- **${v.name}**: ${v.role||"Specialist"}`).join(`
370
+ ${i.length>0?i.map(x=>`- **${x.name}**: ${x.role||"Specialist"}`).join(`
370
371
  `):"_None_"}
371
372
 
372
373
  ---
@@ -388,7 +389,7 @@ ${i.length>0?i.map(v=>`- **${v.name}**: ${v.role||"Specialist"}`).join(`
388
389
  \u2514\u2500\u2500 sync/ # Sync state
389
390
  \u2514\u2500\u2500 pending.json
390
391
  \`\`\`
391
- `;await os.writeFile(rs.join(r,"CLAUDE.md"),E,"utf-8")}async function Ow(r,e){let t=e.find(s=>s.status==="in_progress"),n=t?`# NOW
392
+ `;await ss.writeFile(ns.join(r,"CLAUDE.md"),v,"utf-8")}async function Dw(r,e){let t=e.find(s=>s.status==="in_progress"),n=t?`# NOW
392
393
 
393
394
  **Task:** ${t.description}
394
395
 
@@ -398,11 +399,11 @@ ${i.length>0?i.map(v=>`- **${v.name}**: ${v.role||"Specialist"}`).join(`
398
399
  `:`# NOW
399
400
 
400
401
  _No active task. Use /p:now to start._
401
- `;await os.writeFile(rs.join(r,"now.md"),n,"utf-8")}async function _w(r,e){let t=e.filter(s=>s.status==="pending"),n=`# QUEUE
402
+ `;await ss.writeFile(ns.join(r,"now.md"),n,"utf-8")}async function Rw(r,e){let t=e.filter(s=>s.status==="pending"),n=`# QUEUE
402
403
 
403
404
  ${t.length>0?t.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
404
405
  `):"_Empty queue. Use /p:next to add tasks._"}
405
- `;await os.writeFile(rs.join(r,"queue.md"),n,"utf-8")}async function Nw(r,e,t,n){let s=`# PROJECT SUMMARY
406
+ `;await ss.writeFile(ns.join(r,"queue.md"),n,"utf-8")}async function $w(r,e,t,n){let s=`# PROJECT SUMMARY
406
407
 
407
408
  **Name:** ${e.name||"Unknown"}
408
409
  **Version:** ${e.version||"N/A"}
@@ -418,19 +419,19 @@ ${t.length>0?t.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}
418
419
 
419
420
  - Production: ${Object.keys(n.dependencies).length}
420
421
  - Dev: ${Object.keys(n.devDependencies).length}
421
- `;await os.writeFile(rs.join(r,"summary.md"),s,"utf-8")}var qs,Pp=w(()=>{"use strict";K();Mt();qs=Rw(Dw);l(bp,"generateContext");l($w,"getGitData");l(Mw,"getPackageData");l(Fw,"generateClaudeMd");l(Ow,"generateNowMd");l(_w,"generateQueueMd");l(Nw,"generateSummaryMd")});var kt={};fn(kt,{appendJsonLine:()=>is,appendJsonLineWithRotation:()=>as,appendJsonLines:()=>Hw,checkFileSizeWarning:()=>Bw,countJsonLines:()=>vp,filterJsonLines:()=>ja,getFileSizeMB:()=>Ra,getFirstJsonLines:()=>Gw,getLastJsonLines:()=>Da,isJsonLinesEmpty:()=>Jw,mergeJsonLines:()=>zw,parseJsonLines:()=>Cp,readJsonLines:()=>Bt,readJsonLinesStreaming:()=>Ww,rotateJsonLinesIfNeeded:()=>xp,stringifyJsonLines:()=>Ia,writeJsonLines:()=>oo});import Lw from"node:fs";import bn from"node:fs/promises";import kn from"node:path";import Uw from"node:readline";function Cp(r){let e=r.split(`
422
- `).filter(n=>n.trim()),t=[];for(let n of e)try{t.push(JSON.parse(n))}catch{}return t}function Ia(r){return`${r.map(e=>JSON.stringify(e)).join(`
422
+ `;await ss.writeFile(ns.join(r,"summary.md"),s,"utf-8")}var Ws,bp=w(()=>{"use strict";K();Ft();Ws=Ew(Tw);l(kp,"generateContext");l(Aw,"getGitData");l(Iw,"getPackageData");l(jw,"generateClaudeMd");l(Dw,"generateNowMd");l(Rw,"generateQueueMd");l($w,"generateSummaryMd")});var Pt={};fn(Pt,{appendJsonLine:()=>rs,appendJsonLineWithRotation:()=>os,appendJsonLines:()=>Ow,checkFileSizeWarning:()=>Hw,countJsonLines:()=>Cp,filterJsonLines:()=>Aa,getFileSizeMB:()=>ja,getFirstJsonLines:()=>_w,getLastJsonLines:()=>Ia,isJsonLinesEmpty:()=>Lw,mergeJsonLines:()=>Nw,parseJsonLines:()=>Pp,readJsonLines:()=>Vt,readJsonLinesStreaming:()=>Uw,rotateJsonLinesIfNeeded:()=>vp,stringifyJsonLines:()=>Ea,writeJsonLines:()=>io});import Mw from"node:fs";import bn from"node:fs/promises";import kn from"node:path";import Fw from"node:readline";function Pp(r){let e=r.split(`
423
+ `).filter(n=>n.trim()),t=[];for(let n of e)try{t.push(JSON.parse(n))}catch{}return t}function Ea(r){return`${r.map(e=>JSON.stringify(e)).join(`
423
424
  `)}
424
- `}async function Bt(r){try{let e=await bn.readFile(r,"utf-8");return Cp(e)}catch(e){if(S(e))return[];throw e}}async function oo(r,e){let t=Ia(e);await bn.writeFile(r,t,"utf-8")}async function is(r,e){let t=`${JSON.stringify(e)}
425
- `;await bn.appendFile(r,t,"utf-8")}async function Hw(r,e){let t=Ia(e);await bn.appendFile(r,t,"utf-8")}async function ja(r,e){return(await Bt(r)).filter(e)}async function vp(r){try{return(await bn.readFile(r,"utf-8")).split(`
426
- `).filter(n=>n.trim()).length}catch(e){if(S(e))return 0;throw e}}async function Da(r,e){return(await Bt(r)).slice(-e)}async function Gw(r,e){return(await Bt(r)).slice(0,e)}async function zw(r){let e=[];for(let t of r){let n=await Bt(t);e.push(...n)}return e}async function Jw(r){return await vp(r)===0}async function Ww(r,e=Gs.JSONL_MAX_LINES){try{let t=Lw.createReadStream(r),n=Uw.createInterface({input:t,crlfDelay:1/0}),s=[];for await(let o of n)if(o.trim()){try{s.push(JSON.parse(o))}catch{}s.length>e&&s.shift()}return s}catch(t){if(S(t))return[];throw t}}async function Ra(r){try{return(await bn.stat(r)).size/(1024*1024)}catch(e){if(S(e))return 0;throw e}}async function xp(r,e=Gs.ROTATION_SIZE_MB){let t=await Ra(r);if(t<e)return!1;let n=new Date().toISOString().split("T")[0],s=kn.dirname(r),o=kn.extname(r),i=kn.basename(r,o),a=kn.join(s,`${i}-${n}${o}`);return await bn.rename(r,a),console.log(`\u{1F4E6} Rotated ${kn.basename(r)} (${t.toFixed(1)}MB) \u2192 ${kn.basename(a)}`),!0}async function as(r,e,t=Gs.ROTATION_SIZE_MB){await xp(r,t),await is(r,e)}async function Bw(r,e=Gs.LARGE_FILE_WARN_MB){let t=await Ra(r),n=t>e;return n&&console.warn(`\u26A0\uFE0F Large file detected: ${kn.basename(r)} (${t.toFixed(1)}MB). Reading may use significant memory.`),{sizeMB:t,isLarge:n}}var Ks=w(()=>{"use strict";M();Gt();l(Cp,"parseJsonLines");l(Ia,"stringifyJsonLines");l(Bt,"readJsonLines");l(oo,"writeJsonLines");l(is,"appendJsonLine");l(Hw,"appendJsonLines");l(ja,"filterJsonLines");l(vp,"countJsonLines");l(Da,"getLastJsonLines");l(Gw,"getFirstJsonLines");l(zw,"mergeJsonLines");l(Jw,"isJsonLinesEmpty");l(Ww,"readJsonLinesStreaming");l(Ra,"getFileSizeMB");l(xp,"rotateJsonLinesIfNeeded");l(as,"appendJsonLineWithRotation");l(Bw,"checkFileSizeWarning")});import $a from"node:fs/promises";import cs from"node:path";function Fa(r){if(tu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(io))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 Ma,io,Pn,Xs,Ys,Qs=w(()=>{"use strict";K();M();Wn();Y();Ce();Ks();Ma={frontend:[j.CODE_STYLE,j.FILE_STRUCTURE,j.ARCHITECTURE,j.TECH_STACK],backend:[j.CODE_STYLE,j.ARCHITECTURE,j.DEPENDENCIES,j.TECH_STACK],devops:[j.SHIP_WORKFLOW,j.TEST_BEHAVIOR,j.DEPENDENCIES,j.ARCHITECTURE],docs:[j.CODE_STYLE,j.NAMING_CONVENTION,j.FILE_STRUCTURE],testing:[j.TEST_BEHAVIOR,j.CODE_STYLE,j.DEPENDENCIES],database:[j.ARCHITECTURE,j.NAMING_CONVENTION,j.TECH_STACK,j.DEPENDENCIES],general:Object.values(j)},io={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(Fa,"resolveCanonicalDomains");Pn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getPath(e){let t=cs.join(P.getGlobalProjectPath(e),"memory"),n=this.getSubdirectory();return n?cs.join(t,n,this.getFilename()):cs.join(t,this.getFilename())}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getPath(e);try{let n=await $a.readFile(t,"utf-8");this._data=JSON.parse(n),this.afterLoad(this._data)}catch(n){if(S(n))this._data=this.getDefault();else throw n}return this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getPath(e);await $a.mkdir(cs.dirname(t),{recursive:!0}),await $a.writeFile(t,JSON.stringify(this._data,null,2),"utf-8")}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}},Xs=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()}},Ys=class{static{l(this,"HistoryStore")}_getSessionPath(e){let t=new Date,n=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,s=Fr();return cs.join(P.getGlobalProjectPath(e),"memory","sessions",n,`${s}.jsonl`)}async appendHistory(e,t){let n=this._getSessionPath(e);await Ye(cs.dirname(n));let s={ts:k(),...t,type:t.type};await is(n,s)}async getRecentHistory(e,t=20){let n=this._getSessionPath(e);return Da(n,t)}}});import Oa from"node:fs/promises";import _a from"node:path";var Zs,Na=w(()=>{"use strict";K();M();Wn();Y();Qs();Zs=class r extends Pn{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=k();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=$r(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=k(),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=k();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=$r(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=k(),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:k(),confidence:$r(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=k(),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}}_getArchivePath(e){let t=_a.join(P.getGlobalProjectPath(e),"memory");return _a.join(t,"patterns-archive.json")}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[c,u]of Object.entries(t.decisions)){let p=new Date(u.lastSeen).getTime();n-p>s&&o.push(c)}if(o.length===0)return 0;let i=this._getArchivePath(e),a={};try{let c=await Oa.readFile(i,"utf-8");a=JSON.parse(c)}catch(c){if(!S(c))throw c}for(let c of o)a[c]=t.decisions[c],delete t.decisions[c];return await Oa.mkdir(_a.dirname(i),{recursive:!0}),await Oa.writeFile(i,JSON.stringify(a,null,2),"utf-8"),await this.save(e),o.length}}});var Cn,La=w(()=>{"use strict";yt();Wn();Y();Qs();Cn=class extends Pn{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(j),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(j);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(j));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=k(),u={id:oe(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let p of a)i.index[p].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(p=>p!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=k(),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 d of i.tags||[])c.includes(d)&&(a+=10);let p=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-p),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let d of m)i.content.toLowerCase().includes(d)&&(a+=2),i.title.toLowerCase().includes(d)&&(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(d=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,d.tags||[])),t.commandName){let v=this._getCommandTags(t.commandName),$=(d.tags||[]).filter(G=>v.includes(G));g.tagMatch=Math.min(20,$.length*8)}let b=(Date.now()-new Date(d.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-b*.5)),d.confidence?g.confidence=d.confidence==="high"?20:d.confidence==="medium"?12:5:d.observationCount&&(g.confidence=Math.min(20,d.observationCount*3)),t.taskDescription){let v=this._extractKeywordsFromText(t.taskDescription),$=0;for(let G of v)d.content.toLowerCase().includes(G)&&($+=2),d.title.toLowerCase().includes(G)&&($+=3);g.keywords=Math.min(15,$)}d.userTriggered&&(g.userTriggered=5);let E=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...d,relevanceScore:E,scoreBreakdown:g}}).filter(d=>d.relevanceScore>=i),p=c.sort((d,g)=>g.relevanceScore-d.relevanceScore).slice(0,o),m=p.length>0?Math.round(p.reduce((d,g)=>d+g.relevanceScore,0)/p.length):0;return{memories:p,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:p.length,filteringRatio:s>0?p.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=Ma[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=io[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 Fa(e)}_getCommandTags(e){return{ship:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.CODE_STYLE],task:[j.BRANCH_NAMING,j.CODE_STYLE],sync:[j.TECH_STACK,j.ARCHITECTURE,j.DEPENDENCIES],test:[j.TEST_BEHAVIOR],bug:[j.CODE_STYLE,j.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:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.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:[j.COMMIT_STYLE],branch_naming:[j.BRANCH_NAMING],test_before_ship:[j.TEST_BEHAVIOR,j.SHIP_WORKFLOW],preferred_agent:[j.AGENT_PREFERENCE],code_style:[j.CODE_STYLE],verbosity:[j.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?`
427
- 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 Ua,Vw,ce,ls=w(()=>{"use strict";Qs();Na();La();Qs();Na();La();Ua=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Cn,this._patternStore=new Zs,this._historyStore=new Ys,this._sessionStore=new Xs}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()}},Vw=new Ua,ce=Vw});import{exec as qw}from"node:child_process";import et from"node:fs/promises";import bt from"node:path";import{promisify as Kw}from"node:util";var vn,Ha,Xw,Ie,Tp=w(()=>{"use strict";M();vn=Kw(qw),Ha=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=bt.join(this.projectPath,"package.json"),t=await et.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=bt.join(this.projectPath,"Cargo.toml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readRequirements(){try{let e=bt.join(this.projectPath,"requirements.txt");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readGoMod(){try{let e=bt.join(this.projectPath,"go.mod");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readGemfile(){try{let e=bt.join(this.projectPath,"Gemfile");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readMixExs(){try{let e=bt.join(this.projectPath,"mix.exs");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readPomXml(){try{let e=bt.join(this.projectPath,"pom.xml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readComposerJson(){try{let e=bt.join(this.projectPath,"composer.json"),t=await et.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=bt.join(this.projectPath,"pyproject.toml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await vn('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(`
428
- `).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 et.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(S(e))return[];throw e}}async listDirectories(){try{return(await et.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(S(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await vn('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 vn('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 et.access(bt.join(this.projectPath,e)),!0}catch(t){if(S(t))return!1;throw t}}async readFile(e){try{let t=bt.join(this.projectPath,e);return await et.readFile(t,"utf-8")}catch(t){if(S(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
429
- `).filter(Boolean)}catch{return[]}}},Xw=new Ha,Ie=Xw});import Ga from"node:fs";import co from"node:path";function Ep(){if(er)return er;let r=__dirname;for(let e=0;e<5;e++){let t=co.join(r,"package.json");if(Ga.existsSync(t))try{if(JSON.parse(Ga.readFileSync(t,"utf-8")).name==="prjct-cli")return er=r,r}catch{}r=co.dirname(r)}return er=co.join(__dirname,"..","..",".."),er}function Qw(){if(ao)return ao;try{let r=co.join(Ep(),"package.json"),e=JSON.parse(Ga.readFileSync(r,"utf-8"));return ao=e.version,Yw=e,ao}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var ao,Yw,er,us,Se,xn=w(()=>{"use strict";M();ao=null,Yw=null,er=null;l(Ep,"getPackageRoot");l(Qw,"getVersion");us=Qw(),Se=Ep()});import Ja from"node:fs";import Zw from"node:fs/promises";import lo from"node:path";function Wa(){if(Ap)return za;Ap=!0;let r=lo.join(Se,"dist","templates.json");try{let e=Ja.readFileSync(r,"utf-8");return za=JSON.parse(e),za}catch{return null}}function tS(r){let e=Tn.indexOf(r);e>-1&&Tn.splice(e,1),Tn.push(r)}function nS(){for(;ps.size>=eS&&Tn.length>0;){let r=Tn.shift();r&&ps.delete(r)}}function uo(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(`
430
- `).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(p=>p.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Ip(r){if(ps.has(r))return tS(r),ps.get(r);let e,t=Wa();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=lo.join(Se,"templates","commands",`${r}.md`);try{e=await Zw.readFile(s,"utf-8")}catch{throw Ur.notFound(r)}}let n=uo(e);return nS(),ps.set(r,n),Tn.push(r),n}async function sS(r){return(await Ip(r)).frontmatter["allowed-tools"]||[]}function rS(){ps.clear(),Tn.length=0}function Te(r){let e=Wa();if(e&&e[r])return e[r];let t=lo.join(Se,"templates",r);try{return Ja.readFileSync(t,"utf-8")}catch{return null}}function ds(r){let e=Wa();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=lo.join(Se,"templates",r);try{return Ja.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var eS,ps,Tn,za,Ap,oS,Ba,ms=w(()=>{"use strict";Ht();xn();eS=50,ps=new Map,Tn=[],za=null,Ap=!1;l(Wa,"loadBundle");l(tS,"updateLruOrder");l(nS,"evictLru");l(uo,"parseFrontmatter");l(Ip,"load");l(sS,"getAllowedTools");l(rS,"clearCache");l(Te,"getTemplateContent");l(ds,"listTemplates");oS={load:Ip,parseFrontmatter:uo,getAllowedTools:sS,clearCache:rS,getTemplateContent:Te,listTemplates:ds},Ba=oS});import H from"node:fs/promises";import qa from"node:os";import B from"node:path";async function iS(){try{let r=Te("global/modules/module-config.json");if(r)return JSON.parse(r);let e=B.join(Se,"templates/global/modules/module-config.json"),t=await H.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function aS(r){let e=await iS();if(!e){let i=Te("global/CLAUDE.md");if(i)return i;let a=B.join(Se,"templates/global/CLAUDE.md");return H.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Te("global/CLAUDE.md");if(a)return a;let c=B.join(Se,"templates/global/CLAUDE.md");return H.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=Te(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=B.join(Se,"templates/global/modules",i),u=await H.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(`
431
- `)}async function cS(){try{let r=B.join(qa.homedir(),".prjct-cli","docs");await H.mkdir(r,{recursive:!0});let e=ds("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Te(s);if(o){let i=B.basename(s);await H.writeFile(B.join(r,i),o,"utf-8")}}return{success:!0}}let t=B.join(Se,"templates/global/docs"),n=await H.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=B.join(t,s),i=B.join(r,s),a=await H.readFile(o,"utf-8");await H.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function lS(){let r=(He(),ot(Qe)),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 H.mkdir(e.configDir,{recursive:!0});let s=B.join(e.configDir,e.contextFile),o=B.join(Se,"templates","global",e.contextFile),i="";try{let u=Te(`global/${e.contextFile}`);u?i=u:i=await H.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await aS("standard")}catch{let p=Te("global/CLAUDE.md");if(p)i=p;else{let m=B.join(Se,"templates/global/CLAUDE.md");i=await H.readFile(m,"utf-8")}}else{let p=Te("global/CLAUDE.md");if(p)i=p;else{let m=B.join(Se,"templates/global/CLAUDE.md");i=await H.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await H.readFile(s,"utf-8"),c=!0}catch(u){if(S(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",p="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(p)){let d=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(p)+p.length),f=i.substring(i.indexOf(u),i.indexOf(p)+p.length),b=d+f+g;return await H.writeFile(s,b,"utf-8"),{success:!0,action:"updated",path:s}}else{let d=`${a}
425
+ `}async function Vt(r){try{let e=await bn.readFile(r,"utf-8");return Pp(e)}catch(e){if(S(e))return[];throw e}}async function io(r,e){let t=Ea(e);await bn.writeFile(r,t,"utf-8")}async function rs(r,e){let t=`${JSON.stringify(e)}
426
+ `;await bn.appendFile(r,t,"utf-8")}async function Ow(r,e){let t=Ea(e);await bn.appendFile(r,t,"utf-8")}async function Aa(r,e){return(await Vt(r)).filter(e)}async function Cp(r){try{return(await bn.readFile(r,"utf-8")).split(`
427
+ `).filter(n=>n.trim()).length}catch(e){if(S(e))return 0;throw e}}async function Ia(r,e){return(await Vt(r)).slice(-e)}async function _w(r,e){return(await Vt(r)).slice(0,e)}async function Nw(r){let e=[];for(let t of r){let n=await Vt(t);e.push(...n)}return e}async function Lw(r){return await Cp(r)===0}async function Uw(r,e=Us.JSONL_MAX_LINES){try{let t=Mw.createReadStream(r),n=Fw.createInterface({input:t,crlfDelay:1/0}),s=[];for await(let o of n)if(o.trim()){try{s.push(JSON.parse(o))}catch{}s.length>e&&s.shift()}return s}catch(t){if(S(t))return[];throw t}}async function ja(r){try{return(await bn.stat(r)).size/(1024*1024)}catch(e){if(S(e))return 0;throw e}}async function vp(r,e=Us.ROTATION_SIZE_MB){let t=await ja(r);if(t<e)return!1;let n=new Date().toISOString().split("T")[0],s=kn.dirname(r),o=kn.extname(r),i=kn.basename(r,o),a=kn.join(s,`${i}-${n}${o}`);return await bn.rename(r,a),console.log(`\u{1F4E6} Rotated ${kn.basename(r)} (${t.toFixed(1)}MB) \u2192 ${kn.basename(a)}`),!0}async function os(r,e,t=Us.ROTATION_SIZE_MB){await vp(r,t),await rs(r,e)}async function Hw(r,e=Us.LARGE_FILE_WARN_MB){let t=await ja(r),n=t>e;return n&&console.warn(`\u26A0\uFE0F Large file detected: ${kn.basename(r)} (${t.toFixed(1)}MB). Reading may use significant memory.`),{sizeMB:t,isLarge:n}}var Bs=w(()=>{"use strict";M();Jt();l(Pp,"parseJsonLines");l(Ea,"stringifyJsonLines");l(Vt,"readJsonLines");l(io,"writeJsonLines");l(rs,"appendJsonLine");l(Ow,"appendJsonLines");l(Aa,"filterJsonLines");l(Cp,"countJsonLines");l(Ia,"getLastJsonLines");l(_w,"getFirstJsonLines");l(Nw,"mergeJsonLines");l(Lw,"isJsonLinesEmpty");l(Uw,"readJsonLinesStreaming");l(ja,"getFileSizeMB");l(vp,"rotateJsonLinesIfNeeded");l(os,"appendJsonLineWithRotation");l(Hw,"checkFileSizeWarning")});import Da from"node:fs/promises";import is from"node:path";function $a(r){if(eu.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ao))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 Ra,ao,Pn,Vs,qs,Ks=w(()=>{"use strict";K();M();zn();Q();Ee();Bs();Ra={frontend:[j.CODE_STYLE,j.FILE_STRUCTURE,j.ARCHITECTURE,j.TECH_STACK],backend:[j.CODE_STYLE,j.ARCHITECTURE,j.DEPENDENCIES,j.TECH_STACK],devops:[j.SHIP_WORKFLOW,j.TEST_BEHAVIOR,j.DEPENDENCIES,j.ARCHITECTURE],docs:[j.CODE_STYLE,j.NAMING_CONVENTION,j.FILE_STRUCTURE],testing:[j.TEST_BEHAVIOR,j.CODE_STYLE,j.DEPENDENCIES],database:[j.ARCHITECTURE,j.NAMING_CONVENTION,j.TECH_STACK,j.DEPENDENCIES],general:Object.values(j)},ao={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($a,"resolveCanonicalDomains");Pn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getPath(e){let t=is.join(P.getGlobalProjectPath(e),"memory"),n=this.getSubdirectory();return n?is.join(t,n,this.getFilename()):is.join(t,this.getFilename())}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getPath(e);try{let n=await Da.readFile(t,"utf-8");this._data=JSON.parse(n),this.afterLoad(this._data)}catch(n){if(S(n))this._data=this.getDefault();else throw n}return this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getPath(e);await Da.mkdir(is.dirname(t),{recursive:!0}),await Da.writeFile(t,JSON.stringify(this._data,null,2),"utf-8")}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}},Vs=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()}},qs=class{static{l(this,"HistoryStore")}_getSessionPath(e){let t=new Date,n=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,s=$r();return is.join(P.getGlobalProjectPath(e),"memory","sessions",n,`${s}.jsonl`)}async appendHistory(e,t){let n=this._getSessionPath(e);await Ye(is.dirname(n));let s={ts:b(),...t,type:t.type};await rs(n,s)}async getRecentHistory(e,t=20){let n=this._getSessionPath(e);return Ia(n,t)}}});import Ma from"node:fs/promises";import Fa from"node:path";var Xs,Oa=w(()=>{"use strict";K();M();zn();Q();Ks();Xs=class r extends Pn{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=b();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=Dr(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=b(),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=b();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=Dr(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=b(),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:b(),confidence:Dr(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=b(),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}}_getArchivePath(e){let t=Fa.join(P.getGlobalProjectPath(e),"memory");return Fa.join(t,"patterns-archive.json")}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[c,u]of Object.entries(t.decisions)){let p=new Date(u.lastSeen).getTime();n-p>s&&o.push(c)}if(o.length===0)return 0;let i=this._getArchivePath(e),a={};try{let c=await Ma.readFile(i,"utf-8");a=JSON.parse(c)}catch(c){if(!S(c))throw c}for(let c of o)a[c]=t.decisions[c],delete t.decisions[c];return await Ma.mkdir(Fa.dirname(i),{recursive:!0}),await Ma.writeFile(i,JSON.stringify(a,null,2),"utf-8"),await this.save(e),o.length}}});var Cn,_a=w(()=>{"use strict";wt();zn();Q();Ks();Cn=class extends Pn{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(j),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(j);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(j));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=b(),u={id:ie(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let p of a)i.index[p].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(p=>p!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=b(),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 d of i.tags||[])c.includes(d)&&(a+=10);let p=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-p),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let d of m)i.content.toLowerCase().includes(d)&&(a+=2),i.title.toLowerCase().includes(d)&&(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(d=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,d.tags||[])),t.commandName){let x=this._getCommandTags(t.commandName),$=(d.tags||[]).filter(J=>x.includes(J));g.tagMatch=Math.min(20,$.length*8)}let k=(Date.now()-new Date(d.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),d.confidence?g.confidence=d.confidence==="high"?20:d.confidence==="medium"?12:5:d.observationCount&&(g.confidence=Math.min(20,d.observationCount*3)),t.taskDescription){let x=this._extractKeywordsFromText(t.taskDescription),$=0;for(let J of x)d.content.toLowerCase().includes(J)&&($+=2),d.title.toLowerCase().includes(J)&&($+=3);g.keywords=Math.min(15,$)}d.userTriggered&&(g.userTriggered=5);let v=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...d,relevanceScore:v,scoreBreakdown:g}}).filter(d=>d.relevanceScore>=i),p=c.sort((d,g)=>g.relevanceScore-d.relevanceScore).slice(0,o),m=p.length>0?Math.round(p.reduce((d,g)=>d+g.relevanceScore,0)/p.length):0;return{memories:p,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:p.length,filteringRatio:s>0?p.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=Ra[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ao[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 $a(e)}_getCommandTags(e){return{ship:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.CODE_STYLE],task:[j.BRANCH_NAMING,j.CODE_STYLE],sync:[j.TECH_STACK,j.ARCHITECTURE,j.DEPENDENCIES],test:[j.TEST_BEHAVIOR],bug:[j.CODE_STYLE,j.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:[j.COMMIT_STYLE,j.SHIP_WORKFLOW,j.TEST_BEHAVIOR],feature:[j.ARCHITECTURE,j.CODE_STYLE],done:[j.SHIP_WORKFLOW],analyze:[j.TECH_STACK,j.ARCHITECTURE],spec:[j.ARCHITECTURE,j.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:[j.COMMIT_STYLE],branch_naming:[j.BRANCH_NAMING],test_before_ship:[j.TEST_BEHAVIOR,j.SHIP_WORKFLOW],preferred_agent:[j.AGENT_PREFERENCE],code_style:[j.CODE_STYLE],verbosity:[j.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?`
428
+ 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 Na,Gw,le,as=w(()=>{"use strict";Ks();Oa();_a();Ks();Oa();_a();Na=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Cn,this._patternStore=new Xs,this._historyStore=new qs,this._sessionStore=new Vs}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()}},Gw=new Na,le=Gw});import{exec as zw}from"node:child_process";import et from"node:fs/promises";import Ct from"node:path";import{promisify as Jw}from"node:util";var vn,La,Ww,Ie,xp=w(()=>{"use strict";M();vn=Jw(zw),La=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Ct.join(this.projectPath,"package.json"),t=await et.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Ct.join(this.projectPath,"Cargo.toml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readRequirements(){try{let e=Ct.join(this.projectPath,"requirements.txt");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readGoMod(){try{let e=Ct.join(this.projectPath,"go.mod");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readGemfile(){try{let e=Ct.join(this.projectPath,"Gemfile");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readMixExs(){try{let e=Ct.join(this.projectPath,"mix.exs");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readPomXml(){try{let e=Ct.join(this.projectPath,"pom.xml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async readComposerJson(){try{let e=Ct.join(this.projectPath,"composer.json"),t=await et.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(S(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Ct.join(this.projectPath,"pyproject.toml");return await et.readFile(e,"utf-8")}catch(e){if(S(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await vn('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(`
429
+ `).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 et.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(S(e))return[];throw e}}async listDirectories(){try{return(await et.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(S(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await vn('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 vn('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 et.access(Ct.join(this.projectPath,e)),!0}catch(t){if(S(t))return!1;throw t}}async readFile(e){try{let t=Ct.join(this.projectPath,e);return await et.readFile(t,"utf-8")}catch(t){if(S(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
430
+ `).filter(Boolean)}catch{return[]}}},Ww=new La,Ie=Ww});import Ua from"node:fs";import lo from"node:path";function Tp(){if(Ys)return Ys;let r=__dirname;for(let e=0;e<5;e++){let t=lo.join(r,"package.json");if(Ua.existsSync(t))try{if(JSON.parse(Ua.readFileSync(t,"utf-8")).name==="prjct-cli")return Ys=r,r}catch{}r=lo.dirname(r)}return Ys=lo.join(__dirname,"..","..",".."),Ys}function Vw(){if(co)return co;try{let r=lo.join(Tp(),"package.json"),e=JSON.parse(Ua.readFileSync(r,"utf-8"));return co=e.version,Bw=e,co}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}var co,Bw,Ys,cs,Se,xn=w(()=>{"use strict";M();co=null,Bw=null,Ys=null;l(Tp,"getPackageRoot");l(Vw,"getVersion");cs=Vw(),Se=Tp()});import Ga from"node:fs";import qw from"node:fs/promises";import uo from"node:path";function za(){if(Ep)return Ha;Ep=!0;let r=uo.join(Se,"dist","templates.json");try{let e=Ga.readFileSync(r,"utf-8");return Ha=JSON.parse(e),Ha}catch{return null}}function Xw(r){let e=Tn.indexOf(r);e>-1&&Tn.splice(e,1),Tn.push(r)}function Yw(){for(;ls.size>=Kw&&Tn.length>0;){let r=Tn.shift();r&&ls.delete(r)}}function po(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(`
431
+ `).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(p=>p.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function Ap(r){if(ls.has(r))return Xw(r),ls.get(r);let e,t=za();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=uo.join(Se,"templates","commands",`${r}.md`);try{e=await qw.readFile(s,"utf-8")}catch{throw Nr.notFound(r)}}let n=po(e);return Yw(),ls.set(r,n),Tn.push(r),n}async function Qw(r){return(await Ap(r)).frontmatter["allowed-tools"]||[]}function Zw(){ls.clear(),Tn.length=0}function xe(r){let e=za();if(e?.[r])return e[r];let t=uo.join(Se,"templates",r);try{return Ga.readFileSync(t,"utf-8")}catch{return null}}function us(r){let e=za();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=uo.join(Se,"templates",r);try{return Ga.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var Kw,ls,Tn,Ha,Ep,eS,Ja,ps=w(()=>{"use strict";zt();xn();Kw=50,ls=new Map,Tn=[],Ha=null,Ep=!1;l(za,"loadBundle");l(Xw,"updateLruOrder");l(Yw,"evictLru");l(po,"parseFrontmatter");l(Ap,"load");l(Qw,"getAllowedTools");l(Zw,"clearCache");l(xe,"getTemplateContent");l(us,"listTemplates");eS={load:Ap,parseFrontmatter:po,getAllowedTools:Qw,clearCache:Zw,getTemplateContent:xe,listTemplates:us},Ja=eS});import z from"node:fs/promises";import Ba from"node:os";import B from"node:path";async function tS(){try{let r=xe("global/modules/module-config.json");if(r)return JSON.parse(r);let e=B.join(Se,"templates/global/modules/module-config.json"),t=await z.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function nS(r){let e=await tS();if(!e){let i=xe("global/CLAUDE.md");if(i)return i;let a=B.join(Se,"templates/global/CLAUDE.md");return z.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=xe("global/CLAUDE.md");if(a)return a;let c=B.join(Se,"templates/global/CLAUDE.md");return z.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=xe(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=B.join(Se,"templates/global/modules",i),u=await z.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(`
432
+ `)}async function sS(){try{let r=B.join(Ba.homedir(),".prjct-cli","docs");await z.mkdir(r,{recursive:!0});let e=us("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=xe(s);if(o){let i=B.basename(s);await z.writeFile(B.join(r,i),o,"utf-8")}}return{success:!0}}let t=B.join(Se,"templates/global/docs"),n=await z.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=B.join(t,s),i=B.join(r,s),a=await z.readFile(o,"utf-8");await z.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function rS(){let r=(ze(),ot(Qe)),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 z.mkdir(e.configDir,{recursive:!0});let s=B.join(e.configDir,e.contextFile),o=B.join(Se,"templates","global",e.contextFile),i="";try{let u=xe(`global/${e.contextFile}`);u?i=u:i=await z.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await nS("standard")}catch{let p=xe("global/CLAUDE.md");if(p)i=p;else{let m=B.join(Se,"templates/global/CLAUDE.md");i=await z.readFile(m,"utf-8")}}else{let p=xe("global/CLAUDE.md");if(p)i=p;else{let m=B.join(Se,"templates/global/CLAUDE.md");i=await z.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await z.readFile(s,"utf-8"),c=!0}catch(u){if(S(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",p="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(p)){let d=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(p)+p.length),f=i.substring(i.indexOf(u),i.indexOf(p)+p.length),k=d+f+g;return await z.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let d=`${a}
432
433
 
433
- ${i}`;return await H.writeFile(s,d,"utf-8"),{success:!0,action:"appended",path:s}}}else return await H.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function jp(){let r=qa.homedir();return{claude:{commands:B.join(r,".claude","commands","p"),config:B.join(r,".claude"),router:B.join(r,".claude","commands","p.md")},gemini:{commands:B.join(r,".gemini","commands"),config:B.join(r,".gemini"),router:B.join(r,".gemini","commands","p.toml")}}}var Va,uS,Oe,En=w(()=>{"use strict";ms();M();xn();l(iS,"loadModuleConfig");l(aS,"composeGlobalTemplate");l(cS,"installDocs");l(lS,"installGlobalConfig");Va=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=qa.homedir(),this.templatesDir=B.join(Se,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(He(),ot(Qe)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=B.join(t.configDir,"commands"):this.claudeCommandsPath=B.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await H.access(this.claudeConfigPath),!0}catch(e){if(S(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=ds("commands/");if(e.length>0)return e.filter(t=>t.endsWith(".md")).map(t=>t.replace("commands/",""));try{return(await H.readdir(this.templatesDir)).filter(n=>n.endsWith(".md"))}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(He(),ot(Qe)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await H.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=B.join(this.claudeCommandsPath,a),u=Te(`commands/${a}`);if(u)await H.writeFile(c,u,"utf-8");else{let p=B.join(this.templatesDir,a),m=await H.readFile(p,"utf-8");await H.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=B.join(this.claudeCommandsPath,s);await H.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await H.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await H.access(this.claudeCommandsPath);let n=(await H.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(S(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(Te(`commands/${e}.md`))return!0;try{let n=B.join(this.templatesDir,`${e}.md`);return await H.access(n),!0}catch(n){if(S(n))return!1;throw n}}async installRouter(){let t=await(He(),ot(Qe)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=B.join(t.configDir,"commands",n);await H.mkdir(B.dirname(s),{recursive:!0});let o=Te(`commands/${n}`);if(o)return await H.writeFile(s,o,"utf-8"),!0;let i=B.join(this.templatesDir,n),a=await H.readFile(i,"utf-8");return await H.writeFile(s,a,"utf-8"),!0}catch(s){if(S(s))return!1;throw s}}async removeLegacyCommands(){let t=await(He(),ot(Qe)).getActiveProvider(),n=B.join(t.configDir,"commands"),s=0;try{let i=(await H.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await H.unlink(B.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 H.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await H.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(S(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=B.join(this.claudeCommandsPath,o),a=n.includes(o),c=Te(`commands/${o}`);if(c)await H.writeFile(i,c,"utf-8");else{let u=B.join(this.templatesDir,o),p=await H.readFile(u,"utf-8");await H.writeFile(i,p,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return lS()}async installDocs(){return cS()}};l(jp,"getProviderPaths");uS=new Va,Oe=uS});function pS(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function dS(r){let e=[],t=pS(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Ka,o+i.length);if(c===-1)continue;let u=c+Ka.length,p=r.substring(o,u);e.push({id:a,content:p,startIndex:o,endIndex:u})}return e}function tr(r,e){let t=dS(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
434
+ ${i}`;return await z.writeFile(s,d,"utf-8"),{success:!0,action:"appended",path:s}}}else return await z.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:y(s),action:"failed"}}}function Ip(){let r=Ba.homedir();return{claude:{commands:B.join(r,".claude","commands","p"),config:B.join(r,".claude"),router:B.join(r,".claude","commands","p.md")},gemini:{commands:B.join(r,".gemini","commands"),config:B.join(r,".gemini"),router:B.join(r,".gemini","commands","p.toml")}}}var Wa,oS,_e,En=w(()=>{"use strict";ps();M();xn();l(tS,"loadModuleConfig");l(nS,"composeGlobalTemplate");l(sS,"installDocs");l(rS,"installGlobalConfig");Wa=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Ba.homedir(),this.templatesDir=B.join(Se,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(ze(),ot(Qe)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=B.join(t.configDir,"commands"):this.claudeCommandsPath=B.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await z.access(this.claudeConfigPath),!0}catch(e){if(S(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=us("commands/");if(e.length>0)return e.filter(t=>t.endsWith(".md")).map(t=>t.replace("commands/",""));try{return(await z.readdir(this.templatesDir)).filter(n=>n.endsWith(".md"))}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(ze(),ot(Qe)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await z.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=B.join(this.claudeCommandsPath,a),u=xe(`commands/${a}`);if(u)await z.writeFile(c,u,"utf-8");else{let p=B.join(this.templatesDir,a),m=await z.readFile(p,"utf-8");await z.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:y(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:y(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=B.join(this.claudeCommandsPath,s);await z.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:y(o)})}try{await z.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await z.access(this.claudeCommandsPath);let n=(await z.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(S(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(xe(`commands/${e}.md`))return!0;try{let n=B.join(this.templatesDir,`${e}.md`);return await z.access(n),!0}catch(n){if(S(n))return!1;throw n}}async installRouter(){let t=await(ze(),ot(Qe)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=B.join(t.configDir,"commands",n);await z.mkdir(B.dirname(s),{recursive:!0});let o=xe(`commands/${n}`);if(o)return await z.writeFile(s,o,"utf-8"),!0;let i=B.join(this.templatesDir,n),a=await z.readFile(i,"utf-8");return await z.writeFile(s,a,"utf-8"),!0}catch(s){if(S(s))return!1;throw s}}async removeLegacyCommands(){let t=await(ze(),ot(Qe)).getActiveProvider(),n=B.join(t.configDir,"commands"),s=0;try{let i=(await z.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await z.unlink(B.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 z.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await z.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(S(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=B.join(this.claudeCommandsPath,o),a=n.includes(o),c=xe(`commands/${o}`);if(c)await z.writeFile(i,c,"utf-8");else{let u=B.join(this.templatesDir,o),p=await z.readFile(u,"utf-8");await z.writeFile(i,p,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:y(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return rS()}async installDocs(){return sS()}};l(Ip,"getProviderPaths");oS=new Wa,_e=oS});function iS(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function aS(r){let e=[],t=iS(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Va,o+i.length);if(c===-1)continue;let u=c+Va.length,p=r.substring(o,u);e.push({id:a,content:p,startIndex:o,endIndex:u})}return e}function Qs(r,e){let t=aS(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
434
435
 
435
436
  ---
436
437
 
@@ -441,11 +442,11 @@ ${i}`;return await H.writeFile(s,d,"utf-8"),{success:!0,action:"appended",path:s
441
442
  `;for(let s of t)n+=s.content,n+=`
442
443
 
443
444
  `;return`${n.trimEnd()}
444
- `}function nr(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(`
445
- `);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(Ka)&&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 Ka,po=w(()=>{"use strict";Ka="<!-- /prjct:preserve -->";l(pS,"createPreserveStartRegex");l(dS,"extractPreservedSections");l(tr,"mergePreservedSections");l(nr,"validatePreserveBlocks")});function sr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&mS.has(e.code))return!0;if(e.code&&Rp.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 go(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Rp.has(e.code))}function Dp(r,e,t){let n=on.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(on.delete(r),!1):!0:!1}function Xa(r,e){let t=on.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),on.set(r,t)}function gS(r){on.delete(r)}var mS,Rp,on,mo,$p,rr,fo=w(()=>{"use strict";mS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Rp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(sr,"isTransientError");l(go,"isPermanentError");on=new Map;l(Dp,"isCircuitOpen");l(Xa,"recordFailure");l(gS,"recordSuccess");mo=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(Dp(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 gS(t),o}catch(o){if(n=o,s++,go(o))throw Xa(t,this.options.circuitBreakerThreshold),o;if(!(sr(o)&&s<this.options.maxAttempts))throw Xa(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 Xa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return sr(e)}isCircuitOpen(e){return Dp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},$p=new mo({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),rr=new mo({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Mp=w(()=>{"use strict";po();fo()});import{exec as fS}from"node:child_process";import{promisify as hS}from"node:util";async function ho(r){try{let{stdout:e}=await yS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function wS(){let r=await ho("gh api user --jq .login");return r.success&&r.output||(r=await ho("git config --global github.user"),r.success&&r.output)?r.output:null}async function SS(){let r=await ho("git config user.name");return r.success&&r.output?r.output:null}async function kS(){let r=await ho("git config user.email");return r.success&&r.output?r.output:null}async function gs(){let[r,e,t]=await Promise.all([wS(),SS(),kS()]);return{github:r,email:t,name:e||r||"Unknown"}}var yS,yo=w(()=>{"use strict";yS=hS(fS);l(ho,"execCommand");l(wS,"detectGitHubUsername");l(SS,"detectGitName");l(kS,"detectGitEmail");l(gs,"detect")});import An from"node:fs/promises";import bS from"node:path";import*as wo from"jsonc-parser";function Fp(r){let e=[],t=wo.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}: ${wo.printParseErrorCode(n.error)}`)}return t}var Qa,PS,R,at=w(()=>{"use strict";Ht();M();Y();xn();yo();K();l(Fp,"parseJsonc");Qa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=P.getLocalConfigPath(e),n=await An.readFile(t,"utf-8");return Fp(n)}catch(t){return S(t)||console.warn(`Warning: Could not read config at ${e}: ${V(t)}`),null}}async writeConfig(e,t){let n=P.getLocalConfigPath(e),s=P.getLegacyPrjctPath(e);await An.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await An.writeFile(n,`${o}
446
- `,"utf-8")}async readGlobalConfig(e){try{let t=P.getGlobalProjectConfigPath(e),n=await An.readFile(t,"utf-8");return Fp(n)}catch(t){return S(t)||console.warn(`Warning: Could not read global config for ${e}: ${V(t)}`),null}}async writeGlobalConfig(e,t){let n=P.getGlobalProjectConfigPath(e),s=P.getGlobalProjectPath(e);await An.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await An.writeFile(n,`${o}
447
- `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=k();t={projectId:e,authors:[],version:us,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=P.generateProjectId(e),s=P.getGlobalProjectPath(n),o=P.getDisplayPath(s),i=k(),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:us,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=k(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await P.hasLegacyStructure(e))return!1;if(!await P.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=P.getGlobalProjectPath(s.projectId);try{return(await An.readdir(bS.join(o,"core"))).length===0}catch(i){return S(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:P.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=k();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=k(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await gs(),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=P.generateProjectId(e);return{projectId:n,dataPath:P.getDisplayPath(P.getGlobalProjectPath(n))}}},PS=new Qa,R=PS});import So from"node:fs/promises";import Za from"node:path";var ec,Op,_p=w(()=>{"use strict";at();K();M();ec=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=P.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await So.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await So.readFile(Za.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return S(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Za.join(this.agentsPath,`${e}.md`),n=await So.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return S(t)||console.error(`Agent load error: ${y(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=Za.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})}
448
- `;await So.appendFile(s,o)}catch(s){S(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Op=ec});import Np from"node:path";async function xS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await D(Np.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await D(Np.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function TS(){return{...CS}}function ES(){return{...vS}}async function Lp(){return ko||(ko=await xS()?TS():ES(),ko)}var ko,CS,vS,Up=w(()=>{"use strict";Ce();ko=null,CS={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}},vS={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(xS,"isClaudeEnvironment");l(TS,"getClaudeAgent");l(ES,"getTerminalAgent");l(Lp,"detect")});var IS,tc=w(()=>{IS=Kl({})});var jS,bo,fs,Hp=w(()=>{"use strict";_p();Ht();Up();fo();tc();jS=["claude"],bo=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Op}async initialize(){return this.agent?this.agent:await $p.execute(async()=>{if(this.agentInfo=await Lp(),!this.agentInfo?.isSupported)throw Hs.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!jS.includes(e))throw Hs.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await IS(`../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:`
445
+ `}function Zs(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(`
446
+ `);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(Va)&&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 Va,mo=w(()=>{"use strict";Va="<!-- /prjct:preserve -->";l(iS,"createPreserveStartRegex");l(aS,"extractPreservedSections");l(Qs,"mergePreservedSections");l(Zs,"validatePreserveBlocks")});function er(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&cS.has(e.code))return!0;if(e.code&&Dp.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 fo(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Dp.has(e.code))}function jp(r,e,t){let n=on.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(on.delete(r),!1):!0:!1}function qa(r,e){let t=on.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),on.set(r,t)}function lS(r){on.delete(r)}var cS,Dp,on,go,Rp,tr,ho=w(()=>{"use strict";cS=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Dp=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(er,"isTransientError");l(fo,"isPermanentError");on=new Map;l(jp,"isCircuitOpen");l(qa,"recordFailure");l(lS,"recordSuccess");go=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(jp(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 lS(t),o}catch(o){if(n=o,s++,fo(o))throw qa(t,this.options.circuitBreakerThreshold),o;if(!(er(o)&&s<this.options.maxAttempts))throw qa(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 qa(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return er(e)}isCircuitOpen(e){return jp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},Rp=new go({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),tr=new go({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var $p=w(()=>{"use strict";mo();ho()});import{exec as uS}from"node:child_process";import{promisify as pS}from"node:util";async function yo(r){try{let{stdout:e}=await dS(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mS(){let r=await yo("gh api user --jq .login");return r.success&&r.output||(r=await yo("git config --global github.user"),r.success&&r.output)?r.output:null}async function gS(){let r=await yo("git config user.name");return r.success&&r.output?r.output:null}async function fS(){let r=await yo("git config user.email");return r.success&&r.output?r.output:null}async function ds(){let[r,e,t]=await Promise.all([mS(),gS(),fS()]);return{github:r,email:t,name:e||r||"Unknown"}}var dS,wo=w(()=>{"use strict";dS=pS(uS);l(yo,"execCommand");l(mS,"detectGitHubUsername");l(gS,"detectGitName");l(fS,"detectGitEmail");l(ds,"detect")});import An from"node:fs/promises";import hS from"node:path";import*as So from"jsonc-parser";function Mp(r){let e=[],t=So.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}: ${So.printParseErrorCode(n.error)}`)}return t}var Xa,yS,R,ct=w(()=>{"use strict";zt();M();Q();xn();wo();K();l(Mp,"parseJsonc");Xa=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=P.getLocalConfigPath(e),n=await An.readFile(t,"utf-8");return Mp(n)}catch(t){return S(t)||console.warn(`Warning: Could not read config at ${e}: ${V(t)}`),null}}async writeConfig(e,t){let n=P.getLocalConfigPath(e),s=P.getLegacyPrjctPath(e);await An.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await An.writeFile(n,`${o}
447
+ `,"utf-8")}async readGlobalConfig(e){try{let t=P.getGlobalProjectConfigPath(e),n=await An.readFile(t,"utf-8");return Mp(n)}catch(t){return S(t)||console.warn(`Warning: Could not read global config for ${e}: ${V(t)}`),null}}async writeGlobalConfig(e,t){let n=P.getGlobalProjectConfigPath(e),s=P.getGlobalProjectPath(e);await An.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await An.writeFile(n,`${o}
448
+ `,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=b();t={projectId:e,authors:[],version:cs,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=P.generateProjectId(e),s=P.getGlobalProjectPath(n),o=P.getDisplayPath(s),i=b(),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:cs,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=b(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await P.hasLegacyStructure(e))return!1;if(!await P.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=P.getGlobalProjectPath(s.projectId);try{return(await An.readdir(hS.join(o,"core"))).length===0}catch(i){return S(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:P.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=b();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=b(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await ds(),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=P.generateProjectId(e);return{projectId:n,dataPath:P.getDisplayPath(P.getGlobalProjectPath(n))}}},yS=new Xa,R=yS});import ko from"node:fs/promises";import Ya from"node:path";var Qa,Fp,Op=w(()=>{"use strict";ct();K();M();Qa=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=P.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await ko.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await ko.readFile(Ya.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return S(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Ya.join(this.agentsPath,`${e}.md`),n=await ko.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return S(t)||console.error(`Agent load error: ${y(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=Ya.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})}
449
+ `;await ko.appendFile(s,o)}catch(s){S(s)||console.error(`Agent usage log error: ${y(s)}`)}}},Fp=Qa});import _p from"node:path";async function kS(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await D(_p.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await D(_p.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function bS(){return{...wS}}function PS(){return{...SS}}async function Np(){return bo||(bo=await kS()?bS():PS(),bo)}var bo,wS,SS,Lp=w(()=>{"use strict";Ee();bo=null,wS={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}},SS={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(kS,"isClaudeEnvironment");l(bS,"getClaudeAgent");l(PS,"getTerminalAgent");l(Np,"detect")});var vS,Za=w(()=>{vS=ql({})});var xS,Po,ms,Up=w(()=>{"use strict";Op();zt();Lp();ho();Za();xS=["claude"],Po=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Fp}async initialize(){return this.agent?this.agent:await Rp.execute(async()=>{if(this.agentInfo=await Np(),!this.agentInfo?.isSupported)throw Ls.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!xS.includes(e))throw Ls.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await vS(`../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:`
449
450
  AGENTIC EXECUTION:
450
451
  - Read: templates/agentic/orchestrator.md
451
452
  - Analyze task: "${e}"
@@ -453,12 +454,12 @@ ${i}`;return await H.writeFile(s,d,"utf-8"),{success:!0,action:"appended",path:s
453
454
  - Claude decides which agent(s) to use
454
455
  - Always prefer specialists over generalist
455
456
  - Fragment complex tasks into subtasks
456
- `}}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 bo});var Po,Co,Gp=w(()=>{"use strict";Po=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"}},Co=new Po});var zp,DS,vo,RS,Jp=w(()=>{"use strict";Bs();zp=8e4,DS={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"]},vo=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||zp,[c,u,p]=await Promise.all([Re.readIndex(t),Re.readDomains(t),Re.readCategories(t)]);if(!c||!u||!p)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),d=new Set;for(let $ of m){let G=p.domainIndex[$]||[];for(let Pe of G)d.add(Pe)}if(i&&p.domainIndex.general){let $=p.domainIndex.general.slice(0,10);for(let G of $)d.add(G)}let g=c.relevantFiles.filter($=>d.has($.path)&&$.score>=o);g.sort(($,G)=>G.score-$.score);let f=0,b=[];for(let $ of g){let G=Math.ceil($.size/this.CHARS_PER_TOKEN);if(f+G>a||b.length>=s)break;b.push($),f+=G}let E=Math.ceil(c.relevantFiles.reduce(($,G)=>$+G.size,0)/this.CHARS_PER_TOKEN),v=E>0?(E-f)/E:0;return{files:b,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:b.length,compressionRate:v,estimatedTokensSaved:E-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(DS))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 Re.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 Re.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Re.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||zp,i=e.filter(p=>p.score>=s).sort((p,m)=>m.score-p.score),a=0,c=[];for(let p of i){let m=Math.ceil(p.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(p),a+=m}let u=Math.ceil(e.reduce((p,m)=>p+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)}},RS=new vo});import Wp from"node:path";var nc,xo,$S,Bp=w(()=>{"use strict";Bs();Y();nc=[{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"}],xo=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 nc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let p=Wp.dirname(i.path);n.get(u).add(`**/${Wp.basename(p)}/**`)}}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=nc.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=k();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let d=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(d+=1);for(let{pattern:g,domain:f}of nc)f===m.name&&g.test(a)&&(d+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(d+=1)}d>0&&i.push({domain:m.name,score:d})}i.sort((m,d)=>d.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],p=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:p,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=k(),o={version:St,projectId:e,domains:t,discoveredAt:s};await Re.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:St,lastUpdate:s,fileCategories:n,domainIndex:i};await Re.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Re.readDomains(e),Re.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 Re.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 Re.readCategories(e);if(i){let a=new Set(t.map(d=>d.path)),u=[...i.fileCategories.filter(d=>!a.has(d.path)),...o],p={};for(let d of u)for(let g of d.categories)p[g]||(p[g]=[]),p[g].push(d.path);let m={version:St,lastUpdate:k(),fileCategories:u,domainIndex:p};await Re.writeCategories(e,m)}return o}},$S=new xo});import sc from"node:path";var rc,MS,FS,To,Vp,oc=w(()=>{"use strict";rc=30,MS=[/^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$/],FS=[/^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],To=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=rc){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=sc.basename(e.path);for(let n of MS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=sc.basename(e.path);for(let s of FS)if(s.test(t))return 15;let n=sc.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}},Vp=new To});function ic(r,e){return{...Fs[r],...e}}function Eo(r,e,t){return{message:r,hint:e,...t}}var Ao=w(()=>{"use strict";Rr();Rr();l(ic,"getError");l(Eo,"createError")});import{execSync as ac}from"node:child_process";var Io,cc,jo,Do,lc=w(()=>{"use strict";Ao();Io={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"}},cc=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=Io[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=Io[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new jo(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=Io[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
457
- `);throw new jo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
458
- ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Io),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=ac(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:Eo(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return ac(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return ac(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Eo(`${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())}},jo=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}},Do=new cc});import{exec as OS}from"node:child_process";import{promisify as _S}from"node:util";var F0,qp=w(()=>{"use strict";Gt();lc();F0=_S(OS)});var Ro,ze,uc=w(()=>{"use strict";at();K();rn();M();Y();Ks();Ro=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;let i=P.getFilePath(o,"memory","context.jsonl"),a={timestamp:k(),action:t,data:n,author:s};await is(i,a)}catch(o){S(o)||console.error(`Memory log error: ${y(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);if(!n)return[];let s=P.getFilePath(n,"memory","context.jsonl");return(await Bt(s)).slice(-t)}catch(n){return!S(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${y(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){return(await this.getRecent(e,1e3)).filter(o=>o.action===t).slice(-n)}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;let n=P.getFilePath(t,"memory","context.jsonl");await oo(n,[])}catch(t){S(t)||console.error(`Memory clear error: ${y(t)}`)}}async getRecentEvents(e,t=100){try{let n=P.getFilePath(e,"memory","context.jsonl");return(await Bt(n)).slice(-t)}catch(n){return!S(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${y(n)}`),[]}}async capEntries(e){try{let t=P.getFilePath(e,"memory","context.jsonl"),n=await Bt(t);if(n.length<=wt.MEMORY_MAX_ENTRIES)return 0;let s=n.slice(0,n.length-wt.MEMORY_MAX_ENTRIES),o=n.slice(-wt.MEMORY_MAX_ENTRIES);return Ze.archiveMany(e,s.map((i,a)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||a}`,entityData:i,summary:i.action,reason:"overflow"}))),await oo(t,o),s.length}catch(t){return S(t)||console.error(`Memory cap error: ${y(t)}`),0}}},ze=new Ro});import $o from"node:fs/promises";import fe from"node:path";var or,pc=w(()=>{"use strict";K();Ce();or=class{static{l(this,"NestedContextResolver")}rootPath;monoInfo=null;constructor(e){this.rootPath=fe.resolve(e)}async initialize(){this.monoInfo=await P.detectMonorepo(this.rootPath)}async discoverContextFiles(){let e=[],t=fe.join(this.rootPath,"PRJCT.md");if(await D(t)){let s=await this.loadContext(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=fe.join(s.path,"PRJCT.md");if(await D(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadContext(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedContexts(this.rootPath,e);return e.push(...n),e}async loadContext(e,t,n=null){let s=await $o.readFile(e,"utf-8"),o=fe.relative(this.rootPath,e),i=o.split(fe.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,sections:this.parseSections(s),package:n}}parseSections(e){let t=[],n=e.split(`
457
+ `}}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}},ms=new Po});var Co,vo,Hp=w(()=>{"use strict";Co=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"}},vo=new Co});var Gp,TS,xo,ES,zp=w(()=>{"use strict";zs();Gp=8e4,TS={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"]},xo=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||Gp,[c,u,p]=await Promise.all([Re.readIndex(t),Re.readDomains(t),Re.readCategories(t)]);if(!c||!u||!p)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),d=new Set;for(let $ of m){let J=p.domainIndex[$]||[];for(let Pe of J)d.add(Pe)}if(i&&p.domainIndex.general){let $=p.domainIndex.general.slice(0,10);for(let J of $)d.add(J)}let g=c.relevantFiles.filter($=>d.has($.path)&&$.score>=o);g.sort(($,J)=>J.score-$.score);let f=0,k=[];for(let $ of g){let J=Math.ceil($.size/this.CHARS_PER_TOKEN);if(f+J>a||k.length>=s)break;k.push($),f+=J}let v=Math.ceil(c.relevantFiles.reduce(($,J)=>$+J.size,0)/this.CHARS_PER_TOKEN),x=v>0?(v-f)/v:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:x,estimatedTokensSaved:v-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(TS))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 Re.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 Re.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Re.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Gp,i=e.filter(p=>p.score>=s).sort((p,m)=>m.score-p.score),a=0,c=[];for(let p of i){let m=Math.ceil(p.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(p),a+=m}let u=Math.ceil(e.reduce((p,m)=>p+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)}},ES=new xo});import Jp from"node:path";var ec,To,AS,Wp=w(()=>{"use strict";zs();Q();ec=[{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"}],To=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 ec)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let p=Jp.dirname(i.path);n.get(u).add(`**/${Jp.basename(p)}/**`)}}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=ec.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=b();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let d=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(d+=1);for(let{pattern:g,domain:f}of ec)f===m.name&&g.test(a)&&(d+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(d+=1)}d>0&&i.push({domain:m.name,score:d})}i.sort((m,d)=>d.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],p=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:p,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=b(),o={version:bt,projectId:e,domains:t,discoveredAt:s};await Re.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:bt,lastUpdate:s,fileCategories:n,domainIndex:i};await Re.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Re.readDomains(e),Re.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 Re.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 Re.readCategories(e);if(i){let a=new Set(t.map(d=>d.path)),u=[...i.fileCategories.filter(d=>!a.has(d.path)),...o],p={};for(let d of u)for(let g of d.categories)p[g]||(p[g]=[]),p[g].push(d.path);let m={version:bt,lastUpdate:b(),fileCategories:u,domainIndex:p};await Re.writeCategories(e,m)}return o}},AS=new To});import tc from"node:path";var nc,IS,jS,Eo,Bp,sc=w(()=>{"use strict";nc=30,IS=[/^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$/],jS=[/^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],Eo=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=nc){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=tc.basename(e.path);for(let n of IS)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=tc.basename(e.path);for(let s of jS)if(s.test(t))return 15;let n=tc.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}},Bp=new Eo});function rc(r,e){return{...$s[r],...e}}function Ao(r,e,t){return{message:r,hint:e,...t}}var Io=w(()=>{"use strict";jr();jr();l(rc,"getError");l(Ao,"createError")});import{execSync as oc}from"node:child_process";var jo,ic,Do,Ro,ac=w(()=>{"use strict";Io();jo={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"}},ic=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=jo[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=jo[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Do(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=jo[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
458
+ `);throw new Do({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
459
+ ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(jo),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=oc(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:Ao(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return oc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return oc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Ao(`${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())}},Do=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}},Ro=new ic});import{exec as DS}from"node:child_process";import{promisify as RS}from"node:util";var D0,Vp=w(()=>{"use strict";Jt();ac();D0=RS(DS)});var $o,Je,cc=w(()=>{"use strict";ct();K();rn();M();Q();Bs();$o=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;let i=P.getFilePath(o,"memory","context.jsonl"),a={timestamp:b(),action:t,data:n,author:s};await rs(i,a)}catch(o){S(o)||console.error(`Memory log error: ${y(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);if(!n)return[];let s=P.getFilePath(n,"memory","context.jsonl");return(await Vt(s)).slice(-t)}catch(n){return!S(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${y(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){return(await this.getRecent(e,1e3)).filter(o=>o.action===t).slice(-n)}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;let n=P.getFilePath(t,"memory","context.jsonl");await io(n,[])}catch(t){S(t)||console.error(`Memory clear error: ${y(t)}`)}}async getRecentEvents(e,t=100){try{let n=P.getFilePath(e,"memory","context.jsonl");return(await Vt(n)).slice(-t)}catch(n){return!S(n)&&!(n instanceof SyntaxError)&&console.error(`Memory read error: ${y(n)}`),[]}}async capEntries(e){try{let t=P.getFilePath(e,"memory","context.jsonl"),n=await Vt(t);if(n.length<=St.MEMORY_MAX_ENTRIES)return 0;let s=n.slice(0,n.length-St.MEMORY_MAX_ENTRIES),o=n.slice(-St.MEMORY_MAX_ENTRIES);return Ze.archiveMany(e,s.map((i,a)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||a}`,entityData:i,summary:i.action,reason:"overflow"}))),await io(t,o),s.length}catch(t){return S(t)||console.error(`Memory cap error: ${y(t)}`),0}}},Je=new $o});import Mo from"node:fs/promises";import he from"node:path";var nr,lc=w(()=>{"use strict";K();Ee();nr=class{static{l(this,"NestedContextResolver")}rootPath;monoInfo=null;constructor(e){this.rootPath=he.resolve(e)}async initialize(){this.monoInfo=await P.detectMonorepo(this.rootPath)}async discoverContextFiles(){let e=[],t=he.join(this.rootPath,"PRJCT.md");if(await D(t)){let s=await this.loadContext(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=he.join(s.path,"PRJCT.md");if(await D(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadContext(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedContexts(this.rootPath,e);return e.push(...n),e}async loadContext(e,t,n=null){let s=await Mo.readFile(e,"utf-8"),o=he.relative(this.rootPath,e),i=o.split(he.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,sections:this.parseSections(s),package:n}}parseSections(e){let t=[],n=e.split(`
459
460
  `),s=null,o=[];for(let i of n){let a=i.match(/^##\s+(.+)$/);if(a){s&&(s.content=o.join(`
460
461
  `).trim(),t.push(s));let c=a[1],u=c.includes("@override")||c.includes("(override)");s={name:c.replace(/@override|\(override\)/gi,"").trim(),content:"",override:u},o=[]}else s&&o.push(i)}return s&&(s.content=o.join(`
461
- `).trim(),t.push(s)),t}async scanForNestedContexts(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await $o.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let p=fe.join(i,u.name),m=fe.join(p,"PRJCT.md");if(await D(m)&&!s.has(m)){let d=this.findParentContext(m,t.concat(n)),g=await this.loadContext(m,d);n.push(g),s.add(m),d&&d.children.push(g)}await o(p,a+1)}}catch{}},"scan");return await o(e,0),n}findParentContext(e,t){let n=fe.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=fe.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveContextForPath(e){let t=await this.discoverContextFiles(),n=fe.resolve(e),s=null;for(let a of t){let c=fe.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{content:"",sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeContextChain(o)}mergeContextChain(e){let t=new Map,n=[],s=[];for(let i of e){n.push(i.relativePath);for(let a of i.sections)if(a.override||!t.has(a.name))t.set(a.name,a.content),a.override&&s.push(`${i.relativePath}:${a.name}`);else{let c=t.get(a.name)||"";t.set(a.name,`${c}
462
+ `).trim(),t.push(s)),t}async scanForNestedContexts(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Mo.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let p=he.join(i,u.name),m=he.join(p,"PRJCT.md");if(await D(m)&&!s.has(m)){let d=this.findParentContext(m,t.concat(n)),g=await this.loadContext(m,d);n.push(g),s.add(m),d&&d.children.push(g)}await o(p,a+1)}}catch{}},"scan");return await o(e,0),n}findParentContext(e,t){let n=he.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=he.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveContextForPath(e){let t=await this.discoverContextFiles(),n=he.resolve(e),s=null;for(let a of t){let c=he.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{content:"",sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeContextChain(o)}mergeContextChain(e){let t=new Map,n=[],s=[];for(let i of e){n.push(i.relativePath);for(let a of i.sections)if(a.override||!t.has(a.name))t.set(a.name,a.content),a.override&&s.push(`${i.relativePath}:${a.name}`);else{let c=t.get(a.name)||"";t.set(a.name,`${c}
462
463
 
463
464
  ${a.content}`)}}let o=[];for(let[i,a]of t)o.push(`## ${i}
464
465
 
@@ -466,44 +467,44 @@ ${a}`);return{content:o.join(`
466
467
 
467
468
  ---
468
469
 
469
- `),sources:n,overrides:s}}async getPackageContext(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveContextForPath(t.path):null}async getAllPackageContexts(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveContextForPath(t.path);e.set(t.name,n)}return e}async discoverAgentFiles(){let e=[],t=fe.join(this.rootPath,"AGENTS.md");if(await D(t)){let s=await this.loadAgents(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=fe.join(s.path,"AGENTS.md");if(await D(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadAgents(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedAgents(this.rootPath,e);return e.push(...n),e}async loadAgents(e,t,n=null){let s=await $o.readFile(e,"utf-8"),o=fe.relative(this.rootPath,e),i=o.split(fe.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,agents:this.parseAgents(s),package:n}}parseAgents(e){let t=[],n=e.split(`
470
+ `),sources:n,overrides:s}}async getPackageContext(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveContextForPath(t.path):null}async getAllPackageContexts(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveContextForPath(t.path);e.set(t.name,n)}return e}async discoverAgentFiles(){let e=[],t=he.join(this.rootPath,"AGENTS.md");if(await D(t)){let s=await this.loadAgents(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=he.join(s.path,"AGENTS.md");if(await D(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadAgents(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedAgents(this.rootPath,e);return e.push(...n),e}async loadAgents(e,t,n=null){let s=await Mo.readFile(e,"utf-8"),o=he.relative(this.rootPath,e),i=o.split(he.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,agents:this.parseAgents(s),package:n}}parseAgents(e){let t=[],n=e.split(`
470
471
  `),s=null,o=null,i=[],a=l(()=>{if(s){if(o){let c=i.join(`
471
472
  `).trim();switch(o.toLowerCase()){case"triggers":s.triggers=this.parseListItems(c);break;case"rules":s.rules=this.parseListItems(c);break;case"patterns":s.patterns=this.parseCodeBlocks(c);break;case"examples":s.examples=this.parseListItems(c);break;case"domain":s.domain=c;break}}else{let c=i.join(`
472
473
  `).trim();c&&!s.description&&(s.description=c)}i=[]}},"saveCurrentContent");for(let c of n){let u=c.match(/^##\s+([^#].+)$/);if(u){s&&(a(),t.push(s));let m=u[1],d=m.includes("@override")||m.includes("(override)");s={name:m.replace(/@override|\(override\)/gi,"").trim(),description:"",override:d},o=null,i=[];continue}let p=c.match(/^###\s+(.+)$/);if(p&&s){a(),o=p[1].trim(),i=[];continue}s&&i.push(c)}return s&&(a(),t.push(s)),t}parseListItems(e){return e.split(`
473
- `).filter(t=>t.match(/^\s*[-*]\s+/)).map(t=>t.replace(/^\s*[-*]\s+/,"").trim()).filter(t=>t.length>0)}parseCodeBlocks(e){let t=[],n=/```[\w]*\n([\s\S]*?)```/g,s;for(;(s=n.exec(e))!==null;)t.push(s[1].trim());return t.length===0&&e.trim()&&t.push(e.trim()),t}async scanForNestedAgents(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await $o.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let p=fe.join(i,u.name),m=fe.join(p,"AGENTS.md");if(await D(m)&&!s.has(m)){let d=this.findParentAgents(m,t.concat(n)),g=await this.loadAgents(m,d);n.push(g),s.add(m),d&&d.children.push(g)}await o(p,a+1)}}catch{}},"scan");return await o(e,0),n}findParentAgents(e,t){let n=fe.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=fe.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveAgentsForPath(e){let t=await this.discoverAgentFiles(),n=fe.resolve(e),s=null;for(let a of t){let c=fe.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{agents:[],sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeAgentsChain(o)}mergeAgentsChain(e){let t=new Map,n=[],s=[];for(let o of e){n.push(o.relativePath);for(let i of o.agents){let a=t.get(i.name);if(i.override||!a)t.set(i.name,{...i}),i.override&&a&&s.push(`${o.relativePath}:${i.name}`);else{let c={...a};i.triggers&&(c.triggers=[...a.triggers||[],...i.triggers]),i.rules&&(c.rules=[...a.rules||[],...i.rules]),i.patterns&&(c.patterns=[...a.patterns||[],...i.patterns]),i.examples&&(c.examples=[...a.examples||[],...i.examples]),i.description&&(c.description=`${a.description}
474
-
475
- ${i.description}`),i.domain&&(c.domain=i.domain),t.set(i.name,c)}}}return{agents:Array.from(t.values()),sources:n,overrides:s}}async getPackageAgents(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveAgentsForPath(t.path):null}async getAllPackageAgents(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveAgentsForPath(t.path);e.set(t.name,n)}return e}}});import{exec as NS}from"node:child_process";import{promisify as LS}from"node:util";var tR,Kp=w(()=>{"use strict";Bs();Y();oc();tR=LS(NS)});import In from"chalk";var Xp,US,HS,Pt,Yp=w(()=>{"use strict";He();Xp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],US=80,HS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Xp,speed:US},cli:{header:l(()=>`${In.cyan.bold("\u26A1")} ${In.cyan("prjct")}`,"header"),footer:l(()=>In.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${In.cyan("\u26A1")} ${In.cyan("prjct")} ${In.cyan(Xp[r%10])} ${In.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")=>Nr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Nr(r).signature,"getSignature")},Pt=HS});import X from"chalk";function JS(){return GS[zS]}var dR,dc,GS,zS,jn,hs,mc,tt,an,WS,BS,h,ys=w(()=>{"use strict";Yp();Gt();Ao();Ao();dR=Pt.spinner.frames,dc=Pt.spinner.speed,GS={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}},zS="compact";l(JS,"getTierConfig");jn={success:X.green("\u2713"),fail:X.red("\u2717"),warn:X.yellow("\u26A0"),info:X.blue("\u2139"),debug:X.dim("\u{1F527}"),bullet:X.dim("\u2022"),arrow:X.dim("\u2192"),check:X.green("\u2713"),cross:X.red("\u2717"),spinner:X.cyan("\u25D0")},hs=null,mc=0,tt=!1,an=l((r,e)=>{let t=e??(JS().maxCharsPerLine||ft.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),WS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(ft.CLEAR_WIDTH)}\r`):!0,"clear"),BS={start(){return tt||console.log(Pt.cli.header()),this},end(){return tt||console.log(Pt.cli.footer()),this},spin(r){return tt?this:(this.stop(),process.stdout.isTTY?(hs=setInterval(()=>{process.stdout.write(`\r${Pt.cli.spin(mc++,an(r,ft.SPINNER_MSG))}`)},dc),this):(process.stdout.write(`${Pt.cli.spin(0,an(r,ft.SPINNER_MSG))}
476
- `),this))},done(r,e){if(this.stop(),!tt){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=X.dim(` [${n.join(" | ")}]`))}console.log(`${jn.success} ${an(r,ft.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${jn.fail} ${an(r,ft.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?ic(r):r;return console.error(),console.error(`${jn.fail} ${e.message}`),e.file&&console.error(X.dim(` File: ${e.file}`)),e.hint&&console.error(X.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(X.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),tt||console.log(`${jn.warn} ${an(r,ft.WARN_MSG)}`),this},info(r){return this.stop(),tt||console.log(`${jn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!tt&&e&&console.log(`${jn.debug} ${X.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),tt)return this;let t=e.bullet||jn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),tt||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(X.dim(s)),console.log(X.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(),tt)return this;let t=e.split(`
477
- `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(X.dim(`\u250C${s}\u2510`)),console.log(`${X.dim("\u2502")} ${X.bold(r.padEnd(n))} ${X.dim("\u2502")}`),console.log(X.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${X.dim("\u2502")} ${o.padEnd(n)} ${X.dim("\u2502")}`);return console.log(X.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),tt?this:(console.log(`
478
- ${X.bold(r)}`),console.log(X.dim("\u2500".repeat(r.length))),this)},stop(){return hs&&(clearInterval(hs),hs=null,WS()),this},step(r,e,t){if(tt)return this;this.stop();let n=X.dim(`[${r}/${e}]`);return process.stdout.isTTY?(hs=setInterval(()=>{process.stdout.write(`\r${Pt.cli.spin(mc++,`${n} ${an(t,ft.STEP_MSG)}`)}`)},dc),this):(process.stdout.write(`${Pt.cli.spin(0,`${n} ${an(t,ft.STEP_MSG)}`)}
479
- `),this)},progress(r,e,t){if(tt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=X.cyan("\u2588".repeat(s))+X.dim("\u2591".repeat(o)),a=t?` ${an(t,ft.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(hs=setInterval(()=>{process.stdout.write(`\r${Pt.cli.spin(mc++,`[${i}] ${n}%${a}`)}`)},dc),this):(process.stdout.write(`${Pt.cli.spin(0,`[${i}] ${n}%${a}`)}
480
- `),this)}},h=BS});import ir from"chalk";function nt(r,e={}){if(e.quiet)return;let t=qS[r]||"idle",n=ss.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:VS[o]||o}));console.log(ir.dim(`
481
- Next:`));for(let o of s){let i=ir.cyan(o.cmd.padEnd(12));console.log(ir.dim(` ${i} \u2192 ${o.desc}`))}}function ar(r){let e=ss.getStateInfo(r);console.log(ir.dim(`\u{1F4CD} State: ${ir.white(r.toUpperCase())} - ${e.description}`))}var VS,qS,cr=w(()=>{"use strict";ba();VS={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"},qS={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(nt,"showNextSteps");l(ar,"showStateInfo")});import ct from"chalk";import Dn from"prompts";var gc,Qp,ws,Zp=w(()=>{"use strict";ys();gc=[{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."}],Qp=[{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"}],ws=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,Dn.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 Dn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:gc.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:gc.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 Dn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Qp.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(ct.dim(`
474
+ `).filter(t=>t.match(/^\s*[-*]\s+/)).map(t=>t.replace(/^\s*[-*]\s+/,"").trim()).filter(t=>t.length>0)}parseCodeBlocks(e){let t=[],n=/```[\w]*\n([\s\S]*?)```/g,s;for(;(s=n.exec(e))!==null;)t.push(s[1].trim());return t.length===0&&e.trim()&&t.push(e.trim()),t}async scanForNestedAgents(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Mo.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let p=he.join(i,u.name),m=he.join(p,"AGENTS.md");if(await D(m)&&!s.has(m)){let d=this.findParentAgents(m,t.concat(n)),g=await this.loadAgents(m,d);n.push(g),s.add(m),d&&d.children.push(g)}await o(p,a+1)}}catch{}},"scan");return await o(e,0),n}findParentAgents(e,t){let n=he.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=he.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveAgentsForPath(e){let t=await this.discoverAgentFiles(),n=he.resolve(e),s=null;for(let a of t){let c=he.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{agents:[],sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeAgentsChain(o)}mergeAgentsChain(e){let t=new Map,n=[],s=[];for(let o of e){n.push(o.relativePath);for(let i of o.agents){let a=t.get(i.name);if(i.override||!a)t.set(i.name,{...i}),i.override&&a&&s.push(`${o.relativePath}:${i.name}`);else{let c={...a};i.triggers&&(c.triggers=[...a.triggers||[],...i.triggers]),i.rules&&(c.rules=[...a.rules||[],...i.rules]),i.patterns&&(c.patterns=[...a.patterns||[],...i.patterns]),i.examples&&(c.examples=[...a.examples||[],...i.examples]),i.description&&(c.description=`${a.description}
475
+
476
+ ${i.description}`),i.domain&&(c.domain=i.domain),t.set(i.name,c)}}}return{agents:Array.from(t.values()),sources:n,overrides:s}}async getPackageAgents(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveAgentsForPath(t.path):null}async getAllPackageAgents(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveAgentsForPath(t.path);e.set(t.name,n)}return e}}});import{exec as $S}from"node:child_process";import{promisify as MS}from"node:util";var Y0,qp=w(()=>{"use strict";zs();Q();sc();Y0=MS($S)});import In from"chalk";var Kp,FS,OS,vt,Xp=w(()=>{"use strict";ze();Kp=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],FS=80,OS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Kp,speed:FS},cli:{header:l(()=>`${In.cyan.bold("\u26A1")} ${In.cyan("prjct")}`,"header"),footer:l(()=>In.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${In.cyan("\u26A1")} ${In.cyan("prjct")} ${In.cyan(Kp[r%10])} ${In.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")=>Or(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Or(r).signature,"getSignature")},vt=OS});import Y from"chalk";function LS(){return _S[NS]}var cR,uc,_S,NS,jn,gs,pc,tt,an,US,HS,h,fs=w(()=>{"use strict";Xp();Jt();Io();Io();cR=vt.spinner.frames,uc=vt.spinner.speed,_S={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}},NS="compact";l(LS,"getTierConfig");jn={success:Y.green("\u2713"),fail:Y.red("\u2717"),warn:Y.yellow("\u26A0"),info:Y.blue("\u2139"),debug:Y.dim("\u{1F527}"),bullet:Y.dim("\u2022"),arrow:Y.dim("\u2192"),check:Y.green("\u2713"),cross:Y.red("\u2717"),spinner:Y.cyan("\u25D0")},gs=null,pc=0,tt=!1,an=l((r,e)=>{let t=e??(LS().maxCharsPerLine||ht.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),US=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(ht.CLEAR_WIDTH)}\r`):!0,"clear"),HS={start(){return tt||console.log(vt.cli.header()),this},end(){return tt||console.log(vt.cli.footer()),this},spin(r){return tt?this:(this.stop(),process.stdout.isTTY?(gs=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(pc++,an(r,ht.SPINNER_MSG))}`)},uc),this):(process.stdout.write(`${vt.cli.spin(0,an(r,ht.SPINNER_MSG))}
477
+ `),this))},done(r,e){if(this.stop(),!tt){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=Y.dim(` [${n.join(" | ")}]`))}console.log(`${jn.success} ${an(r,ht.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${jn.fail} ${an(r,ht.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?rc(r):r;return console.error(),console.error(`${jn.fail} ${e.message}`),e.file&&console.error(Y.dim(` File: ${e.file}`)),e.hint&&console.error(Y.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(Y.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),tt||console.log(`${jn.warn} ${an(r,ht.WARN_MSG)}`),this},info(r){return this.stop(),tt||console.log(`${jn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!tt&&e&&console.log(`${jn.debug} ${Y.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),tt)return this;let t=e.bullet||jn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),tt||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(Y.dim(s)),console.log(Y.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(),tt)return this;let t=e.split(`
478
+ `),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(Y.dim(`\u250C${s}\u2510`)),console.log(`${Y.dim("\u2502")} ${Y.bold(r.padEnd(n))} ${Y.dim("\u2502")}`),console.log(Y.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${Y.dim("\u2502")} ${o.padEnd(n)} ${Y.dim("\u2502")}`);return console.log(Y.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),tt?this:(console.log(`
479
+ ${Y.bold(r)}`),console.log(Y.dim("\u2500".repeat(r.length))),this)},stop(){return gs&&(clearInterval(gs),gs=null,US()),this},step(r,e,t){if(tt)return this;this.stop();let n=Y.dim(`[${r}/${e}]`);return process.stdout.isTTY?(gs=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(pc++,`${n} ${an(t,ht.STEP_MSG)}`)}`)},uc),this):(process.stdout.write(`${vt.cli.spin(0,`${n} ${an(t,ht.STEP_MSG)}`)}
480
+ `),this)},progress(r,e,t){if(tt)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=Y.cyan("\u2588".repeat(s))+Y.dim("\u2591".repeat(o)),a=t?` ${an(t,ht.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(gs=setInterval(()=>{process.stdout.write(`\r${vt.cli.spin(pc++,`[${i}] ${n}%${a}`)}`)},uc),this):(process.stdout.write(`${vt.cli.spin(0,`[${i}] ${n}%${a}`)}
481
+ `),this)}},h=HS});import sr from"chalk";function nt(r,e={}){if(e.quiet)return;let t=zS[r]||"idle",n=ts.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:GS[o]||o}));console.log(sr.dim(`
482
+ Next:`));for(let o of s){let i=sr.cyan(o.cmd.padEnd(12));console.log(sr.dim(` ${i} \u2192 ${o.desc}`))}}function rr(r){let e=ts.getStateInfo(r);console.log(sr.dim(`\u{1F4CD} State: ${sr.white(r.toUpperCase())} - ${e.description}`))}var GS,zS,or=w(()=>{"use strict";ka();GS={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"},zS={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(nt,"showNextSteps");l(rr,"showStateInfo")});import lt from"chalk";import Dn from"prompts";var dc,Yp,hs,Qp=w(()=>{"use strict";fs();dc=[{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."}],Yp=[{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,Dn.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 Dn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:dc.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:dc.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 Dn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Yp.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(lt.dim(`
482
483
  Detected: ${e}
483
- `));let t=await Dn({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 Dn([{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 Dn([{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(ct.bold(" Configuration Summary")),console.log(ct.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${ct.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${ct.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${ct.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${ct.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${ct.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Dn({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(ct.bold.cyan(" Welcome to prjct-cli!")),console.log(ct.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(ct.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(ct.yellow(`
484
+ `));let t=await Dn({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 Dn([{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 Dn([{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(lt.bold(" Configuration Summary")),console.log(lt.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${lt.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${lt.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${lt.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${lt.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${lt.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Dn({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(lt.bold.cyan(" Welcome to prjct-cli!")),console.log(lt.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(lt.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(lt.yellow(`
484
485
  Setup cancelled. Run again anytime.
485
- `))}getProjectTypeLabel(e){return gc.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Qp.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 fc from"node:path";var KS,XS,Mo,YS,Je,Rn=w(()=>{"use strict";K();yt();Ce();KS="outcomes",XS="outcomes.jsonl",Mo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=P.getGlobalProjectPath(e);return fc.join(t,KS)}getOutcomesPath(e){return fc.join(this.getOutcomesDir(e),XS)}async record(e,t){let n={...t,id:oe()},s=this.getOutcomesPath(e);return await Ye(fc.dirname(s)),await Oi(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await D(t))return[];let n=await Vn(t);return n.trim()?n.trim().split(`
486
- `).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}},YS=new Mo,Je=YS});var Fo,QS,hc,ed=w(()=>{"use strict";Rn();Fo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await Je.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,d)=>m+d.qualityScore,0)/t.length,s=await Je.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let d of m.blockers||[])o.set(d,(o.get(d)||0)+1);let i=[...o.entries()].sort((m,d)=>d[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,d)=>d.successRate-m.successRate).slice(0,3).map(m=>m.agent),p=(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:p}}async getAgentMetrics(e){let t=await Je.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(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),p=i.reduce((b,E)=>b+E.qualityScore,0)/a,m=i.filter(b=>{if(!b.variance)return!1;let E=this.parseVariance(b.variance),v=this.parseDuration(b.estimatedDuration);return v===0?!1:Math.abs(E)/v<=.2}),d=Math.round(m.length/a*100),g=new Map;for(let b of i.filter(E=>E.completedAsPlanned))for(let E of b.tags||[])g.set(E,(g.get(E)||0)+1);let f=[...g.entries()].sort((b,E)=>E[1]-b[1]).slice(0,3).map(([b])=>b);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(p*10)/10,estimateAccuracy:d,bestFor:f})}return s}async detectPatterns(e){let t=await Je.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 Je.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}},QS=new Fo,hc=QS});var lr,Oo,yc,wc=w(()=>{"use strict";Wn();Y();lr=3,Oo=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>=lr){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}/${lr} 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>=lr){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}/${lr} 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]}`,p=t.get(u)||{count:0,tasks:[]};p.count++,p.tasks.push(s.taskId),t.set(u,p)}}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>=lr&&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:[j.FILE_STRUCTURE,j.ARCHITECTURE],tech_stack:[j.TECH_STACK],architecture:[j.ARCHITECTURE,j.CODE_STYLE],estimation:[j.SHIP_WORKFLOW],workflow:[j.SHIP_WORKFLOW,j.CODE_STYLE],gotcha:[j.TEST_BEHAVIOR,j.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: ${k()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
487
- `)}},yc=new Oo});var _o,td,Sc=w(()=>{"use strict";ta();Rt();Y();_o=class extends ve{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Bu,lastUpdated:""}}getMdFilename(){return"outcomes.md"}getLayer(){return"progress"}getEventType(e){return`outcomes.${e}d`}toMarkdown(e){let t=["# OUTCOMES",""];if(e.outcomes.length===0&&(!e.taskOutcomes||e.taskOutcomes.length===0))return t.push("_No outcomes recorded yet._"),t.push(""),t.join(`
486
+ `))}getProjectTypeLabel(e){return dc.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Yp.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 mc from"node:path";var JS,WS,Fo,BS,We,Rn=w(()=>{"use strict";K();wt();Ee();JS="outcomes",WS="outcomes.jsonl",Fo=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=P.getGlobalProjectPath(e);return mc.join(t,JS)}getOutcomesPath(e){return mc.join(this.getOutcomesDir(e),WS)}async record(e,t){let n={...t,id:ie()},s=this.getOutcomesPath(e);return await Ye(mc.dirname(s)),await _i(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await D(t))return[];let n=await Wn(t);return n.trim()?n.trim().split(`
487
+ `).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}},BS=new Fo,We=BS});var Oo,VS,gc,Zp=w(()=>{"use strict";Rn();Oo=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await We.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,d)=>m+d.qualityScore,0)/t.length,s=await We.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let d of m.blockers||[])o.set(d,(o.get(d)||0)+1);let i=[...o.entries()].sort((m,d)=>d[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,d)=>d.successRate-m.successRate).slice(0,3).map(m=>m.agent),p=(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:p}}async getAgentMetrics(e){let t=await We.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),p=i.reduce((k,v)=>k+v.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let v=this.parseVariance(k.variance),x=this.parseDuration(k.estimatedDuration);return x===0?!1:Math.abs(v)/x<=.2}),d=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(v=>v.completedAsPlanned))for(let v of k.tags||[])g.set(v,(g.get(v)||0)+1);let f=[...g.entries()].sort((k,v)=>v[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(p*10)/10,estimateAccuracy:d,bestFor:f})}return s}async detectPatterns(e){let t=await We.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 We.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}},VS=new Oo,gc=VS});var ir,_o,fc,hc=w(()=>{"use strict";zn();Q();ir=3,_o=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>=ir){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}/${ir} 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>=ir){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}/${ir} 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]}`,p=t.get(u)||{count:0,tasks:[]};p.count++,p.tasks.push(s.taskId),t.set(u,p)}}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>=ir&&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:[j.FILE_STRUCTURE,j.ARCHITECTURE],tech_stack:[j.TECH_STACK],architecture:[j.ARCHITECTURE,j.CODE_STYLE],estimation:[j.SHIP_WORKFLOW],workflow:[j.SHIP_WORKFLOW,j.CODE_STYLE],gotcha:[j.TEST_BEHAVIOR,j.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: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
488
+ `)}},fc=new _o});var No,ed,yc=w(()=>{"use strict";na();$t();Q();No=class extends Ce{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Ju,lastUpdated:""}}getMdFilename(){return"outcomes.md"}getLayer(){return"progress"}getEventType(e){return`outcomes.${e}d`}toMarkdown(e){let t=["# OUTCOMES",""];if(e.outcomes.length===0&&(!e.taskOutcomes||e.taskOutcomes.length===0))return t.push("_No outcomes recorded yet._"),t.push(""),t.join(`
488
489
  `);let n=e.outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,5);if(n.length>0){t.push("## Recent Outcomes"),t.push("");for(let s of n){let o=s.success?.overallSuccess??"unknown",i=s.roi.roiScore,a=Xe(s.shippedAt);t.push(`- **${s.featureName}** (${o}, ROI: ${i}) - ${a}`),s.learnings.whatWorked.length>0&&t.push(` What worked: ${s.learnings.whatWorked.slice(0,2).join(", ")}`),s.learnings.whatDidnt.length>0&&t.push(` Issues: ${s.learnings.whatDidnt.slice(0,2).join(", ")}`)}t.push("")}if(e.aggregates&&(t.push("## Aggregate Metrics"),t.push(""),t.push(`- Features: ${e.aggregates.totalFeatures}`),t.push(`- Estimation Accuracy: ${e.aggregates.averageEstimationAccuracy}%`),t.push(`- Success Rate: ${e.aggregates.averageSuccessRate}%`),t.push(`- Average ROI: ${e.aggregates.averageROI}`),t.push(""),e.aggregates.topLearnings.length>0)){t.push("### Top Learnings"),t.push("");for(let s of e.aggregates.topLearnings.slice(0,5))t.push(`- ${s.insight} (${s.frequency}x)`);t.push("")}return t.join(`
489
- `)}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Qr([t,...n.outcomes]),lastUpdated:k()})),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:k()}))}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?Qr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Qr(t.outcomes),lastAggregated:k(),lastUpdated:k()}))}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=Vu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=qu(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:Ku(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}},td=new _o});var kc=w(()=>{"use strict";Zp();ed();wc();Rn();Sc()});import Ft from"chalk";function ZS(r){return nd[r.toLowerCase()]||nd.default}var nd,bc,No,sd=w(()=>{"use strict";nd={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(ZS,"getIcon");bc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Ft.cyan(`
490
+ `)}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Xr([t,...n.outcomes]),lastUpdated:b()})),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:b()}))}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?Xr(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Xr(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}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=Wu(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Bu(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:Vu(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}},ed=new No});var wc=w(()=>{"use strict";Qp();Zp();hc();Rn();yc()});import Ot from"chalk";function qS(r){return td[r.toLowerCase()]||td.default}var td,Sc,Lo,nd=w(()=>{"use strict";td={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(qS,"getIcon");Sc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Ot.cyan(`
490
491
  \u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
491
- `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=ZS(t);console.log(Ft.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Ft.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Ft.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Ft.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?Ft.green("\u2713"):Ft.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Ft.dim(`(${n})`)}
492
- `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Ft.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Ft.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},No=new bc});import $e from"chalk";function ek(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%rd.length;return rd[t]}function tk(r,e,t="\u25B6"){let n=$e.dim(String(r+1).padStart(2)),o=ek(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=$e.green("\u2713 Complete");break;case"in_progress":a=$e.yellow(`${t} Working...`);break;case"pending":a=$e.gray("\u25CB Pending");break;case"failed":a=$e.red("\u2717 Failed");break;case"blocked":a=$e.gray("\u2298 Blocked");break;default:a=$e.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function nk(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${$e.bold.white("SUBTASK PROGRESS")}`),e.push(` ${$e.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(tk(t,r[t]));return e.push(""),e.join(`
493
- `)}function od(r){console.log(nk(r))}var rd,id=w(()=>{"use strict";rd=[$e.cyan,$e.magenta,$e.yellow,$e.blue,$e.green,$e.redBright,$e.magentaBright,$e.cyanBright];l(ek,"getDomainColor");l(tk,"formatSubtaskLine");l(nk,"renderSubtaskProgress");l(od,"printSubtaskProgress")});function sk(r){return ad.includes(r)}async function rk(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 ok(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(`
494
- `)}var ad,ik,Lo,cd=w(()=>{"use strict";ad=["ship","feature","spec","cleanup","migrate"];l(sk,"requiresReasoning");l(rk,"reason");l(ok,"formatPlan");ik={requiresReasoning:sk,reason:rk,formatPlan:ok,REASONING_REQUIRED_COMMANDS:ad},Lo=ik});import ur from"node:fs/promises";var Pc,ak,We,Cc=w(()=>{"use strict";at();K();M();Vr();Pc=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=P.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:P.getFilePath(n,"core","now.md"),next:P.getFilePath(n,"core","next.md"),context:P.getFilePath(n,"core","context.md"),shipped:P.getFilePath(n,"progress","shipped.md"),metrics:P.getFilePath(n,"progress","metrics.md"),ideas:P.getFilePath(n,"planning","ideas.md"),roadmap:P.getFilePath(n,"planning","roadmap.md"),specs:P.getFilePath(n,"planning","specs"),memory:P.getFilePath(n,"memory","context.jsonl"),patterns:P.getFilePath(n,"memory","patterns.json"),analysis:P.getFilePath(n,"analysis","repo-summary.md"),codePatterns:P.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 ur.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(S(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,p])=>{try{let[m,d]=await Promise.all([ur.readFile(p,"utf-8"),ur.stat(p)]);return{key:u,filePath:p,content:m,mtime:d.mtimeMs}}catch(m){if(S(m))return{key:u,filePath:p,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:p,content:m,mtime:d}of c)n[u]=m,this._cache.set(p,{content:m,mtime:d})}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 ur.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(S(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 ur.access(e),!0}catch(t){if(S(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},ak=new Pc,We=ak});import{exec as ck}from"node:child_process";import le from"node:fs/promises";import ld from"node:os";import cn from"node:path";import{promisify as lk}from"node:util";function ud(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 vc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pk(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
492
+ `))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=qS(t);console.log(Ot.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(Ot.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(Ot.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Ot.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?Ot.green("\u2713"):Ot.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${Ot.dim(`(${n})`)}
493
+ `),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${Ot.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Ot.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Lo=new Sc});import $e from"chalk";function KS(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%sd.length;return sd[t]}function XS(r,e,t="\u25B6"){let n=$e.dim(String(r+1).padStart(2)),o=KS(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=$e.green("\u2713 Complete");break;case"in_progress":a=$e.yellow(`${t} Working...`);break;case"pending":a=$e.gray("\u25CB Pending");break;case"failed":a=$e.red("\u2717 Failed");break;case"blocked":a=$e.gray("\u2298 Blocked");break;default:a=$e.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function YS(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${$e.bold.white("SUBTASK PROGRESS")}`),e.push(` ${$e.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(XS(t,r[t]));return e.push(""),e.join(`
494
+ `)}function rd(r){console.log(YS(r))}var sd,od=w(()=>{"use strict";sd=[$e.cyan,$e.magenta,$e.yellow,$e.blue,$e.green,$e.redBright,$e.magentaBright,$e.cyanBright];l(KS,"getDomainColor");l(XS,"formatSubtaskLine");l(YS,"renderSubtaskProgress");l(rd,"printSubtaskProgress")});function QS(r){return id.includes(r)}async function ZS(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 ek(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(`
495
+ `)}var id,tk,Uo,ad=w(()=>{"use strict";id=["ship","feature","spec","cleanup","migrate"];l(QS,"requiresReasoning");l(ZS,"reason");l(ek,"formatPlan");tk={requiresReasoning:QS,reason:ZS,formatPlan:ek,REASONING_REQUIRED_COMMANDS:id},Uo=tk});import ar from"node:fs/promises";var kc,nk,Be,bc=w(()=>{"use strict";ct();K();M();Wr();kc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new yt({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=P.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:P.getFilePath(n,"core","now.md"),next:P.getFilePath(n,"core","next.md"),context:P.getFilePath(n,"core","context.md"),shipped:P.getFilePath(n,"progress","shipped.md"),metrics:P.getFilePath(n,"progress","metrics.md"),ideas:P.getFilePath(n,"planning","ideas.md"),roadmap:P.getFilePath(n,"planning","roadmap.md"),specs:P.getFilePath(n,"planning","specs"),memory:P.getFilePath(n,"memory","context.jsonl"),patterns:P.getFilePath(n,"memory","patterns.json"),analysis:P.getFilePath(n,"analysis","repo-summary.md"),codePatterns:P.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 ar.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(S(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,p])=>{try{let[m,d]=await Promise.all([ar.readFile(p,"utf-8"),ar.stat(p)]);return{key:u,filePath:p,content:m,mtime:d.mtimeMs}}catch(m){if(S(m))return{key:u,filePath:p,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:p,content:m,mtime:d}of c)n[u]=m,this._cache.set(p,{content:m,mtime:d})}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 ar.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(S(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 ar.access(e),!0}catch(t){if(S(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},nk=new kc,Be=nk});import{exec as sk}from"node:child_process";import ue from"node:fs/promises";import cd from"node:os";import cn from"node:path";import{promisify as rk}from"node:util";function ld(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 Pc(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ik(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
495
496
  `;return r.warnings.forEach(t=>{e+=` - ${t}
496
497
  `}),r.recommendations.length>0&&(e+=`
497
498
  Recommendations:
498
499
  `,r.recommendations.forEach(t=>{e+=` -> ${t}
499
- `})),e}async function pd(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await le.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=ud(n.durationMs))}}catch(a){if(S(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 le.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(S(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await le.access(cn.dirname(i),le.constants.W_OK),n.metricsWritable=!0}catch(a){if(S(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 dd(r){let e=[],t=[],n={};try{let{stdout:i}=await uk("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
500
- `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=cn.join(r.projectPath,"package.json");try{let i=await le.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(S(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 le.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}.*${vc(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(S(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await le.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(S(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function md(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await le.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(S(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await le.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(vc(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(S(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await le.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(S(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function gd(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await le.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(S(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await le.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(S(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function fd(r){let e=[],t=[],n={},s=cn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await le.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(S(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=cn.join(ld.homedir(),".prjct-cli");try{await le.access(o,le.constants.W_OK),n.globalPathWritable=!0}catch(i){if(S(i))try{await le.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 hd(r){let e=[],t=[],n={},s=cn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await le.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(S(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=cn.join(ld.homedir(),".prjct-cli/projects",o||"");try{await le.access(i),n.globalStorageExists=!0}catch(a){if(S(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 yd(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 le.access(cn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!S(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 le.stat(cn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!S(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function wd(r){let e=[],t=[],n={},s=r.paths.specs;try{await le.access(s),n.specsExists=!0;let i=await le.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(S(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 kd(r,e,t){let n=Sd[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function dk(r,e,t){let n=await kd(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function mk(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var uk,Sd,gk,Uo,bd=w(()=>{"use strict";M();uk=lk(ck);l(ud,"formatDuration");l(vc,"escapeRegex");l(pk,"formatWarnings");l(pd,"verifyDone");l(dd,"verifyShip");l(md,"verifyFeature");l(gd,"verifyNow");l(fd,"verifyInit");l(hd,"verifySync");l(yd,"verifyAnalyze");l(wd,"verifySpec");Sd={done:pd,ship:dd,feature:md,now:gd,init:fd,sync:hd,analyze:yd,spec:wd};l(kd,"verify");l(dk,"prepareCommand");l(mk,"requiresVerification");gk={verify:kd,prepareCommand:dk,requiresVerification:mk,verifiers:Sd,formatWarnings:pk,formatDuration:ud,escapeRegex:vc,verifyDone:pd,verifyShip:dd,verifyFeature:md,verifyNow:gd,verifyInit:fd,verifySync:hd,verifyAnalyze:yd,verifySpec:wd},Uo=gk});function hk(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 yk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of fk)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:hk(t)};return{detected:!1}}function wk(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 Sk(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 kk(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 bk(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 fk,xc,Pk,Ss,Pd=w(()=>{"use strict";fk=[{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(hk,"getHallucinationSuggestion");l(yk,"detectHallucination");l(wk,"isSimilarError");l(Sk,"analyzeErrorPattern");l(kk,"generateEscalationMessage");l(bk,"generateSuggestion");xc=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=>wk(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=Sk(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:kk(e,o,this.maxAttempts),suggestion:bk(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 yk(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}}},Pk=new xc,Ss=Pk});function Tc(r,e){let t=pr(e),n=Ck[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 vk(r,e){let t=pr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function xk(r,e,t){let n=pr(t),s=Tc(r,t),o=Tc(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Ho(r,e=sn){let t=pr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=Tk(r,e),s=Ek(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=jk(o),a=Ak(o),c=Ik(r,t.accuracyTolerance),{overEstimated:u,underEstimated:p}=Dk(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:p,lastUpdated:new Date().toISOString()}}function vd(r,e,t=sn){let n=pr(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 Tk(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=xk(i,s,e);if(!t.has(a)){let c=Tc(i,e),u=vk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Ek(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,p)=>u+Rk(p),0),o=n.outcomes.filter(u=>u.variance).map(u=>Ac(u)),i=o.length>0?Math.round(o.reduce((u,p)=>u+p,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 Ak(r){if(r.length<3)return"stable";let e=r.map(p=>p.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let p=0;p<t;p++)n+=p,s+=e[p],o+=p*e[p],i+=p*p;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 Ik(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Ac(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function jk(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 Dk(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Ac(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 Ac(r){if(!r.variance)return 0;let e=Ec(r.estimatedDuration),t=Ec(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Ec(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 xd(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(`
501
- `)}function Rk(r){if(!r.estimatedDuration)return 0;let e=Ec(r.estimatedDuration);if(e<=0)return 0;let t=Cd[0],n=Number.POSITIVE_INFINITY;for(let s of Cd){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function pr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Ck,Cd,Ic=w(()=>{"use strict";ts();Ck={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Tc,"getSprintStart");l(vk,"getSprintEnd");l(xk,"getSprintNumber");l(Ho,"calculateVelocity");l(vd,"projectCompletion");l(Tk,"bucketBySprint");l(Ek,"buildSprintVelocities");l(Ak,"detectTrend");l(Ik,"calculateOverallAccuracy");l(jk,"calculateAverageVelocity");l(Dk,"detectEstimationPatterns");l(Ac,"parseVariancePercent");l(Ec,"parseDurationMinutes");l(xd,"formatVelocityContext");Cd=[{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(Rk,"derivePoints");l(pr,"resolveConfig")});import{exec as $k}from"node:child_process";import Mk from"node:fs/promises";import Go from"node:path";import{promisify as Fk}from"node:util";async function Td(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Uk(r),c=await Hk(e),u=await Gk(e),p=[];for(let d of c){if(!i&&Jk(d))continue;let g=zk(d,a,u);g.score>=o&&p.push(g)}p.sort((d,g)=>g.score-d.score);let m=p.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function Uk(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 Hk(r){let e=[];async function t(n,s=""){try{let o=await Mk.readdir(n,{withFileTypes:!0});for(let i of o){let a=Go.join(n,i.name),c=Go.join(s,i.name);if(i.isDirectory()){if(Lk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Go.extname(i.name).toLowerCase();Nk.has(u)&&e.push(c)}}}catch(o){S(o)}}return l(t,"walk"),await t(r),e}async function Gk(r){let e=new Map;try{let{stdout:t}=await Ok(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
500
+ `})),e}async function ud(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await ue.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=ld(n.durationMs))}}catch(a){if(S(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 ue.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(S(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await ue.access(cn.dirname(i),ue.constants.W_OK),n.metricsWritable=!0}catch(a){if(S(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 pd(r){let e=[],t=[],n={};try{let{stdout:i}=await ok("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
501
+ `).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=cn.join(r.projectPath,"package.json");try{let i=await ue.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(S(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 ue.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}.*${Pc(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(S(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await ue.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(S(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function dd(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await ue.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(S(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await ue.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Pc(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(S(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await ue.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(S(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function md(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await ue.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(S(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await ue.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(S(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function gd(r){let e=[],t=[],n={},s=cn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await ue.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(S(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=cn.join(cd.homedir(),".prjct-cli");try{await ue.access(o,ue.constants.W_OK),n.globalPathWritable=!0}catch(i){if(S(i))try{await ue.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 fd(r){let e=[],t=[],n={},s=cn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await ue.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(S(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=cn.join(cd.homedir(),".prjct-cli/projects",o||"");try{await ue.access(i),n.globalStorageExists=!0}catch(a){if(S(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 hd(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 ue.access(cn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!S(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 ue.stat(cn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!S(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function yd(r){let e=[],t=[],n={},s=r.paths.specs;try{await ue.access(s),n.specsExists=!0;let i=await ue.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(S(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 Sd(r,e,t){let n=wd[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${y(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function ak(r,e,t){let n=await Sd(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function ck(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var ok,wd,lk,Ho,kd=w(()=>{"use strict";M();ok=rk(sk);l(ld,"formatDuration");l(Pc,"escapeRegex");l(ik,"formatWarnings");l(ud,"verifyDone");l(pd,"verifyShip");l(dd,"verifyFeature");l(md,"verifyNow");l(gd,"verifyInit");l(fd,"verifySync");l(hd,"verifyAnalyze");l(yd,"verifySpec");wd={done:ud,ship:pd,feature:dd,now:md,init:gd,sync:fd,analyze:hd,spec:yd};l(Sd,"verify");l(ak,"prepareCommand");l(ck,"requiresVerification");lk={verify:Sd,prepareCommand:ak,requiresVerification:ck,verifiers:wd,formatWarnings:ik,formatDuration:ld,escapeRegex:Pc,verifyDone:ud,verifyShip:pd,verifyFeature:dd,verifyNow:md,verifyInit:gd,verifySync:fd,verifyAnalyze:hd,verifySpec:yd},Ho=lk});function pk(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 dk(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of uk)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:pk(t)};return{detected:!1}}function mk(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 gk(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 fk(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 hk(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 uk,Cc,yk,ys,bd=w(()=>{"use strict";uk=[{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(pk,"getHallucinationSuggestion");l(dk,"detectHallucination");l(mk,"isSimilarError");l(gk,"analyzeErrorPattern");l(fk,"generateEscalationMessage");l(hk,"generateSuggestion");Cc=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=>mk(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=gk(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:fk(e,o,this.maxAttempts),suggestion:hk(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 dk(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}}},yk=new Cc,ys=yk});function vc(r,e){let t=cr(e),n=wk[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 Sk(r,e){let t=cr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function kk(r,e,t){let n=cr(t),s=vc(r,t),o=vc(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Go(r,e=sn){let t=cr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=bk(r,e),s=Pk(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=xk(o),a=Ck(o),c=vk(r,t.accuracyTolerance),{overEstimated:u,underEstimated:p}=Tk(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:p,lastUpdated:new Date().toISOString()}}function Cd(r,e,t=sn){let n=cr(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 bk(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=kk(i,s,e);if(!t.has(a)){let c=vc(i,e),u=Sk(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Pk(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,p)=>u+Ek(p),0),o=n.outcomes.filter(u=>u.variance).map(u=>Tc(u)),i=o.length>0?Math.round(o.reduce((u,p)=>u+p,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 Ck(r){if(r.length<3)return"stable";let e=r.map(p=>p.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let p=0;p<t;p++)n+=p,s+=e[p],o+=p*e[p],i+=p*p;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 vk(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Tc(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function xk(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 Tk(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Tc(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 Tc(r){if(!r.variance)return 0;let e=xc(r.estimatedDuration),t=xc(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function xc(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 vd(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(`
502
+ `)}function Ek(r){if(!r.estimatedDuration)return 0;let e=xc(r.estimatedDuration);if(e<=0)return 0;let t=Pd[0],n=Number.POSITIVE_INFINITY;for(let s of Pd){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function cr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var wk,Pd,Ec=w(()=>{"use strict";Zn();wk={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(vc,"getSprintStart");l(Sk,"getSprintEnd");l(kk,"getSprintNumber");l(Go,"calculateVelocity");l(Cd,"projectCompletion");l(bk,"bucketBySprint");l(Pk,"buildSprintVelocities");l(Ck,"detectTrend");l(vk,"calculateOverallAccuracy");l(xk,"calculateAverageVelocity");l(Tk,"detectEstimationPatterns");l(Tc,"parseVariancePercent");l(xc,"parseDurationMinutes");l(vd,"formatVelocityContext");Pd=[{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(Ek,"derivePoints");l(cr,"resolveConfig")});import{exec as Ak}from"node:child_process";import Ik from"node:fs/promises";import zo from"node:path";import{promisify as jk}from"node:util";async function xd(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Fk(r),c=await Ok(e),u=await _k(e),p=[];for(let d of c){if(!i&&Lk(d))continue;let g=Nk(d,a,u);g.score>=o&&p.push(g)}p.sort((d,g)=>g.score-d.score);let m=p.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function Fk(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 Ok(r){let e=[];async function t(n,s=""){try{let o=await Ik.readdir(n,{withFileTypes:!0});for(let i of o){let a=zo.join(n,i.name),c=zo.join(s,i.name);if(i.isDirectory()){if(Mk.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=zo.extname(i.name).toLowerCase();$k.has(u)&&e.push(c)}}}catch(o){S(o)}}return l(t,"walk"),await t(r),e}async function _k(r){let e=new Map;try{let{stdout:t}=await Dk(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
502
503
  /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
503
504
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
504
505
  END { for (f in files) print files[f], lastmod[f], f }
505
506
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
506
- `).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],p=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:p})}}}catch{}return e}function zk(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(_k))for(let b of f)if(c.includes(b)&&e.some(v=>f.includes(v)||v.includes(g)||g.includes(v))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let p=t.get(r);p&&(p.daysAgo<=1?(i=1,n.push("recent:1d")):p.daysAgo<=3?(i=.8,n.push("recent:3d")):p.daysAgo<=7?(i=.6,n.push("recent:1w")):p.daysAgo<=30&&(i=.3,n.push("recent:1m")),p.commits>=5&&(i=Math.min(1,i+.2)));let m=Go.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 d=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,d),reasons:[...new Set(n)]}}function Jk(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 Ok,_k,Nk,Lk,Ed=w(()=>{"use strict";M();Ok=Fk($k),_k={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"]},Nk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Lk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Td,"findRelevantFiles");l(Uk,"extractKeywords");l(Hk,"getAllCodeFiles");l(Gk,"getGitRecency");l(zk,"scoreFile");l(Jk,"isTestFile")});import{exec as Wk}from"node:child_process";import{promisify as Bk}from"node:util";async function Ad(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 Kk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await qk(r,t);return o=o.filter(c=>!Xk(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 qk(r,e){let{stdout:t}=await dr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
507
+ `).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],p=Math.floor((n-c)/86400);e.set(u,{commits:a,daysAgo:p})}}}catch{}return e}function Nk(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(Rk))for(let k of f)if(c.includes(k)&&e.some(x=>f.includes(x)||x.includes(g)||g.includes(x))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let p=t.get(r);p&&(p.daysAgo<=1?(i=1,n.push("recent:1d")):p.daysAgo<=3?(i=.8,n.push("recent:3d")):p.daysAgo<=7?(i=.6,n.push("recent:1w")):p.daysAgo<=30&&(i=.3,n.push("recent:1m")),p.commits>=5&&(i=Math.min(1,i+.2)));let m=zo.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 d=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,d),reasons:[...new Set(n)]}}function Lk(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 Dk,Rk,$k,Mk,Td=w(()=>{"use strict";M();Dk=jk(Ak),Rk={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"]},$k=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Mk=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(xd,"findRelevantFiles");l(Fk,"extractKeywords");l(Ok,"getAllCodeFiles");l(_k,"getGitRecency");l(Nk,"scoreFile");l(Lk,"isTestFile")});import{exec as Uk}from"node:child_process";import{promisify as Hk}from"node:util";async function Ed(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 Jk(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await zk(r,t);return o=o.filter(c=>!Wk(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 zk(r,e){let{stdout:t}=await lr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
507
508
  /^[0-9]+$/ { timestamp=$1; next }
508
509
  NF {
509
510
  count[$0]++
@@ -513,8 +514,8 @@ Recommendations:
513
514
  for (f in count) print count[f], lastmod[f], f
514
515
  }
515
516
  ' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
516
- `).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),p=parseInt(c[2],10),m=c[3],d=o-p,g=Math.floor(d/86400),f=Math.floor(d/3600),b=Math.max(0,1-g/30),E=u/i,v=b*.6+E*.4,$;f<1?$="just now":f<24?$=`${f}h ago`:g<7?$=`${g}d ago`:g<30?$=`${Math.floor(g/7)}w ago`:$=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(v*100)/100,lastChanged:$,lastChangedAt:new Date(p*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function Kk(r){let{stdout:e}=await dr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await dr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await dr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
517
- `).filter(Boolean),{stdout:i}=await dr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
517
+ `).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),p=parseInt(c[2],10),m=c[3],d=o-p,g=Math.floor(d/86400),f=Math.floor(d/3600),k=Math.max(0,1-g/30),v=u/i,x=k*.6+v*.4,$;f<1?$="just now":f<24?$=`${f}h ago`:g<7?$=`${g}d ago`:g<30?$=`${Math.floor(g/7)}w ago`:$=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(x*100)/100,lastChanged:$,lastChangedAt:new Date(p*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function Jk(r){let{stdout:e}=await lr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await lr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await lr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
518
+ `).filter(Boolean),{stdout:i}=await lr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
518
519
  /^[0-9]+$/ { timestamp=$1; next }
519
520
  NF {
520
521
  count[$0]++
@@ -524,10 +525,10 @@ Recommendations:
524
525
  for (f in count) print count[f], lastmod[f], f
525
526
  }
526
527
  '`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
527
- `).filter(Boolean),u=Math.floor(Date.now()/1e3),p=1;for(let m of c){let d=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let g=parseInt(d[1],10);g>p&&(p=g)}}for(let m of c){let d=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let g=parseInt(d[1],10),f=parseInt(d[2],10),b=d[3],E=u-f,v=Math.floor(E/86400),$=Math.floor(E/3600),G=Math.max(0,1-v/14),Pe=g/p,Ue=G*.5+Pe*.5,mt;$<1?mt="just now":$<24?mt=`${$}h ago`:mt=`${v}d ago`,a.push({path:b,changes:g,heatScore:Math.round(Ue*100)/100,lastChanged:mt,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,d)=>d.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Xk(r){let e=r.split("/").pop()||"";for(let t of Vk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var dr,Vk,Id=w(()=>{"use strict";dr=Bk(Wk),Vk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Ad,"getRecentFiles");l(qk,"getHotFilesFromCommits");l(Kk,"getBranchOnlyFiles");l(Xk,"shouldIgnore")});function jc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function jd(r,e){let t=Yk[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Zk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Rd(r,e){let t=jc(r),n=jc(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=jd(s,Qk),a=Dd.map(c=>({model:c,...jd(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Zk(i.total),byModel:a}}}function Dc(r){let e=jc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Dd.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Yk,Qk,Dd,$d=w(()=>{"use strict";Yk={"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}},Qk="claude-sonnet-4.5";l(jc,"countTokens");Dd=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(jd,"calculateModelCost");l(Zk,"formatCostSaved");l(Rd,"measureCompression");l(Dc,"noCompression")});import eb from"node:fs/promises";import Rc from"node:path";async function Od(r,e=process.cwd()){let t=Rc.isAbsolute(r)?r:Rc.join(e,r),n;try{n=await eb.readFile(t,"utf-8")}catch(u){if(S(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Dc("")};throw u}let s=Rc.extname(r).toLowerCase(),o=tb[s]||"unknown",i=ob[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Dc(n)};let a=ib(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
528
- `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Rd(n,c)}}function ib(r,e){let t=[],n=r.split(`
528
+ `).filter(Boolean),u=Math.floor(Date.now()/1e3),p=1;for(let m of c){let d=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let g=parseInt(d[1],10);g>p&&(p=g)}}for(let m of c){let d=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let g=parseInt(d[1],10),f=parseInt(d[2],10),k=d[3],v=u-f,x=Math.floor(v/86400),$=Math.floor(v/3600),J=Math.max(0,1-x/14),Pe=g/p,Ge=J*.5+Pe*.5,gt;$<1?gt="just now":$<24?gt=`${$}h ago`:gt=`${x}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Ge*100)/100,lastChanged:gt,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,d)=>d.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function Wk(r){let e=r.split("/").pop()||"";for(let t of Gk)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var lr,Gk,Ad=w(()=>{"use strict";lr=Hk(Uk),Gk=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Ed,"getRecentFiles");l(zk,"getHotFilesFromCommits");l(Jk,"getBranchOnlyFiles");l(Wk,"shouldIgnore")});function Ac(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Id(r,e){let t=Bk[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function qk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Dd(r,e){let t=Ac(r),n=Ac(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=Id(s,Vk),a=jd.map(c=>({model:c,...Id(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:qk(i.total),byModel:a}}}function Ic(r){let e=Ac(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:jd.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Bk,Vk,jd,Rd=w(()=>{"use strict";Bk={"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}},Vk="claude-sonnet-4.5";l(Ac,"countTokens");jd=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Id,"calculateModelCost");l(qk,"formatCostSaved");l(Dd,"measureCompression");l(Ic,"noCompression")});import Kk from"node:fs/promises";import jc from"node:path";async function Fd(r,e=process.cwd()){let t=jc.isAbsolute(r)?r:jc.join(e,r),n;try{n=await Kk.readFile(t,"utf-8")}catch(u){if(S(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Ic("")};throw u}let s=jc.extname(r).toLowerCase(),o=Xk[s]||"unknown",i=eb[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Ic(n)};let a=tb(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
529
+ `);return{file:r,language:o,signatures:a,fallback:!1,metrics:Dd(n,c)}}function tb(r,e){let t=[],n=r.split(`
529
530
  `),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,p=r.substring(0,u).split(`
530
- `).length,m=i[0].trim(),d;if(p>1){let g=n[p-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(d=g)}t.push({type:o.type,name:a,signature:ab(m),exported:o.exported||!1,line:p,docstring:d})}}return t.sort((o,i)=>o.line-i.line)}function ab(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var tb,Md,nb,sb,rb,Fd,ob,_d=w(()=>{"use strict";M();$d();tb={".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"},Md=[{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}],nb=[{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}],sb=[{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}],rb=[{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}],Fd=[{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}],ob={typescript:Md,javascript:Md,python:nb,go:sb,rust:rb,java:Fd,csharp:Fd,php:[],ruby:[],unknown:[]};l(Od,"extractSignatures");l(ib,"extractFromContent");l(ab,"cleanSignature")});import{createHash as cb}from"node:crypto";import Ud from"node:fs/promises";import Hd from"node:path";function Nd(r){return cb("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Ld(r){try{let e=Hd.join(r,"storage","classification-cache.json"),t=await Ud.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return S(e)?Yi:(console.warn("[classifier] Failed to load cache:",y(e)),Yi)}}async function $c(r,e){try{let t=Hd.join(r,"storage","classification-cache.json");await Ud.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function ub(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>lb?null:n.classification}function pb(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function db(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Gd(e),s=ea("classification")||"",o=`Classify this software engineering task into a domain.
531
+ `).length,m=i[0].trim(),d;if(p>1){let g=n[p-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(d=g)}t.push({type:o.type,name:a,signature:nb(m),exported:o.exported||!1,line:p,docstring:d})}}return t.sort((o,i)=>o.line-i.line)}function nb(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Xk,$d,Yk,Qk,Zk,Md,eb,Od=w(()=>{"use strict";M();Rd();Xk={".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"},$d=[{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}],Yk=[{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}],Qk=[{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}],Zk=[{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}],Md=[{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}],eb={typescript:$d,javascript:$d,python:Yk,go:Qk,rust:Zk,java:Md,csharp:Md,php:[],ruby:[],unknown:[]};l(Fd,"extractSignatures");l(tb,"extractFromContent");l(nb,"cleanSignature")});import{createHash as sb}from"node:crypto";import Ld from"node:fs/promises";import Ud from"node:path";function _d(r){return sb("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function Nd(r){try{let e=Ud.join(r,"storage","classification-cache.json"),t=await Ld.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return S(e)?Qi:(console.warn("[classifier] Failed to load cache:",y(e)),Qi)}}async function Dc(r,e){try{let t=Ud.join(r,"storage","classification-cache.json");await Ld.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function ob(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>rb?null:n.classification}function ib(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function ab(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=Hd(e),s=ta("classification")||"",o=`Classify this software engineering task into a domain.
531
532
 
532
533
  Task: "${r}"
533
534
 
@@ -535,19 +536,19 @@ Available domains in this project: ${n.join(", ")}
535
536
  Available agents: ${e.agents.join(", ")||"none"}
536
537
  Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
537
538
 
538
- ${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),p=nn.safeParse(u);return p.success?p.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 gb(r,e){let t=Gd(e),n=new Map;for(let[d,g]of Object.entries(mb)){if(d==="general"||!t.includes(d))continue;let f=0;for(let b of g)r.match(new RegExp(b,"gi"))&&(f+=b.source.includes("\\s")?3:1);f>0&&n.set(d,f)}if(n.size===0)return Ru;let s=Array.from(n.entries()).sort((d,g)=>g[1]-d[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([d])=>d),c=s.reduce((d,[,g])=>d+g,0),u=Math.min(.85,i/c+.2),p=fb(o),m=e.agents.filter(d=>d===o||d.includes(o)||o.includes(d.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:p,relevantAgents:m}}function Gd(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 fb(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 lb,mb,Mc,hb,zd,Jd=w(()=>{"use strict";Js();Yr();M();lb=3600*1e3;l(Nd,"hashDescription");l(Ld,"loadCache");l($c,"saveCache");l(ub,"lookupCache");l(pb,"lookupPatterns");l(db,"classifyWithLLM");mb={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(gb,"classifyWithHeuristic");l(Gd,"buildAvailableDomains");l(fb,"getFilePatterns");Mc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=Nd(e),i=await Ld(n),a=ub(i,o,t);if(a)return{classification:a,source:"cache"};let c=pb(i,o);if(c)return{classification:c,source:"history"};let u=await db(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await $c(n,i),{classification:u,source:"llm"};let p=gb(e,s);return i.entries[o]={classification:p,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await $c(n,i),{classification:p,source:"heuristic"}}async confirmClassification(e,t,n){let s=Nd(e),o=await Ld(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await $c(n,o))}},hb=new Mc,zd=hb});import{exec as yb}from"node:child_process";import ks from"node:fs/promises";import wb from"node:os";import ln from"node:path";import{promisify as Sb}from"node:util";var Wd,Bd,Fc,kb,zo,Oc=w(()=>{"use strict";Ic();at();K();ts();Mt();Ed();Id();_d();M();Rn();Jd();ms();Wd=Sb(yb),Bd=["database","backend","frontend","testing","devops"],Fc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=P.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),p=await this.loadSkills(u),[m,d,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),b=null;return f&&e==="task"&&(b=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:p,requiresFragmentation:f,subtasks:b,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:d,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Td(e,t,{maxFiles:10,minScore:.15}),Ad(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Od(c.path,t);if(u.signatures.length===0)return null;let p=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
539
- `);return{path:c.path,content:p}}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([Wd("git branch --show-current",{cwd:e}),Wd("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
540
- `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let d=m.substring(0,2);d.startsWith("??")?a++:d[0]!==" "&&d[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let p=u.length>0?u.join(", "):"clean";return{branch:s,status:p}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await $t.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 Je.getAll(e);if(t.length===0)return null;let n=Ho(t,sn);return n.sprints.length===0?null:xd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ln.join(e,"analysis","repo-analysis.json"),n=await ks.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return S(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=P.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=ln.join(s,"storage","state.json"),d=await ks.readFile(m,"utf-8"),g=JSON.parse(d);g.domains&&(i=g.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await zd.classify(e,t,s,a),p=[c.primaryDomain,...c.secondaryDomains].filter(m=>o.some(d=>d===m||d.includes(m)||m.includes(d.replace(".md",""))));return p.length===0?{domains:["general"],primary:"general"}:{domains:p,primary:p[0]}}async getAvailableAgentNames(e){try{let t=ln.join(e,"agents");return(await ks.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=P.getGlobalProjectPath(t),s=ln.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let p=ln.join(s,u);try{let m=await ks.readFile(p,"utf-8"),{frontmatter:d,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:d.skills||[],filePath:p,effort:d.effort,model:d.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=uo(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=ln.join(wb.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=ln.join(t,`${i}.md`),c=ln.join(t,i,"SKILL.md");try{let u=await ks.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await ks.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=Bd.indexOf(a),p=Bd.indexOf(c);return(u===-1?99:u)-(p===-1?99:p)}),i=o.map((a,c)=>{let u=n.find(d=>d.domain===a),p=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((d,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:p,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await ne.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?"...":""}`}},kb=new Fc,zo=kb});function bb(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 _c,Pb,ke,Vd=w(()=>{"use strict";yt();Y();Gt();Gt();l(bb,"generateApprovalPrompt");_c=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Bi.includes(e)}isDestructive(e){return Vi.includes(e)}isToolAllowedInPlanning(e){return Hr.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Hr.includes(n)):t}startPlanning(e,t,n){let s={id:oe(),projectId:e,command:t,params:n,status:q.GATHERING,startedAt:k(),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?[q.GATHERING,q.ANALYZING,q.PROPOSING,q.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:k()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===q.APPROVED?n.approvedAt=k():t===q.EXECUTING?n.executionStartedAt=k():(t===q.COMPLETED||t===q.ABORTED)&&(n.completedAt=k()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=q.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=q.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!==q.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=q.APPROVED,n.approvedAt=k(),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=q.REJECTED,n.userFeedback=t,n.completedAt=k(),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!==q.APPROVED?null:(t.status=q.EXECUTING,t.executionStartedAt=k(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==q.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!==q.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=k(),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=q.COMPLETED,t.completedAt=k();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=q.ABORTED,n.completedAt=k(),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 bb(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[q.GATHERING]:"\u{1F50D}",[q.ANALYZING]:"\u{1F9E0}",[q.PROPOSING]:"\u{1F4DD}",[q.PENDING_APPROVAL]:"\u23F3",[q.APPROVED]:"\u2705",[q.EXECUTING]:"\u26A1",[q.COMPLETED]:"\u{1F389}",[q.REJECTED]:"\u274C",[q.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===q.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
541
- `)}_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`}},Pb=new _c,ke=Pb});function Cb(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Jo[t]?Jo[t]:Jo[e]?Jo[e]:e}function Wo(r){let e=new Set,t=[];for(let n of r){let s=Cb(n);e.has(s)||(e.add(s),t.push(n))}return t}var Jo,Nc=w(()=>{"use strict";Jo={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(Cb,"normalizeFrameworkName");l(Wo,"deduplicateTechStack")});import{z as be}from"zod";function qd(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
542
- `);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=Wo(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])=>vb[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(`
539
+ ${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),p=nn.safeParse(u);return p.success?p.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 lb(r,e){let t=Hd(e),n=new Map;for(let[d,g]of Object.entries(cb)){if(d==="general"||!t.includes(d))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(d,f)}if(n.size===0)return Du;let s=Array.from(n.entries()).sort((d,g)=>g[1]-d[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([d])=>d),c=s.reduce((d,[,g])=>d+g,0),u=Math.min(.85,i/c+.2),p=ub(o),m=e.agents.filter(d=>d===o||d.includes(o)||o.includes(d.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:p,relevantAgents:m}}function Hd(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 ub(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 rb,cb,Rc,pb,Gd,zd=w(()=>{"use strict";Gs();Kr();M();rb=3600*1e3;l(_d,"hashDescription");l(Nd,"loadCache");l(Dc,"saveCache");l(ob,"lookupCache");l(ib,"lookupPatterns");l(ab,"classifyWithLLM");cb={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(lb,"classifyWithHeuristic");l(Hd,"buildAvailableDomains");l(ub,"getFilePatterns");Rc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=_d(e),i=await Nd(n),a=ob(i,o,t);if(a)return{classification:a,source:"cache"};let c=ib(i,o);if(c)return{classification:c,source:"history"};let u=await ab(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Dc(n,i),{classification:u,source:"llm"};let p=lb(e,s);return i.entries[o]={classification:p,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Dc(n,i),{classification:p,source:"heuristic"}}async confirmClassification(e,t,n){let s=_d(e),o=await Nd(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Dc(n,o))}},pb=new Rc,Gd=pb});import{exec as db}from"node:child_process";import ws from"node:fs/promises";import mb from"node:os";import ln from"node:path";import{promisify as gb}from"node:util";var Jd,Wd,$c,fb,Jo,Mc=w(()=>{"use strict";Ec();ct();K();Zn();Ft();Td();Ad();Od();M();Rn();zd();ps();Jd=gb(db),Wd=["database","backend","frontend","testing","devops"],$c=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=P.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),p=await this.loadSkills(u),[m,d,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:p,requiresFragmentation:f,subtasks:k,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:d,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),xd(e,t,{maxFiles:10,minScore:.15}),Ed(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Fd(c.path,t);if(u.signatures.length===0)return null;let p=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
540
+ `);return{path:c.path,content:p}}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([Jd("git branch --show-current",{cwd:e}),Jd("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
541
+ `).filter(Boolean),i=0,a=0,c=0;for(let m of o){let d=m.substring(0,2);d.startsWith("??")?a++:d[0]!==" "&&d[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let p=u.length>0?u.join(", "):"clean";return{branch:s,status:p}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await Mt.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 We.getAll(e);if(t.length===0)return null;let n=Go(t,sn);return n.sprints.length===0?null:vd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ln.join(e,"analysis","repo-analysis.json"),n=await ws.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return S(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,n){let s=P.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=ln.join(s,"storage","state.json"),d=await ws.readFile(m,"utf-8"),g=JSON.parse(d);g.domains&&(i=g.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await Gd.classify(e,t,s,a),p=[c.primaryDomain,...c.secondaryDomains].filter(m=>o.some(d=>d===m||d.includes(m)||m.includes(d.replace(".md",""))));return p.length===0?{domains:["general"],primary:"general"}:{domains:p,primary:p[0]}}async getAvailableAgentNames(e){try{let t=ln.join(e,"agents");return(await ws.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=P.getGlobalProjectPath(t),s=ln.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let p=ln.join(s,u);try{let m=await ws.readFile(p,"utf-8"),{frontmatter:d,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:d.skills||[],filePath:p,effort:d.effort,model:d.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=po(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=ln.join(mb.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=ln.join(t,`${i}.md`),c=ln.join(t,i,"SKILL.md");try{let u=await ws.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await ws.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=Wd.indexOf(a),p=Wd.indexOf(c);return(u===-1?99:u)-(p===-1?99:p)}),i=o.map((a,c)=>{let u=n.find(d=>d.domain===a),p=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((d,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:p,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await X.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?"...":""}`}},fb=new $c,Jo=fb});function hb(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 Fc,yb,ke,Bd=w(()=>{"use strict";wt();Q();Jt();Jt();l(hb,"generateApprovalPrompt");Fc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Vi.includes(e)}isDestructive(e){return qi.includes(e)}isToolAllowedInPlanning(e){return Lr.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Lr.includes(n)):t}startPlanning(e,t,n){let s={id:ie(),projectId:e,command:t,params:n,status:q.GATHERING,startedAt:b(),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?[q.GATHERING,q.ANALYZING,q.PROPOSING,q.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===q.APPROVED?n.approvedAt=b():t===q.EXECUTING?n.executionStartedAt=b():(t===q.COMPLETED||t===q.ABORTED)&&(n.completedAt=b()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=q.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=q.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!==q.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=q.APPROVED,n.approvedAt=b(),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=q.REJECTED,n.userFeedback=t,n.completedAt=b(),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!==q.APPROVED?null:(t.status=q.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==q.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!==q.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=b(),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=q.COMPLETED,t.completedAt=b();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=q.ABORTED,n.completedAt=b(),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 hb(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[q.GATHERING]:"\u{1F50D}",[q.ANALYZING]:"\u{1F9E0}",[q.PROPOSING]:"\u{1F4DD}",[q.PENDING_APPROVAL]:"\u23F3",[q.APPROVED]:"\u2705",[q.EXECUTING]:"\u26A1",[q.COMPLETED]:"\u{1F389}",[q.REJECTED]:"\u274C",[q.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===q.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
542
+ `)}_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`}},yb=new Fc,ke=yb});function wb(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Wo[t]?Wo[t]:Wo[e]?Wo[e]:e}function Bo(r){let e=new Set,t=[];for(let n of r){let s=wb(n);e.has(s)||(e.add(s),t.push(n))}return t}var Wo,Oc=w(()=>{"use strict";Wo={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(wb,"normalizeFrameworkName");l(Bo,"deduplicateTechStack")});import{z as be}from"zod";function Vd(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
543
+ `);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=Bo(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])=>Sb[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(`
543
544
  Context: ${r.fileCount} files in project.`),e.join(`
544
- `)}var TM,vb,Kd=w(()=>{"use strict";Nc();TM=be.object({projectPath:be.string(),language:be.string().optional(),framework:be.string().optional(),techStack:be.array(be.string()).default([]),domains:be.object({hasFrontend:be.boolean().default(!1),hasBackend:be.boolean().default(!1),hasDatabase:be.boolean().default(!1),hasTesting:be.boolean().default(!1),hasDocker:be.boolean().default(!1)}).optional(),fileCount:be.number().optional(),availableAgents:be.array(be.string()).default([]),analysisLanguages:be.array(be.string()).default([]),analysisFrameworks:be.array(be.string()).default([]),analysisPackageManager:be.string().optional()}),vb={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(qd,"buildAntiHallucinationBlock")});import{z as Ct}from"zod";var xb,Xd,Yd=w(()=>{"use strict";xb=Ct.object({agents:Ct.boolean(),patterns:Ct.boolean(),checklist:Ct.boolean(),modules:Ct.array(Ct.string())}),Xd=Ct.object({version:Ct.string(),description:Ct.string().optional(),commands:Ct.record(Ct.string(),xb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Lc(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Qd(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Lc(o,Tb),a=Lc(o,Eb),c=Lc(o,Ab);return s.some(p=>Ib.includes(p))&&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 Tb,Eb,Ab,Ib,Zd=w(()=>{"use strict";Tb=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Eb=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Ab=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Ib=["Write","Edit","Bash"];l(Lc,"countMatches");l(Qd,"classifyCommand")});import Uc from"node:fs/promises";import jb from"node:path";async function tm(){if(mr)return mr;let r=await Uc.readFile(Hc,"utf-8"),e=JSON.parse(r);return mr=Xd.parse(e),mr}function Db(r){return nm.get(r)}function Rb(r,e){nm.set(r,e)}function Mb(r,e){let t=r,n=em.get(t);return n&&Ob(n.entry,e)?(n.count++,n.count>=$b):(em.set(t,{entry:e,count:1}),!1)}async function Fb(r,e){let t=await Uc.readFile(Hc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Uc.writeFile(Hc,`${JSON.stringify(n,null,2)}
545
- `,"utf-8"),mr=null}function Ob(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 sm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Db(e);if(n)return{entry:n,source:"cache"};if(t){let s=Qd(e,t);return Rb(e,s),Mb(e,s)&&Fb(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Hc,mr,nm,em,$b,rm=w(()=>{"use strict";Yd();xn();Zd();Hc=jb.join(Se,"core/config/command-context.config.json"),mr=null;l(tm,"loadCommandContextConfig");nm=new Map;l(Db,"getCachedClassification");l(Rb,"cacheClassification");em=new Map,$b=3;l(Mb,"trackClassification");l(Fb,"persistClassification");l(Ob,"isSameEntry");l(sm,"resolveCommandContextFull")});import _b from"node:os";import{z as Ot}from"zod";function Nb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Lb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function om(r){let e=r.platform??_b.platform(),t=r.runtime??Nb(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
546
- ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Lb(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
545
+ `)}var PM,Sb,qd=w(()=>{"use strict";Oc();PM=be.object({projectPath:be.string(),language:be.string().optional(),framework:be.string().optional(),techStack:be.array(be.string()).default([]),domains:be.object({hasFrontend:be.boolean().default(!1),hasBackend:be.boolean().default(!1),hasDatabase:be.boolean().default(!1),hasTesting:be.boolean().default(!1),hasDocker:be.boolean().default(!1)}).optional(),fileCount:be.number().optional(),availableAgents:be.array(be.string()).default([]),analysisLanguages:be.array(be.string()).default([]),analysisFrameworks:be.array(be.string()).default([]),analysisPackageManager:be.string().optional()}),Sb={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Vd,"buildAntiHallucinationBlock")});import{z as xt}from"zod";var kb,Kd,Xd=w(()=>{"use strict";kb=xt.object({agents:xt.boolean(),patterns:xt.boolean(),checklist:xt.boolean(),modules:xt.array(xt.string())}),Kd=xt.object({version:xt.string(),description:xt.string().optional(),commands:xt.record(xt.string(),kb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function _c(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function Yd(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=_c(o,bb),a=_c(o,Pb),c=_c(o,Cb);return s.some(p=>vb.includes(p))&&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 bb,Pb,Cb,vb,Qd=w(()=>{"use strict";bb=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],Pb=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Cb=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],vb=["Write","Edit","Bash"];l(_c,"countMatches");l(Yd,"classifyCommand")});import Nc from"node:fs/promises";import xb from"node:path";async function em(){if(ur)return ur;let r=await Nc.readFile(Lc,"utf-8"),e=JSON.parse(r);return ur=Kd.parse(e),ur}function Tb(r){return tm.get(r)}function Eb(r,e){tm.set(r,e)}function Ib(r,e){let t=r,n=Zd.get(t);return n&&Db(n.entry,e)?(n.count++,n.count>=Ab):(Zd.set(t,{entry:e,count:1}),!1)}async function jb(r,e){let t=await Nc.readFile(Lc,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Nc.writeFile(Lc,`${JSON.stringify(n,null,2)}
546
+ `,"utf-8"),ur=null}function Db(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 nm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=Tb(e);if(n)return{entry:n,source:"cache"};if(t){let s=Yd(e,t);return Eb(e,s),Ib(e,s)&&jb(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Lc,ur,tm,Zd,Ab,sm=w(()=>{"use strict";Xd();xn();Qd();Lc=xb.join(Se,"core/config/command-context.config.json"),ur=null;l(em,"loadCommandContextConfig");tm=new Map;l(Tb,"getCachedClassification");l(Eb,"cacheClassification");Zd=new Map,Ab=3;l(Ib,"trackClassification");l(jb,"persistClassification");l(Db,"isSameEntry");l(nm,"resolveCommandContextFull")});import Rb from"node:os";import{z as _t}from"zod";function $b(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Mb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function rm(r){let e=r.platform??Rb.platform(),t=r.runtime??$b(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
547
+ ${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Mb(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
547
548
  `)}
548
- </env>`}var GM,im=w(()=>{"use strict";GM=Ot.object({projectName:Ot.string(),projectPath:Ot.string(),isGitRepo:Ot.boolean().default(!0),gitBranch:Ot.string().optional(),platform:Ot.string().optional(),runtime:Ot.string().optional(),date:Ot.string().optional(),model:Ot.string().optional(),provider:Ot.string().optional()});l(Nb,"detectRuntime");l(Lb,"normalizePlatform");l(om,"buildEnvironmentBlock")});function cm(r){let e=r.getAllocationFor("injection");return{...Vo,totalPrompt:e}}function $n(r,e){let t=e*lm;return r.length<=t?r:`${r.substring(0,t)}
549
- ... (truncated to ~${e} tokens)`}function am(r){return Math.ceil(r.length/lm)}function um(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Ub[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 Vo,lm,Ub,Bo,pm=w(()=>{"use strict";Vo={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(cm,"budgetsFromCoordinator");lm=4;l($n,"truncateToTokenBudget");l(am,"estimateTokens");Ub={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(um,"filterSkillsByDomains");Bo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Vo,...e}}addSection(e,t){let n=$n(e,t),s=am(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=$n(n,o);return this.used+=am(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 dm from"node:fs/promises";import Mn from"node:path";var Gc,Hb,mm,gm=w(()=>{"use strict";Mt();M();Ce();xn();kc();Kd();rm();im();pm();Nc();ms();Gc=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 D(e)){let s=await dm.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){S(s)||console.error(`Template loading warning: ${y(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?cm(this._coordinator):Vo}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=Te(`global/modules/${e}`);if(t)return t;let n=Mn.join(Se,"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=ds("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=Te(s);if(o){let i=Mn.basename(s,".md");t[i]=o}}}else{let s=Mn.join(Se,"templates","checklists");if(await D(s)){let o=(await dm.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Mn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){S(n)||console.error(`Checklist loading warning: ${y(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([ne.read(e),Ge.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(S(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 hc.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){!S(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
550
- `);return $n(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=Mn.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 p=await this.build(e,t,n,s,o,i,a,c);return u.push(p),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let p=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",d;try{let C=await tm();d=sm(C,m,e).entry}catch{d={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=d.agents;s&&g&&(p.push(`# AGENT: ${s.name}
549
+ </env>`}var NM,om=w(()=>{"use strict";NM=_t.object({projectName:_t.string(),projectPath:_t.string(),isGitRepo:_t.boolean().default(!0),gitBranch:_t.string().optional(),platform:_t.string().optional(),runtime:_t.string().optional(),date:_t.string().optional(),model:_t.string().optional(),provider:_t.string().optional()});l($b,"detectRuntime");l(Mb,"normalizePlatform");l(rm,"buildEnvironmentBlock")});function am(r){let e=r.getAllocationFor("injection");return{...qo,totalPrompt:e}}function $n(r,e){let t=e*cm;return r.length<=t?r:`${r.substring(0,t)}
550
+ ... (truncated to ~${e} tokens)`}function im(r){return Math.ceil(r.length/cm)}function lm(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Fb[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 qo,cm,Fb,Vo,um=w(()=>{"use strict";qo={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(am,"budgetsFromCoordinator");cm=4;l($n,"truncateToTokenBudget");l(im,"estimateTokens");Fb={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(lm,"filterSkillsByDomains");Vo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...qo,...e}}addSection(e,t){let n=$n(e,t),s=im(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=$n(n,o);return this.used+=im(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 pm from"node:fs/promises";import Mn from"node:path";var Uc,Ob,dm,mm=w(()=>{"use strict";Ft();M();Ee();xn();wc();qd();sm();om();um();Oc();ps();Uc=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 D(e)){let s=await pm.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){S(s)||console.error(`Template loading warning: ${y(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?am(this._coordinator):qo}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=xe(`global/modules/${e}`);if(t)return t;let n=Mn.join(Se,"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=us("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=xe(s);if(o){let i=Mn.basename(s,".md");t[i]=o}}}else{let s=Mn.join(Se,"templates","checklists");if(await D(s)){let o=(await pm.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Mn.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){S(n)||console.error(`Checklist loading warning: ${y(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([X.read(e),Oe.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(S(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 gc.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){!S(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}n.push("---"),n.push("");let s=n.join(`
551
+ `);return $n(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=Mn.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 p=await this.build(e,t,n,s,o,i,a,c);return u.push(p),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let p=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",d;try{let C=await em();d=nm(C,m,e).entry}catch{d={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=d.agents;s&&g&&(p.push(`# AGENT: ${s.name}
551
552
  `),s.role&&p.push(`Role: ${s.role}
552
553
  `),s.skills?.length&&p.push(`Skills: ${s.skills.join(", ")}
553
554
  `),p.push(`
@@ -556,7 +557,7 @@ Apply specialized expertise. Read agent file for details if needed.
556
557
  `)),p.push(`TASK: ${e.frontmatter.description}
557
558
  `),e.frontmatter["allowed-tools"]&&p.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
558
559
  `);let f=t;(f.params?.task||f.params?.description)&&p.push(`INPUT: ${f.params.task||f.params.description}
559
- `);let b=t.projectPath;if(b){let C=u?.project?.id?Mn.basename(b):Mn.basename(b),I=om({projectName:C,projectPath:b,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});p.push(`
560
+ `);let k=t.projectPath;if(k){let C=u?.project?.id?Mn.basename(k):Mn.basename(k),I=rm({projectName:C,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});p.push(`
560
561
  ${I}
561
562
  `)}if(u){let C=u.sealedAnalysis;if(p.push(`
562
563
  ## PROJECT ANALYSIS (Sealed)
@@ -577,13 +578,13 @@ ${I}
577
578
  ### Anti-Patterns (Avoid These)
578
579
  `);for(let I of C.antiPatterns)p.push(`- **${I.issue}** in \`${I.file}\` \u2014 ${I.suggestion}
579
580
  `)}}p.push(`
580
- `)}let E=d.patterns,v=n?.codePatterns||"";if(E&&v&&v.trim()){let C=this.extractPatternSummary(v);C&&(p.push(`## CODE PATTERNS
581
+ `)}let v=d.patterns,x=n?.codePatterns||"";if(v&&x&&x.trim()){let C=this.extractPatternSummary(x);C&&(p.push(`## CODE PATTERNS
581
582
  `),p.push(C),p.push(`
582
583
  Full patterns: Read analysis/patterns.md
583
- `))}let $=n?.analysis||"";if(E&&$&&$.trim()){let C=$.match(/Stack[:\s]+([^\n]+)/i)||$.match(/Technology[:\s]+([^\n]+)/i),I=C?C[1].trim():"detected";p.push(`
584
+ `))}let $=n?.analysis||"";if(v&&$&&$.trim()){let C=$.match(/Stack[:\s]+([^\n]+)/i)||$.match(/Technology[:\s]+([^\n]+)/i),I=C?C[1].trim():"detected";p.push(`
584
585
  ## STACK
585
586
  Stack: ${I}
586
- `),v||p.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
587
+ `),x||p.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
587
588
  `)}if(u){if(u.agents.length>0){p.push(`
588
589
  ### LOADED AGENTS (Project-Specific Specialists)
589
590
 
@@ -591,18 +592,18 @@ Stack: ${I}
591
592
  `),I.effort&&p.push(`Effort: ${I.effort}
592
593
  `),I.model&&p.push(`Model: ${I.model}
593
594
  `),I.skills.length>0&&p.push(`Skills: ${I.skills.join(", ")}
594
- `);let ye=$n(I.content,this.getEffectiveBudgets().agentContent);p.push(`\`\`\`markdown
595
- ${ye}
595
+ `);let we=$n(I.content,this.getEffectiveBudgets().agentContent);p.push(`\`\`\`markdown
596
+ ${we}
596
597
  \`\`\`
597
598
 
598
- `)}}let C=um(u.skills,u.detectedDomains);if(C.length>0){p.push(`### LOADED SKILLS (From Agent Frontmatter)
599
+ `)}}let C=lm(u.skills,u.detectedDomains);if(C.length>0){p.push(`### LOADED SKILLS (From Agent Frontmatter)
599
600
 
600
601
  `);for(let I of C){p.push(`#### Skill: ${I.name}
601
- `);let ye=$n(I.content,this.getEffectiveBudgets().skillContent);p.push(`\`\`\`markdown
602
- ${ye}
602
+ `);let we=$n(I.content,this.getEffectiveBudgets().skillContent);p.push(`\`\`\`markdown
603
+ ${we}
603
604
  \`\`\`
604
605
 
605
- `)}}}let G=this.getModulesForCommand(m,d);if(G.length>0)for(let C of G){let I=await this.loadModule(C);I&&(p.push(`
606
+ `)}}}let J=this.getModulesForCommand(m,d);if(J.length>0)for(let C of J){let I=await this.loadModule(C);I&&(p.push(`
606
607
  `),p.push(I))}if(c?.isPlanning&&(p.push(`
607
608
  ## PLAN MODE
608
609
  Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
@@ -610,8 +611,8 @@ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approv
610
611
  `)),c?.requiresApproval&&p.push(`
611
612
  ## APPROVAL REQUIRED
612
613
  Show changes, list affected files, ask for confirmation.
613
- `),b){let C=u?.sealedAnalysis,I=[...C?.frameworks||[],...u?.project?.conventions||[]],ye={projectPath:b,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:Wo(I),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(z=>z.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};p.push(`
614
- ${qd(ye)}
614
+ `),k){let C=u?.sealedAnalysis,I=[...C?.frameworks||[],...u?.project?.conventions||[]],we={projectPath:k,language:u?.project?.ecosystem,framework:C?.frameworks?.[0],techStack:Bo(I),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:C?.languages||[],analysisFrameworks:C?.frameworks||[],analysisPackageManager:C?.packageManager};p.push(`
615
+ ${Vd(we)}
615
616
  `)}else p.push(this.buildCriticalRules());if(u?.realContext){let C=u.realContext;if(p.push(`
616
617
  ### CODEBASE CONTEXT
617
618
 
@@ -628,19 +629,19 @@ ${qd(ye)}
628
629
  ${I.content}
629
630
  \`\`\`
630
631
  `);p.push(`
631
- `)}if(C.recentFiles.length>0){p.push("**Recently Changed**: ");let I=C.recentFiles.slice(0,5).map(ye=>`${ye.path} (${ye.lastChanged})`).join(", ");p.push(`${I}
632
+ `)}if(C.recentFiles.length>0){p.push("**Recently Changed**: ");let I=C.recentFiles.slice(0,5).map(we=>`${we.path} (${we.lastChanged})`).join(", ");p.push(`${I}
632
633
 
633
634
  `)}}let Pe=t.files||[];if(Pe.length>0){let C=Pe.slice(0,5).join(", ");p.push(`
634
635
  ## FILES: ${Pe.length} available. Top: ${C}
635
636
  `),p.push(`Read BEFORE modifying. Use Glob/Grep to find more.
636
637
 
637
- `)}else b&&p.push(`
638
- ## PROJECT: ${b}
638
+ `)}else k&&p.push(`
639
+ ## PROJECT: ${k}
639
640
  Read files before modifying.
640
641
 
641
- `);let Ue=this.filterRelevantState(n);if(Ue&&(p.push(`
642
+ `);let Ge=this.filterRelevantState(n);if(Ge&&(p.push(`
642
643
  ## PRJCT STATE (Project Management Data)
643
- `),p.push(Ue),p.push(`
644
+ `),p.push(Ge),p.push(`
644
645
  `)),u?.velocityContext&&(p.push(`
645
646
  ### VELOCITY (Historical Estimation Data)
646
647
 
@@ -667,7 +668,7 @@ Read files before modifying.
667
668
 
668
669
  `),p.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),p.push(`| # | Domain | Description | Status |
669
670
  `),p.push(`|---|--------|-------------|--------|
670
- `);for(let I of u.subtasks){let ye=I.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":I.status==="completed"?"\u2705 Done":I.status==="failed"?"\u274C Failed":"\u23F3 Pending";p.push(`| ${I.order} | ${I.domain} | ${I.description} | ${ye} |
671
+ `);for(let I of u.subtasks){let we=I.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":I.status==="completed"?"\u2705 Done":I.status==="failed"?"\u274C Failed":"\u23F3 Pending";p.push(`| ${I.order} | ${I.domain} | ${I.description} | ${we} |
671
672
  `)}let C=u.subtasks.find(I=>I.status==="in_progress");if(C&&(p.push(`
672
673
  **FOCUS ON SUBTASK #${C.order}**: ${C.description}
673
674
  `),p.push(`Agent: ${C.agent} | Domain: ${C.domain}
@@ -678,15 +679,15 @@ Read files before modifying.
678
679
  `),p.push(`**From:** ${I.fromSubtask}
679
680
 
680
681
  `),p.push(`**What was done:**
681
- `);for(let ye of I.whatWasDone)p.push(`- ${ye}
682
+ `);for(let we of I.whatWasDone)p.push(`- ${we}
682
683
  `);if(I.filesChanged.length>0){p.push(`
683
684
  **Files changed:**
684
- `);for(let ye of I.filesChanged)p.push(`- \`${ye.path}\` (${ye.action})
685
+ `);for(let we of I.filesChanged)p.push(`- \`${we.path}\` (${we.action})
685
686
  `)}p.push(`
686
687
  **Context for this subtask:**
687
688
  ${I.outputForNextAgent}
688
689
  `)}p.push(`
689
- `)}let mt=this.getSchemaTypeForCommand(m);if(mt){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(Yr(),Gu)),I=C(mt);I&&p.push(`
690
+ `)}let gt=this.getSchemaTypeForCommand(m);if(gt){let{renderSchemaForPrompt:C}=await Promise.resolve().then(()=>(Kr(),Uu)),I=C(gt);I&&p.push(`
690
691
  ${I}
691
692
  `)}if(d.checklist){let C=await this.loadChecklistRouting(),I=await this.loadChecklists();C&&Object.keys(I).length>0&&(p.push(`
692
693
  ## QUALITY CHECKLISTS
@@ -694,7 +695,7 @@ ${I}
694
695
  `),p.push(`Available: ${Object.keys(I).join(", ")}
695
696
  `),p.push(`Path: templates/checklists/{name}.md
696
697
  `),p.push(`Use Read tool to load checklists you determine are relevant.
697
- `))}return p.push(this.buildEfficiencyDirective()),p.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Bo({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}
698
+ `))}return p.push(this.buildEfficiencyDirective()),p.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Vo({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}
698
699
  ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
699
700
 
700
701
  `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
@@ -728,7 +729,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
728
729
  - Prefer structured output (JSON) over free text when applicable.
729
730
 
730
731
  EXECUTE: Follow flow. Use tools. Decide.
731
- `}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}}}},Hb=new Gc,mm=Hb});import fm from"node:fs/promises";import lt from"node:path";var Gb,zb,zc,Jc,qo,Wc=w(()=>{"use strict";at();K();M();Gb=["task","done","ship","resume","bug","enrich"],zb=["init","sync","pause","next","dash","history","undo","redo"],zc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return lt.dirname(Ri.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=P.getGlobalProjectPath(s),a=await(He(),ot(Qe)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=lt.join(u,"templates")}catch{c=lt.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await P.getAgentSettingsPath(),paths:{orchestrator:lt.join(c,"agentic","orchestrator.md"),agentRouting:lt.join(c,"agentic","agent-routing.md"),taskFragmentation:lt.join(c,"agentic","task-fragmentation.md"),commandTemplate:lt.join(c,"commands",`${e}.md`),repoAnalysis:lt.join(o,"analysis","repo-analysis.json"),agentsDir:lt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:lt.join(o,"storage","state.json")}}}requiresOrchestration(e){return Gb.includes(e)?!0:!zb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=lt.join(P.getGlobalProjectPath(t),"agents");return(await fm.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return S(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=lt.join(P.getGlobalProjectPath(t),"agents");return(await fm.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
732
+ `}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}}}},Ob=new Uc,dm=Ob});import gm from"node:fs/promises";import ut from"node:path";var _b,Nb,Hc,Gc,Ko,zc=w(()=>{"use strict";ct();K();M();_b=["task","done","ship","resume","bug","enrich"],Nb=["init","sync","pause","next","dash","history","undo","redo"],Hc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return ut.dirname($i.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=P.getGlobalProjectPath(s),a=await(ze(),ot(Qe)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=ut.join(u,"templates")}catch{c=ut.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await P.getAgentSettingsPath(),paths:{orchestrator:ut.join(c,"agentic","orchestrator.md"),agentRouting:ut.join(c,"agentic","agent-routing.md"),taskFragmentation:ut.join(c,"agentic","task-fragmentation.md"),commandTemplate:ut.join(c,"commands",`${e}.md`),repoAnalysis:ut.join(o,"analysis","repo-analysis.json"),agentsDir:ut.join(o,"agents"),skillsDir:a.skillsDir,stateJson:ut.join(o,"storage","state.json")}}}requiresOrchestration(e){return _b.includes(e)?!0:!Nb.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=ut.join(P.getGlobalProjectPath(t),"agents");return(await gm.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return S(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=ut.join(P.getGlobalProjectPath(t),"agents");return(await gm.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
732
733
  ## Agentic Execution Mode
733
734
 
734
735
  You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
@@ -811,13 +812,13 @@ When fragmenting tasks:
811
812
  2. Track progress: currentSubtaskIndex, subtaskProgress
812
813
  3. Each completed subtask generates a summary
813
814
  4. Pass summary to next agent for context handoff
814
- `,context:e,requiresOrchestration:t}}},Jc=new zc,qo=Jc});import{exec as Jb}from"node:child_process";import hm from"node:fs/promises";import{promisify as Wb}from"node:util";var Bb,Fn,je,Bc=w(()=>{"use strict";fo();Bb=Wb(Jb),Fn={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())}};Fn.register("Read",async r=>{try{return await rr.execute(async()=>await hm.readFile(r,"utf-8"),`read-${r}`)}catch(e){return go(e)||sr(e),null}});Fn.register("Write",async(r,e)=>{try{return await rr.execute(async()=>await hm.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return go(t)||sr(t),!1}});Fn.register("Bash",async r=>{try{return await rr.execute(async()=>await Bb(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Fn.register("GetTimestamp",async()=>new Date().toISOString());Fn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Fn.register("GetDateTime",async()=>new Date().toISOString());je=Fn});import Vc from"node:fs/promises";import Vb from"node:os";import ym from"node:path";async function qb(r){try{let e=ym.dirname(Ko);await D(e)||await Vc.mkdir(e,{recursive:!0}),await Vc.writeFile(Ko,`/p:${r}`)}catch{}}async function Kb(){try{await D(Ko)&&await Vc.unlink(Ko)}catch{}}var Ko,qc,Xb,Xo,Kc=w(()=>{"use strict";M();sd();Ce();id();cd();Cc();bd();Pd();ls();Oc();Vd();gm();Wc();ms();Bc();Ko=ym.join(Vb.homedir(),".prjct-cli",".running");l(qb,"signalStart");l(Kb,"signalEnd");qc=class{static{l(this,"CommandExecutor")}async signalStart(e){await qb(e)}async signalEnd(){await Kb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Ss.shouldEscalate(e,s)){let o=Ss.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ba.load(e),i=await We.build(n,t),a=ke.requiresPlanning(e),c=ke.isDestructive(e),u=ke.isInPlanningMode(i.projectId),p=null;a&&!u&&!t.skipPlanning?p=ke.startPlanning(i.projectId,e,t):u&&(p=ke.getActivePlan(i.projectId));let m=null;if(Uo.requiresVerification(e)){let C=await We.loadStateForCommand(i,e);m=await Uo.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(Uo.formatWarnings(m))}let d=null;if(Lo.requiresReasoning(e)){let C=await We.loadStateForCommand(i,e);d=await Lo.reason(e,i,C),d.reasoning&&!d.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Lo.formatPlan(d)))}let g=t.task||t.description||"",f=await qo.buildContext(e,g,n),b=qo.buildAgenticPrompt(f),E=null;if(qo.requiresOrchestration(e)&&g)try{E=await zo.execute(e,g,n),E.detectedDomains.length>0&&No.orchestrate(E.detectedDomains);for(let C of E.agents){let I=C.domain||C.name.replace(".md","");No.startAgent(C.name,I,`Loading ${I} specialist...`),No.endAgent(!0)}if(E.requiresFragmentation&&E.subtasks){let C=E.subtasks.map(I=>({id:I.id,domain:I.domain,description:I.description,status:I.status}));od(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let v={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},$=await We.loadState(i),G=null,Pe=null;i.projectId&&(G={commit_footer:await ce.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ce.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ce.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ce.getSmartDecision(i.projectId,`preferred_agent_${e}`)},Pe=await ce.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Ue={isPlanning:a||u,requiresApproval:c&&!t.approved,active:p,allowedTools:ke.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},mt=await mm.build(o,v,$,null,G,null,Pe,Ue,E);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),b.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Ss.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:v,state:$,prompt:mt,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:b.prompt,requiresOrchestration:b.requiresOrchestration,agentsPath:v.agentsPath,agentRoutingPath:v.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:d,groundTruth:m,learnedPatterns:G,relevantMemories:Pe,orchestratorContext:E,memory:{create:l(C=>ce.createMemory(i.projectId,C),"create"),autoRemember:l((C,I,ye)=>ce.autoRemember(i.projectId,C,I,ye),"autoRemember"),search:l(C=>ce.searchMemories(i.projectId,C),"search"),findByTags:l(C=>ce.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>ce.getMemoryStats(i.projectId),"getStats")},plan:{active:p,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>ke.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>ke.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>ke.proposePlan(i.projectId,C),"propose"),approve:l(C=>ke.approvePlan(i.projectId,C),"approve"),reject:l(C=>ke.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>ke.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>ke.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>ke.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>ke.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>ke.failStep(i.projectId,C),"failStep"),abort:l(C=>ke.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>ke.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>ke.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Ss.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Ss.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!je.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=je.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ba.load(e)).frontmatter["allowed-tools"]||[],i=await We.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,p)=>this.executeTool("Write",[u,p],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},Xb=new qc,Xo=Xb});import Yo from"node:fs/promises";import Yb from"node:https";import Qb from"node:os";import Xc from"node:path";import vt from"chalk";var Yc,wm,Sm=w(()=>{"use strict";M();Ce();Yc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Xc.join(Qb.homedir(),".prjct-cli","config"),this.cacheFile=Xc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Xc.join(__dirname,"..","..","package.json");return JSON.parse(await Yo.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(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=Yb.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 D(this.cacheFile))return JSON.parse(await Yo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await D(this.cacheDir)||await Yo.mkdir(this.cacheDir,{recursive:!0}),await Yo.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:`
815
- `+vt.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")+`
816
- `+vt.yellow("\u2502")+" "+vt.bold("Update available!")+" "+vt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+vt.yellow("\u2502")+`
817
- `+vt.yellow("\u2502")+" "+vt.yellow("\u2502")+`
818
- `+vt.yellow("\u2502")+" Run: "+vt.cyan("npm update -g prjct-cli")+" "+vt.yellow("\u2502")+`
819
- `+vt.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")+`
820
- `}},wm=Yc});var ue,Le=w(()=>{"use strict";Kc();Cc();Bc();at();K();Sm();pn();Y();Ce();Ks();ys();ue=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new wm,this.updateNotificationShown=!1,this.commandExecutor=Xo}get agent(){return fs.getAgent()}get agentInfo(){return fs.getInfo()}get currentAuthor(){return un.getCurrentAuthor()}async initializeAgent(){return fs.initialize()}async ensureProjectInit(e){return un.ensureInit(e)}async ensureAuthor(){return un.ensureAuthor()}async getGlobalProjectPath(e){return un.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return ze.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return un.isEmptyDirectory(e)}async _detectExistingCode(e){return un.hasExistingCode(e)}_breakdownFeatureTasks(e){return Co.breakdownFeature(e)}_detectBugSeverity(e){return Co.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return fs.assignForTask(e,t,n)}}});var km={};fn(km,{PlanningCommands:()=>_n});import On from"node:path";async function Zb(){if(!Qc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Zo(),bm));Qc=new r}return Qc}var Qc,_n,Qo=w(()=>{"use strict";yo();En();yt();Mt();M();cr();kc();Le();Qc=null;l(Zb,"getAnalysisCommands");_n=class extends ue{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 ws(t).runNonInteractive());else if(a=await new ws(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await gs(),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 P.ensureProjectStructure(m);let d=P.getGlobalProjectPath(m),g={"core/now.md":`# NOW
815
+ `,context:e,requiresOrchestration:t}}},Gc=new Hc,Ko=Gc});import{exec as Lb}from"node:child_process";import fm from"node:fs/promises";import{promisify as Ub}from"node:util";var Hb,Fn,je,Jc=w(()=>{"use strict";ho();Hb=Ub(Lb),Fn={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())}};Fn.register("Read",async r=>{try{return await tr.execute(async()=>await fm.readFile(r,"utf-8"),`read-${r}`)}catch(e){return fo(e)||er(e),null}});Fn.register("Write",async(r,e)=>{try{return await tr.execute(async()=>await fm.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return fo(t)||er(t),!1}});Fn.register("Bash",async r=>{try{return await tr.execute(async()=>await Hb(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Fn.register("GetTimestamp",async()=>new Date().toISOString());Fn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Fn.register("GetDateTime",async()=>new Date().toISOString());je=Fn});import Wc from"node:fs/promises";import Gb from"node:os";import hm from"node:path";async function zb(r){try{let e=hm.dirname(Xo);await D(e)||await Wc.mkdir(e,{recursive:!0}),await Wc.writeFile(Xo,`/p:${r}`)}catch{}}async function Jb(){try{await D(Xo)&&await Wc.unlink(Xo)}catch{}}var Xo,Bc,Wb,Yo,Vc=w(()=>{"use strict";M();nd();Ee();od();ad();bc();kd();bd();as();Mc();Bd();mm();zc();ps();Jc();Xo=hm.join(Gb.homedir(),".prjct-cli",".running");l(zb,"signalStart");l(Jb,"signalEnd");Bc=class{static{l(this,"CommandExecutor")}async signalStart(e){await zb(e)}async signalEnd(){await Jb()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(ys.shouldEscalate(e,s)){let o=ys.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Ja.load(e),i=await Be.build(n,t),a=ke.requiresPlanning(e),c=ke.isDestructive(e),u=ke.isInPlanningMode(i.projectId),p=null;a&&!u&&!t.skipPlanning?p=ke.startPlanning(i.projectId,e,t):u&&(p=ke.getActivePlan(i.projectId));let m=null;if(Ho.requiresVerification(e)){let C=await Be.loadStateForCommand(i,e);m=await Ho.verify(e,i,C),!m.verified&&m.warnings.length>0&&console.log(Ho.formatWarnings(m))}let d=null;if(Uo.requiresReasoning(e)){let C=await Be.loadStateForCommand(i,e);d=await Uo.reason(e,i,C),d.reasoning&&!d.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Uo.formatPlan(d)))}let g=t.task||t.description||"",f=await Ko.buildContext(e,g,n),k=Ko.buildAgenticPrompt(f),v=null;if(Ko.requiresOrchestration(e)&&g)try{v=await Jo.execute(e,g,n),v.detectedDomains.length>0&&Lo.orchestrate(v.detectedDomains);for(let C of v.agents){let I=C.domain||C.name.replace(".md","");Lo.startAgent(C.name,I,`Loading ${I} specialist...`),Lo.endAgent(!0)}if(v.requiresFragmentation&&v.subtasks){let C=v.subtasks.map(I=>({id:I.id,domain:I.domain,description:I.description,status:I.status}));rd(C)}}catch(C){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(C)}`)}let x={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},$=await Be.loadState(i),J=null,Pe=null;i.projectId&&(J={commit_footer:await le.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await le.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await le.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await le.getSmartDecision(i.projectId,`preferred_agent_${e}`)},Pe=await le.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Ge={isPlanning:a||u,requiresApproval:c&&!t.approved,active:p,allowedTools:ke.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},gt=await dm.build(o,x,$,null,J,null,Pe,Ge,v);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),ys.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:x,state:$,prompt:gt,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:x.agentsPath,agentRoutingPath:x.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:d,groundTruth:m,learnedPatterns:J,relevantMemories:Pe,orchestratorContext:v,memory:{create:l(C=>le.createMemory(i.projectId,C),"create"),autoRemember:l((C,I,we)=>le.autoRemember(i.projectId,C,I,we),"autoRemember"),search:l(C=>le.searchMemories(i.projectId,C),"search"),findByTags:l(C=>le.findByTags(i.projectId,C),"findByTags"),getStats:l(()=>le.getMemoryStats(i.projectId),"getStats")},plan:{active:p,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(C=>ke.recordGatheredInfo(i.projectId,C),"recordInfo"),setAnalysis:l(C=>ke.setAnalysis(i.projectId,C),"setAnalysis"),propose:l(C=>ke.proposePlan(i.projectId,C),"propose"),approve:l(C=>ke.approvePlan(i.projectId,C),"approve"),reject:l(C=>ke.rejectPlan(i.projectId,C),"reject"),getApprovalPrompt:l(()=>ke.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>ke.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>ke.getNextStep(i.projectId),"getNextStep"),completeStep:l(C=>ke.completeStep(i.projectId,C),"completeStep"),failStep:l(C=>ke.failStep(i.projectId,C),"failStep"),abort:l(C=>ke.abortPlan(i.projectId,C),"abort"),getStatus:l(()=>ke.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>ke.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=ys.recordAttempt(e,s,{success:!1,error:y(o)});if(i.shouldEscalate){let a=ys.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!je.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=je.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Ja.load(e)).frontmatter["allowed-tools"]||[],i=await Be.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,p)=>this.executeTool("Write",[u,p],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:y(s)}}}},Wb=new Bc,Yo=Wb});import Qo from"node:fs/promises";import Bb from"node:https";import Vb from"node:os";import qc from"node:path";import Tt from"chalk";var Kc,ym,wm=w(()=>{"use strict";M();Ee();Kc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=qc.join(Vb.homedir(),".prjct-cli","config"),this.cacheFile=qc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=qc.join(__dirname,"..","..","package.json");return JSON.parse(await Qo.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(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=Bb.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 D(this.cacheFile))return JSON.parse(await Qo.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await D(this.cacheDir)||await Qo.mkdir(this.cacheDir,{recursive:!0}),await Qo.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:`
816
+ `+Tt.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")+`
817
+ `+Tt.yellow("\u2502")+" "+Tt.bold("Update available!")+" "+Tt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Tt.yellow("\u2502")+`
818
+ `+Tt.yellow("\u2502")+" "+Tt.yellow("\u2502")+`
819
+ `+Tt.yellow("\u2502")+" Run: "+Tt.cyan("npm update -g prjct-cli")+" "+Tt.yellow("\u2502")+`
820
+ `+Tt.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")+`
821
+ `}},ym=Kc});var pe,He=w(()=>{"use strict";Vc();bc();Jc();ct();K();wm();pn();Q();Ee();Bs();fs();pe=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ym,this.updateNotificationShown=!1,this.commandExecutor=Yo}get agent(){return ms.getAgent()}get agentInfo(){return ms.getInfo()}get currentAuthor(){return un.getCurrentAuthor()}async initializeAgent(){return ms.initialize()}async ensureProjectInit(e){return un.ensureInit(e)}async ensureAuthor(){return un.ensureAuthor()}async getGlobalProjectPath(e){return un.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return Je.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return un.isEmptyDirectory(e)}async _detectExistingCode(e){return un.hasExistingCode(e)}_breakdownFeatureTasks(e){return vo.breakdownFeature(e)}_detectBugSeverity(e){return vo.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return ms.assignForTask(e,t,n)}}});var Sm={};fn(Sm,{PlanningCommands:()=>_n});import On from"node:path";async function qb(){if(!Xc){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ei(),km));Xc=new r}return Xc}var Xc,_n,Zo=w(()=>{"use strict";wo();En();wt();Ft();M();or();wc();He();Xc=null;l(qb,"getAnalysisCommands");_n=class extends pe{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 ds(),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 P.ensureProjectStructure(m);let d=P.getGlobalProjectPath(m),g={"core/now.md":`# NOW
821
822
 
822
823
  No current task. Use \`/p:now\` to set focus.
823
824
  `,"core/next.md":`# NEXT
@@ -837,17 +838,17 @@ No current task. Use \`/p:now\` to set focus.
837
838
  `,"planning/roadmap.md":`# ROADMAP
838
839
 
839
840
  `,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
840
- `,"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[v,$]of Object.entries(g))await je.get("Write")(On.join(d,v),$);let f=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!f){h.step(3,4,"Analyzing project...");let v=await Zb();if((await v.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await v.sync(t,{aiTools:a.agents}):await v.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let E=n.idea;if(f&&!b){if(!E)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 v=On.join(d,"planning","architect-session.md"),$=`# Architect Session
841
+ `,"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[x,$]of Object.entries(g))await je.get("Write")(On.join(d,x),$);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let x=await qb();if((await x.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await x.sync(t,{aiTools:a.agents}):await x.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let v=n.idea;if(f&&!k){if(!v)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 x=On.join(d,"planning","architect-session.md"),$=`# Architect Session
841
842
 
842
843
  ## Idea
843
- ${E}
844
+ ${v}
844
845
 
845
846
  ## Status
846
847
  Initialized - awaiting stack recommendation
847
848
 
848
849
  Generated: ${new Date().toLocaleString()}
849
- `;return await je.get("Write")(v,$),await Oe.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:E,wizard:a}}return await Oe.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(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 We.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=oe(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Ge.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:N.getTimestamp()});let u=c.reduce((m,d)=>(m[d.agent]=(m[d.agent]||0)+1,m),{}),p=Object.entries(u).map(([m,d])=>`${m}:${d}`).join(" ");return h.done(`${i.length} tasks [${p}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("bug 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("tracking bug...");let o=await We.build(t,{description:e}),i=this._detectBugSeverity(e),c=(await this._assignAgentForTask(`fix bug: ${e}`,t,o)).agent?.name||"generalist",p={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await Ge.addTask(s,{description:`\u{1F41B} ${e}`,priority:p,type:"bug",section:"active",agent:c}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:p,agent:c,timestamp:N.getTimestamp()}),h.done(`bug [${i}] \u2192 ${c}`),nt("bug"),{success:!0,bug:e,severity:i,agent:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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
850
- `);let s=await this.getGlobalProjectPath(t),o=On.join(s,"planning","architect-session.md"),i;try{i=await te.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
850
+ `;return await je.get("Write")(x,$),await _e.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:v,wizard:a}}return await _e.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(y(n)),{success:!1,error:y(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 Be.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=ie(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Oe.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:U.getTimestamp()});let u=c.reduce((m,d)=>(m[d.agent]=(m[d.agent]||0)+1,m),{}),p=Object.entries(u).map(([m,d])=>`${m}:${d}`).join(" ");return h.done(`${i.length} tasks [${p}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async bug(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("bug 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("tracking bug...");let o=await Be.build(t,{description:e}),i=this._detectBugSeverity(e),c=(await this._assignAgentForTask(`fix bug: ${e}`,t,o)).agent?.name||"generalist",p={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await Oe.addTask(s,{description:`\u{1F41B} ${e}`,priority:p,type:"bug",section:"active",agent:c}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:p,agent:c,timestamp:U.getTimestamp()}),h.done(`bug [${i}] \u2192 ${c}`),nt("bug"),{success:!0,bug:e,severity:i,agent:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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
851
+ `);let s=await this.getGlobalProjectPath(t),o=On.join(s,"planning","architect-session.md"),i;try{i=await ne.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
851
852
 
852
853
  Create a plan first:
853
854
  1. Run /p:init in an empty directory
@@ -868,7 +869,7 @@ The architect plan is ready. Claude will now:
868
869
  4. Create starter files with boilerplate
869
870
  `),console.log(`
870
871
  \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.
871
- `),await this.logToMemory(t,"architect_executed",{timestamp:N.getTimestamp(),idea:p}),{success:!0,plan:i,idea:p}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("idea description required"),{success:!1,error:"Idea description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){h.spin("analyzing idea...");let a=P.getGlobalProjectPath(s),c=On.join(a,"planning","architect-session.md"),u=`# Architect Session
872
+ `),await this.logToMemory(t,"architect_executed",{timestamp:U.getTimestamp(),idea:p}),{success:!0,plan:i,idea:p}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async idea(e,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("idea description required"),{success:!1,error:"Idea description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){h.spin("analyzing idea...");let a=P.getGlobalProjectPath(s),c=On.join(a,"planning","architect-session.md"),u=`# Architect Session
872
873
 
873
874
  ## Idea
874
875
  ${e}
@@ -883,14 +884,14 @@ Initialized - awaiting architecture design
883
884
  4. Generate roadmap
884
885
 
885
886
  Generated: ${new Date().toLocaleString()}
886
- `;return await je.get("Write")(c,u),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:N.getTimestamp()}),h.done("architecture session created"),console.log(`
887
+ `;return await je.get("Write")(c,u),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:U.getTimestamp()}),h.done("architecture session created"),console.log(`
887
888
  \u{1F4A1} Use /p:architect execute to continue planning
888
- `),{success:!0,mode:"architecture",idea:e}}else return h.spin("capturing idea..."),await zt.addIdea(s,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:N.getTimestamp()}),h.done(`idea captured: ${e.slice(0,40)}`),nt("idea"),{success:!0,mode:"capture",idea:e}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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 p=P.getGlobalProjectPath(s),m=On.join(p,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
889
+ `),{success:!0,mode:"architecture",idea:e}}else return h.spin("capturing idea..."),await kt.addIdea(s,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:U.getTimestamp()}),h.done(`idea captured: ${e.slice(0,40)}`),nt("idea"),{success:!0,mode:"capture",idea:e}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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 p=P.getGlobalProjectPath(s),m=On.join(p,"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(`
889
890
  \u{1F4A1} Create one with /p:spec "feature name"
890
891
  `),{success:!0,specs:[]}):(console.log(`
891
892
  \u{1F4CB} SPECIFICATIONS
892
- `),console.log("\u2550".repeat(50)),f.forEach((b,E)=>{let v=b.replace(".md","").replace(/-/g," ");console.log(` ${E+1}. ${v}`)}),console.log(`${"\u2550".repeat(50)}
893
- `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=P.getGlobalProjectPath(s),i=On.join(o,"planning","specs");await te.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=On.join(i,`${a}.md`),u=`# Specification: ${e}
893
+ `),console.log("\u2550".repeat(50)),f.forEach((k,v)=>{let x=k.replace(".md","").replace(/-/g," ");console.log(` ${v+1}. ${x}`)}),console.log(`${"\u2550".repeat(50)}
894
+ `),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=P.getGlobalProjectPath(s),i=On.join(o,"planning","specs");await ne.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=On.join(i,`${a}.md`),u=`# Specification: ${e}
894
895
 
895
896
  ## Overview
896
897
  [Brief description of the feature]
@@ -920,14 +921,14 @@ Generated: ${new Date().toLocaleString()}
920
921
  ---
921
922
  Created: ${new Date().toLocaleString()}
922
923
  Status: Draft
923
- `;return await je.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:N.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
924
+ `;return await je.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:U.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
924
925
  \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
925
- `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var ei,un,Pm=w(()=>{"use strict";Ht();yo();at();K();M();Ce();ys();ei=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(()=>(Qo(),km)),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 Lr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await P.ensureProjectStructure(t),P.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await gs();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 qn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return S(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await qn(e)).some(s=>t.includes(s))}catch(t){return S(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},un=new ei});import Zc from"node:fs/promises";import eP from"node:path";var tP,nP,Cm,vm,el,xm,Tm=w(()=>{"use strict";K();M();Y();tP="session.json",nP=1800*1e3,Cm=50,vm=200,el=class{static{l(this,"SessionTracker")}getPath(e){return P.getStoragePath(e,tP)}async read(e){let t=this.getPath(e);try{let n=await Zc.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(S(n)||n instanceof SyntaxError)return this.getDefault();throw n}}async write(e,t){let n=this.getPath(e);await Zc.mkdir(eP.dirname(n),{recursive:!0}),await Zc.writeFile(n,JSON.stringify(t,null,2),"utf-8")}getDefault(){return{current:null,config:{idleTimeoutMs:nP}}}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=k();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=k();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Cm&&(s.current.commands=s.current.commands.slice(-Cm)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=k();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>vm&&(s.current.files=s.current.files.slice(-vm)),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),p=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,d=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Os(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Os(u),commandCount:n.commands.length,commands:p,filesRead:m,filesWritten:d}}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}},xm=new el});import{exec as sP}from"node:child_process";import rP from"node:fs/promises";import oP from"node:path";import{promisify as iP}from"node:util";var tl,aP,ti,gr,Em=w(()=>{"use strict";K();M();Tm();tl=iP(sP),aP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ti=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...aP,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n=oP.join(P.getGlobalProjectPath(e),"project.json"),s={};try{s=JSON.parse(await rP.readFile(n,"utf-8"))}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let o=s.lastSync;try{let{stdout:i}=await tl("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=i.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;try{let{stdout:i}=await tl(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:this.projectPath});t.commitsSinceSync=parseInt(i.trim(),10)||0}catch{return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t}if(o){let i=new Date(o),a=new Date;t.daysSinceSync=Math.floor((a.getTime()-i.getTime())/(1e3*60*60*24))}try{let{stdout:i}=await tl(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:this.projectPath});t.changedFiles=i.trim().split(`
926
+ `),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}}});var ti,un,bm=w(()=>{"use strict";zt();wo();ct();K();M();Ee();fs();ti=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(()=>(Zo(),Sm)),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 _r.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await P.ensureProjectStructure(t),P.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ds();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 Bn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return S(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Bn(e)).some(s=>t.includes(s))}catch(t){return S(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},un=new ti});import Yc from"node:fs/promises";import Kb from"node:path";var Xb,Yb,Pm,Cm,Qc,vm,xm=w(()=>{"use strict";K();M();Q();Xb="session.json",Yb=1800*1e3,Pm=50,Cm=200,Qc=class{static{l(this,"SessionTracker")}getPath(e){return P.getStoragePath(e,Xb)}async read(e){let t=this.getPath(e);try{let n=await Yc.readFile(t,"utf-8");return JSON.parse(n)}catch(n){if(S(n)||n instanceof SyntaxError)return this.getDefault();throw n}}async write(e,t){let n=this.getPath(e);await Yc.mkdir(Kb.dirname(n),{recursive:!0}),await Yc.writeFile(n,JSON.stringify(t,null,2),"utf-8")}getDefault(){return{current:null,config:{idleTimeoutMs:Yb}}}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=b();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=b();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Pm&&(s.current.commands=s.current.commands.slice(-Pm)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=b();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>Cm&&(s.current.files=s.current.files.slice(-Cm)),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),p=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,d=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Ms(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Ms(u),commandCount:n.commands.length,commands:p,filesRead:m,filesWritten:d}}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}},vm=new Qc});import{exec as Qb}from"node:child_process";import Zb from"node:fs/promises";import eP from"node:path";import{promisify as tP}from"node:util";var Zc,nP,ni,pr,Tm=w(()=>{"use strict";K();M();xm();Zc=tP(Qb),nP={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ni=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...nP,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n=eP.join(P.getGlobalProjectPath(e),"project.json"),s={};try{s=JSON.parse(await Zb.readFile(n,"utf-8"))}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let o=s.lastSync;try{let{stdout:i}=await Zc("git rev-parse --short HEAD",{cwd:this.projectPath});t.currentCommit=i.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;try{let{stdout:i}=await Zc(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:this.projectPath});t.commitsSinceSync=parseInt(i.trim(),10)||0}catch{return t.isStale=!0,t.reason="Sync commit no longer exists (history changed). Run `prjct sync`.",t}if(o){let i=new Date(o),a=new Date;t.daysSinceSync=Math.floor((a.getTime()-i.getTime())/(1e3*60*60*24))}try{let{stdout:i}=await Zc(`git diff --name-only ${t.lastSyncCommit}..HEAD`,{cwd:this.projectPath});t.changedFiles=i.trim().split(`
926
927
  `).filter(Boolean)}catch{t.changedFiles=[]}return t.significantChanges=t.changedFiles.filter(i=>this.config.significantFiles.some(a=>i.endsWith(a)||i.includes(a))),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: ${y(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(`
927
- `)}async getSessionInfo(e){return xm.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
928
+ `)}async getSessionInfo(e){return vm.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
928
929
  `);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(`
929
- `)}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}},gr=l((r,e)=>new ti(r,e),"createStalenessChecker")});import Am from"node:fs/promises";import ni from"node:path";function fr(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 pP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let d of n)t.push(...fr(d));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 d of s){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...fr(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 d of o){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...fr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let d=a[1];if(d.startsWith(".")||d.startsWith("@/"))t.push(...fr(d));else{let g=d.startsWith("@")?d.split("/").slice(0,2).join("/"):d.split("/")[0];t.push(...fr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let d=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...d)}let p=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=p.exec(r))!==null;){let d=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...d)}return t.filter(d=>d.length>1&&!lP.has(d)&&/^[a-z][a-z0-9]*$/.test(d))}async function Im(r,e){let t=[],n=await Am.readdir(r,{withFileTypes:!0});for(let s of n){if(uP.has(s.name))continue;let o=ni.join(r,s.name);if(s.isDirectory())t.push(...await Im(o,e));else if(s.isFile()){let i=ni.extname(s.name).toLowerCase();cP.has(i)&&t.push(ni.relative(e,o))}}return t}async function dP(r){let e=await Im(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 p=>{try{let m=await Am.readFile(ni.join(r,p),"utf-8"),d=pP(m,p);return{filePath:p,tokens:d}}catch{return{filePath:p,tokens:[]}}}));for(let{filePath:p,tokens:m}of u){if(m.length===0)continue;t[p]={tokens:m,length:m.length},s+=m.length;let d=new Map;for(let g of m)d.set(g,(d.get(g)||0)+1);for(let[g,f]of d)n[g]||(n[g]=[]),n[g].push({path:p,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 gP(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]))};it.setDoc(r,mP,t)}async function jm(r,e){let t=await dP(r);return gP(e,t),t}var cP,lP,uP,mP,Dm=w(()=>{"use strict";Dt();cP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),lP=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"]),uP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(fr,"splitIdentifier");l(pP,"tokenizeFile");l(Im,"listFiles");l(dP,"buildIndex");mP="bm25-index";l(gP,"saveIndex");l(jm,"indexProject")});import nl from"node:fs/promises";import Vt from"node:path";function SP(r){let e=[],t,n=new RegExp(wP.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function kP(r,e,t){let n;if(r.startsWith("@/"))n=Vt.join(t,"src",r.slice(2));else{let s=Vt.dirname(Vt.join(t,e));n=Vt.resolve(s,r)}for(let s of yP){let o=n+s;try{if((await nl.stat(o)).isFile())return Vt.relative(t,o)}catch{}}return null}async function Rm(r,e){let t=[],n=await nl.readdir(r,{withFileTypes:!0});for(let s of n){if(hP.has(s.name))continue;let o=Vt.join(r,s.name);if(s.isDirectory())t.push(...await Rm(o,e));else if(s.isFile()){let i=Vt.extname(s.name).toLowerCase();fP.has(i)&&t.push(Vt.relative(e,o))}}return t}async function bP(r){let e=await Rm(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 p=await nl.readFile(Vt.join(r,u),"utf-8"),m=SP(p),d=[];for(let g of m){let f=await kP(g,u,r);f&&f!==u&&d.push(f)}return{filePath:u,imports:d}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:p}of c)if(p.length!==0){t[u]=p,s+=p.length;for(let m of p)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function PP(r,e){it.setDoc(r,$m,e)}function Mm(r){return it.getDoc(r,$m)}async function Fm(r,e){let t=await bP(r);return PP(e,t),t}var fP,hP,yP,wP,$m,sl=w(()=>{"use strict";Dt();fP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),hP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),yP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],wP=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(SP,"extractImportSources");l(kP,"resolveImport");l(Rm,"listFiles");l(bP,"buildGraph");$m="import-graph";l(PP,"saveGraph");l(Mm,"loadGraph");l(Fm,"indexImports")});function Om(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Mm(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let p of u)n.has(p)||s.add(p)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function _m(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 Nm=w(()=>{"use strict";sl();l(Om,"propagateChanges");l(_m,"affectedDomains")});import rl from"node:fs/promises";import si from"node:path";async function Lm(r,e){let t=[],n=await rl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(vP.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=si.join(r,o);if(s.isDirectory())t.push(...await Lm(i,e));else if(s.isFile()){let a=si.extname(o).toLowerCase();CP.has(a)&&t.push(si.relative(e,i))}}return t}function xP(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 TP(r){let e=await Lm(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=si.join(r,a),[u,p]=await Promise.all([rl.readFile(c,"utf-8"),rl.stat(c)]);return{path:a,hash:xP(u),size:p.size,mtime:p.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function EP(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 ol(r,e){let t=it.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)})(),it.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function AP(r){let e=new Map;try{let t=it.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 il(r,e){let[t,n]=await Promise.all([TP(r),Promise.resolve(AP(e))]);return{diff:EP(t,n),currentHashes:t}}function Um(r){return it.hasDoc(r,"file-hashes-meta")}var CP,vP,Hm=w(()=>{"use strict";Dt();CP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),vP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Lm,"listProjectFiles");l(xP,"hashContent");l(TP,"computeHashes");l(EP,"diffHashes");l(ol,"saveHashes");l(AP,"loadHashes");l(il,"detectChanges");l(Um,"hasHashRegistry")});import{exec as IP}from"node:child_process";import{promisify as jP}from"node:util";async function $P(r,e=100){try{let{stdout:t}=await DP(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
930
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=zm&&n.push(s),s=new Set):i&&s&&MP(i)&&s.add(i)}return s&&s.size>0&&s.size<=zm&&n.push(s),n}catch{return[]}}function MP(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 FP(r,e=100){let t=await $P(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 p=OP(a[c],a[u]);s.set(p,(s.get(p)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),p=n.get(c)||0,m=n.get(u)||0;if(p<Gm||m<Gm)continue;let d=p+m-a,g=d>0?a/d:0;g<RP||(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 OP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function NP(r,e){it.setDoc(r,_P,e)}async function Jm(r,e,t=100){let n=await FP(r,t);return NP(e,n),n}var DP,RP,Gm,zm,_P,Wm=w(()=>{"use strict";Dt();DP=jP(IP),RP=.1,Gm=2,zm=30;l($P,"parseGitLog");l(MP,"isSourceFile");l(FP,"buildMatrix");l(OP,"pairKey");_P="cochange-index";l(NP,"saveMatrix");l(Jm,"indexCoChanges")});function De(r){return`<!-- source: ${r.file}, ${r.type} -->`}function qt(){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 ri=w(()=>{"use strict";l(De,"cite");l(qt,"defaultSources")});function LP(r,e){let t=r.sources||qt();return`# ${r.name} - Project Rules
930
+ `)}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}},pr=l((r,e)=>new ni(r,e),"createStalenessChecker")});import Em from"node:fs/promises";import si from"node:path";function dr(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 iP(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let d of n)t.push(...dr(d));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 d of s){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...dr(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 d of o){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...dr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let d=a[1];if(d.startsWith(".")||d.startsWith("@/"))t.push(...dr(d));else{let g=d.startsWith("@")?d.split("/").slice(0,2).join("/"):d.split("/")[0];t.push(...dr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let d=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...d)}let p=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=p.exec(r))!==null;){let d=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...d)}return t.filter(d=>d.length>1&&!rP.has(d)&&/^[a-z][a-z0-9]*$/.test(d))}async function Am(r,e){let t=[],n=await Em.readdir(r,{withFileTypes:!0});for(let s of n){if(oP.has(s.name))continue;let o=si.join(r,s.name);if(s.isDirectory())t.push(...await Am(o,e));else if(s.isFile()){let i=si.extname(s.name).toLowerCase();sP.has(i)&&t.push(si.relative(e,o))}}return t}async function aP(r){let e=await Am(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 p=>{try{let m=await Em.readFile(si.join(r,p),"utf-8"),d=iP(m,p);return{filePath:p,tokens:d}}catch{return{filePath:p,tokens:[]}}}));for(let{filePath:p,tokens:m}of u){if(m.length===0)continue;t[p]={tokens:m,length:m.length},s+=m.length;let d=new Map;for(let g of m)d.set(g,(d.get(g)||0)+1);for(let[g,f]of d)n[g]||(n[g]=[]),n[g].push({path:p,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 lP(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]))};it.setDoc(r,cP,t)}async function Im(r,e){let t=await aP(r);return lP(e,t),t}var sP,rP,oP,cP,jm=w(()=>{"use strict";at();sP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),rP=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"]),oP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(dr,"splitIdentifier");l(iP,"tokenizeFile");l(Am,"listFiles");l(aP,"buildIndex");cP="bm25-index";l(lP,"saveIndex");l(Im,"indexProject")});import el from"node:fs/promises";import qt from"node:path";function gP(r){let e=[],t,n=new RegExp(mP.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function fP(r,e,t){let n;if(r.startsWith("@/"))n=qt.join(t,"src",r.slice(2));else{let s=qt.dirname(qt.join(t,e));n=qt.resolve(s,r)}for(let s of dP){let o=n+s;try{if((await el.stat(o)).isFile())return qt.relative(t,o)}catch{}}return null}async function Dm(r,e){let t=[],n=await el.readdir(r,{withFileTypes:!0});for(let s of n){if(pP.has(s.name))continue;let o=qt.join(r,s.name);if(s.isDirectory())t.push(...await Dm(o,e));else if(s.isFile()){let i=qt.extname(s.name).toLowerCase();uP.has(i)&&t.push(qt.relative(e,o))}}return t}async function hP(r){let e=await Dm(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 p=await el.readFile(qt.join(r,u),"utf-8"),m=gP(p),d=[];for(let g of m){let f=await fP(g,u,r);f&&f!==u&&d.push(f)}return{filePath:u,imports:d}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:p}of c)if(p.length!==0){t[u]=p,s+=p.length;for(let m of p)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function yP(r,e){it.setDoc(r,Rm,e)}function $m(r){return it.getDoc(r,Rm)}async function Mm(r,e){let t=await hP(r);return yP(e,t),t}var uP,pP,dP,mP,Rm,tl=w(()=>{"use strict";at();uP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),pP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),dP=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],mP=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(gP,"extractImportSources");l(fP,"resolveImport");l(Dm,"listFiles");l(hP,"buildGraph");Rm="import-graph";l(yP,"saveGraph");l($m,"loadGraph");l(Mm,"indexImports")});function Fm(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=$m(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let p of u)n.has(p)||s.add(p)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Om(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 _m=w(()=>{"use strict";tl();l(Fm,"propagateChanges");l(Om,"affectedDomains")});import nl from"node:fs/promises";import ri from"node:path";async function Nm(r,e){let t=[],n=await nl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(SP.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=ri.join(r,o);if(s.isDirectory())t.push(...await Nm(i,e));else if(s.isFile()){let a=ri.extname(o).toLowerCase();wP.has(a)&&t.push(ri.relative(e,i))}}return t}function kP(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 bP(r){let e=await Nm(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=ri.join(r,a),[u,p]=await Promise.all([nl.readFile(c,"utf-8"),nl.stat(c)]);return{path:a,hash:kP(u),size:p.size,mtime:p.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function PP(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 sl(r,e){let t=it.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)})(),it.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function CP(r){let e=new Map;try{let t=it.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 rl(r,e){let[t,n]=await Promise.all([bP(r),Promise.resolve(CP(e))]);return{diff:PP(t,n),currentHashes:t}}function Lm(r){return it.hasDoc(r,"file-hashes-meta")}var wP,SP,Um=w(()=>{"use strict";at();wP=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),SP=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Nm,"listProjectFiles");l(kP,"hashContent");l(bP,"computeHashes");l(PP,"diffHashes");l(sl,"saveHashes");l(CP,"loadHashes");l(rl,"detectChanges");l(Lm,"hasHashRegistry")});import{exec as vP}from"node:child_process";import{promisify as xP}from"node:util";async function AP(r,e=100){try{let{stdout:t}=await TP(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
931
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=Gm&&n.push(s),s=new Set):i&&s&&IP(i)&&s.add(i)}return s&&s.size>0&&s.size<=Gm&&n.push(s),n}catch{return[]}}function IP(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 jP(r,e=100){let t=await AP(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 p=DP(a[c],a[u]);s.set(p,(s.get(p)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),p=n.get(c)||0,m=n.get(u)||0;if(p<Hm||m<Hm)continue;let d=p+m-a,g=d>0?a/d:0;g<EP||(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 DP(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function $P(r,e){it.setDoc(r,RP,e)}async function zm(r,e,t=100){let n=await jP(r,t);return $P(e,n),n}var TP,EP,Hm,Gm,RP,Jm=w(()=>{"use strict";at();TP=xP(vP),EP=.1,Hm=2,Gm=30;l(AP,"parseGitLog");l(IP,"isSourceFile");l(jP,"buildMatrix");l(DP,"pairKey");RP="cochange-index";l($P,"saveMatrix");l(zm,"indexCoChanges")});function De(r){return`<!-- source: ${r.file}, ${r.type} -->`}function Kt(){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 oi=w(()=>{"use strict";l(De,"cite");l(Kt,"defaultSources")});function MP(r,e){let t=r.sources||Kt();return`# ${r.name} - Project Rules
931
932
  <!-- projectId: ${r.projectId} -->
932
933
  <!-- Generated: ${new Date().toISOString()} -->
933
934
  <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
@@ -1000,13 +1001,13 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
1000
1001
 
1001
1002
  **Workflow**: ${r.agents.workflow.join(", ")}
1002
1003
  **Domain**: ${r.agents.domain.join(", ")||"none"}
1003
- `}function UP(r,e){let t=r.sources||qt(),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(De(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(De(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(`
1004
- `)}function HP(r,e){let t=r.sources||qt(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(De(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(De(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
1005
- `)}function GP(r,e){let t=r.sources||qt(),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(De(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(De(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(`
1006
- `)}function zP(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(`
1007
- `),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 Bm(r){return{claude:LP,cursor:UP,copilot:HP,windsurf:GP,continue:zP}[r]||null}var al=w(()=>{"use strict";ri();l(LP,"formatForClaude");l(UP,"formatForCursor");l(HP,"formatForCopilot");l(GP,"formatForWindsurf");l(zP,"formatForContinue");l(Bm,"getFormatter")});import{exec as JP}from"node:child_process";import WP from"node:os";import hr from"node:path";import{promisify as BP}from"node:util";function Vm(r){return oi[r]||null}async function cl(r){try{return await VP(`which ${r}`),!0}catch{return!1}}async function ii(r=process.cwd()){let e=[];return await cl("claude")&&e.push("claude"),(await cl("cursor")||await D(hr.join(r,".cursor")))&&e.push("cursor"),await D(hr.join(r,".github"))&&e.push("copilot"),(await cl("windsurf")||await D(hr.join(r,".windsurf")))&&e.push("windsurf"),(await D(hr.join(r,".continue"))||await D(hr.join(WP.homedir(),".continue")))&&e.push("continue"),e}async function qm(r,e=process.cwd()){if(r==="auto"){let t=await ii(e);return t.length>0?t:["claude"]}return r==="all"?qP:r.filter(t=>oi[t])}var VP,oi,yr,qP,ll=w(()=>{"use strict";Ce();VP=BP(JP),oi={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"}},yr=["claude"],qP=Object.keys(oi);l(Vm,"getAIToolConfig");l(cl,"commandExists");l(ii,"detectInstalledTools");l(qm,"resolveToolIds")});import ul from"node:fs/promises";import pl from"node:path";async function Km(r,e,t,n=yr){let s=[];for(let o of n){let i=Vm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await KP(r,i,e,t);s.push(a)}return s}async function KP(r,e,t,n){let s=Bm(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=pl.join(n,e.outputFile):i=pl.join(t,"context",e.outputFile),await ul.mkdir(pl.dirname(i),{recursive:!0});try{let a=await ul.readFile(i,"utf-8"),c=nr(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=tr(o,a)}catch{}return await ul.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:y(o)}}}var Xm=w(()=>{"use strict";M();po();al();ll();l(Km,"generateAIToolContexts");l(KP,"generateForTool")});var Ym=w(()=>{"use strict";al();Xm();ll()});import Nn from"node:fs/promises";import Be from"node:path";var ai,Qm=w(()=>{"use strict";K();ri();Y();po();pc();ai=class{static{l(this,"ContextFileGenerator")}config;constructor(e){this.config=e}async writeWithPreservation(e,t){let n=t;try{let s=await Nn.readFile(e,"utf-8"),o=nr(s);if(!o.valid){let i=Be.basename(e);console.warn(`\u26A0\uFE0F ${i} has invalid preserve blocks:`);for(let a of o.errors)console.warn(` ${a}`)}n=tr(t,s)}catch{}await Nn.writeFile(e,n,"utf-8")}async generate(e,t,n,s,o){let i=Be.join(this.config.globalPath,"context");return await Promise.all([this.generateClaudeMd(i,e,t,n,s,o),this.generateNowMd(i),this.generateNextMd(i),this.generateIdeasMd(i),this.generateShippedMd(i)]),["context/CLAUDE.md","context/now.md","context/next.md","context/ideas.md","context/shipped.md"]}async generateClaudeMd(e,t,n,s,o,i){let a=o.filter(d=>d.type==="workflow").map(d=>d.name),c=o.filter(d=>d.type==="domain").map(d=>d.name),u=i||qt(),p=`# ${n.name} - Project Rules
1004
+ `}function FP(r,e){let t=r.sources||Kt(),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(De(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(De(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(`
1005
+ `)}function OP(r,e){let t=r.sources||Kt(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(De(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(De(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
1006
+ `)}function _P(r,e){let t=r.sources||Kt(),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(De(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(De(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(`
1007
+ `)}function NP(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(`
1008
+ `),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 Wm(r){return{claude:MP,cursor:FP,copilot:OP,windsurf:_P,continue:NP}[r]||null}var ol=w(()=>{"use strict";oi();l(MP,"formatForClaude");l(FP,"formatForCursor");l(OP,"formatForCopilot");l(_P,"formatForWindsurf");l(NP,"formatForContinue");l(Wm,"getFormatter")});import{exec as LP}from"node:child_process";import UP from"node:os";import mr from"node:path";import{promisify as HP}from"node:util";function Bm(r){return ii[r]||null}async function il(r){try{return await GP(`which ${r}`),!0}catch{return!1}}async function ai(r=process.cwd()){let e=[];return await il("claude")&&e.push("claude"),(await il("cursor")||await D(mr.join(r,".cursor")))&&e.push("cursor"),await D(mr.join(r,".github"))&&e.push("copilot"),(await il("windsurf")||await D(mr.join(r,".windsurf")))&&e.push("windsurf"),(await D(mr.join(r,".continue"))||await D(mr.join(UP.homedir(),".continue")))&&e.push("continue"),e}async function Vm(r,e=process.cwd()){if(r==="auto"){let t=await ai(e);return t.length>0?t:["claude"]}return r==="all"?zP:r.filter(t=>ii[t])}var GP,ii,gr,zP,al=w(()=>{"use strict";Ee();GP=HP(LP),ii={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"}},gr=["claude"],zP=Object.keys(ii);l(Bm,"getAIToolConfig");l(il,"commandExists");l(ai,"detectInstalledTools");l(Vm,"resolveToolIds")});import cl from"node:fs/promises";import ll from"node:path";async function qm(r,e,t,n=gr){let s=[];for(let o of n){let i=Bm(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await JP(r,i,e,t);s.push(a)}return s}async function JP(r,e,t,n){let s=Wm(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=ll.join(n,e.outputFile):i=ll.join(t,"context",e.outputFile),await cl.mkdir(ll.dirname(i),{recursive:!0});try{let a=await cl.readFile(i,"utf-8"),c=Zs(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Qs(o,a)}catch{}return await cl.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:y(o)}}}var Km=w(()=>{"use strict";M();mo();ol();al();l(qm,"generateAIToolContexts");l(JP,"generateForTool")});var Xm=w(()=>{"use strict";ol();Km();al()});import ul from"node:fs/promises";import Nt from"node:path";var ci,Ym=w(()=>{"use strict";K();Zr();so();ro();oo();oi();Q();mo();lc();ci=class{static{l(this,"ContextFileGenerator")}config;constructor(e){this.config=e}async writeWithPreservation(e,t){let n=t;try{let s=await ul.readFile(e,"utf-8"),o=Zs(s);if(!o.valid){let i=Nt.basename(e);console.warn(`\u26A0\uFE0F ${i} has invalid preserve blocks:`);for(let a of o.errors)console.warn(` ${a}`)}n=Qs(t,s)}catch{}await ul.writeFile(e,n,"utf-8")}async generate(e,t,n,s,o){let i=Nt.join(this.config.globalPath,"context");return await Promise.all([this.generateClaudeMd(i,e,t,n,s,o),this.generateNowMd(i),this.generateNextMd(i),this.generateIdeasMd(i),this.generateShippedMd(i)]),["context/CLAUDE.md","context/now.md","context/next.md","context/ideas.md","context/shipped.md"]}async generateClaudeMd(e,t,n,s,o,i){let a=o.filter(d=>d.type==="workflow").map(d=>d.name),c=o.filter(d=>d.type==="domain").map(d=>d.name),u=i||Kt(),p=`# ${n.name} - Project Rules
1008
1009
  <!-- projectId: ${this.config.projectId} -->
1009
- <!-- Generated: ${k()} -->
1010
+ <!-- Generated: ${b()} -->
1010
1011
  <!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
1011
1012
 
1012
1013
  ## THIS PROJECT (${n.ecosystem})
@@ -1077,35 +1078,35 @@ Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
1077
1078
 
1078
1079
  **Workflow**: ${a.join(", ")}
1079
1080
  **Domain**: ${c.join(", ")||"none"}
1080
- `,m=Be.join(e,"CLAUDE.md");await this.writeWithPreservation(m,p)}async generateNowMd(e){let t=null;try{let s=Be.join(this.config.globalPath,"storage","state.json");t=JSON.parse(await Nn.readFile(s,"utf-8")).currentTask}catch{}let n=t?`# NOW
1081
+ `,m=Nt.join(e,"CLAUDE.md");await this.writeWithPreservation(m,p)}async generateNowMd(e){let t=null;try{t=(await X.read(this.config.projectId)).currentTask}catch{}let n=t?.branch,s=typeof n=="string"?n:n?.name,o=t?`# NOW
1081
1082
 
1082
1083
  **${t.description}**
1083
1084
 
1084
1085
  Started: ${t.startedAt}
1085
- ${t.branch?`Branch: ${t.branch.name}`:""}
1086
+ ${s?`Branch: ${s}`:""}
1086
1087
  `:`# NOW
1087
1088
 
1088
1089
  _No active task_
1089
1090
 
1090
1091
  Use \`p. task "description"\` to start working.
1091
- `;await this.writeWithPreservation(Be.join(e,"now.md"),n)}async generateNextMd(e){let t={tasks:[]};try{let s=Be.join(this.config.globalPath,"storage","queue.json");t=JSON.parse(await Nn.readFile(s,"utf-8"))}catch{}let n=`# NEXT
1092
+ `;await this.writeWithPreservation(Nt.join(e,"now.md"),o)}async generateNextMd(e){let t={tasks:[]};try{t={tasks:(await Oe.read(this.config.projectId)).tasks||[]}}catch{}let n=`# NEXT
1092
1093
 
1093
1094
  ${t.tasks.length>0?t.tasks.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
1094
1095
  `):"_Empty queue_"}
1095
- `;await this.writeWithPreservation(Be.join(e,"next.md"),n)}async generateIdeasMd(e){let t={ideas:[]};try{let s=Be.join(this.config.globalPath,"storage","ideas.json");t=JSON.parse(await Nn.readFile(s,"utf-8"))}catch{}let n=`# IDEAS
1096
+ `;await this.writeWithPreservation(Nt.join(e,"next.md"),n)}async generateIdeasMd(e){let t={ideas:[]};try{t={ideas:(await kt.read(this.config.projectId)).ideas||[]}}catch{}let n=`# IDEAS
1096
1097
 
1097
1098
  ${t.ideas.length>0?t.ideas.map(s=>`- ${s.text}${s.priority?` [${s.priority}]`:""}`).join(`
1098
1099
  `):"_No ideas captured yet_"}
1099
- `;await this.writeWithPreservation(Be.join(e,"ideas.md"),n)}async generateShippedMd(e){let t={shipped:[]};try{let s=Be.join(this.config.globalPath,"storage","shipped.json");t=JSON.parse(await Nn.readFile(s,"utf-8"))}catch{}let n=`# SHIPPED \u{1F680}
1100
+ `;await this.writeWithPreservation(Nt.join(e,"ideas.md"),n)}async generateShippedMd(e){let t={shipped:[]};try{t={shipped:(await Wt.read(this.config.projectId)).shipped||[]}}catch{}let n=`# SHIPPED \u{1F680}
1100
1101
 
1101
1102
  ${t.shipped.length>0?t.shipped.slice(-10).map(s=>`- **${s.name}**${s.version?` v${s.version}`:""} - ${s.shippedAt}`).join(`
1102
1103
  `):"_Nothing shipped yet_"}
1103
1104
 
1104
1105
  **Total shipped:** ${t.shipped.length}
1105
- `;await this.writeWithPreservation(Be.join(e,"shipped.md"),n)}async generateMonorepoContexts(e,t,n,s){let o=await P.detectMonorepo(this.config.projectPath);if(!o.isMonorepo)return[];let i=[],a=new or(this.config.projectPath);await a.initialize();for(let c of o.packages){if(!c.hasPrjctMd)continue;let u=await a.getPackageContext(c.name);if(!u)continue;let p=await this.generatePackageClaudeMd(c,u,e,t,n,s),m=Be.join(c.path,"CLAUDE.md");await this.writeWithPreservation(m,p),i.push(Be.relative(this.config.projectPath,m))}return i}async generatePackageClaudeMd(e,t,n,s,o,i){let a=i.filter(m=>m.type==="workflow").map(m=>m.name),c=i.filter(m=>m.type==="domain").map(m=>m.name),u=s.version,p=e.name;try{let m=Be.join(e.path,"package.json"),d=JSON.parse(await Nn.readFile(m,"utf-8"));u=d.version||s.version,p=d.name||e.name}catch{}return`# ${p} - Package Rules
1106
+ `;await this.writeWithPreservation(Nt.join(e,"shipped.md"),n)}async generateMonorepoContexts(e,t,n,s){let o=await P.detectMonorepo(this.config.projectPath);if(!o.isMonorepo)return[];let i=[],a=new nr(this.config.projectPath);await a.initialize();for(let c of o.packages){if(!c.hasPrjctMd)continue;let u=await a.getPackageContext(c.name);if(!u)continue;let p=await this.generatePackageClaudeMd(c,u,e,t,n,s),m=Nt.join(c.path,"CLAUDE.md");await this.writeWithPreservation(m,p),i.push(Nt.relative(this.config.projectPath,m))}return i}async generatePackageClaudeMd(e,t,n,s,o,i){let a=i.filter(m=>m.type==="workflow").map(m=>m.name),c=i.filter(m=>m.type==="domain").map(m=>m.name),u=s.version,p=e.name;try{let m=Nt.join(e.path,"package.json"),d=JSON.parse(await ul.readFile(m,"utf-8"));u=d.version||s.version,p=d.name||e.name}catch{}return`# ${p} - Package Rules
1106
1107
  <!-- package: ${e.relativePath} -->
1107
1108
  <!-- monorepo: ${s.name} -->
1108
- <!-- Generated: ${k()} -->
1109
+ <!-- Generated: ${b()} -->
1109
1110
  <!-- Sources: ${t.sources.join(" \u2192 ")} -->
1110
1111
 
1111
1112
  ## THIS PACKAGE
@@ -1155,8 +1156,8 @@ Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
1155
1156
 
1156
1157
  **Workflow**: ${a.join(", ")}
1157
1158
  **Domain**: ${c.join(", ")||"none"}
1158
- `}}});import dl from"node:fs/promises";import ml from"node:path";var gl,fl,Zm,eg=w(()=>{"use strict";M();gl=".prjct-state.md",fl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=ml.join(e,gl),s=this.toMarkdown(t);await dl.writeFile(n,s,"utf-8")}async remove(e){let t=ml.join(e,gl);try{await dl.unlink(t)}catch(n){if(!S(n))throw n}}async exists(e){let t=ml.join(e,gl);try{return await dl.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",p=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${p}`)}),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(`
1159
- `)}},Zm=new fl});import hl from"node:fs/promises";import XP from"node:os";import tg from"node:path";function yl(){return tg.join(XP.homedir(),".prjct-cli","skills",YP)}function QP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function wr(){try{let r=await hl.readFile(yl(),"utf-8");return JSON.parse(r)}catch{return QP()}}async function wl(r){let e=yl();await hl.mkdir(tg.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await hl.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function ZP(r){let e=await wr();e.skills[r.name]=r,await wl(e)}async function eC(r){let e=await wr();return r in e.skills?(delete e.skills[r],await wl(e),!0):!1}async function tC(r){return(await wr()).skills[r]||null}async function nC(){return(await wr()).skills}function sC(){return yl()}var YP,Sr,ng=w(()=>{"use strict";YP=".skill-lock.json";l(yl,"getLockFilePath");l(QP,"createEmptyLockFile");l(wr,"read");l(wl,"write");l(ZP,"addEntry");l(eC,"removeEntry");l(tC,"getEntry");l(nC,"getAll");l(sC,"getPath");Sr={read:wr,write:wl,addEntry:ZP,removeEntry:eC,getEntry:tC,getAll:nC,getPath:sC}});import{exec as rC}from"node:child_process";import Kt from"node:fs/promises";import kl from"node:os";import _e from"node:path";import{promisify as oC}from"node:util";import{glob as sg}from"glob";function og(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?_e.join(kl.homedir(),r.slice(1)):_e.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 ig(r){let e=[];try{let s=_e.join(r,"SKILL.md");await Kt.access(s);let o=_e.basename(r);e.push({name:o,filePath:s})}catch{}let t=await sg("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=_e.basename(_e.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await sg("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=_e.basename(_e.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function iC(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()}
1159
+ `}}});import pl from"node:fs/promises";import dl from"node:path";var ml,gl,Qm,Zm=w(()=>{"use strict";M();ml=".prjct-state.md",gl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=dl.join(e,ml),s=this.toMarkdown(t);await pl.writeFile(n,s,"utf-8")}async remove(e){let t=dl.join(e,ml);try{await pl.unlink(t)}catch(n){if(!S(n))throw n}}async exists(e){let t=dl.join(e,ml);try{return await pl.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",p=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${p}`)}),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(`
1160
+ `)}},Qm=new gl});import fl from"node:fs/promises";import WP from"node:os";import eg from"node:path";function hl(){return eg.join(WP.homedir(),".prjct-cli","skills",BP)}function VP(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function fr(){try{let r=await fl.readFile(hl(),"utf-8");return JSON.parse(r)}catch{return VP()}}async function yl(r){let e=hl();await fl.mkdir(eg.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await fl.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function qP(r){let e=await fr();e.skills[r.name]=r,await yl(e)}async function KP(r){let e=await fr();return r in e.skills?(delete e.skills[r],await yl(e),!0):!1}async function XP(r){return(await fr()).skills[r]||null}async function YP(){return(await fr()).skills}function QP(){return hl()}var BP,hr,tg=w(()=>{"use strict";BP=".skill-lock.json";l(hl,"getLockFilePath");l(VP,"createEmptyLockFile");l(fr,"read");l(yl,"write");l(qP,"addEntry");l(KP,"removeEntry");l(XP,"getEntry");l(YP,"getAll");l(QP,"getPath");hr={read:fr,write:yl,addEntry:qP,removeEntry:KP,getEntry:XP,getAll:YP,getPath:QP}});import{exec as ZP}from"node:child_process";import Xt from"node:fs/promises";import Sl from"node:os";import Ne from"node:path";import{promisify as eC}from"node:util";import{glob as ng}from"glob";function rg(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?Ne.join(Sl.homedir(),r.slice(1)):Ne.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 og(r){let e=[];try{let s=Ne.join(r,"SKILL.md");await Xt.access(s);let o=Ne.basename(r);e.push({name:o,filePath:s})}catch{}let t=await ng("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=Ne.basename(Ne.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await ng("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=Ne.basename(Ne.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function tC(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()}
1160
1161
  ${s.join(`
1161
1162
  `)}`;return r.replace(o,`---
1162
1163
  ${c}
@@ -1165,10 +1166,10 @@ ${s.join(`
1165
1166
  `)}
1166
1167
  ---
1167
1168
 
1168
- ${r}`}function bl(){return _e.join(kl.homedir(),".claude","skills")}async function Sl(r,e,t,n){let s=bl(),o=_e.join(s,e),i=_e.join(o,"SKILL.md"),a=await Kt.readFile(r,"utf-8"),c=iC(a,t,n);return await Kt.mkdir(o,{recursive:!0}),await Kt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function aC(r){let e={installed:[],skipped:[],errors:[]};if(!Do.isAvailable("git")){let n=Do.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=_e.join(kl.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await rg(`git clone --depth 1 ${n} ${t}`,{timeout:Gr("GIT_CLONE")});let s;try{let{stdout:a}=await rg("git rev-parse HEAD",{cwd:t,timeout:Gr("TOOL_CHECK")});s=a.trim()}catch{}let o=await ig(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 Sl(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 Sr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await Kt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function cC(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await Kt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await Kt.stat(t)).isFile()){let s=_e.basename(_e.dirname(t));try{let o=await Sl(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Sr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await ig(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 Sl(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Sr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function lC(r){let e=bl(),t=_e.join(e,r);try{await Kt.rm(t,{recursive:!0,force:!0})}catch{}let n=_e.join(e,`${r}.md`);try{await Kt.rm(n,{force:!0})}catch{}return Sr.removeEntry(r)}async function uC(r){let e=og(r);switch(e.type){case"github":return aC(e);case"local":return cC(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var rg,ag,cg=w(()=>{"use strict";M();Gt();lc();ng();rg=oC(rC);l(og,"parseSource");l(ig,"discoverSkills");l(iC,"injectSourceMetadata");l(bl,"getInstallDir");l(Sl,"installSkillFile");l(aC,"installFromGitHub");l(cC,"installFromLocal");l(lC,"remove");l(uC,"install");ag={install:uC,remove:lC,parseSource:og,getInstallDir:bl}});import ut from"node:fs/promises";import pC from"node:os";import st from"node:path";async function lg(r,e,t,n){let s=[],o=st.join(r,"agents");try{let c=await ut.readdir(o);for(let u of c)u.endsWith(".md")&&await ut.unlink(st.join(o,u))}catch(c){L.debug("Failed to purge old agents",{path:o,error:V(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>dC(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=>mC(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 ug(r){let e=st.join(r,"agents"),t=[];try{let n=await ut.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 pg(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=Te(`subagents/${o}.md`);if(!i){let a=st.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await ut.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 dC(r,e){let t="";try{let n=st.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await ut.readFile(n,"utf-8"),t=await pg(t)}catch(n){L.debug("Workflow agent template not found, generating minimal",{name:r,error:V(n)}),t=fC(r)}await ut.writeFile(st.join(e,`${r}.md`),t,"utf-8")}async function mC(r,e,t,n,s){let o="";try{let i=st.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await ut.readFile(i,"utf-8"),o=await pg(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){L.debug("Domain agent template not found, generating minimal",{name:r,error:V(i)}),o=hC(r,t,n)}o=gC(o,r,s),await ut.writeFile(st.join(e,`${r}.md`),o,"utf-8")}function gC(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=[`
1169
+ ${r}`}function kl(){return Ne.join(Sl.homedir(),".claude","skills")}async function wl(r,e,t,n){let s=kl(),o=Ne.join(s,e),i=Ne.join(o,"SKILL.md"),a=await Xt.readFile(r,"utf-8"),c=tC(a,t,n);return await Xt.mkdir(o,{recursive:!0}),await Xt.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function nC(r){let e={installed:[],skipped:[],errors:[]};if(!Ro.isAvailable("git")){let n=Ro.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=Ne.join(Sl.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await sg(`git clone --depth 1 ${n} ${t}`,{timeout:Ur("GIT_CLONE")});let s;try{let{stdout:a}=await sg("git rev-parse HEAD",{cwd:t,timeout:Ur("TOOL_CHECK")});s=a.trim()}catch{}let o=await og(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 wl(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 hr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await Xt.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function sC(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await Xt.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await Xt.stat(t)).isFile()){let s=Ne.basename(Ne.dirname(t));try{let o=await wl(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await hr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let s=await og(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 wl(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await hr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function rC(r){let e=kl(),t=Ne.join(e,r);try{await Xt.rm(t,{recursive:!0,force:!0})}catch{}let n=Ne.join(e,`${r}.md`);try{await Xt.rm(n,{force:!0})}catch{}return hr.removeEntry(r)}async function oC(r){let e=rg(r);switch(e.type){case"github":return nC(e);case"local":return sC(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var sg,ig,ag=w(()=>{"use strict";M();Jt();ac();tg();sg=eC(ZP);l(rg,"parseSource");l(og,"discoverSkills");l(tC,"injectSourceMetadata");l(kl,"getInstallDir");l(wl,"installSkillFile");l(nC,"installFromGitHub");l(sC,"installFromLocal");l(rC,"remove");l(oC,"install");ig={install:oC,remove:rC,parseSource:rg,getInstallDir:kl}});import pt from"node:fs/promises";import iC from"node:os";import st from"node:path";async function cg(r,e,t,n){let s=[],o=st.join(r,"agents");try{let c=await pt.readdir(o);for(let u of c)u.endsWith(".md")&&await pt.unlink(st.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:V(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>aC(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=>cC(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 lg(r){let e=st.join(r,"agents"),t=[];try{let n=await pt.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 ug(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=xe(`subagents/${o}.md`);if(!i){let a=st.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await pt.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 aC(r,e){let t="";try{let n=st.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await pt.readFile(n,"utf-8"),t=await ug(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:V(n)}),t=uC(r)}await pt.writeFile(st.join(e,`${r}.md`),t,"utf-8")}async function cC(r,e,t,n,s){let o="";try{let i=st.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await pt.readFile(i,"utf-8"),o=await ug(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:V(i)}),o=pC(r,t,n)}o=lC(o,r,s),await pt.writeFile(st.join(e,`${r}.md`),o,"utf-8")}function lC(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=[`
1169
1170
  ## Recent Learnings (from completed tasks)
1170
1171
  `];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 p=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${p}`)}c.push("")}return r+c.join(`
1171
- `)}function fC(r){return`---
1172
+ `)}function uC(r){return`---
1172
1173
  name: ${r}
1173
1174
  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"}
1174
1175
  tools: Read, Write, Glob
@@ -1184,7 +1185,7 @@ When invoked:
1184
1185
  1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
1185
1186
  2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
1186
1187
  3. Execute requested operation
1187
- `}function hC(r,e,t){return`---
1188
+ `}function pC(r,e,t){return`---
1188
1189
  name: ${r}
1189
1190
  description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
1190
1191
  tools: Read, Write, Glob, Grep
@@ -1204,18 +1205,18 @@ Domain specialist for ${r} tasks.
1204
1205
  ## Your Role
1205
1206
 
1206
1207
  You are the ${r} expert for this project. Apply best practices for the detected stack.
1207
- `}function dg(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:k(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return ut.writeFile(st.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{L.debug("Failed to write skills.json",{error:V(o)})}),n}async function mg(r){let e=[];try{let t=st.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await ut.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 p of u.packages)i.push({pkg:p,agent:c.name})}if(i.length===0)return e;let a=st.join(pC.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let p=c.split("/").pop()||c,m=st.join(a,p,"SKILL.md"),d=st.join(a,`${p}.md`),g=!1;try{await ut.access(m),g=!0}catch{try{await ut.access(d),g=!0}catch{}}if(g){e.push({name:p,agent:u,status:"skipped"});continue}try{let f=c.split("/"),b;f.length===3?b=`${f[0]}/${f[1]}@${f[2]}`:b=c;let E=await ag.install(b);E.installed.length>0?(e.push({name:p,agent:u,status:"installed"}),L.info(`Installed skill: ${p} for agent: ${u}`)):E.errors.length>0?(e.push({name:p,agent:u,status:"error"}),L.debug(`Failed to install skill ${p}`,{errors:E.errors})):e.push({name:p,agent:u,status:"skipped"})}catch(f){e.push({name:p,agent:u,status:"error"}),L.debug(`Skill install error for ${p}`,{error:V(f)})}}}catch(t){L.debug("Skill auto-installation failed (non-critical)",{error:V(t)})}return e}var gg=w(()=>{"use strict";ms();Ht();Y();Zn();cg();l(lg,"generateAgents");l(ug,"loadExistingAgents");l(pg,"resolveTemplateIncludes");l(dC,"generateWorkflowAgent");l(mC,"generateDomainAgent");l(gC,"injectFeedbackSection");l(fC,"generateMinimalWorkflowAgent");l(hC,"generateMinimalDomainAgent");l(dg,"configureSkills");l(mg,"autoInstallSkills")});import fg from"node:fs/promises";import hg from"node:path";var ci,yg=w(()=>{"use strict";ci=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=hg.join(this.projectPath,"package.json"),t=await fg.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await fg.access(hg.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as yC}from"node:child_process";import wg from"node:fs/promises";import Pl from"node:path";import{promisify as wC}from"node:util";async function Sg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Ln("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Ln("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Ln("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Ln("git status --porcelain",{cwd:r}),i=o.trim().split(`
1208
- `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let p=u.substring(0,2),m=u.substring(3);p.startsWith("A")||p.startsWith("M ")?e.stagedFiles.push(m):p.includes("M")?e.modifiedFiles.push(m):p.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await Ln('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1209
- `).filter(Boolean).map(u=>{let[p,m,d]=u.split("|");return{hash:p,message:m,date:d}});let{stdout:c}=await Ln('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){L.debug("Git analysis failed (not a git repo?)",{error:V(t)})}return e}async function _t(r,e){try{return await wg.access(Pl.join(r,e)),!0}catch(t){return L.debug("File not found",{filename:e,error:V(t)}),!1}}async function kg(r){let e={fileCount:0,version:"0.0.0",name:Pl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Ln('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){L.debug("File count failed",{path:r,error:V(t)}),e.fileCount=0}try{let t=Pl.join(r,"package.json"),n=JSON.parse(await wg.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 _t(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){L.debug("No package.json found",{path:r,error:V(t)})}return await _t(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await _t(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await _t(r,"requirements.txt")||await _t(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 bg(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 _t(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 _t(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 _t(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 _t(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 _t(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 Pg(r,e){let t=qt(),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 Cg(r){return new ci(r).detect()}var Ln,vg=w(()=>{"use strict";Ht();ri();Zn();yg();Ln=wC(yC);l(Sg,"analyzeGit");l(_t,"fileExists");l(kg,"gatherStats");l(bg,"detectCommands");l(Pg,"buildSources");l(Cg,"detectStack")});import{exec as SC}from"node:child_process";import li from"node:fs/promises";import ui from"node:path";import{promisify as kC}from"node:util";var bC,Cl,vl,xg,Tg=w(()=>{"use strict";M();bC=kC(SC),Cl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ui.join(r,s);try{await li.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=["storage/state.json"],n=[];for(let s of t){let o=ui.join(r,s);try{let i=await li.readFile(o,"utf-8");JSON.parse(i)}catch(i){S(i)||n.push(`${s}: ${i instanceof SyntaxError?"invalid JSON":"read error"}`)}}return{name:"JSON files valid",passed:n.length===0,output:n.length===0?`${t.length} files validated`:void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=ui.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 li.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await li.readFile(ui.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(!S(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(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}}},vl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cl.contextFilesExist(t),Cl.jsonFilesValid(t),Cl.noSensitiveData(t)];for(let d of c){let g=await d;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(d=>d.passed))&&n?.checks)for(let d of n.checks){if(d.enabled===!1){a++;continue}let g=await this.runCustomCheck(d,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(d)+1);a+=f.filter(b=>b.enabled!==!1).length;break}}let p=o.filter(d=>!d.passed).length,m=o.filter(d=>d.passed).length;return{passed:p===0,checks:o,totalMs:Date.now()-s,failedCount:p,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 bC(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}}}},xg=new vl});import Xt from"node:fs/promises";import Un from"node:path";var pi,kr,Eg=w(()=>{"use strict";ls();Dm();Nm();Hm();Wm();sl();Ht();En();at();K();Kr();rn();ca();so();ga();ha();wa();Ca();Ym();Y();Zn();wc();Sc();Qm();eg();uc();gg();vg();Tg();pi=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 ii(e)).filter(i=>!yr.includes(i));s=[...yr,...o]}else t.aiTools[0]==="auto"?(s=await ii(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await qm("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=P.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await ma(this.projectId);let[i,a,c,u]=await Promise.all([Sg(this.projectPath),kg(this.projectPath),bg(this.projectPath),Cg(this.projectPath)]),p=t.full===!0,m,d=!0,g=!0,f=new Set;if(!p&&Um(this.projectId))try{let{diff:z,currentHashes:bf}=await il(this.projectPath,this.projectId),ql=z.added.length+z.modified.length+z.deleted.length;if(ql===0&&!t.changedFiles?.length)d=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:z.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Di=Om(z,this.projectId);f=_m(Di.allAffected);let Pf=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);d=Di.allAffected.some(gn=>{let Cf=gn.substring(gn.lastIndexOf("."));return Pf.has(Cf)}),g=Di.directlyChanged.some(gn=>gn==="package.json"||gn==="tsconfig.json"||gn.includes("Dockerfile")||gn.includes("docker-compose")),m={isIncremental:!0,filesChanged:ql,filesUnchanged:z.unchanged.length,indexesRebuilt:d,agentsRegenerated:g,affectedDomains:Array.from(f)}}ol(this.projectId,bf)}catch(z){L.debug("Incremental detection failed, falling back to full sync",{error:V(z)})}else try{let{currentHashes:z}=await il(this.projectPath,this.projectId);ol(this.projectId,z)}catch(z){L.debug("Hash computation failed (non-critical)",{error:V(z)})}if(d)try{await Promise.all([jm(this.projectPath,this.projectId),Fm(this.projectPath,this.projectId),Jm(this.projectPath,this.projectId)])}catch(z){L.debug("File ranking index build failed (non-critical)",{error:V(z)})}let b;if(g)try{let z=await ne.getAggregatedFeedback(this.projectId);(z.patternsDiscovered.length>0||z.knownGotchas.length>0||z.agentAccuracy.length>0)&&(b=z)}catch{}let E=g?await lg(this.globalPath,u,a,b):await ug(this.globalPath),v=dg(E,this.projectId,this.globalPath),$=g?await mg(E):[],G=Pg(a,c),Pe=await this.generateContextFiles(i,a,c,E,G),Ue={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:E.filter(z=>z.type==="workflow").map(z=>z.name),domain:E.filter(z=>z.type==="domain").map(z=>z.name)},sources:G},mt=await Km(Ue,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 C=Date.now()-n,I=await this.recordSyncMetrics(a,Pe,E,C);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Oe.installGlobalConfig(),await Oe.syncCommands();let ye;try{let z=await R.readConfig(this.projectPath);ye=await xg.verify(this.projectPath,this.globalPath,z?.verification)}catch(z){L.debug("Verification failed (non-critical)",{error:V(z)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:E,skills:v,skillsInstalled:$,contextFiles:Pe,aiTools:mt.map(z=>({toolId:z.toolId,outputFile:z.outputFile,success:z.success})),syncMetrics:I,verification:ye,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:V(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Xt.mkdir(Un.join(this.globalPath,t),{recursive:!0})))}async generateContextFiles(e,t,n,s,o){return new ai({projectId:this.projectId,projectPath:this.projectPath,globalPath:this.globalPath}).generate(e,t,n,s,o)}async updateProjectJson(e,t){let n=Un.join(this.globalPath,"project.json"),s={};try{s=JSON.parse(await Xt.readFile(n,"utf-8"))}catch(i){L.debug("No existing project.json",{path:n,error:V(i)})}let o={...s,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:s.createdAt||k(),lastSync:k(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};await Xt.writeFile(n,JSON.stringify(o,null,2),"utf-8")}async updateStateJson(e,t){let n=Un.join(this.globalPath,"storage","state.json"),s={};try{s=JSON.parse(await Xt.readFile(n,"utf-8"))}catch(o){L.debug("No existing state.json",{path:n,error:V(o)})}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=k(),s.lastUpdated=k(),s.context={...s.context||{},lastSession:k(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await Xt.writeFile(n,JSON.stringify(s,null,2),"utf-8");try{await Zm.generate(this.projectPath,s)}catch(o){L.debug("Local state generation failed (optional)",{error:V(o)})}}async logToMemory(e,t){let n=Un.join(this.globalPath,"memory","events.jsonl"),s={ts:k(),action:"sync",branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits};await Xt.appendFile(n,`${JSON.stringify(s)}
1210
- `,"utf-8")}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let d=Un.join(this.globalPath,m),g=await Xt.readFile(d,"utf-8");i+=g.length}catch(d){L.debug("Context file not found for metrics",{file:m,error:V(d)})}for(let m of n)try{let d=Un.join(this.globalPath,"agents",`${m.name}.md`),g=await Xt.readFile(d,"utf-8");i+=g.length}catch(d){L.debug("Agent file not found for metrics",{agent:m.name,error:V(d)})}let a=Math.floor(i/4),u=e.fileCount*500,p=u>0?Math.max(0,(u-a)/u):0;try{await yn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){L.debug("Failed to record sync metrics",{error:V(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:p}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await ne.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 $t.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:k(),status:"draft",commitHash:s??void 0})}catch(s){L.debug("Failed to save draft analysis (non-critical)",{error:V(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([wn.archiveOldShipped(this.projectId).catch(()=>0),zt.markDormantIdeas(this.projectId).catch(()=>0),Ge.removeStaleCompleted(this.projectId).catch(()=>0),ne.archiveStalePausedTasks(this.projectId).catch(()=>[]),ze.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){L.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=Ze.getStats(this.projectId);L.debug("Archive stats",a)}}catch(e){L.debug("Archival failed (non-critical)",{error:V(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await ne.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Cn,n=await yc.learnFromTaskHistory(this.projectId,e,t);try{let s=await td.getFeatureOutcomes(this.projectId);s.length>0&&await yc.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&L.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){L.debug("Auto-learning failed (non-critical)",{error:V(e)})}}async getCliVersion(){try{let e=Un.join(__dirname,"..","..","package.json");return JSON.parse(await Xt.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return L.debug("Failed to read CLI version",{error:V(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:[]}}},kr=new pi});var pn=w(()=>{"use strict";Mp();Hp();Gp();Jp();Bp();oc();qp();uc();pc();Kp();Pm();Em();Eg()});import Yt from"chalk";function Ag(r){return Math.ceil(r.length/PC)}function Ig(r){let e=r.split(`
1208
+ `}function pg(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:b(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return pt.writeFile(st.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:V(o)})}),n}async function dg(r){let e=[];try{let t=st.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await pt.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 p of u.packages)i.push({pkg:p,agent:c.name})}if(i.length===0)return e;let a=st.join(iC.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let p=c.split("/").pop()||c,m=st.join(a,p,"SKILL.md"),d=st.join(a,`${p}.md`),g=!1;try{await pt.access(m),g=!0}catch{try{await pt.access(d),g=!0}catch{}}if(g){e.push({name:p,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let v=await ig.install(k);v.installed.length>0?(e.push({name:p,agent:u,status:"installed"}),H.info(`Installed skill: ${p} for agent: ${u}`)):v.errors.length>0?(e.push({name:p,agent:u,status:"error"}),H.debug(`Failed to install skill ${p}`,{errors:v.errors})):e.push({name:p,agent:u,status:"skipped"})}catch(f){e.push({name:p,agent:u,status:"error"}),H.debug(`Skill install error for ${p}`,{error:V(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:V(t)})}return e}var mg=w(()=>{"use strict";ps();zt();Q();Yn();ag();l(cg,"generateAgents");l(lg,"loadExistingAgents");l(ug,"resolveTemplateIncludes");l(aC,"generateWorkflowAgent");l(cC,"generateDomainAgent");l(lC,"injectFeedbackSection");l(uC,"generateMinimalWorkflowAgent");l(pC,"generateMinimalDomainAgent");l(pg,"configureSkills");l(dg,"autoInstallSkills")});import gg from"node:fs/promises";import fg from"node:path";var li,hg=w(()=>{"use strict";li=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=fg.join(this.projectPath,"package.json"),t=await gg.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await gg.access(fg.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as dC}from"node:child_process";import yg from"node:fs/promises";import bl from"node:path";import{promisify as mC}from"node:util";async function wg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Nn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Nn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Nn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Nn("git status --porcelain",{cwd:r}),i=o.trim().split(`
1209
+ `).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let p=u.substring(0,2),m=u.substring(3);p.startsWith("A")||p.startsWith("M ")?e.stagedFiles.push(m):p.includes("M")?e.modifiedFiles.push(m):p.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await Nn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
1210
+ `).filter(Boolean).map(u=>{let[p,m,d]=u.split("|");return{hash:p,message:m,date:d}});let{stdout:c}=await Nn('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:V(t)})}return e}async function Lt(r,e){try{return await yg.access(bl.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:V(t)}),!1}}async function Sg(r){let e={fileCount:0,version:"0.0.0",name:bl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Nn('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:V(t)}),e.fileCount=0}try{let t=bl.join(r,"package.json"),n=JSON.parse(await yg.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 Lt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:V(t)})}return await Lt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Lt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Lt(r,"requirements.txt")||await Lt(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 kg(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 Lt(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 Lt(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 Lt(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 Lt(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 Lt(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 bg(r,e){let t=Kt(),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 Pg(r){return new li(r).detect()}var Nn,Cg=w(()=>{"use strict";zt();oi();Yn();hg();Nn=mC(dC);l(wg,"analyzeGit");l(Lt,"fileExists");l(Sg,"gatherStats");l(kg,"detectCommands");l(bg,"buildSources");l(Pg,"detectStack")});import{exec as gC}from"node:child_process";import ui from"node:fs/promises";import pi from"node:path";import{promisify as fC}from"node:util";var hC,Pl,Cl,vg,xg=w(()=>{"use strict";M();hC=fC(gC),Pl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=pi.join(r,s);try{await ui.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=["storage/state.json"],n=[];for(let s of t){let o=pi.join(r,s);try{let i=await ui.readFile(o,"utf-8");JSON.parse(i)}catch(i){S(i)||n.push(`${s}: ${i instanceof SyntaxError?"invalid JSON":"read error"}`)}}return{name:"JSON files valid",passed:n.length===0,output:n.length===0?`${t.length} files validated`:void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=pi.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 ui.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await ui.readFile(pi.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(!S(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(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}}},Cl=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Pl.contextFilesExist(t),Pl.jsonFilesValid(t),Pl.noSensitiveData(t)];for(let d of c){let g=await d;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(d=>d.passed))&&n?.checks)for(let d of n.checks){if(d.enabled===!1){a++;continue}let g=await this.runCustomCheck(d,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(d)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let p=o.filter(d=>!d.passed).length,m=o.filter(d=>d.passed).length;return{passed:p===0,checks:o,totalMs:Date.now()-s,failedCount:p,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 hC(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}}}},vg=new Cl});import yr from"node:fs/promises";import wr from"node:path";var di,Sr,Tg=w(()=>{"use strict";as();jm();_m();Um();Jm();tl();zt();En();ct();K();Vr();rn();at();Zr();no();fa();so();ro();oo();Xm();Q();Yn();hc();yc();Ym();Zm();cc();mg();Cg();xg();di=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 ai(e)).filter(i=>!gr.includes(i));s=[...gr,...o]}else t.aiTools[0]==="auto"?(s=await ai(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Vm("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=P.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await ga(this.projectId);try{let N=await hp(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:V(N)})}let[i,a,c,u]=await Promise.all([wg(this.projectPath),Sg(this.projectPath),kg(this.projectPath),Pg(this.projectPath)]),p=t.full===!0,m,d=!0,g=!0,f=new Set;if(!p&&Lm(this.projectId))try{let{diff:N,currentHashes:wf}=await rl(this.projectPath,this.projectId),Vl=N.added.length+N.modified.length+N.deleted.length;if(Vl===0&&!t.changedFiles?.length)d=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Ri=Fm(N,this.projectId);f=Om(Ri.allAffected);let Sf=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);d=Ri.allAffected.some(gn=>{let kf=gn.substring(gn.lastIndexOf("."));return Sf.has(kf)}),g=Ri.directlyChanged.some(gn=>gn==="package.json"||gn==="tsconfig.json"||gn.includes("Dockerfile")||gn.includes("docker-compose")),m={isIncremental:!0,filesChanged:Vl,filesUnchanged:N.unchanged.length,indexesRebuilt:d,agentsRegenerated:g,affectedDomains:Array.from(f)}}sl(this.projectId,wf)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:V(N)})}else try{let{currentHashes:N}=await rl(this.projectPath,this.projectId);sl(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:V(N)})}if(d)try{await Promise.all([Im(this.projectPath,this.projectId),Mm(this.projectPath,this.projectId),zm(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:V(N)})}let k;if(g)try{let N=await X.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(k=N)}catch{}let v=g?await cg(this.globalPath,u,a,k):await lg(this.globalPath),x=pg(v,this.projectId,this.globalPath),$=g?await dg(v):[],J=bg(a,c),Pe=await this.generateContextFiles(i,a,c,v,J),Ge={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:v.filter(N=>N.type==="workflow").map(N=>N.name),domain:v.filter(N=>N.type==="domain").map(N=>N.name)},sources:J},gt=await qm(Ge,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 C=Date.now()-n,I=await this.recordSyncMetrics(a,Pe,v,C);await this.archiveStaleData(),await this.autoLearnFromHistory(),await _e.installGlobalConfig(),await _e.syncCommands();let we;try{let N=await R.readConfig(this.projectPath);we=await vg.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:V(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:v,skills:x,skillsInstalled:$,contextFiles:Pe,aiTools:gt.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:I,verification:we,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:V(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>yr.mkdir(wr.join(this.globalPath,t),{recursive:!0})))}async generateContextFiles(e,t,n,s,o){return new ci({projectId:this.projectId,projectPath:this.projectPath,globalPath:this.globalPath}).generate(e,t,n,s,o)}async updateProjectJson(e,t){let n=F.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||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};F.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await X.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=b(),s.lastUpdated=b(),s.context={...s.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await X.write(this.projectId,s);try{await Qm.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:V(o)})}}async logToMemory(e,t){let n=wr.join(this.globalPath,"memory","events.jsonl"),s={ts:b(),action:"sync",branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits};await yr.appendFile(n,`${JSON.stringify(s)}
1211
+ `,"utf-8")}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let d=wr.join(this.globalPath,m),g=await yr.readFile(d,"utf-8");i+=g.length}catch(d){H.debug("Context file not found for metrics",{file:m,error:V(d)})}for(let m of n)try{let d=wr.join(this.globalPath,"agents",`${m.name}.md`),g=await yr.readFile(d,"utf-8");i+=g.length}catch(d){H.debug("Agent file not found for metrics",{agent:m.name,error:V(d)})}let a=Math.floor(i/4),u=e.fileCount*500,p=u>0?Math.max(0,(u-a)/u):0;try{await yn.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:V(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:p}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await X.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 Mt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:b(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:V(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Wt.archiveOldShipped(this.projectId).catch(()=>0),kt.markDormantIdeas(this.projectId).catch(()=>0),Oe.removeStaleCompleted(this.projectId).catch(()=>0),X.archiveStalePausedTasks(this.projectId).catch(()=>[]),Je.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=Ze.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:V(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await X.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Cn,n=await fc.learnFromTaskHistory(this.projectId,e,t);try{let s=await ed.getFeatureOutcomes(this.projectId);s.length>0&&await fc.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:V(e)})}}async getCliVersion(){try{let e=wr.join(__dirname,"..","..","package.json");return JSON.parse(await yr.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:V(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:[]}}},Sr=new di});var pn=w(()=>{"use strict";$p();Up();Hp();zp();Wp();sc();Vp();cc();lc();qp();bm();Tm();Tg()});import Yt from"chalk";function Eg(r){return Math.ceil(r.length/yC)}function Ag(r){let e=r.split(`
1211
1212
  `),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+=`
1212
- ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.includes("<!-- prjct:preserve")}function jg(r,e){let t=Ig(r),n=Ig(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Ag(r),tokensAfter:Ag(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)xl(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1213
- `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(xl(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1213
+ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function vl(r){return r.includes("<!-- prjct:preserve")}function Ig(r,e){let t=Ag(r),n=Ag(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Eg(r),tokensAfter:Eg(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)vl(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
1214
+ `).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(vl(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
1214
1215
  `).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
1215
- `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!xl(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1216
- `).length}),s.hasChanges=!0)}return s}function Dg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Yt.green:d=>d,o=t?Yt.red:d=>d,i=t?Yt.yellow:d=>d,a=t?Yt.dim:d=>d,c=t?Yt.bold:d=>d;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1216
+ `).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!vl(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
1217
+ `).length}),s.hasChanges=!0)}return s}function jg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Yt.green:d=>d,o=t?Yt.red:d=>d,i=t?Yt.yellow:d=>d,a=t?Yt.dim:d=>d,c=t?Yt.bold:d=>d;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
1217
1218
  `);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let d of r.added)n.push(s(`+ \u2502 + ${d.name} (new)`));if(r.modified.length>0)for(let d of r.modified)n.push(i(`~ \u2502 ${d.name} (modified)`));if(r.removed.length>0)for(let d of r.removed)n.push(o(`- \u2502 - ${d.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let d of r.preserved)n.push(a(` \u2502 \u2713 ${d.name} (${d.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 p=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(p+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
1218
- `)}function Rg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Yt.green:c=>c,o=t?Yt.red:c=>c,i=t?Yt.cyan:c=>c,a=t?Yt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1219
+ `)}function Dg(r,e={}){let{colorize:t=!0}=e,n=[],s=t?Yt.green:c=>c,o=t?Yt.red:c=>c,i=t?Yt.cyan:c=>c,a=t?Yt.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
1219
1220
  `))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(`
1220
1221
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1221
1222
  `).length>5&&n.push(a(` ... ${c.before.split(`
@@ -1226,11 +1227,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.incl
1226
1227
  `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1227
1228
  `).length>5&&n.push(a(` ... ${c.before.split(`
1228
1229
  `).length-5} more lines`))}n.push("")}return n.join(`
1229
- `)}var PC,$g=w(()=>{"use strict";PC=4;l(Ag,"estimateTokens");l(Ig,"parseMarkdownSections");l(xl,"isPreservedSection");l(jg,"generateSyncDiff");l(Dg,"formatDiffPreview");l(Rg,"formatFullDiff")});import CC from"node:path";async function Tl(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(d=>d.success).length||0),s=r.agents.length,o=r.agents.filter(d=>d.type==="domain").length;await Oe.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(`
1230
- `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let p=r.aiTools?.filter(d=>d.success)||[];if(p.length>0&&u.push(`AI tools: ${p.map(d=>d.toolId).join(", ")}`),s>0){let d=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(d)}if(r.skills.length>0){let d=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${d}`)}let m=r.skillsInstalled?.filter(d=>d.status==="installed")||[];if(m.length>0){let d=m.length===1?"skill":"skills";u.push(`${m.length} ${d} 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 d=r.verification;if(d.passed){let g=d.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=d.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),d.skippedCount>0&&h.warn(`${d.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return nt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Mg(r){try{let e=await ze.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(p=>new Date(p.timestamp||p.ts).getTime()).filter(p=>!Number.isNaN(p)).sort((p,m)=>p-m);if(u.length>=2){let p=u[u.length-1]-u[0];s=N.formatDuration(p)}}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 p of u.subagents)a.set(p,(a.get(p)||0)+1);let c=Array.from(a.entries()).map(([u,p])=>({name:u,count:p})).sort((u,p)=>p.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function br(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function El(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Fg(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 Og(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 | ${br(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ns(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 | ${El(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: ${br(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(`
1231
- `)}function _g(r,e){let t=[];t.push(`# Repository Analysis
1230
+ `)}var yC,Rg=w(()=>{"use strict";yC=4;l(Eg,"estimateTokens");l(Ag,"parseMarkdownSections");l(vl,"isPreservedSection");l(Ig,"generateSyncDiff");l(jg,"formatDiffPreview");l(Dg,"formatFullDiff")});import wC from"node:path";async function xl(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(d=>d.success).length||0),s=r.agents.length,o=r.agents.filter(d=>d.type==="domain").length;await _e.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(`
1231
+ `));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let p=r.aiTools?.filter(d=>d.success)||[];if(p.length>0&&u.push(`AI tools: ${p.map(d=>d.toolId).join(", ")}`),s>0){let d=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(d)}if(r.skills.length>0){let d=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${d}`)}let m=r.skillsInstalled?.filter(d=>d.status==="installed")||[];if(m.length>0){let d=m.length===1?"skill":"skills";u.push(`${m.length} ${d} 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 d=r.verification;if(d.passed){let g=d.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=d.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),d.skippedCount>0&&h.warn(`${d.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return nt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function $g(r){try{let e=await Je.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(p=>new Date(p.timestamp||p.ts).getTime()).filter(p=>!Number.isNaN(p)).sort((p,m)=>p-m);if(u.length>=2){let p=u[u.length-1]-u[0];s=U.formatDuration(p)}}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 p of u.subagents)a.set(p,(a.get(p)||0)+1);let c=Array.from(a.entries()).map(([u,p])=>({name:u,count:p})).sort((u,p)=>p.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function kr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function Tl(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Mg(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 Fg(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 | ${kr(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${es(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 | ${Tl(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: ${kr(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(`
1232
+ `)}function Og(r,e){let t=[];t.push(`# Repository Analysis
1232
1233
  `),t.push(`Generated: ${new Date().toLocaleString()}
1233
- `);let n=CC.basename(e);if(t.push(`## Project: ${n}
1234
+ `);let n=wC.basename(e);if(t.push(`## Project: ${n}
1234
1235
  `),t.push(`## Stack Detected
1235
1236
  `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1236
1237
  `),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
@@ -1246,34 +1247,34 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xl(r){return r.incl
1246
1247
  `).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,p]=a.split("|");t.push(`- \`${c}\` ${p} (${u})`)}}),t.push("")),t.push(`## Recommendations
1247
1248
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1248
1249
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1249
- `)}var Ng=w(()=>{"use strict";En();no();pn();cr();ys();Le();l(Tl,"showSyncResult");l(Mg,"getSessionActivity");l(br,"formatTokens");l(El,"formatDuration");l(Fg,"generateSparkline");l(Og,"generateStatsMarkdown");l(_g,"generateAnalysisSummary")});var bm={};fn(bm,{AnalysisCommands:()=>Hn});import Pr from"node:fs/promises";import Al from"node:path";import Lg from"prompts";var Hn,Zo=w(()=>{"use strict";Pp();ls();Tp();En();no();pn();$g();Kr();so();M();ys();Ng();Le();Hn=class extends ue{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1250
- `),Ie.init(t);let n=await We.build(t,e),s={packageJson:await Ie.readPackageJson(),cargoToml:await Ie.readCargoToml(),goMod:await Ie.readGoMod(),requirements:await Ie.readRequirements(),directories:await Ie.listDirectories(),fileCount:await Ie.countFiles(),gitStats:await Ie.getGitStats(),gitLog:await Ie.getGitLog(20),hasDockerfile:await Ie.fileExists("Dockerfile"),hasDockerCompose:await Ie.fileExists("docker-compose.yml"),hasReadme:await Ie.fileExists("README.md"),hasTsconfig:await Ie.fileExists("tsconfig.json"),hasViteConfig:await Ie.fileExists("vite.config.ts")||await Ie.fileExists("vite.config.js"),hasNextConfig:await Ie.fileExists("next.config.js")||await Ie.fileExists("next.config.mjs")},o=_g(s,t),i=await R.getProjectId(t),a=n.paths.analysis||P.getFilePath(i,"analysis","repo-summary.md");await je.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:N.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits}),await bp(i,t);let u=await(He(),ot(Qe)).getActiveProvider(),p=await Oe.installGlobalConfig();return p.success&&console.log(`\u{1F4DD} Updated ${P.getDisplayPath(p.path)}`),console.log(`\u2705 Analysis complete!
1250
+ `)}var _g=w(()=>{"use strict";En();to();pn();or();fs();He();l(xl,"showSyncResult");l($g,"getSessionActivity");l(kr,"formatTokens");l(Tl,"formatDuration");l(Mg,"generateSparkline");l(Fg,"generateStatsMarkdown");l(Og,"generateAnalysisSummary")});var km={};fn(km,{AnalysisCommands:()=>Ln});import br from"node:fs/promises";import El from"node:path";import Ng from"prompts";var Ln,ei=w(()=>{"use strict";bp();as();xp();En();to();pn();Rg();Vr();no();M();fs();_g();He();Ln=class extends pe{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1251
+ `),Ie.init(t);let n=await Be.build(t,e),s={packageJson:await Ie.readPackageJson(),cargoToml:await Ie.readCargoToml(),goMod:await Ie.readGoMod(),requirements:await Ie.readRequirements(),directories:await Ie.listDirectories(),fileCount:await Ie.countFiles(),gitStats:await Ie.getGitStats(),gitLog:await Ie.getGitLog(20),hasDockerfile:await Ie.fileExists("Dockerfile"),hasDockerCompose:await Ie.fileExists("docker-compose.yml"),hasReadme:await Ie.fileExists("README.md"),hasTsconfig:await Ie.fileExists("tsconfig.json"),hasViteConfig:await Ie.fileExists("vite.config.ts")||await Ie.fileExists("vite.config.js"),hasNextConfig:await Ie.fileExists("next.config.js")||await Ie.fileExists("next.config.mjs")},o=Og(s,t),i=await R.getProjectId(t),a=n.paths.analysis||P.getFilePath(i,"analysis","repo-summary.md");await je.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:U.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits}),await kp(i,t);let u=await(ze(),ot(Qe)).getActiveProvider(),p=await _e.installGlobalConfig();return p.success&&console.log(`\u{1F4DD} Updated ${P.getDisplayPath(p.path)}`),console.log(`\u2705 Analysis complete!
1251
1252
  `),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
1252
- `),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:",y(n)),{success:!1,error:y(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=P.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await P.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let d=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!d){let f=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await kr.sync(e,{aiTools:t.aiTools,packagePath:d.path,packageName:d.name});return t.json?console.log(JSON.stringify({success:g.success,package:d.name,path:d.relativePath})):h.done(`Synced package: ${d.name}`),{success:g.success}}let a=Al.join(o,"context","CLAUDE.md"),c=null;try{c=await Pr.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await kr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return 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 d;try{d=await Pr.readFile(a,"utf-8")}catch{d=""}let g=jg(c,d);if(u||h.stop(),!g.hasChanges)return 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 Pr.writeFile(a,c,"utf-8")},"restoreOriginal");if(u){await f();let E={added:g.added.map(v=>({name:v.name,lineCount:v.lineCount})),modified:g.modified.map(v=>({name:v.name,lineCount:v.lineCount})),removed:g.removed.map(v=>({name:v.name,lineCount:v.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:E,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(Dg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Lg({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 b.action==="cancel"||!b.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):b.action==="diff"&&(console.log(`
1253
- ${Rg(g)}`),!(await Lg({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"),Tl(m,i))}h.spin("Syncing project...");let p=await kr.sync(e,{aiTools:t.aiTools,full:t.full});return p.success?(h.stop(),Tl(p,i)):(h.fail(p.error||"Sync failed"),{success:!1,error:p.error})}catch(n){return h.fail(y(n)),{success:!1,error:y(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 yn.getSummary(s),i=await yn.getDailyStats(s,30),a=await Mg(s),c=await ce.getPatternsSummary(s);if(t.json){let g={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(g,null,2)),{success:!0,data:g}}let u=P.getGlobalProjectPath(s),p="Unknown";try{p=JSON.parse(await Pr.readFile(Al.join(u,"project.json"),"utf-8")).name||"Unknown"}catch{}let m=await yn.read(s),d=m.firstSync?new Date(m.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: ${p.padEnd(20).slice(0,20)} | Since: ${d.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 g=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${g}`)}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: ${br(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ns(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${El(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let g=o.topAgents.reduce((f,b)=>f+b.usageCount,0);for(let f of o.topAgents){let b=g>0?(f.usageCount/g*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${b}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let g=Fg(i);if(console.log(` ${g} ${br(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",b=o.trend>0?"+":"";console.log(` ${f} ${b}${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 g=Og(o,i,p,d,a,c);return console.log(g),{success:!0,data:{markdown:g}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(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=gr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await $t.getStatus(s);return t.json?(console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}}):(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=y(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 $t.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=y(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 $t.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=y(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=P.getGlobalProjectPath(s),i=e;try{i=JSON.parse(await Pr.readFile(Al.join(o,"project.json"),"utf-8")).repoPath||e}catch{}let a=await $t.semanticVerify(s,i);if(t.json)return console.log(JSON.stringify(a)),{success:a.passed,data:a};console.log(""),a.passed?(h.done("Semantic verification passed"),console.log(` ${a.passedCount}/${a.checks.length} checks passed (${a.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${a.failedCount}/${a.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let c of a.checks){let u=c.passed?"\u2713":"\u2717",p=c.passed?`${c.output} (${c.durationMs}ms)`:c.error||"Failed";console.log(` ${u} ${c.name}: ${p}`)}return console.log(""),{success:a.passed,data:a}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as HC}from"node:child_process";import{promisify as GC}from"node:util";async function ki(r){if(process.platform!=="darwin")return Xg(r);try{let{stdout:e}=await zC(`security find-generic-password -s "${JC}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Xg(r)}}function Xg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var zC,JC,Hl=w(()=>{"use strict";M();zC=GC(HC),JC="prjct-cli";l(ki,"getCredential");l(Xg,"getEnvFallback")});import dt from"node:fs";import{createServer as Av}from"node:net";Mi();Zo();pn();Mt();M();Le();import vC from"node:path";at();K();M();Y();var di=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:P.getGlobalProjectPath(t),timestamp:k()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:k()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(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:k()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:k()};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()}},_=new di;var bs=class extends ue{static{l(this,"AnalyticsCommands")}async dash(e="default",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=vC.basename(t),i=await ne.getCurrentTask(s),a=await Ge.getActiveTasks(s),c=await wn.getRecent(s,5),u=await zt.getPending(s);if(e==="compact"){let g=i?`\u{1F3AF} ${i.description.slice(0,30)}`:"\u{1F4A4} idle",f=`\u{1F4CB} ${a.length}`,b=`\u{1F680} ${c.length}`;return h.done(`${g} | ${f} | ${b}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let g=e==="week"?7:30,f=N.getDaysAgo(g),b=P.getFilePath(s,"memory","context.jsonl"),E=[];try{E=(await kt.readJsonLines(b)).filter(Pe=>new Date(Pe.timestamp)>=f)}catch{E=[]}let v={tasksCompleted:E.filter(G=>G.action==="task_completed").length,featuresShipped:E.filter(G=>G.action==="feature_shipped").length,totalActions:E.length};console.log(`
1253
+ `),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:",y(n)),{success:!1,error:y(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=P.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await P.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let d=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!d){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await Sr.sync(e,{aiTools:t.aiTools,packagePath:d.path,packageName:d.name});return t.json?console.log(JSON.stringify({success:g.success,package:d.name,path:d.relativePath})):h.done(`Synced package: ${d.name}`),{success:g.success}}let a=El.join(o,"context","CLAUDE.md"),c=null;try{c=await br.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await Sr.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return 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 d;try{d=await br.readFile(a,"utf-8")}catch{d=""}let g=Ig(c,d);if(u||h.stop(),!g.hasChanges)return 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 br.writeFile(a,c,"utf-8")},"restoreOriginal");if(u){await f();let v={added:g.added.map(x=>({name:x.name,lineCount:x.lineCount})),modified:g.modified.map(x=>({name:x.name,lineCount:x.lineCount})),removed:g.removed.map(x=>({name:x.name,lineCount:x.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:v,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(jg(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await Ng({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(`
1254
+ ${Dg(g)}`),!(await Ng({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"),xl(m,i))}h.spin("Syncing project...");let p=await Sr.sync(e,{aiTools:t.aiTools,full:t.full});return p.success?(h.stop(),xl(p,i)):(h.fail(p.error||"Sync failed"),{success:!1,error:p.error})}catch(n){return h.fail(y(n)),{success:!1,error:y(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 yn.getSummary(s),i=await yn.getDailyStats(s,30),a=await $g(s),c=await le.getPatternsSummary(s);if(t.json){let g={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(g,null,2)),{success:!0,data:g}}let u=P.getGlobalProjectPath(s),p="Unknown";try{p=JSON.parse(await br.readFile(El.join(u,"project.json"),"utf-8")).name||"Unknown"}catch{}let m=await yn.read(s),d=m.firstSync?new Date(m.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: ${p.padEnd(20).slice(0,20)} | Since: ${d.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 g=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${g}`)}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: ${kr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${es(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Tl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let g=o.topAgents.reduce((f,k)=>f+k.usageCount,0);for(let f of o.topAgents){let k=g>0?(f.usageCount/g*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${k}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let g=Mg(i);if(console.log(` ${g} ${kr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",k=o.trend>0?"+":"";console.log(` ${f} ${k}${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 g=Fg(o,i,p,d,a,c);return console.log(g),{success:!0,data:{markdown:g}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(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=pr(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Mt.getStatus(s);return t.json?(console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}}):(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=y(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 Mt.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=y(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 Mt.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=y(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=P.getGlobalProjectPath(s),i=e;try{i=JSON.parse(await br.readFile(El.join(o,"project.json"),"utf-8")).repoPath||e}catch{}let a=await Mt.semanticVerify(s,i);if(t.json)return console.log(JSON.stringify(a)),{success:a.passed,data:a};console.log(""),a.passed?(h.done("Semantic verification passed"),console.log(` ${a.passedCount}/${a.checks.length} checks passed (${a.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${a.failedCount}/${a.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let c of a.checks){let u=c.passed?"\u2713":"\u2717",p=c.passed?`${c.output} (${c.durationMs}ms)`:c.error||"Failed";console.log(` ${u} ${c.name}: ${p}`)}return console.log(""),{success:a.passed,data:a}}catch(n){let s=y(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});import{exec as OC}from"node:child_process";import{promisify as _C}from"node:util";async function bi(r){if(process.platform!=="darwin")return Kg(r);try{let{stdout:e}=await NC(`security find-generic-password -s "${LC}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Kg(r)}}function Kg(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var NC,LC,Ul=w(()=>{"use strict";M();NC=_C(OC),LC="prjct-cli";l(bi,"getCredential");l(Kg,"getEnvFallback")});import mt from"node:fs";import{createServer as Pv}from"node:net";Fi();ei();pn();Ft();M();He();import SC from"node:path";ct();K();M();Q();var mi=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:P.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:b()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:y(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:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:b()};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()}},L=new mi;var Ss=class extends pe{static{l(this,"AnalyticsCommands")}async dash(e="default",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=SC.basename(t),i=await X.getCurrentTask(s),a=await Oe.getActiveTasks(s),c=await Wt.getRecent(s,5),u=await kt.getPending(s);if(e==="compact"){let g=i?`\u{1F3AF} ${i.description.slice(0,30)}`:"\u{1F4A4} idle",f=`\u{1F4CB} ${a.length}`,k=`\u{1F680} ${c.length}`;return h.done(`${g} | ${f} | ${k}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let g=e==="week"?7:30,f=U.getDaysAgo(g),k=P.getFilePath(s,"memory","context.jsonl"),v=[];try{v=(await Pt.readJsonLines(k)).filter(Pe=>new Date(Pe.timestamp)>=f)}catch{v=[]}let x={tasksCompleted:v.filter(J=>J.action==="task_completed").length,featuresShipped:v.filter(J=>J.action==="feature_shipped").length,totalActions:v.length};console.log(`
1254
1255
  \u{1F4CA} ${e.toUpperCase()} PROGRESS - ${o}
1255
- `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${v.tasksCompleted}`),console.log(` Features shipped: ${v.featuresShipped}`),console.log(` Total actions: ${v.totalActions}`),console.log("\u2550".repeat(50));let $=this._generateSparkline(E,g);return console.log(`
1256
+ `),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${x.tasksCompleted}`),console.log(` Features shipped: ${x.featuresShipped}`),console.log(` Total actions: ${x.totalActions}`),console.log("\u2550".repeat(50));let $=this._generateSparkline(v,g);return console.log(`
1256
1257
  Activity: ${$}
1257
- `),{success:!0,view:e,metrics:v}}if(e==="roadmap"){let g=await We.build(t),f=await je.get("Read")(g.paths.roadmap);if(console.log(`
1258
+ `),{success:!0,view:e,metrics:x}}if(e==="roadmap"){let g=await Be.build(t),f=await je.get("Read")(g.paths.roadmap);if(console.log(`
1258
1259
  \u{1F5FA}\uFE0F ROADMAP - ${o}
1259
1260
  `),console.log("\u2550".repeat(50)),!f||f.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
1260
- `);else{let b=f.split("##").filter(E=>E.trim()&&!E.includes("ROADMAP"));b.slice(0,5).forEach((E,v)=>{let $=E.split(`
1261
- `)[0].trim();console.log(` ${v+1}. ${$}`)}),b.length>5&&console.log(` ... and ${b.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1261
+ `);else{let k=f.split("##").filter(v=>v.trim()&&!v.includes("ROADMAP"));k.slice(0,5).forEach((v,x)=>{let $=v.split(`
1262
+ `)[0].trim();console.log(` ${x+1}. ${$}`)}),k.length>5&&console.log(` ... and ${k.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
1262
1263
  `),{success:!0,view:"roadmap"}}console.log(`
1263
1264
  \u{1F4CA} DASHBOARD - ${o}
1264
- `),console.log("\u2550".repeat(50));let p=gr(t),m=await p.check(s),d=p.getWarning(m);if(d&&console.log(`
1265
+ `),console.log("\u2550".repeat(50));let p=pr(t),m=await p.check(s),d=p.getWarning(m);if(d&&console.log(`
1265
1266
  ${d}`),console.log(`
1266
- \u{1F3AF} CURRENT FOCUS`),i){if(console.log(` ${i.description}`),i.startedAt){let g=N.calculateDuration(new Date(i.startedAt));console.log(` Started: ${g} ago`)}}else console.log(" No active task. Use /p:work to start.");return console.log(`
1267
- \u{1F4CB} QUEUE`),a.length===0?console.log(" Queue is empty"):(a.slice(0,3).forEach((g,f)=>{let b=g.priority?`[${g.priority}]`:"";console.log(` ${f+1}. ${g.description.slice(0,40)} ${b}`)}),a.length>3&&console.log(` ... and ${a.length-3} more`)),console.log(`
1267
+ \u{1F3AF} CURRENT FOCUS`),i){if(console.log(` ${i.description}`),i.startedAt){let g=U.calculateDuration(new Date(i.startedAt));console.log(` Started: ${g} ago`)}}else console.log(" No active task. Use /p:work to start.");return console.log(`
1268
+ \u{1F4CB} QUEUE`),a.length===0?console.log(" Queue is empty"):(a.slice(0,3).forEach((g,f)=>{let k=g.priority?`[${g.priority}]`:"";console.log(` ${f+1}. ${g.description.slice(0,40)} ${k}`)}),a.length>3&&console.log(` ... and ${a.length-3} more`)),console.log(`
1268
1269
  \u{1F680} RECENT SHIPS`),c.length===0?console.log(" Nothing shipped yet"):c.slice(0,3).forEach(g=>{let f=g.shippedAt?new Date(g.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${g.name} ${f?`(${f})`:""}`)}),console.log(`
1269
1270
  \u{1F4A1} IDEAS`),console.log(` ${u.length} pending ideas`),console.log(`
1270
1271
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
1271
- `),await this.logToMemory(t,"dash_viewed",{view:e,timestamp:N.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:i?.description||null,queueCount:a.length,shippedCount:c.length,ideasCount:u.length}}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1272
+ `),await this.logToMemory(t,"dash_viewed",{view:e,timestamp:U.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:i?.description||null,queueCount:a.length,shippedCount:c.length,ideasCount:u.length}}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
1272
1273
  PRJCT COMMANDS
1273
- `),console.log("=".repeat(50));let i=_.getAllCategories(),a=_.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,p])=>{let m=i.get(u);console.log(`
1274
+ `),console.log("=".repeat(50));let i=L.getAllCategories(),a=L.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,p])=>{let m=i.get(u);console.log(`
1274
1275
  ${m?.title||u}:`),p.forEach(d=>{let g=d.params?` ${d.params}`:"";console.log(` ${d.name}${g}`),console.log(` ${d.description}`)})}),console.log(`
1275
1276
  ${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
1276
- `),{success:!0,topic:"overview"}}let n=_.getByName(e);if(n){if(console.log(`
1277
+ `),{success:!0,topic:"overview"}}let n=L.getByName(e);if(n){if(console.log(`
1277
1278
  \u{1F4DA} HELP: /p:${n.name}
1278
1279
  `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1279
1280
  Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
@@ -1283,7 +1284,7 @@ ${"\u2550".repeat(50)}
1283
1284
  \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1284
1285
  `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1285
1286
  \u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
1286
- `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(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)),p=new Date(c.setHours(23,59,59,999)),m=e.filter(d=>{let g=new Date(d.timestamp);return g>=u&&g<=p}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};Oc();at();K();Mt();M();import xC from"node:fs/promises";import TC from"node:path";var Gn=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=P.getGlobalProjectPath(a),u=await ne.read(a),p=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 zo.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let d=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:p,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:d?.ecosystem||"unknown",frameworks:d?.frameworks||[],hasTests:d?.hasTests||!1,technologies:d?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=TC.join(e,"analysis","repo-analysis.json"),n=await xC.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 S(t),null}}},D1=new Gn;Le();pn();Mt();M();Le();import EC from"node:path";async function mi(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0},n=[P.getFilePath(e,"memory","context.jsonl"),P.getFilePath(e,"progress","shipped.md"),P.getFilePath(e,"planning","ideas.md")];for(let s of n)try{let o=await kt.getFileSizeMB(s);o>0&&(t.totalSize+=o,await kt.rotateJsonLinesIfNeeded(s,10)&&(t.rotated.push(EC.basename(s)),t.freedSpace+=o))}catch(o){S(o)||console.error(`Cleanup warning for ${s}: ${y(o)}`)}return{success:!0,results:t}}l(mi,"cleanupMemory");async function gi(r){let e=await R.getProjectId(r),t=P.getFilePath(e,"memory","context.jsonl");await kt.rotateJsonLinesIfNeeded(t,10)}l(gi,"cleanupMemoryInternal");async function Il(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let i=await mi(e);return h.done("memory cleaned"),i}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=[],o=P.getFilePath(n,"memory","context.jsonl");try{let i=await kt.readJsonLines(o);if(i.length>100){let a=i.slice(-100);await kt.writeJsonLines(o,a),s.push(`Memory: ${i.length-100} old entries removed`)}else s.push("Memory: No cleanup needed")}catch(i){S(i)?s.push("Memory: No file found"):s.push(`Memory: Error - ${y(i)}`)}try{let i=await zt.cleanup(n);i.removed>0?s.push(`Ideas: ${i.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(i){S(i)?s.push("Ideas: No file found"):s.push(`Ideas: Error - ${y(i)}`)}try{let a=(await Ge.getActiveTasks(n)).filter(c=>c.completed).length;a>0?s.push(`Queue: ${a} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(i){S(i)?s.push("Queue: No file found"):s.push(`Queue: Error - ${y(i)}`)}return await gi(e),await ze.log(e,"cleanup_performed",{items:s.length,timestamp:N.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Il,"cleanup");pn();M();Le();import Ug from"node:path";async function jl(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=Ug.join(P.getGlobalProjectPath(i),"planning","designs");await te.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1287
+ `),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(y(n)),{success:!1,error:y(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)),p=new Date(c.setHours(23,59,59,999)),m=e.filter(d=>{let g=new Date(d.timestamp);return g>=u&&g<=p}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>n[Math.floor(a/i*(n.length-1))]).join("")}};Mc();ct();K();Ft();M();import kC from"node:fs/promises";import bC from"node:path";var Un=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=P.getGlobalProjectPath(a),u=await X.read(a),p=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 Jo.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let d=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:p,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:d?.ecosystem||"unknown",frameworks:d?.frameworks||[],hasTests:d?.hasTests||!1,technologies:d?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}async loadRepoAnalysis(e){try{let t=bC.join(e,"analysis","repo-analysis.json"),n=await kC.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 S(t),null}}},R1=new Un;He();pn();Ft();M();He();import PC from"node:path";async function gi(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0},n=[P.getFilePath(e,"memory","context.jsonl"),P.getFilePath(e,"progress","shipped.md"),P.getFilePath(e,"planning","ideas.md")];for(let s of n)try{let o=await Pt.getFileSizeMB(s);o>0&&(t.totalSize+=o,await Pt.rotateJsonLinesIfNeeded(s,10)&&(t.rotated.push(PC.basename(s)),t.freedSpace+=o))}catch(o){S(o)||console.error(`Cleanup warning for ${s}: ${y(o)}`)}return{success:!0,results:t}}l(gi,"cleanupMemory");async function fi(r){let e=await R.getProjectId(r),t=P.getFilePath(e,"memory","context.jsonl");await Pt.rotateJsonLinesIfNeeded(t,10)}l(fi,"cleanupMemoryInternal");async function Al(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let i=await gi(e);return h.done("memory cleaned"),i}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=[],o=P.getFilePath(n,"memory","context.jsonl");try{let i=await Pt.readJsonLines(o);if(i.length>100){let a=i.slice(-100);await Pt.writeJsonLines(o,a),s.push(`Memory: ${i.length-100} old entries removed`)}else s.push("Memory: No cleanup needed")}catch(i){S(i)?s.push("Memory: No file found"):s.push(`Memory: Error - ${y(i)}`)}try{let i=await kt.cleanup(n);i.removed>0?s.push(`Ideas: ${i.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(i){S(i)?s.push("Ideas: No file found"):s.push(`Ideas: Error - ${y(i)}`)}try{let a=(await Oe.getActiveTasks(n)).filter(c=>c.completed).length;a>0?s.push(`Queue: ${a} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(i){S(i)?s.push("Queue: No file found"):s.push(`Queue: Error - ${y(i)}`)}return await fi(e),await Je.log(e,"cleanup_performed",{items:s.length,timestamp:U.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Al,"cleanup");pn();M();He();import Lg from"node:path";async function Il(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=Lg.join(P.getGlobalProjectPath(i),"planning","designs");await ne.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
1287
1288
 
1288
1289
  *Use templates/design/architecture.md for full design*
1289
1290
  `;break;case"api":c=`# API Design: ${o}
@@ -1298,12 +1299,12 @@ ${"\u2550".repeat(50)}
1298
1299
  `;break;case"flow":c=`# Flow Design: ${o}
1299
1300
 
1300
1301
  *Use templates/design/flow.md for full design*
1301
- `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,p=Ug.join(a,u);return await te.writeFile(p,c),await ze.log(t,"design_created",{type:n,target:o,timestamp:N.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:p,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(jl,"design");pn();M();Le();import Ps from"node:path";async function Dl(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=P.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await te.readFile(t);n=JSON.parse(s)}catch(s){if(S(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(`
1302
+ `;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,p=Lg.join(a,u);return await ne.writeFile(p,c),await Je.log(t,"design_created",{type:n,target:o,timestamp:U.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:p,type:n,target:o}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}l(Il,"design");pn();M();He();import ks from"node:path";async function jl(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=P.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ne.readFile(t);n=JSON.parse(s)}catch(s){if(S(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(`
1302
1303
  Found abandoned session:
1303
- `),console.log(` Task: ${n.task}`),n.startedAt){let s=N.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1304
+ `),console.log(` Task: ${n.task}`),n.startedAt){let s=U.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
1304
1305
  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
1305
- `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Dl,"recover");async function Rl(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=Ps.join(P.getGlobalProjectPath(e),"snapshots");await te.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=Ps.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await te.readFile(a);c=JSON.parse(u)}catch(u){if(!S(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 te.writeFile(a,JSON.stringify(c,null,2)),await ze.log(r,"undo_performed",{snapshotId:i,timestamp:N.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:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Rl,"undo");async function $l(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=Ps.join(P.getGlobalProjectPath(e),"snapshots"),n=Ps.join(t,"history.json"),s;try{let i=await te.readFile(n);s=JSON.parse(i)}catch(i){if(S(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(`
1306
- `).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 te.writeFile(n,JSON.stringify(s,null,2)),await ze.log(r,"redo_performed",{timestamp:N.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:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l($l,"redo");async function Ml(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=Ps.join(P.getGlobalProjectPath(e),"snapshots"),n=Ps.join(t,"history.json"),s;try{let o=await te.readFile(n);s=JSON.parse(o)}catch(o){if(S(o)||o instanceof SyntaxError)return console.log(`
1306
+ `),{success:!0,session:n}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(jl,"recover");async function Dl(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=ks.join(P.getGlobalProjectPath(e),"snapshots");await ne.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=ks.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ne.readFile(a);c=JSON.parse(u)}catch(u){if(!S(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 ne.writeFile(a,JSON.stringify(c,null,2)),await Je.log(r,"undo_performed",{snapshotId:i,timestamp:U.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:y(s)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Dl,"undo");async function Rl(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=ks.join(P.getGlobalProjectPath(e),"snapshots"),n=ks.join(t,"history.json"),s;try{let i=await ne.readFile(n);s=JSON.parse(i)}catch(i){if(S(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(`
1307
+ `).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 ne.writeFile(n,JSON.stringify(s,null,2)),await Je.log(r,"redo_performed",{timestamp:U.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:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Rl,"redo");async function $l(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=ks.join(P.getGlobalProjectPath(e),"snapshots"),n=ks.join(t,"history.json"),s;try{let o=await ne.readFile(n);s=JSON.parse(o)}catch(o){if(S(o)||o instanceof SyntaxError)return console.log(`
1307
1308
  SNAPSHOT HISTORY
1308
1309
  `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1309
1310
  `),{success:!0,snapshots:[]};throw o}return console.log(`
@@ -1311,32 +1312,32 @@ ${"\u2550".repeat(50)}
1311
1312
  `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1312
1313
  `)):(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
1313
1314
  `)),console.log(`${"=".repeat(50)}
1314
- `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Ml,"history");var Cs=class extends ue{static{l(this,"MaintenanceCommands")}_cleanupMemory=mi;_cleanupMemoryInternal=gi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Il(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?jl(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Dl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Rl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$l(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ml(e):t}};import pe from"chalk";Y();Ks();K();import AC from"node:fs/promises";import IC from"node:path";var jC="performance.jsonl",fi=5,Fl=class{static{l(this,"PerformanceTracker")}marks=new Map;getPath(e){return P.getStoragePath(e,jC)}async ensureDir(e){let t=this.getPath(e);await AC.mkdir(IC.dirname(t),{recursive:!0})}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}async recordTiming(e,t,n,s){await this.ensureDir(e);let o={timestamp:k(),metric:t,value:Math.round(n*100)/100,unit:"ms",context:s};await as(this.getPath(e),o,fi)}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}async recordMemory(e,t){await this.ensureDir(e);let n=this.snapshotMemory(),s=this.getPath(e),o=k(),i=[{timestamp:o,metric:"heap_used",value:n.heapUsed,unit:"bytes",context:t},{timestamp:o,metric:"heap_total",value:n.heapTotal,unit:"bytes",context:t},{timestamp:o,metric:"rss",value:n.rss,unit:"bytes",context:t},{timestamp:o,metric:"external_memory",value:n.external,unit:"bytes",context:t}];for(let a of i)await as(s,a,fi);return n}async recordContextCorrectness(e,t){await this.ensureDir(e);let n={timestamp:k(),metric:"context_correctness",...t};await as(this.getPath(e),n,fi)}async recordSubtaskHandoff(e,t){await this.ensureDir(e);let n={timestamp:k(),metric:"subtask_handoff",...t};await as(this.getPath(e),n,fi)}async getMetrics(e,t){let n=this.getPath(e);t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return ja(n,o=>o.timestamp>=s)}async getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t);let s=await this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(d=>"metric"in d&&d.metric==="startup_time");if(i.length>0){let d=i.map(g=>g.value);o.startup={avg:Math.round(d.reduce((g,f)=>g+f,0)/d.length),min:Math.min(...d),max:Math.max(...d),count:d.length,unit:"ms"}}let a=s.filter(d=>"metric"in d&&d.metric==="heap_used"),c=s.filter(d=>"metric"in d&&d.metric==="rss");if(a.length>0){let d=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),f=c.map(b=>b.value);o.memory={avgHeapMB:d(g.reduce((b,E)=>b+E,0)/g.length),peakHeapMB:d(Math.max(...g)),avgRssMB:f.length>0?d(f.reduce((b,E)=>b+E,0)/f.length):0}}let u=s.filter(d=>"metric"in d&&d.metric==="context_correctness");if(u.length>0){let d=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:d,rate:Math.round(d/u.length*100)}}let p=s.filter(d=>"metric"in d&&d.metric==="subtask_handoff");if(p.length>0){let d=p.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:p.length,outputPopulated:d,rate:Math.round(d/p.length*100)}}let m=s.filter(d=>"metric"in d&&d.metric==="command_duration");if(m.length>0){let d={};for(let g of m){let f=g.context?.command||"unknown";d[f]||(d[f]=[]),d[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(d))o.commandDurations[g]={avg:Math.round(f.reduce((b,E)=>b+E,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},DC=new Fl,Hg=DC;M();Le();var dn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function hi(r,e,t){return t==="below"?r<=e?pe.green("\u2713"):pe.yellow("\u26A0"):r>=e?pe.green("\u2713"):pe.yellow("\u26A0")}l(hi,"statusIcon");var vs=class extends ue{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 Hg.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1315
- ${pe.dim("No performance data yet.")}`),console.log(`${pe.dim("Metrics are collected automatically as you use the CLI.")}
1315
+ `),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l($l,"history");var bs=class extends pe{static{l(this,"MaintenanceCommands")}_cleanupMemory=gi;_cleanupMemoryInternal=fi;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Al(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Il(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?jl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Dl(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Rl(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$l(e):t}};import de from"chalk";Q();Bs();K();import CC from"node:fs/promises";import vC from"node:path";var xC="performance.jsonl",hi=5,Ml=class{static{l(this,"PerformanceTracker")}marks=new Map;getPath(e){return P.getStoragePath(e,xC)}async ensureDir(e){let t=this.getPath(e);await CC.mkdir(vC.dirname(t),{recursive:!0})}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}async recordTiming(e,t,n,s){await this.ensureDir(e);let o={timestamp:b(),metric:t,value:Math.round(n*100)/100,unit:"ms",context:s};await os(this.getPath(e),o,hi)}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}async recordMemory(e,t){await this.ensureDir(e);let n=this.snapshotMemory(),s=this.getPath(e),o=b(),i=[{timestamp:o,metric:"heap_used",value:n.heapUsed,unit:"bytes",context:t},{timestamp:o,metric:"heap_total",value:n.heapTotal,unit:"bytes",context:t},{timestamp:o,metric:"rss",value:n.rss,unit:"bytes",context:t},{timestamp:o,metric:"external_memory",value:n.external,unit:"bytes",context:t}];for(let a of i)await os(s,a,hi);return n}async recordContextCorrectness(e,t){await this.ensureDir(e);let n={timestamp:b(),metric:"context_correctness",...t};await os(this.getPath(e),n,hi)}async recordSubtaskHandoff(e,t){await this.ensureDir(e);let n={timestamp:b(),metric:"subtask_handoff",...t};await os(this.getPath(e),n,hi)}async getMetrics(e,t){let n=this.getPath(e);t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return Aa(n,o=>o.timestamp>=s)}async getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t);let s=await this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(d=>"metric"in d&&d.metric==="startup_time");if(i.length>0){let d=i.map(g=>g.value);o.startup={avg:Math.round(d.reduce((g,f)=>g+f,0)/d.length),min:Math.min(...d),max:Math.max(...d),count:d.length,unit:"ms"}}let a=s.filter(d=>"metric"in d&&d.metric==="heap_used"),c=s.filter(d=>"metric"in d&&d.metric==="rss");if(a.length>0){let d=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:d(g.reduce((k,v)=>k+v,0)/g.length),peakHeapMB:d(Math.max(...g)),avgRssMB:f.length>0?d(f.reduce((k,v)=>k+v,0)/f.length):0}}let u=s.filter(d=>"metric"in d&&d.metric==="context_correctness");if(u.length>0){let d=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:d,rate:Math.round(d/u.length*100)}}let p=s.filter(d=>"metric"in d&&d.metric==="subtask_handoff");if(p.length>0){let d=p.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:p.length,outputPopulated:d,rate:Math.round(d/p.length*100)}}let m=s.filter(d=>"metric"in d&&d.metric==="command_duration");if(m.length>0){let d={};for(let g of m){let f=g.context?.command||"unknown";d[f]||(d[f]=[]),d[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(d))o.commandDurations[g]={avg:Math.round(f.reduce((k,v)=>k+v,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},TC=new Ml,Ug=TC;M();He();var dn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function yi(r,e,t){return t==="below"?r<=e?de.green("\u2713"):de.yellow("\u26A0"):r>=e?de.green("\u2713"):de.yellow("\u26A0")}l(yi,"statusIcon");var Ps=class extends pe{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 Ug.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
1316
+ ${de.dim("No performance data yet.")}`),console.log(`${de.dim("Metrics are collected automatically as you use the CLI.")}
1316
1317
  `),{success:!0,message:"No data"};if(console.log(`
1317
- ${pe.cyan("Performance Report")} ${pe.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=hi(i.startup.avg,dn.startup.max,"below");console.log(` Startup: avg ${pe.bold(`${i.startup.avg}ms`)} ${pe.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${pe.dim(`target: <${dn.startup.max}ms`)}`)}if(i.memory){let c=hi(i.memory.peakHeapMB,dn.heapMB.max,"below");console.log(` Memory: avg ${pe.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${pe.dim(`target: <${dn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=hi(i.contextCorrectness.rate,dn.contextRate.min,"above");console.log(` Context: ${pe.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${pe.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${pe.dim(`target: ${dn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=hi(i.subtaskHandoff.rate,dn.handoffRate.min,"above");console.log(` Handoff: ${pe.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${pe.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${pe.dim(`target: ${dn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1318
- ${pe.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${pe.bold(`${u.avg}ms`)} ${pe.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(y(n)),{success:!1,error:y(n)}}}};Qo();En();K();M();Ce();xn();Le();import Ol from"node:fs/promises";import RC from"node:path";import Z from"chalk";var xs=class extends ue{static{l(this,"SetupCommands")}async start(){let t=await(He(),ot(Qe)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1319
- `),!(await Oe.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1318
+ ${de.cyan("Performance Report")} ${de.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=yi(i.startup.avg,dn.startup.max,"below");console.log(` Startup: avg ${de.bold(`${i.startup.avg}ms`)} ${de.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${de.dim(`target: <${dn.startup.max}ms`)}`)}if(i.memory){let c=yi(i.memory.peakHeapMB,dn.heapMB.max,"below");console.log(` Memory: avg ${de.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${de.dim(`target: <${dn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=yi(i.contextCorrectness.rate,dn.contextRate.min,"above");console.log(` Context: ${de.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${de.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${de.dim(`target: ${dn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=yi(i.subtaskHandoff.rate,dn.handoffRate.min,"above");console.log(` Handoff: ${de.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${de.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${de.dim(`target: ${dn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
1319
+ ${de.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${de.bold(`${u.avg}ms`)} ${de.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(y(n)),{success:!1,error:y(n)}}}};Zo();En();K();M();Ee();xn();He();import Fl from"node:fs/promises";import EC from"node:path";import ee from"chalk";var Cs=class extends pe{static{l(this,"SetupCommands")}async start(){let t=await(ze(),ot(Qe)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
1320
+ `),!(await _e.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
1320
1321
 
1321
1322
  Please install it first:
1322
- - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Oe.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1323
+ - ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await _e.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
1323
1324
  \u2705 Installed ${s.installed?.length??0} commands to:
1324
1325
  ${P.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1325
1326
  \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1326
1327
  \u{1F389} Setup complete!`),console.log(`
1327
1328
  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...
1328
- `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Oe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Oe.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1329
+ `),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await _e.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await _e.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
1329
1330
  \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1330
1331
  \u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
1331
- \u{1F4DD} Installing global configuration...`);let n=await Oe.installGlobalConfig(),s=n.path?P.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(He(),ot(Qe)).getActiveProvider()).name==="claude"){console.log(`
1332
+ \u{1F4DD} Installing global configuration...`);let n=await _e.installGlobalConfig(),s=n.path?P.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(ze(),ot(Qe)).getActiveProvider()).name==="claude"){console.log(`
1332
1333
  \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(`
1333
1334
  \u{1F389} Setup complete!
1334
- `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=P.getClaudeDir(),t=P.getClaudeSettingsPath(),n=RC.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1335
+ `),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=P.getClaudeDir(),t=P.getClaudeSettingsPath(),n=EC.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
1335
1336
  # prjct Status Line for Claude Code
1336
1337
  # Shows version update notifications and current task
1337
1338
 
1338
1339
  # Current CLI version (embedded at install time)
1339
- CLI_VERSION="${us}"
1340
+ CLI_VERSION="${cs}"
1340
1341
 
1341
1342
  # Read JSON context from stdin (provided by Claude Code)
1342
1343
  read -r json
@@ -1387,18 +1388,18 @@ fi
1387
1388
 
1388
1389
  # Default: show prjct branding
1389
1390
  echo "\u26A1 prjct"
1390
- `;await Ol.writeFile(n,s,{mode:493});let o={};if(await D(t))try{o=JSON.parse(await Ol.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Ol.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(Z.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(Z.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(Z.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(Z.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(Z.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(Z.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(Z.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(` ${Z.bold.cyan("prjct")}${Z.magenta("/")}${Z.green("cli")} ${Z.dim.white(`v${us} installed`)}`),console.log(""),console.log(` ${Z.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${Z.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${Z.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(Z.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(Z.bold.cyan("\u{1F680} Quick Start")),console.log(Z.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(` ${Z.bold("1.")} Initialize your project:`),console.log(` ${Z.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${Z.bold("2.")} Start your first task:`),console.log(` ${Z.green('prjct task "build auth"')}`),console.log(""),console.log(` ${Z.bold("3.")} Ship & celebrate:`),console.log(` ${Z.green('prjct ship "user login"')}`),console.log(""),console.log(Z.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(` ${Z.dim("Documentation:")} ${Z.cyan("https://prjct.app")}`),console.log(` ${Z.dim("Report issues:")} ${Z.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(Z.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};ls();Mt();M();cr();import Bg from"node:path";Ce();import Ve from"node:path";async function $C(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 D(Ve.join(r,"pnpm-lock.yaml"))?"pnpm":await D(Ve.join(r,"yarn.lock"))?"yarn":await D(Ve.join(r,"bun.lockb"))||await D(Ve.join(r,"bun.lock"))?"bun":(await D(Ve.join(r,"package-lock.json")),"npm")}l($C,"detectPackageManager");function Gg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(Gg,"pmRun");function MC(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(MC,"pmTest");async function _l(r){let e=Ve.join(r,"package.json"),t=await hn(e,null);if(t){let o=await $C(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:Gg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:Gg(o,"typecheck")}),i.test&&(a.test={tool:o,command:MC(o)}),a}if(await D(Ve.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Vn(Ve.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await D(Ve.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await D(Ve.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await qn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await D(Ve.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await D(Ve.join(r,"gradlew"))&&(await D(Ve.join(r,"build.gradle"))||await D(Ve.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(_l,"detectProjectCommands");ls();M();Gt();import{exec as FC}from"node:child_process";import{promisify as OC}from"node:util";import xt from"chalk";var _C=OC(FC),yi=new Map,Ts=new Map;function Cr(r,e){return`workflow:${r}_${e}`}l(Cr,"prefKey");async function zg(r,e){let t=Cr(e.hook,e.command);switch(e.scope){case"permanent":await ce.recordDecision(r,t,e.action,"workflow");break;case"session":yi.set(t,e);break;case"once":Ts.set(t,e);break}}l(zg,"setWorkflowPreference");async function NC(r,e){let t={};for(let n of["before","after","skip"]){let s=Cr(n,e),o=Ts.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=yi.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await ce.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l(NC,"getWorkflowPreferences");async function mn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await NC(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=Cr(e,t);Ts.has(i)&&Ts.delete(i),console.log(`
1391
- ${xt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await _C(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(`${xt.green("\u2713")} ${xt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(xt.red("\u2717 failed"));let c=y(a)||"Unknown error";return console.log(xt.dim(c.split(`
1392
- `)[0])),{success:!1,failed:o,output:c}}}l(mn,"runWorkflowHooks");async function Nl(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Cr(o,s),a=Ts.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=yi.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await ce.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(Nl,"listWorkflowPreferences");async function Jg(r,e,t){let n=Cr(e,t);return Ts.delete(n),yi.delete(n),await ce.recordDecision(r,n,"","workflow:remove"),!0}l(Jg,"removeWorkflowPreference");function Wg(r){if(r.length===0)return`${xt.dim(zs.NO_PREFERENCES)}
1391
+ `;await Fl.writeFile(n,s,{mode:493});let o={};if(await D(t))try{o=JSON.parse(await Fl.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Fl.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(ee.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(ee.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(ee.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(ee.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(ee.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(ee.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(ee.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(` ${ee.bold.cyan("prjct")}${ee.magenta("/")}${ee.green("cli")} ${ee.dim.white(`v${cs} installed`)}`),console.log(""),console.log(` ${ee.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ee.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ee.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ee.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(ee.bold.cyan("\u{1F680} Quick Start")),console.log(ee.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(` ${ee.bold("1.")} Initialize your project:`),console.log(` ${ee.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ee.bold("2.")} Start your first task:`),console.log(` ${ee.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ee.bold("3.")} Ship & celebrate:`),console.log(` ${ee.green('prjct ship "user login"')}`),console.log(""),console.log(ee.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(` ${ee.dim("Documentation:")} ${ee.cyan("https://prjct.app")}`),console.log(` ${ee.dim("Report issues:")} ${ee.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ee.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};as();Ft();M();or();import Wg from"node:path";Ee();import Ve from"node:path";async function AC(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 D(Ve.join(r,"pnpm-lock.yaml"))?"pnpm":await D(Ve.join(r,"yarn.lock"))?"yarn":await D(Ve.join(r,"bun.lockb"))||await D(Ve.join(r,"bun.lock"))?"bun":(await D(Ve.join(r,"package-lock.json")),"npm")}l(AC,"detectPackageManager");function Hg(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}l(Hg,"pmRun");function IC(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}l(IC,"pmTest");async function Ol(r){let e=Ve.join(r,"package.json"),t=await hn(e,null);if(t){let o=await AC(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:Hg(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:Hg(o,"typecheck")}),i.test&&(a.test={tool:o,command:IC(o)}),a}if(await D(Ve.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await Wn(Ve.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await D(Ve.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await D(Ve.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await Bn(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await D(Ve.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await D(Ve.join(r,"gradlew"))&&(await D(Ve.join(r,"build.gradle"))||await D(Ve.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}l(Ol,"detectProjectCommands");as();M();Jt();import{exec as jC}from"node:child_process";import{promisify as DC}from"node:util";import Et from"chalk";var RC=DC(jC),wi=new Map,vs=new Map;function Pr(r,e){return`workflow:${r}_${e}`}l(Pr,"prefKey");async function Gg(r,e){let t=Pr(e.hook,e.command);switch(e.scope){case"permanent":await le.recordDecision(r,t,e.action,"workflow");break;case"session":wi.set(t,e);break;case"once":vs.set(t,e);break}}l(Gg,"setWorkflowPreference");async function $C(r,e){let t={};for(let n of["before","after","skip"]){let s=Pr(n,e),o=vs.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=wi.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await le.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}l($C,"getWorkflowPreferences");async function mn(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await $C(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=Pr(e,t);vs.has(i)&&vs.delete(i),console.log(`
1392
+ ${Et.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await RC(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(`${Et.green("\u2713")} ${Et.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Et.red("\u2717 failed"));let c=y(a)||"Unknown error";return console.log(Et.dim(c.split(`
1393
+ `)[0])),{success:!1,failed:o,output:c}}}l(mn,"runWorkflowHooks");async function _l(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=Pr(o,s),a=vs.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=wi.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await le.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}l(_l,"listWorkflowPreferences");async function zg(r,e,t){let n=Pr(e,t);return vs.delete(n),wi.delete(n),await le.recordDecision(r,n,"","workflow:remove"),!0}l(zg,"removeWorkflowPreference");function Jg(r){if(r.length===0)return`${Et.dim(Hs.NO_PREFERENCES)}
1393
1394
 
1394
- Set one: "${zs.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"?xt.green("permanent"):t.scope==="session"?xt.yellow("session"):xt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(xt.dim(`Modify: "${zs.MODIFY_EXAMPLE}"`)),e.push(xt.dim(`Remove: "${zs.REMOVE_EXAMPLE}"`)),e.join(`
1395
- `)}l(Wg,"formatWorkflowPreferences");Le();var Es=class extends ue{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=je.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1395
+ Set one: "${Hs.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"?Et.green("permanent"):t.scope==="session"?Et.yellow("session"):Et.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Et.dim(`Modify: "${Hs.MODIFY_EXAMPLE}"`)),e.push(Et.dim(`Remove: "${Hs.REMOVE_EXAMPLE}"`)),e.join(`
1396
+ `)}l(Jg,"formatWorkflowPreferences");He();var xs=class extends pe{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=je.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
1396
1397
  ${o.stderr}`.trim(),a=i.split(`
1397
1398
  `),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,p=i.split(`
1398
1399
  `).filter(m=>!m.startsWith("__EXIT:")).join(`
1399
- `).trim();return{exitCode:Number.isFinite(u)?u:1,output:p}}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 ne.getCurrentTask(o))?.description||"current work");let a=await mn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);h.step(2,5,"Running tests...");let u=await this._runTests(t);h.step(3,5,"Updating version...");let p=await this._bumpVersion(t);return await this._updateChangelog(i,p,t),h.step(4,5,"Committing..."),(await this._createShipCommit(i,t)).success&&(h.step(5,5,"Pushing..."),await this._gitPush(t)),await wn.addShipped(o,{name:i,version:p}),await this.logToMemory(t,"feature_shipped",{feature:i,version:p,timestamp:N.getTimestamp()}),await ce.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await ce.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await ce.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await mn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),h.done(`v${p} shipped`),nt("ship"),{success:!0,feature:i,version:p}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _runLint(e){try{let t=await _l(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 S(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await _l(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 S(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Bg.join(e,"package.json"),n=await te.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 te.writeJson(t,n)),c}catch(t){if(S(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Bg.join(n,"CHANGELOG.md"),o=await te.readFile(s,`# Changelog
1400
+ `).trim();return{exitCode:Number.isFinite(u)?u:1,output:p}}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 X.getCurrentTask(o))?.description||"current work");let a=await mn(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);h.step(2,5,"Running tests...");let u=await this._runTests(t);h.step(3,5,"Updating version...");let p=await this._bumpVersion(t);return await this._updateChangelog(i,p,t),h.step(4,5,"Committing..."),(await this._createShipCommit(i,t)).success&&(h.step(5,5,"Pushing..."),await this._gitPush(t)),await Wt.addShipped(o,{name:i,version:p}),await this.logToMemory(t,"feature_shipped",{feature:i,version:p,timestamp:U.getTimestamp()}),await le.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await le.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await le.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await mn(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),h.done(`v${p} shipped`),nt("ship"),{success:!0,feature:i,version:p}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _runLint(e){try{let t=await Ol(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 S(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Ol(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 S(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=Wg.join(e,"package.json"),n=await ne.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 ne.writeJson(t,n)),c}catch(t){if(S(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=Wg.join(n,"CHANGELOG.md"),o=await ne.readFile(s,`# Changelog
1400
1401
 
1401
- `),i=`## [${t}] - ${N.formatDate(new Date)}
1402
+ `),i=`## [${t}] - ${U.formatDate(new Date)}
1402
1403
 
1403
1404
  ### Added
1404
1405
  - ${e}
@@ -1407,23 +1408,23 @@ ${o.stderr}`.trim(),a=i.split(`
1407
1408
 
1408
1409
  `,`# Changelog
1409
1410
 
1410
- ${i}`);await te.writeFile(s,a)}catch(s){S(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await je.get("Bash")("git add .");let n=`feat: ${e}
1411
+ ${i}`);await ne.writeFile(s,a)}catch(s){S(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await je.get("Bash")("git add .");let n=`feat: ${e}
1411
1412
 
1412
- Generated with [p/](https://www.prjct.app/)`;return await je.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return S(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await je.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return S(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};Ic();ts();Aa();M();Rn();Le();import de from"chalk";var As=class extends ue{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 Je.getAll(s);if(i.length===0)return console.log(`
1413
- ${de.dim("No velocity data yet.")}`),console.log(`${de.dim("Complete tasks with estimates to build velocity history.")}
1414
- `),{success:!0,message:"No data"};let a=Ho(i,o);await Ea.saveMetrics(s,a),console.log(`
1415
- ${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 d=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: ${d(`${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(`
1416
- ${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 p=parseInt(e,10);if(p>0&&a.averageVelocity>0){let m=vd(p,a.averageVelocity,o),d=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1417
- ${de.dim("Projection:")}`),console.log(` Backlog: ${de.bold(`${p} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${de.bold(d)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...sn,...n.velocity}}catch{}return sn}};Kc();Wc();Rn();var LC=[1,2,3,5,8,13,21],UC={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}},qg=l(r=>LC.includes(r),"isValidPoint"),wi=l(r=>UC[r],"pointsToMinutes"),Vg=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"),Kg=l(r=>{let e=wi(r);return`${Vg(e.min)}\u2013${Vg(e.max)}`},"pointsToTimeRange");Vr();var Si=300*1e3,Me=new ht({ttl:Si,maxSize:100}),Tt=new ht({ttl:Si,maxSize:10}),Is=new ht({ttl:Si,maxSize:5}),js=new ht({ttl:Si,maxSize:5});function Ll(){Me.clear(),Tt.clear(),Is.clear(),js.clear()}l(Ll,"clearLinearCache");function Ul(){return{issues:Me.stats(),assignedIssues:Tt.stats(),teams:Is.stats(),projects:js.stats()}}l(Ul,"getLinearCacheStats");M();Hl();var WC={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},BC={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Yg={none:0,urgent:1,high:2,medium:3,low:4},bi=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 ki("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: ${y(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(p=>p.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?Yg[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=Yg[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:WC[t?.type||"backlog"]||"backlog",priority:BC[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):[]}},qe=new bi;var Pi=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&qe.isConfigured()}async initialize(e){this.initialized||(await qe.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=Tt.get(t);if(n)return n;let s=await qe.fetchAssignedIssues(e);Tt.set(t,s);for(let o of s)Me.set(`issue:${o.id}`,o),Me.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Tt.get(n);if(s)return s;let o=await qe.fetchTeamIssues(e,t);Tt.set(n,o);for(let i of o)Me.set(`issue:${i.id}`,i),Me.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Me.get(t);if(n)return n;let s=await qe.fetchIssue(e);return s&&(Me.set(`issue:${s.id}`,s),Me.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await qe.createIssue(e);return Me.set(`issue:${t.id}`,t),Me.set(`issue:${t.externalId}`,t),Tt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await qe.updateIssue(e,t);return Me.set(`issue:${n.id}`,n),Me.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await qe.markInProgress(e),Me.delete(`issue:${e}`),Tt.clear()}async markDone(e){this.ensureInitialized(),await qe.markDone(e),Me.delete(`issue:${e}`),Tt.clear()}async addComment(e,t){this.ensureInitialized(),await qe.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Is.get("teams");if(e)return e;let t=await qe.getTeams();return Is.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=js.get("projects");if(e)return e;let t=await qe.getProjects();return js.set("projects",t),t}clearCache(){Ll()}getCacheStats(){return Ul()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},pt=new Pi;Zi();sa();M();Ce();import{mkdir as Qg,readFile as VC,writeFile as Zg}from"node:fs/promises";import{join as vr}from"node:path";var ef=1800*1e3,Ci=class{static{l(this,"LinearSync")}async pullAll(e){let t=vr(Ws(e),"storage"),n=vr(t,"issues.json");await D(t)||await Qg(t,{recursive:!0});let s=new Date().toISOString(),o=[];try{let i=await pt.fetchAssignedIssues({limit:100}),a={};for(let u of i)try{a[u.externalId]=this.toCachedIssue(u,s)}catch(p){o.push({issueId:u.externalId||u.id,error:y(p)})}return await Zg(n,JSON.stringify({provider:"linear",lastSync:s,staleAfter:ef,issues:a},null,2)),{provider:"linear",fetched:i.length,updated:Object.keys(a).length,errors:o,timestamp:s}}catch(i){return o.push({issueId:"all",error:y(i)}),{provider:"linear",fetched:0,updated:0,errors:o,timestamp:s}}}async getIssue(e,t){let n=await 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 pt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return await this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return(await this.loadIssues(e))?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await pt.markInProgress(t):n==="done"&&await pt.markDone(t);let s=await 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(),await this.saveIssues(e,s)}}async isStale(e){let t=await this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||ef;return s-n>o}async getSyncStatus(e){let t=await 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=await this.loadIssues(e);return t?Object.values(t.issues):[]}async loadIssues(e){let t=vr(Ws(e),"storage","issues.json");if(!await D(t))return null;try{let n=await VC(t,"utf-8");return Ou(JSON.parse(n))}catch{return null}}async saveIssues(e,t){let n=vr(Ws(e),"storage"),s=vr(n,"issues.json");await D(n)||await Qg(n,{recursive:!0}),await Zg(s,JSON.stringify(t,null,2))}async updateIssueInCache(e,t,n){let s=await this.loadIssues(e);s||(s=_u("linear")),s.issues[t]=n,await 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}}},qC=new Ci;yt();Mt();M();cr();M();Ce();Hl();import KC from"node:fs/promises";import XC from"node:os";import YC from"node:path";function QC(r){return YC.join(XC.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(QC,"getCredentialsPath");async function vi(r){let e=QC(r);if(!await D(e))return{};try{return JSON.parse(await KC.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(vi,"getProjectCredentials");async function Gl(r){let e=await vi(r);return e.linear?.apiKey?e.linear.apiKey:ki("linear-api-key")}l(Gl,"getLinearApiKey");Rn();Le();var Ds=class extends ue{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 h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await mn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Xo.execute("task",{task:e},t);if(!a.success)return h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await vi(o),b=await Gl(o);if(b&&f.linear?.teamId){await pt.initializeFromApiKey(b,f.linear.teamId);let E=await pt.fetchIssue(e);E&&(c=e,u=`${e}: ${E.title}`,await pt.markInProgress(e))}}catch{}await ne.startTask(o,{id:oe(),description:u,sessionId:oe(),linearId:c});let m=await Jc.getAvailableAgents(t),d=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),ar("working"),nt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:N.getTimestamp()}),await mn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:qg,pointsToMinutes:wi,pointsToTimeRange:Kg,storeEstimate:l(async f=>{let b=wi(f);return await ne.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:b.typical}),b},"storeEstimate")}}}else{let i=await ne.getCurrentTask(o);return i?(h.done(`working on: ${i.description}`),{success:!0,task:i.description,currentTask:i}):(h.warn("no active task"),{success:!0,message:"No active task"})}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}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 ne.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await mn(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=N.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let p=o.estimatedMinutes,m=o.estimatedPoints;try{await Je.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:N.getTimestamp(),estimatedDuration:p?tf(p):"0m",actualDuration:c||"0m",variance:p?ZC(u-p):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let d="";if(m&&p){let f=u-p,b=p>0?Math.round((u-p)/p*100):0,E=f>=0?"+":"";d=` | est: ${m}pt (${tf(p)}) \u2192 ${E}${b}%`}await ne.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await vi(s),b=await Gl(s);b&&f.linear?.teamId?(await pt.initializeFromApiKey(b,f.linear.teamId),await pt.markDone(g),h.done(`${a}${c?` (${c}${d})`:""} \u2192 Linear \u2713`)):h.done(`${a}${c?` (${c}${d})`:""}`)}catch{h.done(`${a}${c?` (${c}${d})`:""}`)}else h.done(`${a}${c?` (${c}${d})`:""}`);return ar("completed"),nt("done"),await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:p,actualMinutes:u,timestamp:N.getTimestamp()}),await mn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd()){try{let t=await this.ensureProjectInit(e);if(!t.success)return t;let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=await Ge.getActiveTasks(n);return s.length===0?(h.warn("queue empty"),{success:!0,message:"Queue is empty"}):(h.done(`${s.length} task${s.length!==1?"s":""} queued`),nt("next"),{success:!0,tasks:s,count:s.length})}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}async pause(e="",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 ne.getCurrentTask(s);if(!o)return h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};await ne.pauseTask(s,e);let i=o.description.slice(0,40);return h.done(`paused: ${i}${e?` (${e})`:""}`),ar("paused"),nt("pause"),await this.logToMemory(t,"task_paused",{task:o.description,reason:e,timestamp:N.getTimestamp()}),{success:!0,task:o.description,reason:e}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async resume(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"};let o=await ne.getCurrentTask(s);if(o)return h.warn("already working on a task"),{success:!1,message:`Already working on: ${o.description}`};let i=await ne.resumeTask(s);return i?(h.done(`resumed: ${i.description.slice(0,40)}`),ar("working"),nt("resume"),await this.logToMemory(t,"task_resumed",{task:i.description,timestamp:N.getTimestamp()}),{success:!0,task:i.description}):(h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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 Nl(s);return console.log(Wg(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await zg(s,{...o,createdAt:N.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Jg(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Nl(s),"listWorkflowPreferences")}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function tf(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`}l(tf,"formatMinutesToDuration");function ZC(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`}l(ZC,"formatVariance");var zn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Ds,this.planning=new _n,this.shipping=new Es,this.analytics=new bs,this.performanceCmds=new vs,this.maintenance=new Cs,this.analysis=new Hn,this.setupCmds=new xs,this.velocityCmds=new As,this.contextCmds=new Gn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async done(e=process.cwd()){return this.workflow.done(e)}async next(e=process.cwd()){return this.workflow.next(e)}async pause(e="",t=process.cwd()){return this.workflow.pause(e,t)}async resume(e=null,t=process.cwd()){return this.workflow.resume(e,t)}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()){return this.planning.bug(e,t)}async idea(e,t=process.cwd()){return this.planning.idea(e,t)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd()){return this.shipping.ship(e,t)}async dash(e="default",t=process.cwd()){return this.analytics.dash(e,t)}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 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)}},SG=new zn;Zo();var nf={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}},sf=[{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:"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"]}];Qo();En();K();M();Ce();Le();import{execSync as xi}from"node:child_process";import Ke from"node:fs/promises";import ev from"node:os";import Qt from"node:path";import tv from"node:readline";import ie from"chalk";var Ti="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",xr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function zl(r){let e=0;try{let t=await Ke.readdir(r,{withFileTypes:!0});for(let n of t){let s=Qt.join(r,n.name);if(n.isDirectory())e+=await zl(s);else try{let o=await Ke.stat(s);e+=o.size}catch{}}}catch{}return e}l(zl,"getDirectorySize");function rf(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]}`}l(rf,"formatSize");async function nv(r){try{return(await Ke.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(nv,"countDirectoryItems");function sv(){let r={homebrew:!1,npm:!1};try{xi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{xi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(sv,"detectInstallation");async function rv(){let r=[],e=jp(),t=P.getGlobalBasePath(),n=await D(t),s=n?await nv(Qt.join(t,"projects")):0,o=n?await zl(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=Qt.join(e.claude.config,"CLAUDE.md"),a=await D(i),c=!1;if(a)try{let Ue=await Ke.readFile(i,"utf-8");c=Ue.includes(Ti)&&Ue.includes(xr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,p=await D(u),m=p?await zl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:p});let d=e.claude.router,g=await D(d);r.push({path:d,type:"file",description:"Claude router",exists:g});let f=Qt.join(e.claude.config,"prjct-statusline.sh"),b=await D(f);r.push({path:f,type:"file",description:"Status line script",exists:b});let E=e.gemini.router,v=await D(E);r.push({path:E,type:"file",description:"Gemini router",exists:v});let $=Qt.join(e.gemini.config,"GEMINI.md"),G=await D($),Pe=!1;if(G)try{let Ue=await Ke.readFile($,"utf-8");Pe=Ue.includes(Ti)&&Ue.includes(xr)}catch{}return G&&Pe&&r.push({path:$,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(rv,"gatherUninstallItems");async function ov(r){try{let e=await Ke.readFile(r,"utf-8");if(!e.includes(Ti)||!e.includes(xr))return!1;let t=e.indexOf(Ti),n=e.indexOf(xr)+xr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1413
+ Generated with [p/](https://www.prjct.app/)`;return await je.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return S(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await je.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return S(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};Ec();Zn();Ta();M();Rn();He();import me from"chalk";var Ts=class extends pe{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 We.getAll(s);if(i.length===0)return console.log(`
1414
+ ${me.dim("No velocity data yet.")}`),console.log(`${me.dim("Complete tasks with estimates to build velocity history.")}
1415
+ `),{success:!0,message:"No data"};let a=Go(i,o);await xa.saveMetrics(s,a),console.log(`
1416
+ ${me.cyan("Sprint Velocity")} ${me.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 d=m.estimationAccuracy>=80?me.green:m.estimationAccuracy>=60?me.yellow:me.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${me.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${d(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?me.green("\u2191"):a.velocityTrend==="declining"?me.red("\u2193"):me.dim("\u2192");if(console.log(` Average: ${me.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${me.bold(`${a.estimationAccuracy}%`)} ${me.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
1417
+ ${me.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${me.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${me.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${me.green("\u2713")} ${m.category} tasks estimated within ${me.bold(`${m.avgVariance}%`)}`)}let p=parseInt(e,10);if(p>0&&a.averageVelocity>0){let m=Cd(p,a.averageVelocity,o),d=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
1418
+ ${me.dim("Projection:")}`),console.log(` Backlog: ${me.bold(`${p} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${me.bold(d)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...sn,...n.velocity}}catch{}return sn}};Vc();zc();Rn();var MC=[1,2,3,5,8,13,21],FC={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}},Vg=l(r=>MC.includes(r),"isValidPoint"),Si=l(r=>FC[r],"pointsToMinutes"),Bg=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"),qg=l(r=>{let e=Si(r);return`${Bg(e.min)}\u2013${Bg(e.max)}`},"pointsToTimeRange");Wr();var ki=300*1e3,Me=new yt({ttl:ki,maxSize:100}),At=new yt({ttl:ki,maxSize:10}),Es=new yt({ttl:ki,maxSize:5}),As=new yt({ttl:ki,maxSize:5});function Nl(){Me.clear(),At.clear(),Es.clear(),As.clear()}l(Nl,"clearLinearCache");function Ll(){return{issues:Me.stats(),assignedIssues:At.stats(),teams:Es.stats(),projects:As.stats()}}l(Ll,"getLinearCacheStats");M();Ul();var UC={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},HC={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Xg={none:0,urgent:1,high:2,medium:3,low:4},Pi=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 bi("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: ${y(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(p=>p.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?Xg[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=Xg[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:UC[t?.type||"backlog"]||"backlog",priority:HC[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):[]}},qe=new Pi;var Ci=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&qe.isConfigured()}async initialize(e){this.initialized||(await qe.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=At.get(t);if(n)return n;let s=await qe.fetchAssignedIssues(e);At.set(t,s);for(let o of s)Me.set(`issue:${o.id}`,o),Me.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=At.get(n);if(s)return s;let o=await qe.fetchTeamIssues(e,t);At.set(n,o);for(let i of o)Me.set(`issue:${i.id}`,i),Me.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=Me.get(t);if(n)return n;let s=await qe.fetchIssue(e);return s&&(Me.set(`issue:${s.id}`,s),Me.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await qe.createIssue(e);return Me.set(`issue:${t.id}`,t),Me.set(`issue:${t.externalId}`,t),At.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await qe.updateIssue(e,t);return Me.set(`issue:${n.id}`,n),Me.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await qe.markInProgress(e),Me.delete(`issue:${e}`),At.clear()}async markDone(e){this.ensureInitialized(),await qe.markDone(e),Me.delete(`issue:${e}`),At.clear()}async addComment(e,t){this.ensureInitialized(),await qe.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Es.get("teams");if(e)return e;let t=await qe.getTeams();return Es.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=As.get("projects");if(e)return e;let t=await qe.getProjects();return As.set("projects",t),t}clearCache(){Nl()}getCacheStats(){return Ll()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},dt=new Ci;ea();at();M();var Yg=1800*1e3,vi=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await dt.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:y(c)})}let i={provider:"linear",lastSync:t,staleAfter:Yg,issues:o};return F.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:y(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 dt.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 dt.markInProgress(t):n==="done"&&await dt.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||Yg;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 F.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){F.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Fu("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}}},GC=new vi;wt();Ft();M();or();M();Ee();Ul();import zC from"node:fs/promises";import JC from"node:os";import WC from"node:path";function BC(r){return WC.join(JC.homedir(),".prjct-cli","projects",r,"config","credentials.json")}l(BC,"getCredentialsPath");async function xi(r){let e=BC(r);if(!await D(e))return{};try{return JSON.parse(await zC.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",y(t)),{}}}l(xi,"getProjectCredentials");async function Hl(r){let e=await xi(r);return e.linear?.apiKey?e.linear.apiKey:bi("linear-api-key")}l(Hl,"getLinearApiKey");Rn();He();var Is=class extends pe{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 h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await mn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Yo.execute("task",{task:e},t);if(!a.success)return h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await xi(o),k=await Hl(o);if(k&&f.linear?.teamId){await dt.initializeFromApiKey(k,f.linear.teamId);let v=await dt.fetchIssue(e);v&&(c=e,u=`${e}: ${v.title}`,await dt.markInProgress(e))}}catch{}await X.startTask(o,{id:ie(),description:u,sessionId:ie(),linearId:c});let m=await Gc.getAvailableAgents(t),d=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;return h.done(`${e}`,{agents:g>0?g:void 0}),rr("working"),nt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:U.getTimestamp()}),await mn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Vg,pointsToMinutes:Si,pointsToTimeRange:qg,storeEstimate:l(async f=>{let k=Si(f);return await X.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await X.getCurrentTask(o);return i?(h.done(`working on: ${i.description}`),{success:!0,task:i.description,currentTask:i}):(h.warn("no active task"),{success:!0,message:"No active task"})}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}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 X.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await mn(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=U.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let p=o.estimatedMinutes,m=o.estimatedPoints;try{await We.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:U.getTimestamp(),estimatedDuration:p?Qg(p):"0m",actualDuration:c||"0m",variance:p?VC(u-p):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let d="";if(m&&p){let f=u-p,k=p>0?Math.round((u-p)/p*100):0,v=f>=0?"+":"";d=` | est: ${m}pt (${Qg(p)}) \u2192 ${v}${k}%`}await X.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await xi(s),k=await Hl(s);k&&f.linear?.teamId?(await dt.initializeFromApiKey(k,f.linear.teamId),await dt.markDone(g),h.done(`${a}${c?` (${c}${d})`:""} \u2192 Linear \u2713`)):h.done(`${a}${c?` (${c}${d})`:""}`)}catch{h.done(`${a}${c?` (${c}${d})`:""}`)}else h.done(`${a}${c?` (${c}${d})`:""}`);return rr("completed"),nt("done"),await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:p,actualMinutes:u,timestamp:U.getTimestamp()}),await mn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd()){try{let t=await this.ensureProjectInit(e);if(!t.success)return t;let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=await Oe.getActiveTasks(n);return s.length===0?(h.warn("queue empty"),{success:!0,message:"Queue is empty"}):(h.done(`${s.length} task${s.length!==1?"s":""} queued`),nt("next"),{success:!0,tasks:s,count:s.length})}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}async pause(e="",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 X.getCurrentTask(s);if(!o)return h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};await X.pauseTask(s,e);let i=o.description.slice(0,40);return h.done(`paused: ${i}${e?` (${e})`:""}`),rr("paused"),nt("pause"),await this.logToMemory(t,"task_paused",{task:o.description,reason:e,timestamp:U.getTimestamp()}),{success:!0,task:o.description,reason:e}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async resume(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"};let o=await X.getCurrentTask(s);if(o)return h.warn("already working on a task"),{success:!1,message:`Already working on: ${o.description}`};let i=await X.resumeTask(s);return i?(h.done(`resumed: ${i.description.slice(0,40)}`),rr("working"),nt("resume"),await this.logToMemory(t,"task_resumed",{task:i.description,timestamp:U.getTimestamp()}),{success:!0,task:i.description}):(h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}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 _l(s);return console.log(Jg(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await Gg(s,{...o,createdAt:U.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await zg(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>_l(s),"listWorkflowPreferences")}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}};function Qg(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`}l(Qg,"formatMinutesToDuration");function VC(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`}l(VC,"formatVariance");var Hn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Is,this.planning=new _n,this.shipping=new xs,this.analytics=new Ss,this.performanceCmds=new Ps,this.maintenance=new bs,this.analysis=new Ln,this.setupCmds=new Cs,this.velocityCmds=new Ts,this.contextCmds=new Un,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async done(e=process.cwd()){return this.workflow.done(e)}async next(e=process.cwd()){return this.workflow.next(e)}async pause(e="",t=process.cwd()){return this.workflow.pause(e,t)}async resume(e=null,t=process.cwd()){return this.workflow.resume(e,t)}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()){return this.planning.bug(e,t)}async idea(e,t=process.cwd()){return this.planning.idea(e,t)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd()){return this.shipping.ship(e,t)}async dash(e="default",t=process.cwd()){return this.analytics.dash(e,t)}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 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)}},yG=new Hn;ei();var Zg={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}},ef=[{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:"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"]}];Zo();En();K();M();Ee();He();import{execSync as Ti}from"node:child_process";import Ke from"node:fs/promises";import qC from"node:os";import Qt from"node:path";import KC from"node:readline";import ae from"chalk";var Ei="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Cr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Gl(r){let e=0;try{let t=await Ke.readdir(r,{withFileTypes:!0});for(let n of t){let s=Qt.join(r,n.name);if(n.isDirectory())e+=await Gl(s);else try{let o=await Ke.stat(s);e+=o.size}catch{}}}catch{}return e}l(Gl,"getDirectorySize");function tf(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]}`}l(tf,"formatSize");async function XC(r){try{return(await Ke.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(XC,"countDirectoryItems");function YC(){let r={homebrew:!1,npm:!1};try{Ti("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ti("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(YC,"detectInstallation");async function QC(){let r=[],e=Ip(),t=P.getGlobalBasePath(),n=await D(t),s=n?await XC(Qt.join(t,"projects")):0,o=n?await Gl(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=Qt.join(e.claude.config,"CLAUDE.md"),a=await D(i),c=!1;if(a)try{let Ge=await Ke.readFile(i,"utf-8");c=Ge.includes(Ei)&&Ge.includes(Cr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,p=await D(u),m=p?await Gl(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:p});let d=e.claude.router,g=await D(d);r.push({path:d,type:"file",description:"Claude router",exists:g});let f=Qt.join(e.claude.config,"prjct-statusline.sh"),k=await D(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let v=e.gemini.router,x=await D(v);r.push({path:v,type:"file",description:"Gemini router",exists:x});let $=Qt.join(e.gemini.config,"GEMINI.md"),J=await D($),Pe=!1;if(J)try{let Ge=await Ke.readFile($,"utf-8");Pe=Ge.includes(Ei)&&Ge.includes(Cr)}catch{}return J&&Pe&&r.push({path:$,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(QC,"gatherUninstallItems");async function ZC(r){try{let e=await Ke.readFile(r,"utf-8");if(!e.includes(Ei)||!e.includes(Cr))return!1;let t=e.indexOf(Ei),n=e.indexOf(Cr)+Cr.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1418
1419
 
1419
1420
  `).trim(),!s||s.trim().length===0?await Ke.unlink(r):await Ke.writeFile(r,`${s}
1420
- `,"utf-8"),!0}catch{return!1}}l(ov,"removePrjctSection");async function iv(){let r=ev.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Qt.join(r,`.prjct-backup-${e}`);try{await Ke.mkdir(t,{recursive:!0});let n=P.getGlobalBasePath();return await D(n)&&await of(n,Qt.join(t,".prjct-cli")),t}catch{return null}}l(iv,"createBackup");async function of(r,e){await Ke.mkdir(e,{recursive:!0});let t=await Ke.readdir(r,{withFileTypes:!0});for(let n of t){let s=Qt.join(r,n.name),o=Qt.join(e,n.name);n.isDirectory()?await of(s,o):await Ke.copyFile(s,o)}}l(of,"copyDirectory");async function av(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await ov(o.path)&&n.push(o.path):o.type==="directory"?(await Ke.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await Ke.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${y(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||xi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||xi("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${y(o)}`)}}return{deleted:n,errors:s}}l(av,"performUninstall");async function cv(r){let e=tv.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(cv,"promptConfirmation");async function lv(r={},e=process.cwd()){let t=await rv(),n=sv(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ie.yellow(`
1421
- 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(ie.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ie.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=P.getDisplayPath(c.path),p="";c.type==="section"?p=ie.dim("(section only)"):c.size&&(p=ie.dim(`(${rf(c.size)})`)),console.log(` ${ie.cyan(u.padEnd(35))} ${p}`),console.log(` ${ie.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ie.cyan("Homebrew".padEnd(35))} ${ie.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ie.cyan("npm global".padEnd(35))} ${ie.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ie.dim(` Total size: ${rf(o)}`)),console.log("")),r.dryRun)return console.log(ie.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ie.blue("Creating backup..."));let c=await iv();c?(console.log(ie.green(`Backup created: ${P.getDisplayPath(c)}`)),console.log("")):console.log(ie.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ie.yellow('Type "uninstall" to confirm:')),!await cv("> ")))return console.log(ie.yellow(`
1422
- Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ie.blue("Removing prjct..."));let{deleted:i,errors:a}=await av(t,n,r);if(console.log(""),i.length>0&&console.log(ie.green(`Removed ${i.length} items`)),a.length>0){console.log(ie.yellow(`
1423
- ${a.length} errors:`));for(let c of a)console.log(ie.red(` - ${c}`))}return console.log(""),console.log(ie.green("prjct has been uninstalled.")),console.log(ie.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}}l(lv,"uninstall");var Ei=class extends ue{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return lv(e,t)}};var Tr=new Ds,Ai=new _n,uv=new Es,af=new bs,pv=new vs,Rs=new Cs,$s=new Hn,cf=new xs,dv=new Gn,mv=new As,gv=new Ei;function fv(){for(let[r,e]of Object.entries(nf))_.registerCategory(r,e)}l(fv,"registerCategories");function lf(){if(_.has("work"))return;fv();let r=l(e=>sf.find(t=>t.name===e),"getMeta");_.registerMethod("done",Tr,"done",r("done")),_.registerMethod("next",Tr,"next",r("next")),_.registerMethod("pause",Tr,"pause",r("pause")),_.registerMethod("resume",Tr,"resume",r("resume")),_.registerMethod("workflow",Tr,"workflow",r("workflow")),_.registerMethod("init",Ai,"init",r("init")),_.registerMethod("bug",Ai,"bug",r("bug")),_.registerMethod("idea",Ai,"idea",r("idea")),_.registerMethod("spec",Ai,"spec",r("spec")),_.registerMethod("ship",uv,"ship",r("ship")),_.registerMethod("dash",af,"dash",r("dash")),_.registerMethod("help",af,"help",r("help")),_.registerMethod("perf",pv,"perf",r("perf")),_.registerMethod("velocity",mv,"velocity",r("velocity")),_.registerMethod("cleanup",Rs,"cleanup",r("cleanup")),_.registerMethod("design",Rs,"design",r("design")),_.registerMethod("recover",Rs,"recover",r("recover")),_.registerMethod("undo",Rs,"undo",r("undo")),_.registerMethod("redo",Rs,"redo",r("redo")),_.registerMethod("history",Rs,"history",r("history")),_.registerMethod("analyze",$s,"analyze",r("analyze")),_.registerMethod("sync",$s,"sync",r("sync")),_.registerMethod("stats",$s,"stats",r("stats")),_.registerMethod("status",$s,"status",r("status")),_.registerMethod("seal",$s,"seal",r("seal")),_.registerMethod("verify",$s,"verify",r("verify")),_.registerMethod("start",cf,"start",r("start")),_.registerMethod("setup",cf,"setup",r("setup")),_.registerMethod("uninstall",gv,"uninstall",r("uninstall")),_.registerMethod("context",dv,"context",r("context"))}l(lf,"registerAllCommands");lf();at();import{Hono as xv}from"hono";import{cors as Tv}from"hono/cors";import{logger as Ev}from"hono/logger";function hv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}l(hv,"detectRuntime");function Jl(){return hv()==="bun"}l(Jl,"isBun");K();M();Zn();import Ii from"node:fs/promises";import rt from"node:path";import{Hono as yv}from"hono";import*as uf from"jsonc-parser";var Et={state:"storage/state.json",queue:"storage/queue.json",ideas:"storage/ideas.json",shipped:"storage/shipped.json",roadmap:"planning/roadmap.json"};async function Nt(r){try{let e=await Ii.readFile(r,"utf-8"),t=[],n=uf.parse(e,t);return t.length>0?null:n}catch(e){return!S(e)&&!(e instanceof SyntaxError)&&L.error(`JSON read error: ${y(e)}`),null}}l(Nt,"readJsonFile");async function wv(r,e){try{return await Ii.mkdir(rt.dirname(r),{recursive:!0}),await Ii.writeFile(r,`${JSON.stringify(e,null,2)}
1424
- `,"utf-8"),!0}catch(t){return L.error(`JSON write error: ${y(t)}`),!1}}l(wv,"writeJsonFile");function Sv(r){return P.getGlobalProjectPath(r)}l(Sv,"getProjectDataPath");function pf(r,e){let t=new yv,n=Sv(r);return t.get("/state",async s=>{let o=await Nt(rt.join(n,Et.state));return o?s.json(o):s.json({currentTask:null,lastUpdated:""})}),t.get("/queue",async s=>{let o=await Nt(rt.join(n,Et.queue));return o?s.json(o):s.json({tasks:[],lastUpdated:""})}),t.get("/ideas",async s=>{let o=await Nt(rt.join(n,Et.ideas));return o?s.json(o):s.json({ideas:[],lastUpdated:""})}),t.get("/roadmap",async s=>{let o=await Nt(rt.join(n,Et.roadmap));return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Nt(rt.join(n,Et.shipped));return o?s.json(o):s.json({items:[],lastUpdated:""})}),t.get("/dashboard",async s=>{let[o,i,a,c,u]=await Promise.all([Nt(rt.join(n,Et.state)),Nt(rt.join(n,Et.queue)),Nt(rt.join(n,Et.ideas)),Nt(rt.join(n,Et.roadmap)),Nt(rt.join(n,Et.shipped))]);return s.json({projectId:r,state:o||{currentTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},shipped:u||{items:[],lastUpdated:""},timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json(),i=rt.join(n,Et.state);return await wv(i,o)?s.json({success:!0}):s.json({success:!1,error:"Failed to write"},500)}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=rt.join(n,"context",`${o}.md`),c=await Ii.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return S(a)||L.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(pf,"createRoutes");K();M();import Zt from"node:fs/promises";import ae from"node:path";import{Hono as kv}from"hono";import*as df from"jsonc-parser";var bv=P.getGlobalBasePath(),Jn=ae.join(bv,"projects");async function he(r){try{let e=await Zt.readFile(r,"utf-8"),t=[],n=df.parse(e,t);return t.length>0?null:n}catch(e){if(S(e))return null;throw e}}l(he,"readJsonFile");async function Er(r,e){try{return await Zt.mkdir(ae.dirname(r),{recursive:!0}),await Zt.writeFile(r,`${JSON.stringify(e,null,2)}
1425
- `,"utf-8"),!0}catch(t){if(S(t))return!1;throw t}}l(Er,"writeJsonFile");function Lt(r){return ae.join(Jn,r)}l(Lt,"getProjectPath");async function ji(r){let e=ae.join(Lt(r),"project.json");return await he(e)}l(ji,"getProjectConfig");async function Wl(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`}l(Wl,"calculateDuration");function mf(){let r=new kv;return r.get("/projects",async e=>{try{await Zt.mkdir(Jn,{recursive:!0});let n=(await Zt.readdir(Jn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Lt(o),a=await ji(o),c=await he(ae.join(i,"storage/state.json")),u=await he(ae.join(i,"storage/queue.json")),p=await he(ae.join(i,"storage/ideas.json")),m=await he(ae.join(i,"storage/shipped.json")),d=c?.currentTask,g=await Wl(d?.startedAt);return{id:o,name:a?.name||o.slice(0,8),path:a?.path||null,currentTask:d?{...d,duration:g}:null,pausedTask:c?.previousTask||null,stats:{queueCount:u?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:p?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:m?.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"),n=Lt(t);try{let[s,o,i,a,c,u]=await Promise.all([ji(t),he(ae.join(n,"storage/state.json")),he(ae.join(n,"storage/queue.json")),he(ae.join(n,"storage/ideas.json")),he(ae.join(n,"storage/shipped.json")),he(ae.join(n,"planning/roadmap.json"))]);o?.currentTask?.startedAt&&(o.currentTask.duration=await Wl(o.currentTask.startedAt));let p=new Date,m=new Date(p.getFullYear(),p.getMonth(),p.getDate()),d=new Date(m);d.setDate(d.getDate()-d.getDay());let g=i?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=m)?.length||0,f=i?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=d)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:o||{currentTask:null,previousTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},shipped:c||{shipped:[],lastUpdated:""},roadmap:u||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:g,tasksThisWeek:f,queueCount:i?.tasks?.filter(b=>!b.completed)?.length||0,ideasCount:a?.ideas?.filter(b=>b.status==="pending")?.length||0,shippedCount:c?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id"),n=Lt(t),s=ae.join(n,"storage/state.json");try{let o=await he(s);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i=o.currentTask,a={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await Er(s,a),e.json({success:!0,completedTask:i,message:`Completed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id"),n=Lt(t),s=ae.join(n,"storage/state.json");try{let i=(await e.req.json().catch(()=>({}))).reason,a=await he(s);if(!a?.currentTask)return e.json({success:!1,error:"No active task"},400);let c={id:a.currentTask.id,description:a.currentTask.description,status:"paused",startedAt:a.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:i},u={currentTask:null,previousTask:c,lastUpdated:new Date().toISOString()};return await Er(s,u),e.json({success:!0,pausedTask:c,message:`Paused: ${c.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id"),n=Lt(t),s=ae.join(n,"storage/state.json");try{let o=await he(s);if(!o?.previousTask)return e.json({success:!1,error:"No paused task"},400);let i={id:o.previousTask.id,description:o.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},a={currentTask:i,previousTask:null,lastUpdated:new Date().toISOString()};return await Er(s,a),e.json({success:!0,resumedTask:i,message:`Resumed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id"),n=Lt(t),s=ae.join(n,"storage/state.json"),o=ae.join(n,"storage/queue.json");try{let i=await e.req.json(),{taskId:a}=i;if(!a)return e.json({success:!1,error:"taskId required"},400);let c=await he(s),u=await he(o);if(c?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let p=u?.tasks?.find(g=>g.id===a);if(!p)return e.json({success:!1,error:"Task not found in queue"},404);let m={id:p.id,description:p.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:p.featureId},d={currentTask:m,previousTask:null,lastUpdated:new Date().toISOString()};return await Er(s,d),e.json({success:!0,task:m,message:`Started: ${m.description}`})}catch(i){return e.json({success:!1,error:String(i)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id"),n=Lt(t),s=ae.join(n,"storage/ideas.json");try{let o=await e.req.json(),{text:i,priority:a="medium",tags:c=[]}=o;if(!i)return e.json({success:!1,error:"text required"},400);let u=await he(s)||{ideas:[],lastUpdated:""},p={id:`idea_${Date.now().toString(36)}`,text:i,status:"pending",priority:a||"medium",tags:c,addedAt:new Date().toISOString()};return u.ideas.unshift(p),u.lastUpdated=new Date().toISOString(),await Er(s,u),e.json({success:!0,idea:p,message:`Captured: ${i.slice(0,50)}...`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.get("/stats/global",async e=>{try{await Zt.mkdir(Jn,{recursive:!0});let n=(await Zt.readdir(Jn,{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=Lt(c),p=await he(ae.join(u,"storage/state.json")),m=await he(ae.join(u,"storage/queue.json")),d=await he(ae.join(u,"storage/ideas.json")),g=await he(ae.join(u,"storage/shipped.json"));p?.currentTask&&a++,s+=m?.tasks?.filter(f=>!f.completed)?.length||0,o+=d?.ideas?.filter(f=>f.status==="pending")?.length||0,i+=g?.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 Zt.mkdir(Jn,{recursive:!0});let s=(await Zt.readdir(Jn,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name),o=null;if(t)for(let p of s){let m=await ji(p),d=m?.repoPath||m?.path;if(d&&t.startsWith(d)){o=p;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let p of u){let m=Lt(p),d=await he(ae.join(m,"storage/state.json")),g=await ji(p);if(d?.currentTask){i={id:p,name:g?.name||p,path:g?.repoPath||g?.path},a={...d.currentTask,duration:await Wl(d.currentTask.startedAt)};break}d?.previousTask&&!c&&(i={id:p,name:g?.name||p,path:g?.repoPath||g?.path},c=d.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}l(mf,"createExtendedRoutes");$i();import{streamSSE as Pv}from"hono/streaming";var gf=3600*1e3,Cv=300*1e3,vv=3e4;function ff(){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()>gf&&t(i)},Cv),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 Pv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,p={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)}},vv),d=setTimeout(()=>{t(a)},gf);typeof m=="object"&&"unref"in m&&m.unref(),typeof d=="object"&&"unref"in d&&d.unref(),r.set(a,{client:p,heartbeatInterval:m,ttlTimeout:d,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)}}}l(ff,"createSSEManager");function hf(r){let e=new xv,t=ff();r.enableCors!==!1&&e.use("*",Tv({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Ev()),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=pf(r.projectId,r.projectPath);e.route("/api",n);let s=mf();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(Jl())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: ${Jl()?"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)}}}l(hf,"createServer");var yf=3478;var Ut={runDir:l(()=>`${process.env.HOME||Ri("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ut.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ut.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ut.runDir()}/daemon.log`,"log")},wf=1800*1e3;function Bl(r){return Buffer.from(`${JSON.stringify(r)}
1426
- `)}l(Bl,"encodeMessage");var Ms=null,Ar=null,At=null,Ee=null;async function Sf(r){let e=Ut.socket(),t=Ut.pid(),n=Ut.runDir();if(dt.mkdirSync(n,{recursive:!0}),dt.existsSync(t)){let s=parseInt(dt.readFileSync(t,"utf-8").trim(),10);$v(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),dt.unlinkSync(t)}if(dt.existsSync(e)&&dt.unlinkSync(e),Ee={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:wf,idleTimer:null},At=new zn,Ms=Av(s=>Iv(s)),Ms.listen(e,()=>{dt.chmodSync(e,384),dt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),kf()}),Ms.on("error",s=>{console.error("Daemon socket error:",s.message),Ir(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||yf;Ar=hf({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Ar.start()}}catch{}if(process.on("SIGTERM",()=>Ir(0)),process.on("SIGINT",()=>Ir(0)),process.on("SIGHUP",()=>{At=new zn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Sf,"startDaemon");function Iv(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1427
- `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await jv(o);r.write(Bl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Bl(i))}}}),r.on("error",()=>{})}l(Iv,"handleConnection");async function jv(r){if(!Ee||!At)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(kf(),Ee.commandsServed++,Ee.lastActivity=Date.now(),r.command==="daemon")return Rv(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 Dv(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1421
+ `,"utf-8"),!0}catch{return!1}}l(ZC,"removePrjctSection");async function ev(){let r=qC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Qt.join(r,`.prjct-backup-${e}`);try{await Ke.mkdir(t,{recursive:!0});let n=P.getGlobalBasePath();return await D(n)&&await nf(n,Qt.join(t,".prjct-cli")),t}catch{return null}}l(ev,"createBackup");async function nf(r,e){await Ke.mkdir(e,{recursive:!0});let t=await Ke.readdir(r,{withFileTypes:!0});for(let n of t){let s=Qt.join(r,n.name),o=Qt.join(e,n.name);n.isDirectory()?await nf(s,o):await Ke.copyFile(s,o)}}l(nf,"copyDirectory");async function tv(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await ZC(o.path)&&n.push(o.path):o.type==="directory"?(await Ke.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await Ke.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${y(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Ti(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Ti("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${y(o)}`)}}return{deleted:n,errors:s}}l(tv,"performUninstall");async function nv(r){let e=KC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}l(nv,"promptConfirmation");async function sv(r={},e=process.cwd()){let t=await QC(),n=YC(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(ae.yellow(`
1422
+ 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(ae.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ae.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=P.getDisplayPath(c.path),p="";c.type==="section"?p=ae.dim("(section only)"):c.size&&(p=ae.dim(`(${tf(c.size)})`)),console.log(` ${ae.cyan(u.padEnd(35))} ${p}`),console.log(` ${ae.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${ae.cyan("Homebrew".padEnd(35))} ${ae.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${ae.cyan("npm global".padEnd(35))} ${ae.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ae.dim(` Total size: ${tf(o)}`)),console.log("")),r.dryRun)return console.log(ae.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(ae.blue("Creating backup..."));let c=await ev();c?(console.log(ae.green(`Backup created: ${P.getDisplayPath(c)}`)),console.log("")):console.log(ae.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(ae.yellow('Type "uninstall" to confirm:')),!await nv("> ")))return console.log(ae.yellow(`
1423
+ Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ae.blue("Removing prjct..."));let{deleted:i,errors:a}=await tv(t,n,r);if(console.log(""),i.length>0&&console.log(ae.green(`Removed ${i.length} items`)),a.length>0){console.log(ae.yellow(`
1424
+ ${a.length} errors:`));for(let c of a)console.log(ae.red(` - ${c}`))}return console.log(""),console.log(ae.green("prjct has been uninstalled.")),console.log(ae.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}}l(sv,"uninstall");var Ai=class extends pe{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return sv(e,t)}};var vr=new Is,Ii=new _n,rv=new xs,sf=new Ss,ov=new Ps,js=new bs,Ds=new Ln,rf=new Cs,iv=new Un,av=new Ts,cv=new Ai;function lv(){for(let[r,e]of Object.entries(Zg))L.registerCategory(r,e)}l(lv,"registerCategories");function of(){if(L.has("work"))return;lv();let r=l(e=>ef.find(t=>t.name===e),"getMeta");L.registerMethod("done",vr,"done",r("done")),L.registerMethod("next",vr,"next",r("next")),L.registerMethod("pause",vr,"pause",r("pause")),L.registerMethod("resume",vr,"resume",r("resume")),L.registerMethod("workflow",vr,"workflow",r("workflow")),L.registerMethod("init",Ii,"init",r("init")),L.registerMethod("bug",Ii,"bug",r("bug")),L.registerMethod("idea",Ii,"idea",r("idea")),L.registerMethod("spec",Ii,"spec",r("spec")),L.registerMethod("ship",rv,"ship",r("ship")),L.registerMethod("dash",sf,"dash",r("dash")),L.registerMethod("help",sf,"help",r("help")),L.registerMethod("perf",ov,"perf",r("perf")),L.registerMethod("velocity",av,"velocity",r("velocity")),L.registerMethod("cleanup",js,"cleanup",r("cleanup")),L.registerMethod("design",js,"design",r("design")),L.registerMethod("recover",js,"recover",r("recover")),L.registerMethod("undo",js,"undo",r("undo")),L.registerMethod("redo",js,"redo",r("redo")),L.registerMethod("history",js,"history",r("history")),L.registerMethod("analyze",Ds,"analyze",r("analyze")),L.registerMethod("sync",Ds,"sync",r("sync")),L.registerMethod("stats",Ds,"stats",r("stats")),L.registerMethod("status",Ds,"status",r("status")),L.registerMethod("seal",Ds,"seal",r("seal")),L.registerMethod("verify",Ds,"verify",r("verify")),L.registerMethod("start",rf,"start",r("start")),L.registerMethod("setup",rf,"setup",r("setup")),L.registerMethod("uninstall",cv,"uninstall",r("uninstall")),L.registerMethod("context",iv,"context",r("context"))}l(of,"registerAllCommands");of();ct();import{Hono as Sv}from"hono";import{cors as kv}from"hono/cors";import{logger as bv}from"hono/logger";function uv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}l(uv,"detectRuntime");function zl(){return uv()==="bun"}l(zl,"isBun");K();M();Yn();import ji from"node:fs/promises";import rt from"node:path";import{Hono as pv}from"hono";import*as af from"jsonc-parser";var It={state:"storage/state.json",queue:"storage/queue.json",ideas:"storage/ideas.json",shipped:"storage/shipped.json",roadmap:"planning/roadmap.json"};async function Ut(r){try{let e=await ji.readFile(r,"utf-8"),t=[],n=af.parse(e,t);return t.length>0?null:n}catch(e){return!S(e)&&!(e instanceof SyntaxError)&&H.error(`JSON read error: ${y(e)}`),null}}l(Ut,"readJsonFile");async function dv(r,e){try{return await ji.mkdir(rt.dirname(r),{recursive:!0}),await ji.writeFile(r,`${JSON.stringify(e,null,2)}
1425
+ `,"utf-8"),!0}catch(t){return H.error(`JSON write error: ${y(t)}`),!1}}l(dv,"writeJsonFile");function mv(r){return P.getGlobalProjectPath(r)}l(mv,"getProjectDataPath");function cf(r,e){let t=new pv,n=mv(r);return t.get("/state",async s=>{let o=await Ut(rt.join(n,It.state));return o?s.json(o):s.json({currentTask:null,lastUpdated:""})}),t.get("/queue",async s=>{let o=await Ut(rt.join(n,It.queue));return o?s.json(o):s.json({tasks:[],lastUpdated:""})}),t.get("/ideas",async s=>{let o=await Ut(rt.join(n,It.ideas));return o?s.json(o):s.json({ideas:[],lastUpdated:""})}),t.get("/roadmap",async s=>{let o=await Ut(rt.join(n,It.roadmap));return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await Ut(rt.join(n,It.shipped));return o?s.json(o):s.json({items:[],lastUpdated:""})}),t.get("/dashboard",async s=>{let[o,i,a,c,u]=await Promise.all([Ut(rt.join(n,It.state)),Ut(rt.join(n,It.queue)),Ut(rt.join(n,It.ideas)),Ut(rt.join(n,It.roadmap)),Ut(rt.join(n,It.shipped))]);return s.json({projectId:r,state:o||{currentTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},shipped:u||{items:[],lastUpdated:""},timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json(),i=rt.join(n,It.state);return await dv(i,o)?s.json({success:!0}):s.json({success:!1,error:"Failed to write"},500)}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=rt.join(n,"context",`${o}.md`),c=await ji.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return S(a)||H.error(`Context read error: ${y(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}l(cf,"createRoutes");K();M();import Zt from"node:fs/promises";import ce from"node:path";import{Hono as gv}from"hono";import*as lf from"jsonc-parser";var fv=P.getGlobalBasePath(),Gn=ce.join(fv,"projects");async function ye(r){try{let e=await Zt.readFile(r,"utf-8"),t=[],n=lf.parse(e,t);return t.length>0?null:n}catch(e){if(S(e))return null;throw e}}l(ye,"readJsonFile");async function xr(r,e){try{return await Zt.mkdir(ce.dirname(r),{recursive:!0}),await Zt.writeFile(r,`${JSON.stringify(e,null,2)}
1426
+ `,"utf-8"),!0}catch(t){if(S(t))return!1;throw t}}l(xr,"writeJsonFile");function Ht(r){return ce.join(Gn,r)}l(Ht,"getProjectPath");async function Di(r){let e=ce.join(Ht(r),"project.json");return await ye(e)}l(Di,"getProjectConfig");async function Jl(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`}l(Jl,"calculateDuration");function uf(){let r=new gv;return r.get("/projects",async e=>{try{await Zt.mkdir(Gn,{recursive:!0});let n=(await Zt.readdir(Gn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=Ht(o),a=await Di(o),c=await ye(ce.join(i,"storage/state.json")),u=await ye(ce.join(i,"storage/queue.json")),p=await ye(ce.join(i,"storage/ideas.json")),m=await ye(ce.join(i,"storage/shipped.json")),d=c?.currentTask,g=await Jl(d?.startedAt);return{id:o,name:a?.name||o.slice(0,8),path:a?.path||null,currentTask:d?{...d,duration:g}:null,pausedTask:c?.previousTask||null,stats:{queueCount:u?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:p?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:m?.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"),n=Ht(t);try{let[s,o,i,a,c,u]=await Promise.all([Di(t),ye(ce.join(n,"storage/state.json")),ye(ce.join(n,"storage/queue.json")),ye(ce.join(n,"storage/ideas.json")),ye(ce.join(n,"storage/shipped.json")),ye(ce.join(n,"planning/roadmap.json"))]);o?.currentTask?.startedAt&&(o.currentTask.duration=await Jl(o.currentTask.startedAt));let p=new Date,m=new Date(p.getFullYear(),p.getMonth(),p.getDate()),d=new Date(m);d.setDate(d.getDate()-d.getDay());let g=i?.tasks?.filter(k=>!k.completed||!k.completedAt?!1:new Date(k.completedAt)>=m)?.length||0,f=i?.tasks?.filter(k=>!k.completed||!k.completedAt?!1:new Date(k.completedAt)>=d)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:o||{currentTask:null,previousTask:null,lastUpdated:""},queue:i||{tasks:[],lastUpdated:""},ideas:a||{ideas:[],lastUpdated:""},shipped:c||{shipped:[],lastUpdated:""},roadmap:u||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:g,tasksThisWeek:f,queueCount:i?.tasks?.filter(k=>!k.completed)?.length||0,ideasCount:a?.ideas?.filter(k=>k.status==="pending")?.length||0,shippedCount:c?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id"),n=Ht(t),s=ce.join(n,"storage/state.json");try{let o=await ye(s);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i=o.currentTask,a={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await xr(s,a),e.json({success:!0,completedTask:i,message:`Completed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id"),n=Ht(t),s=ce.join(n,"storage/state.json");try{let i=(await e.req.json().catch(()=>({}))).reason,a=await ye(s);if(!a?.currentTask)return e.json({success:!1,error:"No active task"},400);let c={id:a.currentTask.id,description:a.currentTask.description,status:"paused",startedAt:a.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:i},u={currentTask:null,previousTask:c,lastUpdated:new Date().toISOString()};return await xr(s,u),e.json({success:!0,pausedTask:c,message:`Paused: ${c.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id"),n=Ht(t),s=ce.join(n,"storage/state.json");try{let o=await ye(s);if(!o?.previousTask)return e.json({success:!1,error:"No paused task"},400);let i={id:o.previousTask.id,description:o.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},a={currentTask:i,previousTask:null,lastUpdated:new Date().toISOString()};return await xr(s,a),e.json({success:!0,resumedTask:i,message:`Resumed: ${i.description}`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id"),n=Ht(t),s=ce.join(n,"storage/state.json"),o=ce.join(n,"storage/queue.json");try{let i=await e.req.json(),{taskId:a}=i;if(!a)return e.json({success:!1,error:"taskId required"},400);let c=await ye(s),u=await ye(o);if(c?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let p=u?.tasks?.find(g=>g.id===a);if(!p)return e.json({success:!1,error:"Task not found in queue"},404);let m={id:p.id,description:p.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:p.featureId},d={currentTask:m,previousTask:null,lastUpdated:new Date().toISOString()};return await xr(s,d),e.json({success:!0,task:m,message:`Started: ${m.description}`})}catch(i){return e.json({success:!1,error:String(i)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id"),n=Ht(t),s=ce.join(n,"storage/ideas.json");try{let o=await e.req.json(),{text:i,priority:a="medium",tags:c=[]}=o;if(!i)return e.json({success:!1,error:"text required"},400);let u=await ye(s)||{ideas:[],lastUpdated:""},p={id:`idea_${Date.now().toString(36)}`,text:i,status:"pending",priority:a||"medium",tags:c,addedAt:new Date().toISOString()};return u.ideas.unshift(p),u.lastUpdated=new Date().toISOString(),await xr(s,u),e.json({success:!0,idea:p,message:`Captured: ${i.slice(0,50)}...`})}catch(o){return e.json({success:!1,error:String(o)},500)}}),r.get("/stats/global",async e=>{try{await Zt.mkdir(Gn,{recursive:!0});let n=(await Zt.readdir(Gn,{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=Ht(c),p=await ye(ce.join(u,"storage/state.json")),m=await ye(ce.join(u,"storage/queue.json")),d=await ye(ce.join(u,"storage/ideas.json")),g=await ye(ce.join(u,"storage/shipped.json"));p?.currentTask&&a++,s+=m?.tasks?.filter(f=>!f.completed)?.length||0,o+=d?.ideas?.filter(f=>f.status==="pending")?.length||0,i+=g?.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 Zt.mkdir(Gn,{recursive:!0});let s=(await Zt.readdir(Gn,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name),o=null;if(t)for(let p of s){let m=await Di(p),d=m?.repoPath||m?.path;if(d&&t.startsWith(d)){o=p;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let p of u){let m=Ht(p),d=await ye(ce.join(m,"storage/state.json")),g=await Di(p);if(d?.currentTask){i={id:p,name:g?.name||p,path:g?.repoPath||g?.path},a={...d.currentTask,duration:await Jl(d.currentTask.startedAt)};break}d?.previousTask&&!c&&(i={id:p,name:g?.name||p,path:g?.repoPath||g?.path},c=d.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}l(uf,"createExtendedRoutes");Mi();import{streamSSE as hv}from"hono/streaming";var pf=3600*1e3,yv=300*1e3,wv=3e4;function df(){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()>pf&&t(i)},yv),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 hv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,p={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)}},wv),d=setTimeout(()=>{t(a)},pf);typeof m=="object"&&"unref"in m&&m.unref(),typeof d=="object"&&"unref"in d&&d.unref(),r.set(a,{client:p,heartbeatInterval:m,ttlTimeout:d,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)}}}l(df,"createSSEManager");function mf(r){let e=new Sv,t=df();r.enableCors!==!1&&e.use("*",kv({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",bv()),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=cf(r.projectId,r.projectPath);e.route("/api",n);let s=uf();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(zl())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: ${zl()?"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)}}}l(mf,"createServer");var gf=3478;var Gt={runDir:l(()=>`${process.env.HOME||$i("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Gt.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Gt.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Gt.runDir()}/daemon.log`,"log")},ff=1800*1e3;function Wl(r){return Buffer.from(`${JSON.stringify(r)}
1427
+ `)}l(Wl,"encodeMessage");var Rs=null,Tr=null,jt=null,Te=null;async function hf(r){let e=Gt.socket(),t=Gt.pid(),n=Gt.runDir();if(mt.mkdirSync(n,{recursive:!0}),mt.existsSync(t)){let s=parseInt(mt.readFileSync(t,"utf-8").trim(),10);Ev(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),mt.unlinkSync(t)}if(mt.existsSync(e)&&mt.unlinkSync(e),Te={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ff,idleTimer:null},jt=new Hn,Rs=Pv(s=>Cv(s)),Rs.listen(e,()=>{mt.chmodSync(e,384),mt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),yf()}),Rs.on("error",s=>{console.error("Daemon socket error:",s.message),Er(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||gf;Tr=mf({port:i,projectId:o,projectPath:s,enableLogging:!1}),await Tr.start()}}catch{}if(process.on("SIGTERM",()=>Er(0)),process.on("SIGINT",()=>Er(0)),process.on("SIGHUP",()=>{jt=new Hn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(hf,"startDaemon");function Cv(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
1428
+ `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await vv(o);r.write(Wl(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Wl(i))}}}),r.on("error",()=>{})}l(Cv,"handleConnection");async function vv(r){if(!Te||!jt)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(yf(),Te.commandsServed++,Te.lastActivity=Date.now(),r.command==="daemon")return Tv(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 xv(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1428
1429
  `)||o.message||void 0,stderr:t.join(`
1429
- `)||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}}}l(jv,"handleRequest");async function Dv(r){let e=r.args.join(" ")||null,t=r.options;switch(r.command){case"sync":return At.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,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return At.status(r.cwd,{json:t.json===!0});case"stats":return At.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return At.seal(r.cwd,{json:t.json===!0});case"verify":return At.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"design":return At.design(e||"",t);case"analyze":return At.analyze(t);case"cleanup":return At.cleanup(t);default:return _.execute(r.command,e,r.cwd)}}l(Dv,"executeCommand");function Rv(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ut.socket(),uptime:Ee?Date.now()-Ee.startedAt:0,commandsServed:Ee?.commandsServed??0,lastActivity:Ee?new Date(Ee.lastActivity).toISOString():null,registeredCommands:_.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Ir(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(Rv,"handleDaemonCommand");function kf(){Ee&&(Ee.idleTimer&&clearTimeout(Ee.idleTimer),Ee.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Ee.idleTimeoutMs/1e3/60} minutes, shutting down`),Ir(0)},Ee.idleTimeoutMs),Ee.idleTimer.unref&&Ee.idleTimer.unref())}l(kf,"resetIdleTimer");function Ir(r){console.log("Daemon shutting down..."),Ee?.idleTimer&&clearTimeout(Ee.idleTimer),Ar&&(Ar.stop(),Ar=null),Ms&&(Ms.close(),Ms=null);let e=Ut.socket(),t=Ut.pid();try{dt.existsSync(e)&&dt.unlinkSync(e)}catch{}try{dt.existsSync(t)&&dt.unlinkSync(t)}catch{}process.exit(r)}l(Ir,"shutdown");function $v(r){try{return process.kill(r,0),!0}catch{return!1}}l($v,"isProcessRunning");var Vl=process.argv.slice(2),Mv=parseInt(Vl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,Fv=Vl.includes("--no-http"),Ov=Vl.includes("--foreground");Sf({port:Mv,noHttp:Fv,foreground:Ov}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
1430
+ `)||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}}}l(vv,"handleRequest");async function xv(r){let e=r.args.join(" ")||null,t=r.options;switch(r.command){case"sync":return jt.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,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return jt.status(r.cwd,{json:t.json===!0});case"stats":return jt.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return jt.seal(r.cwd,{json:t.json===!0});case"verify":return jt.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"design":return jt.design(e||"",t);case"analyze":return jt.analyze(t);case"cleanup":return jt.cleanup(t);default:return L.execute(r.command,e,r.cwd)}}l(xv,"executeCommand");function Tv(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Gt.socket(),uptime:Te?Date.now()-Te.startedAt:0,commandsServed:Te?.commandsServed??0,lastActivity:Te?new Date(Te.lastActivity).toISOString():null,registeredCommands:L.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Er(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(Tv,"handleDaemonCommand");function yf(){Te&&(Te.idleTimer&&clearTimeout(Te.idleTimer),Te.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Te.idleTimeoutMs/1e3/60} minutes, shutting down`),Er(0)},Te.idleTimeoutMs),Te.idleTimer.unref&&Te.idleTimer.unref())}l(yf,"resetIdleTimer");function Er(r){console.log("Daemon shutting down..."),Te?.idleTimer&&clearTimeout(Te.idleTimer),Tr&&(Tr.stop(),Tr=null),Rs&&(Rs.close(),Rs=null);let e=Gt.socket(),t=Gt.pid();try{mt.existsSync(e)&&mt.unlinkSync(e)}catch{}try{mt.existsSync(t)&&mt.unlinkSync(t)}catch{}process.exit(r)}l(Er,"shutdown");function Ev(r){try{return process.kill(r,0),!0}catch{return!1}}l(Ev,"isProcessRunning");var Bl=process.argv.slice(2),Av=parseInt(Bl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,Iv=Bl.includes("--no-http"),jv=Bl.includes("--foreground");hf({port:Av,noHttp:Iv,foreground:jv}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});