prjct-cli 1.23.0 → 1.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1429 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath as __fileURLToPath } from 'url';
3
+ import { dirname as __pathDirname } from 'path';
4
+ const __filename = __fileURLToPath(import.meta.url);
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(`
12
+ -- =======================================================================
13
+ -- Document storage (backward-compatible with JSON file pattern)
14
+ -- =======================================================================
15
+ -- Each row replaces one JSON file (state.json, queue.json, etc.)
16
+ -- StorageManager reads/writes entire documents via key lookup.
17
+ CREATE TABLE kv_store (
18
+ key TEXT PRIMARY KEY,
19
+ data TEXT NOT NULL,
20
+ updated_at TEXT NOT NULL
21
+ );
22
+
23
+ -- =======================================================================
24
+ -- Normalized: Tasks
25
+ -- =======================================================================
26
+ CREATE TABLE tasks (
27
+ id TEXT PRIMARY KEY,
28
+ description TEXT NOT NULL,
29
+ type TEXT,
30
+ status TEXT NOT NULL,
31
+ parent_description TEXT,
32
+ branch TEXT,
33
+ linear_id TEXT,
34
+ linear_uuid TEXT,
35
+ session_id TEXT,
36
+ feature_id TEXT,
37
+ started_at TEXT NOT NULL,
38
+ completed_at TEXT,
39
+ shipped_at TEXT,
40
+ paused_at TEXT,
41
+ pause_reason TEXT,
42
+ pr_url TEXT,
43
+ expected_value TEXT,
44
+ data TEXT
45
+ );
46
+
47
+ CREATE INDEX idx_tasks_status ON tasks(status);
48
+ CREATE INDEX idx_tasks_type ON tasks(type);
49
+ CREATE INDEX idx_tasks_branch ON tasks(branch);
50
+ CREATE INDEX idx_tasks_linear_id ON tasks(linear_id);
51
+
52
+ -- =======================================================================
53
+ -- Normalized: Subtasks
54
+ -- =======================================================================
55
+ CREATE TABLE subtasks (
56
+ id TEXT PRIMARY KEY,
57
+ task_id TEXT NOT NULL,
58
+ description TEXT NOT NULL,
59
+ status TEXT NOT NULL,
60
+ domain TEXT,
61
+ agent TEXT,
62
+ sort_order INTEGER NOT NULL,
63
+ depends_on TEXT,
64
+ started_at TEXT,
65
+ completed_at TEXT,
66
+ output TEXT,
67
+ summary TEXT,
68
+ FOREIGN KEY (task_id) REFERENCES tasks(id)
69
+ );
70
+
71
+ CREATE INDEX idx_subtasks_task_id ON subtasks(task_id);
72
+ CREATE INDEX idx_subtasks_status ON subtasks(status);
73
+
74
+ -- =======================================================================
75
+ -- Normalized: Queue Tasks
76
+ -- =======================================================================
77
+ CREATE TABLE queue_tasks (
78
+ id TEXT PRIMARY KEY,
79
+ description TEXT NOT NULL,
80
+ type TEXT,
81
+ priority TEXT,
82
+ section TEXT,
83
+ created_at TEXT NOT NULL,
84
+ completed INTEGER DEFAULT 0,
85
+ completed_at TEXT,
86
+ feature_id TEXT,
87
+ feature_name TEXT
88
+ );
89
+
90
+ CREATE INDEX idx_queue_tasks_section ON queue_tasks(section);
91
+ CREATE INDEX idx_queue_tasks_priority ON queue_tasks(priority);
92
+ CREATE INDEX idx_queue_tasks_completed ON queue_tasks(completed);
93
+
94
+ -- =======================================================================
95
+ -- Normalized: Ideas
96
+ -- =======================================================================
97
+ CREATE TABLE ideas (
98
+ id TEXT PRIMARY KEY,
99
+ text TEXT NOT NULL,
100
+ status TEXT NOT NULL DEFAULT 'pending',
101
+ priority TEXT NOT NULL DEFAULT 'medium',
102
+ tags TEXT,
103
+ added_at TEXT NOT NULL,
104
+ converted_to TEXT,
105
+ details TEXT,
106
+ data TEXT
107
+ );
108
+
109
+ CREATE INDEX idx_ideas_status ON ideas(status);
110
+ CREATE INDEX idx_ideas_priority ON ideas(priority);
111
+
112
+ -- =======================================================================
113
+ -- Normalized: Shipped Features
114
+ -- =======================================================================
115
+ CREATE TABLE shipped_features (
116
+ id TEXT PRIMARY KEY,
117
+ name TEXT NOT NULL,
118
+ shipped_at TEXT NOT NULL,
119
+ version TEXT NOT NULL,
120
+ description TEXT,
121
+ type TEXT,
122
+ duration TEXT,
123
+ data TEXT
124
+ );
125
+
126
+ CREATE INDEX idx_shipped_version ON shipped_features(version);
127
+ CREATE INDEX idx_shipped_at ON shipped_features(shipped_at);
128
+
129
+ -- =======================================================================
130
+ -- Events (replaces events.jsonl)
131
+ -- =======================================================================
132
+ CREATE TABLE events (
133
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
134
+ type TEXT NOT NULL,
135
+ task_id TEXT,
136
+ data TEXT,
137
+ timestamp TEXT NOT NULL
138
+ );
139
+
140
+ CREATE INDEX idx_events_type ON events(type);
141
+ CREATE INDEX idx_events_task_id ON events(task_id);
142
+ CREATE INDEX idx_events_timestamp ON events(timestamp);
143
+
144
+ -- =======================================================================
145
+ -- Analysis (draft + sealed)
146
+ -- =======================================================================
147
+ CREATE TABLE analysis (
148
+ id TEXT PRIMARY KEY,
149
+ status TEXT NOT NULL,
150
+ commit_hash TEXT,
151
+ signature TEXT,
152
+ sealed_at TEXT,
153
+ analyzed_at TEXT,
154
+ data TEXT NOT NULL
155
+ );
156
+
157
+ -- =======================================================================
158
+ -- Index: File scores and checksums
159
+ -- =======================================================================
160
+ CREATE TABLE index_files (
161
+ path TEXT PRIMARY KEY,
162
+ score REAL,
163
+ size INTEGER,
164
+ mtime TEXT,
165
+ language TEXT,
166
+ categories TEXT,
167
+ domain TEXT
168
+ );
169
+
170
+ CREATE INDEX idx_index_files_domain ON index_files(domain);
171
+ CREATE INDEX idx_index_files_score ON index_files(score);
172
+
173
+ CREATE TABLE index_checksums (
174
+ path TEXT PRIMARY KEY,
175
+ checksum TEXT NOT NULL,
176
+ size INTEGER,
177
+ mtime TEXT
178
+ );
179
+
180
+ -- =======================================================================
181
+ -- Index: Metadata (project-index, domains, categories-cache)
182
+ -- =======================================================================
183
+ CREATE TABLE index_meta (
184
+ key TEXT PRIMARY KEY,
185
+ data TEXT NOT NULL,
186
+ updated_at TEXT NOT NULL
187
+ );
188
+
189
+ -- =======================================================================
190
+ -- Memory (key-value with domain tagging)
191
+ -- =======================================================================
192
+ CREATE TABLE memory (
193
+ key TEXT PRIMARY KEY,
194
+ domain TEXT,
195
+ value TEXT,
196
+ confidence REAL DEFAULT 1.0,
197
+ updated_at TEXT NOT NULL
198
+ );
199
+
200
+ CREATE INDEX idx_memory_domain ON memory(domain);
201
+
202
+ -- =======================================================================
203
+ -- Metrics: Daily stats for trend analysis
204
+ -- =======================================================================
205
+ CREATE TABLE metrics_daily (
206
+ date TEXT PRIMARY KEY,
207
+ tokens_saved INTEGER NOT NULL DEFAULT 0,
208
+ syncs INTEGER NOT NULL DEFAULT 0,
209
+ avg_compression_rate REAL NOT NULL DEFAULT 0,
210
+ total_duration INTEGER NOT NULL DEFAULT 0
211
+ );
212
+
213
+ -- =======================================================================
214
+ -- Velocity: Sprint data
215
+ -- =======================================================================
216
+ CREATE TABLE velocity_sprints (
217
+ sprint_number INTEGER PRIMARY KEY,
218
+ points_completed REAL NOT NULL DEFAULT 0,
219
+ tasks_completed INTEGER NOT NULL DEFAULT 0,
220
+ estimation_accuracy REAL NOT NULL DEFAULT 0,
221
+ avg_variance REAL NOT NULL DEFAULT 0,
222
+ started_at TEXT,
223
+ ended_at TEXT
224
+ );
225
+ `)},"up")},{version:2,name:"archives-table",up:l(r=>{r.run(`
226
+ -- =======================================================================
227
+ -- Archives: Stale data moved out of active storage (PRJ-267)
228
+ -- =======================================================================
229
+ CREATE TABLE archives (
230
+ id TEXT PRIMARY KEY,
231
+ entity_type TEXT NOT NULL,
232
+ entity_id TEXT NOT NULL,
233
+ entity_data TEXT NOT NULL,
234
+ summary TEXT,
235
+ archived_at TEXT NOT NULL,
236
+ reason TEXT NOT NULL
237
+ );
238
+
239
+ CREATE INDEX idx_archives_entity_type ON archives(entity_type);
240
+ CREATE INDEX idx_archives_archived_at ON archives(archived_at);
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(`
243
+ CREATE TABLE IF NOT EXISTS _migrations (
244
+ version INTEGER PRIMARY KEY,
245
+ name TEXT NOT NULL,
246
+ applied_at TEXT NOT NULL
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
250
+
251
+ Return ONLY valid JSON matching this schema (no markdown, no explanation):
252
+
253
+ \`\`\`json
254
+ ${e.example}
255
+ \`\`\`
256
+
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(`
263
+ INSERT OR REPLACE INTO tasks
264
+ (id, description, type, status, parent_description, branch, linear_id,
265
+ linear_uuid, session_id, feature_id, started_at, completed_at,
266
+ shipped_at, paused_at, pause_reason, pr_url, expected_value, data)
267
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
268
+ `),s=t.prepare(`
269
+ INSERT OR REPLACE INTO subtasks
270
+ (id, task_id, description, status, domain, agent, sort_order,
271
+ depends_on, started_at, completed_at, output, summary)
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(`
274
+ INSERT OR REPLACE INTO queue_tasks
275
+ (id, description, type, priority, section, created_at, completed, completed_at,
276
+ feature_id, feature_name)
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(`
279
+ INSERT OR REPLACE INTO ideas
280
+ (id, text, status, priority, tags, added_at, converted_to, details, data)
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(`
283
+ INSERT OR REPLACE INTO shipped_features
284
+ (id, name, shipped_at, version, description, type, duration, data)
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(`
287
+ INSERT OR REPLACE INTO metrics_daily
288
+ (date, tokens_saved, syncs, avg_compression_rate, total_duration)
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(`
291
+ INSERT OR REPLACE INTO analysis
292
+ (id, status, commit_hash, signature, sealed_at, analyzed_at, data)
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(`
295
+ INSERT OR REPLACE INTO index_files
296
+ (path, categories, domain, score, size, mtime, language)
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(`
299
+ INSERT OR REPLACE INTO index_files
300
+ (path, score, size, mtime, language, categories, domain)
301
+ VALUES (?, ?, ?, ?, NULL,
302
+ COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
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(`
308
+ `);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:
311
+ ${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
316
+ <!-- projectId: ${e} -->
317
+ <!-- Generated: ${new Date().toISOString()} -->
318
+
319
+ ## PROJECT DATA
320
+
321
+ ### Dependencies (${f.length+b.length})
322
+
323
+ **Production** (${f.length}):
324
+ ${f.length>0?f.map(v=>`- ${v}: ${c.dependencies[v]}`).join(`
325
+ `):"_None_"}
326
+
327
+ **Dev** (${b.length}):
328
+ ${b.length>0?b.map(v=>`- ${v}: ${c.devDependencies[v]}`).join(`
329
+ `):"_None_"}
330
+
331
+ ### Scripts
332
+
333
+ ${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([v,$])=>`- \`${v}\`: ${$}`).join(`
334
+ `):"_None_"}
335
+
336
+ ### Git
337
+
338
+ - Branch: ${a.branch}
339
+ - Commits: ${a.commits}
340
+ - Contributors: ${a.contributors}
341
+ - Uncommitted: ${a.hasChanges?"Yes":"No"}
342
+
343
+ **Recent:**
344
+ ${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(v=>`- \`${v.hash}\` ${v.message}`).join(`
345
+ `):"_None_"}
346
+
347
+ ---
348
+
349
+ ## CURRENT STATE
350
+
351
+ **Now:** ${m?m.description:"_No active task_"}
352
+
353
+ **Queue (${d.length}):**
354
+ ${d.length>0?d.slice(0,10).map((v,$)=>`${$+1}. ${v.description}`).join(`
355
+ `):"_Empty_"}
356
+
357
+ **Active Features (${g.length}):**
358
+ ${g.length>0?g.map(v=>`- ${v.name}`).join(`
359
+ `):"_None_"}
360
+
361
+ **Ideas (${o.length}):**
362
+ ${o.length>0?o.slice(0,5).map(v=>`- ${v.title}`).join(`
363
+ `):"_None_"}
364
+
365
+ ---
366
+
367
+ ## AGENTS
368
+
369
+ ${i.length>0?i.map(v=>`- **${v.name}**: ${v.role||"Specialist"}`).join(`
370
+ `):"_None_"}
371
+
372
+ ---
373
+
374
+ ## DATA LOCATION
375
+
376
+ \`\`\`
377
+ ~/.prjct-cli/projects/${e}/
378
+ \u251C\u2500\u2500 data/ # JSON (source of truth)
379
+ \u2502 \u251C\u2500\u2500 project.json
380
+ \u2502 \u251C\u2500\u2500 tasks/
381
+ \u2502 \u251C\u2500\u2500 features/
382
+ \u2502 \u251C\u2500\u2500 ideas/
383
+ \u2502 \u2514\u2500\u2500 agents/
384
+ \u251C\u2500\u2500 context/ # MD (for Claude)
385
+ \u2502 \u251C\u2500\u2500 CLAUDE.md
386
+ \u2502 \u251C\u2500\u2500 now.md
387
+ \u2502 \u2514\u2500\u2500 queue.md
388
+ \u2514\u2500\u2500 sync/ # Sync state
389
+ \u2514\u2500\u2500 pending.json
390
+ \`\`\`
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
+
393
+ **Task:** ${t.description}
394
+
395
+ **Started:** ${t.startedAt||"Unknown"}
396
+
397
+ **Priority:** ${t.priority||"medium"}
398
+ `:`# NOW
399
+
400
+ _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
+
403
+ ${t.length>0?t.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
404
+ `):"_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
+
407
+ **Name:** ${e.name||"Unknown"}
408
+ **Version:** ${e.version||"N/A"}
409
+ **Stack:** ${e.techStack?.join(", ")||"Not detected"}
410
+
411
+ ## Git
412
+
413
+ - Branch: ${t.branch}
414
+ - Commits: ${t.commits}
415
+ - Status: ${t.hasChanges?"Has uncommitted changes":"Clean"}
416
+
417
+ ## Dependencies
418
+
419
+ - Production: ${Object.keys(n.dependencies).length}
420
+ - 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(`
423
+ `)}
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}
432
+
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
+
435
+ ---
436
+
437
+ `,n+=`## Your Customizations
438
+
439
+ `,n+=`_The sections below are preserved during sync. Edit freely._
440
+
441
+ `;for(let s of t)n+=s.content,n+=`
442
+
443
+ `;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:`
449
+ AGENTIC EXECUTION:
450
+ - Read: templates/agentic/orchestrator.md
451
+ - Analyze task: "${e}"
452
+ - Available specialists: ${s.join(", ")}
453
+ - Claude decides which agent(s) to use
454
+ - Always prefer specialists over generalist
455
+ - 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(`
459
+ `),s=null,o=[];for(let i of n){let a=i.match(/^##\s+(.+)$/);if(a){s&&(s.content=o.join(`
460
+ `).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
+
463
+ ${a.content}`)}}let o=[];for(let[i,a]of t)o.push(`## ${i}
464
+
465
+ ${a}`);return{content:o.join(`
466
+
467
+ ---
468
+
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
+ `),s=null,o=null,i=[],a=l(()=>{if(s){if(o){let c=i.join(`
471
+ `).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
+ `).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(`
482
+ 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
+ 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(`
488
+ `);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
+ \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:
495
+ `;return r.warnings.forEach(t=>{e+=` - ${t}
496
+ `}),r.recommendations.length>0&&(e+=`
497
+ Recommendations:
498
+ `,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 '
502
+ /^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
503
+ NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
504
+ END { for (f in files) print files[f], lastmod[f], f }
505
+ '`,{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
+ /^[0-9]+$/ { timestamp=$1; next }
508
+ NF {
509
+ count[$0]++
510
+ if (!lastmod[$0] || timestamp > lastmod[$0]) lastmod[$0]=timestamp
511
+ }
512
+ END {
513
+ for (f in count) print count[f], lastmod[f], f
514
+ }
515
+ ' | 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 '
518
+ /^[0-9]+$/ { timestamp=$1; next }
519
+ NF {
520
+ count[$0]++
521
+ if (!lastmod[$0] || timestamp > lastmod[$0]) lastmod[$0]=timestamp
522
+ }
523
+ END {
524
+ for (f in count) print count[f], lastmod[f], f
525
+ }
526
+ '`,{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(`
529
+ `),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
+
532
+ Task: "${r}"
533
+
534
+ Available domains in this project: ${n.join(", ")}
535
+ Available agents: ${e.agents.join(", ")||"none"}
536
+ Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
537
+
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(`
543
+ 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(`
547
+ `)}
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}
551
+ `),s.role&&p.push(`Role: ${s.role}
552
+ `),s.skills?.length&&p.push(`Skills: ${s.skills.join(", ")}
553
+ `),p.push(`
554
+ Apply specialized expertise. Read agent file for details if needed.
555
+
556
+ `)),p.push(`TASK: ${e.frontmatter.description}
557
+ `),e.frontmatter["allowed-tools"]&&p.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
558
+ `);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
+ ${I}
561
+ `)}if(u){let C=u.sealedAnalysis;if(p.push(`
562
+ ## PROJECT ANALYSIS (Sealed)
563
+ `),p.push(`**Ecosystem**: ${u.project.ecosystem}
564
+ `),p.push(`**Primary Domain**: ${u.primaryDomain}
565
+ `),p.push(`**Domains**: ${u.detectedDomains.join(", ")}
566
+ `),C){if(C.languages.length>0&&p.push(`**Languages**: ${C.languages.join(", ")}
567
+ `),C.frameworks.length>0&&p.push(`**Frameworks**: ${C.frameworks.join(", ")}
568
+ `),C.packageManager&&p.push(`**Package Manager**: ${C.packageManager}
569
+ `),C.sourceDir&&p.push(`**Source Dir**: ${C.sourceDir}
570
+ `),C.testDir&&p.push(`**Test Dir**: ${C.testDir}
571
+ `),p.push(`**Files Analyzed**: ${C.fileCount}
572
+ `),p.push(`**Analysis Status**: ${C.status}${C.commitHash?` (commit: ${C.commitHash.slice(0,8)})`:""}
573
+ `),C.patterns.length>0){p.push(`
574
+ ### Code Patterns (Follow These)
575
+ `);for(let I of C.patterns)p.push(`- **${I.name}**: ${I.description}${I.location?` (${I.location})`:""}
576
+ `)}if(C.antiPatterns.length>0){p.push(`
577
+ ### Anti-Patterns (Avoid These)
578
+ `);for(let I of C.antiPatterns)p.push(`- **${I.issue}** in \`${I.file}\` \u2014 ${I.suggestion}
579
+ `)}}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
+ `),p.push(C),p.push(`
582
+ 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
+ ## STACK
585
+ Stack: ${I}
586
+ `),v||p.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
587
+ `)}if(u){if(u.agents.length>0){p.push(`
588
+ ### LOADED AGENTS (Project-Specific Specialists)
589
+
590
+ `);for(let I of u.agents){p.push(`#### Agent: ${I.name} (${I.domain})
591
+ `),I.effort&&p.push(`Effort: ${I.effort}
592
+ `),I.model&&p.push(`Model: ${I.model}
593
+ `),I.skills.length>0&&p.push(`Skills: ${I.skills.join(", ")}
594
+ `);let ye=$n(I.content,this.getEffectiveBudgets().agentContent);p.push(`\`\`\`markdown
595
+ ${ye}
596
+ \`\`\`
597
+
598
+ `)}}let C=um(u.skills,u.detectedDomains);if(C.length>0){p.push(`### LOADED SKILLS (From Agent Frontmatter)
599
+
600
+ `);for(let I of C){p.push(`#### Skill: ${I.name}
601
+ `);let ye=$n(I.content,this.getEffectiveBudgets().skillContent);p.push(`\`\`\`markdown
602
+ ${ye}
603
+ \`\`\`
604
+
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
+ `),p.push(I))}if(c?.isPlanning&&(p.push(`
607
+ ## PLAN MODE
608
+ Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
609
+ `),c.allowedTools&&p.push(`Tools: ${c.allowedTools.join(", ")}
610
+ `)),c?.requiresApproval&&p.push(`
611
+ ## APPROVAL REQUIRED
612
+ 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)}
615
+ `)}else p.push(this.buildCriticalRules());if(u?.realContext){let C=u.realContext;if(p.push(`
616
+ ### CODEBASE CONTEXT
617
+
618
+ `),p.push(`**Git State**: Branch \`${C.gitBranch}\` | ${C.gitStatus}
619
+
620
+ `),C.relevantFiles.length>0){p.push(`**Relevant Files** (scored by task relevance):
621
+ `),p.push(`| Score | File | Why |
622
+ `),p.push(`|-------|------|-----|
623
+ `);for(let I of C.relevantFiles.slice(0,8))p.push(`| ${I.score} | ${I.path} | ${I.reason} |
624
+ `);p.push(`
625
+ `)}if(C.signatures.length>0){p.push(`**Code Signatures** (top files):
626
+ `);for(let I of C.signatures)p.push(`\`\`\`typescript
627
+ // ${I.path}
628
+ ${I.content}
629
+ \`\`\`
630
+ `);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
+
633
+ `)}}let Pe=t.files||[];if(Pe.length>0){let C=Pe.slice(0,5).join(", ");p.push(`
634
+ ## FILES: ${Pe.length} available. Top: ${C}
635
+ `),p.push(`Read BEFORE modifying. Use Glob/Grep to find more.
636
+
637
+ `)}else b&&p.push(`
638
+ ## PROJECT: ${b}
639
+ Read files before modifying.
640
+
641
+ `);let Ue=this.filterRelevantState(n);if(Ue&&(p.push(`
642
+ ## PRJCT STATE (Project Management Data)
643
+ `),p.push(Ue),p.push(`
644
+ `)),u?.velocityContext&&(p.push(`
645
+ ### VELOCITY (Historical Estimation Data)
646
+
647
+ `),p.push(u.velocityContext),p.push(`
648
+
649
+ `)),o&&Object.keys(o).some(C=>o[C])){p.push(`
650
+ ## PROJECT DEFAULTS (apply automatically)
651
+ `);for(let[C,I]of Object.entries(o))I&&p.push(`- ${C}: ${I}
652
+ `)}if(i?.plan&&i.plan.length>0){if(p.push(`
653
+ ## THINK FIRST (reasoning from analysis)
654
+ `),i.conclusions&&i.conclusions.length>0){p.push(`Conclusions:
655
+ `);for(let C of i.conclusions)p.push(` \u2192 ${C}
656
+ `)}p.push(`Plan:
657
+ `);for(let C=0;C<i.plan.length;C++)p.push(` ${C+1}. ${i.plan[C]}
658
+ `);p.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
659
+ `)}if(a&&a.length>0){p.push(`
660
+ ## CONTEXT (apply these)
661
+ `);for(let C of a)p.push(`- **${C.title}**: ${C.content}
662
+ `),C.tags&&C.tags.length>0&&p.push(` Tags: ${C.tags.join(", ")}
663
+ `)}if(p.push(`
664
+ ---
665
+ `),p.push(e.content),u?.requiresFragmentation&&u.subtasks){p.push(`
666
+ ### SUBTASKS (Execute in Order)
667
+
668
+ `),p.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),p.push(`| # | Domain | Description | Status |
669
+ `),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
+ `)}let C=u.subtasks.find(I=>I.status==="in_progress");if(C&&(p.push(`
672
+ **FOCUS ON SUBTASK #${C.order}**: ${C.description}
673
+ `),p.push(`Agent: ${C.agent} | Domain: ${C.domain}
674
+ `),C.dependsOn.length>0&&p.push(`Dependencies: ${C.dependsOn.join(", ")}
675
+ `),C.handoff)){let I=C.handoff;p.push(`
676
+ ### Previous Subtask Handoff
677
+
678
+ `),p.push(`**From:** ${I.fromSubtask}
679
+
680
+ `),p.push(`**What was done:**
681
+ `);for(let ye of I.whatWasDone)p.push(`- ${ye}
682
+ `);if(I.filesChanged.length>0){p.push(`
683
+ **Files changed:**
684
+ `);for(let ye of I.filesChanged)p.push(`- \`${ye.path}\` (${ye.action})
685
+ `)}p.push(`
686
+ **Context for this subtask:**
687
+ ${I.outputForNextAgent}
688
+ `)}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
+ ${I}
691
+ `)}if(d.checklist){let C=await this.loadChecklistRouting(),I=await this.loadChecklists();C&&Object.keys(I).length>0&&(p.push(`
692
+ ## QUALITY CHECKLISTS
693
+ `),p.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
694
+ `),p.push(`Available: ${Object.keys(I).join(", ")}
695
+ `),p.push(`Path: templates/checklists/{name}.md
696
+ `),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
+ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
699
+
700
+ `):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
701
+
702
+ `),n.push(`Read the project context and provide your analysis.
703
+ `),n.push(`No predetermined patterns - decide based on what you find.
704
+
705
+ `),n.push(`## Project Context
706
+ `),n.push(`- Path: ${t.projectPath}
707
+ `),n.push(`- ID: ${t.projectId}
708
+
709
+ `),n.join("")}extractPatternSummary(e){if(!e)return null;let t=[],n=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(n){let a=n[0].split(`
710
+ `).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
711
+ `);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
712
+ Avoid:
713
+ ${a}`)}let o=t.join(`
714
+ `);return $n(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
715
+ ## RULES (CRITICAL)
716
+ 1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
717
+ 2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
718
+ 3. **NO HALLUCINATIONS**: Don't invent files, functions, or paths. If unsure, READ first.
719
+ 4. **GIT SAFETY**: Never use checkout/reset --hard/clean. Always check status first.
720
+ 5. **VERIFY**: After writing, confirm code matches project patterns.
721
+ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSize||0} files available. Read what you need.
722
+ `}buildEfficiencyDirective(){return`
723
+ ## OUTPUT RULES
724
+ - Be concise. Maximum 4 lines of explanation unless asked for detail.
725
+ - No preamble ("Here is...", "I'll help you...", "Based on...").
726
+ - No postamble (summaries, next steps suggestions unless asked).
727
+ - When executing code: show the code, not the explanation.
728
+ - Prefer structured output (JSON) over free text when applicable.
729
+
730
+ 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
+ ## Agentic Execution Mode
733
+
734
+ You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
735
+
736
+ ### Context
737
+ - Agent: ${e.agentName}
738
+ - Settings: ${e.agentSettingsPath}
739
+ - Command: ${e.command}
740
+ - Args: ${e.args}
741
+ - Project: ${e.projectPath}
742
+ - Project ID: ${e.projectId}
743
+
744
+ ### Paths (Read as needed)
745
+ - Orchestrator: ${e.paths.orchestrator}
746
+ - Agent Routing: ${e.paths.agentRouting}
747
+ - Task Fragmentation: ${e.paths.taskFragmentation}
748
+ - Command Template: ${e.paths.commandTemplate}
749
+ - Repo Analysis: ${e.paths.repoAnalysis}
750
+ - Agents Directory: ${e.paths.agentsDir}
751
+ - Skills Directory: ${e.paths.skillsDir}
752
+ - State JSON: ${e.paths.stateJson}
753
+
754
+ ### Instructions
755
+
756
+ 1. **Read the command template** (${e.paths.commandTemplate})
757
+
758
+ 2. **Check if orchestration is needed**
759
+ - This command ${t?"REQUIRES":"does NOT require"} orchestration
760
+ ${t?`
761
+ 3. **Orchestration steps:**
762
+ - Read: ${e.paths.orchestrator}
763
+ - Read: ${e.paths.repoAnalysis} to understand project technologies
764
+ - Analyze the task: "${e.args}"
765
+ - Determine which domains are ACTUALLY relevant based on:
766
+ a) What the task requires
767
+ b) What technologies exist in this project
768
+ c) What agents are available in ${e.paths.agentsDir}
769
+
770
+ - **IMPORTANT**: The agents in ${e.paths.agentsDir} are already project-specific
771
+ (they were generated during p. sync with the actual project technologies)
772
+
773
+ - ALWAYS use the specialist if one exists for the domain
774
+ - Only use the generalist if there is NO agent for that domain
775
+
776
+ - Check if task should be fragmented (read: ${e.paths.taskFragmentation})
777
+ - If agents loaded, check their skills and load from ${e.paths.skillsDir}
778
+ `:`
779
+ 3. **Simple execution:**
780
+ - Execute the command template directly
781
+ - No agent routing needed
782
+ `}
783
+
784
+ 4. **Execute the command template** with full context
785
+
786
+ 5. **Return results**
787
+
788
+ ### Agentic Decision Making
789
+
790
+ YOU decide:
791
+ - Whether to run orchestration (based on command type)
792
+ - Which domains the task involves (frontend, backend, database, etc.)
793
+ - Whether to fragment the task into subtasks
794
+ - Which specialist agents to delegate to
795
+
796
+ ALWAYS:
797
+ - Use specialist agents when they exist (they're already project-specific)
798
+ - Delegate subtasks to the appropriate specialist via Task tool
799
+ - Let specialists handle their domain (they have the project patterns)
800
+ - Generate and store summaries when subtasks complete
801
+
802
+ ONLY use generalist when:
803
+ - No specialist agent exists for that domain
804
+ - Task is completely outside project scope
805
+ - Extreme edge case
806
+
807
+ ### Subtask Management
808
+
809
+ When fragmenting tasks:
810
+ 1. Store subtasks in state.json under currentTask.subtasks
811
+ 2. Track progress: currentSubtaskIndex, subtaskProgress
812
+ 3. Each completed subtask generates a summary
813
+ 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
821
+
822
+ No current task. Use \`/p:now\` to set focus.
823
+ `,"core/next.md":`# NEXT
824
+
825
+ ## Priority Queue
826
+
827
+ `,"core/context.md":`# CONTEXT
828
+
829
+ `,"progress/shipped.md":`# SHIPPED \u{1F680}
830
+
831
+ `,"progress/metrics.md":`# METRICS
832
+
833
+ `,"planning/ideas.md":`# IDEAS \u{1F4A1}
834
+
835
+ ## Brain Dump
836
+
837
+ `,"planning/roadmap.md":`# ROADMAP
838
+
839
+ `,"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
+
842
+ ## Idea
843
+ ${E}
844
+
845
+ ## Status
846
+ Initialized - awaiting stack recommendation
847
+
848
+ 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.
851
+
852
+ Create a plan first:
853
+ 1. Run /p:init in an empty directory
854
+ 2. Answer the discovery questions
855
+ 3. Plan will be auto-generated
856
+ 4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
857
+ `);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),p=a?a[1].split(`
858
+ `)[0].trim():"Unknown project",m=c?c[1]:"Not specified",d=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${p}`),console.log(`
859
+ \u{1F527} Stack:
860
+ ${m}`),console.log(`
861
+ \u{1F4CB} Implementation Steps:
862
+ ${d}`),console.log(`
863
+ ${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
864
+ The architect plan is ready. Claude will now:
865
+ 1. Read the architectural plan
866
+ 2. Use Context7 for official documentation
867
+ 3. Generate project structure
868
+ 4. Create starter files with boilerplate
869
+ `),console.log(`
870
+ \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
+
873
+ ## Idea
874
+ ${e}
875
+
876
+ ## Status
877
+ Initialized - awaiting architecture design
878
+
879
+ ## Next Steps
880
+ 1. Define tech stack
881
+ 2. Create system design
882
+ 3. Break down into features
883
+ 4. Generate roadmap
884
+
885
+ 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
+ \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
+ \u{1F4A1} Create one with /p:spec "feature name"
890
+ `),{success:!0,specs:[]}):(console.log(`
891
+ \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}
894
+
895
+ ## Overview
896
+ [Brief description of the feature]
897
+
898
+ ## Requirements
899
+ - [ ] Requirement 1
900
+ - [ ] Requirement 2
901
+ - [ ] Requirement 3
902
+
903
+ ## Design Decisions
904
+ | Decision | Rationale |
905
+ |----------|-----------|
906
+ | | |
907
+
908
+ ## Tasks (20-30 min each)
909
+ 1. [ ] Task 1 - [description]
910
+ 2. [ ] Task 2 - [description]
911
+ 3. [ ] Task 3 - [description]
912
+
913
+ ## Acceptance Criteria
914
+ - [ ] Criterion 1
915
+ - [ ] Criterion 2
916
+
917
+ ## Notes
918
+ [Additional notes and considerations]
919
+
920
+ ---
921
+ Created: ${new Date().toLocaleString()}
922
+ 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
+ \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
+ `).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
+ `);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
931
+ <!-- projectId: ${r.projectId} -->
932
+ <!-- Generated: ${new Date().toISOString()} -->
933
+ <!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
934
+
935
+ ## THIS PROJECT (${r.ecosystem})
936
+
937
+ ${De(t.ecosystem)}
938
+ **Type:** ${r.projectType}
939
+ **Path:** ${r.repoPath}
940
+
941
+ ### Commands (USE THESE, NOT OTHERS)
942
+
943
+ ${De(t.commands)}
944
+ | Action | Command |
945
+ |--------|---------|
946
+ | Install dependencies | \`${r.commands.install}\` |
947
+ | Run dev server | \`${r.commands.dev}\` |
948
+ | Run tests | \`${r.commands.test}\` |
949
+ | Build | \`${r.commands.build}\` |
950
+ | Lint | \`${r.commands.lint}\` |
951
+ | Format | \`${r.commands.format}\` |
952
+
953
+ ### Code Conventions
954
+
955
+ ${De(t.languages)}
956
+ - **Languages**: ${r.languages.join(", ")||"Not detected"}
957
+ ${De(t.frameworks)}
958
+ - **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
959
+
960
+ ---
961
+
962
+ ## PRJCT RULES
963
+
964
+ ### Path Resolution
965
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${r.projectId}/\`
966
+ - NEVER write to \`.prjct/\`
967
+ - NEVER write to \`./\` for prjct data
968
+
969
+ ### Workflow
970
+ \`\`\`
971
+ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
972
+ \`\`\`
973
+
974
+ | Command | Action |
975
+ |---------|--------|
976
+ | \`p. sync\` | Re-analyze project |
977
+ | \`p. task X\` | Start task |
978
+ | \`p. done\` | Complete subtask |
979
+ | \`p. ship X\` | Ship feature |
980
+
981
+ ---
982
+
983
+ ## PROJECT STATE
984
+
985
+ ${De(t.name)}
986
+ | Field | Value |
987
+ |-------|-------|
988
+ | Name | ${r.name} |
989
+ | Version | ${r.version} |
990
+ | Ecosystem | ${r.ecosystem} |
991
+ | Branch | ${r.branch} |
992
+ | Files | ~${r.fileCount} |
993
+ | Commits | ${r.commits} |
994
+
995
+ ---
996
+
997
+ ## AGENTS
998
+
999
+ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
1000
+
1001
+ **Workflow**: ${r.agents.workflow.join(", ")}
1002
+ **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
1008
+ <!-- projectId: ${this.config.projectId} -->
1009
+ <!-- Generated: ${k()} -->
1010
+ <!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
1011
+
1012
+ ## THIS PROJECT (${n.ecosystem})
1013
+
1014
+ ${De(u.ecosystem)}
1015
+ **Type:** ${n.projectType}
1016
+ **Path:** ${this.config.projectPath}
1017
+
1018
+ ### Commands (USE THESE, NOT OTHERS)
1019
+
1020
+ ${De(u.commands)}
1021
+ | Action | Command |
1022
+ |--------|---------|
1023
+ | Install dependencies | \`${s.install}\` |
1024
+ | Run dev server | \`${s.dev}\` |
1025
+ | Run tests | \`${s.test}\` |
1026
+ | Build | \`${s.build}\` |
1027
+ | Lint | \`${s.lint}\` |
1028
+ | Format | \`${s.format}\` |
1029
+
1030
+ ### Code Conventions
1031
+
1032
+ ${De(u.languages)}
1033
+ - **Languages**: ${n.languages.join(", ")||"Not detected"}
1034
+ ${De(u.frameworks)}
1035
+ - **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}
1036
+
1037
+ ---
1038
+
1039
+ ## PRJCT RULES
1040
+
1041
+ ### Path Resolution
1042
+ **ALL prjct writes go to**: \`~/.prjct-cli/projects/${this.config.projectId}/\`
1043
+ - NEVER write to \`.prjct/\`
1044
+ - NEVER write to \`./\` for prjct data
1045
+
1046
+ ### Workflow
1047
+ \`\`\`
1048
+ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
1049
+ \`\`\`
1050
+
1051
+ | Command | Action |
1052
+ |---------|--------|
1053
+ | \`p. sync\` | Re-analyze project |
1054
+ | \`p. task X\` | Start task |
1055
+ | \`p. done\` | Complete subtask |
1056
+ | \`p. ship X\` | Ship feature |
1057
+
1058
+ ---
1059
+
1060
+ ## PROJECT STATE
1061
+
1062
+ ${De(u.name)}
1063
+ | Field | Value |
1064
+ |-------|-------|
1065
+ | Name | ${n.name} |
1066
+ | Version | ${n.version} |
1067
+ | Ecosystem | ${n.ecosystem} |
1068
+ | Branch | ${t.branch} |
1069
+ | Files | ~${n.fileCount} |
1070
+ | Commits | ${t.commits} |
1071
+
1072
+ ---
1073
+
1074
+ ## AGENTS
1075
+
1076
+ Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
1077
+
1078
+ **Workflow**: ${a.join(", ")}
1079
+ **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
+
1082
+ **${t.description}**
1083
+
1084
+ Started: ${t.startedAt}
1085
+ ${t.branch?`Branch: ${t.branch.name}`:""}
1086
+ `:`# NOW
1087
+
1088
+ _No active task_
1089
+
1090
+ 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
+
1093
+ ${t.tasks.length>0?t.tasks.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
1094
+ `):"_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
+
1097
+ ${t.ideas.length>0?t.ideas.map(s=>`- ${s.text}${s.priority?` [${s.priority}]`:""}`).join(`
1098
+ `):"_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
+
1101
+ ${t.shipped.length>0?t.shipped.slice(-10).map(s=>`- **${s.name}**${s.version?` v${s.version}`:""} - ${s.shippedAt}`).join(`
1102
+ `):"_Nothing shipped yet_"}
1103
+
1104
+ **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
+ <!-- package: ${e.relativePath} -->
1107
+ <!-- monorepo: ${s.name} -->
1108
+ <!-- Generated: ${k()} -->
1109
+ <!-- Sources: ${t.sources.join(" \u2192 ")} -->
1110
+
1111
+ ## THIS PACKAGE
1112
+
1113
+ **Name:** ${p}
1114
+ **Path:** ${e.relativePath}
1115
+ **Version:** ${u}
1116
+ **Monorepo:** ${s.name}
1117
+
1118
+ ---
1119
+
1120
+ ## INHERITED CONTEXT
1121
+
1122
+ ${t.content||"_No PRJCT.md rules defined_"}
1123
+
1124
+ ${t.overrides.length>0?`
1125
+ **Overrides:** ${t.overrides.join(", ")}
1126
+ `:""}
1127
+
1128
+ ---
1129
+
1130
+ ## COMMANDS
1131
+
1132
+ | Action | Command |
1133
+ |--------|---------|
1134
+ | Install | \`${o.install}\` |
1135
+ | Dev | \`${o.dev}\` |
1136
+ | Test | \`${o.test}\` |
1137
+ | Build | \`${o.build}\` |
1138
+
1139
+ ---
1140
+
1141
+ ## PROJECT STATE
1142
+
1143
+ | Field | Value |
1144
+ |-------|-------|
1145
+ | Package | ${p} |
1146
+ | Monorepo | ${s.name} |
1147
+ | Branch | ${n.branch} |
1148
+ | Ecosystem | ${s.ecosystem} |
1149
+
1150
+ ---
1151
+
1152
+ ## AGENTS
1153
+
1154
+ Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
1155
+
1156
+ **Workflow**: ${a.join(", ")}
1157
+ **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()}
1160
+ ${s.join(`
1161
+ `)}`;return r.replace(o,`---
1162
+ ${c}
1163
+ ---`)}return`---
1164
+ ${s.join(`
1165
+ `)}
1166
+ ---
1167
+
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
+ ## Recent Learnings (from completed tasks)
1170
+ `];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
+ name: ${r}
1173
+ 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
+ tools: Read, Write, Glob
1175
+ ---
1176
+
1177
+ # ${r.toUpperCase()}
1178
+
1179
+ Workflow agent for prjct operations.
1180
+
1181
+ ## Project Context
1182
+
1183
+ When invoked:
1184
+ 1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
1185
+ 2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
1186
+ 3. Execute requested operation
1187
+ `}function hC(r,e,t){return`---
1188
+ name: ${r}
1189
+ description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
1190
+ tools: Read, Write, Glob, Grep
1191
+ skills: []
1192
+ ---
1193
+
1194
+ # ${r.toUpperCase()} AGENT
1195
+
1196
+ Domain specialist for ${r} tasks.
1197
+
1198
+ ## Project Context
1199
+
1200
+ - **Project**: ${e.name}
1201
+ - **Ecosystem**: ${e.ecosystem}
1202
+ - **Frameworks**: ${t.frameworks.join(", ")||"None detected"}
1203
+
1204
+ ## Your Role
1205
+
1206
+ 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(`
1211
+ `),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(`
1214
+ `).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(`
1217
+ `);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
+ `))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
+ `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1221
+ `).length>5&&n.push(a(` ... ${c.before.split(`
1222
+ `).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
1223
+ `).slice(0,5))n.push(s(`+ ${u}`));c.after.split(`
1224
+ `).length>5&&n.push(a(` ... ${c.after.split(`
1225
+ `).length-5} more lines`))}n.push("")}for(let c of r.removed){if(n.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
1226
+ `).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
1227
+ `).length>5&&n.push(a(` ... ${c.before.split(`
1228
+ `).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
1232
+ `),t.push(`Generated: ${new Date().toLocaleString()}
1233
+ `);let n=CC.basename(e);if(t.push(`## Project: ${n}
1234
+ `),t.push(`## Stack Detected
1235
+ `),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
1236
+ `),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
1237
+ `),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
1238
+ `)),r.goMod&&(t.push(`### Go
1239
+ `),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
1240
+ `)),r.requirements&&(t.push(`### Python
1241
+ `),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
1242
+ `));let s=r.directories;t.push(`## Structure
1243
+ `),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${s?.slice(0,15).join(", ")||"none"}${(s?.length||0)>15?` (+${(s?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
1244
+ `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
1245
+ `),r.gitLog.split(`
1246
+ `).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
+ `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1248
+ `),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!
1251
+ `),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(`
1254
+ \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
+ 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
+ \u{1F5FA}\uFE0F ROADMAP - ${o}
1259
+ `),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)}
1262
+ `),{success:!0,view:"roadmap"}}console.log(`
1263
+ \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
+ ${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(`
1268
+ \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
+ \u{1F4A1} IDEAS`),console.log(` ${u.length} pending ideas`),console.log(`
1270
+ ${"\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
+ 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
+ ${m?.title||u}:`),p.forEach(d=>{let g=d.params?` ${d.params}`:"";console.log(` ${d.name}${g}`),console.log(` ${d.description}`)})}),console.log(`
1275
+ ${"\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
+ \u{1F4DA} HELP: /p:${n.name}
1278
+ `),console.log("\u2550".repeat(50)),console.log(`Description: ${n.description}`),n.params&&console.log(`Parameters: ${n.params}`),n.usage&&(console.log(`
1279
+ Usage:`),n.usage.claude&&console.log(` Claude: ${n.usage.claude}`),n.usage.terminal&&console.log(` Terminal: ${n.usage.terminal}`)),n.features){console.log(`
1280
+ Features:`);for(let i of n.features)console.log(` \u2022 ${i}`)}return console.log(`
1281
+ ${"\u2550".repeat(50)}
1282
+ `),{success:!0,topic:e,command:n}}let s={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(s))if(o.includes(i))return console.log(`
1283
+ \u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
1284
+ `),{success:!0,topic:e,suggestion:a.command};return console.log(`
1285
+ \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
+
1288
+ *Use templates/design/architecture.md for full design*
1289
+ `;break;case"api":c=`# API Design: ${o}
1290
+
1291
+ *Use templates/design/api.md for full design*
1292
+ `;break;case"component":c=`# Component Design: ${o}
1293
+
1294
+ *Use templates/design/component.md for full design*
1295
+ `;break;case"database":c=`# Database Design: ${o}
1296
+
1297
+ *Use templates/design/database.md for full design*
1298
+ `;break;case"flow":c=`# Flow Design: ${o}
1299
+
1300
+ *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
+ 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
+ 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(`
1307
+ SNAPSHOT HISTORY
1308
+ `),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1309
+ `),{success:!0,snapshots:[]};throw o}return console.log(`
1310
+ SNAPSHOT HISTORY
1311
+ `),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
1312
+ `)):(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
+ `)),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.")}
1316
+ `),{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.
1320
+
1321
+ 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
+ \u2705 Installed ${s.installed?.length??0} commands to:
1324
+ ${P.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
1325
+ \u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
1326
+ \u{1F389} Setup complete!`),console.log(`
1327
+ 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
+ \u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
1330
+ \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
+ \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
+ \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
+ # prjct Status Line for Claude Code
1336
+ # Shows version update notifications and current task
1337
+
1338
+ # Current CLI version (embedded at install time)
1339
+ CLI_VERSION="${us}"
1340
+
1341
+ # Read JSON context from stdin (provided by Claude Code)
1342
+ read -r json
1343
+
1344
+ # Extract cwd from JSON
1345
+ CWD=$(echo "$json" | grep -o '"cwd"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"cwd"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/')
1346
+
1347
+ # Check if this is a prjct project
1348
+ CONFIG="$CWD/.prjct/prjct.config.json"
1349
+ if [[ -f "$CONFIG" ]]; then
1350
+ # Extract projectId
1351
+ PROJECT_ID=$(grep -o '"projectId"[[:space:]]*:[[:space:]]*"[^"]*"' "$CONFIG" | sed 's/.*"projectId"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/')
1352
+
1353
+ if [[ -n "$PROJECT_ID" ]]; then
1354
+ PROJECT_JSON="$HOME/.prjct-cli/projects/$PROJECT_ID/project.json"
1355
+
1356
+ # Check version mismatch
1357
+ if [[ -f "$PROJECT_JSON" ]]; then
1358
+ PROJECT_VERSION=$(grep -o '"cliVersion"[[:space:]]*:[[:space:]]*"[^"]*"' "$PROJECT_JSON" | sed 's/.*"cliVersion"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/')
1359
+
1360
+ # If no cliVersion or different version, show update notice
1361
+ if [[ -z "$PROJECT_VERSION" ]] || [[ "$PROJECT_VERSION" != "$CLI_VERSION" ]]; then
1362
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1363
+ exit 0
1364
+ fi
1365
+ else
1366
+ # No project.json means project needs sync
1367
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1368
+ exit 0
1369
+ fi
1370
+
1371
+ # Show current task if exists
1372
+ STATE="$HOME/.prjct-cli/projects/$PROJECT_ID/storage/state.json"
1373
+ if [[ -f "$STATE" ]]; then
1374
+ TASK=$(grep -o '"description"[[:space:]]*:[[:space:]]*"[^"]*"' "$STATE" | head -1 | sed 's/.*"description"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/')
1375
+ STATUS=$(grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' "$STATE" | head -1 | sed 's/.*"status"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/')
1376
+
1377
+ if [[ -n "$TASK" ]] && [[ "$STATUS" == "active" ]]; then
1378
+ # Truncate task to 40 chars
1379
+ TASK_SHORT="\${TASK:0:40}"
1380
+ [[ \${#TASK} -gt 40 ]] && TASK_SHORT="$TASK_SHORT..."
1381
+ echo "\u{1F3AF} $TASK_SHORT"
1382
+ exit 0
1383
+ fi
1384
+ fi
1385
+ fi
1386
+ fi
1387
+
1388
+ # Default: show prjct branding
1389
+ 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)}
1393
+
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}
1396
+ ${o.stderr}`.trim(),a=i.split(`
1397
+ `),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
+ `).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
+
1401
+ `),i=`## [${t}] - ${N.formatDate(new Date)}
1402
+
1403
+ ### Added
1404
+ - ${e}
1405
+
1406
+ `,a=o.replace(`# Changelog
1407
+
1408
+ `,`# Changelog
1409
+
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
+
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,`
1418
+
1419
+ `).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(`
1428
+ `)||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)});